From eeabe66fc49501222fc458f5c298893e4d88ee17 Mon Sep 17 00:00:00 2001
From: Scott Lahteine <github@thinkyhead.com>
Date: Tue, 5 May 2020 00:28:39 -0500
Subject: [PATCH] Some distinct E helpers

---
 Marlin/src/inc/Conditionals_LCD.h               |  5 ++++-
 .../screens/max_acceleration_screen.cpp         | 14 +++++++-------
 .../screens/max_velocity_screen.cpp             |  8 +++++---
 Marlin/src/module/planner.cpp                   | 17 +++++------------
 Marlin/src/module/planner.h                     |  7 +++----
 Marlin/src/module/stepper/trinamic.cpp          |  2 +-
 6 files changed, 25 insertions(+), 28 deletions(-)

diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h
index e6c671f7139..3ea27be4209 100644
--- a/Marlin/src/inc/Conditionals_LCD.h
+++ b/Marlin/src/inc/Conditionals_LCD.h
@@ -408,7 +408,6 @@
 #if EXTRUDERS == 0
   #undef EXTRUDERS
   #define EXTRUDERS 0
-  #undef DISTINCT_E_FACTORS
   #undef SINGLENOZZLE
   #undef SWITCHING_EXTRUDER
   #undef SWITCHING_NOZZLE
@@ -513,12 +512,16 @@
  * DISTINCT_E_FACTORS affects how some E factors are accessed
  */
 #if ENABLED(DISTINCT_E_FACTORS) && E_STEPPERS > 1
+  #define DISTINCT_E E_STEPPERS
   #define XYZE_N (XYZ + E_STEPPERS)
+  #define E_INDEX_N(E) (E)
   #define E_AXIS_N(E) AxisEnum(E_AXIS + E)
   #define UNUSED_E(E) NOOP
 #else
   #undef DISTINCT_E_FACTORS
+  #define DISTINCT_E 1
   #define XYZE_N XYZE
+  #define E_INDEX_N(E) 0
   #define E_AXIS_N(E) E_AXIS
   #define UNUSED_E(E) UNUSED(E)
 #endif
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp
index 8f7af4b81ed..305fd0fc35b 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_acceleration_screen.cpp
@@ -38,16 +38,16 @@ void MaxAccelerationScreen::onRedraw(draw_mode_t what) {
   w.color(x_axis)  .adjuster( 2, GET_TEXT_F(MSG_AMAX_X),  getAxisMaxAcceleration_mm_s2(X) );
   w.color(y_axis)  .adjuster( 4, GET_TEXT_F(MSG_AMAX_Y),  getAxisMaxAcceleration_mm_s2(Y) );
   w.color(z_axis)  .adjuster( 6, GET_TEXT_F(MSG_AMAX_Z),  getAxisMaxAcceleration_mm_s2(Z) );
-  #if EXTRUDERS == 1 || DISABLED(DISTINCT_E_FACTORS)
+  #if DISTINCT_E == 1
     w.color(e_axis).adjuster( 8, GET_TEXT_F(MSG_AMAX_E), getAxisMaxAcceleration_mm_s2(E0) );
-  #elif EXTRUDERS > 1
+  #elif DISTINCT_E > 1
     w.heading(GET_TEXT_F(MSG_AMAX_E));
     w.color(e_axis).adjuster( 8, F(LCD_STR_E0), getAxisMaxAcceleration_mm_s2(E0) );
     w.color(e_axis).adjuster(10, F(LCD_STR_E1), getAxisMaxAcceleration_mm_s2(E1) );
-    #if EXTRUDERS > 2
+    #if DISTINCT_E > 2
     w.color(e_axis).adjuster(12, F(LCD_STR_E2), getAxisMaxAcceleration_mm_s2(E2) );
     #endif
-    #if EXTRUDERS > 3
+    #if DISTINCT_E > 3
     w.color(e_axis).adjuster(14, F(LCD_STR_E3), getAxisMaxAcceleration_mm_s2(E3) );
     #endif
   #endif
@@ -65,15 +65,15 @@ bool MaxAccelerationScreen::onTouchHeld(uint8_t tag) {
     case  7: UI_INCREMENT(AxisMaxAcceleration_mm_s2, Z ); break;
     case  8: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E0); break;
     case  9: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E0); break;
-    #if EXTRUDERS > 1 && ENABLED(DISTINCT_E_FACTORS)
+    #if DISTINCT_E > 1
     case 10: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E1); break;
     case 11: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E1); break;
     #endif
-    #if EXTRUDERS > 2 && ENABLED(DISTINCT_E_FACTORS)
+    #if DISTINCT_E > 2
     case 12: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E2); break;
     case 13: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E2); break;
     #endif
-    #if EXTRUDERS > 3 && ENABLED(DISTINCT_E_FACTORS)
+    #if DISTINCT_E > 3
     case 14: UI_DECREMENT(AxisMaxAcceleration_mm_s2, E3); break;
     case 15: UI_INCREMENT(AxisMaxAcceleration_mm_s2, E3); break;
     #endif
diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp
index 864f6b735d1..ebe01712463 100644
--- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp
+++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/max_velocity_screen.cpp
@@ -64,17 +64,19 @@ bool MaxVelocityScreen::onTouchHeld(uint8_t tag) {
     case  5: UI_INCREMENT(AxisMaxFeedrate_mm_s, Y); break;
     case  6: UI_DECREMENT(AxisMaxFeedrate_mm_s, Z); break;
     case  7: UI_INCREMENT(AxisMaxFeedrate_mm_s, Z); break;
+    #if DISTINCT_E > 0
     case  8: UI_DECREMENT(AxisMaxFeedrate_mm_s, E0); break;
     case  9: UI_INCREMENT(AxisMaxFeedrate_mm_s, E0); break;
-    #if EXTRUDERS > 1 && ENABLED(DISTINCT_E_FACTORS)
+    #endif
+    #if DISTINCT_E > 1
     case 10: UI_DECREMENT(AxisMaxFeedrate_mm_s, E1); break;
     case 11: UI_INCREMENT(AxisMaxFeedrate_mm_s, E1); break;
     #endif
-    #if EXTRUDERS > 2 && ENABLED(DISTINCT_E_FACTORS)
+    #if DISTINCT_E > 2
     case 12: UI_DECREMENT(AxisMaxFeedrate_mm_s, E2); break;
     case 13: UI_INCREMENT(AxisMaxFeedrate_mm_s, E2); break;
     #endif
-    #if EXTRUDERS > 3 && ENABLED(DISTINCT_E_FACTORS)
+    #if DISTINCT_E > 3
     case 14: UI_DECREMENT(AxisMaxFeedrate_mm_s, E3); break;
     case 15: UI_INCREMENT(AxisMaxFeedrate_mm_s, E3); break;
     #endif
diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp
index 2d68022c106..aec1e48402b 100644
--- a/Marlin/src/module/planner.cpp
+++ b/Marlin/src/module/planner.cpp
@@ -134,9 +134,8 @@ float Planner::steps_to_mm[XYZE_N];             // (mm) Millimeters per step
 
 #if HAS_JUNCTION_DEVIATION
   float Planner::junction_deviation_mm;         // (mm) M205 J
-  #if ENABLED(LIN_ADVANCE)
-    float Planner::max_e_jerk                   // Calculated from junction_deviation_mm
-      [TERN(DISTINCT_E_FACTORS, EXTRUDERS, 1)];
+  #if HAS_LINEAR_E_JERK
+    float Planner::max_e_jerk[DISTINCT_E];      // Calculated from junction_deviation_mm
   #endif
 #endif
 
@@ -2139,7 +2138,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
 
     #if ENABLED(LIN_ADVANCE)
 
-      #define MAX_E_JERK(N) TERN(HAS_JUNCTION_DEVIATION, max_e_jerk[E_AXIS_N(N)], max_jerk.e)
+      #define MAX_E_JERK(N) TERN(HAS_LINEAR_E_JERK, max_e_jerk[E_INDEX_N(N)], max_jerk.e)
 
       /**
        *
@@ -2179,24 +2178,18 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
       }
     #endif
 
-    #if ENABLED(DISTINCT_E_FACTORS)
-      #define ACCEL_IDX extruder
-    #else
-      #define ACCEL_IDX 0
-    #endif
-
     // Limit acceleration per axis
     if (block->step_event_count <= cutoff_long) {
       LIMIT_ACCEL_LONG(A_AXIS, 0);
       LIMIT_ACCEL_LONG(B_AXIS, 0);
       LIMIT_ACCEL_LONG(C_AXIS, 0);
-      LIMIT_ACCEL_LONG(E_AXIS, ACCEL_IDX);
+      LIMIT_ACCEL_LONG(E_AXIS, E_INDEX_N(extruder));
     }
     else {
       LIMIT_ACCEL_FLOAT(A_AXIS, 0);
       LIMIT_ACCEL_FLOAT(B_AXIS, 0);
       LIMIT_ACCEL_FLOAT(C_AXIS, 0);
-      LIMIT_ACCEL_FLOAT(E_AXIS, ACCEL_IDX);
+      LIMIT_ACCEL_FLOAT(E_AXIS, E_INDEX_N(extruder));
     }
   }
   block->acceleration_steps_per_s2 = accel;
diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h
index 8c1810c3a82..9e5088f55a4 100644
--- a/Marlin/src/module/planner.h
+++ b/Marlin/src/module/planner.h
@@ -315,9 +315,8 @@ class Planner {
 
     #if HAS_JUNCTION_DEVIATION
       static float junction_deviation_mm;       // (mm) M205 J
-      #if ENABLED(LIN_ADVANCE)
-        static float max_e_jerk                 // Calculated from junction_deviation_mm
-          [TERN(DISTINCT_E_FACTORS, EXTRUDERS, 1)];
+      #if HAS_LINEAR_E_JERK
+        static float max_e_jerk[DISTINCT_E];    // Calculated from junction_deviation_mm
       #endif
     #endif
 
@@ -842,7 +841,7 @@ class Planner {
       FORCE_INLINE static void recalculate_max_e_jerk() {
         const float prop = junction_deviation_mm * SQRT(0.5) / (1.0f - SQRT(0.5));
         LOOP_L_N(i, EXTRUDERS)
-          max_e_jerk[E_AXIS_N(i)] = SQRT(prop * settings.max_acceleration_mm_per_s2[E_AXIS_N(i)]);
+          max_e_jerk[E_INDEX_N(i)] = SQRT(prop * settings.max_acceleration_mm_per_s2[E_INDEX_N(i)]);
       }
     #endif
 
diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp
index 48a4ff85e9c..e2bf706bf13 100644
--- a/Marlin/src/module/stepper/trinamic.cpp
+++ b/Marlin/src/module/stepper/trinamic.cpp
@@ -58,7 +58,7 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 #define _TMC_UART_DEFINE(SWHW, IC, ST, AI) TMC_UART_##SWHW##_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
 #define TMC_UART_DEFINE(SWHW, ST, AI) _TMC_UART_DEFINE(SWHW, ST##_DRIVER_TYPE, ST, AI##_AXIS)
 
-#if ENABLED(DISTINCT_E_FACTORS) && E_STEPPERS > 1
+#if DISTINCT_E > 1
   #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E##AI)
   #define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E##AI)
 #else