From a2ac513794f2417f366f40e92c5a973e581216ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gu=C3=B0ni=20M=C3=A1r=20Gilbert?= Date: Sat, 1 Jul 2023 10:12:43 +0000 Subject: [PATCH] power panic: re-use target temps from RAM If a print has been saved to RAM such as during a filament runout, do not overwrite these saved values if a sudden power panic appears. Additionally, change the saved types to be the same as power panic when saving to RAM: - Bed target temperature is uint8_t (0 to 255) instead of float - Extruder target temperature is uint16_t instead of float Doing this change allows us to re-use the same global variables and avoid creating local variables during power panic. Change in memory: Flash: -246 bytes SRAM: -5 bytes --- Firmware/Marlin.h | 4 ++-- Firmware/Marlin_main.cpp | 16 ++++++++-------- Firmware/power_panic.cpp | 24 ++++++++++++++++++------ 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index ccab29276..412e41946 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -303,8 +303,8 @@ extern uint8_t saved_printing_type; #define PRINTING_TYPE_USB 1 #define PRINTING_TYPE_NONE 2 -extern float saved_extruder_temperature; //!< Active extruder temperature -extern float saved_bed_temperature; //!< Bed temperature +extern uint16_t saved_extruder_temperature; //!< Active extruder temperature +extern uint8_t saved_bed_temperature; //!< Bed temperature extern uint8_t saved_fan_speed; //!< Print fan speed, ranges from 0 to 255 extern uint16_t saved_feedrate2; diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index eedeac579..c3ccfc9ee 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -314,8 +314,8 @@ uint8_t saved_printing_type = PRINTING_TYPE_SD; static float saved_pos[4] = { X_COORD_INVALID, 0, 0, 0 }; uint16_t saved_feedrate2 = 0; //!< Default feedrate (truncated from float) static int saved_feedmultiply2 = 0; -float saved_extruder_temperature = 0.0; //!< Active extruder temperature -float saved_bed_temperature = 0.0; +uint16_t saved_extruder_temperature; //!< Active extruder temperature +uint8_t saved_bed_temperature; //!< Bed temperature static bool saved_extruder_relative_mode = false; uint8_t saved_fan_speed = 0; //!< Print fan speed //! @} @@ -9484,8 +9484,8 @@ void ThermalStop(bool allow_recovery) // disable heaters and save the original temperatures to saved_*, which will get // overwritten by stop_and_save_print_to_ram. For this corner-case, re-instate the // original values after the pause handler is called. - float bed_temp = saved_bed_temperature; - float ext_temp = saved_extruder_temperature; + uint8_t bed_temp = saved_bed_temperature; + uint16_t ext_temp = saved_extruder_temperature; uint8_t fan_speed = saved_fan_speed; lcd_pause_print(); saved_bed_temperature = bed_temp; @@ -10504,8 +10504,8 @@ void stop_and_save_print_to_ram(float z_move, float e_move) if (pos_invalid) saved_pos[X_AXIS] = X_COORD_INVALID; saved_feedmultiply2 = feedmultiply; //save feedmultiply - saved_extruder_temperature = degTargetHotend(active_extruder); - saved_bed_temperature = degTargetBed(); + saved_extruder_temperature = (uint16_t)degTargetHotend(active_extruder); + saved_bed_temperature = (uint8_t)degTargetBed(); saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK; saved_fan_speed = fanSpeed; cmdqueue_reset(); //empty cmdqueue @@ -10549,7 +10549,7 @@ void stop_and_save_print_to_ram(float z_move, float e_move) } void restore_extruder_temperature_from_ram() { - if (degTargetHotend(active_extruder) != saved_extruder_temperature) + if ((uint16_t)degTargetHotend(active_extruder) != saved_extruder_temperature) { setTargetHotend(saved_extruder_temperature); heating_status = HeatingStatus::EXTRUDER_HEATING; @@ -10581,7 +10581,7 @@ void restore_print_from_ram_and_continue(float e_move) fanSpeed = 0; // restore bed temperature (bed can be disabled during a thermal warning) - if (degBed() != saved_bed_temperature) + if ((uint8_t)degBed() != saved_bed_temperature) setTargetBed(saved_bed_temperature); restore_extruder_temperature_from_ram(); diff --git a/Firmware/power_panic.cpp b/Firmware/power_panic.cpp index 1a0552d16..4bcc6f416 100644 --- a/Firmware/power_panic.cpp +++ b/Firmware/power_panic.cpp @@ -36,7 +36,12 @@ static void uvlo_drain_reset() { void uvlo_() { unsigned long time_start = _millis(); - bool sd_print = card.sdprinting; + + // True if a print is already saved to RAM + bool sd_print_saved_in_ram = saved_printing && (saved_printing_type == PRINTING_TYPE_SD); + + // Flag to decide whether or not to set EEPROM_UVLO bit + bool sd_print = card.sdprinting || sd_print_saved_in_ram; const bool pos_invalid = mesh_bed_leveling_flag || homing_flag; // Conserve as much power as soon as possible @@ -60,8 +65,12 @@ void uvlo_() { #endif //TMC2130 // Stop all heaters - uint8_t saved_target_temperature_bed = target_temperature_bed; - uint16_t saved_target_temperature_ext = target_temperature[active_extruder]; + if (!sd_print_saved_in_ram) + { + saved_bed_temperature = target_temperature_bed; + saved_extruder_temperature = target_temperature[active_extruder]; + } + setTargetHotend(0); setTargetBed(0); @@ -151,8 +160,8 @@ void uvlo_() { // Store the current feed rate, temperatures, fan speed and extruder multipliers (flow rates) eeprom_update_word((uint16_t*)EEPROM_UVLO_FEEDRATE, saved_feedrate2); eeprom_update_word((uint16_t*)EEPROM_UVLO_FEEDMULTIPLY, feedmultiply); - eeprom_update_word((uint16_t*)EEPROM_UVLO_TARGET_HOTEND, saved_target_temperature_ext); - eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_BED, saved_target_temperature_bed); + eeprom_update_word((uint16_t*)EEPROM_UVLO_TARGET_HOTEND, saved_extruder_temperature); + eeprom_update_byte((uint8_t*)EEPROM_UVLO_TARGET_BED, saved_bed_temperature); eeprom_update_byte((uint8_t*)EEPROM_UVLO_FAN_SPEED, fanSpeed); eeprom_update_float((float*)(EEPROM_EXTRUDER_MULTIPLIER_0), extruder_multiplier[0]); eeprom_update_word((uint16_t*)(EEPROM_EXTRUDEMULTIPLY), (uint16_t)extrudemultiply); @@ -173,7 +182,10 @@ void uvlo_() { eeprom_update_float((float*)(EEPROM_UVLO_LA_K), extruder_advance_K); #endif - // Finaly store the "power outage" flag. + // Finally store the "power outage" flag. + // Note: Recovering a print from EEPROM currently assumes the user + // is printing from an SD card, this is why this EEPROM byte is only set + // when SD card print is detected if(sd_print) eeprom_update_byte((uint8_t*)EEPROM_UVLO, 1); // Increment power failure counter