4242
4343#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
4444 migration_settings_t migration = migration_defaults;
45- bool enable_first_prime;
46- #endif
47-
48- #if ENABLED(TOOLCHANGE_FS_INIT_BEFORE_SWAP)
49- bool toolchange_extruder_ready[EXTRUDERS ];
45+ bool enable_first_prime; // As set by M217 V
5046#endif
5147
5248#if ENABLED(MAGNETIC_PARKING_EXTRUDER) || defined(EVENT_GCODE_AFTER_TOOLCHANGE) || (ENABLED(PARKING_EXTRUDER) && PARKING_EXTRUDER_SOLENOIDS_DELAY > 0)
9389
9490#if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
9591 #include " ../gcode/gcode.h"
96- bool extruder_primed[EXTRUDERS ]; // Log that extruders have been primed
9792 #if TOOLCHANGE_FS_WIPE_RETRACT <= 0
9893 #undef TOOLCHANGE_FS_WIPE_RETRACT
9994 #define TOOLCHANGE_FS_WIPE_RETRACT 0
@@ -784,6 +779,15 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a
784779 */
785780#if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
786781
782+ // Cool down with fan
783+ inline void filament_swap_cooling () {
784+ #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0
785+ thermalManager.fan_speed [TOOLCHANGE_FS_FAN ] = toolchange_settings.fan_speed ;
786+ gcode.dwell (SEC_TO_MS (toolchange_settings.fan_time ));
787+ thermalManager.fan_speed [TOOLCHANGE_FS_FAN ] = 0 ;
788+ #endif
789+ }
790+
787791 void tool_change_prime () {
788792 if (toolchange_settings.extra_prime > 0
789793 && TERN (PREVENT_COLD_EXTRUSION , !thermalManager.targetTooColdToExtrude (active_extruder), 1 )
@@ -827,11 +831,7 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a
827831 #endif
828832
829833 // Cool down with fan
830- #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0
831- thermalManager.fan_speed [TOOLCHANGE_FS_FAN ] = toolchange_settings.fan_speed ;
832- gcode.dwell (SEC_TO_MS (toolchange_settings.fan_time ));
833- thermalManager.fan_speed [TOOLCHANGE_FS_FAN ] = 0 ;
834- #endif
834+ filament_swap_cooling ();
835835
836836 // Move back
837837 #if ENABLED(TOOLCHANGE_PARK)
@@ -927,13 +927,17 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
927927 TEMPORARY_BED_LEVELING_STATE (false );
928928 #endif
929929
930+ #if EITHER(TOOLCHANGE_FS_PRIME_FIRST_USED, TOOLCHANGE_FS_INIT_BEFORE_SWAP)
931+ static uint8_t extruder_did_first_prime = 0 ;
932+ #endif
933+
930934 // First tool priming. To prime again, reboot the machine.
931935 #if BOTH(TOOLCHANGE_FILAMENT_SWAP, TOOLCHANGE_FS_PRIME_FIRST_USED)
932936 static bool first_tool_is_primed = false ;
933- if (new_tool == old_tool && !first_tool_is_primed && enable_first_prime ) {
937+ if (enable_first_prime && !first_tool_is_primed && new_tool == old_tool ) {
934938 tool_change_prime ();
935939 first_tool_is_primed = true ;
936- toolchange_extruder_ready[old_tool] = true ; // Primed and initialized
940+ SBI (extruder_did_first_prime, old_tool) ; // Primed and initialized
937941 }
938942 #endif
939943
@@ -960,6 +964,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
960964
961965 // Unload / Retract
962966 #if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
967+ static uint8_t extruder_was_primed = 0 ; // Flags for primed extruders
963968 const bool should_swap = can_move_away && toolchange_settings.swap_length ,
964969 too_cold = TERN0 (PREVENT_COLD_EXTRUSION ,
965970 !DEBUGGING (DRYRUN ) && (thermalManager.targetTooColdToExtrude (old_tool) || thermalManager.targetTooColdToExtrude (new_tool))
@@ -969,12 +974,8 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
969974 SERIAL_ECHO_MSG (STR_ERR_HOTEND_TOO_COLD );
970975 if (ENABLED (SINGLENOZZLE )) { active_extruder = new_tool; return ; }
971976 }
972- else {
973- // Only perform retraction for this nozzle if it has been primed
974- if (extruder_primed[old_tool]){
975- unscaled_e_move (-toolchange_settings.swap_length , MMM_TO_MMS (toolchange_settings.retract_speed ));
976- }
977- }
977+ else if (TEST (extruder_was_primed, old_tool)) // Retract the old extruder if it was previously primed
978+ unscaled_e_move (-toolchange_settings.swap_length , MMM_TO_MMS (toolchange_settings.retract_speed ));
978979 }
979980 #endif
980981
@@ -1080,9 +1081,9 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
10801081 float fr = toolchange_settings.unretract_speed ;
10811082
10821083 #if ENABLED(TOOLCHANGE_FS_INIT_BEFORE_SWAP)
1083- if (!toolchange_extruder_ready[ new_tool] ) {
1084- toolchange_extruder_ready[new_tool] = true ;
1085- fr = toolchange_settings.prime_speed ; // Next move is a prime
1084+ if (!TEST (extruder_did_first_prime, new_tool) ) {
1085+ SBI (extruder_did_first_prime, new_tool) ;
1086+ fr = toolchange_settings.prime_speed ; // Next move is a prime, not just un-retract
10861087 unscaled_e_move (0 , MMM_TO_MMS (fr)); // Init planner with 0 length move
10871088 }
10881089 #endif
@@ -1094,19 +1095,15 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
10941095 unscaled_e_move (toolchange_settings.extra_prime , MMM_TO_MMS (toolchange_settings.prime_speed ));
10951096
10961097 // Log that this extruder has been primed
1097- extruder_primed[new_tool] = true ;
1098+ SBI (extruder_was_primed, new_tool) ;
10981099
10991100 // Cutting retraction
11001101 #if TOOLCHANGE_FS_WIPE_RETRACT
11011102 unscaled_e_move (-(TOOLCHANGE_FS_WIPE_RETRACT ), MMM_TO_MMS (toolchange_settings.retract_speed ));
11021103 #endif
11031104
11041105 // Cool down with fan
1105- #if HAS_FAN && TOOLCHANGE_FS_FAN >= 0
1106- thermalManager.fan_speed [TOOLCHANGE_FS_FAN ] = toolchange_settings.fan_speed ;
1107- gcode.dwell (SEC_TO_MS (toolchange_settings.fan_time ));
1108- thermalManager.fan_speed [TOOLCHANGE_FS_FAN ] = 0 ;
1109- #endif
1106+ filament_swap_cooling ();
11101107 }
11111108 #endif
11121109
0 commit comments