Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve M350 and M114 with NUM_AXES > 3 #23986

Merged
merged 15 commits into from
Apr 4, 2022
22 changes: 16 additions & 6 deletions Marlin/src/gcode/control/M350_M351.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,35 +27,45 @@
#include "../gcode.h"
#include "../../module/stepper.h"

#if NUM_AXES == XYZ && EXTRUDERS >= 1
#define HAS_M350_B_PARAM 1 // "5th axis" (after E0) for an original XYZEB setup.
#if AXIS_COLLISION('B')
#error "M350 parameter 'B' collision with axis name."
#endif
#endif

/**
* M350: Set axis microstepping modes. S sets mode for all drivers.
*
* Warning: Steps-per-unit remains unchanged.
*/
void GcodeSuite::M350() {
if (parser.seen('S')) LOOP_LE_N(i, 4) stepper.microstep_mode(i, parser.value_byte());
LOOP_LOGICAL_AXES(i) if (parser.seen(axis_codes[i])) stepper.microstep_mode(i, parser.value_byte());
if (parser.seen('B')) stepper.microstep_mode(4, parser.value_byte());
if (parser.seen('S')) LOOP_DISTINCT_AXES(i) stepper.microstep_mode(i, parser.value_byte());
LOOP_LOGICAL_AXES(i) if (parser.seen(AXIS_CHAR(i))) stepper.microstep_mode(i, parser.value_byte());
TERN_(HAS_M350_B_PARAM, if (parser.seenval('B')) stepper.microstep_mode(E_AXIS + 1, parser.value_byte()));
stepper.microstep_readings();
}

/**
* M351: Toggle MS1 MS2 pins directly with axis codes X Y Z . . . E [B]
* S# determines MS1, MS2 or MS3, X# sets the pin high/low.
*
* Parameter 'B' sets "5th axis" (after E0) only for an original XYZEB setup.
*/
void GcodeSuite::M351() {
const int8_t bval = TERN(HAS_M350_B_PARAM, parser.byteval('B', -1), -1); UNUSED(bval);
if (parser.seenval('S')) switch (parser.value_byte()) {
case 1:
LOOP_LOGICAL_AXES(i) if (parser.seenval(AXIS_CHAR(i))) stepper.microstep_ms(i, parser.value_byte(), -1, -1);
if (parser.seenval('B')) stepper.microstep_ms(4, parser.value_byte(), -1, -1);
TERN_(HAS_M350_B_PARAM, if (bval >= 0) stepper.microstep_ms(E_AXIS + 1, bval != 0, -1, -1));
break;
case 2:
LOOP_LOGICAL_AXES(i) if (parser.seenval(AXIS_CHAR(i))) stepper.microstep_ms(i, -1, parser.value_byte(), -1);
if (parser.seenval('B')) stepper.microstep_ms(4, -1, parser.value_byte(), -1);
TERN_(HAS_M350_B_PARAM, if (bval >= 0) stepper.microstep_ms(E_AXIS + 1, -1, bval != 0, -1));
break;
case 3:
LOOP_LOGICAL_AXES(i) if (parser.seenval(AXIS_CHAR(i))) stepper.microstep_ms(i, -1, -1, parser.value_byte());
if (parser.seenval('B')) stepper.microstep_ms(4, -1, -1, parser.value_byte());
TERN_(HAS_M350_B_PARAM, if (bval >= 0) stepper.microstep_ms(E_AXIS + 1, -1, -1, bval != 0));
break;
}
stepper.microstep_readings();
Expand Down
2 changes: 1 addition & 1 deletion Marlin/src/gcode/feature/L6470/M906.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#if HAS_L64XX

#if AXIS_COLLISION('I')
#error "M906 parameter collision with axis name."
#error "M906 parameter 'I' collision with axis name."
#endif

#include "../../gcode.h"
Expand Down
2 changes: 1 addition & 1 deletion Marlin/src/gcode/feature/trinamic/M569.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#if HAS_STEALTHCHOP

#if AXIS_COLLISION('I')
#error "M569 parameter collision with axis name."
#error "M569 parameter 'I' collision with axis name."
#endif

thinkyhead marked this conversation as resolved.
Show resolved Hide resolved
#include "../../gcode.h"
Expand Down
2 changes: 1 addition & 1 deletion Marlin/src/gcode/feature/trinamic/M919.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#if HAS_TRINAMIC_CONFIG

#if AXIS_COLLISION('I')
#error "M919 parameter collision with axis name."
#error "M919 parameter 'I' collision with axis name."
#endif

#include "../../gcode.h"
Expand Down
2 changes: 1 addition & 1 deletion Marlin/src/gcode/motion/G5.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#if ENABLED(BEZIER_CURVE_SUPPORT)

#if AXIS_COLLISION('I') || AXIS_COLLISION('J')
#error "G5 parameter collision with axis name."
#error "G5 parameter 'I' or 'J' collision with axis name."
#endif

#include "../../module/motion.h"
Expand Down
156 changes: 87 additions & 69 deletions Marlin/src/module/stepper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3638,7 +3638,7 @@ void Stepper::report_positions() {
void Stepper::microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2, const int8_t ms3) {
if (ms1 >= 0) switch (driver) {
#if HAS_X_MS_PINS || HAS_X2_MS_PINS
case 0:
case X_AXIS:
#if HAS_X_MS_PINS
WRITE(X_MS1_PIN, ms1);
#endif
Expand All @@ -3648,7 +3648,7 @@ void Stepper::report_positions() {
break;
#endif
#if HAS_Y_MS_PINS || HAS_Y2_MS_PINS
case 1:
case Y_AXIS:
#if HAS_Y_MS_PINS
WRITE(Y_MS1_PIN, ms1);
#endif
Expand All @@ -3658,7 +3658,7 @@ void Stepper::report_positions() {
break;
#endif
#if HAS_SOME_Z_MS_PINS
case 2:
case Z_AXIS:
#if HAS_Z_MS_PINS
WRITE(Z_MS1_PIN, ms1);
#endif
Expand All @@ -3673,52 +3673,52 @@ void Stepper::report_positions() {
#endif
break;
#endif
#if HAS_I_MS_PINS
case I_AXIS: WRITE(I_MS1_PIN, ms1); break
#endif
#if HAS_J_MS_PINS
case J_AXIS: WRITE(J_MS1_PIN, ms1); break
#endif
#if HAS_K_MS_PINS
case K_AXIS: WRITE(K_MS1_PIN, ms1); break
#endif
#if HAS_U_MS_PINS
case U_AXIS: WRITE(U_MS1_PIN, ms1); break
#endif
#if HAS_V_MS_PINS
case V_AXIS: WRITE(V_MS1_PIN, ms1); break
#endif
#if HAS_W_MS_PINS
case W_AXIS: WRITE(W_MS1_PIN, ms1); break
#endif
#if HAS_E0_MS_PINS
case 3: WRITE(E0_MS1_PIN, ms1); break;
case E_AXIS: WRITE(E0_MS1_PIN, ms1); break;
#endif
#if HAS_E1_MS_PINS
case 4: WRITE(E1_MS1_PIN, ms1); break;
case (E_AXIS + 1): WRITE(E1_MS1_PIN, ms1); break;
#endif
#if HAS_E2_MS_PINS
case 5: WRITE(E2_MS1_PIN, ms1); break;
case (E_AXIS + 2): WRITE(E2_MS1_PIN, ms1); break;
#endif
#if HAS_E3_MS_PINS
case 6: WRITE(E3_MS1_PIN, ms1); break;
case (E_AXIS + 3): WRITE(E3_MS1_PIN, ms1); break;
#endif
#if HAS_E4_MS_PINS
case 7: WRITE(E4_MS1_PIN, ms1); break;
case (E_AXIS + 4): WRITE(E4_MS1_PIN, ms1); break;
#endif
#if HAS_E5_MS_PINS
case 8: WRITE(E5_MS1_PIN, ms1); break;
case (E_AXIS + 5): WRITE(E5_MS1_PIN, ms1); break;
#endif
#if HAS_E6_MS_PINS
case 9: WRITE(E6_MS1_PIN, ms1); break;
case (E_AXIS + 6): WRITE(E6_MS1_PIN, ms1); break;
#endif
#if HAS_E7_MS_PINS
case 10: WRITE(E7_MS1_PIN, ms1); break;
#endif
#if HAS_I_MS_PINS
case 11: WRITE(I_MS1_PIN, ms1); break
#endif
#if HAS_J_MS_PINS
case 12: WRITE(J_MS1_PIN, ms1); break
#endif
#if HAS_K_MS_PINS
case 13: WRITE(K_MS1_PIN, ms1); break
#endif
#if HAS_U_MS_PINS
case 14: WRITE(U_MS1_PIN, ms1); break
#endif
#if HAS_V_MS_PINS
case 15: WRITE(V_MS1_PIN, ms1); break
#endif
#if HAS_W_MS_PINS
case 16: WRITE(W_MS1_PIN, ms1); break
case (E_AXIS + 7): WRITE(E7_MS1_PIN, ms1); break;
#endif
}
if (ms2 >= 0) switch (driver) {
#if HAS_X_MS_PINS || HAS_X2_MS_PINS
case 0:
case X_AXIS:
#if HAS_X_MS_PINS
WRITE(X_MS2_PIN, ms2);
#endif
Expand All @@ -3728,7 +3728,7 @@ void Stepper::report_positions() {
break;
#endif
#if HAS_Y_MS_PINS || HAS_Y2_MS_PINS
case 1:
case Y_AXIS:
#if HAS_Y_MS_PINS
WRITE(Y_MS2_PIN, ms2);
#endif
Expand All @@ -3738,7 +3738,7 @@ void Stepper::report_positions() {
break;
#endif
#if HAS_SOME_Z_MS_PINS
case 2:
case Z_AXIS:
#if HAS_Z_MS_PINS
WRITE(Z_MS2_PIN, ms2);
#endif
Expand All @@ -3753,52 +3753,52 @@ void Stepper::report_positions() {
#endif
break;
#endif
#if HAS_I_MS_PINS
case I_AXIS: WRITE(I_MS2_PIN, ms2); break
#endif
#if HAS_J_MS_PINS
case J_AXIS: WRITE(J_MS2_PIN, ms2); break
#endif
#if HAS_K_MS_PINS
case K_AXIS: WRITE(K_MS2_PIN, ms2); break
#endif
#if HAS_U_MS_PINS
case U_AXIS: WRITE(U_MS2_PIN, ms2); break
#endif
#if HAS_V_MS_PINS
case V_AXIS: WRITE(V_MS2_PIN, ms2); break
#endif
#if HAS_W_MS_PINS
case W_AXIS: WRITE(W_MS2_PIN, ms2); break
#endif
#if HAS_E0_MS_PINS
case 3: WRITE(E0_MS2_PIN, ms2); break;
case E_AXIS: WRITE(E0_MS2_PIN, ms2); break;
#endif
#if HAS_E1_MS_PINS
case 4: WRITE(E1_MS2_PIN, ms2); break;
case (E_AXIS + 1): WRITE(E1_MS2_PIN, ms2); break;
#endif
#if HAS_E2_MS_PINS
case 5: WRITE(E2_MS2_PIN, ms2); break;
case (E_AXIS + 2): WRITE(E2_MS2_PIN, ms2); break;
#endif
#if HAS_E3_MS_PINS
case 6: WRITE(E3_MS2_PIN, ms2); break;
case (E_AXIS + 3): WRITE(E3_MS2_PIN, ms2); break;
#endif
#if HAS_E4_MS_PINS
case 7: WRITE(E4_MS2_PIN, ms2); break;
case (E_AXIS + 4): WRITE(E4_MS2_PIN, ms2); break;
#endif
#if HAS_E5_MS_PINS
case 8: WRITE(E5_MS2_PIN, ms2); break;
case (E_AXIS + 5): WRITE(E5_MS2_PIN, ms2); break;
#endif
#if HAS_E6_MS_PINS
case 9: WRITE(E6_MS2_PIN, ms2); break;
case (E_AXIS + 6): WRITE(E6_MS2_PIN, ms2); break;
#endif
#if HAS_E7_MS_PINS
case 10: WRITE(E7_MS2_PIN, ms2); break;
#endif
#if HAS_I_MS_PINS
case 11: WRITE(I_MS2_PIN, ms2); break
#endif
#if HAS_J_MS_PINS
case 12: WRITE(J_MS2_PIN, ms2); break
#endif
#if HAS_K_MS_PINS
case 13: WRITE(K_MS2_PIN, ms2); break
#endif
#if HAS_U_MS_PINS
case 14: WRITE(U_MS2_PIN, ms2); break
#endif
#if HAS_V_MS_PINS
case 15: WRITE(V_MS2_PIN, ms2); break
#endif
#if HAS_W_MS_PINS
case 16: WRITE(W_MS2_PIN, ms2); break
case (E_AXIS + 7): WRITE(E7_MS2_PIN, ms2); break;
#endif
}
if (ms3 >= 0) switch (driver) {
#if HAS_X_MS_PINS || HAS_X2_MS_PINS
case 0:
case X_AXIS:
#if HAS_X_MS_PINS && PIN_EXISTS(X_MS3)
WRITE(X_MS3_PIN, ms3);
#endif
Expand All @@ -3808,7 +3808,7 @@ void Stepper::report_positions() {
break;
#endif
#if HAS_Y_MS_PINS || HAS_Y2_MS_PINS
case 1:
case Y_AXIS:
#if HAS_Y_MS_PINS && PIN_EXISTS(Y_MS3)
WRITE(Y_MS3_PIN, ms3);
#endif
Expand All @@ -3818,7 +3818,7 @@ void Stepper::report_positions() {
break;
#endif
#if HAS_SOME_Z_MS_PINS
case 2:
case Z_AXIS:
#if HAS_Z_MS_PINS && PIN_EXISTS(Z_MS3)
WRITE(Z_MS3_PIN, ms3);
#endif
Expand All @@ -3833,29 +3833,47 @@ void Stepper::report_positions() {
#endif
break;
#endif
#if HAS_I_MS_PINS
case I_AXIS: WRITE(I_MS3_PIN, ms3); break
#endif
#if HAS_J_MS_PINS
case J_AXIS: WRITE(J_MS3_PIN, ms3); break
#endif
#if HAS_K_MS_PINS
case K_AXIS: WRITE(K_MS3_PIN, ms3); break
#endif
#if HAS_U_MS_PINS
case U_AXIS: WRITE(U_MS3_PIN, ms3); break
#endif
#if HAS_V_MS_PINS
case V_AXIS: WRITE(V_MS3_PIN, ms3); break
#endif
#if HAS_W_MS_PINS
case W_AXIS: WRITE(W_MS3_PIN, ms3); break
#endif
#if HAS_E0_MS_PINS && PIN_EXISTS(E0_MS3)
case 3: WRITE(E0_MS3_PIN, ms3); break;
case E_AXIS: WRITE(E0_MS3_PIN, ms3); break;
#endif
#if HAS_E1_MS_PINS && PIN_EXISTS(E1_MS3)
case 4: WRITE(E1_MS3_PIN, ms3); break;
case (E_AXIS + 1): WRITE(E1_MS3_PIN, ms3); break;
#endif
#if HAS_E2_MS_PINS && PIN_EXISTS(E2_MS3)
case 5: WRITE(E2_MS3_PIN, ms3); break;
case (E_AXIS + 2): WRITE(E2_MS3_PIN, ms3); break;
#endif
#if HAS_E3_MS_PINS && PIN_EXISTS(E3_MS3)
case 6: WRITE(E3_MS3_PIN, ms3); break;
case (E_AXIS + 3): WRITE(E3_MS3_PIN, ms3); break;
#endif
#if HAS_E4_MS_PINS && PIN_EXISTS(E4_MS3)
case 7: WRITE(E4_MS3_PIN, ms3); break;
case (E_AXIS + 4): WRITE(E4_MS3_PIN, ms3); break;
#endif
#if HAS_E5_MS_PINS && PIN_EXISTS(E5_MS3)
case 8: WRITE(E5_MS3_PIN, ms3); break;
case (E_AXIS + 5): WRITE(E5_MS3_PIN, ms3); break;
#endif
#if HAS_E6_MS_PINS && PIN_EXISTS(E6_MS3)
case 9: WRITE(E6_MS3_PIN, ms3); break;
case (E_AXIS + 6): WRITE(E6_MS3_PIN, ms3); break;
#endif
#if HAS_E7_MS_PINS && PIN_EXISTS(E7_MS3)
case 10: WRITE(E7_MS3_PIN, ms3); break;
case (E_AXIS + 7): WRITE(E7_MS3_PIN, ms3); break;
#endif
}
}
Expand Down