|
|
|
@ -377,9 +377,6 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Save current position to destination, for use later
|
|
|
|
|
set_destination_from_current();
|
|
|
|
|
|
|
|
|
|
#if HAS_LEVELING
|
|
|
|
|
// Set current position to the physical position
|
|
|
|
|
const bool leveling_was_active = planner.leveling_active;
|
|
|
|
@ -388,10 +385,23 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
|
|
|
|
|
|
|
|
|
|
#if ENABLED(DUAL_X_CARRIAGE)
|
|
|
|
|
|
|
|
|
|
#if HAS_SOFTWARE_ENDSTOPS
|
|
|
|
|
// Update the X software endstops early
|
|
|
|
|
active_extruder = tmp_extruder;
|
|
|
|
|
update_software_endstops(X_AXIS);
|
|
|
|
|
active_extruder = !tmp_extruder;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Don't move the new extruder out of bounds
|
|
|
|
|
if (!WITHIN(current_position[X_AXIS], soft_endstop_min[X_AXIS], soft_endstop_max[X_AXIS]))
|
|
|
|
|
no_move = true;
|
|
|
|
|
|
|
|
|
|
if (!no_move) set_destination_from_current();
|
|
|
|
|
dualx_tool_change(tmp_extruder, no_move); // Can modify no_move
|
|
|
|
|
|
|
|
|
|
#else // !DUAL_X_CARRIAGE
|
|
|
|
|
|
|
|
|
|
set_destination_from_current();
|
|
|
|
|
#if ENABLED(PARKING_EXTRUDER) // Dual Parking extruder
|
|
|
|
|
parking_extruder_tool_change(tmp_extruder, no_move);
|
|
|
|
|
#endif
|
|
|
|
@ -424,16 +434,16 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
|
|
|
|
|
|
|
|
|
|
#endif // !DUAL_X_CARRIAGE
|
|
|
|
|
|
|
|
|
|
#if HAS_LEVELING
|
|
|
|
|
// Restore leveling to re-establish the logical position
|
|
|
|
|
set_bed_leveling_enabled(leveling_was_active);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if ENABLED(SWITCHING_NOZZLE)
|
|
|
|
|
// The newly-selected extruder Z is actually at...
|
|
|
|
|
current_position[Z_AXIS] -= zdiff;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if HAS_LEVELING
|
|
|
|
|
// Restore leveling to re-establish the logical position
|
|
|
|
|
set_bed_leveling_enabled(leveling_was_active);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Tell the planner the new "current position"
|
|
|
|
|
SYNC_PLAN_POSITION_KINEMATIC();
|
|
|
|
|
|
|
|
|
@ -477,6 +487,10 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
|
|
|
|
|
|
|
|
|
|
feedrate_mm_s = old_feedrate_mm_s;
|
|
|
|
|
|
|
|
|
|
#if HAS_SOFTWARE_ENDSTOPS && ENABLED(DUAL_X_CARRIAGE)
|
|
|
|
|
update_software_endstops(X_AXIS);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#else // HOTENDS <= 1
|
|
|
|
|
|
|
|
|
|
UNUSED(fr_mm_s);
|
|
|
|
|