|
|
@ -674,6 +674,15 @@ void Endstops::update() { |
|
|
|
} \ |
|
|
|
}while(0) |
|
|
|
|
|
|
|
// Core Sensorless Homing needs to test an Extra Pin
|
|
|
|
#define CORE_DIAG(QQ,A,MM) (CORE_IS_##QQ && A##_SENSORLESS && !A##_SPI_SENSORLESS && HAS_##A##_##MM) |
|
|
|
#define PROCESS_CORE_ENDSTOP(A1,M1,A2,M2) do { \ |
|
|
|
if (TEST_ENDSTOP(_ENDSTOP(A1,M1))) { \ |
|
|
|
_ENDSTOP_HIT(A2,M2); \ |
|
|
|
planner.endstop_triggered(_AXIS(A2)); \ |
|
|
|
} \ |
|
|
|
}while(0) |
|
|
|
|
|
|
|
// Call the endstop triggered routine for dual endstops
|
|
|
|
#define PROCESS_DUAL_ENDSTOP(A, MINMAX) do { \ |
|
|
|
const byte dual_hit = TEST_ENDSTOP(_ENDSTOP(A, MINMAX)) | (TEST_ENDSTOP(_ENDSTOP(A##2, MINMAX)) << 1); \ |
|
|
@ -748,11 +757,29 @@ void Endstops::update() { |
|
|
|
if (stepper.motor_direction(X_AXIS_HEAD)) { // -direction
|
|
|
|
#if HAS_X_MIN || (X_SPI_SENSORLESS && X_HOME_DIR < 0) |
|
|
|
PROCESS_ENDSTOP_X(MIN); |
|
|
|
#if CORE_DIAG(XY, Y, MIN) |
|
|
|
PROCESS_CORE_ENDSTOP(Y,MIN,X,MIN); |
|
|
|
#elif CORE_DIAG(XY, Y, MAX) |
|
|
|
PROCESS_CORE_ENDSTOP(Y,MAX,X,MIN); |
|
|
|
#elif CORE_DIAG(XZ, Z, MIN) |
|
|
|
PROCESS_CORE_ENDSTOP(Z,MIN,X,MIN); |
|
|
|
#elif CORE_DIAG(XZ, Z, MAX) |
|
|
|
PROCESS_CORE_ENDSTOP(Z,MAX,X,MIN); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
else { // +direction
|
|
|
|
#if HAS_X_MAX || (X_SPI_SENSORLESS && X_HOME_DIR > 0) |
|
|
|
PROCESS_ENDSTOP_X(MAX); |
|
|
|
#if CORE_DIAG(XY, Y, MIN) |
|
|
|
PROCESS_CORE_ENDSTOP(Y,MIN,X,MAX); |
|
|
|
#elif CORE_DIAG(XY, Y, MAX) |
|
|
|
PROCESS_CORE_ENDSTOP(Y,MAX,X,MAX); |
|
|
|
#elif CORE_DIAG(XZ, Z, MIN) |
|
|
|
PROCESS_CORE_ENDSTOP(Z,MIN,X,MAX); |
|
|
|
#elif CORE_DIAG(XZ, Z, MAX) |
|
|
|
PROCESS_CORE_ENDSTOP(Z,MAX,X,MAX); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
@ -761,11 +788,29 @@ void Endstops::update() { |
|
|
|
if (stepper.motor_direction(Y_AXIS_HEAD)) { // -direction
|
|
|
|
#if HAS_Y_MIN || (Y_SPI_SENSORLESS && Y_HOME_DIR < 0) |
|
|
|
PROCESS_ENDSTOP_Y(MIN); |
|
|
|
#if CORE_DIAG(XY, X, MIN) |
|
|
|
PROCESS_CORE_ENDSTOP(X,MIN,Y,MIN); |
|
|
|
#elif CORE_DIAG(XY, X, MAX) |
|
|
|
PROCESS_CORE_ENDSTOP(X,MAX,Y,MIN); |
|
|
|
#elif CORE_DIAG(YZ, Z, MIN) |
|
|
|
PROCESS_CORE_ENDSTOP(Z,MIN,Y,MIN); |
|
|
|
#elif CORE_DIAG(YZ, Z, MAX) |
|
|
|
PROCESS_CORE_ENDSTOP(Z,MAX,Y,MIN); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
else { // +direction
|
|
|
|
#if HAS_Y_MAX || (Y_SPI_SENSORLESS && Y_HOME_DIR > 0) |
|
|
|
PROCESS_ENDSTOP_Y(MAX); |
|
|
|
#if CORE_DIAG(XY, X, MIN) |
|
|
|
PROCESS_CORE_ENDSTOP(X,MIN,Y,MAX); |
|
|
|
#elif CORE_DIAG(XY, X, MAX) |
|
|
|
PROCESS_CORE_ENDSTOP(X,MAX,Y,MAX); |
|
|
|
#elif CORE_DIAG(YZ, Z, MIN) |
|
|
|
PROCESS_CORE_ENDSTOP(Z,MIN,Y,MAX); |
|
|
|
#elif CORE_DIAG(YZ, Z, MAX) |
|
|
|
PROCESS_CORE_ENDSTOP(Z,MAX,Y,MAX); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
@ -777,6 +822,15 @@ void Endstops::update() { |
|
|
|
if ( TERN1(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, z_probe_enabled) |
|
|
|
&& TERN1(HAS_CUSTOM_PROBE_PIN, !z_probe_enabled) |
|
|
|
) PROCESS_ENDSTOP_Z(MIN); |
|
|
|
#if CORE_DIAG(XZ, X, MIN) |
|
|
|
PROCESS_CORE_ENDSTOP(X,MIN,Z,MIN); |
|
|
|
#elif CORE_DIAG(XZ, X, MAX) |
|
|
|
PROCESS_CORE_ENDSTOP(X,MAX,Z,MIN); |
|
|
|
#elif CORE_DIAG(YZ, Y, MIN) |
|
|
|
PROCESS_CORE_ENDSTOP(Y,MIN,Z,MIN); |
|
|
|
#elif CORE_DIAG(YZ, Y, MAX) |
|
|
|
PROCESS_CORE_ENDSTOP(Y,MAX,Z,MIN); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
// When closing the gap check the enabled probe
|
|
|
@ -791,6 +845,15 @@ void Endstops::update() { |
|
|
|
#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 |
|
|
|
#if CORE_DIAG(XZ, X, MIN) |
|
|
|
PROCESS_CORE_ENDSTOP(X,MIN,Z,MAX); |
|
|
|
#elif CORE_DIAG(XZ, X, MAX) |
|
|
|
PROCESS_CORE_ENDSTOP(X,MAX,Z,MAX); |
|
|
|
#elif CORE_DIAG(YZ, Y, MIN) |
|
|
|
PROCESS_CORE_ENDSTOP(Y,MIN,Z,MAX); |
|
|
|
#elif CORE_DIAG(YZ, Y, MAX) |
|
|
|
PROCESS_CORE_ENDSTOP(Y,MAX,Z,MAX); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|