Skip to content

Commit

Permalink
Followup
Browse files Browse the repository at this point in the history
  • Loading branch information
studiodyne committed Sep 24, 2022
1 parent 45d1600 commit 6f9d747
Show file tree
Hide file tree
Showing 9 changed files with 230 additions and 132 deletions.
32 changes: 24 additions & 8 deletions Marlin/Configuration_adv.h
Original file line number Diff line number Diff line change
Expand Up @@ -1169,7 +1169,8 @@

//#define CALIBRATION_SCRIPT_PRE "M117 Starting Auto-Calibration\nT0\nG28\nG12\nM117 Calibrating..."
//#define CALIBRATION_SCRIPT_POST "M500\nM117 Calibration data saved"

//#define CALIBRATION_ALLOW_XY_IS_CORE // Backlash & calibration allowed for CORE X/Y axis
//#define CALIBRATION_TOOLCHANGE_FEATURE_DISABLED // Disable prime, swap, moves and park during calibration
#define CALIBRATION_MEASUREMENT_RESOLUTION 0.01 // mm

#define CALIBRATION_FEEDRATE_SLOW 60 // mm/min
Expand Down Expand Up @@ -2493,10 +2494,8 @@
// Z raise distance for tool-change, as needed for some extruders
#define TOOLCHANGE_ZRAISE 2 // (mm)
//#define TOOLCHANGE_ZRAISE_BEFORE_RETRACT // Apply raise before swap retraction (if enabled)
//#define TOOLCHANGE_NO_RETURN // Never return to previous position on tool-change
#if ENABLED(TOOLCHANGE_NO_RETURN)
//#define EVENT_GCODE_AFTER_TOOLCHANGE "G12X" // Extra G-code to run after tool-change
#endif
//#define TOOLCHANGE_NO_RETURN_DEFAULT_ON // M216 R 0/1 Never return to previous position on tool-change
//#define EVENT_GCODE_AFTER_TOOLCHANGE "G12X" // Extra G-code to run after tool-change

/**
* Extra G-code to run while executing tool-change commands. Can be used to use an additional
Expand Down Expand Up @@ -2540,13 +2539,13 @@
//#define TOOLCHANGE_FS_SLOW_FIRST_PRIME

/**
* Prime T0 the first time T0 is sent to the printer:
* Prime Txxx the first time Txxx is sent to the printer:
* [ Power-On -> T0 { Activate & Prime T0 } -> T1 { Retract T0, Activate & Prime T1 } ]
* If disabled, no priming on T0 until switching back to T0 from another extruder:
* [ Power-On -> T0 { T0 Activated } -> T1 { Activate & Prime T1 } -> T0 { Retract T1, Activate & Prime T0 } ]
* Enable with M217 V1 before printing to avoid unwanted priming on host connect.
*/
//#define TOOLCHANGE_FS_PRIME_FIRST_USED
#define TOOLCHANGE_FS_PRIME_FIRST_USED 1 // 0-1

/**
* Tool Change Migration
Expand All @@ -2559,19 +2558,36 @@
* - Switch to a different nozzle on an extruder jam
*/
#define TOOLCHANGE_MIGRATION_FEATURE

#if ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
//Override toolchange settings (To use settings for prime tower and for Migration outside the bed with long prime and cooling)
#define MIGRATION_OVERRIDE_TOOLCHANGE_SETTINGS
#if ENABLED(MIGRATION_OVERRIDE_TOOLCHANGE_SETTINGS)
// Longer prime to clean out
#define MIGRATION_FS_EXTRA_PRIME 50 // (mm) Extra priming length
#define MIGRATION_FS_WIPE_RETRACT 3 // (mm) Retract before cooling for less stringing, better wipe, etc.
// Cool after prime to reduce stringing
#ifdef TOOLCHANGE_FS_FAN
#define MIGRATION_FS_FAN_SPEED 255 // 0-255
#define MIGRATION_FS_FAN_TIME 10 // (seconds)
#endif
#endif // MIGRATION_OVERRIDE_TOOLCHANGE_SETTINGS
#endif //ENABLED(TOOLCHANGE_MIGRATION_FEATURE)
#endif
/**
* Position to park head during tool change.
* Doesn't apply to SWITCHING_TOOLHEAD, DUAL_X_CARRIAGE, or PARKING_EXTRUDER
* M216 Gcodes (See m216.cpp for settings documentation)
*/
//#define TOOLCHANGE_PARK
#if ENABLED(TOOLCHANGE_PARK)
#define TOOLCHANGE_PARK_XY { X_MIN_POS + 10, Y_MIN_POS + 10 }
#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_ALWAYS_PARK
#endif
#endif
#endif // HAS_MULTI_EXTRUDER

Expand Down
20 changes: 17 additions & 3 deletions Marlin/src/gcode/calibrate/G425.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,21 @@ inline void park_above_object(measurements_t &m, const float uncertainty) {
inline void set_nozzle(measurements_t &m, const uint8_t extruder) {
if (extruder != active_extruder) {
park_above_object(m, CALIBRATION_MEASUREMENT_UNKNOWN);
tool_change(extruder);
#if ENABLED(CALIBRATION_TOOLCHANGE_FEATURE_DISABLED)
toolchange_settings_t tmp0 = {0};
REMEMBER(tmp, toolchange_settings);
toolchange_settings = tmp0;
tool_change(extruder);
RESTORE(tmp);
/* or
toolchange_settings_t tmp0 = {0},
tmp = toolchange_settings;
toolchange_settings = tmp0;
tool_change(extruder);
toolchange_settings = tmp;*/
#else
tool_change(extruder);
#endif
}
}
#endif
Expand Down Expand Up @@ -268,10 +282,10 @@ inline void probe_side(measurements_t &m, const float uncertainty, const side_t
#define _PCASE(N) _ACASE(N, N##MINIMUM, N##MAXIMUM)

switch (side) {
#if AXIS_CAN_CALIBRATE(X)
#if HAS_X_AXIS && ( AXIS_CAN_CALIBRATE(X) || CALIBRATION_ALLOW_XY_IS_CORE)
_ACASE(X, RIGHT, LEFT);
#endif
#if HAS_Y_AXIS && AXIS_CAN_CALIBRATE(Y)
#if HAS_Y_AXIS && ( AXIS_CAN_CALIBRATE(Y) || CALIBRATION_ALLOW_XY_IS_CORE)
_ACASE(Y, BACK, FRONT);
#endif
#if HAS_Z_AXIS && AXIS_CAN_CALIBRATE(Z)
Expand Down
101 changes: 101 additions & 0 deletions Marlin/src/gcode/config/M216.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/**
* Marlin 3D Printer Firmware
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
*
* Based on Sprinter and grbl.
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/

#include "../../inc/MarlinConfigPre.h"

#if HAS_MULTI_EXTRUDER && ENABLED(TOOLCHANGE_PARK)

#include "../gcode.h"
#include "../../module/tool_change.h"
#include "../../MarlinCore.h" // for SP_X_STR, etc.

/**
* M216 - Set Tool change Park parameters
*
* // Tool change Park settings
* P[linear] 0/1 Enable park
* R[linear] 0/1 Enable return to previous position before park
* X[linear] Park X
* Y[linear] Park Y
* I[linear] Park I (Requires NUM_AXES >= 4)
* J[linear] Park J (Requires NUM_AXES >= 5)
* K[linear] Park K (Requires NUM_AXES >= 6)
* C[linear] Park U (Requires NUM_AXES >= 7)
* H[linear] Park V (Requires NUM_AXES >= 8)
* O[linear] Park W (Requires NUM_AXES >= 9)
*
*/
void GcodeSuite::M216() {

if (parser.seenval('P')) { toolchange_settings.enable_park = parser.value_linear_units(); }
if (parser.seenval('R')) { toolchange_settings.no_return = parser.value_linear_units(); }
if (parser.seenval('X')) { const int16_t v = parser.value_linear_units(); toolchange_settings.change_point.x = constrain(v, X_MIN_POS, X_MAX_POS); }
#if HAS_Y_AXIS
if (parser.seenval('Y')) { const int16_t v = parser.value_linear_units(); toolchange_settings.change_point.y = constrain(v, Y_MIN_POS, Y_MAX_POS); }
#endif
#if HAS_I_AXIS
if (parser.seenval('I')) { const int16_t v = parser.TERN(AXIS4_ROTATES, value_int, value_linear_units)(); toolchange_settings.change_point.i = constrain(v, I_MIN_POS, I_MAX_POS); }
#endif
#if HAS_J_AXIS
if (parser.seenval('J')) { const int16_t v = parser.TERN(AXIS5_ROTATES, value_int, value_linear_units)(); toolchange_settings.change_point.j = constrain(v, J_MIN_POS, J_MAX_POS); }
#endif
#if HAS_K_AXIS
if (parser.seenval('K')) { const int16_t v = parser.TERN(AXIS6_ROTATES, value_int, value_linear_units)(); toolchange_settings.change_point.k = constrain(v, K_MIN_POS, K_MAX_POS); }
#endif
#if HAS_U_AXIS
if (parser.seenval('C')) { const int16_t v = parser.TERN(AXIS7_ROTATES, value_int, value_linear_units)(); toolchange_settings.change_point.u = constrain(v, U_MIN_POS, U_MAX_POS); }
#endif
#if HAS_V_AXIS
if (parser.seenval('H')) { const int16_t v = parser.TERN(AXIS8_ROTATES, value_int, value_linear_units)(); toolchange_settings.change_point.v = constrain(v, V_MIN_POS, V_MAX_POS); }
#endif
#if HAS_W_AXIS
if (parser.seenval('O')) { const int16_t v = parser.TERN(AXIS9_ROTATES, value_int, value_linear_units)(); toolchange_settings.change_point.w = constrain(v, W_MIN_POS, W_MAX_POS); }
#endif

M216_report();
}

void GcodeSuite::M216_report(const bool forReplay/*=true*/) {

SERIAL_ECHOPGM(" M216");

SERIAL_ECHOPGM(" P", LINEAR_UNIT(toolchange_settings.enable_park));
SERIAL_ECHOPGM(" R", LINEAR_UNIT(toolchange_settings.no_return));
SERIAL_ECHOPGM_P(
SP_X_STR, LINEAR_UNIT(toolchange_settings.change_point.x)
#if HAS_Y_AXIS
, SP_Y_STR, LINEAR_UNIT(toolchange_settings.change_point.y)
#endif
#if SECONDARY_AXES >= 1
, LIST_N(DOUBLE(SECONDARY_AXES)
, SP_I_STR, I_AXIS_UNIT(toolchange_settings.change_point.i)
, SP_J_STR, J_AXIS_UNIT(toolchange_settings.change_point.j)
, SP_K_STR, K_AXIS_UNIT(toolchange_settings.change_point.k)
, SP_C_STR, U_AXIS_UNIT(toolchange_settings.change_point.u)
, PSTR(" H"), V_AXIS_UNIT(toolchange_settings.change_point.v)
, PSTR(" O"), W_AXIS_UNIT(toolchange_settings.change_point.w)
)
#endif
);
}

#endif // HAS_MULTI_EXTRUDER && ENABLED(TOOLCHANGE_PARK)
86 changes: 18 additions & 68 deletions Marlin/src/gcode/config/M217.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,26 +36,21 @@
/**
* M217 - Set toolchange parameters
*
* // Tool change command
* Q Prime active tool and exit
* C[extruder] Reset specified (or active) extruder primed status (To prime on next T...)
*
* // Tool change settings
* S[linear] Swap length
* B[linear] Extra Swap resume length
* E[linear] Extra Prime length (as used by M217 Q)
* G[linear] Cutting wipe retract length (<=100mm)
* W[linear] Cutting wipe retract length (<=100mm)
* R[linear/min] Retract speed
* U[linear/min] UnRetract speed
* P[linear/min] Prime speed
* Q[extruder] Reset specified (or active) extruder primed status (To prime on next T...)
* V[linear] 0/1 Enable auto prime first extruder used
* W[linear] 0/1 Enable park
* X[linear] Park X (Requires TOOLCHANGE_PARK)
* Y[linear] Park Y (Requires TOOLCHANGE_PARK and NUM_AXES >= 2)
* I[linear] Park I (Requires TOOLCHANGE_PARK and NUM_AXES >= 4)
* J[linear] Park J (Requires TOOLCHANGE_PARK and NUM_AXES >= 5)
* K[linear] Park K (Requires TOOLCHANGE_PARK and NUM_AXES >= 6)
* C[linear] Park U (Requires TOOLCHANGE_PARK and NUM_AXES >= 7)
* H[linear] Park V (Requires TOOLCHANGE_PARK and NUM_AXES >= 8)
* O[linear] Park W (Requires TOOLCHANGE_PARK and NUM_AXES >= 9)
* Z[linear] Z Raise
*
* F[speed] Fan Speed 0-255
* D[seconds] Fan time
*
Expand All @@ -71,48 +66,27 @@ void GcodeSuite::M217() {
#if ENABLED(TOOLCHANGE_FILAMENT_SWAP)

static constexpr float max_extrude = TERN(PREVENT_LENGTHY_EXTRUDE, EXTRUDE_MAXLENGTH, 500);
if (parser.seen('Q')) { const uint16_t v = parser.ushortval('Q', active_extruder); extruder_was_primed.clear(constrain(v, 0, EXTRUDERS - 1)); }
if (parser.seen('C')) { const uint16_t v = parser.ushortval('C', active_extruder); extruder_was_primed.clear(constrain(v, 0, EXTRUDERS - 1)); }
if (parser.seen('Q')) {
extruder_was_primed.clear(active_extruder);
REMEMBER(tmp, toolchange_settings.enable_first_prime);
toolchange_settings.enable_first_prime = true;
tool_change(active_extruder);
RESTORE(tmp);
return;
}
if (parser.seenval('S')) { const float v = parser.value_linear_units(); toolchange_settings.swap_length = constrain(v, 0, max_extrude); }
if (parser.seenval('B')) { const float v = parser.value_linear_units(); toolchange_settings.extra_resume = constrain(v, -10, 10); }
if (parser.seenval('E')) { const float v = parser.value_linear_units(); toolchange_settings.extra_prime = constrain(v, 0, max_extrude); }
if (parser.seenval('P')) { const int16_t v = parser.value_linear_units(); toolchange_settings.prime_speed = constrain(v, 10, 5400); }
if (parser.seenval('G')) { const int16_t v = parser.value_linear_units(); toolchange_settings.wipe_retract = constrain(v, 0, 100); }
if (parser.seenval('W')) { const int16_t v = parser.value_linear_units(); toolchange_settings.wipe_retract = constrain(v, 0, 100); }
if (parser.seenval('R')) { const int16_t v = parser.value_linear_units(); toolchange_settings.retract_speed = constrain(v, 10, 5400); }
if (parser.seenval('U')) { const int16_t v = parser.value_linear_units(); toolchange_settings.unretract_speed = constrain(v, 10, 5400); }
#if HAS_FAN && defined(TOOLCHANGE_FS_FAN)
if (parser.seenval('F')) { const uint16_t v = parser.value_ushort(); toolchange_settings.fan_speed = constrain(v, 0, 255); }
if (parser.seenval('D')) { const uint16_t v = parser.value_ushort(); toolchange_settings.fan_time = constrain(v, 1, 30); }
#endif
#endif

#if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED)
if (parser.seenval('V')) { enable_first_prime = parser.value_linear_units(); }
#endif

#if ENABLED(TOOLCHANGE_PARK)
if (parser.seenval('W')) { toolchange_settings.enable_park = parser.value_linear_units(); }
if (parser.seenval('X')) { const int16_t v = parser.value_linear_units(); toolchange_settings.change_point.x = constrain(v, X_MIN_POS, X_MAX_POS); }
#if HAS_Y_AXIS
if (parser.seenval('Y')) { const int16_t v = parser.value_linear_units(); toolchange_settings.change_point.y = constrain(v, Y_MIN_POS, Y_MAX_POS); }
#endif
#if HAS_I_AXIS
if (parser.seenval('I')) { const int16_t v = parser.TERN(AXIS4_ROTATES, value_int, value_linear_units)(); toolchange_settings.change_point.i = constrain(v, I_MIN_POS, I_MAX_POS); }
#endif
#if HAS_J_AXIS
if (parser.seenval('J')) { const int16_t v = parser.TERN(AXIS5_ROTATES, value_int, value_linear_units)(); toolchange_settings.change_point.j = constrain(v, J_MIN_POS, J_MAX_POS); }
#endif
#if HAS_K_AXIS
if (parser.seenval('K')) { const int16_t v = parser.TERN(AXIS6_ROTATES, value_int, value_linear_units)(); toolchange_settings.change_point.k = constrain(v, K_MIN_POS, K_MAX_POS); }
#endif
#if HAS_U_AXIS
if (parser.seenval('C')) { const int16_t v = parser.TERN(AXIS7_ROTATES, value_int, value_linear_units)(); toolchange_settings.change_point.u = constrain(v, U_MIN_POS, U_MAX_POS); }
#endif
#if HAS_V_AXIS
if (parser.seenval('H')) { const int16_t v = parser.TERN(AXIS8_ROTATES, value_int, value_linear_units)(); toolchange_settings.change_point.v = constrain(v, V_MIN_POS, V_MAX_POS); }
#endif
#if HAS_W_AXIS
if (parser.seenval('O')) { const int16_t v = parser.TERN(AXIS9_ROTATES, value_int, value_linear_units)(); toolchange_settings.change_point.w = constrain(v, W_MIN_POS, W_MAX_POS); }
#endif
if (parser.seenval('V')) { toolchange_settings.enable_first_prime = parser.value_linear_units(); }
#endif

#if HAS_Z_AXIS
Expand Down Expand Up @@ -178,31 +152,7 @@ void GcodeSuite::M217_report(const bool forReplay/*=true*/) {
SERIAL_ECHOPGM(" A", migration.automode, " L", LINEAR_UNIT(migration.last));
#endif

#if ENABLED(TOOLCHANGE_PARK)
{
SERIAL_ECHOPGM(" W", LINEAR_UNIT(toolchange_settings.enable_park));
SERIAL_ECHOPGM_P(
SP_X_STR, LINEAR_UNIT(toolchange_settings.change_point.x)
#if HAS_Y_AXIS
, SP_Y_STR, LINEAR_UNIT(toolchange_settings.change_point.y)
#endif
#if SECONDARY_AXES >= 1
, LIST_N(DOUBLE(SECONDARY_AXES)
, SP_I_STR, I_AXIS_UNIT(toolchange_settings.change_point.i)
, SP_J_STR, J_AXIS_UNIT(toolchange_settings.change_point.j)
, SP_K_STR, K_AXIS_UNIT(toolchange_settings.change_point.k)
, SP_C_STR, U_AXIS_UNIT(toolchange_settings.change_point.u)
, PSTR(" H"), V_AXIS_UNIT(toolchange_settings.change_point.v)
, PSTR(" O"), W_AXIS_UNIT(toolchange_settings.change_point.w)
)
#endif
);
}
#endif

#if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED)
SERIAL_ECHOPGM(" V", LINEAR_UNIT(enable_first_prime));
#endif
SERIAL_ECHOPGM(" V", LINEAR_UNIT(toolchange_settings.enable_first_prime));

#endif

Expand Down
6 changes: 5 additions & 1 deletion Marlin/src/gcode/gcode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -737,8 +737,12 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
case 211: M211(); break; // M211: Enable, Disable, and/or Report software endstops
#endif

#if HAS_MULTI_EXTRUDER && ENABLED(TOOLCHANGE_PARK)
case 216: M216(); break; // M216: Set Toolchange park parameters
#endif

#if HAS_MULTI_EXTRUDER
case 217: M217(); break; // M217: Set filament swap parameters
case 217: M217(); break; // M217: Set Toolchange parameters
#endif

#if HAS_HOTEND_OFFSET
Expand Down
4 changes: 4 additions & 0 deletions Marlin/src/gcode/gcode.h
Original file line number Diff line number Diff line change
Expand Up @@ -863,6 +863,10 @@ class GcodeSuite {
static void M211_report(const bool forReplay=true);

#if HAS_MULTI_EXTRUDER
#if ENABLED(TOOLCHANGE_PARK)
static void M216();
static void M216_report(const bool forReplay=true);
#endif
static void M217();
static void M217_report(const bool forReplay=true);
#endif
Expand Down
Loading

0 comments on commit 6f9d747

Please sign in to comment.