SINGLENOZZLE: EXTRUDERS versus HOTENDS
This commit is contained in:
@ -356,16 +356,16 @@ static uint8_t target_extruder;
|
||||
#endif
|
||||
|
||||
// Extruder offsets
|
||||
#if EXTRUDERS > 1
|
||||
#ifndef EXTRUDER_OFFSET_X
|
||||
#define EXTRUDER_OFFSET_X { 0 } // X offsets for each extruder
|
||||
#if HOTENDS > 1
|
||||
#ifndef HOTEND_OFFSET_X
|
||||
#define HOTEND_OFFSET_X { 0 } // X offsets for each extruder
|
||||
#endif
|
||||
#ifndef EXTRUDER_OFFSET_Y
|
||||
#define EXTRUDER_OFFSET_Y { 0 } // Y offsets for each extruder
|
||||
#ifndef HOTEND_OFFSET_Y
|
||||
#define HOTEND_OFFSET_Y { 0 } // Y offsets for each extruder
|
||||
#endif
|
||||
float extruder_offset[][EXTRUDERS] = {
|
||||
EXTRUDER_OFFSET_X,
|
||||
EXTRUDER_OFFSET_Y
|
||||
float hotend_offset[][HOTENDS] = {
|
||||
HOTEND_OFFSET_X,
|
||||
HOTEND_OFFSET_Y
|
||||
#if ENABLED(DUAL_X_CARRIAGE)
|
||||
, { 0 } // Z offsets for each extruder
|
||||
#endif
|
||||
@ -1249,7 +1249,7 @@ XYZ_CONSTS_FROM_CONFIG(signed char, home_dir, HOME_DIR);
|
||||
* This allow soft recalibration of the second extruder offset position
|
||||
* without firmware reflash (through the M218 command).
|
||||
*/
|
||||
return (extruder_offset[X_AXIS][1] > 0) ? extruder_offset[X_AXIS][1] : X2_HOME_POS;
|
||||
return (hotend_offset[X_AXIS][1] > 0) ? hotend_offset[X_AXIS][1] : X2_HOME_POS;
|
||||
}
|
||||
|
||||
static int x_home_dir(int extruder) {
|
||||
@ -1280,7 +1280,7 @@ static void update_software_endstops(AxisEnum axis) {
|
||||
|
||||
#if ENABLED(DUAL_X_CARRIAGE)
|
||||
if (axis == X_AXIS) {
|
||||
float dual_max_x = max(extruder_offset[X_AXIS][1], X2_MAX_POS);
|
||||
float dual_max_x = max(hotend_offset[X_AXIS][1], X2_MAX_POS);
|
||||
if (active_extruder != 0) {
|
||||
sw_endstop_min[X_AXIS] = X2_MIN_POS + offs;
|
||||
sw_endstop_max[X_AXIS] = dual_max_x + offs;
|
||||
@ -4407,8 +4407,8 @@ inline void gcode_M104() {
|
||||
SERIAL_PROTOCOLPGM(" /");
|
||||
SERIAL_PROTOCOL_F(thermalManager.degTargetBed(), 1);
|
||||
#endif
|
||||
#if EXTRUDERS > 1
|
||||
for (int8_t e = 0; e < EXTRUDERS; ++e) {
|
||||
#if HOTENDS > 1
|
||||
for (int8_t e = 0; e < HOTENDS; ++e) {
|
||||
SERIAL_PROTOCOLPGM(" T");
|
||||
SERIAL_PROTOCOL(e);
|
||||
SERIAL_PROTOCOLCHAR(':');
|
||||
@ -4433,8 +4433,8 @@ inline void gcode_M104() {
|
||||
#else
|
||||
SERIAL_PROTOCOL(thermalManager.getHeaterPower(target_extruder));
|
||||
#endif
|
||||
#if EXTRUDERS > 1
|
||||
for (int8_t e = 0; e < EXTRUDERS; ++e) {
|
||||
#if HOTENDS > 1
|
||||
for (int8_t e = 0; e < HOTENDS; ++e) {
|
||||
SERIAL_PROTOCOLPGM(" @");
|
||||
SERIAL_PROTOCOL(e);
|
||||
SERIAL_PROTOCOLCHAR(':');
|
||||
@ -4453,13 +4453,13 @@ inline void gcode_M104() {
|
||||
SERIAL_PROTOCOLPGM("C->");
|
||||
SERIAL_PROTOCOL_F(thermalManager.rawBedTemp() / OVERSAMPLENR, 0);
|
||||
#endif
|
||||
for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) {
|
||||
for (int8_t cur_hotend = 0; cur_hotend < HOTENDS; ++cur_hotend) {
|
||||
SERIAL_PROTOCOLPGM(" T");
|
||||
SERIAL_PROTOCOL(cur_extruder);
|
||||
SERIAL_PROTOCOL(cur_hotend);
|
||||
SERIAL_PROTOCOLCHAR(':');
|
||||
SERIAL_PROTOCOL_F(thermalManager.degHotend(cur_extruder), 1);
|
||||
SERIAL_PROTOCOL_F(thermalManager.degHotend(cur_hotend), 1);
|
||||
SERIAL_PROTOCOLPGM("C->");
|
||||
SERIAL_PROTOCOL_F(thermalManager.rawHotendTemp(cur_extruder) / OVERSAMPLENR, 0);
|
||||
SERIAL_PROTOCOL_F(thermalManager.rawHotendTemp(cur_hotend) / OVERSAMPLENR, 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@ -5391,7 +5391,7 @@ inline void gcode_M206() {
|
||||
|
||||
#endif // FWRETRACT
|
||||
|
||||
#if EXTRUDERS > 1
|
||||
#if HOTENDS > 1
|
||||
|
||||
/**
|
||||
* M218 - set hotend offset (in mm)
|
||||
@ -5404,29 +5404,29 @@ inline void gcode_M206() {
|
||||
inline void gcode_M218() {
|
||||
if (get_target_extruder_from_command(218)) return;
|
||||
|
||||
if (code_seen('X')) extruder_offset[X_AXIS][target_extruder] = code_value();
|
||||
if (code_seen('Y')) extruder_offset[Y_AXIS][target_extruder] = code_value();
|
||||
if (code_seen('X')) hotend_offset[X_AXIS][target_extruder] = code_value();
|
||||
if (code_seen('Y')) hotend_offset[Y_AXIS][target_extruder] = code_value();
|
||||
|
||||
#if ENABLED(DUAL_X_CARRIAGE)
|
||||
if (code_seen('Z')) extruder_offset[Z_AXIS][target_extruder] = code_value();
|
||||
if (code_seen('Z')) hotend_offset[Z_AXIS][target_extruder] = code_value();
|
||||
#endif
|
||||
|
||||
SERIAL_ECHO_START;
|
||||
SERIAL_ECHOPGM(MSG_HOTEND_OFFSET);
|
||||
for (int e = 0; e < EXTRUDERS; e++) {
|
||||
for (int e = 0; e < HOTENDS; e++) {
|
||||
SERIAL_CHAR(' ');
|
||||
SERIAL_ECHO(extruder_offset[X_AXIS][e]);
|
||||
SERIAL_ECHO(hotend_offset[X_AXIS][e]);
|
||||
SERIAL_CHAR(',');
|
||||
SERIAL_ECHO(extruder_offset[Y_AXIS][e]);
|
||||
SERIAL_ECHO(hotend_offset[Y_AXIS][e]);
|
||||
#if ENABLED(DUAL_X_CARRIAGE)
|
||||
SERIAL_CHAR(',');
|
||||
SERIAL_ECHO(extruder_offset[Z_AXIS][e]);
|
||||
SERIAL_ECHO(hotend_offset[Z_AXIS][e]);
|
||||
#endif
|
||||
}
|
||||
SERIAL_EOL;
|
||||
}
|
||||
|
||||
#endif // EXTRUDERS > 1
|
||||
#endif // HOTENDS > 1
|
||||
|
||||
/**
|
||||
* M220: Set speed percentage factor, aka "Feed Rate" (M220 S95)
|
||||
@ -5556,7 +5556,7 @@ inline void gcode_M226() {
|
||||
// default behaviour (omitting E parameter) is to update for extruder 0 only
|
||||
int e = code_seen('E') ? code_value() : 0; // extruder being updated
|
||||
|
||||
if (e < EXTRUDERS) { // catch bad input value
|
||||
if (e < HOTENDS) { // catch bad input value
|
||||
if (code_seen('P')) PID_PARAM(Kp, e) = code_value();
|
||||
if (code_seen('I')) PID_PARAM(Ki, e) = scalePID_i(code_value());
|
||||
if (code_seen('D')) PID_PARAM(Kd, e) = scalePID_d(code_value());
|
||||
@ -5568,10 +5568,10 @@ inline void gcode_M226() {
|
||||
|
||||
thermalManager.updatePID();
|
||||
SERIAL_ECHO_START;
|
||||
#if ENABLED(PID_PARAMS_PER_EXTRUDER)
|
||||
#if ENABLED(PID_PARAMS_PER_HOTEND)
|
||||
SERIAL_ECHO(" e:"); // specify extruder in serial output
|
||||
SERIAL_ECHO(e);
|
||||
#endif // PID_PARAMS_PER_EXTRUDER
|
||||
#endif // PID_PARAMS_PER_HOTEND
|
||||
SERIAL_ECHO(" p:");
|
||||
SERIAL_ECHO(PID_PARAM(Kp, e));
|
||||
SERIAL_ECHO(" i:");
|
||||
@ -5690,7 +5690,7 @@ inline void gcode_M303() {
|
||||
|
||||
float temp = code_seen('S') ? code_value() : (e < 0 ? 70.0 : 150.0);
|
||||
|
||||
if (e >= 0 && e < EXTRUDERS)
|
||||
if (e >= 0 && e < HOTENDS)
|
||||
target_extruder = e;
|
||||
|
||||
KEEPALIVE_STATE(NOT_BUSY); // don't send "busy: processing" messages during autotune output
|
||||
@ -6272,13 +6272,13 @@ inline void gcode_M503() {
|
||||
SERIAL_ECHO_START;
|
||||
SERIAL_ECHOPGM(MSG_HOTEND_OFFSET);
|
||||
SERIAL_CHAR(' ');
|
||||
SERIAL_ECHO(extruder_offset[X_AXIS][0]);
|
||||
SERIAL_ECHO(hotend_offset[X_AXIS][0]);
|
||||
SERIAL_CHAR(',');
|
||||
SERIAL_ECHO(extruder_offset[Y_AXIS][0]);
|
||||
SERIAL_ECHO(hotend_offset[Y_AXIS][0]);
|
||||
SERIAL_CHAR(' ');
|
||||
SERIAL_ECHO(duplicate_extruder_x_offset);
|
||||
SERIAL_CHAR(',');
|
||||
SERIAL_ECHOLN(extruder_offset[Y_AXIS][1]);
|
||||
SERIAL_ECHOLN(hotend_offset[Y_AXIS][1]);
|
||||
break;
|
||||
case DXC_FULL_CONTROL_MODE:
|
||||
case DXC_AUTO_PARK_MODE:
|
||||
@ -6436,7 +6436,7 @@ inline void gcode_T(uint8_t tmp_extruder) {
|
||||
#endif
|
||||
}
|
||||
|
||||
#if EXTRUDERS > 1
|
||||
#if HOTENDS > 1
|
||||
if (tmp_extruder != active_extruder) {
|
||||
// Save current position to return to after applying extruder offset
|
||||
set_destination_to_current();
|
||||
@ -6454,8 +6454,8 @@ inline void gcode_T(uint8_t tmp_extruder) {
|
||||
}
|
||||
|
||||
// apply Y & Z extruder offset (x offset is already used in determining home pos)
|
||||
current_position[Y_AXIS] -= extruder_offset[Y_AXIS][active_extruder] - extruder_offset[Y_AXIS][tmp_extruder];
|
||||
current_position[Z_AXIS] -= extruder_offset[Z_AXIS][active_extruder] - extruder_offset[Z_AXIS][tmp_extruder];
|
||||
current_position[Y_AXIS] -= hotend_offset[Y_AXIS][active_extruder] - hotend_offset[Y_AXIS][tmp_extruder];
|
||||
current_position[Z_AXIS] -= hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder];
|
||||
active_extruder = tmp_extruder;
|
||||
|
||||
// This function resets the max/min values - the current position may be overwritten below.
|
||||
@ -6485,11 +6485,11 @@ inline void gcode_T(uint8_t tmp_extruder) {
|
||||
#else // !DUAL_X_CARRIAGE
|
||||
#if ENABLED(AUTO_BED_LEVELING_FEATURE)
|
||||
// Offset extruder, make sure to apply the bed level rotation matrix
|
||||
vector_3 tmp_offset_vec = vector_3(extruder_offset[X_AXIS][tmp_extruder],
|
||||
extruder_offset[Y_AXIS][tmp_extruder],
|
||||
vector_3 tmp_offset_vec = vector_3(hotend_offset[X_AXIS][tmp_extruder],
|
||||
hotend_offset[Y_AXIS][tmp_extruder],
|
||||
0),
|
||||
act_offset_vec = vector_3(extruder_offset[X_AXIS][active_extruder],
|
||||
extruder_offset[Y_AXIS][active_extruder],
|
||||
act_offset_vec = vector_3(hotend_offset[X_AXIS][active_extruder],
|
||||
hotend_offset[Y_AXIS][active_extruder],
|
||||
0),
|
||||
offset_vec = tmp_offset_vec - act_offset_vec;
|
||||
|
||||
@ -6521,7 +6521,7 @@ inline void gcode_T(uint8_t tmp_extruder) {
|
||||
|
||||
// The newly-selected extruder is actually at...
|
||||
for (int i=X_AXIS; i<=Y_AXIS; i++) {
|
||||
float diff = extruder_offset[i][tmp_extruder] - extruder_offset[i][active_extruder];
|
||||
float diff = hotend_offset[i][tmp_extruder] - hotend_offset[i][active_extruder];
|
||||
current_position[i] += diff;
|
||||
position_shift[i] += diff; // Offset the coordinate space
|
||||
update_software_endstops((AxisEnum)i);
|
||||
@ -6552,7 +6552,7 @@ inline void gcode_T(uint8_t tmp_extruder) {
|
||||
enable_solenoid_on_active_extruder();
|
||||
#endif // EXT_SOLENOID
|
||||
|
||||
#endif // EXTRUDERS > 1
|
||||
#endif // HOTENDS > 1
|
||||
|
||||
feedrate = stored_feedrate;
|
||||
|
||||
@ -6983,7 +6983,7 @@ void process_next_command() {
|
||||
break;
|
||||
#endif // FWRETRACT
|
||||
|
||||
#if EXTRUDERS > 1
|
||||
#if HOTENDS > 1
|
||||
case 218: // M218 - set hotend offset (in mm), T<extruder_number> X<offset_on_X> Y<offset_on_Y>
|
||||
gcode_M218();
|
||||
break;
|
||||
@ -7853,8 +7853,8 @@ void prepare_move() {
|
||||
float max_temp = 0.0;
|
||||
if (ELAPSED(millis(), next_status_led_update_ms)) {
|
||||
next_status_led_update_ms += 500; // Update every 0.5s
|
||||
for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder)
|
||||
max_temp = max(max(max_temp, thermalManager.degHotend(cur_extruder)), thermalManager.degTargetHotend(cur_extruder));
|
||||
for (int8_t cur_hotend = 0; cur_hotend < HOTENDS; ++cur_hotend)
|
||||
max_temp = max(max(max_temp, thermalManager.degHotend(cur_hotend)), thermalManager.degTargetHotend(cur_hotend));
|
||||
#if HAS_TEMP_BED
|
||||
max_temp = max(max(max_temp, thermalManager.degTargetBed()), thermalManager.degBed());
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user