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
This commit is contained in:
Guðni Már Gilbert 2023-07-01 10:12:43 +00:00 committed by DRracer
parent b65c500f25
commit a2ac513794
3 changed files with 28 additions and 16 deletions

View File

@ -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;

View File

@ -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();

View File

@ -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