diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index edd9bbc6c..961917cd9 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 3e91a87a9..0838a687c 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.has_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,8 +13582,8 @@ 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) - && !planner.blocks_queued() + && ELAPSED(ms, previous_move_ms + (EXTRUDER_RUNOUT_SECONDS) * 1000UL) + && !planner.has_blocks_queued() ) { #if ENABLED(SWITCHING_EXTRUDER) const bool oldstatus = E0_ENABLE_READ; @@ -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 @@ -13702,7 +13692,7 @@ void idle( #if ENABLED(I2C_POSITION_ENCODERS) static millis_t i2cpem_next_update_ms; - if (planner.blocks_queued() && ELAPSED(millis(), i2cpem_next_update_ms)) { + if (planner.has_blocks_queued() && ELAPSED(millis(), i2cpem_next_update_ms)) { I2CPEM.update(); i2cpem_next_update_ms = millis() + I2CPE_MIN_UPD_TIME_MS; } diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index 0ef1e17fb..493abb50d 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -457,7 +457,7 @@ void Planner::check_axes_activity() { #endif #endif - if (blocks_queued()) { + if (has_blocks_queued()) { #if FAN_COUNT > 0 for (uint8_t i = 0; i < FAN_COUNT; i++) @@ -1536,7 +1536,7 @@ void Planner::buffer_segment(const float &a, const float &b, const float &c, con //*/ // Always split the first move into two (if not homing or probing) - if (!blocks_queued()) { + if (!has_blocks_queued()) { #define _BETWEEN(A) (position[A##_AXIS] + target[A##_AXIS]) >> 1 const int32_t between[ABCE] = { _BETWEEN(A), _BETWEEN(B), _BETWEEN(C), _BETWEEN(E) }; diff --git a/Marlin/planner.h b/Marlin/planner.h index bc0a39d5e..6a76cdcaf 100644 --- a/Marlin/planner.h +++ b/Marlin/planner.h @@ -508,14 +508,14 @@ class Planner { /** * Does the buffer have any blocks queued? */ - static bool blocks_queued() { return (block_buffer_head != block_buffer_tail); } + static inline bool has_blocks_queued() { return (block_buffer_head != block_buffer_tail); } /** * "Discard" the block and "release" the memory. * Called when the current block is no longer needed. */ FORCE_INLINE static void discard_current_block() { - if (blocks_queued()) + if (has_blocks_queued()) block_buffer_tail = BLOCK_MOD(block_buffer_tail + 1); } @@ -524,7 +524,7 @@ class Planner { * Called after an interrupted move to throw away the rest of the move. */ FORCE_INLINE static bool discard_continued_block() { - const bool discard = blocks_queued() && TEST(block_buffer[block_buffer_tail].flag, BLOCK_BIT_CONTINUED); + const bool discard = has_blocks_queued() && TEST(block_buffer[block_buffer_tail].flag, BLOCK_BIT_CONTINUED); if (discard) discard_current_block(); return discard; } @@ -535,7 +535,7 @@ class Planner { * WARNING: Called from Stepper ISR context! */ static block_t* get_current_block() { - if (blocks_queued()) { + if (has_blocks_queued()) { block_t * const block = &block_buffer[block_buffer_tail]; // If the block has no trapezoid calculated, it's unsafe to execute. diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp index df5018d9f..e9dbbf40e 100644 --- a/Marlin/stepper.cpp +++ b/Marlin/stepper.cpp @@ -1112,7 +1112,7 @@ void Stepper::init() { /** * Block until all buffered steps are executed / cleaned */ -void Stepper::synchronize() { while (planner.blocks_queued() || cleaning_buffer_counter) idle(); } +void Stepper::synchronize() { while (planner.has_blocks_queued() || cleaning_buffer_counter) idle(); } /** * Set the stepper positions directly in steps @@ -1212,7 +1212,7 @@ void Stepper::finish_and_disable() { void Stepper::quick_stop() { cleaning_buffer_counter = 5000; DISABLE_STEPPER_DRIVER_INTERRUPT(); - while (planner.blocks_queued()) planner.discard_current_block(); + while (planner.has_blocks_queued()) planner.discard_current_block(); current_block = NULL; ENABLE_STEPPER_DRIVER_INTERRUPT(); #if ENABLED(ULTRA_LCD) diff --git a/Marlin/ubl_G29.cpp b/Marlin/ubl_G29.cpp index 2d94e3d24..11ef162a6 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 e061fc81d..fc6fe3c47 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,