|
|
@ -529,11 +529,11 @@ void Endstops::update() { |
|
|
|
// With Dual X, endstops are only checked in the homing direction for the active extruder
|
|
|
|
#if ENABLED(DUAL_X_CARRIAGE) |
|
|
|
#define E0_ACTIVE stepper.movement_extruder() == 0 |
|
|
|
#define X_MIN_TEST ((X_HOME_DIR < 0 && E0_ACTIVE) || (X2_HOME_DIR < 0 && !E0_ACTIVE)) |
|
|
|
#define X_MAX_TEST ((X_HOME_DIR > 0 && E0_ACTIVE) || (X2_HOME_DIR > 0 && !E0_ACTIVE)) |
|
|
|
#define X_MIN_TEST() ((X_HOME_DIR < 0 && E0_ACTIVE) || (X2_HOME_DIR < 0 && !E0_ACTIVE)) |
|
|
|
#define X_MAX_TEST() ((X_HOME_DIR > 0 && E0_ACTIVE) || (X2_HOME_DIR > 0 && !E0_ACTIVE)) |
|
|
|
#else |
|
|
|
#define X_MIN_TEST true |
|
|
|
#define X_MAX_TEST true |
|
|
|
#define X_MIN_TEST() true |
|
|
|
#define X_MAX_TEST() true |
|
|
|
#endif |
|
|
|
|
|
|
|
// Use HEAD for core axes, AXIS for others
|
|
|
@ -690,7 +690,7 @@ void Endstops::update() { |
|
|
|
#define _ENDSTOP_HIT(AXIS, MINMAX) SBI(hit_state, _ENDSTOP(AXIS, MINMAX)) |
|
|
|
|
|
|
|
// Call the endstop triggered routine for single endstops
|
|
|
|
#define PROCESS_ENDSTOP(AXIS,MINMAX) do { \ |
|
|
|
#define PROCESS_ENDSTOP(AXIS, MINMAX) do { \ |
|
|
|
if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX))) { \ |
|
|
|
_ENDSTOP_HIT(AXIS, MINMAX); \ |
|
|
|
planner.endstop_triggered(_AXIS(AXIS)); \ |
|
|
@ -698,36 +698,58 @@ void Endstops::update() { |
|
|
|
}while(0) |
|
|
|
|
|
|
|
// Call the endstop triggered routine for dual endstops
|
|
|
|
#define PROCESS_DUAL_ENDSTOP(AXIS1, AXIS2, MINMAX) do { \ |
|
|
|
const byte dual_hit = TEST_ENDSTOP(_ENDSTOP(AXIS1, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(AXIS2, MINMAX)) << 1); \ |
|
|
|
#define PROCESS_DUAL_ENDSTOP(A, MINMAX) do { \ |
|
|
|
const byte dual_hit = TEST_ENDSTOP(_ENDSTOP(A, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(A##2, MINMAX)) << 1); \ |
|
|
|
if (dual_hit) { \ |
|
|
|
_ENDSTOP_HIT(AXIS1, MINMAX); \ |
|
|
|
_ENDSTOP_HIT(A, MINMAX); \ |
|
|
|
/* if not performing home or if both endstops were trigged during homing... */ \ |
|
|
|
if (!stepper.separate_multi_axis || dual_hit == 0b11) \ |
|
|
|
planner.endstop_triggered(_AXIS(AXIS1)); \ |
|
|
|
planner.endstop_triggered(_AXIS(A)); \ |
|
|
|
} \ |
|
|
|
}while(0) |
|
|
|
|
|
|
|
#define PROCESS_TRIPLE_ENDSTOP(AXIS1, AXIS2, AXIS3, MINMAX) do { \ |
|
|
|
const byte triple_hit = TEST_ENDSTOP(_ENDSTOP(AXIS1, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(AXIS2, MINMAX)) << 1) | (TEST_ENDSTOP(_ENDSTOP(AXIS3, MINMAX)) << 2); \ |
|
|
|
#define PROCESS_TRIPLE_ENDSTOP(A, MINMAX) do { \ |
|
|
|
const byte triple_hit = TEST_ENDSTOP(_ENDSTOP(A, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(A##2, MINMAX)) << 1) | (TEST_ENDSTOP(_ENDSTOP(A##3, MINMAX)) << 2); \ |
|
|
|
if (triple_hit) { \ |
|
|
|
_ENDSTOP_HIT(AXIS1, MINMAX); \ |
|
|
|
_ENDSTOP_HIT(A, MINMAX); \ |
|
|
|
/* if not performing home or if both endstops were trigged during homing... */ \ |
|
|
|
if (!stepper.separate_multi_axis || triple_hit == 0b111) \ |
|
|
|
planner.endstop_triggered(_AXIS(AXIS1)); \ |
|
|
|
planner.endstop_triggered(_AXIS(A)); \ |
|
|
|
} \ |
|
|
|
}while(0) |
|
|
|
|
|
|
|
#define PROCESS_QUAD_ENDSTOP(AXIS1, AXIS2, AXIS3, AXIS4, MINMAX) do { \ |
|
|
|
const byte quad_hit = TEST_ENDSTOP(_ENDSTOP(AXIS1, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(AXIS2, MINMAX)) << 1) | (TEST_ENDSTOP(_ENDSTOP(AXIS3, MINMAX)) << 2) | (TEST_ENDSTOP(_ENDSTOP(AXIS4, MINMAX)) << 3); \ |
|
|
|
#define PROCESS_QUAD_ENDSTOP(A, MINMAX) do { \ |
|
|
|
const byte quad_hit = TEST_ENDSTOP(_ENDSTOP(A, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(A##2, MINMAX)) << 1) | (TEST_ENDSTOP(_ENDSTOP(A##3, MINMAX)) << 2) | (TEST_ENDSTOP(_ENDSTOP(A##4, MINMAX)) << 3); \ |
|
|
|
if (quad_hit) { \ |
|
|
|
_ENDSTOP_HIT(AXIS1, MINMAX); \ |
|
|
|
_ENDSTOP_HIT(A, MINMAX); \ |
|
|
|
/* if not performing home or if both endstops were trigged during homing... */ \ |
|
|
|
if (!stepper.separate_multi_axis || quad_hit == 0b1111) \ |
|
|
|
planner.endstop_triggered(_AXIS(AXIS1)); \ |
|
|
|
planner.endstop_triggered(_AXIS(A)); \ |
|
|
|
} \ |
|
|
|
}while(0) |
|
|
|
|
|
|
|
#if ENABLED(X_DUAL_ENDSTOPS) |
|
|
|
#define PROCESS_ENDSTOP_X(MINMAX) PROCESS_DUAL_ENDSTOP(X, MINMAX) |
|
|
|
#else |
|
|
|
#define PROCESS_ENDSTOP_X(MINMAX) if (X_##MINMAX##_TEST()) PROCESS_ENDSTOP(X, MINMAX) |
|
|
|
#endif |
|
|
|
|
|
|
|
#if ENABLED(Y_DUAL_ENDSTOPS) |
|
|
|
#define PROCESS_ENDSTOP_Y(MINMAX) PROCESS_DUAL_ENDSTOP(Y, MINMAX) |
|
|
|
#else |
|
|
|
#define PROCESS_ENDSTOP_Y(MINMAX) PROCESS_ENDSTOP(Y, MINMAX) |
|
|
|
#endif |
|
|
|
|
|
|
|
#if DISABLED(Z_MULTI_ENDSTOPS) |
|
|
|
#define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_ENDSTOP(Z, MINMAX) |
|
|
|
#elif NUM_Z_STEPPER_DRIVERS == 4 |
|
|
|
#define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_QUAD_ENDSTOP(Z, MINMAX) |
|
|
|
#elif NUM_Z_STEPPER_DRIVERS == 3 |
|
|
|
#define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_TRIPLE_ENDSTOP(Z, MINMAX) |
|
|
|
#else |
|
|
|
#define PROCESS_ENDSTOP_Z(MINMAX) PROCESS_DUAL_ENDSTOP(Z, MINMAX) |
|
|
|
#endif |
|
|
|
|
|
|
|
#if ENABLED(G38_PROBE_TARGET) && PIN_EXISTS(Z_MIN_PROBE) && !(CORE_IS_XY || CORE_IS_XZ) |
|
|
|
#if ENABLED(G38_PROBE_AWAY) |
|
|
|
#define _G38_OPEN_STATE (G38_move >= 4) |
|
|
@ -747,20 +769,12 @@ void Endstops::update() { |
|
|
|
if (stepper.axis_is_moving(X_AXIS)) { |
|
|
|
if (stepper.motor_direction(X_AXIS_HEAD)) { // -direction
|
|
|
|
#if HAS_X_MIN || (X_SPI_SENSORLESS && X_HOME_DIR < 0) |
|
|
|
#if ENABLED(X_DUAL_ENDSTOPS) |
|
|
|
PROCESS_DUAL_ENDSTOP(X, X2, MIN); |
|
|
|
#else |
|
|
|
if (X_MIN_TEST) PROCESS_ENDSTOP(X, MIN); |
|
|
|
#endif |
|
|
|
PROCESS_ENDSTOP_X(MIN); |
|
|
|
#endif |
|
|
|
} |
|
|
|
else { // +direction
|
|
|
|
#if HAS_X_MAX || (X_SPI_SENSORLESS && X_HOME_DIR > 0) |
|
|
|
#if ENABLED(X_DUAL_ENDSTOPS) |
|
|
|
PROCESS_DUAL_ENDSTOP(X, X2, MAX); |
|
|
|
#else |
|
|
|
if (X_MAX_TEST) PROCESS_ENDSTOP(X, MAX); |
|
|
|
#endif |
|
|
|
PROCESS_ENDSTOP_X(MAX); |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
@ -768,44 +782,27 @@ void Endstops::update() { |
|
|
|
if (stepper.axis_is_moving(Y_AXIS)) { |
|
|
|
if (stepper.motor_direction(Y_AXIS_HEAD)) { // -direction
|
|
|
|
#if HAS_Y_MIN || (Y_SPI_SENSORLESS && Y_HOME_DIR < 0) |
|
|
|
#if ENABLED(Y_DUAL_ENDSTOPS) |
|
|
|
PROCESS_DUAL_ENDSTOP(Y, Y2, MIN); |
|
|
|
#else |
|
|
|
PROCESS_ENDSTOP(Y, MIN); |
|
|
|
#endif |
|
|
|
PROCESS_ENDSTOP_Y(MIN); |
|
|
|
#endif |
|
|
|
} |
|
|
|
else { // +direction
|
|
|
|
#if HAS_Y_MAX || (Y_SPI_SENSORLESS && Y_HOME_DIR > 0) |
|
|
|
#if ENABLED(Y_DUAL_ENDSTOPS) |
|
|
|
PROCESS_DUAL_ENDSTOP(Y, Y2, MAX); |
|
|
|
#else |
|
|
|
PROCESS_ENDSTOP(Y, MAX); |
|
|
|
#endif |
|
|
|
PROCESS_ENDSTOP_Y(MAX); |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (stepper.axis_is_moving(Z_AXIS)) { |
|
|
|
if (stepper.motor_direction(Z_AXIS_HEAD)) { // Z -direction. Gantry down, bed up.
|
|
|
|
|
|
|
|
#if HAS_Z_MIN || (Z_SPI_SENSORLESS && Z_HOME_DIR < 0) |
|
|
|
#if ENABLED(Z_MULTI_ENDSTOPS) |
|
|
|
#if NUM_Z_STEPPER_DRIVERS == 4 |
|
|
|
PROCESS_QUAD_ENDSTOP(Z, Z2, Z3, Z4, MIN); |
|
|
|
#elif NUM_Z_STEPPER_DRIVERS == 3 |
|
|
|
PROCESS_TRIPLE_ENDSTOP(Z, Z2, Z3, MIN); |
|
|
|
#else |
|
|
|
PROCESS_DUAL_ENDSTOP(Z, Z2, MIN); |
|
|
|
#endif |
|
|
|
#else |
|
|
|
if (true |
|
|
|
#if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) |
|
|
|
if (z_probe_enabled) PROCESS_ENDSTOP(Z, MIN); |
|
|
|
&& z_probe_enabled |
|
|
|
#elif HAS_CUSTOM_PROBE_PIN |
|
|
|
if (!z_probe_enabled) PROCESS_ENDSTOP(Z, MIN); |
|
|
|
#else |
|
|
|
PROCESS_ENDSTOP(Z, MIN); |
|
|
|
&& !z_probe_enabled |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
) PROCESS_ENDSTOP_Z(MIN); |
|
|
|
#endif |
|
|
|
|
|
|
|
// When closing the gap check the enabled probe
|
|
|
@ -816,16 +813,8 @@ void Endstops::update() { |
|
|
|
else { // Z +direction. Gantry up, bed down.
|
|
|
|
#if HAS_Z_MAX || (Z_SPI_SENSORLESS && Z_HOME_DIR > 0) |
|
|
|
#if ENABLED(Z_MULTI_ENDSTOPS) |
|
|
|
#if NUM_Z_STEPPER_DRIVERS == 4 |
|
|
|
PROCESS_QUAD_ENDSTOP(Z, Z2, Z3, Z4, MAX); |
|
|
|
#elif NUM_Z_STEPPER_DRIVERS == 3 |
|
|
|
PROCESS_TRIPLE_ENDSTOP(Z, Z2, Z3, MAX); |
|
|
|
#else |
|
|
|
PROCESS_DUAL_ENDSTOP(Z, Z2, MAX); |
|
|
|
#endif |
|
|
|
#elif !HAS_CUSTOM_PROBE_PIN || Z_MAX_PIN != Z_MIN_PROBE_PIN |
|
|
|
// If this pin is not hijacked for the bed probe
|
|
|
|
// then it belongs to the Z endstop
|
|
|
|
PROCESS_ENDSTOP_Z(MAX); |
|
|
|
#elif !HAS_CUSTOM_PROBE_PIN || Z_MAX_PIN != Z_MIN_PROBE_PIN // No probe or probe is Z_MIN || Probe is not Z_MAX
|
|
|
|
PROCESS_ENDSTOP(Z, MAX); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|