Skip to content

Commit fb9816d

Browse files
gzigzigzeovgadreau
authored andcommitted
MarkForged kinematics (MarlinFirmware#19235)
1 parent 1d43d95 commit fb9816d

File tree

9 files changed

+100
-34
lines changed

9 files changed

+100
-34
lines changed

Marlin/Configuration.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -613,14 +613,15 @@
613613

614614
// @section machine
615615

616-
// Uncomment one of these options to enable CoreXY, CoreXZ, or CoreYZ kinematics
616+
// Enable one of the options below for CoreXY, CoreXZ, or CoreYZ kinematics,
617617
// either in the usual order or reversed
618618
//#define COREXY
619619
//#define COREXZ
620620
//#define COREYZ
621621
//#define COREYX
622622
//#define COREZX
623623
//#define COREZY
624+
//#define MARKFORGED_XY // MarkForged. See https://reprap.org/forum/read.php?152,504042
624625

625626
//===========================================================================
626627
//============================== Endstop Settings ===========================

Marlin/src/core/utility.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,11 @@ void safe_delay(millis_t ms) {
5757

5858
void log_machine_info() {
5959
SERIAL_ECHOLNPGM("Machine Type: "
60-
TERN_(DELTA, "Delta")
61-
TERN_(IS_SCARA, "SCARA")
62-
TERN_(IS_CORE, "Core")
63-
TERN_(IS_CARTESIAN, "Cartesian")
60+
TERN_(DELTA, "Delta")
61+
TERN_(IS_SCARA, "SCARA")
62+
TERN_(IS_CORE, "Core")
63+
TERN_(MARKFORGED_XY, "MarkForged")
64+
TERN_(IS_CARTESIAN, "Cartesian")
6465
);
6566

6667
SERIAL_ECHOLNPGM("Probe: "

Marlin/src/gcode/host/M360.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,11 @@ void GcodeSuite::M360() {
145145

146146
config_prefix(PSTR("PrinterType"));
147147
SERIAL_ECHOLNPGM(
148-
TERN_(DELTA, "Delta")
149-
TERN_(IS_SCARA, "SCARA")
150-
TERN_(IS_CORE, "Core")
151-
TERN_(IS_CARTESIAN, "Cartesian")
148+
TERN_(DELTA, "Delta")
149+
TERN_(IS_SCARA, "SCARA")
150+
TERN_(IS_CORE, "Core")
151+
TERN_(MARKFORGED_XY, "MarkForged")
152+
TERN_(IS_CARTESIAN, "Cartesian")
152153
);
153154

154155
//

Marlin/src/inc/Conditionals_post.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,16 @@
149149
#define CORE_AXIS_2 C_AXIS
150150
#endif
151151
#define CORESIGN(n) (ANY(COREYX, COREZX, COREZY) ? (-(n)) : (n))
152+
#elif ENABLED(MARKFORGED_XY)
153+
// Markforged kinematics
154+
#define CORE_AXIS_1 A_AXIS
155+
#define CORE_AXIS_2 B_AXIS
156+
#define NORMAL_AXIS Z_AXIS
152157
#endif
153158

154159
// Calibration codes only for non-core axes
155160
#if EITHER(BACKLASH_GCODE, CALIBRATION_GCODE)
156-
#if IS_CORE
161+
#if EITHER(IS_CORE, MARKFORGED_XY)
157162
#define X_AXIS_INDEX 0
158163
#define Y_AXIS_INDEX 1
159164
#define Z_AXIS_INDEX 2

Marlin/src/inc/SanityCheck.h

+13-4
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
764764
#if ENABLED(BABYSTEPPING)
765765
#if ENABLED(SCARA)
766766
#error "BABYSTEPPING is not implemented for SCARA yet."
767+
#elif BOTH(MARKFORGED_XY, BABYSTEP_XY)
768+
#error "BABYSTEPPING only implemented for Z axis on MarkForged."
767769
#elif BOTH(DELTA, BABYSTEP_XY)
768770
#error "BABYSTEPPING only implemented for Z axis on deltabots."
769771
#elif BOTH(BABYSTEP_ZPROBE_OFFSET, MESH_BED_LEVELING)
@@ -1155,8 +1157,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
11551157
+ ENABLED(COREYZ) \
11561158
+ ENABLED(COREYX) \
11571159
+ ENABLED(COREZX) \
1158-
+ ENABLED(COREZY)
1159-
#error "Please enable only one of DELTA, MORGAN_SCARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, or COREZY."
1160+
+ ENABLED(COREZY) \
1161+
+ ENABLED(MARKFORGED_XY)
1162+
#error "Please enable only one of DELTA, MORGAN_SCARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, COREZY, or MARKFORGED_XY."
11601163
#endif
11611164

11621165
/**
@@ -1576,8 +1579,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
15761579
#if ENABLED(DUAL_X_CARRIAGE)
15771580
#if EXTRUDERS < 2
15781581
#error "DUAL_X_CARRIAGE requires 2 (or more) extruders."
1579-
#elif CORE_IS_XY || CORE_IS_XZ
1580-
#error "DUAL_X_CARRIAGE cannot be used with COREXY, COREYX, COREXZ, or COREZX."
1582+
#elif ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY)
1583+
#error "DUAL_X_CARRIAGE cannot be used with COREXY, COREYX, COREXZ, COREZX, or MARKFORGED_XY."
15811584
#elif !GOOD_AXIS_PINS(X2)
15821585
#error "DUAL_X_CARRIAGE requires X2 stepper pins to be defined."
15831586
#elif !HAS_X_MAX
@@ -2533,6 +2536,8 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
25332536
#error "CoreXZ requires both X and Z to use sensorless homing if either one does."
25342537
#elif CORE_IS_YZ && Y_SENSORLESS != Z_SENSORLESS && !HOMING_Z_WITH_PROBE
25352538
#error "CoreYZ requires both Y and Z to use sensorless homing if either one does."
2539+
#elif ENABLED(MARKFORGED_XY) && X_SENSORLESS != Y_SENSORLESS
2540+
#error "MARKFORGED_XY requires both X and Y to use sensorless homing if either one does."
25362541
#endif
25372542

25382543
// Other TMC feature requirements
@@ -2848,6 +2853,10 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
28482853
#error "BACKLASH_COMPENSATION requires BACKLASH_DISTANCE_MM."
28492854
#elif !defined(BACKLASH_CORRECTION)
28502855
#error "BACKLASH_COMPENSATION requires BACKLASH_CORRECTION."
2856+
#elif ENABLED(MARKFORGED_XY)
2857+
constexpr float backlash_arr[] = BACKLASH_DISTANCE_MM;
2858+
static_assert(!backlash_arr[CORE_AXIS_1] && !backlash_arr[CORE_AXIS_2],
2859+
"BACKLASH_COMPENSATION can only apply to " STRINGIFY(NORMAL_AXIS) " on a MarkForged system.");
28512860
#elif IS_CORE
28522861
constexpr float backlash_arr[] = BACKLASH_DISTANCE_MM;
28532862
static_assert(!backlash_arr[CORE_AXIS_1] && !backlash_arr[CORE_AXIS_2],

Marlin/src/module/endstops.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -498,7 +498,7 @@ void Endstops::update() {
498498
#define UPDATE_ENDSTOP_BIT(AXIS, MINMAX) SET_BIT_TO(live_state, _ENDSTOP(AXIS, MINMAX), (READ(_ENDSTOP_PIN(AXIS, MINMAX)) != _ENDSTOP_INVERTING(AXIS, MINMAX)))
499499
#define COPY_LIVE_STATE(SRC_BIT, DST_BIT) SET_BIT_TO(live_state, DST_BIT, TEST(live_state, SRC_BIT))
500500

501-
#if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && !(CORE_IS_XY || CORE_IS_XZ)
501+
#if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && NONE(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY)
502502
// If G38 command is active check Z_MIN_PROBE for ALL movement
503503
if (G38_move) UPDATE_ENDSTOP_BIT(Z, MIN_PROBE);
504504
#endif
@@ -514,12 +514,12 @@ void Endstops::update() {
514514
#endif
515515

516516
// Use HEAD for core axes, AXIS for others
517-
#if CORE_IS_XY || CORE_IS_XZ
517+
#if ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY)
518518
#define X_AXIS_HEAD X_HEAD
519519
#else
520520
#define X_AXIS_HEAD X_AXIS
521521
#endif
522-
#if CORE_IS_XY || CORE_IS_YZ
522+
#if ANY(CORE_IS_XY, CORE_IS_YZ, MARKFORGED_XY)
523523
#define Y_AXIS_HEAD Y_HEAD
524524
#else
525525
#define Y_AXIS_HEAD Y_AXIS
@@ -736,7 +736,7 @@ void Endstops::update() {
736736
#define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_DUAL_ENDSTOP(Z, MINMAX)
737737
#endif
738738

739-
#if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && !(CORE_IS_XY || CORE_IS_XZ)
739+
#if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && NONE(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY)
740740
#if ENABLED(G38_PROBE_AWAY)
741741
#define _G38_OPEN_STATE (G38_move >= 4)
742742
#else
@@ -865,7 +865,7 @@ void Endstops::update() {
865865
bool hit = false;
866866
#if X_SPI_SENSORLESS
867867
if (tmc_spi_homing.x && (stepperX.test_stall_status()
868-
#if CORE_IS_XY && Y_SPI_SENSORLESS
868+
#if ANY(CORE_IS_XY, MARKFORGED_XY) && Y_SPI_SENSORLESS
869869
|| stepperY.test_stall_status()
870870
#elif CORE_IS_XZ && Z_SPI_SENSORLESS
871871
|| stepperZ.test_stall_status()
@@ -877,7 +877,7 @@ void Endstops::update() {
877877
#endif
878878
#if Y_SPI_SENSORLESS
879879
if (tmc_spi_homing.y && (stepperY.test_stall_status()
880-
#if CORE_IS_XY && X_SPI_SENSORLESS
880+
#if ANY(CORE_IS_XY, MARKFORGED_XY) && X_SPI_SENSORLESS
881881
|| stepperX.test_stall_status()
882882
#elif CORE_IS_YZ && Z_SPI_SENSORLESS
883883
|| stepperZ.test_stall_status()

Marlin/src/module/motion.cpp

+10-7
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) {
11521152
#if AXIS_HAS_STALLGUARD(X2)
11531153
stealth_states.x2 = tmc_enable_stallguard(stepperX2);
11541154
#endif
1155-
#if CORE_IS_XY && Y_SENSORLESS
1155+
#if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS
11561156
stealth_states.y = tmc_enable_stallguard(stepperY);
11571157
#elif CORE_IS_XZ && Z_SENSORLESS
11581158
stealth_states.z = tmc_enable_stallguard(stepperZ);
@@ -1165,7 +1165,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) {
11651165
#if AXIS_HAS_STALLGUARD(Y2)
11661166
stealth_states.y2 = tmc_enable_stallguard(stepperY2);
11671167
#endif
1168-
#if CORE_IS_XY && X_SENSORLESS
1168+
#if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS
11691169
stealth_states.x = tmc_enable_stallguard(stepperX);
11701170
#elif CORE_IS_YZ && Z_SENSORLESS
11711171
stealth_states.z = tmc_enable_stallguard(stepperZ);
@@ -1216,7 +1216,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) {
12161216
#if AXIS_HAS_STALLGUARD(X2)
12171217
tmc_disable_stallguard(stepperX2, enable_stealth.x2);
12181218
#endif
1219-
#if CORE_IS_XY && Y_SENSORLESS
1219+
#if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS
12201220
tmc_disable_stallguard(stepperY, enable_stealth.y);
12211221
#elif CORE_IS_XZ && Z_SENSORLESS
12221222
tmc_disable_stallguard(stepperZ, enable_stealth.z);
@@ -1229,7 +1229,7 @@ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) {
12291229
#if AXIS_HAS_STALLGUARD(Y2)
12301230
tmc_disable_stallguard(stepperY2, enable_stealth.y2);
12311231
#endif
1232-
#if CORE_IS_XY && X_SENSORLESS
1232+
#if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS
12331233
tmc_disable_stallguard(stepperX, enable_stealth.x);
12341234
#elif CORE_IS_YZ && Z_SENSORLESS
12351235
tmc_disable_stallguard(stepperZ, enable_stealth.z);
@@ -1789,7 +1789,7 @@ void homeaxis(const AxisEnum axis) {
17891789
do_homing_move(axis, adjDistance, get_homing_bump_feedrate(axis));
17901790
}
17911791

1792-
#else // CARTESIAN / CORE
1792+
#else // CARTESIAN / CORE / MARKFORGED_XY
17931793

17941794
set_axis_is_at_home(axis);
17951795
sync_plan_position();
@@ -1818,8 +1818,11 @@ void homeaxis(const AxisEnum axis) {
18181818

18191819
#if ENABLED(SENSORLESS_HOMING)
18201820
planner.synchronize();
1821-
if (TERN0(IS_CORE, axis != NORMAL_AXIS))
1822-
safe_delay(200); // Short delay to allow belts to spring back
1821+
if (false
1822+
#if EITHER(IS_CORE, MARKFORGED_XY)
1823+
|| axis != NORMAL_AXIS
1824+
#endif
1825+
) safe_delay(200); // Short delay to allow belts to spring back
18231826
#endif
18241827
}
18251828
#endif

Marlin/src/module/planner.cpp

+43-5
Original file line numberDiff line numberDiff line change
@@ -1614,6 +1614,7 @@ void Planner::finish_and_disable() {
16141614
float Planner::get_axis_position_mm(const AxisEnum axis) {
16151615
float axis_steps;
16161616
#if IS_CORE
1617+
16171618
// Requesting one of the "core" axes?
16181619
if (axis == CORE_AXIS_1 || axis == CORE_AXIS_2) {
16191620

@@ -1631,9 +1632,30 @@ float Planner::get_axis_position_mm(const AxisEnum axis) {
16311632
}
16321633
else
16331634
axis_steps = stepper.position(axis);
1635+
1636+
#elif ENABLED(MARKFORGED_XY)
1637+
1638+
// Requesting one of the joined axes?
1639+
if (axis == CORE_AXIS_1 || axis == CORE_AXIS_2) {
1640+
// Protect the access to the position.
1641+
const bool was_enabled = stepper.suspend();
1642+
1643+
const int32_t p1 = stepper.position(CORE_AXIS_1),
1644+
p2 = stepper.position(CORE_AXIS_2);
1645+
1646+
if (was_enabled) stepper.wake_up();
1647+
1648+
axis_steps = ((axis == CORE_AXIS_1) ? p1 - p2 : p2);
1649+
}
1650+
else
1651+
axis_steps = stepper.position(axis);
1652+
16341653
#else
1654+
16351655
axis_steps = stepper.position(axis);
1656+
16361657
#endif
1658+
16371659
return axis_steps * steps_to_mm[axis];
16381660
}
16391661

@@ -1808,6 +1830,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
18081830
if (dc < 0) SBI(dm, Z_HEAD); // ...and Z
18091831
if (db + dc < 0) SBI(dm, B_AXIS); // Motor B direction
18101832
if (CORESIGN(db - dc) < 0) SBI(dm, C_AXIS); // Motor C direction
1833+
#elif ENABLED(MARKFORGED_XY)
1834+
if (da < 0) SBI(dm, X_HEAD); // Save the real Extruder (head) direction in X Axis
1835+
if (db < 0) SBI(dm, Y_HEAD); // ...and Y
1836+
if (dc < 0) SBI(dm, Z_AXIS);
1837+
if (da + db < 0) SBI(dm, A_AXIS); // Motor A direction
1838+
if (db < 0) SBI(dm, B_AXIS); // Motor B direction
18111839
#else
18121840
if (da < 0) SBI(dm, X_AXIS);
18131841
if (db < 0) SBI(dm, Y_AXIS);
@@ -1843,6 +1871,8 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
18431871
block->steps.set(ABS(da + dc), ABS(db), ABS(da - dc));
18441872
#elif CORE_IS_YZ
18451873
block->steps.set(ABS(da), ABS(db + dc), ABS(db - dc));
1874+
#elif ENABLED(MARKFORGED_XY)
1875+
block->steps.set(ABS(da + db), ABS(db), ABS(dc));
18461876
#elif IS_SCARA
18471877
block->steps.set(ABS(da), ABS(db), ABS(dc));
18481878
#else
@@ -1859,7 +1889,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
18591889
* Having the real displacement of the head, we can calculate the total movement length and apply the desired speed.
18601890
*/
18611891
struct DistanceMM : abce_float_t {
1862-
TERN_(IS_CORE, xyz_pos_t head);
1892+
#if EITHER(IS_CORE, MARKFORGED_XY)
1893+
xyz_pos_t head;
1894+
#endif
18631895
} steps_dist_mm;
18641896
#if IS_CORE
18651897
#if CORE_IS_XY
@@ -1881,6 +1913,12 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
18811913
steps_dist_mm.b = (db + dc) * steps_to_mm[B_AXIS];
18821914
steps_dist_mm.c = CORESIGN(db - dc) * steps_to_mm[C_AXIS];
18831915
#endif
1916+
#elif ENABLED(MARKFORGED_XY)
1917+
steps_dist_mm.head.x = da * steps_to_mm[A_AXIS];
1918+
steps_dist_mm.head.y = db * steps_to_mm[B_AXIS];
1919+
steps_dist_mm.z = dc * steps_to_mm[Z_AXIS];
1920+
steps_dist_mm.a = (da - db) * steps_to_mm[A_AXIS];
1921+
steps_dist_mm.b = db * steps_to_mm[B_AXIS];
18841922
#else
18851923
steps_dist_mm.a = da * steps_to_mm[A_AXIS];
18861924
steps_dist_mm.b = db * steps_to_mm[B_AXIS];
@@ -1907,7 +1945,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
19071945
block->millimeters = millimeters;
19081946
else
19091947
block->millimeters = SQRT(
1910-
#if CORE_IS_XY
1948+
#if EITHER(CORE_IS_XY, MARKFORGED_XY)
19111949
sq(steps_dist_mm.head.x) + sq(steps_dist_mm.head.y) + sq(steps_dist_mm.z)
19121950
#elif CORE_IS_XZ
19131951
sq(steps_dist_mm.head.x) + sq(steps_dist_mm.y) + sq(steps_dist_mm.head.z)
@@ -1964,7 +2002,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
19642002
#endif
19652003

19662004
// Enable active axes
1967-
#if CORE_IS_XY
2005+
#if EITHER(CORE_IS_XY, MARKFORGED_XY)
19682006
if (block->steps.a || block->steps.b) {
19692007
ENABLE_AXIS_X();
19702008
ENABLE_AXIS_Y();
@@ -2325,9 +2363,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
23252363
* On CoreXY the length of the vector [A,B] is SQRT(2) times the length of the head movement vector [X,Y].
23262364
* So taking Z and E into account, we cannot scale to a unit vector with "inverse_millimeters".
23272365
* => normalize the complete junction vector.
2328-
* Elsewise, when needed JD factors in the E component
2366+
* Elsewise, when needed JD will factor-in the E component
23292367
*/
2330-
if (ENABLED(IS_CORE) || esteps > 0)
2368+
if (EITHER(IS_CORE, MARKFORGED_XY) || esteps > 0)
23312369
normalize_junction_vector(unit_vec); // Normalize with XYZE components
23322370
else
23332371
unit_vec *= inverse_millimeters; // Use pre-calculated (1 / SQRT(x^2 + y^2 + z^2))

Marlin/src/module/stepper.cpp

+10-2
Original file line numberDiff line numberDiff line change
@@ -2041,6 +2041,8 @@ uint32_t Stepper::block_phase_isr() {
20412041
#define X_CMP(A,B) ((A)!=(B))
20422042
#endif
20432043
#define X_MOVE_TEST ( S_(1) != S_(2) || (S_(1) > 0 && X_CMP(D_(1),D_(2))) )
2044+
#elif ENABLED(MARKFORGED_XY)
2045+
#define X_MOVE_TEST (current_block->steps.a != current_block->steps.b)
20442046
#else
20452047
#define X_MOVE_TEST !!current_block->steps.a
20462048
#endif
@@ -2614,6 +2616,8 @@ void Stepper::_set_position(const int32_t &a, const int32_t &b, const int32_t &c
26142616
#elif CORE_IS_YZ
26152617
// coreyz planning
26162618
count_position.set(a, b + c, CORESIGN(b - c));
2619+
#elif ENABLED(MARKFORGED_XY)
2620+
count_position.set(a - b, b, c);
26172621
#else
26182622
// default non-h-bot planning
26192623
count_position.set(a, b, c);
@@ -2680,6 +2684,10 @@ void Stepper::endstop_triggered(const AxisEnum axis) {
26802684
? CORESIGN(count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2])
26812685
: count_position[CORE_AXIS_1] + count_position[CORE_AXIS_2]
26822686
) * double(0.5)
2687+
#elif ENABLED(MARKFORGED_XY)
2688+
axis == CORE_AXIS_1
2689+
? count_position[CORE_AXIS_1] - count_position[CORE_AXIS_2]
2690+
: count_position[CORE_AXIS_2]
26832691
#else // !IS_CORE
26842692
count_position[axis]
26852693
#endif
@@ -2709,12 +2717,12 @@ int32_t Stepper::triggered_position(const AxisEnum axis) {
27092717
}
27102718

27112719
void Stepper::report_a_position(const xyz_long_t &pos) {
2712-
#if CORE_IS_XY || CORE_IS_XZ || ENABLED(DELTA) || IS_SCARA
2720+
#if ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY, DELTA, IS_SCARA)
27132721
SERIAL_ECHOPAIR(STR_COUNT_A, pos.x, " B:", pos.y);
27142722
#else
27152723
SERIAL_ECHOPAIR_P(PSTR(STR_COUNT_X), pos.x, SP_Y_LBL, pos.y);
27162724
#endif
2717-
#if CORE_IS_XZ || CORE_IS_YZ || ENABLED(DELTA)
2725+
#if ANY(CORE_IS_XZ, CORE_IS_YZ, DELTA)
27182726
SERIAL_ECHOLNPAIR(" C:", pos.z);
27192727
#else
27202728
SERIAL_ECHOLNPAIR_P(SP_Z_LBL, pos.z);

0 commit comments

Comments
 (0)