Tool Migration-specific settings (#26244)

Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
This commit is contained in:
studiodyne 2023-10-20 03:23:23 +02:00 committed by GitHub
parent 6d3122d4e8
commit 4b0b00c8da
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 80 additions and 23 deletions

View file

@ -2780,7 +2780,21 @@
* - Switch to a different nozzle on an extruder jam
*/
#define TOOLCHANGE_MIGRATION_FEATURE
#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
// Override toolchange settings
// By default tool migration uses regular toolchange settings.
// With a prime tower, tool-change swapping/priming occur inside the bed.
// When migrating to a new unprimed tool you can set override values below.
//#define MIGRATION_ZRAISE 0 // (mm)
// Longer prime to clean out
//#define MIGRATION_FS_EXTRA_PRIME 0 // (mm) Extra priming length
//#define MIGRATION_FS_WIPE_RETRACT 0 // (mm) Retract before cooling for less stringing, better wipe, etc.
// Cool after prime to reduce stringing
//#define MIGRATION_FS_FAN_SPEED 255 // 0-255
//#define MIGRATION_FS_FAN_TIME 0 // (seconds)
#endif
#endif
/**
@ -2793,6 +2807,9 @@
#define TOOLCHANGE_PARK_XY_FEEDRATE 6000 // (mm/min)
//#define TOOLCHANGE_PARK_X_ONLY // X axis only move
//#define TOOLCHANGE_PARK_Y_ONLY // Y axis only move
#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
//#define TOOLCHANGE_MIGRATION_DO_PARK // Force park (or no-park) on migration
#endif
#endif
#endif // HAS_MULTI_EXTRUDER

View file

@ -1275,6 +1275,24 @@
#undef TC_GCODE_USE_GLOBAL_Z
#endif
// TOOLCHANGE_MIGRATION_FEATURE - Clean up after sloppy auto config
#if DISABLED(TOOLCHANGE_MIGRATION_FEATURE)
#undef MIGRATION_ZRAISE
#undef MIGRATION_FS_EXTRA_PRIME
#undef MIGRATION_FS_WIPE_RETRACT
#undef MIGRATION_FS_FAN_SPEED
#undef MIGRATION_FS_FAN_TIME
#undef TOOLCHANGE_MIGRATION_DO_PARK
#endif
// TOOLCHANGE_PARK - Clean up after sloppy auto config
#if DISABLED(TOOLCHANGE_PARK)
#undef TOOLCHANGE_PARK_XY
#undef TOOLCHANGE_PARK_XY_FEEDRATE
#undef TOOLCHANGE_PARK_X_ONLY
#undef TOOLCHANGE_PARK_Y_ONLY
#undef TOOLCHANGE_MIGRATION_DO_PARK
#endif
// Multi-Stepping Limit
#ifndef MULTISTEPPING_LIMIT
#define MULTISTEPPING_LIMIT 128

View file

@ -34,9 +34,6 @@
//#define DEBUG_TOOL_CHANGE
//#define DEBUG_TOOLCHANGE_FILAMENT_SWAP
#define DEBUG_OUT ENABLED(DEBUG_TOOL_CHANGE)
#include "../core/debug_out.h"
#if HAS_MULTI_EXTRUDER
toolchange_settings_t toolchange_settings; // Initialized by settings.load()
#endif
@ -154,6 +151,9 @@ void _line_to_current(const AxisEnum fr_axis, const float fscale=1) {
void slow_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.2f); }
void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.5f); }
#define DEBUG_OUT ENABLED(DEBUG_TOOL_CHANGE)
#include "../core/debug_out.h"
#if ENABLED(MAGNETIC_PARKING_EXTRUDER)
float parkingposx[2], // M951 R L
@ -895,11 +895,8 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
*/
#if ENABLED(TOOLCHANGE_FILAMENT_SWAP)
#ifdef DEBUG_TOOLCHANGE_FILAMENT_SWAP
#define FS_DEBUG(V...) SERIAL_ECHOLNPGM("DEBUG: " V)
#else
#define FS_DEBUG(...) NOOP
#endif
#define DEBUG_OUT ENABLED(DEBUG_TOOLCHANGE_FILAMENT_SWAP)
#include "../core/debug_out.h"
// Define any variables required
static Flags<EXTRUDERS> extruder_was_primed; // Extruders primed status
@ -941,12 +938,11 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
*/
void extruder_cutting_recover(const_float_t e) {
if (too_cold(active_extruder)) return;
const float dist = toolchange_settings.extra_resume + toolchange_settings.wipe_retract;
FS_DEBUG("Performing Cutting Recover | Distance: ", dist, " | Speed: ", MMM_TO_MMS(toolchange_settings.unretract_speed), "mm/s");
DEBUG_ECHOLNPGM("Performing Cutting Recover | Distance: ", dist, " | Speed: ", MMM_TO_MMS(toolchange_settings.unretract_speed), "mm/s");
unscaled_e_move(dist, MMM_TO_MMS(toolchange_settings.unretract_speed));
FS_DEBUG("Set E position: ", e);
DEBUG_ECHOLNPGM("Set E position: ", e);
current_position.e = e;
sync_plan_position_e(); // Resume new E Position
}
@ -961,7 +957,7 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
*/
void extruder_prime() {
if (too_cold(active_extruder)) {
FS_DEBUG("Priming Aborted - Nozzle Too Cold!");
DEBUG_ECHOLNPGM("Priming Aborted - Nozzle Too Cold!");
return; // Extruder too cold to prime
}
@ -978,7 +974,7 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
extruder_did_first_prime.set(active_extruder); // Log first prime complete
// new nozzle - prime at user-specified speed.
const feedRate_t prime_mm_s = MMM_TO_MMS(toolchange_settings.prime_speed);
FS_DEBUG("First time priming T", active_extruder, ", reducing speed from ", fr_mm_s, " to ", prime_mm_s, "mm/s");
DEBUG_ECHOLNPGM("First time priming T", active_extruder, ", reducing speed from ", fr_mm_s, " to ", prime_mm_s, "mm/s");
fr_mm_s = prime_mm_s;
unscaled_e_move(0, fr_mm_s); // Init planner with 0 length move
}
@ -988,11 +984,11 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
if (toolchange_settings.extra_prime >= 0) {
// Positive extra_prime value
// - Return filament at speed (fr_mm_s) then extra_prime at prime speed
FS_DEBUG("Loading Filament for T", active_extruder, " | Distance: ", toolchange_settings.swap_length, " | Speed: ", fr_mm_s, "mm/s");
DEBUG_ECHOLNPGM("Loading Filament for T", active_extruder, " | Distance: ", toolchange_settings.swap_length, " | Speed: ", fr_mm_s, "mm/s");
unscaled_e_move(toolchange_settings.swap_length, fr_mm_s); // Prime (Unretract) filament by extruding equal to Swap Length (Unretract)
if (toolchange_settings.extra_prime > 0) {
FS_DEBUG("Performing Extra Priming for T", active_extruder, " | Distance: ", toolchange_settings.extra_prime, " | Speed: ", MMM_TO_MMS(toolchange_settings.prime_speed), "mm/s");
DEBUG_ECHOLNPGM("Performing Extra Priming for T", active_extruder, " | Distance: ", toolchange_settings.extra_prime, " | Speed: ", MMM_TO_MMS(toolchange_settings.prime_speed), "mm/s");
unscaled_e_move(toolchange_settings.extra_prime, MMM_TO_MMS(toolchange_settings.prime_speed)); // Extra Prime Distance
}
}
@ -1000,8 +996,8 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
// Negative extra_prime value
// - Unretract distance (swap length) is reduced by the value of extra_prime
const float eswap = toolchange_settings.swap_length + toolchange_settings.extra_prime;
FS_DEBUG("Negative ExtraPrime value - Swap Return Length has been reduced from ", toolchange_settings.swap_length, " to ", eswap);
FS_DEBUG("Loading Filament for T", active_extruder, " | Distance: ", eswap, " | Speed: ", fr_mm_s, "mm/s");
DEBUG_ECHOLNPGM("Negative ExtraPrime value - Swap Return Length has been reduced from ", toolchange_settings.swap_length, " to ", eswap);
DEBUG_ECHOLNPGM("Loading Filament for T", active_extruder, " | Distance: ", eswap, " | Speed: ", fr_mm_s, "mm/s");
unscaled_e_move(eswap, fr_mm_s);
}
@ -1009,7 +1005,7 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
// Cutting retraction
#if TOOLCHANGE_FS_WIPE_RETRACT
FS_DEBUG("Performing Cutting Retraction | Distance: ", -toolchange_settings.wipe_retract, " | Speed: ", MMM_TO_MMS(toolchange_settings.retract_speed), "mm/s");
DEBUG_ECHOLNPGM("Performing Cutting Retraction | Distance: ", -toolchange_settings.wipe_retract, " | Speed: ", MMM_TO_MMS(toolchange_settings.retract_speed), "mm/s");
unscaled_e_move(-toolchange_settings.wipe_retract, MMM_TO_MMS(toolchange_settings.retract_speed));
#endif
@ -1027,7 +1023,7 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
*/
void tool_change_prime() {
FS_DEBUG(">>> tool_change_prime()");
DEBUG_SECTION(tcp, "tool_change_prime", true);
if (!too_cold(active_extruder)) {
destination = current_position; // Remember the old position
@ -1086,9 +1082,6 @@ void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_axis, 0.
extruder_cutting_recover(destination.e); // Cutting recover
}
FS_DEBUG("<<< tool_change_prime");
}
#endif // TOOLCHANGE_FILAMENT_SWAP
@ -1203,7 +1196,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
else if (extruder_was_primed[old_tool]) {
// Retract the old extruder if it was previously primed
// To-Do: Should SingleNozzle always retract?
FS_DEBUG("Retracting Filament for T", old_tool, ". | Distance: ", toolchange_settings.swap_length, " | Speed: ", MMM_TO_MMS(toolchange_settings.retract_speed), "mm/s");
DEBUG_ECHOLNPGM("Retracting Filament for T", old_tool, ". | Distance: ", toolchange_settings.swap_length, " | Speed: ", MMM_TO_MMS(toolchange_settings.retract_speed), "mm/s");
unscaled_e_move(-toolchange_settings.swap_length, MMM_TO_MMS(toolchange_settings.retract_speed));
}
}
@ -1567,6 +1560,34 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
// Migrate Linear Advance K factor to the new extruder
TERN_(LIN_ADVANCE, planner.extruder_advance_K[active_extruder] = planner.extruder_advance_K[migration_extruder]);
// Temporary migration toolchange_settings restored on exit. i.e., before next tool_change().
#if defined(MIGRATION_FS_EXTRA_PRIME) \
|| defined(MIGRATION_FS_WIPE_RETRACT) \
|| defined(MIGRATION_FS_FAN_SPEED) \
|| defined(MIGRATION_FS_FAN_TIME) \
|| defined(MIGRATION_ZRAISE) \
|| defined(TOOLCHANGE_MIGRATION_DO_PARK)
REMEMBER(tmp_mig_settings, toolchange_settings);
#ifdef MIGRATION_FS_EXTRA_PRIME
toolchange_settings.extra_prime = MIGRATION_FS_EXTRA_PRIME;
#endif
#ifdef MIGRATION_FS_WIPE_RETRACT
toolchange_settings.wipe_retract = MIGRATION_FS_WIPE_RETRACT;
#endif
#ifdef MIGRATION_FS_FAN_SPEED
toolchange_settings.fan_speed = MIGRATION_FS_FAN_SPEED;
#endif
#ifdef MIGRATION_FS_FAN_TIME
toolchange_settings.fan_time = MIGRATION_FS_FAN_TIME;
#endif
#ifdef MIGRATION_ZRAISE
toolchange_settings.z_raise = MIGRATION_ZRAISE;
#endif
#ifdef TOOLCHANGE_MIGRATION_DO_PARK
toolchange_settings.enable_park = ENABLED(TOOLCHANGE_MIGRATION_DO_PARK);
#endif
#endif
// Perform the tool change
tool_change(migration_extruder);
@ -1586,6 +1607,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
planner.synchronize();
planner.set_e_position_mm(current_position.e); // New extruder primed and ready
DEBUG_ECHOLNPGM("Migration Complete");
return true;
}