diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 7ecc248e8..ccab29276 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -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); diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 6e9e6cd70..eedeac579 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -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 diff --git a/Firmware/power_panic.cpp b/Firmware/power_panic.cpp index 33c48004b..6129906fd 100644 --- a/Firmware/power_panic.cpp +++ b/Firmware/power_panic.cpp @@ -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);