From a3fedfe2b37c58ec0deaddbc26e38b214f3178c8 Mon Sep 17 00:00:00 2001 From: Dan Kortschak Date: Mon, 4 Jun 2018 18:24:45 +0930 Subject: [PATCH 1/4] Fix spelling and grammar --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 104a19c2..eeef0bc0 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 1. Developement environment preparing +# 1. Development environment preparation 1. install `"Arduino Software IDE"` for your preferred operating system `https://www.arduino.cc -> Software->Downloads` From a15f0138de49a07a12ad6dc1ea688b0f371bdac3 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Thu, 7 Jun 2018 20:50:30 +0200 Subject: [PATCH 2/4] show estimated time to end of the print if available in gcode: initial version --- .gitignore | 5 + Firmware/Marlin.h | 16 +++- Firmware/Marlin_main.cpp | 58 +++++++++++- .../ultralcd_implementation_hitachi_HD44780.h | 92 +++++++++++-------- 4 files changed, 128 insertions(+), 43 deletions(-) diff --git a/.gitignore b/.gitignore index 8bb12431..e8f50d21 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,8 @@ Debug Firmware/Configuration_prusa.h Firmware/Doc +/Firmware/.vs/Firmware/v14/.suo +/Firmware/Firmware.sln +/Firmware/Firmware.vcxproj +/Firmware/Firmware.vcxproj.filters +/Firmware/__vm diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 08cfae29..f2fe1b97 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -350,6 +350,15 @@ extern char dir_names[3][9]; // save/restore printing extern bool saved_printing; +//estimated time to end of the print +extern uint8_t print_percent_done_normal; +extern uint16_t print_time_remaining_normal; +extern uint8_t print_percent_done_silent; +extern uint16_t print_time_remaining_silent; +#define PRINT_TIME_REMAINING_INIT 65535 +#define PRINT_PERCENT_DONE_INIT 255 +#define PRINTER_ACTIVE (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == 4) || saved_printing || (lcd_commands_type == LCD_COMMAND_V2_CAL)) + extern void calculate_extruder_multipliers(); // Similar to the default Arduino delay function, @@ -402,6 +411,11 @@ extern void print_mesh_bed_leveling_table(); extern void fsensor_init(); #endif //PAT9125 +//estimated time to end of the print +extern uint16_t print_time_remaining(); +extern uint8_t print_percent_done(); +static void print_time_remaining_init(); + #ifdef HOST_KEEPALIVE_FEATURE // States for managing Marlin and host communication @@ -444,4 +458,4 @@ void gcode_M701(); #define UVLO !(PINE & (1<<4)) -void proc_commands(); +void proc_commands(); \ No newline at end of file diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index b3c0a71f..9ebbfcea 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -185,6 +185,7 @@ // Call gcode file : "M32 P !filename#" and return to caller file after finishing (similar to #include). // The '#' is necessary when calling from within sd files, as it stops buffer prereading // 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. +// M73 - Show percent done and print time remaining // M80 - Turn on Power Supply // M81 - Turn off Power Supply // M82 - Set E codes absolute (default) @@ -448,6 +449,11 @@ uint8_t saved_filament_type; // save/restore printing bool saved_printing = false; +// storing estimated time to end of print counted by slicer +uint8_t print_percent_done_normal = PRINT_PERCENT_DONE_INIT; +uint16_t print_time_remaining_normal = PRINT_TIME_REMAINING_INIT; //estimated remaining print time in minutes +uint8_t print_percent_done_silent = PRINT_PERCENT_DONE_INIT; +uint16_t print_time_remaining_silent = PRINT_TIME_REMAINING_INIT; //estimated remaining print time in minutes //=========================================================================== //=============================Private Variables============================= @@ -4465,7 +4471,7 @@ void process_commands() card.openFile(strchr_pointer + 4,true); break; case 24: //M24 - Start SD print - if (!card.paused) + if (!card.paused) failstats_reset_print(); card.startFileprint(); starttime=millis(); @@ -4947,6 +4953,22 @@ Sigma_Exit: } #endif // Z_PROBE_REPEATABILITY_TEST #endif // ENABLE_AUTO_BED_LEVELING + case 73: //M73 show percent done and time remaining + if(code_seen('P')) print_percent_done_normal = code_value(); + if(code_seen('R')) print_time_remaining_normal = code_value(); + if(code_seen('Q')) print_percent_done_silent = code_value(); + if(code_seen('S')) print_time_remaining_silent = code_value(); + + SERIAL_ECHOPGM("NORMAL MODE: Percent done: "); + MYSERIAL.print(int(print_percent_done_normal)); + SERIAL_ECHOPGM("; print time remaining in mins: "); + MYSERIAL.println(print_time_remaining_normal); + SERIAL_ECHOPGM("SILENT MODE: Percent done: "); + MYSERIAL.print(int(print_percent_done_silent)); + SERIAL_ECHOPGM("; print time remaining in mins: "); + MYSERIAL.println(print_time_remaining_silent); + + break; case 104: // M104 if(setTargetedHotend(104)){ @@ -5255,6 +5277,8 @@ Sigma_Exit: #endif } } + //in the end of print set estimated time to end of print and extruders used during print to default values for next print + print_time_remaining_init(); snmm_filaments_used = 0; break; case 85: // M85 @@ -7264,8 +7288,7 @@ static void handleSafetyTimer() #if (EXTRUDERS > 1) #error Implemented only for one extruder. #endif //(EXTRUDERS > 1) - if (IS_SD_PRINTING || is_usb_printing || isPrintPaused || (custom_message_type == 4) || saved_printing - || (lcd_commands_type == LCD_COMMAND_V2_CAL) || (!degTargetBed() && !degTargetHotend(0))) + if ((PRINTER_ACTIVE) || (!degTargetBed() && !degTargetHotend(0))) { safetyTimer.stop(); } @@ -8773,5 +8796,34 @@ void print_mesh_bed_leveling_table() SERIAL_ECHOLNPGM(""); } +uint16_t print_time_remaining() { + uint16_t print_t = PRINT_TIME_REMAINING_INIT; + if (SilentModeMenu == SILENT_MODE_OFF) print_t = print_time_remaining_normal; + else print_t = print_time_remaining_silent; + if ((print_t != PRINT_TIME_REMAINING_INIT) && (feedmultiply != 0)) print_t = 100 * print_t / feedmultiply; + return print_t; +} + +uint8_t print_percent_done() { + //in case that we have information from M73 gcode return percentage counted by slicer, else return percentage counted as byte_printed/filesize + uint8_t percent_done = 0; + if (SilentModeMenu == SILENT_MODE_OFF && print_percent_done_normal <= 100) { + percent_done = print_percent_done_normal; + } + else if (print_percent_done_silent <= 100) { + percent_done = print_percent_done_silent; + } + else { + percent_done = card.percentDone(); + } + return percent_done; +} + +static void print_time_remaining_init() { + print_time_remaining_normal = PRINT_TIME_REMAINING_INIT; + print_time_remaining_silent = PRINT_TIME_REMAINING_INIT; + print_percent_done_normal = PRINT_PERCENT_DONE_INIT; + print_percent_done_silent = PRINT_PERCENT_DONE_INIT; +} #define FIL_LOAD_LENGTH 60 diff --git a/Firmware/ultralcd_implementation_hitachi_HD44780.h b/Firmware/ultralcd_implementation_hitachi_HD44780.h index 06861cf7..c6b18a4d 100644 --- a/Firmware/ultralcd_implementation_hitachi_HD44780.h +++ b/Firmware/ultralcd_implementation_hitachi_HD44780.h @@ -678,6 +678,53 @@ void lcd_implementation_print_at(uint8_t x, uint8_t y, const char *str) lcd.print(str); } +static inline void lcd_print_percent_done() { + if (is_usb_printing) + { + lcd_printPGM(PSTR("USB")); + } + else if(IS_SD_PRINTING) + { + lcd_printPGM(PSTR("SD")); + } + else + { + lcd_printPGM(PSTR(" ")); + } + if (IS_SD_PRINTING || (PRINTER_ACTIVE && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT))) + { + lcd.print(itostr3(print_percent_done())); + } + else + { + lcd_printPGM(PSTR("---")); + } + lcd.print('%'); +} + +static inline void lcd_print_time() { + //if remaining print time estimation is available print it else print elapsed time + //uses 8 characters + uint16_t print_t = 0; + if (print_time_remaining_normal != PRINT_TIME_REMAINING_INIT){ + print_t = print_time_remaining(); + } + else if(starttime != 0){ + print_t = millis() / 60000 - starttime / 60000; + } + lcd.print(LCD_STR_CLOCK[0]); + if((PRINTER_ACTIVE) && ((print_time_remaining_normal != PRINT_TIME_REMAINING_INIT)||(starttime != 0))) + { + lcd.print(itostr2(print_t/60)); + lcd.print(':'); + lcd.print(itostr2(print_t%60)); + (print_time_remaining_normal != PRINT_TIME_REMAINING_INIT) ? lcd.print('R') : lcd.print(' '); + (feedmultiply == 100) ? lcd.print(' ') : lcd.print('?'); + }else{ + lcd_printPGM(PSTR("--:-- ")); + } +} + /* 20x4 |01234567890123456789| @@ -774,36 +821,14 @@ if (print_sd_status) { //Print SD status lcd.setCursor(0, 2); - if (is_usb_printing) - { - lcd_printPGM(PSTR("--")); - } - else - { - lcd_printPGM(PSTR("SD")); - } - if (IS_SD_PRINTING) - { - lcd.print(itostr3(card.percentDone())); - lcd.print('%'); - } - else - { - if (is_usb_printing) - { - lcd_printPGM(PSTR(">USB")); - } - else - { - lcd_printPGM(PSTR("---")); - lcd.print('%'); - } - } + lcd_print_percent_done(); + } // Farm number display if (farm_mode) { + lcd.setCursor(0, 6); lcd_printPGM(PSTR(" F")); lcd.print(farm_no); lcd_printPGM(PSTR(" ")); @@ -836,20 +861,9 @@ if (print_sd_status) lcd.print(buflen); // number of commands in cmd buffer if (buflen < 9) lcd_printPGM(" "); #else - //Print time elapsed - lcd.setCursor(LCD_WIDTH - 8 -1, 2); - lcd_printPGM(PSTR(" ")); - lcd.print(LCD_STR_CLOCK[0]); - if(starttime != 0) - { - uint16_t time = millis() / 60000 - starttime / 60000; - lcd.print(itostr2(time/60)); - lcd.print(':'); - lcd.print(itostr2(time%60)); - }else{ - lcd_printPGM(PSTR("--:--")); - } - lcd_printPGM(PSTR(" ")); + //Print time + lcd.setCursor(LCD_WIDTH - 8, 2); + lcd_print_time(); #endif //CMD_DIAGNOSTICS #ifdef DEBUG_DISABLE_LCD_STATUS_LINE From 332a23bef518beace1ccf30e5b9c3f2d24c84ec4 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 8 Jun 2018 16:08:07 +0200 Subject: [PATCH 3/4] Crash detection stops and waits for user if it fails multiple times in short time frame --- .gitignore | 5 +++ Firmware/Marlin_main.cpp | 45 +++++++++++++++---- .../variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h | 1 + .../variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h | 1 + .../variants/1_75mm_MK3-EINSy10a-E3Dv6full.h | 6 ++- 5 files changed, 48 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 8bb12431..05b59952 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,8 @@ Debug Firmware/Configuration_prusa.h Firmware/Doc +/Firmware/__vm +/Firmware/Firmware.sln +/Firmware/Firmware.vcxproj +/Firmware/Firmware.vcxproj.filters +/Firmware/.vs/Firmware/v14 diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index b3c0a71f..857ddd64 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -322,6 +322,7 @@ unsigned long pause_time = 0; unsigned long start_pause_print = millis(); unsigned long t_fan_rising_edge = millis(); static LongTimer safetyTimer; +static LongTimer crashDetTimer; //unsigned long load_filament_time; @@ -678,6 +679,25 @@ void crashdet_detected(uint8_t mask) cmdqueue_pop_front(); }*/ st_synchronize(); + static uint8_t crashDet_counter = 0; + bool automatic_recovery_after_crash = true; + bool yesno; + + if (crashDet_counter++ == 0) { + crashDetTimer.start(); + } + else if (crashDetTimer.expired(CRASHDET_TIMER * 1000ul)){ + crashDetTimer.stop(); + crashDet_counter = 0; + } + else if(crashDet_counter == CRASHDET_COUNTER_MAX){ + automatic_recovery_after_crash = false; + crashDetTimer.stop(); + crashDet_counter = 0; + } + else { + crashDetTimer.start(); + } lcd_update_enable(true); lcd_implementation_clear(); @@ -694,17 +714,21 @@ void crashdet_detected(uint8_t mask) eeprom_update_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT, eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT) + 1); } -#ifdef AUTOMATIC_RECOVERY_AFTER_CRASH - bool yesno = true; -#else - bool yesno = lcd_show_fullscreen_message_yes_no_and_wait_P(_T(MSG_CRASH_DETECTED), false); -#endif + + lcd_update_enable(true); lcd_update(2); lcd_setstatuspgm(_T(MSG_CRASH_DETECTED)); + gcode_G28(true, true, false, false); //home X and Y + st_synchronize(); + + if(automatic_recovery_after_crash) + yesno = true; + else + yesno = lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Crash detected. Resume print?"), false); + lcd_update_enable(true); if (yesno) { - enquecommand_P(PSTR("G28 X Y")); enquecommand_P(PSTR("CRASH_RECOVER")); } else @@ -721,10 +745,15 @@ void crashdet_recover() void crashdet_cancel() { - card.sdprinting = false; - card.closefile(); tmc2130_sg_stop_on_crash = true; + if (saved_printing_type == PRINTING_TYPE_SD) { + lcd_print_stop(); + }else if(saved_printing_type == PRINTING_TYPE_USB){ + SERIAL_ECHOLNPGM("// action:cancel"); //for Octoprint: works the same as clicking "Abort" button in Octoprint GUI + SERIAL_PROTOCOLLNRPGM(_T(MSG_OK)); + } } + #endif //TMC2130 void failstats_reset_print() diff --git a/Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h index aa1ee44f..f20290da 100644 --- a/Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK25-RAMBo10a-E3Dv6full.h @@ -141,6 +141,7 @@ //#define DEBUG_DUMP_TO_2ND_SERIAL //dump received characters to 2nd serial line //#define DEBUG_STEPPER_TIMER_MISSED // Stop on stepper timer overflow, beep and display a message. //#define PLANNER_DIAGNOSTICS // Show the planner queue status on printer display. +//#define CMD_DIAGNOSTICS //Show cmd queue length on printer display #endif /* DEBUG_BUILD */ diff --git a/Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h index fac638ba..7891b7a0 100644 --- a/Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK25-RAMBo13a-E3Dv6full.h @@ -141,6 +141,7 @@ //#define DEBUG_DUMP_TO_2ND_SERIAL //dump received characters to 2nd serial line //#define DEBUG_STEPPER_TIMER_MISSED // Stop on stepper timer overflow, beep and display a message. //#define PLANNER_DIAGNOSTICS // Show the planner queue status on printer display. +//#define CMD_DIAGNOSTICS //Show cmd queue length on printer display #endif /* DEBUG_BUILD */ diff --git a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h index cbf34cfa..38518935 100644 --- a/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK3-EINSy10a-E3Dv6full.h @@ -112,8 +112,9 @@ #define Z_AXIS_ALWAYS_ON 1 -// Automatic recovery after crash is detected -#define AUTOMATIC_RECOVERY_AFTER_CRASH +//Crash detection +#define CRASHDET_TIMER 45 //seconds +#define CRASHDET_COUNTER_MAX 3 // New XYZ calibration #define NEW_XYZCAL @@ -177,6 +178,7 @@ #define DEBUG_DUMP_TO_2ND_SERIAL //dump received characters to 2nd serial line #define DEBUG_STEPPER_TIMER_MISSED // Stop on stepper timer overflow, beep and display a message. #define PLANNER_DIAGNOSTICS // Show the planner queue status on printer display. +#define CMD_DIAGNOSTICS //Show cmd queue length on printer display #endif /* DEBUG_BUILD */ //#define EXPERIMENTAL_FEATURES From 5e120e6e52f6bc75fc075392fe618ef48c9c199d Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 8 Jun 2018 18:13:50 +0200 Subject: [PATCH 4/4] power panic flow factor hotfix --- .gitignore | 5 +++++ Firmware/Configuration.h | 2 ++ Firmware/Marlin_main.cpp | 3 ++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8bb12431..98f5b0b1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,8 @@ Debug Firmware/Configuration_prusa.h Firmware/Doc +/Firmware/.vs/Firmware/v14 +/Firmware/__vm +/Firmware/Firmware.sln +/Firmware/Firmware.vcxproj +/Firmware/Firmware.vcxproj.filters diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 2cdbe12b..628c139a 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -178,6 +178,8 @@ #define EEPROM_EXTRUDER_MULTIPLIER_0 (EEPROM_BOARD_TYPE - 4) //float #define EEPROM_EXTRUDER_MULTIPLIER_1 (EEPROM_EXTRUDER_MULTIPLIER_0 - 4) //float #define EEPROM_EXTRUDER_MULTIPLIER_2 (EEPROM_EXTRUDER_MULTIPLIER_1 - 4) //float +#define EEPROM_EXTRUDEMULTIPLY (EEPROM_EXTRUDER_MULTIPLIER_2 - 2) // uint16 + //TMC2130 configuration #define EEPROM_TMC_AXIS_SIZE //axis configuration block size diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 4d3cb9e8..a3afde0a 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -8287,6 +8287,7 @@ void uvlo_() eeprom_update_float((float*)(EEPROM_EXTRUDER_MULTIPLIER_2), extruder_multiplier[2]); #endif #endif + eeprom_update_word((uint16_t*)(EEPROM_EXTRUDEMULTIPLY), (uint16_t)extrudemultiply); // Finaly store the "power outage" flag. if(sd_print) eeprom_update_byte((uint8_t*)EEPROM_UVLO, 1); @@ -8502,7 +8503,7 @@ void recover_machine_state_after_power_panic() extruder_multiplier[2] = eeprom_read_float((float*)(EEPROM_EXTRUDER_MULTIPLIER_2)); #endif #endif - + extrudemultiply = (int)eeprom_read_word((uint16_t*)(EEPROM_EXTRUDEMULTIPLY)); } void restore_print_from_eeprom() {