From ab3497161a37ae309e030a23e0f8e3f3eb61daea Mon Sep 17 00:00:00 2001
From: ThomasToka <117008525+ThomasToka@users.noreply.github.com>
Date: Fri, 12 Jan 2024 06:56:45 +0100
Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20PLR=20pos/sdpos=20(#26365)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
---
 Marlin/src/feature/powerloss.cpp                       | 10 ++++++----
 Marlin/src/gcode/feature/powerloss/M1000.cpp           |  1 +
 Marlin/src/gcode/queue.cpp                             |  4 ++++
 Marlin/src/gcode/queue.h                               |  4 ++--
 Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp |  8 ++++----
 5 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp
index ce34b3a95ce..7c90bb684a0 100644
--- a/Marlin/src/feature/powerloss.cpp
+++ b/Marlin/src/feature/powerloss.cpp
@@ -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);
diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp
index 033bcf4ebbd..c735b72cedb 100644
--- a/Marlin/src/gcode/feature/powerloss/M1000.cpp
+++ b/Marlin/src/gcode/feature/powerloss/M1000.cpp
@@ -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() {
diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp
index db06af82f06..6b34a3b46b0 100644
--- a/Marlin/src/gcode/queue.cpp
+++ b/Marlin/src/gcode/queue.cpp
@@ -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*/)
 ) {
diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h
index 91cad1f08d9..7281a48bb70 100644
--- a/Marlin/src/gcode/queue.h
+++ b/Marlin/src/gcode/queue.h
@@ -80,11 +80,11 @@ public:
     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();
diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp
index 2d6c2aa96e6..490e427b855 100644
--- a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp
+++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp
@@ -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