Skip to content

Commit 85a38c9

Browse files
DerAndere1thinkyhead
authored andcommitted
🚸 Better M350, M114 with more axes (MarlinFirmware#23986)
Co-authored-by: Scott Lahteine <[email protected]>
1 parent 60898f3 commit 85a38c9

File tree

6 files changed

+107
-79
lines changed

6 files changed

+107
-79
lines changed

Marlin/src/gcode/control/M350_M351.cpp

+16-6
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

+1-1
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

+1-1
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

+1-1
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

+1-1
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

+87-69
Original file line numberDiff line numberDiff line change
@@ -3638,7 +3638,7 @@ void Stepper::report_positions() {
36383638
void Stepper::microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2, const int8_t ms3) {
36393639
if (ms1 >= 0) switch (driver) {
36403640
#if HAS_X_MS_PINS || HAS_X2_MS_PINS
3641-
case 0:
3641+
case X_AXIS:
36423642
#if HAS_X_MS_PINS
36433643
WRITE(X_MS1_PIN, ms1);
36443644
#endif
@@ -3648,7 +3648,7 @@ void Stepper::report_positions() {
36483648
break;
36493649
#endif
36503650
#if HAS_Y_MS_PINS || HAS_Y2_MS_PINS
3651-
case 1:
3651+
case Y_AXIS:
36523652
#if HAS_Y_MS_PINS
36533653
WRITE(Y_MS1_PIN, ms1);
36543654
#endif
@@ -3658,7 +3658,7 @@ void Stepper::report_positions() {
36583658
break;
36593659
#endif
36603660
#if HAS_SOME_Z_MS_PINS
3661-
case 2:
3661+
case Z_AXIS:
36623662
#if HAS_Z_MS_PINS
36633663
WRITE(Z_MS1_PIN, ms1);
36643664
#endif
@@ -3673,52 +3673,52 @@ void Stepper::report_positions() {
36733673
#endif
36743674
break;
36753675
#endif
3676+
#if HAS_I_MS_PINS
3677+
case I_AXIS: WRITE(I_MS1_PIN, ms1); break
3678+
#endif
3679+
#if HAS_J_MS_PINS
3680+
case J_AXIS: WRITE(J_MS1_PIN, ms1); break
3681+
#endif
3682+
#if HAS_K_MS_PINS
3683+
case K_AXIS: WRITE(K_MS1_PIN, ms1); break
3684+
#endif
3685+
#if HAS_U_MS_PINS
3686+
case U_AXIS: WRITE(U_MS1_PIN, ms1); break
3687+
#endif
3688+
#if HAS_V_MS_PINS
3689+
case V_AXIS: WRITE(V_MS1_PIN, ms1); break
3690+
#endif
3691+
#if HAS_W_MS_PINS
3692+
case W_AXIS: WRITE(W_MS1_PIN, ms1); break
3693+
#endif
36763694
#if HAS_E0_MS_PINS
3677-
case 3: WRITE(E0_MS1_PIN, ms1); break;
3695+
case E_AXIS: WRITE(E0_MS1_PIN, ms1); break;
36783696
#endif
36793697
#if HAS_E1_MS_PINS
3680-
case 4: WRITE(E1_MS1_PIN, ms1); break;
3698+
case (E_AXIS + 1): WRITE(E1_MS1_PIN, ms1); break;
36813699
#endif
36823700
#if HAS_E2_MS_PINS
3683-
case 5: WRITE(E2_MS1_PIN, ms1); break;
3701+
case (E_AXIS + 2): WRITE(E2_MS1_PIN, ms1); break;
36843702
#endif
36853703
#if HAS_E3_MS_PINS
3686-
case 6: WRITE(E3_MS1_PIN, ms1); break;
3704+
case (E_AXIS + 3): WRITE(E3_MS1_PIN, ms1); break;
36873705
#endif
36883706
#if HAS_E4_MS_PINS
3689-
case 7: WRITE(E4_MS1_PIN, ms1); break;
3707+
case (E_AXIS + 4): WRITE(E4_MS1_PIN, ms1); break;
36903708
#endif
36913709
#if HAS_E5_MS_PINS
3692-
case 8: WRITE(E5_MS1_PIN, ms1); break;
3710+
case (E_AXIS + 5): WRITE(E5_MS1_PIN, ms1); break;
36933711
#endif
36943712
#if HAS_E6_MS_PINS
3695-
case 9: WRITE(E6_MS1_PIN, ms1); break;
3713+
case (E_AXIS + 6): WRITE(E6_MS1_PIN, ms1); break;
36963714
#endif
36973715
#if HAS_E7_MS_PINS
3698-
case 10: WRITE(E7_MS1_PIN, ms1); break;
3699-
#endif
3700-
#if HAS_I_MS_PINS
3701-
case 11: WRITE(I_MS1_PIN, ms1); break
3702-
#endif
3703-
#if HAS_J_MS_PINS
3704-
case 12: WRITE(J_MS1_PIN, ms1); break
3705-
#endif
3706-
#if HAS_K_MS_PINS
3707-
case 13: WRITE(K_MS1_PIN, ms1); break
3708-
#endif
3709-
#if HAS_U_MS_PINS
3710-
case 14: WRITE(U_MS1_PIN, ms1); break
3711-
#endif
3712-
#if HAS_V_MS_PINS
3713-
case 15: WRITE(V_MS1_PIN, ms1); break
3714-
#endif
3715-
#if HAS_W_MS_PINS
3716-
case 16: WRITE(W_MS1_PIN, ms1); break
3716+
case (E_AXIS + 7): WRITE(E7_MS1_PIN, ms1); break;
37173717
#endif
37183718
}
37193719
if (ms2 >= 0) switch (driver) {
37203720
#if HAS_X_MS_PINS || HAS_X2_MS_PINS
3721-
case 0:
3721+
case X_AXIS:
37223722
#if HAS_X_MS_PINS
37233723
WRITE(X_MS2_PIN, ms2);
37243724
#endif
@@ -3728,7 +3728,7 @@ void Stepper::report_positions() {
37283728
break;
37293729
#endif
37303730
#if HAS_Y_MS_PINS || HAS_Y2_MS_PINS
3731-
case 1:
3731+
case Y_AXIS:
37323732
#if HAS_Y_MS_PINS
37333733
WRITE(Y_MS2_PIN, ms2);
37343734
#endif
@@ -3738,7 +3738,7 @@ void Stepper::report_positions() {
37383738
break;
37393739
#endif
37403740
#if HAS_SOME_Z_MS_PINS
3741-
case 2:
3741+
case Z_AXIS:
37423742
#if HAS_Z_MS_PINS
37433743
WRITE(Z_MS2_PIN, ms2);
37443744
#endif
@@ -3753,52 +3753,52 @@ void Stepper::report_positions() {
37533753
#endif
37543754
break;
37553755
#endif
3756+
#if HAS_I_MS_PINS
3757+
case I_AXIS: WRITE(I_MS2_PIN, ms2); break
3758+
#endif
3759+
#if HAS_J_MS_PINS
3760+
case J_AXIS: WRITE(J_MS2_PIN, ms2); break
3761+
#endif
3762+
#if HAS_K_MS_PINS
3763+
case K_AXIS: WRITE(K_MS2_PIN, ms2); break
3764+
#endif
3765+
#if HAS_U_MS_PINS
3766+
case U_AXIS: WRITE(U_MS2_PIN, ms2); break
3767+
#endif
3768+
#if HAS_V_MS_PINS
3769+
case V_AXIS: WRITE(V_MS2_PIN, ms2); break
3770+
#endif
3771+
#if HAS_W_MS_PINS
3772+
case W_AXIS: WRITE(W_MS2_PIN, ms2); break
3773+
#endif
37563774
#if HAS_E0_MS_PINS
3757-
case 3: WRITE(E0_MS2_PIN, ms2); break;
3775+
case E_AXIS: WRITE(E0_MS2_PIN, ms2); break;
37583776
#endif
37593777
#if HAS_E1_MS_PINS
3760-
case 4: WRITE(E1_MS2_PIN, ms2); break;
3778+
case (E_AXIS + 1): WRITE(E1_MS2_PIN, ms2); break;
37613779
#endif
37623780
#if HAS_E2_MS_PINS
3763-
case 5: WRITE(E2_MS2_PIN, ms2); break;
3781+
case (E_AXIS + 2): WRITE(E2_MS2_PIN, ms2); break;
37643782
#endif
37653783
#if HAS_E3_MS_PINS
3766-
case 6: WRITE(E3_MS2_PIN, ms2); break;
3784+
case (E_AXIS + 3): WRITE(E3_MS2_PIN, ms2); break;
37673785
#endif
37683786
#if HAS_E4_MS_PINS
3769-
case 7: WRITE(E4_MS2_PIN, ms2); break;
3787+
case (E_AXIS + 4): WRITE(E4_MS2_PIN, ms2); break;
37703788
#endif
37713789
#if HAS_E5_MS_PINS
3772-
case 8: WRITE(E5_MS2_PIN, ms2); break;
3790+
case (E_AXIS + 5): WRITE(E5_MS2_PIN, ms2); break;
37733791
#endif
37743792
#if HAS_E6_MS_PINS
3775-
case 9: WRITE(E6_MS2_PIN, ms2); break;
3793+
case (E_AXIS + 6): WRITE(E6_MS2_PIN, ms2); break;
37763794
#endif
37773795
#if HAS_E7_MS_PINS
3778-
case 10: WRITE(E7_MS2_PIN, ms2); break;
3779-
#endif
3780-
#if HAS_I_MS_PINS
3781-
case 11: WRITE(I_MS2_PIN, ms2); break
3782-
#endif
3783-
#if HAS_J_MS_PINS
3784-
case 12: WRITE(J_MS2_PIN, ms2); break
3785-
#endif
3786-
#if HAS_K_MS_PINS
3787-
case 13: WRITE(K_MS2_PIN, ms2); break
3788-
#endif
3789-
#if HAS_U_MS_PINS
3790-
case 14: WRITE(U_MS2_PIN, ms2); break
3791-
#endif
3792-
#if HAS_V_MS_PINS
3793-
case 15: WRITE(V_MS2_PIN, ms2); break
3794-
#endif
3795-
#if HAS_W_MS_PINS
3796-
case 16: WRITE(W_MS2_PIN, ms2); break
3796+
case (E_AXIS + 7): WRITE(E7_MS2_PIN, ms2); break;
37973797
#endif
37983798
}
37993799
if (ms3 >= 0) switch (driver) {
38003800
#if HAS_X_MS_PINS || HAS_X2_MS_PINS
3801-
case 0:
3801+
case X_AXIS:
38023802
#if HAS_X_MS_PINS && PIN_EXISTS(X_MS3)
38033803
WRITE(X_MS3_PIN, ms3);
38043804
#endif
@@ -3808,7 +3808,7 @@ void Stepper::report_positions() {
38083808
break;
38093809
#endif
38103810
#if HAS_Y_MS_PINS || HAS_Y2_MS_PINS
3811-
case 1:
3811+
case Y_AXIS:
38123812
#if HAS_Y_MS_PINS && PIN_EXISTS(Y_MS3)
38133813
WRITE(Y_MS3_PIN, ms3);
38143814
#endif
@@ -3818,7 +3818,7 @@ void Stepper::report_positions() {
38183818
break;
38193819
#endif
38203820
#if HAS_SOME_Z_MS_PINS
3821-
case 2:
3821+
case Z_AXIS:
38223822
#if HAS_Z_MS_PINS && PIN_EXISTS(Z_MS3)
38233823
WRITE(Z_MS3_PIN, ms3);
38243824
#endif
@@ -3833,29 +3833,47 @@ void Stepper::report_positions() {
38333833
#endif
38343834
break;
38353835
#endif
3836+
#if HAS_I_MS_PINS
3837+
case I_AXIS: WRITE(I_MS3_PIN, ms3); break
3838+
#endif
3839+
#if HAS_J_MS_PINS
3840+
case J_AXIS: WRITE(J_MS3_PIN, ms3); break
3841+
#endif
3842+
#if HAS_K_MS_PINS
3843+
case K_AXIS: WRITE(K_MS3_PIN, ms3); break
3844+
#endif
3845+
#if HAS_U_MS_PINS
3846+
case U_AXIS: WRITE(U_MS3_PIN, ms3); break
3847+
#endif
3848+
#if HAS_V_MS_PINS
3849+
case V_AXIS: WRITE(V_MS3_PIN, ms3); break
3850+
#endif
3851+
#if HAS_W_MS_PINS
3852+
case W_AXIS: WRITE(W_MS3_PIN, ms3); break
3853+
#endif
38363854
#if HAS_E0_MS_PINS && PIN_EXISTS(E0_MS3)
3837-
case 3: WRITE(E0_MS3_PIN, ms3); break;
3855+
case E_AXIS: WRITE(E0_MS3_PIN, ms3); break;
38383856
#endif
38393857
#if HAS_E1_MS_PINS && PIN_EXISTS(E1_MS3)
3840-
case 4: WRITE(E1_MS3_PIN, ms3); break;
3858+
case (E_AXIS + 1): WRITE(E1_MS3_PIN, ms3); break;
38413859
#endif
38423860
#if HAS_E2_MS_PINS && PIN_EXISTS(E2_MS3)
3843-
case 5: WRITE(E2_MS3_PIN, ms3); break;
3861+
case (E_AXIS + 2): WRITE(E2_MS3_PIN, ms3); break;
38443862
#endif
38453863
#if HAS_E3_MS_PINS && PIN_EXISTS(E3_MS3)
3846-
case 6: WRITE(E3_MS3_PIN, ms3); break;
3864+
case (E_AXIS + 3): WRITE(E3_MS3_PIN, ms3); break;
38473865
#endif
38483866
#if HAS_E4_MS_PINS && PIN_EXISTS(E4_MS3)
3849-
case 7: WRITE(E4_MS3_PIN, ms3); break;
3867+
case (E_AXIS + 4): WRITE(E4_MS3_PIN, ms3); break;
38503868
#endif
38513869
#if HAS_E5_MS_PINS && PIN_EXISTS(E5_MS3)
3852-
case 8: WRITE(E5_MS3_PIN, ms3); break;
3870+
case (E_AXIS + 5): WRITE(E5_MS3_PIN, ms3); break;
38533871
#endif
38543872
#if HAS_E6_MS_PINS && PIN_EXISTS(E6_MS3)
3855-
case 9: WRITE(E6_MS3_PIN, ms3); break;
3873+
case (E_AXIS + 6): WRITE(E6_MS3_PIN, ms3); break;
38563874
#endif
38573875
#if HAS_E7_MS_PINS && PIN_EXISTS(E7_MS3)
3858-
case 10: WRITE(E7_MS3_PIN, ms3); break;
3876+
case (E_AXIS + 7): WRITE(E7_MS3_PIN, ms3); break;
38593877
#endif
38603878
}
38613879
}

0 commit comments

Comments
 (0)