|
|
|
@ -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
|
|
|
|
|