power panic: Re-use code to save feedrate, segment index, and start position

Saves ~80B of Flash
This commit is contained in:
Guðni Már Gilbert 2023-06-25 17:04:11 +00:00 committed by DRracer
parent 67403603ed
commit a45e432030
3 changed files with 24 additions and 31 deletions

View File

@ -306,6 +306,7 @@ extern uint8_t saved_printing_type;
extern float saved_extruder_temperature; //!< Active extruder temperature
extern float saved_bed_temperature; //!< Bed temperature
extern uint8_t saved_fan_speed; //!< Print fan speed, ranges from 0 to 255
extern uint16_t saved_feedrate2;
//estimated time to end of the print
extern uint8_t print_percent_done_normal;
@ -387,6 +388,7 @@ extern void print_mesh_bed_leveling_table();
void save_print_file_state();
void restore_print_file_state();
void save_planner_global_state();
extern void stop_and_save_print_to_ram(float z_move, float e_move);
void restore_extruder_temperature_from_ram();
extern void restore_print_from_ram_and_continue(float e_move);

View File

@ -312,7 +312,7 @@ bool saved_printing = false; //!< Print is paused and saved in RAM
uint32_t saved_sdpos = 0; //!< SD card position, or line number in case of USB printing
uint8_t saved_printing_type = PRINTING_TYPE_SD;
static float saved_pos[4] = { X_COORD_INVALID, 0, 0, 0 };
static uint16_t saved_feedrate2 = 0; //!< Default feedrate (truncated from float)
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;
@ -10464,6 +10464,21 @@ void restore_print_file_state() {
}
}
void save_planner_global_state() {
if (current_block && !(mesh_bed_leveling_flag || homing_flag))
{
memcpy(saved_start_position, current_block->gcode_start_position, sizeof(saved_start_position));
saved_feedrate2 = current_block->gcode_feedrate;
saved_segment_idx = current_block->segment_idx;
}
else
{
saved_start_position[0] = SAVED_START_POSITION_UNSET;
saved_feedrate2 = feedrate;
saved_segment_idx = 0;
}
}
//! @brief Immediately stop print moves
//!
//! Immediately stop print moves, save current extruder temperature and position to RAM.
@ -10479,21 +10494,9 @@ void stop_and_save_print_to_ram(float z_move, float e_move)
cli();
save_print_file_state();
// save the global state at planning time
bool pos_invalid = mesh_bed_leveling_flag || homing_flag;
if (current_block && !pos_invalid)
{
memcpy(saved_start_position, current_block->gcode_start_position, sizeof(saved_start_position));
saved_feedrate2 = current_block->gcode_feedrate;
saved_segment_idx = current_block->segment_idx;
// printf_P(PSTR("stop_and_save_print_to_ram: %f, %f, %f, %f, %u\n"), saved_start_position[0], saved_start_position[1], saved_start_position[2], saved_start_position[3], saved_segment_idx);
}
else
{
saved_start_position[0] = SAVED_START_POSITION_UNSET;
saved_feedrate2 = feedrate;
saved_segment_idx = 0;
}
// save the global state at planning time
const bool pos_invalid = mesh_bed_leveling_flag || homing_flag;
save_planner_global_state();
planner_abort_hard(); //abort printing

View File

@ -37,6 +37,7 @@ static void uvlo_drain_reset() {
void uvlo_() {
unsigned long time_start = _millis();
bool sd_print = card.sdprinting;
const bool pos_invalid = mesh_bed_leveling_flag || homing_flag;
// Conserve power as soon as possible.
#ifdef LCD_BL_PIN
backlightMode = BACKLIGHT_MODE_DIM;
@ -63,20 +64,7 @@ void uvlo_() {
save_print_file_state();
// save the global state at planning time
bool pos_invalid = mesh_bed_leveling_flag || homing_flag;
uint16_t feedrate_bckp;
if (current_block && !pos_invalid)
{
memcpy(saved_start_position, current_block->gcode_start_position, sizeof(saved_start_position));
feedrate_bckp = current_block->gcode_feedrate;
saved_segment_idx = current_block->segment_idx;
}
else
{
saved_start_position[0] = SAVED_START_POSITION_UNSET;
feedrate_bckp = feedrate;
saved_segment_idx = 0;
}
save_planner_global_state();
// From this point on and up to the print recovery, Z should not move during X/Y travels and
// should be controlled precisely. Reset the MBL status before planner_abort_hard in order to
@ -156,7 +144,7 @@ void uvlo_() {
}
// Store the current feed rate, temperatures, fan speed and extruder multipliers (flow rates)
eeprom_update_word((uint16_t*)EEPROM_UVLO_FEEDRATE, feedrate_bckp);
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);