|
@@ -29,6 +29,8 @@
|
29
|
29
|
|
30
|
30
|
#if ENABLED(ADVANCED_PAUSE_FEATURE)
|
31
|
31
|
|
|
32
|
+//#define DEBUG_PAUSE_RESUME
|
|
33
|
+
|
32
|
34
|
#include "../MarlinCore.h"
|
33
|
35
|
#include "../gcode/gcode.h"
|
34
|
36
|
#include "../module/motion.h"
|
|
@@ -62,6 +64,9 @@
|
62
|
64
|
#include "../libs/nozzle.h"
|
63
|
65
|
#include "pause.h"
|
64
|
66
|
|
|
67
|
+#define DEBUG_OUT ENABLED(DEBUG_PAUSE_RESUME)
|
|
68
|
+#include "../core/debug_out.h"
|
|
69
|
+
|
65
|
70
|
// private:
|
66
|
71
|
|
67
|
72
|
static xyze_pos_t resume_position;
|
|
@@ -120,25 +125,32 @@ fil_change_settings_t fc_settings[EXTRUDERS];
|
120
|
125
|
* Returns 'true' if heating was completed, 'false' for abort
|
121
|
126
|
*/
|
122
|
127
|
static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=PAUSE_MODE_SAME) {
|
|
128
|
+ DEBUG_SECTION(est, "ensure_safe_temperature", true);
|
|
129
|
+ DEBUG_ECHOLNPAIR("... wait:", int(wait), " mode:", int(mode));
|
123
|
130
|
|
124
|
|
- #if ENABLED(PREVENT_COLD_EXTRUSION)
|
125
|
|
- if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) {
|
126
|
|
- SERIAL_ECHO_MSG(STR_ERR_HOTEND_TOO_COLD);
|
127
|
|
- return false;
|
128
|
|
- }
|
129
|
|
- #endif
|
|
131
|
+ if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder))
|
|
132
|
+ thermalManager.setTargetHotend(thermalManager.extrude_min_temp, active_extruder);
|
130
|
133
|
|
131
|
134
|
#if HAS_LCD_MENU
|
132
|
135
|
lcd_pause_show_message(PAUSE_MESSAGE_HEATING, mode);
|
133
|
|
- #else
|
134
|
|
- UNUSED(mode);
|
135
|
136
|
#endif
|
|
137
|
+ UNUSED(mode);
|
136
|
138
|
|
137
|
139
|
if (wait)
|
138
|
140
|
return thermalManager.wait_for_hotend(active_extruder);
|
139
|
141
|
|
140
|
|
- while (ABS(thermalManager.degHotend(active_extruder) - thermalManager.degTargetHotend(active_extruder)) > TEMP_WINDOW)
|
|
142
|
+ wait_for_heatup = true; // Allow interruption by Emergency Parser M108
|
|
143
|
+ while (wait_for_heatup && ABS(thermalManager.degHotend(active_extruder) - thermalManager.degTargetHotend(active_extruder)) > TEMP_WINDOW)
|
141
|
144
|
idle();
|
|
145
|
+ wait_for_heatup = false;
|
|
146
|
+
|
|
147
|
+ #if ENABLED(PREVENT_COLD_EXTRUSION)
|
|
148
|
+ // A user can cancel wait-for-heating with M108
|
|
149
|
+ if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) {
|
|
150
|
+ SERIAL_ECHO_MSG(STR_ERR_HOTEND_TOO_COLD);
|
|
151
|
+ return false;
|
|
152
|
+ }
|
|
153
|
+ #endif
|
142
|
154
|
|
143
|
155
|
return true;
|
144
|
156
|
}
|
|
@@ -160,7 +172,10 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l
|
160
|
172
|
const PauseMode mode/*=PAUSE_MODE_PAUSE_PRINT*/
|
161
|
173
|
DXC_ARGS
|
162
|
174
|
) {
|
163
|
|
- TERN(HAS_LCD_MENU,,UNUSED(show_lcd));
|
|
175
|
+ DEBUG_SECTION(lf, "load_filament", true);
|
|
176
|
+ DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", int(max_beep_count), " showlcd:", int(show_lcd), " pauseforuser:", int(pause_for_user), " pausemode:", int(mode) DXC_SAY);
|
|
177
|
+
|
|
178
|
+ UNUSED(show_lcd);
|
164
|
179
|
|
165
|
180
|
if (!ensure_safe_temperature(false, mode)) {
|
166
|
181
|
#if HAS_LCD_MENU
|
|
@@ -292,7 +307,14 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/,
|
292
|
307
|
, const float &mix_multiplier/*=1.0*/
|
293
|
308
|
#endif
|
294
|
309
|
) {
|
295
|
|
- TERN(HAS_LCD_MENU,,UNUSED(show_lcd));
|
|
310
|
+ DEBUG_SECTION(uf, "unload_filament", true);
|
|
311
|
+ DEBUG_ECHOLNPAIR("... unloadlen:", unload_length, " showlcd:", int(show_lcd), " mode:", int(mode)
|
|
312
|
+ #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER)
|
|
313
|
+ , " mixmult:", mix_multiplier
|
|
314
|
+ #endif
|
|
315
|
+ );
|
|
316
|
+
|
|
317
|
+ UNUSED(show_lcd);
|
296
|
318
|
|
297
|
319
|
#if !BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER)
|
298
|
320
|
constexpr float mix_multiplier = 1.0;
|
|
@@ -358,7 +380,10 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/,
|
358
|
380
|
uint8_t did_pause_print = 0;
|
359
|
381
|
|
360
|
382
|
bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) {
|
361
|
|
- TERN(HAS_LCD_MENU,,UNUSED(show_lcd));
|
|
383
|
+ DEBUG_SECTION(pp, "pause_print", true);
|
|
384
|
+ DEBUG_ECHOLNPAIR("... retract:", retract, " park.x:", park_point.x, " y:", park_point.y, " z:", park_point.z, " unloadlen:", unload_length, " showlcd:", int(show_lcd) DXC_SAY);
|
|
385
|
+
|
|
386
|
+ UNUSED(show_lcd);
|
362
|
387
|
|
363
|
388
|
if (did_pause_print) return false; // already paused
|
364
|
389
|
|
|
@@ -449,12 +474,18 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float
|
449
|
474
|
*/
|
450
|
475
|
|
451
|
476
|
void show_continue_prompt(const bool is_reload) {
|
|
477
|
+ DEBUG_SECTION(scp, "pause_print", true);
|
|
478
|
+ DEBUG_ECHOLNPAIR("... is_reload:", int(is_reload));
|
|
479
|
+
|
452
|
480
|
TERN_(HAS_LCD_MENU, lcd_pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING));
|
453
|
481
|
SERIAL_ECHO_START();
|
454
|
482
|
serialprintPGM(is_reload ? PSTR(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : PSTR(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n"));
|
455
|
483
|
}
|
456
|
484
|
|
457
|
485
|
void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep_count/*=0*/ DXC_ARGS) {
|
|
486
|
+ DEBUG_SECTION(wfc, "wait_for_confirmation", true);
|
|
487
|
+ DEBUG_ECHOLNPAIR("... is_reload:", is_reload, " maxbeep:", int(max_beep_count) DXC_SAY);
|
|
488
|
+
|
458
|
489
|
bool nozzle_timed_out = false;
|
459
|
490
|
|
460
|
491
|
show_continue_prompt(is_reload);
|
|
@@ -551,6 +582,9 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep
|
551
|
582
|
* - Resume the current SD print job, if any
|
552
|
583
|
*/
|
553
|
584
|
void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, int16_t targetTemp/*=0*/ DXC_ARGS) {
|
|
585
|
+ DEBUG_SECTION(rp, "resume_print", true);
|
|
586
|
+ DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", int(max_beep_count), " targetTemp:", targetTemp DXC_SAY);
|
|
587
|
+
|
554
|
588
|
/*
|
555
|
589
|
SERIAL_ECHOLNPAIR(
|
556
|
590
|
"start of resume_print()\ndual_x_carriage_mode:", dual_x_carriage_mode,
|