|
@ -242,7 +242,7 @@ static unsigned long max_inactive_time = 0; |
|
|
static unsigned long stepper_inactive_time = DEFAULT_STEPPER_DEACTIVE_TIME*1000l; |
|
|
static unsigned long stepper_inactive_time = DEFAULT_STEPPER_DEACTIVE_TIME*1000l; |
|
|
unsigned long starttime = 0; ///< Print job start time
|
|
|
unsigned long starttime = 0; ///< Print job start time
|
|
|
unsigned long stoptime = 0; ///< Print job stop time
|
|
|
unsigned long stoptime = 0; ///< Print job stop time
|
|
|
static uint8_t tmp_extruder; |
|
|
static uint8_t target_extruder; |
|
|
bool Stopped = false; |
|
|
bool Stopped = false; |
|
|
bool CooldownNoWait = true; |
|
|
bool CooldownNoWait = true; |
|
|
bool target_direction; |
|
|
bool target_direction; |
|
@ -856,7 +856,9 @@ float code_value() { |
|
|
return ret; |
|
|
return ret; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
long code_value_long() { return (strtol(strchr_pointer + 1, NULL, 10)); } |
|
|
long code_value_long() { return strtol(strchr_pointer + 1, NULL, 10); } |
|
|
|
|
|
|
|
|
|
|
|
int16_t code_value_short() { return (int16_t)strtol(strchr_pointer + 1, NULL, 10); } |
|
|
|
|
|
|
|
|
bool code_seen(char code) { |
|
|
bool code_seen(char code) { |
|
|
strchr_pointer = strchr(cmdbuffer[bufindr], code); |
|
|
strchr_pointer = strchr(cmdbuffer[bufindr], code); |
|
@ -1409,9 +1411,9 @@ inline void sync_plan_position() { |
|
|
for (int y = 0; y < AUTO_BED_LEVELING_GRID_POINTS; y++) { |
|
|
for (int y = 0; y < AUTO_BED_LEVELING_GRID_POINTS; y++) { |
|
|
for (int x = 0; x < AUTO_BED_LEVELING_GRID_POINTS; x++) { |
|
|
for (int x = 0; x < AUTO_BED_LEVELING_GRID_POINTS; x++) { |
|
|
SERIAL_PROTOCOL_F(bed_level[x][y], 2); |
|
|
SERIAL_PROTOCOL_F(bed_level[x][y], 2); |
|
|
SERIAL_PROTOCOLPGM(" "); |
|
|
SERIAL_PROTOCOLCHAR(' '); |
|
|
} |
|
|
} |
|
|
SERIAL_ECHOLN(""); |
|
|
SERIAL_EOL; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -1710,7 +1712,7 @@ inline void gcode_G4() { |
|
|
inline void gcode_G10_G11(bool doRetract=false) { |
|
|
inline void gcode_G10_G11(bool doRetract=false) { |
|
|
#if EXTRUDERS > 1 |
|
|
#if EXTRUDERS > 1 |
|
|
if (doRetract) { |
|
|
if (doRetract) { |
|
|
retracted_swap[active_extruder] = (code_seen('S') && code_value_long() == 1); // checks for swap retract argument
|
|
|
retracted_swap[active_extruder] = (code_seen('S') && code_value_short() == 1); // checks for swap retract argument
|
|
|
} |
|
|
} |
|
|
#endif |
|
|
#endif |
|
|
retract(doRetract |
|
|
retract(doRetract |
|
@ -2028,7 +2030,7 @@ inline void gcode_G28() { |
|
|
inline void gcode_G29() { |
|
|
inline void gcode_G29() { |
|
|
|
|
|
|
|
|
static int probe_point = -1; |
|
|
static int probe_point = -1; |
|
|
MeshLevelingState state = code_seen('S') || code_seen('s') ? (MeshLevelingState)code_value_long() : MeshReport; |
|
|
MeshLevelingState state = code_seen('S') || code_seen('s') ? (MeshLevelingState)code_value_short() : MeshReport; |
|
|
if (state < 0 || state > 2) { |
|
|
if (state < 0 || state > 2) { |
|
|
SERIAL_PROTOCOLLNPGM("S out of range (0-2)."); |
|
|
SERIAL_PROTOCOLLNPGM("S out of range (0-2)."); |
|
|
return; |
|
|
return; |
|
@ -2039,7 +2041,7 @@ inline void gcode_G28() { |
|
|
if (mbl.active) { |
|
|
if (mbl.active) { |
|
|
SERIAL_PROTOCOLPGM("Num X,Y: "); |
|
|
SERIAL_PROTOCOLPGM("Num X,Y: "); |
|
|
SERIAL_PROTOCOL(MESH_NUM_X_POINTS); |
|
|
SERIAL_PROTOCOL(MESH_NUM_X_POINTS); |
|
|
SERIAL_PROTOCOLPGM(","); |
|
|
SERIAL_PROTOCOLCHAR(','); |
|
|
SERIAL_PROTOCOL(MESH_NUM_Y_POINTS); |
|
|
SERIAL_PROTOCOL(MESH_NUM_Y_POINTS); |
|
|
SERIAL_PROTOCOLPGM("\nZ search height: "); |
|
|
SERIAL_PROTOCOLPGM("\nZ search height: "); |
|
|
SERIAL_PROTOCOL(MESH_HOME_SEARCH_Z); |
|
|
SERIAL_PROTOCOL(MESH_HOME_SEARCH_Z); |
|
@ -2155,7 +2157,7 @@ inline void gcode_G28() { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
int verbose_level = code_seen('V') || code_seen('v') ? code_value_long() : 1; |
|
|
int verbose_level = code_seen('V') || code_seen('v') ? code_value_short() : 1; |
|
|
if (verbose_level < 0 || verbose_level > 4) { |
|
|
if (verbose_level < 0 || verbose_level > 4) { |
|
|
SERIAL_ECHOLNPGM("?(V)erbose Level is implausible (0-4)."); |
|
|
SERIAL_ECHOLNPGM("?(V)erbose Level is implausible (0-4)."); |
|
|
return; |
|
|
return; |
|
@ -2177,19 +2179,19 @@ inline void gcode_G28() { |
|
|
|
|
|
|
|
|
int auto_bed_leveling_grid_points = AUTO_BED_LEVELING_GRID_POINTS; |
|
|
int auto_bed_leveling_grid_points = AUTO_BED_LEVELING_GRID_POINTS; |
|
|
#ifndef DELTA |
|
|
#ifndef DELTA |
|
|
if (code_seen('P')) auto_bed_leveling_grid_points = code_value_long(); |
|
|
if (code_seen('P')) auto_bed_leveling_grid_points = code_value_short(); |
|
|
if (auto_bed_leveling_grid_points < 2) { |
|
|
if (auto_bed_leveling_grid_points < 2) { |
|
|
SERIAL_PROTOCOLPGM("?Number of probed (P)oints is implausible (2 minimum).\n"); |
|
|
SERIAL_PROTOCOLPGM("?Number of probed (P)oints is implausible (2 minimum).\n"); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
xy_travel_speed = code_seen('S') ? code_value_long() : XY_TRAVEL_SPEED; |
|
|
xy_travel_speed = code_seen('S') ? code_value_short() : XY_TRAVEL_SPEED; |
|
|
|
|
|
|
|
|
int left_probe_bed_position = code_seen('L') ? code_value_long() : LEFT_PROBE_BED_POSITION, |
|
|
int left_probe_bed_position = code_seen('L') ? code_value_short() : LEFT_PROBE_BED_POSITION, |
|
|
right_probe_bed_position = code_seen('R') ? code_value_long() : RIGHT_PROBE_BED_POSITION, |
|
|
right_probe_bed_position = code_seen('R') ? code_value_short() : RIGHT_PROBE_BED_POSITION, |
|
|
front_probe_bed_position = code_seen('F') ? code_value_long() : FRONT_PROBE_BED_POSITION, |
|
|
front_probe_bed_position = code_seen('F') ? code_value_short() : FRONT_PROBE_BED_POSITION, |
|
|
back_probe_bed_position = code_seen('B') ? code_value_long() : BACK_PROBE_BED_POSITION; |
|
|
back_probe_bed_position = code_seen('B') ? code_value_short() : BACK_PROBE_BED_POSITION; |
|
|
|
|
|
|
|
|
bool left_out_l = left_probe_bed_position < MIN_PROBE_X, |
|
|
bool left_out_l = left_probe_bed_position < MIN_PROBE_X, |
|
|
left_out = left_out_l || left_probe_bed_position > right_probe_bed_position - MIN_PROBE_EDGE, |
|
|
left_out = left_out_l || left_probe_bed_position > right_probe_bed_position - MIN_PROBE_EDGE, |
|
@ -2393,7 +2395,7 @@ inline void gcode_G28() { |
|
|
if (diff >= 0.0) |
|
|
if (diff >= 0.0) |
|
|
SERIAL_PROTOCOLPGM(" +"); // Include + for column alignment
|
|
|
SERIAL_PROTOCOLPGM(" +"); // Include + for column alignment
|
|
|
else |
|
|
else |
|
|
SERIAL_PROTOCOLPGM(" "); |
|
|
SERIAL_PROTOCOLCHAR(' '); |
|
|
SERIAL_PROTOCOL_F(diff, 5); |
|
|
SERIAL_PROTOCOL_F(diff, 5); |
|
|
} // xx
|
|
|
} // xx
|
|
|
SERIAL_EOL; |
|
|
SERIAL_EOL; |
|
@ -2517,11 +2519,11 @@ inline void gcode_G92() { |
|
|
unsigned long codenum = 0; |
|
|
unsigned long codenum = 0; |
|
|
bool hasP = false, hasS = false; |
|
|
bool hasP = false, hasS = false; |
|
|
if (code_seen('P')) { |
|
|
if (code_seen('P')) { |
|
|
codenum = code_value(); // milliseconds to wait
|
|
|
codenum = code_value_short(); // milliseconds to wait
|
|
|
hasP = codenum > 0; |
|
|
hasP = codenum > 0; |
|
|
} |
|
|
} |
|
|
if (code_seen('S')) { |
|
|
if (code_seen('S')) { |
|
|
codenum = code_value() * 1000; // seconds to wait
|
|
|
codenum = code_value_short() * 1000UL; // seconds to wait
|
|
|
hasS = codenum > 0; |
|
|
hasS = codenum > 0; |
|
|
} |
|
|
} |
|
|
char* starpos = strchr(src, '*'); |
|
|
char* starpos = strchr(src, '*'); |
|
@ -2633,7 +2635,7 @@ inline void gcode_M17() { |
|
|
*/ |
|
|
*/ |
|
|
inline void gcode_M26() { |
|
|
inline void gcode_M26() { |
|
|
if (card.cardOK && code_seen('S')) |
|
|
if (card.cardOK && code_seen('S')) |
|
|
card.setIndex(code_value_long()); |
|
|
card.setIndex(code_value_short()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
@ -2724,7 +2726,7 @@ inline void gcode_M31() { |
|
|
card.openFile(namestartpos, true, !call_procedure); |
|
|
card.openFile(namestartpos, true, !call_procedure); |
|
|
|
|
|
|
|
|
if (code_seen('S') && strchr_pointer < namestartpos) // "S" (must occur _before_ the filename!)
|
|
|
if (code_seen('S') && strchr_pointer < namestartpos) // "S" (must occur _before_ the filename!)
|
|
|
card.setIndex(code_value_long()); |
|
|
card.setIndex(code_value_short()); |
|
|
|
|
|
|
|
|
card.startFileprint(); |
|
|
card.startFileprint(); |
|
|
if (!call_procedure) |
|
|
if (!call_procedure) |
|
@ -2752,11 +2754,11 @@ inline void gcode_M31() { |
|
|
*/ |
|
|
*/ |
|
|
inline void gcode_M42() { |
|
|
inline void gcode_M42() { |
|
|
if (code_seen('S')) { |
|
|
if (code_seen('S')) { |
|
|
int pin_status = code_value(), |
|
|
int pin_status = code_value_short(), |
|
|
pin_number = LED_PIN; |
|
|
pin_number = LED_PIN; |
|
|
|
|
|
|
|
|
if (code_seen('P') && pin_status >= 0 && pin_status <= 255) |
|
|
if (code_seen('P') && pin_status >= 0 && pin_status <= 255) |
|
|
pin_number = code_value(); |
|
|
pin_number = code_value_short(); |
|
|
|
|
|
|
|
|
for (int8_t i = 0; i < (int8_t)(sizeof(sensitive_pins) / sizeof(*sensitive_pins)); i++) { |
|
|
for (int8_t i = 0; i < (int8_t)(sizeof(sensitive_pins) / sizeof(*sensitive_pins)); i++) { |
|
|
if (sensitive_pins[i] == pin_number) { |
|
|
if (sensitive_pins[i] == pin_number) { |
|
@ -2815,7 +2817,7 @@ inline void gcode_M42() { |
|
|
int verbose_level = 1, n_samples = 10, n_legs = 0; |
|
|
int verbose_level = 1, n_samples = 10, n_legs = 0; |
|
|
|
|
|
|
|
|
if (code_seen('V') || code_seen('v')) { |
|
|
if (code_seen('V') || code_seen('v')) { |
|
|
verbose_level = code_value(); |
|
|
verbose_level = code_value_short(); |
|
|
if (verbose_level < 0 || verbose_level > 4 ) { |
|
|
if (verbose_level < 0 || verbose_level > 4 ) { |
|
|
SERIAL_PROTOCOLPGM("?Verbose Level not plausible (0-4).\n"); |
|
|
SERIAL_PROTOCOLPGM("?Verbose Level not plausible (0-4).\n"); |
|
|
return; |
|
|
return; |
|
@ -2826,7 +2828,7 @@ inline void gcode_M42() { |
|
|
SERIAL_PROTOCOLPGM("M48 Z-Probe Repeatability test\n"); |
|
|
SERIAL_PROTOCOLPGM("M48 Z-Probe Repeatability test\n"); |
|
|
|
|
|
|
|
|
if (code_seen('P') || code_seen('p') || code_seen('n')) { // `n` for legacy support only - please use `P`!
|
|
|
if (code_seen('P') || code_seen('p') || code_seen('n')) { // `n` for legacy support only - please use `P`!
|
|
|
n_samples = code_value(); |
|
|
n_samples = code_value_short(); |
|
|
if (n_samples < 4 || n_samples > 50) { |
|
|
if (n_samples < 4 || n_samples > 50) { |
|
|
SERIAL_PROTOCOLPGM("?Sample size not plausible (4-50).\n"); |
|
|
SERIAL_PROTOCOLPGM("?Sample size not plausible (4-50).\n"); |
|
|
return; |
|
|
return; |
|
@ -2859,7 +2861,7 @@ inline void gcode_M42() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (code_seen('L') || code_seen('l')) { |
|
|
if (code_seen('L') || code_seen('l')) { |
|
|
n_legs = code_value(); |
|
|
n_legs = code_value_short(); |
|
|
if (n_legs == 1) n_legs = 2; |
|
|
if (n_legs == 1) n_legs = 2; |
|
|
if (n_legs < 0 || n_legs > 15) { |
|
|
if (n_legs < 0 || n_legs > 15) { |
|
|
SERIAL_PROTOCOLPGM("?Number of legs in movement not plausible (0-15).\n"); |
|
|
SERIAL_PROTOCOLPGM("?Number of legs in movement not plausible (0-15).\n"); |
|
@ -3041,13 +3043,16 @@ inline void gcode_M42() { |
|
|
inline void gcode_M104() { |
|
|
inline void gcode_M104() { |
|
|
if (setTargetedHotend(104)) return; |
|
|
if (setTargetedHotend(104)) return; |
|
|
|
|
|
|
|
|
if (code_seen('S')) setTargetHotend(code_value(), tmp_extruder); |
|
|
if (code_seen('S')) { |
|
|
|
|
|
float temp = code_value(); |
|
|
|
|
|
setTargetHotend(temp, target_extruder); |
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && tmp_extruder == 0) |
|
|
if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && target_extruder == 0) |
|
|
setTargetHotend1(code_value() == 0.0 ? 0.0 : code_value() + duplicate_extruder_temp_offset); |
|
|
setTargetHotend1(temp == 0.0 ? 0.0 : temp + duplicate_extruder_temp_offset); |
|
|
#endif |
|
|
#endif |
|
|
setWatch(); |
|
|
setWatch(); |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* M105: Read hot end and bed temperature |
|
|
* M105: Read hot end and bed temperature |
|
@ -3057,9 +3062,9 @@ inline void gcode_M105() { |
|
|
|
|
|
|
|
|
#if HAS_TEMP_0 |
|
|
#if HAS_TEMP_0 |
|
|
SERIAL_PROTOCOLPGM("ok T:"); |
|
|
SERIAL_PROTOCOLPGM("ok T:"); |
|
|
SERIAL_PROTOCOL_F(degHotend(tmp_extruder),1); |
|
|
SERIAL_PROTOCOL_F(degHotend(target_extruder),1); |
|
|
SERIAL_PROTOCOLPGM(" /"); |
|
|
SERIAL_PROTOCOLPGM(" /"); |
|
|
SERIAL_PROTOCOL_F(degTargetHotend(tmp_extruder),1); |
|
|
SERIAL_PROTOCOL_F(degTargetHotend(target_extruder),1); |
|
|
#if HAS_TEMP_BED |
|
|
#if HAS_TEMP_BED |
|
|
SERIAL_PROTOCOLPGM(" B:"); |
|
|
SERIAL_PROTOCOLPGM(" B:"); |
|
|
SERIAL_PROTOCOL_F(degBed(),1); |
|
|
SERIAL_PROTOCOL_F(degBed(),1); |
|
@ -3069,7 +3074,7 @@ inline void gcode_M105() { |
|
|
for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) { |
|
|
for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) { |
|
|
SERIAL_PROTOCOLPGM(" T"); |
|
|
SERIAL_PROTOCOLPGM(" T"); |
|
|
SERIAL_PROTOCOL(cur_extruder); |
|
|
SERIAL_PROTOCOL(cur_extruder); |
|
|
SERIAL_PROTOCOLPGM(":"); |
|
|
SERIAL_PROTOCOLCHAR(':'); |
|
|
SERIAL_PROTOCOL_F(degHotend(cur_extruder),1); |
|
|
SERIAL_PROTOCOL_F(degHotend(cur_extruder),1); |
|
|
SERIAL_PROTOCOLPGM(" /"); |
|
|
SERIAL_PROTOCOLPGM(" /"); |
|
|
SERIAL_PROTOCOL_F(degTargetHotend(cur_extruder),1); |
|
|
SERIAL_PROTOCOL_F(degTargetHotend(cur_extruder),1); |
|
@ -3081,16 +3086,16 @@ inline void gcode_M105() { |
|
|
|
|
|
|
|
|
SERIAL_PROTOCOLPGM(" @:"); |
|
|
SERIAL_PROTOCOLPGM(" @:"); |
|
|
#ifdef EXTRUDER_WATTS |
|
|
#ifdef EXTRUDER_WATTS |
|
|
SERIAL_PROTOCOL((EXTRUDER_WATTS * getHeaterPower(tmp_extruder))/127); |
|
|
SERIAL_PROTOCOL((EXTRUDER_WATTS * getHeaterPower(target_extruder))/127); |
|
|
SERIAL_PROTOCOLPGM("W"); |
|
|
SERIAL_PROTOCOLCHAR('W'); |
|
|
#else |
|
|
#else |
|
|
SERIAL_PROTOCOL(getHeaterPower(tmp_extruder)); |
|
|
SERIAL_PROTOCOL(getHeaterPower(target_extruder)); |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
SERIAL_PROTOCOLPGM(" B@:"); |
|
|
SERIAL_PROTOCOLPGM(" B@:"); |
|
|
#ifdef BED_WATTS |
|
|
#ifdef BED_WATTS |
|
|
SERIAL_PROTOCOL((BED_WATTS * getHeaterPower(-1))/127); |
|
|
SERIAL_PROTOCOL((BED_WATTS * getHeaterPower(-1))/127); |
|
|
SERIAL_PROTOCOLPGM("W"); |
|
|
SERIAL_PROTOCOLCHAR('W'); |
|
|
#else |
|
|
#else |
|
|
SERIAL_PROTOCOL(getHeaterPower(-1)); |
|
|
SERIAL_PROTOCOL(getHeaterPower(-1)); |
|
|
#endif |
|
|
#endif |
|
@ -3105,7 +3110,7 @@ inline void gcode_M105() { |
|
|
for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) { |
|
|
for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) { |
|
|
SERIAL_PROTOCOLPGM(" T"); |
|
|
SERIAL_PROTOCOLPGM(" T"); |
|
|
SERIAL_PROTOCOL(cur_extruder); |
|
|
SERIAL_PROTOCOL(cur_extruder); |
|
|
SERIAL_PROTOCOLPGM(":"); |
|
|
SERIAL_PROTOCOLCHAR(':'); |
|
|
SERIAL_PROTOCOL_F(degHotend(cur_extruder),1); |
|
|
SERIAL_PROTOCOL_F(degHotend(cur_extruder),1); |
|
|
SERIAL_PROTOCOLPGM("C->"); |
|
|
SERIAL_PROTOCOLPGM("C->"); |
|
|
SERIAL_PROTOCOL_F(rawHotendTemp(cur_extruder)/OVERSAMPLENR,0); |
|
|
SERIAL_PROTOCOL_F(rawHotendTemp(cur_extruder)/OVERSAMPLENR,0); |
|
@ -3120,7 +3125,7 @@ inline void gcode_M105() { |
|
|
/**
|
|
|
/**
|
|
|
* M106: Set Fan Speed |
|
|
* M106: Set Fan Speed |
|
|
*/ |
|
|
*/ |
|
|
inline void gcode_M106() { fanSpeed = code_seen('S') ? constrain(code_value(), 0, 255) : 255; } |
|
|
inline void gcode_M106() { fanSpeed = code_seen('S') ? constrain(code_value_short(), 0, 255) : 255; } |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* M107: Fan Off |
|
|
* M107: Fan Off |
|
@ -3139,10 +3144,11 @@ inline void gcode_M109() { |
|
|
|
|
|
|
|
|
CooldownNoWait = code_seen('S'); |
|
|
CooldownNoWait = code_seen('S'); |
|
|
if (CooldownNoWait || code_seen('R')) { |
|
|
if (CooldownNoWait || code_seen('R')) { |
|
|
setTargetHotend(code_value(), tmp_extruder); |
|
|
float temp = code_value(); |
|
|
|
|
|
setTargetHotend(temp, target_extruder); |
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && tmp_extruder == 0) |
|
|
if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && target_extruder == 0) |
|
|
setTargetHotend1(code_value() == 0.0 ? 0.0 : code_value() + duplicate_extruder_temp_offset); |
|
|
setTargetHotend1(temp == 0.0 ? 0.0 : temp + duplicate_extruder_temp_offset); |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -3158,7 +3164,7 @@ inline void gcode_M109() { |
|
|
unsigned long timetemp = millis(); |
|
|
unsigned long timetemp = millis(); |
|
|
|
|
|
|
|
|
/* See if we are heating up or cooling down */ |
|
|
/* See if we are heating up or cooling down */ |
|
|
target_direction = isHeatingHotend(tmp_extruder); // true if heating, false if cooling
|
|
|
target_direction = isHeatingHotend(target_extruder); // true if heating, false if cooling
|
|
|
|
|
|
|
|
|
cancel_heatup = false; |
|
|
cancel_heatup = false; |
|
|
|
|
|
|
|
@ -3169,15 +3175,15 @@ inline void gcode_M109() { |
|
|
while((!cancel_heatup)&&((residencyStart == -1) || |
|
|
while((!cancel_heatup)&&((residencyStart == -1) || |
|
|
(residencyStart >= 0 && (((unsigned int) (millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL)))) ) |
|
|
(residencyStart >= 0 && (((unsigned int) (millis() - residencyStart)) < (TEMP_RESIDENCY_TIME * 1000UL)))) ) |
|
|
#else |
|
|
#else |
|
|
while ( target_direction ? (isHeatingHotend(tmp_extruder)) : (isCoolingHotend(tmp_extruder)&&(CooldownNoWait==false)) ) |
|
|
while ( target_direction ? (isHeatingHotend(target_extruder)) : (isCoolingHotend(target_extruder)&&(CooldownNoWait==false)) ) |
|
|
#endif //TEMP_RESIDENCY_TIME
|
|
|
#endif //TEMP_RESIDENCY_TIME
|
|
|
|
|
|
|
|
|
{ // while loop
|
|
|
{ // while loop
|
|
|
if (millis() > timetemp + 1000UL) { //Print temp & remaining time every 1s while waiting
|
|
|
if (millis() > timetemp + 1000UL) { //Print temp & remaining time every 1s while waiting
|
|
|
SERIAL_PROTOCOLPGM("T:"); |
|
|
SERIAL_PROTOCOLPGM("T:"); |
|
|
SERIAL_PROTOCOL_F(degHotend(tmp_extruder),1); |
|
|
SERIAL_PROTOCOL_F(degHotend(target_extruder),1); |
|
|
SERIAL_PROTOCOLPGM(" E:"); |
|
|
SERIAL_PROTOCOLPGM(" E:"); |
|
|
SERIAL_PROTOCOL((int)tmp_extruder); |
|
|
SERIAL_PROTOCOL((int)target_extruder); |
|
|
#ifdef TEMP_RESIDENCY_TIME |
|
|
#ifdef TEMP_RESIDENCY_TIME |
|
|
SERIAL_PROTOCOLPGM(" W:"); |
|
|
SERIAL_PROTOCOLPGM(" W:"); |
|
|
if (residencyStart > -1) { |
|
|
if (residencyStart > -1) { |
|
@ -3198,9 +3204,9 @@ inline void gcode_M109() { |
|
|
#ifdef TEMP_RESIDENCY_TIME |
|
|
#ifdef TEMP_RESIDENCY_TIME |
|
|
// start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time
|
|
|
// start/restart the TEMP_RESIDENCY_TIME timer whenever we reach target temp for the first time
|
|
|
// or when current temp falls outside the hysteresis after target temp was reached
|
|
|
// or when current temp falls outside the hysteresis after target temp was reached
|
|
|
if ((residencyStart == -1 && target_direction && (degHotend(tmp_extruder) >= (degTargetHotend(tmp_extruder)-TEMP_WINDOW))) || |
|
|
if ((residencyStart == -1 && target_direction && (degHotend(target_extruder) >= (degTargetHotend(target_extruder)-TEMP_WINDOW))) || |
|
|
(residencyStart == -1 && !target_direction && (degHotend(tmp_extruder) <= (degTargetHotend(tmp_extruder)+TEMP_WINDOW))) || |
|
|
(residencyStart == -1 && !target_direction && (degHotend(target_extruder) <= (degTargetHotend(target_extruder)+TEMP_WINDOW))) || |
|
|
(residencyStart > -1 && labs(degHotend(tmp_extruder) - degTargetHotend(tmp_extruder)) > TEMP_HYSTERESIS) ) |
|
|
(residencyStart > -1 && labs(degHotend(target_extruder) - degTargetHotend(target_extruder)) > TEMP_HYSTERESIS) ) |
|
|
{ |
|
|
{ |
|
|
residencyStart = millis(); |
|
|
residencyStart = millis(); |
|
|
} |
|
|
} |
|
@ -3538,9 +3544,9 @@ inline void gcode_M121() { enable_endstops(true); } |
|
|
*/ |
|
|
*/ |
|
|
inline void gcode_M150() { |
|
|
inline void gcode_M150() { |
|
|
SendColors( |
|
|
SendColors( |
|
|
code_seen('R') ? (byte)code_value() : 0, |
|
|
code_seen('R') ? (byte)code_value_short() : 0, |
|
|
code_seen('U') ? (byte)code_value() : 0, |
|
|
code_seen('U') ? (byte)code_value_short() : 0, |
|
|
code_seen('B') ? (byte)code_value() : 0 |
|
|
code_seen('B') ? (byte)code_value_short() : 0 |
|
|
); |
|
|
); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -3552,9 +3558,9 @@ inline void gcode_M121() { enable_endstops(true); } |
|
|
* D<millimeters> |
|
|
* D<millimeters> |
|
|
*/ |
|
|
*/ |
|
|
inline void gcode_M200() { |
|
|
inline void gcode_M200() { |
|
|
tmp_extruder = active_extruder; |
|
|
int tmp_extruder = active_extruder; |
|
|
if (code_seen('T')) { |
|
|
if (code_seen('T')) { |
|
|
tmp_extruder = code_value(); |
|
|
tmp_extruder = code_value_short(); |
|
|
if (tmp_extruder >= EXTRUDERS) { |
|
|
if (tmp_extruder >= EXTRUDERS) { |
|
|
SERIAL_ECHO_START; |
|
|
SERIAL_ECHO_START; |
|
|
SERIAL_ECHO(MSG_M200_INVALID_EXTRUDER); |
|
|
SERIAL_ECHO(MSG_M200_INVALID_EXTRUDER); |
|
@ -3625,27 +3631,23 @@ inline void gcode_M203() { |
|
|
* Also sets minimum segment time in ms (B20000) to prevent buffer under-runs and M20 minimum feedrate |
|
|
* Also sets minimum segment time in ms (B20000) to prevent buffer under-runs and M20 minimum feedrate |
|
|
*/ |
|
|
*/ |
|
|
inline void gcode_M204() { |
|
|
inline void gcode_M204() { |
|
|
if (code_seen('S')) // Kept for legacy compatibility. Should NOT BE USED for new developments.
|
|
|
if (code_seen('S')) { // Kept for legacy compatibility. Should NOT BE USED for new developments.
|
|
|
{ |
|
|
|
|
|
acceleration = code_value(); |
|
|
acceleration = code_value(); |
|
|
travel_acceleration = acceleration; |
|
|
travel_acceleration = acceleration; |
|
|
SERIAL_ECHOPAIR("Setting Printing and Travelling Acceleration: ", acceleration ); |
|
|
SERIAL_ECHOPAIR("Setting Print and Travel Acceleration: ", acceleration ); |
|
|
SERIAL_EOL; |
|
|
SERIAL_EOL; |
|
|
} |
|
|
} |
|
|
if (code_seen('P')) |
|
|
if (code_seen('P')) { |
|
|
{ |
|
|
|
|
|
acceleration = code_value(); |
|
|
acceleration = code_value(); |
|
|
SERIAL_ECHOPAIR("Setting Printing Acceleration: ", acceleration ); |
|
|
SERIAL_ECHOPAIR("Setting Print Acceleration: ", acceleration ); |
|
|
SERIAL_EOL; |
|
|
SERIAL_EOL; |
|
|
} |
|
|
} |
|
|
if (code_seen('R')) |
|
|
if (code_seen('R')) { |
|
|
{ |
|
|
|
|
|
retract_acceleration = code_value(); |
|
|
retract_acceleration = code_value(); |
|
|
SERIAL_ECHOPAIR("Setting Retract Acceleration: ", retract_acceleration ); |
|
|
SERIAL_ECHOPAIR("Setting Retract Acceleration: ", retract_acceleration ); |
|
|
SERIAL_EOL; |
|
|
SERIAL_EOL; |
|
|
} |
|
|
} |
|
|
if (code_seen('T')) |
|
|
if (code_seen('T')) { |
|
|
{ |
|
|
|
|
|
travel_acceleration = code_value(); |
|
|
travel_acceleration = code_value(); |
|
|
SERIAL_ECHOPAIR("Setting Travel Acceleration: ", travel_acceleration ); |
|
|
SERIAL_ECHOPAIR("Setting Travel Acceleration: ", travel_acceleration ); |
|
|
SERIAL_EOL; |
|
|
SERIAL_EOL; |
|
@ -3748,7 +3750,7 @@ inline void gcode_M206() { |
|
|
*/ |
|
|
*/ |
|
|
inline void gcode_M209() { |
|
|
inline void gcode_M209() { |
|
|
if (code_seen('S')) { |
|
|
if (code_seen('S')) { |
|
|
int t = code_value(); |
|
|
int t = code_value_short(); |
|
|
switch(t) { |
|
|
switch(t) { |
|
|
case 0: |
|
|
case 0: |
|
|
autoretract_enabled = false; |
|
|
autoretract_enabled = false; |
|
@ -3777,23 +3779,23 @@ inline void gcode_M206() { |
|
|
inline void gcode_M218() { |
|
|
inline void gcode_M218() { |
|
|
if (setTargetedHotend(218)) return; |
|
|
if (setTargetedHotend(218)) return; |
|
|
|
|
|
|
|
|
if (code_seen('X')) extruder_offset[X_AXIS][tmp_extruder] = code_value(); |
|
|
if (code_seen('X')) extruder_offset[X_AXIS][target_extruder] = code_value(); |
|
|
if (code_seen('Y')) extruder_offset[Y_AXIS][tmp_extruder] = code_value(); |
|
|
if (code_seen('Y')) extruder_offset[Y_AXIS][target_extruder] = code_value(); |
|
|
|
|
|
|
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
if (code_seen('Z')) extruder_offset[Z_AXIS][tmp_extruder] = code_value(); |
|
|
if (code_seen('Z')) extruder_offset[Z_AXIS][target_extruder] = code_value(); |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
SERIAL_ECHO_START; |
|
|
SERIAL_ECHO_START; |
|
|
SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); |
|
|
SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); |
|
|
for (tmp_extruder = 0; tmp_extruder < EXTRUDERS; tmp_extruder++) { |
|
|
for (int e = 0; e < EXTRUDERS; e++) { |
|
|
SERIAL_ECHO(" "); |
|
|
SERIAL_CHAR(' '); |
|
|
SERIAL_ECHO(extruder_offset[X_AXIS][tmp_extruder]); |
|
|
SERIAL_ECHO(extruder_offset[X_AXIS][e]); |
|
|
SERIAL_ECHO(","); |
|
|
SERIAL_CHAR(','); |
|
|
SERIAL_ECHO(extruder_offset[Y_AXIS][tmp_extruder]); |
|
|
SERIAL_ECHO(extruder_offset[Y_AXIS][e]); |
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
#ifdef DUAL_X_CARRIAGE |
|
|
SERIAL_ECHO(","); |
|
|
SERIAL_CHAR(','); |
|
|
SERIAL_ECHO(extruder_offset[Z_AXIS][tmp_extruder]); |
|
|
SERIAL_ECHO(extruder_offset[Z_AXIS][e]); |
|
|
#endif |
|
|
#endif |
|
|
} |
|
|
} |
|
|
SERIAL_EOL; |
|
|
SERIAL_EOL; |
|
@ -3816,7 +3818,7 @@ inline void gcode_M221() { |
|
|
int sval = code_value(); |
|
|
int sval = code_value(); |
|
|
if (code_seen('T')) { |
|
|
if (code_seen('T')) { |
|
|
if (setTargetedHotend(221)) return; |
|
|
if (setTargetedHotend(221)) return; |
|
|
extruder_multiply[tmp_extruder] = sval; |
|
|
extruder_multiply[target_extruder] = sval; |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
extruder_multiply[active_extruder] = sval; |
|
|
extruder_multiply[active_extruder] = sval; |
|
@ -4047,7 +4049,7 @@ inline void gcode_M226() { |
|
|
* M250: Read and optionally set the LCD contrast |
|
|
* M250: Read and optionally set the LCD contrast |
|
|
*/ |
|
|
*/ |
|
|
inline void gcode_M250() { |
|
|
inline void gcode_M250() { |
|
|
if (code_seen('C')) lcd_setcontrast(code_value_long() & 0x3F); |
|
|
if (code_seen('C')) lcd_setcontrast(code_value_short() & 0x3F); |
|
|
SERIAL_PROTOCOLPGM("lcd contrast value: "); |
|
|
SERIAL_PROTOCOLPGM("lcd contrast value: "); |
|
|
SERIAL_PROTOCOL(lcd_contrast); |
|
|
SERIAL_PROTOCOL(lcd_contrast); |
|
|
SERIAL_PROTOCOLLN(""); |
|
|
SERIAL_PROTOCOLLN(""); |
|
@ -4073,8 +4075,8 @@ inline void gcode_M226() { |
|
|
* C<cycles> |
|
|
* C<cycles> |
|
|
*/ |
|
|
*/ |
|
|
inline void gcode_M303() { |
|
|
inline void gcode_M303() { |
|
|
int e = code_seen('E') ? code_value_long() : 0; |
|
|
int e = code_seen('E') ? code_value_short() : 0; |
|
|
int c = code_seen('C') ? code_value_long() : 5; |
|
|
int c = code_seen('C') ? code_value_short() : 5; |
|
|
float temp = code_seen('S') ? code_value() : (e < 0 ? 70.0 : 150.0); |
|
|
float temp = code_seen('S') ? code_value() : (e < 0 ? 70.0 : 150.0); |
|
|
PID_autotune(temp, e, c); |
|
|
PID_autotune(temp, e, c); |
|
|
} |
|
|
} |
|
@ -4483,13 +4485,13 @@ inline void gcode_M503() { |
|
|
if (code_seen('R')) duplicate_extruder_temp_offset = code_value(); |
|
|
if (code_seen('R')) duplicate_extruder_temp_offset = code_value(); |
|
|
SERIAL_ECHO_START; |
|
|
SERIAL_ECHO_START; |
|
|
SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); |
|
|
SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); |
|
|
SERIAL_ECHO(" "); |
|
|
SERIAL_CHAR(' '); |
|
|
SERIAL_ECHO(extruder_offset[X_AXIS][0]); |
|
|
SERIAL_ECHO(extruder_offset[X_AXIS][0]); |
|
|
SERIAL_ECHO(","); |
|
|
SERIAL_CHAR(','); |
|
|
SERIAL_ECHO(extruder_offset[Y_AXIS][0]); |
|
|
SERIAL_ECHO(extruder_offset[Y_AXIS][0]); |
|
|
SERIAL_ECHO(" "); |
|
|
SERIAL_CHAR(' '); |
|
|
SERIAL_ECHO(duplicate_extruder_x_offset); |
|
|
SERIAL_ECHO(duplicate_extruder_x_offset); |
|
|
SERIAL_ECHO(","); |
|
|
SERIAL_CHAR(','); |
|
|
SERIAL_ECHOLN(extruder_offset[Y_AXIS][1]); |
|
|
SERIAL_ECHOLN(extruder_offset[Y_AXIS][1]); |
|
|
break; |
|
|
break; |
|
|
case DXC_FULL_CONTROL_MODE: |
|
|
case DXC_FULL_CONTROL_MODE: |
|
@ -4562,7 +4564,7 @@ inline void gcode_M907() { |
|
|
* S# determines MS1 or MS2, X# sets the pin high/low. |
|
|
* S# determines MS1 or MS2, X# sets the pin high/low. |
|
|
*/ |
|
|
*/ |
|
|
inline void gcode_M351() { |
|
|
inline void gcode_M351() { |
|
|
if (code_seen('S')) switch(code_value_long()) { |
|
|
if (code_seen('S')) switch(code_value_short()) { |
|
|
case 1: |
|
|
case 1: |
|
|
for(int i=0;i<NUM_AXIS;i++) if (code_seen(axis_codes[i])) microstep_ms(i, code_value(), -1); |
|
|
for(int i=0;i<NUM_AXIS;i++) if (code_seen(axis_codes[i])) microstep_ms(i, code_value(), -1); |
|
|
if (code_seen('B')) microstep_ms(4, code_value(), -1); |
|
|
if (code_seen('B')) microstep_ms(4, code_value(), -1); |
|
@ -4588,21 +4590,26 @@ inline void gcode_M999() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
inline void gcode_T() { |
|
|
inline void gcode_T() { |
|
|
tmp_extruder = code_value(); |
|
|
int tmp_extruder = code_value(); |
|
|
if (tmp_extruder >= EXTRUDERS) { |
|
|
if (tmp_extruder >= EXTRUDERS) { |
|
|
SERIAL_ECHO_START; |
|
|
SERIAL_ECHO_START; |
|
|
SERIAL_ECHO("T"); |
|
|
SERIAL_CHAR('T'); |
|
|
SERIAL_ECHO(tmp_extruder); |
|
|
SERIAL_ECHO(tmp_extruder); |
|
|
SERIAL_ECHOLN(MSG_INVALID_EXTRUDER); |
|
|
SERIAL_ECHOLN(MSG_INVALID_EXTRUDER); |
|
|
} |
|
|
} |
|
|
else { |
|
|
else { |
|
|
|
|
|
target_extruder = tmp_extruder; |
|
|
|
|
|
|
|
|
#if EXTRUDERS > 1 |
|
|
#if EXTRUDERS > 1 |
|
|
bool make_move = false; |
|
|
bool make_move = false; |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
if (code_seen('F')) { |
|
|
if (code_seen('F')) { |
|
|
|
|
|
|
|
|
#if EXTRUDERS > 1 |
|
|
#if EXTRUDERS > 1 |
|
|
make_move = true; |
|
|
make_move = true; |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
next_feedrate = code_value(); |
|
|
next_feedrate = code_value(); |
|
|
if (next_feedrate > 0.0) feedrate = next_feedrate; |
|
|
if (next_feedrate > 0.0) feedrate = next_feedrate; |
|
|
} |
|
|
} |
|
@ -4692,7 +4699,7 @@ inline void gcode_T() { |
|
|
void process_commands() { |
|
|
void process_commands() { |
|
|
if (code_seen('G')) { |
|
|
if (code_seen('G')) { |
|
|
|
|
|
|
|
|
int gCode = code_value_long(); |
|
|
int gCode = code_value_short(); |
|
|
|
|
|
|
|
|
switch(gCode) { |
|
|
switch(gCode) { |
|
|
|
|
|
|
|
@ -4767,7 +4774,7 @@ void process_commands() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
else if (code_seen('M')) { |
|
|
else if (code_seen('M')) { |
|
|
switch( code_value_long() ) { |
|
|
switch(code_value_short()) { |
|
|
#ifdef ULTIPANEL |
|
|
#ifdef ULTIPANEL |
|
|
case 0: // M0 - Unconditional stop - Wait for user button press on LCD
|
|
|
case 0: // M0 - Unconditional stop - Wait for user button press on LCD
|
|
|
case 1: // M1 - Conditional stop - Wait for user button press on LCD
|
|
|
case 1: // M1 - Conditional stop - Wait for user button press on LCD
|
|
@ -5922,10 +5929,10 @@ void setPwmFrequency(uint8_t pin, int val) |
|
|
#endif //FAST_PWM_FAN
|
|
|
#endif //FAST_PWM_FAN
|
|
|
|
|
|
|
|
|
bool setTargetedHotend(int code){ |
|
|
bool setTargetedHotend(int code){ |
|
|
tmp_extruder = active_extruder; |
|
|
target_extruder = active_extruder; |
|
|
if (code_seen('T')) { |
|
|
if (code_seen('T')) { |
|
|
tmp_extruder = code_value(); |
|
|
target_extruder = code_value_short(); |
|
|
if(tmp_extruder >= EXTRUDERS) { |
|
|
if (target_extruder >= EXTRUDERS) { |
|
|
SERIAL_ECHO_START; |
|
|
SERIAL_ECHO_START; |
|
|
switch(code){ |
|
|
switch(code){ |
|
|
case 104: |
|
|
case 104: |
|
@ -5944,7 +5951,7 @@ bool setTargetedHotend(int code){ |
|
|
SERIAL_ECHO(MSG_M221_INVALID_EXTRUDER); |
|
|
SERIAL_ECHO(MSG_M221_INVALID_EXTRUDER); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
SERIAL_ECHOLN(tmp_extruder); |
|
|
SERIAL_ECHOLN(target_extruder); |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|