From fd01942db8c7472ae309c13fe85f1d24db93a3c0 Mon Sep 17 00:00:00 2001 From: leptun Date: Thu, 19 Sep 2019 20:48:59 +0300 Subject: [PATCH 01/15] FAN Error fix - Initial --- Firmware/Marlin.h | 5 ++++ Firmware/Marlin_main.cpp | 50 +++++++++++++++++++++------------------- Firmware/messages.c | 3 ++- Firmware/messages.h | 3 ++- Firmware/temperature.cpp | 18 +++++++-------- Firmware/temperature.h | 1 + Firmware/ultralcd.cpp | 15 ++++++++---- 7 files changed, 55 insertions(+), 40 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 625e079ea..3c96cfc0d 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -240,6 +240,11 @@ void prepare_move(); void kill(const char *full_screen_message = NULL, unsigned char id = 0); void Stop(); +#define PRINTING_TYPE_SD 0 +#define PRINTING_TYPE_USB 1 +#define PRINTING_TYPE_NONE 2 +extern uint8_t saved_printing_type; + bool IsStopped(); //put an ASCII command at the end of the current buffer. diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 2423beafb..b73ef5941 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -142,10 +142,6 @@ //Macro for print fan speed #define FAN_PULSE_WIDTH_LIMIT ((fanSpeed > 100) ? 3 : 4) //time in ms -#define PRINTING_TYPE_SD 0 -#define PRINTING_TYPE_USB 1 -#define PRINTING_TYPE_NONE 2 - //filament types #define FILAMENT_DEFAULT 0 #define FILAMENT_FLEX 1 @@ -378,7 +374,7 @@ boolean chdkActive = false; //! @{ bool saved_printing = false; //!< Print is paused and saved in RAM static uint32_t saved_sdpos = 0; //!< SD card position, or line number in case of USB printing -static uint8_t saved_printing_type = PRINTING_TYPE_SD; +uint8_t saved_printing_type = PRINTING_TYPE_SD; static float saved_pos[4] = { 0, 0, 0, 0 }; //! Feedrate hopefully derived from an active block of the planner at the time the print has been canceled, in mm/min. static float saved_feedrate2 = 0; @@ -1751,12 +1747,22 @@ void loop() { is_usb_printing = false; } - + +#ifdef FANCHECK + if ((saved_printing_type == PRINTING_TYPE_USB) && fan_check_error) + { + process_commands(); //used to process pausing + KEEPALIVE_STATE(PAUSED_FOR_USER); + host_keepalive(); //prevent timeouts since usb processing is disabled until print is resumed. This is for a crude way of pausing a print on all hosts. + } + else +#endif if (prusa_sd_card_upload) { //we read byte-by byte serial_read_stream(); - } else + } + else { get_command(); @@ -3450,22 +3456,16 @@ extern uint8_t st_backlash_y; void process_commands() { - #ifdef FANCHECK - if (fan_check_error){ - if( fan_check_error == EFCE_DETECTED ){ - fan_check_error = EFCE_REPORTED; - - if(is_usb_printing){ - SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSE); - } - else{ - lcd_pause_print(); - } - - } // otherwise it has already been reported, so just ignore further processing - return; - } - #endif +#ifdef FANCHECK + if(fan_check_error){ + if(fan_check_error == EFCE_DETECTED){ + fan_check_error = EFCE_REPORTED; + // SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); + lcd_pause_print(); + } // otherwise it has already been reported, so just ignore further processing + if(saved_printing_type == PRINTING_TYPE_USB) return; //ignore usb stream. + } +#endif if (!buflen) return; //empty command #ifdef FILAMENT_RUNOUT_SUPPORT @@ -10154,7 +10154,8 @@ void restore_print_from_ram_and_continue(float e_move) #ifdef FANCHECK // Do not allow resume printing if fans are still not ok - if( fan_check_error != EFCE_OK )return; + if ((fan_check_error != EFCE_OK) && (fan_check_error != EFCE_FIXED)) return; + if (fan_check_error == EFCE_FIXED) fan_check_error = EFCE_OK; //reenable serial stream processing if printing from usb #endif // for (int axis = X_AXIS; axis <= E_AXIS; axis++) @@ -10208,6 +10209,7 @@ void restore_print_from_ram_and_continue(float e_move) } SERIAL_PROTOCOLLNRPGM(MSG_OK); //dummy response because of octoprint is waiting for this lcd_setstatuspgm(_T(WELCOME_MSG)); + saved_printing_type = PRINTING_TYPE_NONE; saved_printing = false; } diff --git a/Firmware/messages.c b/Firmware/messages.c index 1c36e43c5..7803bb358 100644 --- a/Firmware/messages.c +++ b/Firmware/messages.c @@ -129,4 +129,5 @@ const char MSG_ENDSTOP_OPEN[] PROGMEM_N1 = "open"; //// const char MSG_POWERUP[] PROGMEM_N1 = "PowerUp"; //// const char MSG_ERR_STOPPED[] PROGMEM_N1 = "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"; //// const char MSG_ENDSTOP_HIT[] PROGMEM_N1 = "TRIGGERED"; //// -const char MSG_OCTOPRINT_PAUSE[] PROGMEM_N1 = "// action:pause"; //// +const char MSG_OCTOPRINT_PAUSED[] PROGMEM_N1 = "// action:paused"; //// +const char MSG_OCTOPRINT_RESUMED[] PROGMEM_N1 = "// action:resumed"; //// diff --git a/Firmware/messages.h b/Firmware/messages.h index b48337efd..a6525491d 100644 --- a/Firmware/messages.h +++ b/Firmware/messages.h @@ -130,7 +130,8 @@ extern const char MSG_ERR_STOPPED[]; extern const char MSG_ENDSTOP_HIT[]; extern const char MSG_EJECT_FILAMENT[]; extern const char MSG_CUT_FILAMENT[]; -extern const char MSG_OCTOPRINT_PAUSE[]; +extern const char MSG_OCTOPRINT_PAUSED[]; +extern const char MSG_OCTOPRINT_RESUMED[]; #if defined(__cplusplus) } diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index 3c7f5fbc4..f88933a19 100755 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -503,7 +503,7 @@ void checkFanSpeed() // drop the fan_check_error flag when both fans are ok if( fan_speed_errors[0] == 0 && fan_speed_errors[1] == 0 && fan_check_error == EFCE_REPORTED){ // we may even send some info to the LCD from here - fan_check_error = EFCE_OK; + fan_check_error = EFCE_FIXED; } if ((fan_speed_errors[0] > max_extruder_fan_errors) && fans_check_enabled) { @@ -529,21 +529,21 @@ static void fanSpeedErrorBeep(const char *serialMsg, const char *lcdMsg){ } void fanSpeedError(unsigned char _fan) { - if (get_message_level() != 0 && isPrintPaused) return; - //to ensure that target temp. is not set to zero in case taht we are resuming print + if (get_message_level() != 0 && isPrintPaused) return; + //to ensure that target temp. is not set to zero in case that we are resuming print if (card.sdprinting || is_usb_printing) { if (heating_status != 0) { lcd_print_stop(); } else { - fan_check_error = EFCE_DETECTED; + fan_check_error = EFCE_DETECTED; //plans error for next processed command } } else { - SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSE); //for octoprint - setTargetHotend0(0); - heating_status = 0; - fan_check_error = EFCE_REPORTED; + // SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); //Why pause octoprint? is_usb_printing would be true in that case, so there is no need for this. + setTargetHotend0(0); + heating_status = 0; + fan_check_error = EFCE_REPORTED; } switch (_fan) { case 0: // extracting the same code from case 0 and case 1 into a function saves 72B @@ -553,7 +553,7 @@ void fanSpeedError(unsigned char _fan) { fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), PSTR("Err: PRINT FAN ERROR") ); break; } - SERIAL_PROTOCOLLNRPGM(MSG_OK); + // SERIAL_PROTOCOLLNRPGM(MSG_OK); //This ok messes things up with octoprint. } #endif //(defined(TACH_0) && TACH_0 >-1) || (defined(TACH_1) && TACH_1 > -1) diff --git a/Firmware/temperature.h b/Firmware/temperature.h index 7f4daa2e4..7c40eae65 100755 --- a/Firmware/temperature.h +++ b/Firmware/temperature.h @@ -241,6 +241,7 @@ void checkExtruderAutoFans(); enum { EFCE_OK = 0, //!< normal operation, both fans are ok + EFCE_FIXED, //!< previous fan error was fixed EFCE_DETECTED, //!< fan error detected, but not reported yet EFCE_REPORTED //!< fan error detected and reported to LCD and serial }; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 0abdf1b59..87a64e72b 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1650,7 +1650,7 @@ void lcd_pause_print() { lcd_commands_type = LcdCommands::LongPause; } - SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSE); //pause for octoprint + SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); //pause for octoprint } @@ -6322,13 +6322,14 @@ static void lcd_test_menu() void lcd_resume_print() { lcd_return_to_status(); - lcd_reset_alert_level(); + lcd_reset_alert_level(); lcd_setstatuspgm(_T(MSG_RESUMING_PRINT)); lcd_reset_alert_level(); //for fan speed error restore_print_from_ram_and_continue(0.0); pause_time += (_millis() - start_pause_print); //accumulate time when print is paused for correct statistics calculation refresh_cmd_timeout(); isPrintPaused = false; + SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_RESUMED); //resume octoprint } static void change_sheet() @@ -6461,6 +6462,11 @@ static void lcd_main_menu() } +#ifdef FANCHECK + checkFanSpeed(); //Check manually to get most recent fan speed status + if((fan_check_error == EFCE_FIXED) && (saved_printing_type == PRINTING_TYPE_USB)) + MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT +#endif #ifdef SDSUPPORT if (card.cardOK || lcd_commands_type == LcdCommands::Layer1Cal) @@ -6475,9 +6481,8 @@ static void lcd_main_menu() else { #ifdef FANCHECK - checkFanSpeed(); //Check manually to get most recent fan speed status - if(fan_check_error == EFCE_OK) - MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT + if(fan_check_error == EFCE_FIXED) + MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT #else MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT #endif From 2363f19a626bc3d9921c13044dec7c375fe4e39a Mon Sep 17 00:00:00 2001 From: leptun Date: Fri, 20 Sep 2019 21:07:20 +0300 Subject: [PATCH 02/15] Minor tweaks for usb printing --- Firmware/Marlin.h | 9 ++++----- Firmware/Marlin_main.cpp | 6 +++++- Firmware/ultralcd.cpp | 1 + 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 3c96cfc0d..ee7f15d8c 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -240,11 +240,6 @@ void prepare_move(); void kill(const char *full_screen_message = NULL, unsigned char id = 0); void Stop(); -#define PRINTING_TYPE_SD 0 -#define PRINTING_TYPE_USB 1 -#define PRINTING_TYPE_NONE 2 -extern uint8_t saved_printing_type; - bool IsStopped(); //put an ASCII command at the end of the current buffer. @@ -381,6 +376,10 @@ extern char dir_names[3][9]; extern int8_t lcd_change_fil_state; // save/restore printing extern bool saved_printing; +extern uint8_t saved_printing_type; +#define PRINTING_TYPE_SD 0 +#define PRINTING_TYPE_USB 1 +#define PRINTING_TYPE_NONE 2 //save/restore printing in case that mmu is not responding extern bool mmu_print_saved; diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index b73ef5941..3e1372edb 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1747,6 +1747,10 @@ void loop() { is_usb_printing = false; } + if (isPrintPaused && saved_printing_type == PRINTING_TYPE_USB) //keep believing that usb is being printed. Prevents accessing dangerous menus while pausing. + { + is_usb_printing = true; + } #ifdef FANCHECK if ((saved_printing_type == PRINTING_TYPE_USB) && fan_check_error) @@ -3463,7 +3467,7 @@ void process_commands() // SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); lcd_pause_print(); } // otherwise it has already been reported, so just ignore further processing - if(saved_printing_type == PRINTING_TYPE_USB) return; //ignore usb stream. + return; //ignore usb stream. It is reenabled by selecting resume from the lcd. } #endif diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 87a64e72b..0fb1d3de6 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6847,6 +6847,7 @@ void lcd_print_stop() SERIAL_ECHOLNPGM("// action:cancel"); // for Octoprint } saved_printing = false; + saved_printing_type = PRINTING_TYPE_NONE; cancel_heatup = true; #ifdef MESH_BED_LEVELING mbl.active = false; From 3c17f7e145ab6cf346f02732f3c0193d217b1516 Mon Sep 17 00:00:00 2001 From: leptun Date: Sun, 22 Sep 2019 14:04:58 +0300 Subject: [PATCH 03/15] No need to check the fan in the menu --- Firmware/ultralcd.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 0fb1d3de6..1d970368a 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6463,7 +6463,6 @@ static void lcd_main_menu() #ifdef FANCHECK - checkFanSpeed(); //Check manually to get most recent fan speed status if((fan_check_error == EFCE_FIXED) && (saved_printing_type == PRINTING_TYPE_USB)) MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT #endif From 89de5aac77f382fd0257fa3779fdd866f1ab2bf6 Mon Sep 17 00:00:00 2001 From: MRprusa3d Date: Mon, 23 Sep 2019 17:13:33 +0200 Subject: [PATCH 04/15] default nozzle diameter for farm mode --- Firmware/eeprom.h | 1 + Firmware/util.cpp | 6 +++++- Firmware/util.h | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h index 482ddf932..8276d61a7 100644 --- a/Firmware/eeprom.h +++ b/Firmware/eeprom.h @@ -25,6 +25,7 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP #endif #define EEPROM_EMPTY_VALUE 0xFF +#define EEPROM_EMPTY_VALUE16 0xFFFF // The total size of the EEPROM is // 4096 for the Atmega2560 #define EEPROM_TOP 4096 diff --git a/Firmware/util.cpp b/Firmware/util.cpp index aa1a624da..aac72ee0c 100644 --- a/Firmware/util.cpp +++ b/Firmware/util.cpp @@ -341,13 +341,17 @@ if(oCheckMode==ClCheckMode::_Undef) eeprom_update_byte((uint8_t*)EEPROM_CHECK_MODE,(uint8_t)oCheckMode); } if(farm_mode) + { oCheckMode=ClCheckMode::_Strict; + if(eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM)==EEPROM_EMPTY_VALUE16) + eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,EEPROM_NOZZLE_DIAMETER_uM_DEFAULT); + } oNozzleDiameter=(ClNozzleDiameter)eeprom_read_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER); if((oNozzleDiameter==ClNozzleDiameter::_Diameter_Undef)&& !farm_mode) { oNozzleDiameter=ClNozzleDiameter::_Diameter_400; eeprom_update_byte((uint8_t*)EEPROM_NOZZLE_DIAMETER,(uint8_t)oNozzleDiameter); - eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,400); + eeprom_update_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM,EEPROM_NOZZLE_DIAMETER_uM_DEFAULT); } oCheckModel=(ClCheckModel)eeprom_read_byte((uint8_t*)EEPROM_CHECK_MODEL); if(oCheckModel==ClCheckModel::_Undef) diff --git a/Firmware/util.h b/Firmware/util.h index a9bbcb1d6..8f23cd5c3 100644 --- a/Firmware/util.h +++ b/Firmware/util.h @@ -35,6 +35,8 @@ inline void eeprom_update_int8(unsigned char* addr, int8_t v) { //-// +#define EEPROM_NOZZLE_DIAMETER_uM_DEFAULT 400 + enum class ClPrintChecking:uint_least8_t { _Nozzle=1, From c3b7b5ebb57f0e8f197c195bf70db5cb9217a53b Mon Sep 17 00:00:00 2001 From: leptun Date: Wed, 25 Sep 2019 15:58:07 +0300 Subject: [PATCH 05/15] Check fans before resuming --- Firmware/ultralcd.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 1d970368a..574519f28 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6325,6 +6325,39 @@ void lcd_resume_print() lcd_reset_alert_level(); lcd_setstatuspgm(_T(MSG_RESUMING_PRINT)); lcd_reset_alert_level(); //for fan speed error + +#ifdef FANCHECK + fanSpeed = 255; +#ifdef FAN_SOFT_PWM + fanSpeedSoftPwm = 255; +#endif //FAN_SOFT_PWM + manage_heater(); //enables print fan + setExtruderAutoFanState(EXTRUDER_0_AUTO_FAN_PIN, 1); //force enables the extruder fan untill the first manage_heater() call. +#ifdef FAN_SOFT_PWM + extruder_autofan_last_check = _millis(); + fan_measuring = true; +#endif //FAN_SOFT_PWM + _delay(2000); //delay_keep_alive would turn off extruder fan, because temerature is too low (maybe) + manage_heater(); + fanSpeed = 0; +#ifdef FAN_SOFT_PWM + fanSpeedSoftPwm = 0; +#endif //FAN_SOFT_PWM + manage_heater(); +#ifdef TACH_0 + if (!fan_speed[0]) { //extruder fan error + LCD_ALERTMESSAGERPGM(PSTR("Err: EXTR. FAN ERROR")); + return; + } +#endif +#ifdef TACH_1 + if (!fan_speed[1]) { //print fan error + LCD_ALERTMESSAGERPGM(PSTR("Err: PRINT FAN ERROR")); + return; + } +#endif +#endif //FANCHECK + restore_print_from_ram_and_continue(0.0); pause_time += (_millis() - start_pause_print); //accumulate time when print is paused for correct statistics calculation refresh_cmd_timeout(); From 14b72d2b468eb7e50e5b310b5c94c0be2dc14258 Mon Sep 17 00:00:00 2001 From: leptun Date: Wed, 25 Sep 2019 18:12:19 +0300 Subject: [PATCH 06/15] Prevent timeout when printing from SD with USB host connected --- Firmware/Marlin_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 3e1372edb..f9cfb9005 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1753,7 +1753,7 @@ void loop() } #ifdef FANCHECK - if ((saved_printing_type == PRINTING_TYPE_USB) && fan_check_error) + if (fan_check_error) { process_commands(); //used to process pausing KEEPALIVE_STATE(PAUSED_FOR_USER); From 532d1fc4ae9ef079982237bce42acbdf01711d1b Mon Sep 17 00:00:00 2001 From: leptun Date: Wed, 25 Sep 2019 18:32:35 +0300 Subject: [PATCH 07/15] Fix "Resume Print" missing when doing a normal pause --- Firmware/ultralcd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 574519f28..a332911d9 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6513,7 +6513,7 @@ static void lcd_main_menu() else { #ifdef FANCHECK - if(fan_check_error == EFCE_FIXED) + if((fan_check_error == EFCE_FIXED) || (fan_check_error == EFCE_OK)) MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT #else MENU_ITEM_SUBMENU_P(_i("Resume print"), lcd_resume_print);////MSG_RESUME_PRINT From 4d149f0dfa711f35905e606e4666146874b6cdc9 Mon Sep 17 00:00:00 2001 From: leptun Date: Wed, 25 Sep 2019 18:50:29 +0300 Subject: [PATCH 08/15] Do not send useless keepalive messages after print is canceled from lcd --- Firmware/Marlin_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index f9cfb9005..10660195a 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1753,7 +1753,7 @@ void loop() } #ifdef FANCHECK - if (fan_check_error) + if (fan_check_error && isPrintPaused) { process_commands(); //used to process pausing KEEPALIVE_STATE(PAUSED_FOR_USER); From 9c2269282754e430b8b96bdebd889f7eae45ef28 Mon Sep 17 00:00:00 2001 From: leptun Date: Wed, 25 Sep 2019 22:34:31 +0300 Subject: [PATCH 09/15] Fix Cancel Print command processing --- Firmware/Marlin_main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 10660195a..98dff2f9b 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1755,12 +1755,11 @@ void loop() #ifdef FANCHECK if (fan_check_error && isPrintPaused) { - process_commands(); //used to process pausing KEEPALIVE_STATE(PAUSED_FOR_USER); host_keepalive(); //prevent timeouts since usb processing is disabled until print is resumed. This is for a crude way of pausing a print on all hosts. } - else #endif + if (prusa_sd_card_upload) { //we read byte-by byte From dfd3f34351f96a6807e4ca931f9015b3150d6bff Mon Sep 17 00:00:00 2001 From: leptun Date: Wed, 25 Sep 2019 22:35:35 +0300 Subject: [PATCH 10/15] Check for minimum fan speed. Should be achievable by both fans in 1s. --- Firmware/ultralcd.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index a332911d9..b29d39fb3 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6337,7 +6337,7 @@ void lcd_resume_print() extruder_autofan_last_check = _millis(); fan_measuring = true; #endif //FAN_SOFT_PWM - _delay(2000); //delay_keep_alive would turn off extruder fan, because temerature is too low (maybe) + _delay(1000); //delay_keep_alive would turn off extruder fan, because temerature is too low (maybe) manage_heater(); fanSpeed = 0; #ifdef FAN_SOFT_PWM @@ -6345,13 +6345,13 @@ void lcd_resume_print() #endif //FAN_SOFT_PWM manage_heater(); #ifdef TACH_0 - if (!fan_speed[0]) { //extruder fan error + if (fan_speed[0] <= 20) { //extruder fan error LCD_ALERTMESSAGERPGM(PSTR("Err: EXTR. FAN ERROR")); return; } #endif #ifdef TACH_1 - if (!fan_speed[1]) { //print fan error + if (fan_speed[1] <= 20) { //print fan error LCD_ALERTMESSAGERPGM(PSTR("Err: PRINT FAN ERROR")); return; } From ff9a6c81772ce2735bc47bfe837c6ad625da03ce Mon Sep 17 00:00:00 2001 From: leptun Date: Thu, 26 Sep 2019 20:52:29 +0300 Subject: [PATCH 11/15] Prevent fan error while checking fan functionality --- Firmware/temperature.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index f88933a19..e1c467287 100755 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -506,11 +506,11 @@ void checkFanSpeed() fan_check_error = EFCE_FIXED; } - if ((fan_speed_errors[0] > max_extruder_fan_errors) && fans_check_enabled) { + if ((fan_speed_errors[0] > max_extruder_fan_errors) && fans_check_enabled && (fan_check_error == EFCE_OK)) { fan_speed_errors[0] = 0; fanSpeedError(0); //extruder fan } - if ((fan_speed_errors[1] > max_print_fan_errors) && fans_check_enabled) { + if ((fan_speed_errors[1] > max_print_fan_errors) && fans_check_enabled && (fan_check_error == EFCE_OK)) { fan_speed_errors[1] = 0; fanSpeedError(1); //print fan } From 30f325c81d190f24e9582b54f1c80643bb18cf32 Mon Sep 17 00:00:00 2001 From: leptun Date: Mon, 30 Sep 2019 20:01:31 +0300 Subject: [PATCH 12/15] Extract fan_error_selftest to function for readability --- Firmware/ultralcd.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index b29d39fb3..bd261d4e4 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6316,17 +6316,10 @@ static void lcd_test_menu() } #endif //LCD_TEST -//! @brief Resume paused print -//! @todo It is not good to call restore_print_from_ram_and_continue() from function called by lcd_update(), -//! as restore_print_from_ram_and_continue() calls lcd_update() internally. -void lcd_resume_print() +static void fan_error_selftest() { - lcd_return_to_status(); - lcd_reset_alert_level(); - lcd_setstatuspgm(_T(MSG_RESUMING_PRINT)); - lcd_reset_alert_level(); //for fan speed error - #ifdef FANCHECK + fanSpeed = 255; #ifdef FAN_SOFT_PWM fanSpeedSoftPwm = 255; @@ -6356,7 +6349,21 @@ void lcd_resume_print() return; } #endif -#endif //FANCHECK + +#endif //FANCHECK +} + +//! @brief Resume paused print +//! @todo It is not good to call restore_print_from_ram_and_continue() from function called by lcd_update(), +//! as restore_print_from_ram_and_continue() calls lcd_update() internally. +void lcd_resume_print() +{ + lcd_return_to_status(); + lcd_reset_alert_level(); + lcd_setstatuspgm(_T(MSG_RESUMING_PRINT)); + lcd_reset_alert_level(); //for fan speed error + + fan_error_selftest(); restore_print_from_ram_and_continue(0.0); pause_time += (_millis() - start_pause_print); //accumulate time when print is paused for correct statistics calculation From 61c74795791f3ec64411e6a4a8c43ae8f1aa448e Mon Sep 17 00:00:00 2001 From: leptun Date: Mon, 30 Sep 2019 20:16:01 +0300 Subject: [PATCH 13/15] Code cleanup: Move texts to messages.c/h --- Firmware/Marlin_main.cpp | 2 +- Firmware/messages.c | 3 +++ Firmware/messages.h | 3 +++ Firmware/temperature.cpp | 4 ++-- Firmware/ultralcd.cpp | 6 +++--- 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 98dff2f9b..39013dc8d 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -619,7 +619,7 @@ void crashdet_cancel() 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_ECHOLNRPGM(MSG_OCTOPRINT_CANCEL); //for Octoprint: works the same as clicking "Abort" button in Octoprint GUI SERIAL_PROTOCOLLNRPGM(MSG_OK); } } diff --git a/Firmware/messages.c b/Firmware/messages.c index 7803bb358..c0c3cfc3f 100644 --- a/Firmware/messages.c +++ b/Firmware/messages.c @@ -131,3 +131,6 @@ const char MSG_ERR_STOPPED[] PROGMEM_N1 = "Printer stopped due to errors. Fix th const char MSG_ENDSTOP_HIT[] PROGMEM_N1 = "TRIGGERED"; //// const char MSG_OCTOPRINT_PAUSED[] PROGMEM_N1 = "// action:paused"; //// const char MSG_OCTOPRINT_RESUMED[] PROGMEM_N1 = "// action:resumed"; //// +const char MSG_OCTOPRINT_CANCEL[] PROGMEM_N1 = "// action:cancel"; //// +const char MSG_FANCHECK_EXTRUDER[] PROGMEM_N1 = "Err: EXTR. FAN ERROR"; ////c=20 +const char MSG_FANCHECK_PRINT[] PROGMEM_N1 = "Err: PRINT FAN ERROR"; ////c=20 diff --git a/Firmware/messages.h b/Firmware/messages.h index a6525491d..525b7c5b4 100644 --- a/Firmware/messages.h +++ b/Firmware/messages.h @@ -132,6 +132,9 @@ extern const char MSG_EJECT_FILAMENT[]; extern const char MSG_CUT_FILAMENT[]; extern const char MSG_OCTOPRINT_PAUSED[]; extern const char MSG_OCTOPRINT_RESUMED[]; +extern const char MSG_OCTOPRINT_CANCEL[]; +extern const char MSG_FANCHECK_EXTRUDER[]; +extern const char MSG_FANCHECK_PRINT[]; #if defined(__cplusplus) } diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index e1c467287..5a1b9c8c2 100755 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -547,10 +547,10 @@ void fanSpeedError(unsigned char _fan) { } switch (_fan) { case 0: // extracting the same code from case 0 and case 1 into a function saves 72B - fanSpeedErrorBeep(PSTR("Extruder fan speed is lower than expected"), PSTR("Err: EXTR. FAN ERROR") ); + fanSpeedErrorBeep(PSTR("Extruder fan speed is lower than expected"), MSG_FANCHECK_EXTRUDER); break; case 1: - fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), PSTR("Err: PRINT FAN ERROR") ); + fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), MSG_FANCHECK_PRINT); break; } // SERIAL_PROTOCOLLNRPGM(MSG_OK); //This ok messes things up with octoprint. diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index bd261d4e4..5214ea59e 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6339,13 +6339,13 @@ static void fan_error_selftest() manage_heater(); #ifdef TACH_0 if (fan_speed[0] <= 20) { //extruder fan error - LCD_ALERTMESSAGERPGM(PSTR("Err: EXTR. FAN ERROR")); + LCD_ALERTMESSAGERPGM(MSG_FANCHECK_EXTRUDER); return; } #endif #ifdef TACH_1 if (fan_speed[1] <= 20) { //print fan error - LCD_ALERTMESSAGERPGM(PSTR("Err: PRINT FAN ERROR")); + LCD_ALERTMESSAGERPGM(MSG_FANCHECK_PRINT); return; } #endif @@ -6883,7 +6883,7 @@ void lcd_print_stop() //-// if(!card.sdprinting) { - SERIAL_ECHOLNPGM("// action:cancel"); // for Octoprint + SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_CANCEL); // for Octoprint } saved_printing = false; saved_printing_type = PRINTING_TYPE_NONE; From 9d57f9c365c9999505415233727ee039199f7579 Mon Sep 17 00:00:00 2001 From: leptun Date: Mon, 30 Sep 2019 20:30:09 +0300 Subject: [PATCH 14/15] Fix fan_error_selftest() mistake --- Firmware/ultralcd.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 5214ea59e..a5623fa61 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6316,7 +6316,7 @@ static void lcd_test_menu() } #endif //LCD_TEST -static void fan_error_selftest() +static bool fan_error_selftest() { #ifdef FANCHECK @@ -6340,15 +6340,16 @@ static void fan_error_selftest() #ifdef TACH_0 if (fan_speed[0] <= 20) { //extruder fan error LCD_ALERTMESSAGERPGM(MSG_FANCHECK_EXTRUDER); - return; + return 1; } #endif #ifdef TACH_1 if (fan_speed[1] <= 20) { //print fan error LCD_ALERTMESSAGERPGM(MSG_FANCHECK_PRINT); - return; + return 1; } #endif + return 0; #endif //FANCHECK } @@ -6363,7 +6364,7 @@ void lcd_resume_print() lcd_setstatuspgm(_T(MSG_RESUMING_PRINT)); lcd_reset_alert_level(); //for fan speed error - fan_error_selftest(); + if (fan_error_selftest()) return; //abort if error persists restore_print_from_ram_and_continue(0.0); pause_time += (_millis() - start_pause_print); //accumulate time when print is paused for correct statistics calculation From ed13788e0caf032bc8a3ab3f8db9a25ad138c67d Mon Sep 17 00:00:00 2001 From: MRprusa3d Date: Tue, 1 Oct 2019 16:57:37 +0200 Subject: [PATCH 15/15] EEPROM_BABYSTEP_Z using removal --- Firmware/Marlin_main.cpp | 9 +++++---- Firmware/eeprom.cpp | 2 +- Firmware/eeprom.h | 8 ++++++-- Firmware/ultralcd.cpp | 15 +++++---------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 970b855f7..2251b7e35 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1527,7 +1527,7 @@ void setup() calibration_status() == CALIBRATION_STATUS_UNKNOWN || calibration_status() == CALIBRATION_STATUS_XYZ_CALIBRATION) { // Reset the babystepping values, so the printer will not move the Z axis up when the babystepping is enabled. - eeprom_update_word((uint16_t*)EEPROM_BABYSTEP_Z, 0); + eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); // Show the message. lcd_show_fullscreen_message_and_wait_P(_T(MSG_FOLLOW_CALIBRATION_FLOW)); } @@ -2694,6 +2694,7 @@ static void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, lon previous_millis_cmd = _millis(); endstops_hit_on_purpose(); #ifndef MESH_BED_LEVELING +//-// Oct 2019 :: this part of code is (from) now probably un-compilable // If MESH_BED_LEVELING is not active, then it is the original Prusa i3. // Offer the user to load the baby step value, which has been adjusted at the previous print session. if(card.sdprinting && eeprom_read_word((uint16_t *)EEPROM_BABYSTEP_Z)) @@ -2886,7 +2887,7 @@ bool gcode_M45(bool onlyZ, int8_t verbosity_level) { // Reset the baby step value and the baby step applied flag. calibration_status_store(CALIBRATION_STATUS_XYZ_CALIBRATION); - eeprom_update_word((uint16_t*)EEPROM_BABYSTEP_Z, 0); + eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); // Complete XYZ calibration. uint8_t point_too_far_mask = 0; BedSkewOffsetDetectionResultType result = find_bed_offset_and_skew(verbosity_level, point_too_far_mask); @@ -3736,7 +3737,7 @@ void process_commands() lang_reset(); } else if(code_seen("Lz")) { // PRUSA Lz - EEPROM_save_B(EEPROM_BABYSTEP_Z,0); + eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); } else if(code_seen("Beat")) { // PRUSA Beat // Kick farm link timer @@ -5507,7 +5508,7 @@ if(eSoundMode!=e_SOUND_MODE_SILENT) // Reset the baby step value and the baby step applied flag. calibration_status_store(CALIBRATION_STATUS_ASSEMBLED); - eeprom_update_word((uint16_t*)EEPROM_BABYSTEP_Z, 0); + eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)),0); // Reset the skew and offset in both RAM and EEPROM. reset_bed_offset_and_skew(); diff --git a/Firmware/eeprom.cpp b/Firmware/eeprom.cpp index b33b2c3ca..93098e93b 100644 --- a/Firmware/eeprom.cpp +++ b/Firmware/eeprom.cpp @@ -62,7 +62,7 @@ void eeprom_init() if (eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) == 0xffff) eeprom_update_word((uint16_t *)EEPROM_MMU_LOAD_FAIL_TOT, 0); if (eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) == 0xff) eeprom_update_byte((uint8_t *)EEPROM_MMU_FAIL, 0); if (eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) == 0xff) eeprom_update_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL, 0); - if (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == 0xff) + if (eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)) == EEPROM_EMPTY_VALUE) { eeprom_update_byte(&(EEPROM_Sheets_base->active_sheet), 0); // When upgrading from version older version (before multiple sheets were implemented in v3.8.0) diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h index 482ddf932..197c18c25 100644 --- a/Firmware/eeprom.h +++ b/Firmware/eeprom.h @@ -3,9 +3,12 @@ #include +#define MAX_SHEETS 8 +#define MAX_SHEET_NAME_LENGTH 7 + typedef struct { - char name[7]; //!< Can be null terminated, doesn't need to be null terminated + char name[MAX_SHEET_NAME_LENGTH]; //!< Can be null terminated, doesn't need to be null terminated int16_t z_offset; //!< Z_BABYSTEP_MIN .. Z_BABYSTEP_MAX = Z_BABYSTEP_MIN*2/1000 [mm] .. Z_BABYSTEP_MAX*2/1000 [mm] uint8_t bed_temp; //!< 0 .. 254 [°C] uint8_t pinda_temp; //!< 0 .. 254 [°C] @@ -13,7 +16,7 @@ typedef struct typedef struct { - Sheet s[8]; + Sheet s[MAX_SHEETS]; uint8_t active_sheet; } Sheets; // sizeof(Sheets). Do not change it unless EEPROM_Sheets_base is last item in EEPROM. @@ -25,6 +28,7 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP #endif #define EEPROM_EMPTY_VALUE 0xFF +#define EEPROM_EMPTY_VALUE16 0xFFFF // The total size of the EEPROM is // 4096 for the Atmega2560 #define EEPROM_TOP 4096 diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 77af6d5f4..6bd834fb7 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3211,15 +3211,10 @@ static void lcd_babystep_z() if (LCD_CLICKED || menu_leaving) { // Only update the EEPROM when leaving the menu. - eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base-> - s[(eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)))].z_offset)), - _md->babystepMemZ); - eeprom_update_byte(&(EEPROM_Sheets_base->s[(eeprom_read_byte( - &(EEPROM_Sheets_base->active_sheet)))].bed_temp), - target_temperature_bed); - eeprom_update_byte(&(EEPROM_Sheets_base->s[(eeprom_read_byte( - &(EEPROM_Sheets_base->active_sheet)))].pinda_temp), - current_temperature_pinda); + uint8_t active_sheet=eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet)); + eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[active_sheet].z_offset)),_md->babystepMemZ); + eeprom_update_byte(&(EEPROM_Sheets_base->s[active_sheet].bed_temp),target_temperature_bed); + eeprom_update_byte(&(EEPROM_Sheets_base->s[active_sheet].pinda_temp),current_temperature_pinda); calibration_status_store(CALIBRATION_STATUS_CALIBRATED); } if (LCD_CLICKED) menu_back(); @@ -6649,7 +6644,7 @@ static void lcd_reset_sheet() { SheetName sheetName; eeprom_default_sheet_name(selected_sheet, sheetName); - eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[selected_sheet].z_offset)),0xffff); + eeprom_update_word(reinterpret_cast(&(EEPROM_Sheets_base->s[selected_sheet].z_offset)),EEPROM_EMPTY_VALUE16); eeprom_update_block(sheetName.c,EEPROM_Sheets_base->s[selected_sheet].name,sizeof(Sheet::name)); if (selected_sheet == eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet))) {