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:
parent
b65c500f25
commit
a2ac513794
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue