From 59b18aaeefa92085c2148744388c30bdf8c3d234 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Tue, 15 Jan 2019 09:58:54 -0500 Subject: [PATCH] Allow resume from pause with parking enabled (#12893) Currently, Pause of an SD-Memory card print does not work. This has been verified to resolve the issue by multiple people. I understand more work needs to be done to resolve some of the concerns... --- Marlin/src/gcode/feature/pause/M125.cpp | 21 +++++++++++++------ .../sdcard/M20-M30_M32-M34_M524_M928.cpp | 10 +++++---- Marlin/src/lcd/menu/menu_main.cpp | 21 ++++++++++++------- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/Marlin/src/gcode/feature/pause/M125.cpp b/Marlin/src/gcode/feature/pause/M125.cpp index f96c1b93d..4f02592a2 100644 --- a/Marlin/src/gcode/feature/pause/M125.cpp +++ b/Marlin/src/gcode/feature/pause/M125.cpp @@ -31,6 +31,10 @@ #include "../../../sd/cardreader.h" #include "../../../module/printcounter.h" +#if HAS_LCD_MENU + #include "../../../lcd/ultralcd.h" +#endif + /** * M125: Store current position and move to filament change position. * Called on pause (by M25) to prevent material leaking onto the @@ -74,12 +78,17 @@ void GcodeSuite::M125() { constexpr bool sd_printing = false; #endif - if (pause_print(retract, park_point)) { - // SD Printing simply pauses, leaving the machine in a ready state, - // and can be resumed at any time, so don't wait in a loop here. - if (!sd_printing) { - wait_for_confirmation(); - resume_print(); + #if HAS_LCD_MENU + const bool show_lcd = parser.seenval('P'); + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INIT, ADVANCED_PAUSE_MODE_PAUSE_PRINT, active_extruder); + #else + constexpr bool show_lcd = false; + #endif + + if (pause_print(retract, park_point, 0, show_lcd)) { + if (!sd_printing || show_lcd ) { + wait_for_confirmation(false, 0); + resume_print(0, 0, PAUSE_PARK_RETRACT_LENGTH, 0); } } } diff --git a/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M524_M928.cpp b/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M524_M928.cpp index f1cdaa107..c54b56763 100644 --- a/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M524_M928.cpp +++ b/Marlin/src/gcode/sdcard/M20-M30_M32-M34_M524_M928.cpp @@ -114,13 +114,15 @@ void GcodeSuite::M24() { * M25: Pause SD Print */ void GcodeSuite::M25() { + + // Set initial pause flag to prevent more commands from landing in the queue while we try to pause + #if ENABLED(SDSUPPORT) + if (IS_SD_PRINTING()) { card.pauseSDPrint(); } + #endif + #if ENABLED(PARK_HEAD_ON_PAUSE) M125(); #else - #if ENABLED(SDSUPPORT) - if (IS_SD_PRINTING()) card.pauseSDPrint(); - #endif - print_job_timer.pause(); ui.reset_status(); diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index b643b06af..825636553 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -32,6 +32,7 @@ #include "../../module/temperature.h" #include "../../gcode/queue.h" #include "../../module/printcounter.h" +#include "../../module/stepper.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../feature/power_loss_recovery.h" @@ -43,12 +44,14 @@ void lcd_pause() { #endif #if ENABLED(PARK_HEAD_ON_PAUSE) - pause_print(PAUSE_PARK_RETRACT_LENGTH, NOZZLE_PARK_POINT, 0, true); + lcd_advanced_pause_show_message(ADVANCED_PAUSE_MESSAGE_INIT, ADVANCED_PAUSE_MODE_PAUSE_PRINT, active_extruder); + enqueue_and_echo_commands_P(PSTR("M25 P; \n M24")); #elif ENABLED(SDSUPPORT) enqueue_and_echo_commands_P(PSTR("M25")); #elif defined(ACTION_ON_PAUSE) SERIAL_ECHOLNPGM("//action:" ACTION_ON_PAUSE); #endif + planner.synchronize(); } void lcd_resume() { @@ -97,14 +100,15 @@ void menu_main() { if (busy) { MENU_ITEM(function, MSG_PAUSE_PRINT, lcd_pause); - MENU_ITEM(submenu, MSG_TUNE, menu_tune); - } - else { - MENU_ITEM(function, MSG_RESUME_PRINT, lcd_resume); #if ENABLED(SDSUPPORT) if (card.isFileOpen()) MENU_ITEM(submenu, MSG_STOP_PRINT, menu_sdcard_abort_confirm); #endif + MENU_ITEM(submenu, MSG_TUNE, menu_tune); + } + else { + MENU_ITEM(function, MSG_RESUME_PRINT, lcd_resume); + MENU_ITEM(submenu, MSG_MOTION, menu_motion); MENU_ITEM(submenu, MSG_TEMPERATURE, menu_temperature); } @@ -154,11 +158,13 @@ void menu_main() { MENU_ITEM(function, MSG_AUTOSTART, card.beginautostart); #endif - if (card.isDetected() && !card.isFileOpen()) { + if (card.isDetected()) { + if(!card.isFileOpen()) { + MENU_ITEM(submenu, MSG_CARD_MENU, menu_sdcard); #if !PIN_EXISTS(SD_DETECT) MENU_ITEM(gcode, MSG_CHANGE_SDCARD, PSTR("M21")); // SD-card changed by user #endif - MENU_ITEM(submenu, MSG_CARD_MENU, menu_sdcard); + } } else { #if !PIN_EXISTS(SD_DETECT) @@ -166,7 +172,6 @@ void menu_main() { #endif MENU_ITEM(function, MSG_NO_CARD, NULL); } - #endif // SDSUPPORT END_MENU();