diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 335b243f11..a423aea60d 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -2242,7 +2242,6 @@ void clean_up_after_endstop_or_probe_move() { if (probe_triggered && set_bltouch_deployed(false)) return true; #endif - // Clear endstop flags endstops.hit_on_purpose(); // Get Z where the steppers were interrupted @@ -2989,6 +2988,7 @@ static void do_homing_move(const AxisEnum axis, const float distance, const floa // Tell the planner the axis is at 0 current_position[axis] = 0; + // Do the move, which is required to hit an endstop #if IS_SCARA SYNC_PLAN_POSITION_KINEMATIC(); current_position[axis] = distance; @@ -3015,7 +3015,7 @@ static void do_homing_move(const AxisEnum axis, const float distance, const floa #endif } - endstops.hit_on_purpose(); + endstops.validate_homing_move(); // Re-enable stealthChop if used. Disable diag1 pin on driver. #if ENABLED(SENSORLESS_HOMING) @@ -3725,7 +3725,9 @@ inline void gcode_G4() { #endif do_blocking_move_to_xy(1.5 * mlx * x_axis_home_dir, 1.5 * mly * home_dir(Y_AXIS), fr_mm_s); - endstops.hit_on_purpose(); // clear endstop hit flags + + endstops.validate_homing_move(); + current_position[X_AXIS] = current_position[Y_AXIS] = 0.0; #if ENABLED(SENSORLESS_HOMING) @@ -3905,7 +3907,7 @@ inline void gcode_G4() { * A delta can only safely home all axes at the same time * This is like quick_home_xy() but for 3 towers. */ - inline bool home_delta() { + inline void home_delta() { #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS(">>> home_delta", current_position); #endif @@ -3929,16 +3931,7 @@ inline void gcode_G4() { delta_sensorless_homing(false); #endif - // If an endstop was not hit, then damage can occur if homing is continued. - // This can occur if the delta height not set correctly. - if (!(endstops.trigger_state() & (_BV(X_MAX) | _BV(Y_MAX) | _BV(Z_MAX)))) { - LCD_MESSAGEPGM(MSG_ERR_HOMING_FAILED); - SERIAL_ERROR_START(); - SERIAL_ERRORLNPGM(MSG_ERR_HOMING_FAILED); - return false; - } - - endstops.hit_on_purpose(); // clear endstop hit flags + endstops.validate_homing_move(); // At least one carriage has reached the top. // Now re-home each carriage separately. @@ -3957,8 +3950,6 @@ inline void gcode_G4() { #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING)) DEBUG_POS("<<< home_delta", current_position); #endif - - return true; } #endif // DELTA @@ -5514,12 +5505,10 @@ void home_all_axes() { gcode_G28(true); } float lcd_probe_pt(const float &rx, const float &ry); - bool ac_home() { + void ac_home() { endstops.enable(true); - if (!home_delta()) - return false; + home_delta(); endstops.not_homing(); - return true; } void ac_setup(const bool reset_bed) { @@ -5972,8 +5961,7 @@ void home_all_axes() { gcode_G28(true); } ac_setup(!_0p_calibration && !_1p_calibration); - if (!_0p_calibration) - if (!ac_home()) return; + if (!_0p_calibration) ac_home(); do { // start iterations @@ -6166,7 +6154,7 @@ void home_all_axes() { gcode_G28(true); } sprintf_P(&mess[15], PSTR("%03i.x"), (int)round(zero_std_dev)); lcd_setstatus(mess); } - if (!ac_home()) return; + ac_home(); } while (((zero_std_dev < test_precision && iterations < 31) || iterations <= force_iterations) && zero_std_dev > calibration_precision); diff --git a/Marlin/endstops.cpp b/Marlin/endstops.cpp index 7a7fbc7bd6..3cffff1832 100644 --- a/Marlin/endstops.cpp +++ b/Marlin/endstops.cpp @@ -229,6 +229,12 @@ void Endstops::not_homing() { #endif } +// If the last move failed to trigger an endstop, call kill +void Endstops::validate_homing_move() { + if (!trigger_state()) kill(PSTR(MSG_ERR_HOMING_FAILED)); + hit_on_purpose(); +} + // Enable / disable endstop z-probe checking #if HAS_BED_PROBE void Endstops::enable_z_probe(const bool onoff) { diff --git a/Marlin/endstops.h b/Marlin/endstops.h index 1a10edf334..a6ea580d30 100644 --- a/Marlin/endstops.h +++ b/Marlin/endstops.h @@ -143,6 +143,9 @@ class Endstops { // Disable / Enable endstops based on ENSTOPS_ONLY_FOR_HOMING and global enable static void not_homing(); + // If the last move failed to trigger an endstop, call kill + static void validate_homing_move(); + // Clear endstops (i.e., they were hit intentionally) to suppress the report FORCE_INLINE static void hit_on_purpose() { hit_state = 0; }