Skip to content

Commit bb7c000

Browse files
DerAndere1Jeremy Fairbanks
authored andcommitted
🚸 Better M350, M114 with more axes (MarlinFirmware#23986)
1 parent fc56f1d commit bb7c000

6 files changed

Lines changed: 107 additions & 79 deletions

File tree

Marlin/src/gcode/control/M350_M351.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,35 +27,45 @@
2727
#include "../gcode.h"
2828
#include "../../module/stepper.h"
2929

30+
#if NUM_AXES == XYZ && EXTRUDERS >= 1
31+
#define HAS_M350_B_PARAM 1 // "5th axis" (after E0) for an original XYZEB setup.
32+
#if AXIS_COLLISION('B')
33+
#error "M350 parameter 'B' collision with axis name."
34+
#endif
35+
#endif
36+
3037
/**
3138
* M350: Set axis microstepping modes. S sets mode for all drivers.
3239
*
3340
* Warning: Steps-per-unit remains unchanged.
3441
*/
3542
void GcodeSuite::M350() {
36-
if (parser.seen('S')) LOOP_LE_N(i, 4) stepper.microstep_mode(i, parser.value_byte());
37-
LOOP_LOGICAL_AXES(i) if (parser.seen(axis_codes[i])) stepper.microstep_mode(i, parser.value_byte());
38-
if (parser.seen('B')) stepper.microstep_mode(4, parser.value_byte());
43+
if (parser.seen('S')) LOOP_DISTINCT_AXES(i) stepper.microstep_mode(i, parser.value_byte());
44+
LOOP_LOGICAL_AXES(i) if (parser.seen(AXIS_CHAR(i))) stepper.microstep_mode(i, parser.value_byte());
45+
TERN_(HAS_M350_B_PARAM, if (parser.seenval('B')) stepper.microstep_mode(E_AXIS + 1, parser.value_byte()));
3946
stepper.microstep_readings();
4047
}
4148

4249
/**
4350
* M351: Toggle MS1 MS2 pins directly with axis codes X Y Z . . . E [B]
4451
* S# determines MS1, MS2 or MS3, X# sets the pin high/low.
52+
*
53+
* Parameter 'B' sets "5th axis" (after E0) only for an original XYZEB setup.
4554
*/
4655
void GcodeSuite::M351() {
56+
const int8_t bval = TERN(HAS_M350_B_PARAM, parser.byteval('B', -1), -1); UNUSED(bval);
4757
if (parser.seenval('S')) switch (parser.value_byte()) {
4858
case 1:
4959
LOOP_LOGICAL_AXES(i) if (parser.seenval(AXIS_CHAR(i))) stepper.microstep_ms(i, parser.value_byte(), -1, -1);
50-
if (parser.seenval('B')) stepper.microstep_ms(4, parser.value_byte(), -1, -1);
60+
TERN_(HAS_M350_B_PARAM, if (bval >= 0) stepper.microstep_ms(E_AXIS + 1, bval != 0, -1, -1));
5161
break;
5262
case 2:
5363
LOOP_LOGICAL_AXES(i) if (parser.seenval(AXIS_CHAR(i))) stepper.microstep_ms(i, -1, parser.value_byte(), -1);
54-
if (parser.seenval('B')) stepper.microstep_ms(4, -1, parser.value_byte(), -1);
64+
TERN_(HAS_M350_B_PARAM, if (bval >= 0) stepper.microstep_ms(E_AXIS + 1, -1, bval != 0, -1));
5565
break;
5666
case 3:
5767
LOOP_LOGICAL_AXES(i) if (parser.seenval(AXIS_CHAR(i))) stepper.microstep_ms(i, -1, -1, parser.value_byte());
58-
if (parser.seenval('B')) stepper.microstep_ms(4, -1, -1, parser.value_byte());
68+
TERN_(HAS_M350_B_PARAM, if (bval >= 0) stepper.microstep_ms(E_AXIS + 1, -1, -1, bval != 0));
5969
break;
6070
}
6171
stepper.microstep_readings();

Marlin/src/gcode/feature/L6470/M906.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#if HAS_L64XX
2626

2727
#if AXIS_COLLISION('I')
28-
#error "M906 parameter collision with axis name."
28+
#error "M906 parameter 'I' collision with axis name."
2929
#endif
3030

3131
#include "../../gcode.h"

Marlin/src/gcode/feature/trinamic/M569.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#if HAS_STEALTHCHOP
2626

2727
#if AXIS_COLLISION('I')
28-
#error "M569 parameter collision with axis name."
28+
#error "M569 parameter 'I' collision with axis name."
2929
#endif
3030

3131
#include "../../gcode.h"

Marlin/src/gcode/feature/trinamic/M919.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#if HAS_TRINAMIC_CONFIG
2626

2727
#if AXIS_COLLISION('I')
28-
#error "M919 parameter collision with axis name."
28+
#error "M919 parameter 'I' collision with axis name."
2929
#endif
3030

3131
#include "../../gcode.h"

Marlin/src/gcode/motion/G5.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
#if ENABLED(BEZIER_CURVE_SUPPORT)
2626

2727
#if AXIS_COLLISION('I') || AXIS_COLLISION('J')
28-
#error "G5 parameter collision with axis name."
28+
#error "G5 parameter 'I' or 'J' collision with axis name."
2929
#endif
3030

3131
#include "../../module/motion.h"

Marlin/src/module/stepper.cpp

Lines changed: 87 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -3679,7 +3679,7 @@ void Stepper::report_positions() {
36793679
void Stepper::microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2, const int8_t ms3) {
36803680
if (ms1 >= 0) switch (driver) {
36813681
#if HAS_X_MS_PINS || HAS_X2_MS_PINS
3682-
case 0:
3682+
case X_AXIS:
36833683
#if HAS_X_MS_PINS
36843684
WRITE(X_MS1_PIN, ms1);
36853685
#endif
@@ -3689,7 +3689,7 @@ void Stepper::report_positions() {
36893689
break;
36903690
#endif
36913691
#if HAS_Y_MS_PINS || HAS_Y2_MS_PINS
3692-
case 1:
3692+
case Y_AXIS:
36933693
#if HAS_Y_MS_PINS
36943694
WRITE(Y_MS1_PIN, ms1);
36953695
#endif
@@ -3699,7 +3699,7 @@ void Stepper::report_positions() {
36993699
break;
37003700
#endif
37013701
#if HAS_SOME_Z_MS_PINS
3702-
case 2:
3702+
case Z_AXIS:
37033703
#if HAS_Z_MS_PINS
37043704
WRITE(Z_MS1_PIN, ms1);
37053705
#endif
@@ -3714,52 +3714,52 @@ void Stepper::report_positions() {
37143714
#endif
37153715
break;
37163716
#endif
3717+
#if HAS_I_MS_PINS
3718+
case I_AXIS: WRITE(I_MS1_PIN, ms1); break
3719+
#endif
3720+
#if HAS_J_MS_PINS
3721+
case J_AXIS: WRITE(J_MS1_PIN, ms1); break
3722+
#endif
3723+
#if HAS_K_MS_PINS
3724+
case K_AXIS: WRITE(K_MS1_PIN, ms1); break
3725+
#endif
3726+
#if HAS_U_MS_PINS
3727+
case U_AXIS: WRITE(U_MS1_PIN, ms1); break
3728+
#endif
3729+
#if HAS_V_MS_PINS
3730+
case V_AXIS: WRITE(V_MS1_PIN, ms1); break
3731+
#endif
3732+
#if HAS_W_MS_PINS
3733+
case W_AXIS: WRITE(W_MS1_PIN, ms1); break
3734+
#endif
37173735
#if HAS_E0_MS_PINS
3718-
case 3: WRITE(E0_MS1_PIN, ms1); break;
3736+
case E_AXIS: WRITE(E0_MS1_PIN, ms1); break;
37193737
#endif
37203738
#if HAS_E1_MS_PINS
3721-
case 4: WRITE(E1_MS1_PIN, ms1); break;
3739+
case (E_AXIS + 1): WRITE(E1_MS1_PIN, ms1); break;
37223740
#endif
37233741
#if HAS_E2_MS_PINS
3724-
case 5: WRITE(E2_MS1_PIN, ms1); break;
3742+
case (E_AXIS + 2): WRITE(E2_MS1_PIN, ms1); break;
37253743
#endif
37263744
#if HAS_E3_MS_PINS
3727-
case 6: WRITE(E3_MS1_PIN, ms1); break;
3745+
case (E_AXIS + 3): WRITE(E3_MS1_PIN, ms1); break;
37283746
#endif
37293747
#if HAS_E4_MS_PINS
3730-
case 7: WRITE(E4_MS1_PIN, ms1); break;
3748+
case (E_AXIS + 4): WRITE(E4_MS1_PIN, ms1); break;
37313749
#endif
37323750
#if HAS_E5_MS_PINS
3733-
case 8: WRITE(E5_MS1_PIN, ms1); break;
3751+
case (E_AXIS + 5): WRITE(E5_MS1_PIN, ms1); break;
37343752
#endif
37353753
#if HAS_E6_MS_PINS
3736-
case 9: WRITE(E6_MS1_PIN, ms1); break;
3754+
case (E_AXIS + 6): WRITE(E6_MS1_PIN, ms1); break;
37373755
#endif
37383756
#if HAS_E7_MS_PINS
3739-
case 10: WRITE(E7_MS1_PIN, ms1); break;
3740-
#endif
3741-
#if HAS_I_MS_PINS
3742-
case 11: WRITE(I_MS1_PIN, ms1); break
3743-
#endif
3744-
#if HAS_J_MS_PINS
3745-
case 12: WRITE(J_MS1_PIN, ms1); break
3746-
#endif
3747-
#if HAS_K_MS_PINS
3748-
case 13: WRITE(K_MS1_PIN, ms1); break
3749-
#endif
3750-
#if HAS_U_MS_PINS
3751-
case 14: WRITE(U_MS1_PIN, ms1); break
3752-
#endif
3753-
#if HAS_V_MS_PINS
3754-
case 15: WRITE(V_MS1_PIN, ms1); break
3755-
#endif
3756-
#if HAS_W_MS_PINS
3757-
case 16: WRITE(W_MS1_PIN, ms1); break
3757+
case (E_AXIS + 7): WRITE(E7_MS1_PIN, ms1); break;
37583758
#endif
37593759
}
37603760
if (ms2 >= 0) switch (driver) {
37613761
#if HAS_X_MS_PINS || HAS_X2_MS_PINS
3762-
case 0:
3762+
case X_AXIS:
37633763
#if HAS_X_MS_PINS
37643764
WRITE(X_MS2_PIN, ms2);
37653765
#endif
@@ -3769,7 +3769,7 @@ void Stepper::report_positions() {
37693769
break;
37703770
#endif
37713771
#if HAS_Y_MS_PINS || HAS_Y2_MS_PINS
3772-
case 1:
3772+
case Y_AXIS:
37733773
#if HAS_Y_MS_PINS
37743774
WRITE(Y_MS2_PIN, ms2);
37753775
#endif
@@ -3779,7 +3779,7 @@ void Stepper::report_positions() {
37793779
break;
37803780
#endif
37813781
#if HAS_SOME_Z_MS_PINS
3782-
case 2:
3782+
case Z_AXIS:
37833783
#if HAS_Z_MS_PINS
37843784
WRITE(Z_MS2_PIN, ms2);
37853785
#endif
@@ -3794,52 +3794,52 @@ void Stepper::report_positions() {
37943794
#endif
37953795
break;
37963796
#endif
3797+
#if HAS_I_MS_PINS
3798+
case I_AXIS: WRITE(I_MS2_PIN, ms2); break
3799+
#endif
3800+
#if HAS_J_MS_PINS
3801+
case J_AXIS: WRITE(J_MS2_PIN, ms2); break
3802+
#endif
3803+
#if HAS_K_MS_PINS
3804+
case K_AXIS: WRITE(K_MS2_PIN, ms2); break
3805+
#endif
3806+
#if HAS_U_MS_PINS
3807+
case U_AXIS: WRITE(U_MS2_PIN, ms2); break
3808+
#endif
3809+
#if HAS_V_MS_PINS
3810+
case V_AXIS: WRITE(V_MS2_PIN, ms2); break
3811+
#endif
3812+
#if HAS_W_MS_PINS
3813+
case W_AXIS: WRITE(W_MS2_PIN, ms2); break
3814+
#endif
37973815
#if HAS_E0_MS_PINS
3798-
case 3: WRITE(E0_MS2_PIN, ms2); break;
3816+
case E_AXIS: WRITE(E0_MS2_PIN, ms2); break;
37993817
#endif
38003818
#if HAS_E1_MS_PINS
3801-
case 4: WRITE(E1_MS2_PIN, ms2); break;
3819+
case (E_AXIS + 1): WRITE(E1_MS2_PIN, ms2); break;
38023820
#endif
38033821
#if HAS_E2_MS_PINS
3804-
case 5: WRITE(E2_MS2_PIN, ms2); break;
3822+
case (E_AXIS + 2): WRITE(E2_MS2_PIN, ms2); break;
38053823
#endif
38063824
#if HAS_E3_MS_PINS
3807-
case 6: WRITE(E3_MS2_PIN, ms2); break;
3825+
case (E_AXIS + 3): WRITE(E3_MS2_PIN, ms2); break;
38083826
#endif
38093827
#if HAS_E4_MS_PINS
3810-
case 7: WRITE(E4_MS2_PIN, ms2); break;
3828+
case (E_AXIS + 4): WRITE(E4_MS2_PIN, ms2); break;
38113829
#endif
38123830
#if HAS_E5_MS_PINS
3813-
case 8: WRITE(E5_MS2_PIN, ms2); break;
3831+
case (E_AXIS + 5): WRITE(E5_MS2_PIN, ms2); break;
38143832
#endif
38153833
#if HAS_E6_MS_PINS
3816-
case 9: WRITE(E6_MS2_PIN, ms2); break;
3834+
case (E_AXIS + 6): WRITE(E6_MS2_PIN, ms2); break;
38173835
#endif
38183836
#if HAS_E7_MS_PINS
3819-
case 10: WRITE(E7_MS2_PIN, ms2); break;
3820-
#endif
3821-
#if HAS_I_MS_PINS
3822-
case 11: WRITE(I_MS2_PIN, ms2); break
3823-
#endif
3824-
#if HAS_J_MS_PINS
3825-
case 12: WRITE(J_MS2_PIN, ms2); break
3826-
#endif
3827-
#if HAS_K_MS_PINS
3828-
case 13: WRITE(K_MS2_PIN, ms2); break
3829-
#endif
3830-
#if HAS_U_MS_PINS
3831-
case 14: WRITE(U_MS2_PIN, ms2); break
3832-
#endif
3833-
#if HAS_V_MS_PINS
3834-
case 15: WRITE(V_MS2_PIN, ms2); break
3835-
#endif
3836-
#if HAS_W_MS_PINS
3837-
case 16: WRITE(W_MS2_PIN, ms2); break
3837+
case (E_AXIS + 7): WRITE(E7_MS2_PIN, ms2); break;
38383838
#endif
38393839
}
38403840
if (ms3 >= 0) switch (driver) {
38413841
#if HAS_X_MS_PINS || HAS_X2_MS_PINS
3842-
case 0:
3842+
case X_AXIS:
38433843
#if HAS_X_MS_PINS && PIN_EXISTS(X_MS3)
38443844
WRITE(X_MS3_PIN, ms3);
38453845
#endif
@@ -3849,7 +3849,7 @@ void Stepper::report_positions() {
38493849
break;
38503850
#endif
38513851
#if HAS_Y_MS_PINS || HAS_Y2_MS_PINS
3852-
case 1:
3852+
case Y_AXIS:
38533853
#if HAS_Y_MS_PINS && PIN_EXISTS(Y_MS3)
38543854
WRITE(Y_MS3_PIN, ms3);
38553855
#endif
@@ -3859,7 +3859,7 @@ void Stepper::report_positions() {
38593859
break;
38603860
#endif
38613861
#if HAS_SOME_Z_MS_PINS
3862-
case 2:
3862+
case Z_AXIS:
38633863
#if HAS_Z_MS_PINS && PIN_EXISTS(Z_MS3)
38643864
WRITE(Z_MS3_PIN, ms3);
38653865
#endif
@@ -3874,29 +3874,47 @@ void Stepper::report_positions() {
38743874
#endif
38753875
break;
38763876
#endif
3877+
#if HAS_I_MS_PINS
3878+
case I_AXIS: WRITE(I_MS3_PIN, ms3); break
3879+
#endif
3880+
#if HAS_J_MS_PINS
3881+
case J_AXIS: WRITE(J_MS3_PIN, ms3); break
3882+
#endif
3883+
#if HAS_K_MS_PINS
3884+
case K_AXIS: WRITE(K_MS3_PIN, ms3); break
3885+
#endif
3886+
#if HAS_U_MS_PINS
3887+
case U_AXIS: WRITE(U_MS3_PIN, ms3); break
3888+
#endif
3889+
#if HAS_V_MS_PINS
3890+
case V_AXIS: WRITE(V_MS3_PIN, ms3); break
3891+
#endif
3892+
#if HAS_W_MS_PINS
3893+
case W_AXIS: WRITE(W_MS3_PIN, ms3); break
3894+
#endif
38773895
#if HAS_E0_MS_PINS && PIN_EXISTS(E0_MS3)
3878-
case 3: WRITE(E0_MS3_PIN, ms3); break;
3896+
case E_AXIS: WRITE(E0_MS3_PIN, ms3); break;
38793897
#endif
38803898
#if HAS_E1_MS_PINS && PIN_EXISTS(E1_MS3)
3881-
case 4: WRITE(E1_MS3_PIN, ms3); break;
3899+
case (E_AXIS + 1): WRITE(E1_MS3_PIN, ms3); break;
38823900
#endif
38833901
#if HAS_E2_MS_PINS && PIN_EXISTS(E2_MS3)
3884-
case 5: WRITE(E2_MS3_PIN, ms3); break;
3902+
case (E_AXIS + 2): WRITE(E2_MS3_PIN, ms3); break;
38853903
#endif
38863904
#if HAS_E3_MS_PINS && PIN_EXISTS(E3_MS3)
3887-
case 6: WRITE(E3_MS3_PIN, ms3); break;
3905+
case (E_AXIS + 3): WRITE(E3_MS3_PIN, ms3); break;
38883906
#endif
38893907
#if HAS_E4_MS_PINS && PIN_EXISTS(E4_MS3)
3890-
case 7: WRITE(E4_MS3_PIN, ms3); break;
3908+
case (E_AXIS + 4): WRITE(E4_MS3_PIN, ms3); break;
38913909
#endif
38923910
#if HAS_E5_MS_PINS && PIN_EXISTS(E5_MS3)
3893-
case 8: WRITE(E5_MS3_PIN, ms3); break;
3911+
case (E_AXIS + 5): WRITE(E5_MS3_PIN, ms3); break;
38943912
#endif
38953913
#if HAS_E6_MS_PINS && PIN_EXISTS(E6_MS3)
3896-
case 9: WRITE(E6_MS3_PIN, ms3); break;
3914+
case (E_AXIS + 6): WRITE(E6_MS3_PIN, ms3); break;
38973915
#endif
38983916
#if HAS_E7_MS_PINS && PIN_EXISTS(E7_MS3)
3899-
case 10: WRITE(E7_MS3_PIN, ms3); break;
3917+
case (E_AXIS + 7): WRITE(E7_MS3_PIN, ms3); break;
39003918
#endif
39013919
}
39023920
}

0 commit comments

Comments
 (0)