From bd78ca0ee3c362add556c9cb4ff3b5256c61d019 Mon Sep 17 00:00:00 2001
From: Scott Lahteine <github@thinkyhead.com>
Date: Wed, 25 Oct 2017 15:49:34 -0500
Subject: [PATCH] Add M290 Babystepping

---
 Marlin/src/gcode/gcode.cpp       |  4 +++
 Marlin/src/gcode/gcode.h         |  5 +++
 Marlin/src/gcode/motion/M290.cpp | 61 ++++++++++++++++++++++++++++++++
 Marlin/src/inc/SanityCheck.h     |  4 +--
 4 files changed, 71 insertions(+), 3 deletions(-)
 create mode 100644 Marlin/src/gcode/motion/M290.cpp

diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp
index 5c0502772a..0e79f56fef 100644
--- a/Marlin/src/gcode/gcode.cpp
+++ b/Marlin/src/gcode/gcode.cpp
@@ -525,6 +525,10 @@ void GcodeSuite::process_next_command() {
         case 280: M280(); break;  // M280: Set servo position absolute
       #endif
 
+      #if ENABLED(BABYSTEPPING)
+        case 290: M290(); break;  // M290: Babystepping
+      #endif
+
       #if HAS_BUZZER
         case 300: M300(); break;  // M300: Play beep tone
       #endif
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index 61415b0761..90d4c7f6ef 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -169,6 +169,7 @@
  * M260 - i2c Send Data (Requires EXPERIMENTAL_I2CBUS)
  * M261 - i2c Request Data (Requires EXPERIMENTAL_I2CBUS)
  * M280 - Set servo position absolute: "M280 P<index> S<angle|µs>". (Requires servos)
+ * M290 - Babystepping (Requires BABYSTEPPING)
  * M300 - Play beep sound S<frequency Hz> P<duration ms>
  * M301 - Set PID parameters P I and D. (Requires PIDTEMP)
  * M302 - Allow cold extrudes, or set the minimum extrude S<temperature>. (Requires PREVENT_COLD_EXTRUSION)
@@ -585,6 +586,10 @@ private:
     static void M280();
   #endif
 
+  #if ENABLED(BABYSTEPPING)
+    static void M290();
+  #endif
+
   #if HAS_BUZZER
     static void M300();
   #endif
diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp
new file mode 100644
index 0000000000..45817f59f5
--- /dev/null
+++ b/Marlin/src/gcode/motion/M290.cpp
@@ -0,0 +1,61 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "../../inc/MarlinConfig.h"
+
+#if ENABLED(BABYSTEPPING)
+
+#include "../gcode.h"
+#include "../../module/probe.h"
+#include "../../module/temperature.h"
+#include "../../module/planner.h"
+
+/**
+ * M290: Babystepping
+ */
+void GcodeSuite::M290() {
+  #if ENABLED(BABYSTEP_XY)
+    for (uint8_t a = X_AXIS; a <= Z_AXIS; a++)
+      if (parser.seenval(axis_codes[a]) || (a == Z_AXIS && parser.seenval('S'))) {
+        float offs = constrain(parser.value_axis_units(a), -2, 2);
+        #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+          if (a == Z_AXIS) {
+            zprobe_zoffset += offs;
+            refresh_zprobe_zoffset(true); // 'true' to not babystep
+          }
+        #endif
+        thermalManager.babystep_axis(a, offs * planner.axis_steps_per_mm[a]);
+      }
+  #else
+    if (parser.seenval('Z') || parser.seenval('S')) {
+      float offs = constrain(parser.value_axis_units(Z_AXIS), -2, 2);
+      #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+        zprobe_zoffset += offs;
+        refresh_zprobe_zoffset(); // This will babystep the axis
+      #else
+        thermalManager.babystep_axis(Z_AXIS, offs * planner.axis_steps_per_mm[Z_AXIS]);
+      #endif
+    }
+  #endif
+}
+
+#endif // BABYSTEPPING
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index d83e8d3b61..0da0f42684 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -353,9 +353,7 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
  * Babystepping
  */
 #if ENABLED(BABYSTEPPING)
-  #if DISABLED(ULTRA_LCD) && DISABLED(I2C_POSITION_ENCODERS)
-    #error "BABYSTEPPING requires an LCD controller."
-  #elif ENABLED(SCARA)
+  #if ENABLED(SCARA)
     #error "BABYSTEPPING is not implemented for SCARA yet."
   #elif ENABLED(DELTA) && ENABLED(BABYSTEP_XY)
     #error "BABYSTEPPING only implemented for Z axis on deltabots."
-- 
GitLab