Commit d868a7aa authored by Franco (nextime) Lanza's avatar Franco (nextime) Lanza

Merge branch 'dev'

parents 8cd7f8fa 8e0c00ec
Pipeline #98 skipped
...@@ -45,6 +45,8 @@ ...@@ -45,6 +45,8 @@
* M30 - Delete file from SD (M30 filename.g) * M30 - Delete file from SD (M30 filename.g)
* M31 - Output time since last M109 or SD card start to serial * M31 - Output time since last M109 or SD card start to serial
* M32 - Make directory * M32 - Make directory
* M33 - Stop printing, close file and save restart.gcode
* M34 - Open file and start print
* M35 - Upload Firmware to Nextion from SD * M35 - Upload Firmware to Nextion from SD
* M42 - Change pin status via gcode Use M42 Px Sy to set pin x to value y, when omitting Px the onboard led will be used. * M42 - Change pin status via gcode Use M42 Px Sy to set pin x to value y, when omitting Px the onboard led will be used.
* M48 - Measure Z_Probe repeatability. M48 [P # of points] [X position] [Y position] [V_erboseness #] [E_ngage Probe] [L # of legs of travel] * M48 - Measure Z_Probe repeatability. M48 [P # of points] [X position] [Y position] [V_erboseness #] [E_ngage Probe] [L # of legs of travel]
......
### Version 4.2.85
* Add Stop and Save for Restart (SSR)
### Version 4.2.84 ### Version 4.2.84
* Add Mesh Bed Level (MBL) * Add Mesh Bed Level (MBL)
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
// The following define to use the new HakanBasted laser_pulse method to fire laser. It should be more efficient, but it's less tested. // The following define to use the new HakanBasted laser_pulse method to fire laser. It should be more efficient, but it's less tested.
// Thanks for it to HakanBastedt that has implemented it for Marlin at https://github.com/HakanBastedt/Marlin // Thanks for it to HakanBastedt that has implemented it for Marlin at https://github.com/HakanBastedt/Marlin
// Uncomment to enable it *USE AT YOUR OWN RISK*, it should work but it's *NOT WELL TESTED YET* // Uncomment to enable it *USE AT YOUR OWN RISK*, it should work but it's *NOT WELL TESTED YET*
// Only for MEGA. On DUE processor is automatic.
//#define LASER_PULSE_METHOD //#define LASER_PULSE_METHOD
// If your machine has laser focuser, set this to true and it will use Z axis for focus or disable it. // If your machine has laser focuser, set this to true and it will use Z axis for focus or disable it.
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#define CONFIGURATION_VERSION_H #define CONFIGURATION_VERSION_H
#define FIRMWARE_NAME "MK" #define FIRMWARE_NAME "MK"
#define SHORT_BUILD_VERSION "4.2.84_dev" #define SHORT_BUILD_VERSION "4.2.85_dev"
#define BUILD_VERSION FIRMWARE_NAME "_" SHORT_BUILD_VERSION #define BUILD_VERSION FIRMWARE_NAME "_" SHORT_BUILD_VERSION
#define STRING_DISTRIBUTION_DATE __DATE__ " " __TIME__ // build date and time #define STRING_DISTRIBUTION_DATE __DATE__ " " __TIME__ // build date and time
// It might also be appropriate to define a location where additional information can be found // It might also be appropriate to define a location where additional information can be found
......
...@@ -81,6 +81,8 @@ ...@@ -81,6 +81,8 @@
* M30 - Delete file from SD (M30 filename.g) * M30 - Delete file from SD (M30 filename.g)
* M31 - Output time since last M109 or SD card start to serial * M31 - Output time since last M109 or SD card start to serial
* M32 - Make directory * M32 - Make directory
* M33 - Stop printing, close file and save restart.gcode
* M34 - Open file and start print
* M35 - Upload Firmware to Nextion from SD * M35 - Upload Firmware to Nextion from SD
* M42 - Change pin status via gcode Use M42 Px Sy to set pin x to value y, when omitting Px the onboard led will be used. * M42 - Change pin status via gcode Use M42 Px Sy to set pin x to value y, when omitting Px the onboard led will be used.
* M48 - Measure Z_Probe repeatability. M48 [P # of points] [X position] [Y position] [V_erboseness #] [E_ngage Probe] [L # of legs of travel] * M48 - Measure Z_Probe repeatability. M48 [P # of points] [X position] [Y position] [V_erboseness #] [E_ngage Probe] [L # of legs of travel]
......
...@@ -5350,6 +5350,46 @@ inline void gcode_M17() { ...@@ -5350,6 +5350,46 @@ inline void gcode_M17() {
} }
} }
/**
* M33: Close File and save restart.gcode
*/
inline void gcode_M33() {
if (card.cardOK) {
ECHO_LM(DB, "Close file and save restart.gcode");
card.closeFile(true);
}
}
/**
* M34: Select file and start SD print
*/
inline void gcode_M34() {
if (card.sdprinting)
st_synchronize();
if( card.cardOK ) {
char* namestartpos = (strchr(current_command_args, '@'));
if(namestartpos == NULL) {
namestartpos = current_command_args ; // default name position
}
else
namestartpos++; // to skip the '@'
ECHO_SMT(DB, "Open file: ", namestartpos);
ECHO_EM(" and start print.");
card.selectFile(namestartpos);
if(code_seen('S')) card.setIndex(code_value_long());
feedrate = 1200.0; // 20 mm/sec
feedrate_multiplier = 100; // 100% feedrate
card.startPrint();
print_job_counter.start();
#if HAS(POWER_CONSUMPTION_SENSOR)
startpower = power_consumption_hour;
#endif
}
}
#if ENABLED(NEXTION) #if ENABLED(NEXTION)
/** /**
* M35: Upload Firmware to Nextion from SD * M35: Upload Firmware to Nextion from SD
...@@ -8707,6 +8747,10 @@ void process_next_command() { ...@@ -8707,6 +8747,10 @@ void process_next_command() {
gcode_M31(); break; gcode_M31(); break;
case 32: // M32 - Make directory case 32: // M32 - Make directory
gcode_M32(); break; gcode_M32(); break;
case 33: // M33 - Stop printing, close file and save restart.gcode
gcode_M33(); break;
case 34: // M34 - Select file and start SD print
gcode_M34(); break;
#if ENABLED(NEXTION) #if ENABLED(NEXTION)
case 35: // M35 - Upload Firmware to Nextion from SD case 35: // M35 - Upload Firmware to Nextion from SD
gcode_M35(); break; gcode_M35(); break;
......
...@@ -145,6 +145,7 @@ ...@@ -145,6 +145,7 @@
#define MSG_PAUSE_PRINT "Pause print" #define MSG_PAUSE_PRINT "Pause print"
#define MSG_RESUME_PRINT "Resume print" #define MSG_RESUME_PRINT "Resume print"
#define MSG_STOP_PRINT "Stop print" #define MSG_STOP_PRINT "Stop print"
#define MSG_STOP_SAVE_PRINT "Stop and Save"
#define MSG_CARD_MENU "Print from " MSG_SD #define MSG_CARD_MENU "Print from " MSG_SD
#define MSG_NO_CARD "No " MSG_SD #define MSG_NO_CARD "No " MSG_SD
#define MSG_DWELL "Sleep..." #define MSG_DWELL "Sleep..."
...@@ -245,6 +246,8 @@ ...@@ -245,6 +246,8 @@
#define MSG_HEATING_COMPLETE "Heating done." #define MSG_HEATING_COMPLETE "Heating done."
#define MSG_BED_HEATING "Bed Heating." #define MSG_BED_HEATING "Bed Heating."
#define MSG_BED_DONE "Bed done." #define MSG_BED_DONE "Bed done."
#define MSG_CHAMBER_HEATING "Chamber Heating."
#define MSG_CHAMBER_DONE "Chamber done."
#define MSG_COOLER_COOLING "Cooling..." #define MSG_COOLER_COOLING "Cooling..."
#define MSG_COOLER_DONE "Cooling done." #define MSG_COOLER_DONE "Cooling done."
......
...@@ -141,6 +141,7 @@ ...@@ -141,6 +141,7 @@
#define MSG_PAUSE_PRINT "Pausa" #define MSG_PAUSE_PRINT "Pausa"
#define MSG_RESUME_PRINT "Riprendi stampa" #define MSG_RESUME_PRINT "Riprendi stampa"
#define MSG_STOP_PRINT "Arresta stampa" #define MSG_STOP_PRINT "Arresta stampa"
#define MSG_STOP_SAVE_PRINT "Arresta e Salva"
#define MSG_CARD_MENU "SD Card Menu" #define MSG_CARD_MENU "SD Card Menu"
#define MSG_NO_CARD "No SD Card" #define MSG_NO_CARD "No SD Card"
#define MSG_DWELL "Sospensione..." #define MSG_DWELL "Sospensione..."
...@@ -241,6 +242,8 @@ ...@@ -241,6 +242,8 @@
#define MSG_HEATING_COMPLETE "Riscaldamento finito." #define MSG_HEATING_COMPLETE "Riscaldamento finito."
#define MSG_BED_HEATING "Riscaldamento piatto." #define MSG_BED_HEATING "Riscaldamento piatto."
#define MSG_BED_DONE "Piatto riscaldato." #define MSG_BED_DONE "Piatto riscaldato."
#define MSG_CHAMBER_HEATING "Riscaldamento camera."
#define MSG_CHAMBER_DONE "Camera riscaldata."
#define MSG_COOLER_COOLING "Raffreddamento..." #define MSG_COOLER_COOLING "Raffreddamento..."
#define MSG_COOLER_DONE "Raffreddamento finito." #define MSG_COOLER_DONE "Raffreddamento finito."
......
...@@ -568,6 +568,15 @@ inline void line_to_current(AxisEnum axis) { ...@@ -568,6 +568,15 @@ inline void line_to_current(AxisEnum axis) {
lcd_setstatus(MSG_PRINT_ABORTED, true); lcd_setstatus(MSG_PRINT_ABORTED, true);
} }
static void lcd_sdcard_stop_save() {
card.sdprinting = false;
print_job_counter.stop();
quickStop();
card.closeFile(true);
autotempShutdown();
cancel_heatup = true;
}
#endif // SDSUPPORT #endif // SDSUPPORT
/** /**
...@@ -606,6 +615,7 @@ static void lcd_main_menu() { ...@@ -606,6 +615,7 @@ static void lcd_main_menu() {
else else
MENU_ITEM(function, MSG_RESUME_PRINT, lcd_sdcard_resume); MENU_ITEM(function, MSG_RESUME_PRINT, lcd_sdcard_resume);
MENU_ITEM(function, MSG_STOP_PRINT, lcd_sdcard_stop); MENU_ITEM(function, MSG_STOP_PRINT, lcd_sdcard_stop);
MENU_ITEM(function, MSG_STOP_SAVE_PRINT, lcd_sdcard_stop_save);
} }
else { else {
MENU_ITEM(submenu, MSG_CARD_MENU, lcd_sdcard_menu); MENU_ITEM(submenu, MSG_CARD_MENU, lcd_sdcard_menu);
......
...@@ -230,14 +230,15 @@ ...@@ -230,14 +230,15 @@
#include "../Configuration_Pins.h" #include "../Configuration_Pins.h"
/****************************************************************************************/ /****************************************************************************************/
#if DISABLED(DUAL_X_CARRIAGE)
#if X_HOME_DIR > 0 // Home X to MAX #if X_HOME_DIR > 0 // Home X to MAX
#undef X_MIN_PIN #undef X_MIN_PIN
#define X_MIN_PIN -1 #define X_MIN_PIN -1
#elif X_HOME_DIR < 0 // Home X to MIN #elif X_HOME_DIR < 0 // Home X to MIN
#undef X_MAX_PIN #undef X_MAX_PIN
#define X_MAX_PIN -1 #define X_MAX_PIN -1
#endif //X_HOME_DIR > 0 #endif // X_HOME_DIR > 0
#endif // DISABLED(DUAL_X_CARRIAGE)
#if Y_HOME_DIR > 0 // Home Y to MAX #if Y_HOME_DIR > 0 // Home Y to MAX
#undef Y_MIN_PIN #undef Y_MIN_PIN
...@@ -245,7 +246,7 @@ ...@@ -245,7 +246,7 @@
#elif Y_HOME_DIR < 0 // Home Y to MIN #elif Y_HOME_DIR < 0 // Home Y to MIN
#undef Y_MAX_PIN #undef Y_MAX_PIN
#define Y_MAX_PIN -1 #define Y_MAX_PIN -1
#endif //Y_HOME_DIR > 0 #endif // Y_HOME_DIR > 0
#if Z_HOME_DIR > 0 // Home Z to MAX #if Z_HOME_DIR > 0 // Home Z to MAX
#undef Z_MIN_PIN #undef Z_MIN_PIN
...@@ -253,7 +254,7 @@ ...@@ -253,7 +254,7 @@
#elif Z_HOME_DIR < 0 // Home Z to MIN #elif Z_HOME_DIR < 0 // Home Z to MIN
#undef Z_MAX_PIN #undef Z_MAX_PIN
#define Z_MAX_PIN -1 #define Z_MAX_PIN -1
#endif //Z_HOME_DIR > 0 #endif // Z_HOME_DIR > 0
#if DISABLED(Z_PROBE_ENDSTOP) // Allow code to compile regardless of Z_PROBE_ENDSTOP setting. #if DISABLED(Z_PROBE_ENDSTOP) // Allow code to compile regardless of Z_PROBE_ENDSTOP setting.
#define Z_PROBE_PIN -1 #define Z_PROBE_PIN -1
......
...@@ -24,7 +24,9 @@ ...@@ -24,7 +24,9 @@
#if ENABLED(SDSUPPORT) #if ENABLED(SDSUPPORT)
#include "cardreader.h" #ifdef __SAM3X8E__
#include <avr/dtostrf.h>
#endif
char tempLongFilename[LONG_FILENAME_LENGTH + 1]; char tempLongFilename[LONG_FILENAME_LENGTH + 1];
char fullName[LONG_FILENAME_LENGTH * SD_MAX_FOLDER_DEPTH + SD_MAX_FOLDER_DEPTH + 1]; char fullName[LONG_FILENAME_LENGTH * SD_MAX_FOLDER_DEPTH + SD_MAX_FOLDER_DEPTH + 1];
...@@ -183,6 +185,11 @@ bool CardReader::selectFile(const char* filename, bool silent/*=false*/) { ...@@ -183,6 +185,11 @@ bool CardReader::selectFile(const char* filename, bool silent/*=false*/) {
file.close(); file.close();
if (!file.exists("restart.gcode")) {
file.createContiguous(&workDir, "restart.gcode", 1);
file.close();
}
if (file.open(curDir, filename, O_READ)) { if (file.open(curDir, filename, O_READ)) {
if ((oldP = strrchr(filename, '/')) != NULL) if ((oldP = strrchr(filename, '/')) != NULL)
oldP++; oldP++;
...@@ -192,6 +199,11 @@ bool CardReader::selectFile(const char* filename, bool silent/*=false*/) { ...@@ -192,6 +199,11 @@ bool CardReader::selectFile(const char* filename, bool silent/*=false*/) {
ECHO_MT(SERIAL_SD_FILE_OPENED, oldP); ECHO_MT(SERIAL_SD_FILE_OPENED, oldP);
ECHO_EMV(SERIAL_SD_SIZE, file.fileSize()); ECHO_EMV(SERIAL_SD_SIZE, file.fileSize());
} }
for (int c = 0; c <= sizeof(fullName); c++)
const_cast<char&>(fullName[c]) = '\0';
strncpy(fullName, filename, strlen(filename));
#if ENABLED(JSON_OUTPUT) #if ENABLED(JSON_OUTPUT)
parsejson(file); parsejson(file);
#endif #endif
...@@ -316,8 +328,114 @@ void CardReader::closeFile(bool store_location /*=false*/) { ...@@ -316,8 +328,114 @@ void CardReader::closeFile(bool store_location /*=false*/) {
saving = false; saving = false;
if (store_location) { if (store_location) {
//future: store printer state, filename and position for continuing a stopped print char bufferFilerestart[50];
// so one can unplug the printer and continue printing the next day. char bufferX[11];
char bufferY[11];
char bufferZ[11];
char bufferE[11];
char bufferCoord[50];
char bufferCoord1[50];
char bufferCoord2[50];
char bufferSdpos[11];
char nameFile[15];
snprintf(bufferSdpos, sizeof bufferSdpos, "%lu", (unsigned long)sdpos);
strcpy(nameFile, "restart.gcode");
if (!fileRestart.exists(nameFile)) {
fileRestart.createContiguous(&workDir, nameFile, 1);
fileRestart.close();
}
fileRestart.open(&workDir, nameFile, O_WRITE);
fileRestart.truncate(0);
dtostrf(current_position[X_AXIS], 1, 3, bufferX);
dtostrf(current_position[Y_AXIS], 1, 3, bufferY);
dtostrf(current_position[Z_AXIS], 1, 3, bufferZ);
dtostrf(current_position[E_AXIS], 1, 3, bufferE);
#if MECH(DELTA)
strcpy(bufferCoord1, "G1 Z");
strcat(bufferCoord1, bufferZ);
strcat(bufferCoord1, " F8000");
#else
strcpy(bufferCoord1, "G92 Z");
strcat(bufferCoord1, bufferZ);
#endif
strcpy(bufferCoord, "G1 X");
strcat(bufferCoord, bufferX);
strcat(bufferCoord, " Y");
strcat(bufferCoord, bufferY);
strcat(bufferCoord, " Z");
strcat(bufferCoord, bufferZ);
strcat(bufferCoord, " F3600");
strcpy(bufferCoord2, "G92 E");
strcat(bufferCoord2, bufferE);
for (int8_t i = 0; i < (int8_t)strlen(fullName); i++)
fullName[i] = tolower(fullName[i]);
strcpy(bufferFilerestart, "M34 S");
strcat(bufferFilerestart, bufferSdpos);
strcat(bufferFilerestart, " @");
strcat(bufferFilerestart, fullName);
#if MECH(DELTA)
fileRestart.write("G28\n");
#else
fileRestart.write(bufferCoord1);
fileRestart.write("\n");
fileRestart.write("G28 X Y\n");
#endif
if (degTargetBed() > 0) {
char Bedtemp[15];
sprintf(Bedtemp, "M190 S%i\n", degTargetBed());
fileRestart.write(Bedtemp);
}
for (uint8_t h = 0; h < HOTENDS; h++) {
if (degTargetHotend(h) > 0) {
char Hotendtemp[15];
sprintf(Hotendtemp, "M109 T%i S%i\n", h, (int)degTargetHotend(h));
fileRestart.write(Hotendtemp);
}
}
#if MECH(DELTA)
fileRestart.write(bufferCoord1);
fileRestart.write("\n");
#endif
fileRestart.write(bufferCoord);
fileRestart.write("\n");
if (fanSpeed > 0) {
char fanSp[15];
sprintf(fanSp, "M106 S%i\n", fanSpeed);
fileRestart.write(fanSp);
}
fileRestart.write(bufferCoord2);
fileRestart.write("\n");
fileRestart.write(bufferFilerestart);
fileRestart.write("\n");
fileRestart.sync();
fileRestart.close();
HAL::delayMilliseconds(200);
#if MECH(DELTA)
enqueue_and_echo_commands_P(PSTR("G28"));
#else
enqueue_and_echo_commands_P(PSTR("G28 X0 Y0"));
#endif
disable_all_heaters();
disable_all_coolers();
fanSpeed = 0;
} }
} }
......
...@@ -44,6 +44,7 @@ class CardReader { ...@@ -44,6 +44,7 @@ class CardReader {
public: public:
SdFat fat; SdFat fat;
SdFile file; SdFile file;
SdFile fileRestart;
CardReader(); CardReader();
void initsd(); void initsd();
......
...@@ -887,7 +887,7 @@ float get_pid_output(int h) { ...@@ -887,7 +887,7 @@ float get_pid_output(int h) {
pid_output = constrain(target_temperature_chamber, 0, MAX_CHAMBER_POWER); pid_output = constrain(target_temperature_chamber, 0, MAX_CHAMBER_POWER);
#else #else
pid_error_chamber = target_temperature_chamber - current_temperature_chamber; pid_error_chamber = target_temperature_chamber - current_temperature_chamber;
pTerm_chamber = bedKp * pid_error_chamber; pTerm_chamber = chamberKp * pid_error_chamber;
temp_iState_chamber += pid_error_chamber; temp_iState_chamber += pid_error_chamber;
temp_iState_chamber = constrain(temp_iState_chamber, temp_iState_min_chamber, temp_iState_max_chamber); temp_iState_chamber = constrain(temp_iState_chamber, temp_iState_min_chamber, temp_iState_max_chamber);
iTerm_chamber = chamberKi * temp_iState_chamber; iTerm_chamber = chamberKi * temp_iState_chamber;
......
<img align="right" src="Documentation/Logo/MarlinKimbra%20Logo%20GitHub.png" /> <img align="right" src="Documentation/Logo/MarlinKimbra%20Logo%20GitHub.png" />
# MarlinKimbra 3D Printer Firmware for Arduino # MarlinKimbra 3D Printer Firmware for Arduino
## Version 4.2.84 Laser dev ## Version 4.2.85 Laser dev
This is the Laser enhananced version with the patches from Franco (nextime) Lanza. This is the Laser enhananced version with the patches from Franco (nextime) Lanza.
...@@ -65,6 +65,7 @@ The new features are: ...@@ -65,6 +65,7 @@ The new features are:
- Added Cooler and Hot Chamber - Added Cooler and Hot Chamber
- Added Laser beam and raster base64 - Added Laser beam and raster base64
- Added Mesh Bed Level (MBL) - Added Mesh Bed Level (MBL)
- Added Stop and Save for Restart (SSR)
## Credits ## Credits
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment