Browse Source

🧑‍💻 MAP macro for axis lists, etc. (#24191)

Scott Lahteine 3 years ago
parent
commit
c5126de559
No account linked to committer's email address

+ 19
- 10
Marlin/src/core/macros.h View File

712
 #define RREPEAT2_S(S,N,OP,V...)  EVAL1024(_RREPEAT2(S,SUB##S(N),OP,V))
712
 #define RREPEAT2_S(S,N,OP,V...)  EVAL1024(_RREPEAT2(S,SUB##S(N),OP,V))
713
 #define RREPEAT2(N,OP,V...)      RREPEAT2_S(0,N,OP,V)
713
 #define RREPEAT2(N,OP,V...)      RREPEAT2_S(0,N,OP,V)
714
 
714
 
715
-// See https://github.com/swansontec/map-macro
716
-#define MAP_OUT
717
-#define MAP_END(...)
718
-#define MAP_GET_END() 0, MAP_END
719
-#define MAP_NEXT0(test, next, ...) next MAP_OUT
720
-#define MAP_NEXT1(test, next) MAP_NEXT0 (test, next, 0)
721
-#define MAP_NEXT(test, next)  MAP_NEXT1 (MAP_GET_END test, next)
722
-#define MAP0(f, x, peek, ...) f(x) MAP_NEXT (peek, MAP1) (f, peek, __VA_ARGS__)
723
-#define MAP1(f, x, peek, ...) f(x) MAP_NEXT (peek, MAP0) (f, peek, __VA_ARGS__)
724
-#define MAP(f, ...) EVAL512 (MAP1 (f, __VA_ARGS__, (), 0))
715
+// Call OP(A) with each item as an argument
716
+#define _MAP(_MAP_OP,A,V...)       \
717
+  _MAP_OP(A)                       \
718
+  IF_ELSE(HAS_ARGS(V))             \
719
+    ( DEFER2(__MAP)()(_MAP_OP,V) ) \
720
+    ( /* Do nothing */ )
721
+#define __MAP() _MAP
722
+
723
+#define MAP(OP,V...) EVAL(_MAP(OP,V))
724
+
725
+// Emit a list of OP(A) with the given items
726
+#define _MAPLIST(_MAP_OP,A,V...)         \
727
+  _MAP_OP(A)                             \
728
+  IF_ELSE(HAS_ARGS(V))                   \
729
+    ( , DEFER2(__MAPLIST)()(_MAP_OP,V) ) \
730
+    ( /* Do nothing */ )
731
+#define __MAPLIST() _MAPLIST
732
+
733
+#define MAPLIST(OP,V...) EVAL(_MAPLIST(OP,V))

+ 8
- 0
Marlin/src/core/types.h View File

39
 #define NUM_AXIS_GANG(V...) GANG_N(NUM_AXES, V)
39
 #define NUM_AXIS_GANG(V...) GANG_N(NUM_AXES, V)
40
 #define NUM_AXIS_CODE(V...) CODE_N(NUM_AXES, V)
40
 #define NUM_AXIS_CODE(V...) CODE_N(NUM_AXES, V)
41
 #define NUM_AXIS_LIST(V...) LIST_N(NUM_AXES, V)
41
 #define NUM_AXIS_LIST(V...) LIST_N(NUM_AXES, V)
42
+#define NUM_AXIS_LIST_1(V)  LIST_N_1(NUM_AXES, V)
42
 #define NUM_AXIS_ARRAY(V...) { NUM_AXIS_LIST(V) }
43
 #define NUM_AXIS_ARRAY(V...) { NUM_AXIS_LIST(V) }
44
+#define NUM_AXIS_ARRAY_1(V)  { NUM_AXIS_LIST_1(V) }
43
 #define NUM_AXIS_ARGS(T...) NUM_AXIS_LIST(T x, T y, T z, T i, T j, T k, T u, T v, T w)
45
 #define NUM_AXIS_ARGS(T...) NUM_AXIS_LIST(T x, T y, T z, T i, T j, T k, T u, T v, T w)
44
 #define NUM_AXIS_ELEM(O)    NUM_AXIS_LIST(O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w)
46
 #define NUM_AXIS_ELEM(O)    NUM_AXIS_LIST(O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w)
45
 #define NUM_AXIS_DEFS(T,V)  NUM_AXIS_LIST(T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V)
47
 #define NUM_AXIS_DEFS(T,V)  NUM_AXIS_LIST(T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V)
48
+#define MAIN_AXIS_NAMES     NUM_AXIS_LIST(X, Y, Z, I, J, K, U, V, W)
49
+#define MAIN_AXIS_MAP(F)    MAP(F, MAIN_AXIS_NAMES)
46
 
50
 
47
 #define LOGICAL_AXIS_GANG(E,V...) NUM_AXIS_GANG(V) GANG_ITEM_E(E)
51
 #define LOGICAL_AXIS_GANG(E,V...) NUM_AXIS_GANG(V) GANG_ITEM_E(E)
48
 #define LOGICAL_AXIS_CODE(E,V...) NUM_AXIS_CODE(V) CODE_ITEM_E(E)
52
 #define LOGICAL_AXIS_CODE(E,V...) NUM_AXIS_CODE(V) CODE_ITEM_E(E)
49
 #define LOGICAL_AXIS_LIST(E,V...) NUM_AXIS_LIST(V) LIST_ITEM_E(E)
53
 #define LOGICAL_AXIS_LIST(E,V...) NUM_AXIS_LIST(V) LIST_ITEM_E(E)
54
+#define LOGICAL_AXIS_LIST_1(V)    NUM_AXIS_LIST_1(V) LIST_ITEM_E(V)
50
 #define LOGICAL_AXIS_ARRAY(E,V...) { LOGICAL_AXIS_LIST(E,V) }
55
 #define LOGICAL_AXIS_ARRAY(E,V...) { LOGICAL_AXIS_LIST(E,V) }
56
+#define LOGICAL_AXIS_ARRAY_1(V)    { LOGICAL_AXIS_LIST_1(V) }
51
 #define LOGICAL_AXIS_ARGS(T...) LOGICAL_AXIS_LIST(T e, T x, T y, T z, T i, T j, T k, T u, T v, T w)
57
 #define LOGICAL_AXIS_ARGS(T...) LOGICAL_AXIS_LIST(T e, T x, T y, T z, T i, T j, T k, T u, T v, T w)
52
 #define LOGICAL_AXIS_ELEM(O)    LOGICAL_AXIS_LIST(O.e, O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w)
58
 #define LOGICAL_AXIS_ELEM(O)    LOGICAL_AXIS_LIST(O.e, O.x, O.y, O.z, O.i, O.j, O.k, O.u, O.v, O.w)
53
 #define LOGICAL_AXIS_DECL(T,V)  LOGICAL_AXIS_LIST(T e=V, T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V)
59
 #define LOGICAL_AXIS_DECL(T,V)  LOGICAL_AXIS_LIST(T e=V, T x=V, T y=V, T z=V, T i=V, T j=V, T k=V, T u=V, T v=V, T w=V)
60
+#define LOGICAL_AXIS_NAMES      LOGICAL_AXIS_LIST(E, X, Y, Z, I, J, K, U, V, W)
61
+#define LOGICAL_AXIS_MAP(F)     MAP(F, LOGICAL_AXIS_NAMES)
54
 
62
 
55
 #define LOGICAL_AXES_STRING LOGICAL_AXIS_GANG("E", "X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W)
63
 #define LOGICAL_AXES_STRING LOGICAL_AXIS_GANG("E", "X", "Y", "Z", STR_I, STR_J, STR_K, STR_U, STR_V, STR_W)
56
 
64
 

+ 0
- 2
Marlin/src/feature/spindle_laser.h View File

41
 #define PCT_TO_PWM(X) ((X) * 255 / 100)
41
 #define PCT_TO_PWM(X) ((X) * 255 / 100)
42
 #define PCT_TO_SERVO(X) ((X) * 180 / 100)
42
 #define PCT_TO_SERVO(X) ((X) * 180 / 100)
43
 
43
 
44
-// #define _MAP(N,S1,S2,D1,D2) ((N)*_MAX((D2)-(D1),0)/_MAX((S2)-(S1),1)+(D1))
45
-
46
 class SpindleLaser {
44
 class SpindleLaser {
47
 public:
45
 public:
48
   static const inline uint8_t pct_to_ocr(const_float_t pct) { return uint8_t(PCT_TO_PWM(pct)); }
46
   static const inline uint8_t pct_to_ocr(const_float_t pct) { return uint8_t(PCT_TO_PWM(pct)); }

+ 2
- 11
Marlin/src/gcode/calibrate/M425.cpp View File

47
   bool noArgs = true;
47
   bool noArgs = true;
48
 
48
 
49
   auto axis_can_calibrate = [](const uint8_t a) {
49
   auto axis_can_calibrate = [](const uint8_t a) {
50
+    #define _CAN_CASE(N) case N##_AXIS: return AXIS_CAN_CALIBRATE(N);
50
     switch (a) {
51
     switch (a) {
51
       default: return false;
52
       default: return false;
52
-      NUM_AXIS_CODE(
53
-        case X_AXIS: return AXIS_CAN_CALIBRATE(X),
54
-        case Y_AXIS: return AXIS_CAN_CALIBRATE(Y),
55
-        case Z_AXIS: return AXIS_CAN_CALIBRATE(Z),
56
-        case I_AXIS: return AXIS_CAN_CALIBRATE(I),
57
-        case J_AXIS: return AXIS_CAN_CALIBRATE(J),
58
-        case K_AXIS: return AXIS_CAN_CALIBRATE(K),
59
-        case U_AXIS: return AXIS_CAN_CALIBRATE(U),
60
-        case V_AXIS: return AXIS_CAN_CALIBRATE(V),
61
-        case W_AXIS: return AXIS_CAN_CALIBRATE(W)
62
-      );
53
+      MAIN_AXIS_MAP(_CAN_CASE)
63
     }
54
     }
64
   };
55
   };
65
 
56
 

+ 11
- 17
Marlin/src/lcd/menu/menu_advanced.cpp View File

68
     LOOP_LOGICAL_AXES(i) driverPercent[i] = stepper_dac.get_current_percent((AxisEnum)i);
68
     LOOP_LOGICAL_AXES(i) driverPercent[i] = stepper_dac.get_current_percent((AxisEnum)i);
69
     START_MENU();
69
     START_MENU();
70
     BACK_ITEM(MSG_ADVANCED_SETTINGS);
70
     BACK_ITEM(MSG_ADVANCED_SETTINGS);
71
-    #define EDIT_DAC_PERCENT(A) EDIT_ITEM(uint8, MSG_DAC_PERCENT_##A, &driverPercent[_AXIS(A)], 0, 100, []{ stepper_dac.set_current_percents(driverPercent); })
72
-    LOGICAL_AXIS_CODE(EDIT_DAC_PERCENT(E), EDIT_DAC_PERCENT(A), EDIT_DAC_PERCENT(B), EDIT_DAC_PERCENT(C), EDIT_DAC_PERCENT(I), EDIT_DAC_PERCENT(J), EDIT_DAC_PERCENT(K), EDIT_DAC_PERCENT(U), EDIT_DAC_PERCENT(V), EDIT_DAC_PERCENT(W));
71
+    #define EDIT_DAC_PERCENT(A) EDIT_ITEM(uint8, MSG_DAC_PERCENT_##A, &driverPercent[_AXIS(A)], 0, 100, []{ stepper_dac.set_current_percents(driverPercent); });
72
+    MAP(EDIT_DAC_PERCENT, LOGICAL_AXIS_LIST(E, A, B, C, I, J, K, U, V, W));
73
     ACTION_ITEM(MSG_DAC_EEPROM_WRITE, stepper_dac.commit_eeprom);
73
     ACTION_ITEM(MSG_DAC_EEPROM_WRITE, stepper_dac.commit_eeprom);
74
     END_MENU();
74
     END_MENU();
75
   }
75
   }
415
       #elif ENABLED(LIMITED_MAX_FR_EDITING)
415
       #elif ENABLED(LIMITED_MAX_FR_EDITING)
416
         DEFAULT_MAX_FEEDRATE
416
         DEFAULT_MAX_FEEDRATE
417
       #else
417
       #else
418
-        LOGICAL_AXIS_ARRAY(9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999, 9999)
418
+        LOGICAL_AXIS_ARRAY_1(9999)
419
       #endif
419
       #endif
420
     ;
420
     ;
421
     #if ENABLED(LIMITED_MAX_FR_EDITING) && !defined(MAX_FEEDRATE_EDIT_VALUES)
421
     #if ENABLED(LIMITED_MAX_FR_EDITING) && !defined(MAX_FEEDRATE_EDIT_VALUES)
427
     START_MENU();
427
     START_MENU();
428
     BACK_ITEM(MSG_ADVANCED_SETTINGS);
428
     BACK_ITEM(MSG_ADVANCED_SETTINGS);
429
 
429
 
430
-    #define EDIT_VMAX(N) EDIT_ITEM_FAST(float5, MSG_VMAX_##N, &planner.settings.max_feedrate_mm_s[_AXIS(N)], 1, max_fr_edit_scaled[_AXIS(N)])
431
-    NUM_AXIS_CODE(EDIT_VMAX(A), EDIT_VMAX(B), EDIT_VMAX(C), EDIT_VMAX(I), EDIT_VMAX(J), EDIT_VMAX(K), EDIT_VMAX(U), EDIT_VMAX(V), EDIT_VMAX(W));
430
+    #define EDIT_VMAX(N) EDIT_ITEM_FAST(float5, MSG_VMAX_##N, &planner.settings.max_feedrate_mm_s[_AXIS(N)], 1, max_fr_edit_scaled[_AXIS(N)]);
431
+    MAP(EDIT_VMAX, NUM_AXIS_LIST(A, B, C, I, J, K, U, V, W));
432
 
432
 
433
     #if E_STEPPERS
433
     #if E_STEPPERS
434
       EDIT_ITEM_FAST(float5, MSG_VMAX_E, &planner.settings.max_feedrate_mm_s[E_AXIS_N(active_extruder)], 1, max_fr_edit_scaled.e);
434
       EDIT_ITEM_FAST(float5, MSG_VMAX_E, &planner.settings.max_feedrate_mm_s[E_AXIS_N(active_extruder)], 1, max_fr_edit_scaled.e);
458
       #elif ENABLED(LIMITED_MAX_ACCEL_EDITING)
458
       #elif ENABLED(LIMITED_MAX_ACCEL_EDITING)
459
         DEFAULT_MAX_ACCELERATION
459
         DEFAULT_MAX_ACCELERATION
460
       #else
460
       #else
461
-        LOGICAL_AXIS_ARRAY(99000, 99000, 99000, 99000, 99000, 99000, 99000, 99000, 99000, 99000)
461
+        LOGICAL_AXIS_ARRAY_1(99000)
462
       #endif
462
       #endif
463
     ;
463
     ;
464
     #if ENABLED(LIMITED_MAX_ACCEL_EDITING) && !defined(MAX_ACCEL_EDIT_VALUES)
464
     #if ENABLED(LIMITED_MAX_ACCEL_EDITING) && !defined(MAX_ACCEL_EDIT_VALUES)
526
         #ifdef MAX_JERK_EDIT_VALUES
526
         #ifdef MAX_JERK_EDIT_VALUES
527
           MAX_JERK_EDIT_VALUES
527
           MAX_JERK_EDIT_VALUES
528
         #elif ENABLED(LIMITED_JERK_EDITING)
528
         #elif ENABLED(LIMITED_JERK_EDITING)
529
-          { LOGICAL_AXIS_LIST((DEFAULT_EJERK) * 2,
530
-                              (DEFAULT_XJERK) * 2, (DEFAULT_YJERK) * 2, (DEFAULT_ZJERK) * 2,
531
-                              (DEFAULT_IJERK) * 2, (DEFAULT_JJERK) * 2, (DEFAULT_KJERK) * 2,
532
-                              (DEFAULT_UJERK) * 2, (DEFAULT_VJERK) * 2, (DEFAULT_WJERK) * 2) }
529
+          #define _JERK2(N) DEFAULT_##N##JERK * 2
530
+          { MAPLIST(_JERK2, LOGICAL_AXIS_NAMES) }
533
         #else
531
         #else
534
-          { LOGICAL_AXIS_LIST(990, 990, 990, 990, 990, 990, 990, 990, 990, 990) }
532
+          LOGICAL_AXIS_ARRAY_1(990)
535
         #endif
533
         #endif
536
       ;
534
       ;
537
       #define EDIT_JERK(N) EDIT_ITEM_FAST(float3, MSG_V##N##_JERK, &planner.max_jerk[_AXIS(N)], 1, max_jerk_edit[_AXIS(N)])
535
       #define EDIT_JERK(N) EDIT_ITEM_FAST(float3, MSG_V##N##_JERK, &planner.max_jerk[_AXIS(N)], 1, max_jerk_edit[_AXIS(N)])
585
   START_MENU();
583
   START_MENU();
586
   BACK_ITEM(MSG_ADVANCED_SETTINGS);
584
   BACK_ITEM(MSG_ADVANCED_SETTINGS);
587
 
585
 
588
-  #define EDIT_QSTEPS(Q) EDIT_ITEM_FAST(float61, MSG_##Q##_STEPS, &planner.settings.axis_steps_per_mm[_AXIS(Q)], 5, 9999, []{ planner.refresh_positioning(); })
589
-  NUM_AXIS_CODE(
590
-    EDIT_QSTEPS(A), EDIT_QSTEPS(B), EDIT_QSTEPS(C),
591
-    EDIT_QSTEPS(I), EDIT_QSTEPS(J), EDIT_QSTEPS(K),
592
-    EDIT_QSTEPS(U), EDIT_QSTEPS(V), EDIT_QSTEPS(W)
593
-  );
586
+  #define EDIT_QSTEPS(Q) EDIT_ITEM_FAST(float61, MSG_##Q##_STEPS, &planner.settings.axis_steps_per_mm[_AXIS(Q)], 5, 9999, []{ planner.refresh_positioning(); });
587
+  MAP(EDIT_QSTEPS, NUM_AXIS_LIST(A, B, C, I, J, K, U, V, W));
594
 
588
 
595
   #if ENABLED(DISTINCT_E_FACTORS)
589
   #if ENABLED(DISTINCT_E_FACTORS)
596
     LOOP_L_N(n, E_STEPPERS)
590
     LOOP_L_N(n, E_STEPPERS)

+ 2
- 3
Marlin/src/lcd/menu/menu_motion.cpp View File

174
   START_MENU();
174
   START_MENU();
175
   if (LCD_HEIGHT >= 4) {
175
   if (LCD_HEIGHT >= 4) {
176
     switch (axis) {
176
     switch (axis) {
177
-      case X_AXIS: STATIC_ITEM(MSG_MOVE_X, SS_DEFAULT|SS_INVERT); break;
178
-      case Y_AXIS: STATIC_ITEM(MSG_MOVE_Y, SS_DEFAULT|SS_INVERT); break;
179
-      case Z_AXIS: STATIC_ITEM(MSG_MOVE_Z, SS_DEFAULT|SS_INVERT); break;
177
+      #define _CASE_MOVE(N) case N##_AXIS: STATIC_ITEM(MSG_MOVE_##N, SS_DEFAULT|SS_INVERT); break;
178
+      MAIN_AXIS_MAP(_CASE_MOVE)
180
       default:
179
       default:
181
         TERN_(MANUAL_E_MOVES_RELATIVE, manual_move_e_origin = current_position.e);
180
         TERN_(MANUAL_E_MOVES_RELATIVE, manual_move_e_origin = current_position.e);
182
         STATIC_ITEM(MSG_MOVE_E, SS_DEFAULT|SS_INVERT);
181
         STATIC_ITEM(MSG_MOVE_E, SS_DEFAULT|SS_INVERT);

+ 1
- 1
Marlin/src/libs/L64XX/L64XX_Marlin.h View File

36
 #define HAS_L64XX_EXTRUDER (AXIS_IS_L64XX(E0) || AXIS_IS_L64XX(E1) || AXIS_IS_L64XX(E2) || AXIS_IS_L64XX(E3) || AXIS_IS_L64XX(E4) || AXIS_IS_L64XX(E5) || AXIS_IS_L64XX(E6) || AXIS_IS_L64XX(E7))
36
 #define HAS_L64XX_EXTRUDER (AXIS_IS_L64XX(E0) || AXIS_IS_L64XX(E1) || AXIS_IS_L64XX(E2) || AXIS_IS_L64XX(E3) || AXIS_IS_L64XX(E4) || AXIS_IS_L64XX(E5) || AXIS_IS_L64XX(E6) || AXIS_IS_L64XX(E7))
37
 
37
 
38
 #define _EN_ITEM(N) , E##N
38
 #define _EN_ITEM(N) , E##N
39
-enum L64XX_axis_t : uint8_t { NUM_AXIS_LIST(X, Y, Z, I, J, K, U, V, W), X2, Y2, Z2, Z3, Z4 REPEAT(E_STEPPERS, _EN_ITEM), MAX_L64XX };
39
+enum L64XX_axis_t : uint8_t { MAIN_AXIS_NAMES, X2, Y2, Z2, Z3, Z4 REPEAT(E_STEPPERS, _EN_ITEM), MAX_L64XX };
40
 #undef _EN_ITEM
40
 #undef _EN_ITEM
41
 
41
 
42
 class L64XX_Marlin : public L64XXHelper {
42
 class L64XX_Marlin : public L64XXHelper {

+ 6
- 13
Marlin/src/module/motion.cpp View File

738
 #if HAS_SOFTWARE_ENDSTOPS
738
 #if HAS_SOFTWARE_ENDSTOPS
739
 
739
 
740
   // Software Endstops are based on the configured limits.
740
   // Software Endstops are based on the configured limits.
741
+  #define _AMIN(A) A##_MIN_POS
742
+  #define _AMAX(A) A##_MAX_POS
741
   soft_endstops_t soft_endstop = {
743
   soft_endstops_t soft_endstop = {
742
     true, false,
744
     true, false,
743
-    NUM_AXIS_ARRAY(X_MIN_POS, Y_MIN_POS, Z_MIN_POS, I_MIN_POS, J_MIN_POS, K_MIN_POS, U_MIN_POS, V_MIN_POS, W_MIN_POS),
744
-    NUM_AXIS_ARRAY(X_MAX_BED, Y_MAX_BED, Z_MAX_POS, I_MAX_POS, J_MAX_POS, K_MAX_POS, U_MAX_POS, V_MAX_POS, W_MAX_POS)
745
+    { MAPLIST(_AMIN, MAIN_AXIS_NAMES) },
746
+    { MAPLIST(_AMAX, MAIN_AXIS_NAMES) },
745
   };
747
   };
746
 
748
 
747
   /**
749
   /**
1877
         || TERN0(A##_HOME_TO_MIN, A##_MIN_PIN > -1) \
1879
         || TERN0(A##_HOME_TO_MIN, A##_MIN_PIN > -1) \
1878
         || TERN0(A##_HOME_TO_MAX, A##_MAX_PIN > -1) \
1880
         || TERN0(A##_HOME_TO_MAX, A##_MAX_PIN > -1) \
1879
       ))
1881
       ))
1880
-      if (NUM_AXIS_GANG(
1881
-           !_CAN_HOME(X),
1882
-        && !_CAN_HOME(Y),
1883
-        && !_CAN_HOME(Z),
1884
-        && !_CAN_HOME(I),
1885
-        && !_CAN_HOME(J),
1886
-        && !_CAN_HOME(K),
1887
-        && !_CAN_HOME(U),
1888
-        && !_CAN_HOME(V),
1889
-        && !_CAN_HOME(W))
1890
-      ) return;
1882
+      #define _ANDCANT(N) && !_CAN_HOME(N)
1883
+      if (true MAIN_AXIS_MAP(_ANDCANT)) return;
1891
     #endif
1884
     #endif
1892
 
1885
 
1893
     if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM(">>> homeaxis(", AS_CHAR(AXIS_CHAR(axis)), ")");
1886
     if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM(">>> homeaxis(", AS_CHAR(AXIS_CHAR(axis)), ")");

+ 4
- 2
Marlin/src/module/probe.cpp View File

899
    * Change the current in the TMC drivers to N##_CURRENT_HOME. And we save the current configuration of each TMC driver.
899
    * Change the current in the TMC drivers to N##_CURRENT_HOME. And we save the current configuration of each TMC driver.
900
    */
900
    */
901
   void Probe::set_homing_current(const bool onoff) {
901
   void Probe::set_homing_current(const bool onoff) {
902
-    #define HAS_CURRENT_HOME(N) (defined(N##_CURRENT_HOME) && N##_CURRENT_HOME != N##_CURRENT)
903
-    #if HAS_CURRENT_HOME(X) || HAS_CURRENT_HOME(Y) || HAS_CURRENT_HOME(Z) || HAS_CURRENT_HOME(I) || HAS_CURRENT_HOME(J) || HAS_CURRENT_HOME(K) || HAS_CURRENT_HOME(U) || HAS_CURRENT_HOME(V) || HAS_CURRENT_HOME(W)
902
+    #define _defined(N) defined(N)
903
+    #define HAS_CURRENT_HOME(N) (N##_CURRENT_HOME > 0 && N##_CURRENT_HOME != N##_CURRENT)
904
+    #define _HOME_ELEM(N) HAS_CURRENT_HOME(N) ||
905
+    #if MAIN_AXIS_MAP(_HOME_ELEM) 0
904
       #if ENABLED(DELTA)
906
       #if ENABLED(DELTA)
905
         static int16_t saved_current_X, saved_current_Y;
907
         static int16_t saved_current_X, saved_current_Y;
906
       #endif
908
       #endif

+ 3
- 3
Marlin/src/module/settings.cpp View File

180
 #define _EN_ITEM(N) , E##N
180
 #define _EN_ITEM(N) , E##N
181
 #define _EN1_ITEM(N) , E##N:1
181
 #define _EN1_ITEM(N) , E##N:1
182
 
182
 
183
-typedef struct { uint16_t NUM_AXIS_LIST(X, Y, Z, I, J, K, U, V, W), X2, Y2, Z2, Z3, Z4 REPEAT(E_STEPPERS, _EN_ITEM); } per_stepper_uint16_t;
184
-typedef struct { uint32_t NUM_AXIS_LIST(X, Y, Z, I, J, K, U, V, W), X2, Y2, Z2, Z3, Z4 REPEAT(E_STEPPERS, _EN_ITEM); } per_stepper_uint32_t;
185
-typedef struct {  int16_t NUM_AXIS_LIST(X, Y, Z, I, J, K, U, V, W), X2, Y2, Z2, Z3, Z4;                              } mot_stepper_int16_t;
183
+typedef struct { uint16_t MAIN_AXIS_NAMES, X2, Y2, Z2, Z3, Z4 REPEAT(E_STEPPERS, _EN_ITEM); } per_stepper_uint16_t;
184
+typedef struct { uint32_t MAIN_AXIS_NAMES, X2, Y2, Z2, Z3, Z4 REPEAT(E_STEPPERS, _EN_ITEM); } per_stepper_uint32_t;
185
+typedef struct {  int16_t MAIN_AXIS_NAMES, X2, Y2, Z2, Z3, Z4;                              } mot_stepper_int16_t;
186
 typedef struct {     bool NUM_AXIS_LIST(X:1, Y:1, Z:1, I:1, J:1, K:1, U:1, V:1, W:1), X2:1, Y2:1, Z2:1, Z3:1, Z4:1 REPEAT(E_STEPPERS, _EN1_ITEM); } per_stepper_bool_t;
186
 typedef struct {     bool NUM_AXIS_LIST(X:1, Y:1, Z:1, I:1, J:1, K:1, U:1, V:1, W:1), X2:1, Y2:1, Z2:1, Z3:1, Z4:1 REPEAT(E_STEPPERS, _EN1_ITEM); } per_stepper_bool_t;
187
 
187
 
188
 #undef _EN_ITEM
188
 #undef _EN_ITEM

+ 2
- 10
Marlin/src/module/stepper.cpp View File

498
 void Stepper::enable_axis(const AxisEnum axis) {
498
 void Stepper::enable_axis(const AxisEnum axis) {
499
   #define _CASE_ENABLE(N) case N##_AXIS: ENABLE_AXIS_##N(); break;
499
   #define _CASE_ENABLE(N) case N##_AXIS: ENABLE_AXIS_##N(); break;
500
   switch (axis) {
500
   switch (axis) {
501
-    NUM_AXIS_CODE(
502
-      _CASE_ENABLE(X), _CASE_ENABLE(Y), _CASE_ENABLE(Z),
503
-      _CASE_ENABLE(I), _CASE_ENABLE(J), _CASE_ENABLE(K),
504
-      _CASE_ENABLE(U), _CASE_ENABLE(V), _CASE_ENABLE(W)
505
-    );
501
+    MAIN_AXIS_MAP(_CASE_ENABLE)
506
     default: break;
502
     default: break;
507
   }
503
   }
508
   mark_axis_enabled(axis);
504
   mark_axis_enabled(axis);
518
   if (can_disable) {
514
   if (can_disable) {
519
     #define _CASE_DISABLE(N) case N##_AXIS: DISABLE_AXIS_##N(); break;
515
     #define _CASE_DISABLE(N) case N##_AXIS: DISABLE_AXIS_##N(); break;
520
     switch (axis) {
516
     switch (axis) {
521
-      NUM_AXIS_CODE(
522
-        _CASE_DISABLE(X), _CASE_DISABLE(Y), _CASE_DISABLE(Z),
523
-        _CASE_DISABLE(I), _CASE_DISABLE(J), _CASE_DISABLE(K),
524
-        _CASE_DISABLE(U), _CASE_DISABLE(V), _CASE_DISABLE(W)
525
-      );
517
+      MAIN_AXIS_MAP(_CASE_DISABLE)
526
       default: break;
518
       default: break;
527
     }
519
     }
528
   }
520
   }

+ 9
- 23
Marlin/src/module/stepper/trinamic.cpp View File

493
   #endif
493
   #endif
494
 
494
 
495
   #define _EN_ITEM(N) , E##N
495
   #define _EN_ITEM(N) , E##N
496
-  enum TMCAxis : uint8_t { NUM_AXIS_LIST(X, Y, Z, I, J, K, U, V, W), X2, Y2, Z2, Z3, Z4 REPEAT(EXTRUDERS, _EN_ITEM), TOTAL };
496
+  enum TMCAxis : uint8_t { MAIN_AXIS_NAMES, X2, Y2, Z2, Z3, Z4 REPEAT(EXTRUDERS, _EN_ITEM), TOTAL };
497
   #undef _EN_ITEM
497
   #undef _EN_ITEM
498
 
498
 
499
   void tmc_serial_begin() {
499
   void tmc_serial_begin() {
1023
 // 2. For each axis in use, static_assert using a constexpr function, which counts the
1023
 // 2. For each axis in use, static_assert using a constexpr function, which counts the
1024
 //      number of matching/conflicting axis. If the value is not exactly 1, fail.
1024
 //      number of matching/conflicting axis. If the value is not exactly 1, fail.
1025
 
1025
 
1026
+#define ALL_AXIS_NAMES X, X2, Y, Y2, Z, Z2, Z3, Z4, I, J, K, U, V, W, E0, E1, E2, E3, E4, E5, E6, E7
1027
+
1026
 #if ANY_AXIS_HAS(HW_SERIAL)
1028
 #if ANY_AXIS_HAS(HW_SERIAL)
1027
   // Hardware serial names are compared as strings, since actually resolving them cannot occur in a constexpr.
1029
   // Hardware serial names are compared as strings, since actually resolving them cannot occur in a constexpr.
1028
   // Using a fixed-length character array for the port name allows this to be constexpr compatible.
1030
   // Using a fixed-length character array for the port name allows this to be constexpr compatible.
1029
   struct SanityHwSerialDetails { const char port[20]; uint32_t address; };
1031
   struct SanityHwSerialDetails { const char port[20]; uint32_t address; };
1030
   #define TMC_HW_DETAIL_ARGS(A) TERN(A##_HAS_HW_SERIAL, STRINGIFY(A##_HARDWARE_SERIAL), ""), TERN0(A##_HAS_HW_SERIAL, A##_SLAVE_ADDRESS)
1032
   #define TMC_HW_DETAIL_ARGS(A) TERN(A##_HAS_HW_SERIAL, STRINGIFY(A##_HARDWARE_SERIAL), ""), TERN0(A##_HAS_HW_SERIAL, A##_SLAVE_ADDRESS)
1031
-  #define TMC_HW_DETAIL(A) { TMC_HW_DETAIL_ARGS(A) }
1033
+  #define TMC_HW_DETAIL(A) { TMC_HW_DETAIL_ARGS(A) },
1032
   constexpr SanityHwSerialDetails sanity_tmc_hw_details[] = {
1034
   constexpr SanityHwSerialDetails sanity_tmc_hw_details[] = {
1033
-    TMC_HW_DETAIL(X), TMC_HW_DETAIL(X2),
1034
-    TMC_HW_DETAIL(Y), TMC_HW_DETAIL(Y2),
1035
-    TMC_HW_DETAIL(Z), TMC_HW_DETAIL(Z2), TMC_HW_DETAIL(Z3), TMC_HW_DETAIL(Z4),
1036
-    TMC_HW_DETAIL(I), TMC_HW_DETAIL(J), TMC_HW_DETAIL(K), TMC_HW_DETAIL(U), TMC_HW_DETAIL(V), TMC_HW_DETAIL(W),
1037
-    TMC_HW_DETAIL(E0), TMC_HW_DETAIL(E1), TMC_HW_DETAIL(E2), TMC_HW_DETAIL(E3), TMC_HW_DETAIL(E4), TMC_HW_DETAIL(E5), TMC_HW_DETAIL(E6), TMC_HW_DETAIL(E7)
1035
+    MAP(TMC_HW_DETAIL, ALL_AXIS_NAMES)
1038
   };
1036
   };
1039
 
1037
 
1040
   // constexpr compatible string comparison
1038
   // constexpr compatible string comparison
1053
 
1051
 
1054
   #define TMC_HWSERIAL_CONFLICT_MSG(A) STRINGIFY(A) "_SLAVE_ADDRESS conflicts with another driver using the same " STRINGIFY(A) "_HARDWARE_SERIAL"
1052
   #define TMC_HWSERIAL_CONFLICT_MSG(A) STRINGIFY(A) "_SLAVE_ADDRESS conflicts with another driver using the same " STRINGIFY(A) "_HARDWARE_SERIAL"
1055
   #define SA_NO_TMC_HW_C(A) static_assert(1 >= count_tmc_hw_serial_matches(TMC_HW_DETAIL_ARGS(A), 0, COUNT(sanity_tmc_hw_details)), TMC_HWSERIAL_CONFLICT_MSG(A));
1053
   #define SA_NO_TMC_HW_C(A) static_assert(1 >= count_tmc_hw_serial_matches(TMC_HW_DETAIL_ARGS(A), 0, COUNT(sanity_tmc_hw_details)), TMC_HWSERIAL_CONFLICT_MSG(A));
1056
-  SA_NO_TMC_HW_C(X); SA_NO_TMC_HW_C(X2);
1057
-  SA_NO_TMC_HW_C(Y); SA_NO_TMC_HW_C(Y2);
1058
-  SA_NO_TMC_HW_C(Z); SA_NO_TMC_HW_C(Z2); SA_NO_TMC_HW_C(Z3); SA_NO_TMC_HW_C(Z4);
1059
-  SA_NO_TMC_HW_C(I); SA_NO_TMC_HW_C(J); SA_NO_TMC_HW_C(K); SA_NO_TMC_HW_C(U); SA_NO_TMC_HW_C(V); SA_NO_TMC_HW_C(W);
1060
-  SA_NO_TMC_HW_C(E0); SA_NO_TMC_HW_C(E1); SA_NO_TMC_HW_C(E2); SA_NO_TMC_HW_C(E3); SA_NO_TMC_HW_C(E4); SA_NO_TMC_HW_C(E5); SA_NO_TMC_HW_C(E6); SA_NO_TMC_HW_C(E7);
1054
+  MAP(SA_NO_TMC_HW_C, ALL_AXIS_NAMES)
1061
 #endif
1055
 #endif
1062
 
1056
 
1063
 #if ANY_AXIS_HAS(SW_SERIAL)
1057
 #if ANY_AXIS_HAS(SW_SERIAL)
1064
   struct SanitySwSerialDetails { int32_t txpin; int32_t rxpin; uint32_t address; };
1058
   struct SanitySwSerialDetails { int32_t txpin; int32_t rxpin; uint32_t address; };
1065
   #define TMC_SW_DETAIL_ARGS(A) TERN(A##_HAS_SW_SERIAL, A##_SERIAL_TX_PIN, -1), TERN(A##_HAS_SW_SERIAL, A##_SERIAL_RX_PIN, -1), TERN0(A##_HAS_SW_SERIAL, A##_SLAVE_ADDRESS)
1059
   #define TMC_SW_DETAIL_ARGS(A) TERN(A##_HAS_SW_SERIAL, A##_SERIAL_TX_PIN, -1), TERN(A##_HAS_SW_SERIAL, A##_SERIAL_RX_PIN, -1), TERN0(A##_HAS_SW_SERIAL, A##_SLAVE_ADDRESS)
1066
-  #define TMC_SW_DETAIL(A) TMC_SW_DETAIL_ARGS(A)
1060
+  #define TMC_SW_DETAIL(A) TMC_SW_DETAIL_ARGS(A),
1067
   constexpr SanitySwSerialDetails sanity_tmc_sw_details[] = {
1061
   constexpr SanitySwSerialDetails sanity_tmc_sw_details[] = {
1068
-    TMC_SW_DETAIL(X), TMC_SW_DETAIL(X2),
1069
-    TMC_SW_DETAIL(Y), TMC_SW_DETAIL(Y2),
1070
-    TMC_SW_DETAIL(Z), TMC_SW_DETAIL(Z2), TMC_SW_DETAIL(Z3), TMC_SW_DETAIL(Z4),
1071
-    TMC_SW_DETAIL(I), TMC_SW_DETAIL(J), TMC_SW_DETAIL(K), TMC_SW_DETAIL(U), TMC_SW_DETAIL(V), TMC_SW_DETAIL(W),
1072
-    TMC_SW_DETAIL(E0), TMC_SW_DETAIL(E1), TMC_SW_DETAIL(E2), TMC_SW_DETAIL(E3), TMC_SW_DETAIL(E4), TMC_SW_DETAIL(E5), TMC_SW_DETAIL(E6), TMC_SW_DETAIL(E7)
1062
+    MAP(TMC_SW_DETAIL, ALL_AXIS_NAMES)
1073
   };
1063
   };
1074
 
1064
 
1075
   constexpr bool sc_sw_done(size_t start, size_t end) { return start == end; }
1065
   constexpr bool sc_sw_done(size_t start, size_t end) { return start == end; }
1083
 
1073
 
1084
   #define TMC_SWSERIAL_CONFLICT_MSG(A) STRINGIFY(A) "_SLAVE_ADDRESS conflicts with another driver using the same " STRINGIFY(A) "_SERIAL_RX_PIN or " STRINGIFY(A) "_SERIAL_TX_PIN"
1074
   #define TMC_SWSERIAL_CONFLICT_MSG(A) STRINGIFY(A) "_SLAVE_ADDRESS conflicts with another driver using the same " STRINGIFY(A) "_SERIAL_RX_PIN or " STRINGIFY(A) "_SERIAL_TX_PIN"
1085
   #define SA_NO_TMC_SW_C(A) static_assert(1 >= count_tmc_sw_serial_matches(TMC_SW_DETAIL_ARGS(A), 0, COUNT(sanity_tmc_sw_details)), TMC_SWSERIAL_CONFLICT_MSG(A));
1075
   #define SA_NO_TMC_SW_C(A) static_assert(1 >= count_tmc_sw_serial_matches(TMC_SW_DETAIL_ARGS(A), 0, COUNT(sanity_tmc_sw_details)), TMC_SWSERIAL_CONFLICT_MSG(A));
1086
-  SA_NO_TMC_SW_C(X); SA_NO_TMC_SW_C(X2);
1087
-  SA_NO_TMC_SW_C(Y); SA_NO_TMC_SW_C(Y2);
1088
-  SA_NO_TMC_SW_C(Z); SA_NO_TMC_SW_C(Z2); SA_NO_TMC_SW_C(Z3); SA_NO_TMC_SW_C(Z4);
1089
-  SA_NO_TMC_SW_C(I); SA_NO_TMC_SW_C(J); SA_NO_TMC_SW_C(K); SA_NO_TMC_SW_C(U); SA_NO_TMC_SW_C(V); SA_NO_TMC_SW_C(W);
1090
-  SA_NO_TMC_SW_C(E0); SA_NO_TMC_SW_C(E1); SA_NO_TMC_SW_C(E2); SA_NO_TMC_SW_C(E3); SA_NO_TMC_SW_C(E4); SA_NO_TMC_SW_C(E5); SA_NO_TMC_SW_C(E6); SA_NO_TMC_SW_C(E7);
1076
+  MAP(SA_NO_TMC_SW_C, ALL_AXIS_NAMES)
1091
 #endif
1077
 #endif
1092
 
1078
 
1093
 #endif // HAS_TRINAMIC_CONFIG
1079
 #endif // HAS_TRINAMIC_CONFIG

Loading…
Cancel
Save