diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index 14ca80c5c..bb9379733 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -141,6 +141,10 @@ float Planner::previous_speed[NUM_AXIS], float Planner::position_float[NUM_AXIS] = { 0 }; #endif +#if ENABLED(ENSURE_SMOOTH_MOVES) + uint32_t Planner::block_buffer_runtime_us = 0; +#endif + /** * Class and Instance Methods */ @@ -988,6 +992,7 @@ void Planner::_buffer_line(const float &a, const float &b, const float &c, const segment_time = (MIN_BLOCK_TIME) * 1000UL; } block->segment_time = segment_time; + block_buffer_runtime_us += segment_time; #endif block->nominal_speed = block->millimeters * inverse_mm_s; // (mm/sec) Always > 0 diff --git a/Marlin/planner.h b/Marlin/planner.h index 8bc96ad14..d35cd86d2 100644 --- a/Marlin/planner.h +++ b/Marlin/planner.h @@ -210,6 +210,10 @@ class Planner { static float extruder_advance_k; #endif + #if ENABLED(ENSURE_SMOOTH_MOVES) + static uint32_t block_buffer_runtime_us; //Theoretical block buffer runtime in µs + #endif + public: /** @@ -367,6 +371,9 @@ class Planner { static block_t* get_current_block() { if (blocks_queued()) { block_t* block = &block_buffer[block_buffer_tail]; + #if ENABLED(ENSURE_SMOOTH_MOVES) + block_buffer_runtime_us -= block->segment_time; //We can't be sure how long an active block will take, so don't count it. + #endif SBI(block->flag, BLOCK_BIT_BUSY); return block; } @@ -378,11 +385,15 @@ class Planner { static bool long_move() { if (blocks_queued()) { block_t* block = &block_buffer[block_buffer_tail]; - return block->segment_time > (LCD_UPDATE_THRESHOLD) * 1000UL; + return block_buffer_runtime_us > (LCD_UPDATE_THRESHOLD) * 1000UL + (MIN_BLOCK_TIME) * 3000UL; } else return true; } + + static void clear_block_buffer_runtime(){ + block_buffer_runtime_us = 0; + } #endif #if ENABLED(AUTOTEMP) diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp index b330fe403..2c6ba5255 100644 --- a/Marlin/stepper.cpp +++ b/Marlin/stepper.cpp @@ -1072,6 +1072,9 @@ void Stepper::finish_and_disable() { void Stepper::quick_stop() { cleaning_buffer_counter = 5000; + #if ENABLED(ENSURE_SMOOTH_MOVES) + planner.clear_block_buffer_runtime(); + #endif DISABLE_STEPPER_DRIVER_INTERRUPT(); while (planner.blocks_queued()) planner.discard_current_block(); current_block = NULL;