power panic: Add two functions

These functions should be able to be re-used during a power panic

- save_print_file_state
- restore_print_file_state

No functional change at the moment.
This commit is contained in:
Guðni Már Gilbert 2023-06-25 16:12:42 +00:00 committed by DRracer
parent 526a1dcc63
commit 2902fcaa71
1 changed files with 56 additions and 49 deletions

View File

@ -10335,43 +10335,31 @@ void serialecho_temperatures() {
SERIAL_PROTOCOLLN(); SERIAL_PROTOCOLLN();
} }
//! @brief Immediately stop print moves void save_print_file_state() {
//! uint8_t nlines;
//! Immediately stop print moves, save current extruder temperature and position to RAM. uint16_t sdlen_cmdqueue;
//! If printing from sd card, position in file is saved. uint16_t sdlen_planner;
//! If printing from USB, line number is saved.
//!
//! @param z_move
//! @param e_move
void stop_and_save_print_to_ram(float z_move, float e_move)
{
if (saved_printing) return;
unsigned char nlines;
uint16_t sdlen_planner;
uint16_t sdlen_cmdqueue;
if (card.sdprinting) {
cli(); saved_sdpos = sdpos_atomic; //atomic sd position of last command added in queue
if (card.sdprinting) { sdlen_planner = planner_calc_sd_length(); //length of sd commands in planner
saved_sdpos = sdpos_atomic; //atomic sd position of last command added in queue saved_sdpos -= sdlen_planner;
sdlen_planner = planner_calc_sd_length(); //length of sd commands in planner sdlen_cmdqueue = cmdqueue_calc_sd_length(); //length of sd commands in cmdqueue
saved_sdpos -= sdlen_planner; saved_sdpos -= sdlen_cmdqueue;
sdlen_cmdqueue = cmdqueue_calc_sd_length(); //length of sd commands in cmdqueue saved_printing_type = PRINTING_TYPE_SD;
saved_sdpos -= sdlen_cmdqueue; }
saved_printing_type = PRINTING_TYPE_SD; else if (usb_timer.running()) { //reuse saved_sdpos for storing line number
} saved_sdpos = gcode_LastN; //start with line number of command added recently to cmd queue
else if (usb_timer.running()) { //reuse saved_sdpos for storing line number //reuse planner_calc_sd_length function for getting number of lines of commands in planner:
saved_sdpos = gcode_LastN; //start with line number of command added recently to cmd queue nlines = planner_calc_sd_length(); //number of lines of commands in planner
//reuse planner_calc_sd_length function for getting number of lines of commands in planner: saved_sdpos -= nlines;
nlines = planner_calc_sd_length(); //number of lines of commands in planner saved_sdpos -= buflen; //number of blocks in cmd buffer
saved_sdpos -= nlines; saved_printing_type = PRINTING_TYPE_USB;
saved_sdpos -= buflen; //number of blocks in cmd buffer }
saved_printing_type = PRINTING_TYPE_USB; else {
} saved_printing_type = PRINTING_TYPE_NONE;
else { //not sd printing nor usb printing
saved_printing_type = PRINTING_TYPE_NONE; }
//not sd printing nor usb printing
}
#if 0 #if 0
SERIAL_ECHOPGM("SDPOS_ATOMIC="); MYSERIAL.println(sdpos_atomic, DEC); SERIAL_ECHOPGM("SDPOS_ATOMIC="); MYSERIAL.println(sdpos_atomic, DEC);
@ -10460,6 +10448,36 @@ void stop_and_save_print_to_ram(float z_move, float e_move)
} }
} }
#endif #endif
}
void restore_print_file_state() {
if (saved_printing_type == PRINTING_TYPE_SD) { //was sd printing
card.setIndex(saved_sdpos);
sdpos_atomic = saved_sdpos;
card.sdprinting = true;
} else if (saved_printing_type == PRINTING_TYPE_USB) { //was usb printing
gcode_LastN = saved_sdpos; //saved_sdpos was reused for storing line number when usb printing
serial_count = 0;
FlushSerialRequestResend();
} else {
//not sd printing nor usb printing
}
}
//! @brief Immediately stop print moves
//!
//! Immediately stop print moves, save current extruder temperature and position to RAM.
//! If printing from sd card, position in file is saved.
//! If printing from USB, line number is saved.
//!
//! @param z_move
//! @param e_move
void stop_and_save_print_to_ram(float z_move, float e_move)
{
if (saved_printing) return;
cli();
save_print_file_state();
// save the global state at planning time // save the global state at planning time
bool pos_invalid = mesh_bed_leveling_flag || homing_flag; bool pos_invalid = mesh_bed_leveling_flag || homing_flag;
@ -10599,19 +10617,8 @@ void restore_print_from_ram_and_continue(float e_move)
memcpy(current_position, saved_pos, sizeof(saved_pos)); memcpy(current_position, saved_pos, sizeof(saved_pos));
set_destination_to_current(); set_destination_to_current();
if (saved_printing_type == PRINTING_TYPE_SD) { //was sd printing
card.setIndex(saved_sdpos); restore_print_file_state();
sdpos_atomic = saved_sdpos;
card.sdprinting = true;
}
else if (saved_printing_type == PRINTING_TYPE_USB) { //was usb printing
gcode_LastN = saved_sdpos; //saved_sdpos was reused for storing line number when usb printing
serial_count = 0;
FlushSerialRequestResend();
}
else {
//not sd printing nor usb printing
}
lcd_setstatuspgm(MSG_WELCOME); lcd_setstatuspgm(MSG_WELCOME);
saved_printing_type = PRINTING_TYPE_NONE; saved_printing_type = PRINTING_TYPE_NONE;