From 072636cc4ff0957424b59dea44c0d88e3eb0ea79 Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 17 Oct 2025 15:39:39 -0400 Subject: [PATCH] indirection clarity, missed break --- Marlin/src/module/stepper/indirection.h | 89 ++++++++++++++++++------- 1 file changed, 66 insertions(+), 23 deletions(-) diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 05adff7a4e..e0c5b0de2a 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -577,8 +577,14 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset * Extruder indirection for the single E axis */ #if HAS_SWITCHING_EXTRUDER // One stepper driver per two extruders, reversed on odd index + #if EXTRUDERS > 7 - #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else if (E < 6) { E2_STEP_WRITE(V); } else { E3_STEP_WRITE(V); } }while(0) + #define E_STEP_WRITE(E,V) do{ \ + if (E < 2) { E0_STEP_WRITE(V); } \ + else if (E < 4) { E1_STEP_WRITE(V); } \ + else if (E < 6) { E2_STEP_WRITE(V); } \ + else { E3_STEP_WRITE(V); } \ + }while(0) #define FWD_E_DIR(E) do{ switch (E) { \ case 0: E0_DIR_WRITE(HIGH); break; case 1: E0_DIR_WRITE(LOW ); break; \ case 2: E1_DIR_WRITE(HIGH); break; case 3: E1_DIR_WRITE(LOW ); break; \ @@ -592,7 +598,12 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset case 6: E3_DIR_WRITE(LOW ); break; case 7: E3_DIR_WRITE(HIGH); break; \ } }while(0) #elif EXTRUDERS > 6 - #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else if (E < 6) { E2_STEP_WRITE(V); } else { E3_STEP_WRITE(V); } }while(0) + #define E_STEP_WRITE(E,V) do{ \ + if (E < 2) { E0_STEP_WRITE(V); } \ + else if (E < 4) { E1_STEP_WRITE(V); } \ + else if (E < 6) { E2_STEP_WRITE(V); } \ + else { E3_STEP_WRITE(V); } \ + }while(0) #define FWD_E_DIR(E) do{ switch (E) { \ case 0: E0_DIR_WRITE(HIGH); break; case 1: E0_DIR_WRITE(LOW ); break; \ case 2: E1_DIR_WRITE(HIGH); break; case 3: E1_DIR_WRITE(LOW ); break; \ @@ -603,9 +614,14 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset case 0: E0_DIR_WRITE(LOW ); break; case 1: E0_DIR_WRITE(HIGH); break; \ case 2: E1_DIR_WRITE(LOW ); break; case 3: E1_DIR_WRITE(HIGH); break; \ case 4: E2_DIR_WRITE(LOW ); break; case 5: E2_DIR_WRITE(HIGH); break; \ - case 6: E3_DIR_WRITE(LOW ); } }while(0) + case 6: E3_DIR_WRITE(LOW ); \ + } }while(0) #elif EXTRUDERS > 5 - #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0) + #define E_STEP_WRITE(E,V) do{ \ + if (E < 2) { E0_STEP_WRITE(V); } \ + else if (E < 4) { E1_STEP_WRITE(V); } \ + else { E2_STEP_WRITE(V); } \ + }while(0) #define FWD_E_DIR(E) do{ switch (E) { \ case 0: E0_DIR_WRITE(HIGH); break; case 1: E0_DIR_WRITE(LOW ); break; \ case 2: E1_DIR_WRITE(HIGH); break; case 3: E1_DIR_WRITE(LOW ); break; \ @@ -617,7 +633,11 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset case 4: E2_DIR_WRITE(LOW ); break; case 5: E2_DIR_WRITE(HIGH); break; \ } }while(0) #elif EXTRUDERS > 4 - #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else if (E < 4) { E1_STEP_WRITE(V); } else { E2_STEP_WRITE(V); } }while(0) + #define E_STEP_WRITE(E,V) do{ \ + if (E < 2) { E0_STEP_WRITE(V); } \ + else if (E < 4) { E1_STEP_WRITE(V); } \ + else { E2_STEP_WRITE(V); } \ + }while(0) #define FWD_E_DIR(E) do{ switch (E) { \ case 0: E0_DIR_WRITE(HIGH); break; case 1: E0_DIR_WRITE(LOW ); break; \ case 2: E1_DIR_WRITE(HIGH); break; case 3: E1_DIR_WRITE(LOW ); break; \ @@ -629,7 +649,10 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset case 4: E2_DIR_WRITE(LOW ); break; \ } }while(0) #elif EXTRUDERS > 3 - #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define E_STEP_WRITE(E,V) do{ \ + if (E < 2) { E0_STEP_WRITE(V); } \ + else { E1_STEP_WRITE(V); } \ + }while(0) #define FWD_E_DIR(E) do{ switch (E) { \ case 0: E0_DIR_WRITE(HIGH); break; case 1: E0_DIR_WRITE(LOW ); break; \ case 2: E1_DIR_WRITE(HIGH); break; case 3: E1_DIR_WRITE(LOW ); break; \ @@ -639,7 +662,10 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset case 2: E1_DIR_WRITE(LOW ); break; case 3: E1_DIR_WRITE(HIGH); break; \ } }while(0) #elif EXTRUDERS > 2 - #define E_STEP_WRITE(E,V) do{ if (E < 2) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define E_STEP_WRITE(E,V) do{ \ + if (E < 2) { E0_STEP_WRITE(V); } \ + else { E1_STEP_WRITE(V); } \ + }while(0) #define FWD_E_DIR(E) do{ switch (E) { \ case 0: E0_DIR_WRITE(HIGH); break; case 1: E0_DIR_WRITE(LOW ); break; \ case 2: E1_DIR_WRITE(HIGH); break; \ @@ -673,8 +699,10 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #if E_STEPPERS > 7 #define _E_STEP_WRITE(E,V) do{ switch (E) { \ - case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ - case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; case 6: E6_STEP_WRITE(V); break; case 7: E7_STEP_WRITE(V); break; \ + case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; \ + case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ + case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; \ + case 6: E6_STEP_WRITE(V); break; case 7: E7_STEP_WRITE(V); break; \ } }while(0) #define _FWD_E_DIR(E) do{ switch (E) { \ case 0: E0_DIR_WRITE(HIGH); break; case 1: E1_DIR_WRITE(HIGH); break; \ @@ -692,8 +720,10 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #elif E_STEPPERS > 6 #define _E_STEP_WRITE(E,V) do{ switch (E) { \ - case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ - case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; case 6: E6_STEP_WRITE(V); break; \ + case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; \ + case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ + case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; \ + case 6: E6_STEP_WRITE(V); break; \ } }while(0) #define _FWD_E_DIR(E) do{ switch (E) { \ case 0: E0_DIR_WRITE(HIGH); break; case 1: E1_DIR_WRITE(HIGH); break; \ @@ -711,7 +741,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #elif E_STEPPERS > 5 #define _E_STEP_WRITE(E,V) do{ switch (E) { \ - case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ + case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; \ + case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ case 4: E4_STEP_WRITE(V); break; case 5: E5_STEP_WRITE(V); break; \ } }while(0) #define _FWD_E_DIR(E) do{ switch (E) { \ @@ -728,7 +759,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #elif E_STEPPERS > 4 #define _E_STEP_WRITE(E,V) do{ switch (E) { \ - case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ + case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; \ + case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ case 4: E4_STEP_WRITE(V); break; \ } }while(0) #define _FWD_E_DIR(E) do{ switch (E) { \ @@ -745,7 +777,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #elif E_STEPPERS > 3 #define _E_STEP_WRITE(E,V) do{ switch (E) { \ - case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ + case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; \ + case 2: E2_STEP_WRITE(V); break; case 3: E3_STEP_WRITE(V); break; \ } }while(0) #define _FWD_E_DIR(E) do{ switch (E) { \ case 0: E0_DIR_WRITE(HIGH); break; case 1: E1_DIR_WRITE(HIGH); break; \ @@ -758,15 +791,25 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #elif E_STEPPERS > 2 - #define _E_STEP_WRITE(E,V) do{ switch (E) { case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; case 2: E2_STEP_WRITE(V); } }while(0) - #define _FWD_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(HIGH); break; case 1: E1_DIR_WRITE(HIGH); break; case 2: E2_DIR_WRITE(HIGH); } }while(0) - #define _REV_E_DIR(E) do{ switch (E) { case 0: E0_DIR_WRITE(LOW ); break; case 1: E1_DIR_WRITE(LOW ); break; case 2: E2_DIR_WRITE(LOW ); } }while(0) + #define _E_STEP_WRITE(E,V) do{ switch (E) { \ + case 0: E0_STEP_WRITE(V); break; case 1: E1_STEP_WRITE(V); break; \ + case 2: E2_STEP_WRITE(V); break; \ + } }while(0) + #define _FWD_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(HIGH); break; case 1: E1_DIR_WRITE(HIGH); break; \ + case 2: E2_DIR_WRITE(HIGH); break; \ + } }while(0) + #define _REV_E_DIR(E) do{ switch (E) { \ + case 0: E0_DIR_WRITE(LOW ); break; case 1: E1_DIR_WRITE(LOW ); break; \ + case 2: E2_DIR_WRITE(LOW ); break; \ + } }while(0) #else - #define _E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) + #define _E_STEP_WRITE(E,V) do{ if (E == 0) { E0_STEP_WRITE(V); } else { E1_STEP_WRITE(V); } }while(0) #define _FWD_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE(HIGH); } else { E1_DIR_WRITE(HIGH); } }while(0) #define _REV_E_DIR(E) do{ if (E == 0) { E0_DIR_WRITE(LOW ); } else { E1_DIR_WRITE(LOW ); } }while(0) + #endif #if HAS_DUPLICATION_MODE @@ -781,19 +824,19 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define RDIR(N) DUPE(N,DIR,LOW ); #define E_STEP_WRITE(E,V) do{ if (extruder_duplication_enabled) { REPEAT2(E_STEPPERS, DUPE, STEP, V); } else _E_STEP_WRITE(E,V); }while(0) - #define FWD_E_DIR(E) do{ if (extruder_duplication_enabled) { REPEAT(E_STEPPERS, NDIR); } else _FWD_E_DIR(E); }while(0) - #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { REPEAT(E_STEPPERS, RDIR); } else _REV_E_DIR(E); }while(0) + #define FWD_E_DIR(E) do{ if (extruder_duplication_enabled) { REPEAT(E_STEPPERS, NDIR); } else _FWD_E_DIR(E); }while(0) + #define REV_E_DIR(E) do{ if (extruder_duplication_enabled) { REPEAT(E_STEPPERS, RDIR); } else _REV_E_DIR(E); }while(0) #else #define E_STEP_WRITE(E,V) _E_STEP_WRITE(E,V) - #define FWD_E_DIR(E) _FWD_E_DIR(E) - #define REV_E_DIR(E) _REV_E_DIR(E) + #define FWD_E_DIR(E) _FWD_E_DIR(E) + #define REV_E_DIR(E) _REV_E_DIR(E) #endif #elif ENABLED(E_DUAL_STEPPER_DRIVERS) - #define E_STEP_WRITE(E,V) do{ E0_STEP_WRITE(V); E1_STEP_WRITE(V); }while(0) + #define E_STEP_WRITE(E,V) do{ E0_STEP_WRITE(V); E1_STEP_WRITE(V); }while(0) #define FWD_E_DIR(E) do{ E0_DIR_WRITE(HIGH); E1_DIR_WRITE(INVERT_DIR(E1_VS_E0, HIGH)); }while(0) #define REV_E_DIR(E) do{ E0_DIR_WRITE(LOW ); E1_DIR_WRITE(INVERT_DIR(E1_VS_E0, LOW )); }while(0)