Merge Fix M600 (PR#2301)
This commit is contained in:
commit
e09abb1b31
3 changed files with 57 additions and 27 deletions
|
@ -4887,52 +4887,69 @@ inline void gcode_M503() {
|
|||
#ifdef FILAMENTCHANGEENABLE
|
||||
|
||||
/**
|
||||
* M600: Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal]
|
||||
* M600: Pause for filament change
|
||||
*
|
||||
* E[distance] - Retract the filament this far (negative value)
|
||||
* Z[distance] - Move the Z axis by this distance
|
||||
* X[position] - Move to this X position, with Y
|
||||
* Y[position] - Move to this Y position, with X
|
||||
* L[distance] - Retract distance for removal (manual reload)
|
||||
*
|
||||
* Default values are used for omitted arguments.
|
||||
*
|
||||
*/
|
||||
inline void gcode_M600() {
|
||||
float target[NUM_AXIS], lastpos[NUM_AXIS], fr60 = feedrate / 60;
|
||||
for (int i=0; i<NUM_AXIS; i++)
|
||||
target[i] = lastpos[i] = current_position[i];
|
||||
|
||||
#define BASICPLAN plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], fr60, active_extruder);
|
||||
if (degHotend(active_extruder) < extrude_min_temp) {
|
||||
SERIAL_ERROR_START;
|
||||
SERIAL_ERRORLNPGM(MSG_TOO_COLD_FOR_M600);
|
||||
return;
|
||||
}
|
||||
|
||||
float lastpos[NUM_AXIS], fr60 = feedrate / 60;
|
||||
|
||||
for (int i=0; i<NUM_AXIS; i++)
|
||||
lastpos[i] = destination[i] = current_position[i];
|
||||
|
||||
#ifdef DELTA
|
||||
#define RUNPLAN calculate_delta(target); BASICPLAN
|
||||
#define RUNPLAN calculate_delta(destination); \
|
||||
plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], destination[E_AXIS], fr60, active_extruder);
|
||||
#else
|
||||
#define RUNPLAN BASICPLAN
|
||||
#define RUNPLAN line_to_destination();
|
||||
#endif
|
||||
|
||||
//retract by E
|
||||
if (code_seen('E')) target[E_AXIS] += code_value();
|
||||
if (code_seen('E')) destination[E_AXIS] += code_value();
|
||||
#ifdef FILAMENTCHANGE_FIRSTRETRACT
|
||||
else target[E_AXIS] += FILAMENTCHANGE_FIRSTRETRACT;
|
||||
else destination[E_AXIS] += FILAMENTCHANGE_FIRSTRETRACT;
|
||||
#endif
|
||||
|
||||
RUNPLAN;
|
||||
|
||||
//lift Z
|
||||
if (code_seen('Z')) target[Z_AXIS] += code_value();
|
||||
if (code_seen('Z')) destination[Z_AXIS] += code_value();
|
||||
#ifdef FILAMENTCHANGE_ZADD
|
||||
else target[Z_AXIS] += FILAMENTCHANGE_ZADD;
|
||||
else destination[Z_AXIS] += FILAMENTCHANGE_ZADD;
|
||||
#endif
|
||||
|
||||
RUNPLAN;
|
||||
|
||||
//move xy
|
||||
if (code_seen('X')) target[X_AXIS] = code_value();
|
||||
if (code_seen('X')) destination[X_AXIS] = code_value();
|
||||
#ifdef FILAMENTCHANGE_XPOS
|
||||
else target[X_AXIS] = FILAMENTCHANGE_XPOS;
|
||||
else destination[X_AXIS] = FILAMENTCHANGE_XPOS;
|
||||
#endif
|
||||
|
||||
if (code_seen('Y')) target[Y_AXIS] = code_value();
|
||||
if (code_seen('Y')) destination[Y_AXIS] = code_value();
|
||||
#ifdef FILAMENTCHANGE_YPOS
|
||||
else target[Y_AXIS] = FILAMENTCHANGE_YPOS;
|
||||
else destination[Y_AXIS] = FILAMENTCHANGE_YPOS;
|
||||
#endif
|
||||
|
||||
RUNPLAN;
|
||||
|
||||
if (code_seen('L')) target[E_AXIS] += code_value();
|
||||
if (code_seen('L')) destination[E_AXIS] += code_value();
|
||||
#ifdef FILAMENTCHANGE_FINALRETRACT
|
||||
else target[E_AXIS] += FILAMENTCHANGE_FINALRETRACT;
|
||||
else destination[E_AXIS] += FILAMENTCHANGE_FINALRETRACT;
|
||||
#endif
|
||||
|
||||
RUNPLAN;
|
||||
|
@ -4946,10 +4963,14 @@ inline void gcode_M503() {
|
|||
disable_e3();
|
||||
delay(100);
|
||||
LCD_ALERTMESSAGEPGM(MSG_FILAMENTCHANGE);
|
||||
uint8_t cnt = 0;
|
||||
millis_t next_tick = 0;
|
||||
while (!lcd_clicked()) {
|
||||
#ifndef AUTO_FILAMENT_CHANGE
|
||||
if (++cnt == 0) lcd_quick_feedback(); // every 256th frame till the lcd is clicked
|
||||
millis_t ms = millis();
|
||||
if (ms >= next_tick) {
|
||||
lcd_quick_feedback();
|
||||
next_tick = ms + 2500; // feedback every 2.5s while waiting
|
||||
}
|
||||
manage_heater();
|
||||
manage_inactivity(true);
|
||||
lcd_update();
|
||||
|
@ -4959,6 +4980,7 @@ inline void gcode_M503() {
|
|||
st_synchronize();
|
||||
#endif
|
||||
} // while(!lcd_clicked)
|
||||
lcd_quick_feedback(); // click sound feedback
|
||||
|
||||
#ifdef AUTO_FILAMENT_CHANGE
|
||||
current_position[E_AXIS]= 0;
|
||||
|
@ -4966,12 +4988,12 @@ inline void gcode_M503() {
|
|||
#endif
|
||||
|
||||
//return to normal
|
||||
if (code_seen('L')) target[E_AXIS] -= code_value();
|
||||
if (code_seen('L')) destination[E_AXIS] -= code_value();
|
||||
#ifdef FILAMENTCHANGE_FINALRETRACT
|
||||
else target[E_AXIS] -= FILAMENTCHANGE_FINALRETRACT;
|
||||
else destination[E_AXIS] -= FILAMENTCHANGE_FINALRETRACT;
|
||||
#endif
|
||||
|
||||
current_position[E_AXIS] = target[E_AXIS]; //the long retract of L is compensated by manual filament feeding
|
||||
current_position[E_AXIS] = destination[E_AXIS]; //the long retract of L is compensated by manual filament feeding
|
||||
plan_set_e_position(current_position[E_AXIS]);
|
||||
|
||||
RUNPLAN; //should do nothing
|
||||
|
@ -4979,13 +5001,19 @@ inline void gcode_M503() {
|
|||
lcd_reset_alert_level();
|
||||
|
||||
#ifdef DELTA
|
||||
// Move XYZ to starting position, then E
|
||||
calculate_delta(lastpos);
|
||||
plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], target[E_AXIS], fr60, active_extruder); //move xyz back
|
||||
plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], lastpos[E_AXIS], fr60, active_extruder); //final untretract
|
||||
plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], destination[E_AXIS], fr60, active_extruder);
|
||||
plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], lastpos[E_AXIS], fr60, active_extruder);
|
||||
#else
|
||||
plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], target[Z_AXIS], target[E_AXIS], fr60, active_extruder); //move xy back
|
||||
plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], target[E_AXIS], fr60, active_extruder); //move z back
|
||||
plan_buffer_line(lastpos[X_AXIS], lastpos[Y_AXIS], lastpos[Z_AXIS], lastpos[E_AXIS], fr60, active_extruder); //final untretract
|
||||
// Move XY to starting position, then Z, then E
|
||||
destination[X_AXIS] = lastpos[X_AXIS];
|
||||
destination[Y_AXIS] = lastpos[Y_AXIS];
|
||||
line_to_destination();
|
||||
destination[Z_AXIS] = lastpos[Z_AXIS];
|
||||
line_to_destination();
|
||||
destination[E_AXIS] = lastpos[E_AXIS];
|
||||
line_to_destination();
|
||||
#endif
|
||||
|
||||
#ifdef FILAMENT_RUNOUT_SENSOR
|
||||
|
|
|
@ -170,6 +170,7 @@
|
|||
#define MSG_ENDSTOPS_HIT "endstops hit: "
|
||||
#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented"
|
||||
#define MSG_ERR_LONG_EXTRUDE_STOP " too long extrusion prevented"
|
||||
#define MSG_TOO_COLD_FOR_M600 "M600 Hotend too cold to change filament"
|
||||
#define MSG_BABYSTEPPING_X "Babystepping X"
|
||||
#define MSG_BABYSTEPPING_Y "Babystepping Y"
|
||||
#define MSG_BABYSTEPPING_Z "Babystepping Z"
|
||||
|
|
|
@ -171,6 +171,7 @@
|
|||
#define MSG_ENDSTOPS_HIT "endstops hit: "
|
||||
#define MSG_ERR_COLD_EXTRUDE_STOP " cold extrusion prevented"
|
||||
#define MSG_ERR_LONG_EXTRUDE_STOP " too long extrusion prevented"
|
||||
#define MSG_TOO_COLD_FOR_M600 "M600 Hotend too cold to change filament"
|
||||
#define MSG_BABYSTEPPING_X "Babystepping X"
|
||||
#define MSG_BABYSTEPPING_Y "Babystepping Y"
|
||||
#define MSG_BABYSTEPPING_Z "Babystepping Z"
|
||||
|
|
Reference in a new issue