Enhance IDEX toolchange auto-return w/ no park, full control (#14117)
This commit is contained in:
		
				
					committed by
					
						 Scott Lahteine
						Scott Lahteine
					
				
			
			
				
	
			
			
			
						parent
						
							3d9d72e8db
						
					
				
				
					commit
					aa0383a83b
				
			| @@ -1435,6 +1435,7 @@ | ||||
| #if EXTRUDERS > 1 | ||||
|   // Z raise distance for tool-change, as needed for some extruders | ||||
|   #define TOOLCHANGE_ZRAISE     2  // (mm) | ||||
|   //#define TOOLCHANGE_NO_RETURN   // Never return to the previous position on tool-change | ||||
|  | ||||
|   // Retract and prime filament on tool-change | ||||
|   //#define TOOLCHANGE_FILAMENT_SWAP | ||||
|   | ||||
| @@ -242,7 +242,7 @@ void GcodeSuite::G28(const bool always_home_all) { | ||||
|     #if DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE) | ||||
|       const uint8_t old_tool_index = active_extruder; | ||||
|     #endif | ||||
|     tool_change(0, 0, true); | ||||
|     tool_change(0, true); | ||||
|   #endif | ||||
|  | ||||
|   #if HAS_DUPLICATION_MODE | ||||
| @@ -428,7 +428,7 @@ void GcodeSuite::G28(const bool always_home_all) { | ||||
|     #else | ||||
|       #define NO_FETCH true | ||||
|     #endif | ||||
|     tool_change(old_tool_index, 0, NO_FETCH); | ||||
|     tool_change(old_tool_index, NO_FETCH); | ||||
|   #endif | ||||
|  | ||||
|   ui.refresh(); | ||||
|   | ||||
| @@ -80,7 +80,7 @@ void ac_home() { | ||||
|  | ||||
| void ac_setup(const bool reset_bed) { | ||||
|   #if HOTENDS > 1 | ||||
|     tool_change(0, 0, true); | ||||
|     tool_change(0, true); | ||||
|   #endif | ||||
|  | ||||
|   planner.synchronize(); | ||||
| @@ -104,7 +104,7 @@ void ac_cleanup( | ||||
|   #endif | ||||
|   clean_up_after_endstop_or_probe_move(); | ||||
|   #if HOTENDS > 1 | ||||
|     tool_change(old_tool_index, 0, true); | ||||
|     tool_change(old_tool_index, true); | ||||
|   #endif | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -109,7 +109,7 @@ void GcodeSuite::G34() { | ||||
|     // Always home with tool 0 active | ||||
|     #if HOTENDS > 1 | ||||
|       const uint8_t old_tool_index = active_extruder; | ||||
|       tool_change(0, 0, true); | ||||
|       tool_change(0, true); | ||||
|     #endif | ||||
|  | ||||
|     #if HAS_DUPLICATION_MODE | ||||
| @@ -263,7 +263,7 @@ void GcodeSuite::G34() { | ||||
|  | ||||
|     // Restore the active tool after homing | ||||
|     #if HOTENDS > 1 | ||||
|       tool_change(old_tool_index, 0, ( | ||||
|       tool_change(old_tool_index, ( | ||||
|         #if ENABLED(PARKING_EXTRUDER) | ||||
|           false // Fetch the previous toolhead | ||||
|         #else | ||||
|   | ||||
| @@ -68,7 +68,6 @@ void GcodeSuite::T(const uint8_t tool_index) { | ||||
|  | ||||
|     tool_change( | ||||
|       tool_index, | ||||
|       MMM_TO_MMS(parser.linearval('F')), | ||||
|       (tool_index == active_extruder) || parser.boolval('S') | ||||
|     ); | ||||
|  | ||||
|   | ||||
| @@ -109,7 +109,7 @@ void GcodeSuite::M600() { | ||||
|       #if ENABLED(DUAL_X_CARRIAGE) | ||||
|         && dual_x_carriage_mode != DXC_DUPLICATION_MODE && dual_x_carriage_mode != DXC_MIRRORED_MODE | ||||
|       #endif | ||||
|     ) tool_change(target_extruder, 0, false); | ||||
|     ) tool_change(target_extruder, false); | ||||
|   #endif | ||||
|  | ||||
|   // Initial retract before move to filament change position | ||||
| @@ -170,7 +170,7 @@ void GcodeSuite::M600() { | ||||
|   #if EXTRUDERS > 1 | ||||
|     // Restore toolhead if it was changed | ||||
|     if (active_extruder_before_filament_change != active_extruder) | ||||
|       tool_change(active_extruder_before_filament_change, 0, false); | ||||
|       tool_change(active_extruder_before_filament_change, false); | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(MIXING_EXTRUDER) | ||||
|   | ||||
| @@ -92,7 +92,7 @@ void GcodeSuite::M701() { | ||||
|     // Change toolhead if specified | ||||
|     uint8_t active_extruder_before_filament_change = active_extruder; | ||||
|     if (active_extruder != target_extruder) | ||||
|       tool_change(target_extruder, 0, false); | ||||
|       tool_change(target_extruder, false); | ||||
|   #endif | ||||
|  | ||||
|   // Lift Z axis | ||||
| @@ -121,7 +121,7 @@ void GcodeSuite::M701() { | ||||
|   #if EXTRUDERS > 1 && DISABLED(PRUSA_MMU2) | ||||
|     // Restore toolhead if it was changed | ||||
|     if (active_extruder_before_filament_change != active_extruder) | ||||
|       tool_change(active_extruder_before_filament_change, 0, false); | ||||
|       tool_change(active_extruder_before_filament_change, false); | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(MIXING_EXTRUDER) | ||||
| @@ -191,7 +191,7 @@ void GcodeSuite::M702() { | ||||
|     // Change toolhead if specified | ||||
|     uint8_t active_extruder_before_filament_change = active_extruder; | ||||
|     if (active_extruder != target_extruder) | ||||
|       tool_change(target_extruder, 0, false); | ||||
|       tool_change(target_extruder, false); | ||||
|   #endif | ||||
|  | ||||
|   // Lift Z axis | ||||
| @@ -205,7 +205,7 @@ void GcodeSuite::M702() { | ||||
|     #if EXTRUDERS > 1 && ENABLED(FILAMENT_UNLOAD_ALL_EXTRUDERS) | ||||
|       if (!parser.seenval('T')) { | ||||
|         HOTEND_LOOP() { | ||||
|           if (e != active_extruder) tool_change(e, 0, false); | ||||
|           if (e != active_extruder) tool_change(e, false); | ||||
|           unload_filament(-fc_settings[e].unload_length, true, PAUSE_MODE_UNLOAD_FILAMENT); | ||||
|         } | ||||
|       } | ||||
| @@ -231,7 +231,7 @@ void GcodeSuite::M702() { | ||||
|   #if EXTRUDERS > 1 && DISABLED(PRUSA_MMU2) | ||||
|     // Restore toolhead if it was changed | ||||
|     if (active_extruder_before_filament_change != active_extruder) | ||||
|       tool_change(active_extruder_before_filament_change, 0, false); | ||||
|       tool_change(active_extruder_before_filament_change, false); | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(MIXING_EXTRUDER) | ||||
|   | ||||
| @@ -350,7 +350,7 @@ namespace ExtUI { | ||||
|     #if EXTRUDERS > 1 | ||||
|       const uint8_t e = extruder - E0; | ||||
|       #if DO_SWITCH_EXTRUDER || EITHER(SWITCHING_NOZZLE, PARKING_EXTRUDER) | ||||
|         if (e != active_extruder) tool_change(e, 0, no_move); | ||||
|         if (e != active_extruder) tool_change(e, no_move); | ||||
|       #endif | ||||
|       active_extruder = e; | ||||
|     #endif | ||||
|   | ||||
| @@ -365,7 +365,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { | ||||
|  | ||||
| #if ENABLED(SWITCHING_TOOLHEAD) | ||||
|  | ||||
|   inline void switching_toolhead_tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool no_move/*=false*/) { | ||||
|   inline void switching_toolhead_tool_change(const uint8_t tmp_extruder, bool no_move/*=false*/) { | ||||
|     if (no_move) return; | ||||
|  | ||||
|     constexpr uint16_t angles[2] = SWITCHING_TOOLHEAD_SERVO_ANGLES; | ||||
| @@ -469,7 +469,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { | ||||
|  | ||||
| #if ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) | ||||
|  | ||||
|   inline void magnetic_switching_toolhead_tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool no_move/*=false*/) { | ||||
|   inline void magnetic_switching_toolhead_tool_change(const uint8_t tmp_extruder, bool no_move/*=false*/) { | ||||
|     if (no_move) return; | ||||
|  | ||||
|     const float toolheadposx[] = SWITCHING_TOOLHEAD_X_POS, | ||||
| @@ -653,7 +653,7 @@ inline void invalid_extruder_error(const uint8_t e) { | ||||
|  * Perform a tool-change, which may result in moving the | ||||
|  * previous tool out of the way and the new tool into place. | ||||
|  */ | ||||
| void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool no_move/*=false*/) { | ||||
| void tool_change(const uint8_t tmp_extruder, bool no_move/*=false*/) { | ||||
|  | ||||
|   #if ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) | ||||
|     if (tmp_extruder == active_extruder) return; | ||||
| @@ -661,7 +661,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n | ||||
|  | ||||
|   #if ENABLED(MIXING_EXTRUDER) | ||||
|  | ||||
|     UNUSED(fr_mm_s); UNUSED(no_move); | ||||
|     UNUSED(no_move); | ||||
|  | ||||
|     if (tmp_extruder >= MIXING_VIRTUAL_TOOLS) | ||||
|       return invalid_extruder_error(tmp_extruder); | ||||
| @@ -673,13 +673,13 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n | ||||
|  | ||||
|   #elif ENABLED(PRUSA_MMU2) | ||||
|  | ||||
|     UNUSED(fr_mm_s); UNUSED(no_move); | ||||
|     UNUSED(no_move); | ||||
|  | ||||
|     mmu2.tool_change(tmp_extruder); | ||||
|  | ||||
|   #elif EXTRUDERS < 2 | ||||
|  | ||||
|     UNUSED(fr_mm_s); UNUSED(no_move); | ||||
|     UNUSED(no_move); | ||||
|  | ||||
|     if (tmp_extruder) invalid_extruder_error(tmp_extruder); | ||||
|     return; | ||||
| @@ -702,21 +702,25 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n | ||||
|     if (tmp_extruder >= EXTRUDERS) | ||||
|       return invalid_extruder_error(tmp_extruder); | ||||
|  | ||||
|     if (!no_move && (!all_axes_homed() | ||||
|       #if ENABLED(DUAL_X_CARRIAGE) | ||||
|         || dual_x_carriage_mode == DXC_FULL_CONTROL_MODE | ||||
|       #endif | ||||
|     )) { | ||||
|     if (!no_move && !all_axes_homed()) { | ||||
|       no_move = true; | ||||
|       if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("No move on toolchange"); | ||||
|       if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("No move (not homed)"); | ||||
|     } | ||||
|  | ||||
|     #if HAS_LCD_MENU | ||||
|       ui.return_to_status(); | ||||
|     #endif | ||||
|  | ||||
|     #if ENABLED(DUAL_X_CARRIAGE) | ||||
|       const bool idex_full_control = dual_x_carriage_mode == DXC_FULL_CONTROL_MODE; | ||||
|     #else | ||||
|       constexpr bool idex_full_control = false; | ||||
|     #endif | ||||
|  | ||||
|     const bool can_move_away = !no_move && !idex_full_control; | ||||
|  | ||||
|     #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) | ||||
|       const bool should_swap = !no_move && toolchange_settings.swap_length; | ||||
|       const bool should_swap = can_move_away && toolchange_settings.swap_length; | ||||
|       #if ENABLED(PREVENT_COLD_EXTRUSION) | ||||
|         const bool too_cold = !DEBUGGING(DRYRUN) && (thermalManager.targetTooColdToExtrude(active_extruder) || thermalManager.targetTooColdToExtrude(tmp_extruder)); | ||||
|       #else | ||||
| @@ -736,6 +740,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n | ||||
|           #else | ||||
|             current_position[E_AXIS] -= toolchange_settings.swap_length / planner.e_factor[active_extruder]; | ||||
|             planner.buffer_line(current_position, MMM_TO_MMS(toolchange_settings.retract_speed), active_extruder); | ||||
|             planner.synchronize(); | ||||
|           #endif | ||||
|         } | ||||
|       } | ||||
| @@ -747,8 +752,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n | ||||
|         raise_nozzle(active_extruder); | ||||
|       #endif | ||||
|  | ||||
|       const float old_feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : feedrate_mm_s; | ||||
|       feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S; | ||||
|       REMEMBER(fr, feedrate_mm_s, XY_PROBE_FEEDRATE_MM_S); | ||||
|  | ||||
|       #if HAS_SOFTWARE_ENDSTOPS | ||||
|         #if HAS_HOTEND_OFFSET | ||||
| @@ -765,8 +769,8 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n | ||||
|  | ||||
|       set_destination_from_current(); | ||||
|  | ||||
|       if (!no_move) { | ||||
|         #if DISABLED(SWITCHING_NOZZLE) | ||||
|       #if DISABLED(SWITCHING_NOZZLE) | ||||
|         if (can_move_away) { | ||||
|           // Do a small lift to avoid the workpiece in the move back (below) | ||||
|           current_position[Z_AXIS] += toolchange_settings.z_raise; | ||||
|           #if HAS_SOFTWARE_ENDSTOPS | ||||
| @@ -778,9 +782,9 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n | ||||
|             current_position[Y_AXIS] = toolchange_settings.change_point.y; | ||||
|           #endif | ||||
|           planner.buffer_line(current_position, feedrate_mm_s, active_extruder); | ||||
|         #endif | ||||
|         planner.synchronize(); | ||||
|       } | ||||
|           planner.synchronize(); | ||||
|         } | ||||
|       #endif | ||||
|  | ||||
|       #if HAS_HOTEND_OFFSET | ||||
|         #if ENABLED(DUAL_X_CARRIAGE) | ||||
| @@ -801,9 +805,9 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n | ||||
|       #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) // Magnetic Parking extruder | ||||
|         magnetic_parking_extruder_tool_change(tmp_extruder); | ||||
|       #elif ENABLED(SWITCHING_TOOLHEAD) // Switching Toolhead | ||||
|         switching_toolhead_tool_change(tmp_extruder, fr_mm_s, no_move); | ||||
|         switching_toolhead_tool_change(tmp_extruder, no_move); | ||||
|       #elif ENABLED(MAGNETIC_SWITCHING_TOOLHEAD) // Magnetic Switching Toolhead | ||||
|         magnetic_switching_toolhead_tool_change(tmp_extruder, fr_mm_s, no_move); | ||||
|         magnetic_switching_toolhead_tool_change(tmp_extruder, no_move); | ||||
|       #elif ENABLED(SWITCHING_NOZZLE) && !SWITCHING_NOZZLE_TWO_SERVOS | ||||
|         // Raise by a configured distance to avoid workpiece, except with | ||||
|         // SWITCHING_NOZZLE_TWO_SERVOS, as both nozzles will lift instead. | ||||
| @@ -837,7 +841,6 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n | ||||
|  | ||||
|       // Return to position and lower again | ||||
|       if (safe_to_move && !no_move && IsRunning()) { | ||||
|         if (DEBUGGING(LEVELING)) DEBUG_POS("Move back", destination); | ||||
|  | ||||
|         #if ENABLED(SINGLENOZZLE) | ||||
|           #if FAN_COUNT > 0 | ||||
| @@ -884,13 +887,23 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n | ||||
|           apply_motion_limits(destination); | ||||
|         #endif | ||||
|  | ||||
|         // Move back to the original (or tweaked) position | ||||
|         do_blocking_move_to(destination); | ||||
|         // Should the nozzle move back to the old position? | ||||
|         if (can_move_away) { | ||||
|           #if ENABLED(TOOLCHANGE_NO_RETURN) | ||||
|             // Just move back down | ||||
|             if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Move back Z only"); | ||||
|             do_blocking_move_to_z(destination[Z_AXIS], planner.settings.max_feedrate_mm_s[Z_AXIS]); | ||||
|           #else | ||||
|             // Move back to the original (or adjusted) position | ||||
|             if (DEBUGGING(LEVELING)) DEBUG_POS("Move back", destination); | ||||
|             do_blocking_move_to(destination); | ||||
|           #endif | ||||
|         } | ||||
|         else if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Move back skipped"); | ||||
|  | ||||
|         #if ENABLED(DUAL_X_CARRIAGE) | ||||
|           active_extruder_parked = false; | ||||
|         #endif | ||||
|         feedrate_mm_s = old_feedrate_mm_s; | ||||
|       } | ||||
|       #if ENABLED(SWITCHING_NOZZLE) | ||||
|         else { | ||||
|   | ||||
| @@ -96,4 +96,4 @@ | ||||
|  * Perform a tool-change, which may result in moving the | ||||
|  * previous tool out of the way and the new tool into place. | ||||
|  */ | ||||
| void tool_change(const uint8_t tmp_extruder, const float fr_mm_s=0.0, bool no_move=false); | ||||
| void tool_change(const uint8_t tmp_extruder, bool no_move=false); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user