From e2871f0dcd927e36707cf016933f132ea0b777be Mon Sep 17 00:00:00 2001 From: Sebastianv650 Date: Fri, 12 Jan 2018 01:50:18 +0100 Subject: [PATCH] [1.1.x] Ensure smooth printer movements (#9149) - Never execute a block without an up-to-date trapezoid - Start blocks with MINIMUM_PLANNER_SPEED, except when coming from a full stop --- Marlin/planner.cpp | 9 ++++----- Marlin/planner.h | 10 ++++++++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp index ff972c36b..adbf14250 100644 --- a/Marlin/planner.cpp +++ b/Marlin/planner.cpp @@ -1341,7 +1341,9 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE], float fr_mm_s, const // Initialize block entry speed. Compute based on deceleration to user-defined MINIMUM_PLANNER_SPEED. const float v_allowable = max_allowable_speed(-block->acceleration, MINIMUM_PLANNER_SPEED, block->millimeters); - block->entry_speed = min(vmax_junction, v_allowable); + // If stepper ISR is disabled, this indicates buffer_segment wants to add a split block. + // In this case start with the max. allowed speed to avoid an interrupted first move. + block->entry_speed = TEST(TIMSK1, OCIE1A) ? MINIMUM_PLANNER_SPEED : min(vmax_junction, v_allowable); // Initialize planner efficiency flags // Set flag if block will always reach maximum junction speed regardless of entry/exit speeds. @@ -1351,7 +1353,7 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE], float fr_mm_s, const // block nominal speed limits both the current and next maximum junction speeds. Hence, in both // the reverse and forward planners, the corresponding block junction speed will always be at the // the maximum junction speed and may always be ignored for any speed reduction checks. - block->flag |= BLOCK_FLAG_RECALCULATE | (block->nominal_speed <= v_allowable ? BLOCK_FLAG_NOMINAL_LENGTH : 0); + block->flag |= block->nominal_speed <= v_allowable ? BLOCK_FLAG_RECALCULATE | BLOCK_FLAG_NOMINAL_LENGTH : BLOCK_FLAG_RECALCULATE; // Update previous path unit_vector and nominal speed COPY(previous_speed, current_speed); @@ -1387,9 +1389,6 @@ void Planner::_buffer_steps(const int32_t (&target)[XYZE], float fr_mm_s, const #endif // LIN_ADVANCE - const float bnsr = 1.0 / block->nominal_speed; - calculate_trapezoid_for_block(block, block->entry_speed * bnsr, safe_speed * bnsr); - // Move buffer head block_buffer_head = next_buffer_head; diff --git a/Marlin/planner.h b/Marlin/planner.h index 23f13bf96..3852b9019 100644 --- a/Marlin/planner.h +++ b/Marlin/planner.h @@ -530,6 +530,16 @@ class Planner { static block_t* get_current_block() { if (blocks_queued()) { block_t * const block = &block_buffer[block_buffer_tail]; + + // If the trapezoid of this block has to be recalculated, it's not save to execute it. + if (movesplanned() > 1) { + block_t* next = &block_buffer[next_block_index(block_buffer_tail)]; + if (TEST(block->flag, BLOCK_BIT_RECALCULATE) || TEST(next->flag, BLOCK_BIT_RECALCULATE)) + return NULL; + } + else if (TEST(block->flag, BLOCK_BIT_RECALCULATE)) + return NULL; + #if ENABLED(ULTRA_LCD) block_buffer_runtime_us -= block->segment_time_us; // We can't be sure how long an active block will take, so don't count it. #endif