diff --git a/Marlin/src/feature/backlash.cpp b/Marlin/src/feature/backlash.cpp index c6eb0d33f309..beab7100d95a 100644 --- a/Marlin/src/feature/backlash.cpp +++ b/Marlin/src/feature/backlash.cpp @@ -121,6 +121,37 @@ void Backlash::add_correction_steps(const int32_t &da, const int32_t &db, const // This correction reduces the residual error and adds block steps if (error_correction) { block->steps[axis] += ABS(error_correction); + + // Recalculate block->millimeters so that acceleration is calculated correctly + // (Relocated from module/planner.cpp) + if (true NUM_AXIS_GANG( + && block->steps.a < MIN_STEPS_PER_SEGMENT, && block->steps.b < MIN_STEPS_PER_SEGMENT, && block->steps.c < MIN_STEPS_PER_SEGMENT, + && block->steps.i < MIN_STEPS_PER_SEGMENT, && block->steps.j < MIN_STEPS_PER_SEGMENT, && block->steps.k < MIN_STEPS_PER_SEGMENT, + && block->steps.u < MIN_STEPS_PER_SEGMENT, && block->steps.v < MIN_STEPS_PER_SEGMENT, && block->steps.w < MIN_STEPS_PER_SEGMENT) + ) { + block->millimeters = TERN0(HAS_EXTRUDERS, ABS(dist_mm.e)); + } + else if (hints.millimeters) { + block->millimeters = hints.millimeters; + } + else { + const xyze_pos_t displacement = LOGICAL_AXIS_ARRAY( + dist_mm.e, + #if ANY(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) + dist_mm.head.x, dist_mm.head.y, dist_mm.z, + #elif CORE_IS_XZ + dist_mm.head.x, dist_mm.y, dist_mm.head.z, + #elif CORE_IS_YZ + dist_mm.x, dist_mm.head.y, dist_mm.head.z, + #else + dist_mm.x, dist_mm.y, dist_mm.z, + #endif + dist_mm.i, dist_mm.j, dist_mm.k, + dist_mm.u, dist_mm.v, dist_mm.w + ); + block->millimeters = get_move_distance(displacement OPTARG(HAS_ROTATIONAL_AXES, cartesian_move)); + } + #if ENABLED(CORE_BACKLASH) switch (axis) { case CORE_AXIS_1: diff --git a/Marlin/src/feature/easythreed_ui.cpp b/Marlin/src/feature/easythreed_ui.cpp index 39248bfc7d78..7a4698ebbc71 100644 --- a/Marlin/src/feature/easythreed_ui.cpp +++ b/Marlin/src/feature/easythreed_ui.cpp @@ -131,7 +131,7 @@ void EasythreedUI::loadButton() { break; case FS_PROCEED: { - // Feed or Retract just once. Hard abort all moves and return to idle on swicth release. + // Feed or Retract just once. Hard abort all moves and return to idle on switch release. static bool flag = false; if (READ(BTN_RETRACT) && READ(BTN_FEED)) { // Switch in center position (stop) flag = false; // Restore flag to false @@ -142,7 +142,7 @@ void EasythreedUI::loadButton() { } else if (!flag) { flag = true; - queue.inject(!READ(BTN_RETRACT) ? F("G91\nG0 E10 F180\nG0 E-120 F180\nM104 S0") : F("G91\nG0 E100 F120\nM104 S0")); + queue.inject(!READ(BTN_RETRACT) ? F("G91\nG0 E10 F180\nG0 E-220 F180\nM104 S0") : F("G91\nG0 E200 F120\nM104 S0")); } } break; } @@ -200,7 +200,7 @@ void EasythreedUI::printButton() { card.selectFileByIndex(filecnt); // Select the last file according to current sort options card.openAndPrintFile(card.filename); // Start printing it } break; - case PF_PAUSE: { // Pause printing (not currently firing) + case PF_PAUSE: { // Pause printing if (!printingIsActive()) break; blink_interval_ms = LED_ON; // Set indicator to steady ON queue.inject(F("M25")); // Queue Pause @@ -226,6 +226,7 @@ void EasythreedUI::printButton() { planner.synchronize(); // Wait for commands already in the planner to finish TERN_(HAS_STEPPER_RESET, disableStepperDrivers()); // Disable all steppers - now! print_key_flag = PF_START; // The "Print" button now starts a new print + blink_interval_ms = LED_ON; // Update Status LED } break; } diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 6b645fa1337e..e64460cbf6e2 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -2139,8 +2139,9 @@ bool Planner::_populate_block( block->millimeters = TERN0(HAS_EXTRUDERS, ABS(dist_mm.e)); } else { - if (hints.millimeters) + if (hints.millimeters) { block->millimeters = hints.millimeters; + } else { const xyze_pos_t displacement = LOGICAL_AXIS_ARRAY( dist_mm.e, @@ -2156,7 +2157,6 @@ bool Planner::_populate_block( dist_mm.i, dist_mm.j, dist_mm.k, dist_mm.u, dist_mm.v, dist_mm.w ); - block->millimeters = get_move_distance(displacement OPTARG(HAS_ROTATIONAL_AXES, cartesian_move)); }