Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Power Loss Recovery ISR overwrite Fix #26365

Merged
10 changes: 6 additions & 4 deletions Marlin/src/feature/powerloss.cpp
Original file line number Diff line number Diff line change
@@ -358,7 +358,9 @@ void PrintJobRecovery::write() {
* Resume the saved print job
*/
void PrintJobRecovery::resume() {
const uint32_t resume_sdpos = info.sdpos; // Get here before the stepper ISR overwrites it
// Get these fields before any moves because stepper.cpp overwrites them
const xyze_pos_t resume_pos = info.current_position;
const uint32_t resume_sdpos = info.sdpos;

// Apply the dry-run flag if enabled
if (info.flag.dryrun) marlin_debug_flags |= MARLIN_DEBUG_DRYRUN;
@@ -400,7 +402,7 @@ void PrintJobRecovery::resume() {
#endif

// Interpret the saved Z according to flags
const float z_print = info.current_position.z,
const float z_print = resume_pos.z,
z_raised = z_print + info.zraise;

//
@@ -540,7 +542,7 @@ void PrintJobRecovery::resume() {

// Move back over to the saved XY
PROCESS_SUBCOMMANDS_NOW(TS(
F("G1F3000X"), p_float_t(info.current_position.x, 3), 'Y', p_float_t(info.current_position.y, 3)
F("G1F3000X"), p_float_t(resume_pos.x, 3), 'Y', p_float_t(resume_pos.y, 3)
));

// Move back down to the saved Z for printing
@@ -550,7 +552,7 @@ void PrintJobRecovery::resume() {
PROCESS_SUBCOMMANDS_NOW(TS(F("G1F"), info.feedrate));

// Restore E position with G92.9
PROCESS_SUBCOMMANDS_NOW(TS(F("G92.9E"), p_float_t(info.current_position.e, 3)));
PROCESS_SUBCOMMANDS_NOW(TS(F("G92.9E"), p_float_t(resume_pos.e, 3)));

TERN_(GCODE_REPEAT_MARKERS, repeat = info.stored_repeat);
TERN_(HAS_HOME_OFFSET, home_offset = info.home_offset);
1 change: 1 addition & 0 deletions Marlin/src/gcode/feature/powerloss/M1000.cpp
Original file line number Diff line number Diff line change
@@ -65,6 +65,7 @@ inline void plr_error(FSTR_P const prefix) {
* M1000: Resume from power-loss (undocumented)
* - With 'S' go to the Resume/Cancel menu
* ...unless the bed temperature is already above a configured minimum temperature.
* - With 'C' execute a cancel selection
* - With no parameters, run recovery commands
*/
void GcodeSuite::M1000() {
4 changes: 4 additions & 0 deletions Marlin/src/gcode/queue.cpp
Original file line number Diff line number Diff line change
@@ -91,6 +91,10 @@ PGM_P GCodeQueue::injected_commands_P; // = nullptr
*/
char GCodeQueue::injected_commands[64]; // = { 0 }

/**
* Commit the accumulated G-code command to the ring buffer,
* also setting its origin info.
*/
void GCodeQueue::RingBuffer::commit_command(const bool skip_ok
OPTARG(HAS_MULTI_SERIAL, serial_index_t serial_ind/*=-1*/)
) {
4 changes: 2 additions & 2 deletions Marlin/src/gcode/queue.h
Original file line number Diff line number Diff line change
@@ -80,11 +80,11 @@ class GCodeQueue {
void advance_pos(uint8_t &p, const int inc) { if (++p >= BUFSIZE) p = 0; length += inc; }

void commit_command(const bool skip_ok
OPTARG(HAS_MULTI_SERIAL, serial_index_t serial_ind = serial_index_t())
OPTARG(HAS_MULTI_SERIAL, serial_index_t serial_ind=serial_index_t())
);

bool enqueue(const char *cmd, const bool skip_ok=true
OPTARG(HAS_MULTI_SERIAL, serial_index_t serial_ind = serial_index_t())
OPTARG(HAS_MULTI_SERIAL, serial_index_t serial_ind=serial_index_t())
);

void ok_to_send();
8 changes: 4 additions & 4 deletions Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp
Original file line number Diff line number Diff line change
@@ -342,10 +342,10 @@ void onSettingsLoaded(const bool success) {
// Called when power-loss state is detected
}
void onPowerLossResume() {
startprogress = 254;
show_status = true;
tpShowStatus = false;
no_reentry = false;
startprogress = 254;
show_status = true;
tpShowStatus = false;
no_reentry = false;
rts.sendData(ExchangePageBase + 76, ExchangepageAddr);
}
#endif