From 117fc872a77ccce5bd7f389359ddfa60d70f7638 Mon Sep 17 00:00:00 2001
From: Scott Lahteine <github@thinkyhead.com>
Date: Sun, 10 Dec 2017 21:29:10 -0600
Subject: [PATCH] Update current position in M852

---
 Marlin/src/gcode/calibrate/M852.cpp | 47 ++++++++++++++++++++---------
 1 file changed, 32 insertions(+), 15 deletions(-)

diff --git a/Marlin/src/gcode/calibrate/M852.cpp b/Marlin/src/gcode/calibrate/M852.cpp
index 66d950a2b6..97af08a009 100644
--- a/Marlin/src/gcode/calibrate/M852.cpp
+++ b/Marlin/src/gcode/calibrate/M852.cpp
@@ -36,37 +36,47 @@
  *  K[yz_factor] - New YZ skew factor
  */
 void GcodeSuite::M852() {
-  const bool ijk = parser.seen('I') || parser.seen('S')
-    #if ENABLED(SKEW_CORRECTION_FOR_Z)
-      || parser.seen('J') || parser.seen('K')
-    #endif
-  ;
-  bool badval = false;
+  uint8_t ijk = 0, badval = 0, setval = 0;
 
   if (parser.seen('I') || parser.seen('S')) {
+    ++ijk;
     const float value = parser.value_linear_units();
-    if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX))
-      planner.xy_skew_factor = value;
+    if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) {
+      if (planner.xy_skew_factor != value) {
+        planner.xy_skew_factor = value;
+        ++setval;
+      }
+    }
     else
-      badval = true;
+      ++badval;
   }
 
   #if ENABLED(SKEW_CORRECTION_FOR_Z)
 
     if (parser.seen('J')) {
+      ++ijk;
       const float value = parser.value_linear_units();
-      if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX))
-        planner.xz_skew_factor = value;
+      if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) {
+        if (planner.xz_skew_factor != value) {
+          planner.xz_skew_factor = value;
+          ++setval;
+        }
+      }
       else
-        badval = true;
+        ++badval;
     }
 
     if (parser.seen('K')) {
+      ++ijk;
       const float value = parser.value_linear_units();
-      if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX))
-        planner.yz_skew_factor = value;
+      if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) {
+        if (planner.yz_skew_factor != value) {
+          planner.yz_skew_factor = value;
+          ++setval;
+        }
+      }
       else
-        badval = true;
+        ++badval;
     }
 
   #endif
@@ -74,6 +84,13 @@ void GcodeSuite::M852() {
   if (badval)
     SERIAL_ECHOLNPGM(MSG_SKEW_MIN " " STRINGIFY(SKEW_FACTOR_MIN) " " MSG_SKEW_MAX " " STRINGIFY(SKEW_FACTOR_MAX));
 
+  // When skew is changed the current position changes
+  if (setval) {
+    set_current_from_steppers_for_axis(ALL_AXES);
+    SYNC_PLAN_POSITION_KINEMATIC();
+    report_current_position();
+  }
+
   if (!ijk) {
     SERIAL_ECHO_START();
     SERIAL_ECHOPAIR(MSG_SKEW_FACTOR " XY: ", planner.xy_skew_factor);