@@ -78,6 +78,14 @@ PrintJobRecovery recovery;
78
78
#define POWER_LOSS_RETRACT_LEN 0
79
79
#endif
80
80
81
+ // Allow power-loss recovery to be aborted
82
+ #define PLR_CAN_ABORT
83
+ #if ENABLED(PLR_CAN_ABORT)
84
+ #define PROCESS_SUBCOMMANDS_NOW (cmd ) do { if (card.flag .abort_sd_printing ) return ; gcode.process_subcommands_now (cmd); }while (0 )
85
+ #else
86
+ #define PROCESS_SUBCOMMANDS_NOW (cmd ) gcode.process_subcommands_now(cmd)
87
+ #endif
88
+
81
89
/* *
82
90
* Clear the recovery info
83
91
*/
@@ -357,15 +365,15 @@ void PrintJobRecovery::resume() {
357
365
358
366
#if HAS_LEVELING
359
367
// Make sure leveling is off before any G92 and G28
360
- gcode. process_subcommands_now (F (" M420 S0 Z0 " ));
368
+ PROCESS_SUBCOMMANDS_NOW (F (" M420S0 " ));
361
369
#endif
362
370
363
371
#if HAS_HEATED_BED
364
372
const celsius_t bt = info.target_temperature_bed ;
365
373
if (bt) {
366
374
// Restore the bed temperature
367
375
sprintf_P (cmd, PSTR (" M190S%i" ), bt);
368
- gcode. process_subcommands_now (cmd);
376
+ PROCESS_SUBCOMMANDS_NOW (cmd);
369
377
}
370
378
#endif
371
379
@@ -376,10 +384,10 @@ void PrintJobRecovery::resume() {
376
384
if (et) {
377
385
#if HAS_MULTI_HOTEND
378
386
sprintf_P (cmd, PSTR (" T%iS" ), e);
379
- gcode. process_subcommands_now (cmd);
387
+ PROCESS_SUBCOMMANDS_NOW (cmd);
380
388
#endif
381
389
sprintf_P (cmd, PSTR (" M109S%i" ), et);
382
- gcode. process_subcommands_now (cmd);
390
+ PROCESS_SUBCOMMANDS_NOW (cmd);
383
391
}
384
392
}
385
393
#endif
@@ -393,7 +401,7 @@ void PrintJobRecovery::resume() {
393
401
// establish the current position as best we can.
394
402
//
395
403
396
- gcode. process_subcommands_now (F (" G92.9E0" )); // Reset E to 0
404
+ PROCESS_SUBCOMMANDS_NOW (F (" G92.9E0" )); // Reset E to 0
397
405
398
406
#if Z_HOME_TO_MAX
399
407
@@ -404,7 +412,7 @@ void PrintJobRecovery::resume() {
404
412
" G28R0\n " // Home all axes (no raise)
405
413
" G1Z%sF1200" // Move Z down to (raised) height
406
414
), dtostrf (z_now, 1 , 3 , str_1));
407
- gcode. process_subcommands_now (cmd);
415
+ PROCESS_SUBCOMMANDS_NOW (cmd);
408
416
409
417
#elif DISABLED(BELTPRINTER)
410
418
@@ -417,26 +425,26 @@ void PrintJobRecovery::resume() {
417
425
#if !HOMING_Z_DOWN
418
426
// Set Z to the real position
419
427
sprintf_P (cmd, PSTR (" G92.9Z%s" ), dtostrf (z_now, 1 , 3 , str_1));
420
- gcode. process_subcommands_now (cmd);
428
+ PROCESS_SUBCOMMANDS_NOW (cmd);
421
429
#endif
422
430
423
431
// Does Z need to be raised now? It should be raised before homing XY.
424
432
if (z_raised > z_now) {
425
433
z_now = z_raised;
426
434
sprintf_P (cmd, PSTR (" G1Z%sF600" ), dtostrf (z_now, 1 , 3 , str_1));
427
- gcode. process_subcommands_now (cmd);
435
+ PROCESS_SUBCOMMANDS_NOW (cmd);
428
436
}
429
437
430
438
// Home XY with no Z raise
431
- gcode. process_subcommands_now (F (" G28R0XY" )); // No raise during G28
439
+ PROCESS_SUBCOMMANDS_NOW (F (" G28R0XY" )); // No raise during G28
432
440
433
441
#endif
434
442
435
443
#if HOMING_Z_DOWN
436
444
// Move to a safe XY position and home Z while avoiding the print.
437
445
const xy_pos_t p = xy_pos_t (POWER_LOSS_ZHOME_POS) TERN_ (HOMING_Z_WITH_PROBE, - probe.offset_xy );
438
446
sprintf_P (cmd, PSTR (" G1X%sY%sF1000\n G28HZ" ), dtostrf (p.x , 1 , 3 , str_1), dtostrf (p.y , 1 , 3 , str_2));
439
- gcode. process_subcommands_now (cmd);
447
+ PROCESS_SUBCOMMANDS_NOW (cmd);
440
448
#endif
441
449
442
450
// Mark all axes as having been homed (no effect on current_position)
@@ -447,37 +455,37 @@ void PrintJobRecovery::resume() {
447
455
// Leveling may already be enabled due to the ENABLE_LEVELING_AFTER_G28 option.
448
456
// TODO: Add a G28 parameter to leave leveling disabled.
449
457
sprintf_P (cmd, PSTR (" M420S%cZ%s" ), ' 0' + (char )info.flag .leveling , dtostrf (info.fade , 1 , 1 , str_1));
450
- gcode. process_subcommands_now (cmd);
458
+ PROCESS_SUBCOMMANDS_NOW (cmd);
451
459
452
460
#if !HOMING_Z_DOWN
453
461
// The physical Z was adjusted at power-off so undo the M420S1 correction to Z with G92.9.
454
462
sprintf_P (cmd, PSTR (" G92.9Z%s" ), dtostrf (z_now, 1 , 1 , str_1));
455
- gcode. process_subcommands_now (cmd);
463
+ PROCESS_SUBCOMMANDS_NOW (cmd);
456
464
#endif
457
465
#endif
458
466
459
467
#if ENABLED(POWER_LOSS_RECOVER_ZHOME)
460
468
// Z was homed down to the bed, so move up to the raised height.
461
469
z_now = z_raised;
462
470
sprintf_P (cmd, PSTR (" G1Z%sF600" ), dtostrf (z_now, 1 , 3 , str_1));
463
- gcode. process_subcommands_now (cmd);
471
+ PROCESS_SUBCOMMANDS_NOW (cmd);
464
472
#endif
465
473
466
474
// Recover volumetric extrusion state
467
475
#if DISABLED(NO_VOLUMETRICS)
468
476
#if HAS_MULTI_EXTRUDER
469
477
EXTRUDER_LOOP () {
470
478
sprintf_P (cmd, PSTR (" M200T%iD%s" ), e, dtostrf (info.filament_size [e], 1 , 3 , str_1));
471
- gcode. process_subcommands_now (cmd);
479
+ PROCESS_SUBCOMMANDS_NOW (cmd);
472
480
}
473
481
if (!info.flag .volumetric_enabled ) {
474
482
sprintf_P (cmd, PSTR (" M200T%iD0" ), info.active_extruder );
475
- gcode. process_subcommands_now (cmd);
483
+ PROCESS_SUBCOMMANDS_NOW (cmd);
476
484
}
477
485
#else
478
486
if (info.flag .volumetric_enabled ) {
479
487
sprintf_P (cmd, PSTR (" M200D%s" ), dtostrf (info.filament_size [0 ], 1 , 3 , str_1));
480
- gcode. process_subcommands_now (cmd);
488
+ PROCESS_SUBCOMMANDS_NOW (cmd);
481
489
}
482
490
#endif
483
491
#endif
@@ -489,18 +497,18 @@ void PrintJobRecovery::resume() {
489
497
if (et) {
490
498
#if HAS_MULTI_HOTEND
491
499
sprintf_P (cmd, PSTR (" T%iS" ), e);
492
- gcode. process_subcommands_now (cmd);
500
+ PROCESS_SUBCOMMANDS_NOW (cmd);
493
501
#endif
494
502
sprintf_P (cmd, PSTR (" M109S%i" ), et);
495
- gcode. process_subcommands_now (cmd);
503
+ PROCESS_SUBCOMMANDS_NOW (cmd);
496
504
}
497
505
}
498
506
#endif
499
507
500
508
// Restore the previously active tool (with no_move)
501
509
#if HAS_MULTI_EXTRUDER || HAS_MULTI_HOTEND
502
510
sprintf_P (cmd, PSTR (" T%i S" ), info.active_extruder );
503
- gcode. process_subcommands_now (cmd);
511
+ PROCESS_SUBCOMMANDS_NOW (cmd);
504
512
#endif
505
513
506
514
// Restore print cooling fan speeds
@@ -509,7 +517,7 @@ void PrintJobRecovery::resume() {
509
517
const int f = info.fan_speed [i];
510
518
if (f) {
511
519
sprintf_P (cmd, PSTR (" M106P%iS%i" ), i, f);
512
- gcode. process_subcommands_now (cmd);
520
+ PROCESS_SUBCOMMANDS_NOW (cmd);
513
521
}
514
522
}
515
523
#endif
@@ -531,37 +539,37 @@ void PrintJobRecovery::resume() {
531
539
532
540
// Un-retract if there was a retract at outage
533
541
#if ENABLED(BACKUP_POWER_SUPPLY) && POWER_LOSS_RETRACT_LEN > 0
534
- gcode. process_subcommands_now (F (" G1F3000E" STRINGIFY (POWER_LOSS_RETRACT_LEN)));
542
+ PROCESS_SUBCOMMANDS_NOW (F (" G1F3000E" STRINGIFY (POWER_LOSS_RETRACT_LEN)));
535
543
#endif
536
544
537
545
// Additional purge on resume if configured
538
546
#if POWER_LOSS_PURGE_LEN
539
547
sprintf_P (cmd, PSTR (" G1F3000E%d" ), (POWER_LOSS_PURGE_LEN) + (POWER_LOSS_RETRACT_LEN));
540
- gcode. process_subcommands_now (cmd);
548
+ PROCESS_SUBCOMMANDS_NOW (cmd);
541
549
#endif
542
550
543
551
#if ENABLED(NOZZLE_CLEAN_FEATURE)
544
- gcode. process_subcommands_now (F (" G12" ));
552
+ PROCESS_SUBCOMMANDS_NOW (F (" G12" ));
545
553
#endif
546
554
547
555
// Move back over to the saved XY
548
556
sprintf_P (cmd, PSTR (" G1X%sY%sF3000" ),
549
557
dtostrf (info.current_position .x , 1 , 3 , str_1),
550
558
dtostrf (info.current_position .y , 1 , 3 , str_2)
551
559
);
552
- gcode. process_subcommands_now (cmd);
560
+ PROCESS_SUBCOMMANDS_NOW (cmd);
553
561
554
562
// Move back down to the saved Z for printing
555
563
sprintf_P (cmd, PSTR (" G1Z%sF600" ), dtostrf (z_print, 1 , 3 , str_1));
556
- gcode. process_subcommands_now (cmd);
564
+ PROCESS_SUBCOMMANDS_NOW (cmd);
557
565
558
566
// Restore the feedrate
559
567
sprintf_P (cmd, PSTR (" G1F%d" ), info.feedrate );
560
- gcode. process_subcommands_now (cmd);
568
+ PROCESS_SUBCOMMANDS_NOW (cmd);
561
569
562
570
// Restore E position with G92.9
563
571
sprintf_P (cmd, PSTR (" G92.9E%s" ), dtostrf (info.current_position .e , 1 , 3 , str_1));
564
- gcode. process_subcommands_now (cmd);
572
+ PROCESS_SUBCOMMANDS_NOW (cmd);
565
573
566
574
TERN_ (GCODE_REPEAT_MARKERS, repeat = info.stored_repeat );
567
575
TERN_ (HAS_HOME_OFFSET, home_offset = info.home_offset );
@@ -573,22 +581,28 @@ void PrintJobRecovery::resume() {
573
581
// Relative axis modes
574
582
gcode.axis_relative = info.axis_relative ;
575
583
576
- #if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
577
- const uint8_t old_flags = marlin_debug_flags;
578
- marlin_debug_flags |= MARLIN_DEBUG_ECHO;
579
- #endif
580
-
581
- // Continue to apply PLR when a file is resumed!
582
- enable (true );
584
+ {
585
+ #if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
586
+ struct OnExit {
587
+ uint8_t old_flags;
588
+ OnExit () {
589
+ old_flags = marlin_debug_flags;
590
+ marlin_debug_flags |= MARLIN_DEBUG_ECHO;
591
+ }
592
+ ~OnExit () { marlin_debug_flags = old_flags; }
593
+ } on_exit;
594
+ #endif
583
595
584
- // Resume the SD file from the last position
585
- char *fn = info.sd_filename ;
586
- sprintf_P (cmd, M23_STR, fn);
587
- gcode.process_subcommands_now (cmd);
588
- sprintf_P (cmd, PSTR (" M24S%ldT%ld" ), resume_sdpos, info.print_job_elapsed );
589
- gcode.process_subcommands_now (cmd);
596
+ // Continue to apply PLR when a file is resumed!
597
+ enable (true );
590
598
591
- TERN_ (DEBUG_POWER_LOSS_RECOVERY, marlin_debug_flags = old_flags);
599
+ // Resume the SD file from the last position
600
+ char *fn = info.sd_filename ;
601
+ sprintf_P (cmd, M23_STR, fn);
602
+ PROCESS_SUBCOMMANDS_NOW (cmd);
603
+ sprintf_P (cmd, PSTR (" M24S%ldT%ld" ), resume_sdpos, info.print_job_elapsed );
604
+ PROCESS_SUBCOMMANDS_NOW (cmd);
605
+ }
592
606
}
593
607
594
608
#if ENABLED(DEBUG_POWER_LOSS_RECOVERY)
0 commit comments