diff --git a/Marlin/G26_Mesh_Validation_Tool.cpp b/Marlin/G26_Mesh_Validation_Tool.cpp index 8018cb741..1abe88e60 100644 --- a/Marlin/G26_Mesh_Validation_Tool.cpp +++ b/Marlin/G26_Mesh_Validation_Tool.cpp @@ -166,24 +166,15 @@ #if ENABLED(NEWPANEL) /** - * Detect is_lcd_clicked, debounce it, and return true for cancel + * If the LCD is clicked, cancel, wait for release, return true */ bool user_canceled() { if (!is_lcd_clicked()) return false; // Return if the button isn't pressed - - #if ENABLED(ULTRA_LCD) - lcd_setstatusPGM(PSTR("Mesh Validation Stopped."), 99); + lcd_setstatusPGM(PSTR("Mesh Validation Stopped."), 99); + #if ENABLED(ULTIPANEL) lcd_quick_feedback(); #endif - - safe_delay(10); // Wait for click to settle - while (!is_lcd_clicked()) idle(); // Wait for button press again? - - // If the button is suddenly pressed again, - // ask the user to resolve the issue - lcd_setstatusPGM(PSTR("Release button"), 99); // will never appear... wait_for_release(); - lcd_reset_status(); return true; } diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 928b721b1..5f5301e6d 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -1719,7 +1719,6 @@ static void setup_for_endstop_or_probe_move() { saved_feedrate_percentage = feedrate_percentage; feedrate_percentage = 100; refresh_cmd_timeout(); - planner.split_first_move = false; } static void clean_up_after_endstop_or_probe_move() { @@ -1729,7 +1728,6 @@ static void clean_up_after_endstop_or_probe_move() { feedrate_mm_s = saved_feedrate_mm_s; feedrate_percentage = saved_feedrate_percentage; refresh_cmd_timeout(); - planner.split_first_move = true; } #if HAS_BED_PROBE diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index 39715c0cf..6ce8261f9 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -92,8 +92,6 @@ float Planner::max_feedrate_mm_s[XYZE_N], // Max speeds in mm per second uint8_t Planner::last_extruder = 0; // Respond to extruder change #endif -bool Planner::split_first_move = true; - int16_t Planner::flow_percentage[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(100); // Extrusion factor for each extruder float Planner::e_factor[EXTRUDERS], // The flow percentage and volumetric multiplier combine to scale E movement @@ -1441,7 +1439,7 @@ void Planner::_buffer_line(const float &a, const float &b, const float &c, const position[E_AXIS] = target[E_AXIS]; // Always split the first move into two (if not homing or probing) - if (!blocks_queued() && split_first_move) { + if (!blocks_queued()) { #define _BETWEEN(A) (position[A##_AXIS] + target[A##_AXIS]) >> 1 const int32_t between[XYZE] = { _BETWEEN(X), _BETWEEN(Y), _BETWEEN(Z), _BETWEEN(E) }; DISABLE_STEPPER_DRIVER_INTERRUPT(); diff --git a/Marlin/planner.h b/Marlin/planner.h index 079e0296c..85ebcba08 100644 --- a/Marlin/planner.h +++ b/Marlin/planner.h @@ -161,7 +161,6 @@ class Planner { travel_acceleration, // Travel acceleration mm/s^2 DEFAULT ACCELERATION for all NON printing moves. M204 MXXXX max_jerk[XYZE], // The largest speed change requiring no acceleration min_travel_feedrate_mm_s; - static bool split_first_move; #if HAS_LEVELING static bool leveling_active; // Flag that bed leveling is enabled diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp index a74c317e8..96872450a 100644 --- a/Marlin/stepper.cpp +++ b/Marlin/stepper.cpp @@ -1224,12 +1224,7 @@ void Stepper::finish_and_disable() { } void Stepper::quick_stop() { - #if ENABLED(AUTO_BED_LEVELING_UBL) && ENABLED(ULTIPANEL) - if (!ubl.lcd_map_control) - cleaning_buffer_counter = 5000; - #else - cleaning_buffer_counter = 5000; - #endif + cleaning_buffer_counter = 5000; DISABLE_STEPPER_DRIVER_INTERRUPT(); while (planner.blocks_queued()) planner.discard_current_block(); current_block = NULL; @@ -1255,6 +1250,7 @@ void Stepper::endstop_triggered(AxisEnum axis) { #endif // !COREXY && !COREXZ && !COREYZ kill_current_block(); + cleaning_buffer_counter = -(BLOCK_BUFFER_SIZE - 1); // Ignore remaining blocks } void Stepper::report_positions() { diff --git a/Marlin/stepper.h b/Marlin/stepper.h index a19810376..56a2537b0 100644 --- a/Marlin/stepper.h +++ b/Marlin/stepper.h @@ -101,10 +101,11 @@ class Stepper { static uint32_t motor_current_setting[3]; #endif + static int16_t cleaning_buffer_counter; + private: static uint8_t last_direction_bits; // The next stepping-bits to be output - static int16_t cleaning_buffer_counter; #if ENABLED(X_DUAL_ENDSTOPS) static bool locked_x_motor, locked_x2_motor; diff --git a/Marlin/ubl_G29.cpp b/Marlin/ubl_G29.cpp index 0acc398ff..8800c6e9a 100644 --- a/Marlin/ubl_G29.cpp +++ b/Marlin/ubl_G29.cpp @@ -311,8 +311,7 @@ void unified_bed_leveling::G29() { if (!settings.calc_num_meshes()) { - SERIAL_PROTOCOLLNPGM("?You need to enable your EEPROM and initialize it"); - SERIAL_PROTOCOLLNPGM("with M502, M500, M501 in that order.\n"); + SERIAL_PROTOCOLLNPGM("?Enable EEPROM and init with M502, M500.\n"); return; } diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index 3add5adae..a20a7b37f 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -559,7 +559,7 @@ uint16_t max_display_update_time = 0; if (no_reentry) return; // Make this the current handler till all moves are done no_reentry = true; - screenFunc_t old_screen = currentScreen; + const screenFunc_t old_screen = currentScreen; lcd_goto_screen(_lcd_synchronize); stepper.synchronize(); no_reentry = false; @@ -2336,6 +2336,19 @@ void kill_screen(const char* lcd_msg) { void set_current_from_steppers_for_axis(const AxisEnum axis); void sync_plan_position(); + void _lcd_do_nothing() {} + void _lcd_hard_stop() { + stepper.quick_stop(); + const screenFunc_t old_screen = currentScreen; + currentScreen = _lcd_do_nothing; + while (planner.movesplanned()) idle(); + currentScreen = old_screen; + stepper.cleaning_buffer_counter = 0; + set_current_from_steppers_for_axis(ALL_AXES); + sync_plan_position(); + refresh_cmd_timeout(); + } + void _lcd_ubl_output_map_lcd() { static int16_t step_scaler = 0; @@ -2380,15 +2393,10 @@ void kill_screen(const char* lcd_msg) { if (lcdDrawUpdate) { lcd_implementation_ubl_plot(x_plot, y_plot); - ubl_map_move_to_xy(); // Move to current location + if (planner.movesplanned()) // If the nozzle is already moving, cancel the move. + _lcd_hard_stop(); - if (planner.movesplanned() > 1) { // if the nozzle is moving, cancel the move. There is a new location - stepper.quick_stop(); - set_current_from_steppers_for_axis(ALL_AXES); - sync_plan_position(); - ubl_map_move_to_xy(); // Move to new location - refresh_cmd_timeout(); - } + ubl_map_move_to_xy(); // Move to new location } }