From 4ce9ddbb74052bce8799326e03bd9f5daa081957 Mon Sep 17 00:00:00 2001 From: Scott Lahteine <sourcetree@thinkyhead.com> Date: Mon, 15 Jun 2015 17:50:26 -0700 Subject: [PATCH 1/4] Check the temperature before filament change --- Marlin/Marlin_main.cpp | 6 ++++++ Marlin/configurator/config/language.h | 1 + Marlin/language.h | 1 + 3 files changed, 8 insertions(+) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 24eb8911516..3dae65f713d 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -4891,6 +4891,12 @@ inline void gcode_M503() { */ inline void gcode_M600() { float target[NUM_AXIS], lastpos[NUM_AXIS], fr60 = feedrate / 60; + if (degHotend(active_extruder) < extrude_min_temp) { + SERIAL_ERROR_START; + SERIAL_ERRORLNPGM(MSG_TOO_COLD_FOR_M600); + return; + } + for (int i=0; i<NUM_AXIS; i++) target[i] = lastpos[i] = current_position[i]; diff --git a/Marlin/configurator/config/language.h b/Marlin/configurator/config/language.h index 5f3d790c5e3..f83a0d9a1ec 100644 --- a/Marlin/configurator/config/language.h +++ b/Marlin/configurator/config/language.h @@ -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" diff --git a/Marlin/language.h b/Marlin/language.h index eb20a5b92b1..14052527003 100644 --- a/Marlin/language.h +++ b/Marlin/language.h @@ -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" From 97ec224d72247537ed1c498f1660e4eee4c58709 Mon Sep 17 00:00:00 2001 From: Scott Lahteine <sourcetree@thinkyhead.com> Date: Mon, 15 Jun 2015 17:52:51 -0700 Subject: [PATCH 2/4] Replace target with destination in M600 --- Marlin/Marlin_main.cpp | 55 ++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 3dae65f713d..2d9ea465e60 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -4890,55 +4890,57 @@ inline void gcode_M503() { * M600: Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal] */ inline void gcode_M600() { - float target[NUM_AXIS], lastpos[NUM_AXIS], fr60 = feedrate / 60; + if (degHotend(active_extruder) < extrude_min_temp) { SERIAL_ERROR_START; SERIAL_ERRORLNPGM(MSG_TOO_COLD_FOR_M600); return; } - for (int i=0; i<NUM_AXIS; i++) - target[i] = lastpos[i] = current_position[i]; + float lastpos[NUM_AXIS], fr60 = feedrate / 60; + + for (int i=0; i<NUM_AXIS; i++) + lastpos[i] = destination[i] = current_position[i]; - #define BASICPLAN plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], fr60, active_extruder); #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; @@ -4972,12 +4974,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 @@ -4986,12 +4988,17 @@ inline void gcode_M503() { #ifdef DELTA 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 From fb16a83b8ab491efb8c1f4c0c901d0a186e96d5f Mon Sep 17 00:00:00 2001 From: Scott Lahteine <sourcetree@thinkyhead.com> Date: Mon, 15 Jun 2015 17:54:41 -0700 Subject: [PATCH 3/4] Cleanup M600 documentation comments --- Marlin/Marlin_main.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 2d9ea465e60..4b77c64bae5 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -4887,7 +4887,16 @@ 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() { @@ -4987,6 +4996,7 @@ 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], destination[E_AXIS], fr60, active_extruder); plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], lastpos[E_AXIS], fr60, active_extruder); From 5ccb1c9e7d49dc2496574b925d74f78393606028 Mon Sep 17 00:00:00 2001 From: Scott Lahteine <sourcetree@thinkyhead.com> Date: Mon, 15 Jun 2015 17:55:39 -0700 Subject: [PATCH 4/4] Use millis for M600 audio feedback interval --- Marlin/Marlin_main.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 4b77c64bae5..9a7c2909429 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -4963,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(); @@ -4976,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;