From 647c04def887636790638a7674ff61675a69edb4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 21 Mar 2018 02:46:04 -0500 Subject: [PATCH] Automatically reset stepper timeout in manage_inactivity Any code that adds moves to the planner can skip resetting the stepper timeout. We can let `idle` / `manage_inactivity` reset the timer whenever it detects any moves in the planner. --- Marlin/Marlin.h | 4 +-- Marlin/Marlin_main.cpp | 74 ++++++++++++++++++------------------------ Marlin/planner.h | 2 +- Marlin/ubl_G29.cpp | 2 +- Marlin/ultralcd.cpp | 8 +---- 5 files changed, 37 insertions(+), 53 deletions(-) diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index edd9bbc6cf..961917cd9a 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -207,8 +207,8 @@ void clear_command_queue(); #endif #endif -extern millis_t previous_cmd_ms; -inline void refresh_cmd_timeout() { previous_cmd_ms = millis(); } +extern millis_t previous_move_ms; +inline void reset_stepper_timeout() { previous_move_ms = millis(); } /** * Feedrate scaling and conversion diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 3e91a87a92..24ad7a15fb 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -522,7 +522,7 @@ const char axis_codes[XYZE] = { 'X', 'Y', 'Z', 'E' }; static int serial_count; // = 0; // Inactivity shutdown -millis_t previous_cmd_ms; // = 0; +millis_t previous_move_ms; // = 0; static millis_t max_inactive_time; // = 0; static millis_t stepper_inactive_time = (DEFAULT_STEPPER_DEACTIVE_TIME) * 1000UL; @@ -1539,8 +1539,6 @@ inline void buffer_line_to_destination(const float &fr_mm_s) { if (DEBUGGING(LEVELING)) DEBUG_POS("prepare_uninterpolated_move_to_destination", destination); #endif - refresh_cmd_timeout(); - #if UBL_SEGMENTED // ubl segmented line will do z-only moves in single segment ubl.prepare_segmented_line_to(destination, MMS_SCALED(fr_mm_s ? fr_mm_s : feedrate_mm_s)); @@ -1705,7 +1703,6 @@ static void setup_for_endstop_or_probe_move() { saved_feedrate_mm_s = feedrate_mm_s; saved_feedrate_percentage = feedrate_percentage; feedrate_percentage = 100; - refresh_cmd_timeout(); } static void clean_up_after_endstop_or_probe_move() { @@ -1714,7 +1711,6 @@ static void clean_up_after_endstop_or_probe_move() { #endif feedrate_mm_s = saved_feedrate_mm_s; feedrate_percentage = saved_feedrate_percentage; - refresh_cmd_timeout(); } #if HAS_AXIS_UNHOMED_ERR @@ -2227,9 +2223,6 @@ static void clean_up_after_endstop_or_probe_move() { if (DEBUGGING(LEVELING)) DEBUG_POS(">>> run_z_probe", current_position); #endif - // Prevent stepper_inactive_time from running out and EXTRUDER_RUNOUT_PREVENT from extruding - refresh_cmd_timeout(); - // Double-probing does a fast probe followed by a slow probe #if MULTIPLE_PROBING == 2 @@ -3360,7 +3353,6 @@ inline void gcode_G0_G1( // Send the arc to the planner plan_arc(destination, arc_offset, clockwise); - refresh_cmd_timeout(); } else { // Bad arguments @@ -3373,8 +3365,7 @@ inline void gcode_G0_G1( #endif // ARC_SUPPORT void dwell(millis_t time) { - refresh_cmd_timeout(); - time += previous_cmd_ms; + time += millis(); while (PENDING(millis(), time)) idle(); } @@ -6236,10 +6227,9 @@ inline void gcode_G92() { wait_for_user = true; stepper.synchronize(); - refresh_cmd_timeout(); if (ms > 0) { - ms += previous_cmd_ms; // wait until this time for a click + ms += millis(); // wait until this time for a click while (PENDING(millis(), ms) && wait_for_user) idle(); } else { @@ -7198,8 +7188,6 @@ inline void gcode_M42() { } if (probe_inverting != deploy_state) SERIAL_PROTOCOLLNPGM("WARNING - INVERTING setting probably backwards"); - refresh_cmd_timeout(); - if (deploy_state != stow_state) { SERIAL_PROTOCOLLNPGM("BLTouch clone detected"); if (deploy_state) { @@ -7226,8 +7214,7 @@ inline void gcode_M42() { safe_delay(2); - if (0 == j % (500 * 1)) // keep cmd_timeout happy - refresh_cmd_timeout(); + if (0 == j % (500 * 1)) reset_stepper_timeout(); // Keep steppers powered if (deploy_state != READ(PROBE_TEST_PIN)) { // probe triggered @@ -7921,7 +7908,7 @@ inline void gcode_M109() { } idle(); - refresh_cmd_timeout(); // to prevent stepper_inactive_time from running out + reset_stepper_timeout(); // Keep steppers powered const float temp = thermalManager.degHotend(target_extruder); @@ -8058,7 +8045,7 @@ inline void gcode_M109() { } idle(); - refresh_cmd_timeout(); // to prevent stepper_inactive_time from running out + reset_stepper_timeout(); // Keep steppers powered const float temp = thermalManager.degBed(); @@ -12199,6 +12186,8 @@ void process_next_command() { #endif } + reset_stepper_timeout(); // Keep steppers powered + // Parse the next command in the queue parser.parse(current_command); process_parsed_command(); @@ -12226,7 +12215,6 @@ void flush_and_request_resend() { * B Block queue space remaining */ void ok_to_send() { - refresh_cmd_timeout(); if (!send_ok[cmd_queue_index_r]) return; SERIAL_PROTOCOLPGM(MSG_OK); #if ENABLED(ADVANCED_OK) @@ -13074,7 +13062,6 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) { */ void prepare_move_to_destination() { clamp_to_software_endstops(destination); - refresh_cmd_timeout(); #if ENABLED(PREVENT_COLD_EXTRUSION) || ENABLED(PREVENT_LENGTHY_EXTRUDE) @@ -13504,7 +13491,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { const millis_t ms = millis(); - if (max_inactive_time && ELAPSED(ms, previous_cmd_ms + max_inactive_time)) { + if (max_inactive_time && ELAPSED(ms, previous_move_ms + max_inactive_time)) { SERIAL_ERROR_START(); SERIAL_ECHOLNPAIR(MSG_KILL_INACTIVE_TIME, parser.command_ptr); kill(PSTR(MSG_KILLED)); @@ -13517,23 +13504,26 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { #define MOVE_AWAY_TEST true #endif - if (MOVE_AWAY_TEST && stepper_inactive_time && ELAPSED(ms, previous_cmd_ms + stepper_inactive_time) - && !ignore_stepper_queue && !planner.blocks_queued()) { - #if ENABLED(DISABLE_INACTIVE_X) - disable_X(); - #endif - #if ENABLED(DISABLE_INACTIVE_Y) - disable_Y(); - #endif - #if ENABLED(DISABLE_INACTIVE_Z) - disable_Z(); - #endif - #if ENABLED(DISABLE_INACTIVE_E) - disable_e_steppers(); - #endif - #if ENABLED(AUTO_BED_LEVELING_UBL) && ENABLED(ULTIPANEL) // Only needed with an LCD - if (ubl.lcd_map_control) ubl.lcd_map_control = defer_return_to_status = false; - #endif + if (stepper_inactive_time) { + if (planner.blocks_queued()) + previous_move_ms = ms; // reset_stepper_timeout to keep steppers powered + else if (MOVE_AWAY_TEST && !ignore_stepper_queue && ELAPSED(ms, previous_move_ms + stepper_inactive_time)) { + #if ENABLED(DISABLE_INACTIVE_X) + disable_X(); + #endif + #if ENABLED(DISABLE_INACTIVE_Y) + disable_Y(); + #endif + #if ENABLED(DISABLE_INACTIVE_Z) + disable_Z(); + #endif + #if ENABLED(DISABLE_INACTIVE_E) + disable_e_steppers(); + #endif + #if ENABLED(AUTO_BED_LEVELING_UBL) && ENABLED(ULTIPANEL) // Only needed with an LCD + if (ubl.lcd_map_control) ubl.lcd_map_control = defer_return_to_status = false; + #endif + } } #ifdef CHDK // Check if pin should be set to LOW after M240 set it to HIGH @@ -13592,7 +13582,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { #if ENABLED(EXTRUDER_RUNOUT_PREVENT) if (thermalManager.degHotend(active_extruder) > EXTRUDER_RUNOUT_MINTEMP - && ELAPSED(ms, previous_cmd_ms + (EXTRUDER_RUNOUT_SECONDS) * 1000UL) + && ELAPSED(ms, previous_move_ms + (EXTRUDER_RUNOUT_SECONDS) * 1000UL) && !planner.blocks_queued() ) { #if ENABLED(SWITCHING_EXTRUDER) @@ -13617,8 +13607,6 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { } #endif // !SWITCHING_EXTRUDER - previous_cmd_ms = ms; // refresh_cmd_timeout() - const float olde = current_position[E_AXIS]; current_position[E_AXIS] += EXTRUDER_RUNOUT_EXTRUDE; planner.buffer_line_kinematic(current_position, MMM_TO_MMS(EXTRUDER_RUNOUT_SPEED), active_extruder); @@ -13644,6 +13632,8 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) { #endif // E_STEPPERS > 1 } #endif // !SWITCHING_EXTRUDER + + previous_move_ms = ms; // reset_stepper_timeout to keep steppers powered } #endif // EXTRUDER_RUNOUT_PREVENT diff --git a/Marlin/planner.h b/Marlin/planner.h index bc0a39d5e2..575f3d9005 100644 --- a/Marlin/planner.h +++ b/Marlin/planner.h @@ -508,7 +508,7 @@ class Planner { /** * Does the buffer have any blocks queued? */ - static bool blocks_queued() { return (block_buffer_head != block_buffer_tail); } + static inline bool blocks_queued() { return (block_buffer_head != block_buffer_tail); } /** * "Discard" the block and "release" the memory. diff --git a/Marlin/ubl_G29.cpp b/Marlin/ubl_G29.cpp index 2d94e3d24a..11ef162a6e 100644 --- a/Marlin/ubl_G29.cpp +++ b/Marlin/ubl_G29.cpp @@ -774,7 +774,7 @@ wait_for_release(); while (!is_lcd_clicked()) { idle(); - refresh_cmd_timeout(); + reset_stepper_timeout(); // Keep steppers powered if (encoder_diff) { do_blocking_move_to_z(current_position[Z_AXIS] + float(encoder_diff) * multiplier); encoder_diff = 0; diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index e061fc81dc..fc6fe3c47a 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -1880,7 +1880,6 @@ void kill_screen(const char* lcd_msg) { // Encoder knob or keypad buttons adjust the Z position // if (encoderPosition) { - refresh_cmd_timeout(); const float z = current_position[Z_AXIS] + float((int32_t)encoderPosition) * (MBL_Z_STEP); line_to_z(constrain(z, -(LCD_PROBE_Z_RANGE) * 0.5, (LCD_PROBE_Z_RANGE) * 0.5)); lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; @@ -2403,7 +2402,6 @@ void kill_screen(const char* lcd_msg) { 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() { @@ -2418,10 +2416,7 @@ void kill_screen(const char* lcd_msg) { if (encoderPosition) { step_scaler += (int32_t)encoderPosition; x_plot += step_scaler / (ENCODER_STEPS_PER_MENU_ITEM); - if (abs(step_scaler) >= ENCODER_STEPS_PER_MENU_ITEM) - step_scaler = 0; - refresh_cmd_timeout(); - + if (abs(step_scaler) >= ENCODER_STEPS_PER_MENU_ITEM) step_scaler = 0; encoderPosition = 0; lcdDrawUpdate = LCDVIEW_REDRAW_NOW; } @@ -2903,7 +2898,6 @@ void kill_screen(const char* lcd_msg) { if (use_click()) { return lcd_goto_previous_menu_no_defer(); } ENCODER_DIRECTION_NORMAL(); if (encoderPosition && !processing_manual_move) { - refresh_cmd_timeout(); // Start with no limits to movement float min = current_position[axis] - 1000,