diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 55e1f033aa..b7d26ca4e4 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -406,7 +406,7 @@ void startOrResumeJob() { thermalManager.zero_fan_speeds(); wait_for_heatup = false; #if ENABLED(POWER_LOSS_RECOVERY) - card.removeJobRecoveryFile(); + recovery.purge(); #endif #ifdef EVENT_GCODE_SD_STOP queue.inject_P(PSTR(EVENT_GCODE_SD_STOP)); diff --git a/Marlin/src/feature/power_loss_recovery.h b/Marlin/src/feature/power_loss_recovery.h index 771fce44df..24e24e9e20 100644 --- a/Marlin/src/feature/power_loss_recovery.h +++ b/Marlin/src/feature/power_loss_recovery.h @@ -148,14 +148,16 @@ class PrintJobRecovery { static void enable(const bool onoff); static void changed(); - static void check(); - static void resume(); - static inline bool exists() { return card.jobRecoverFileExists(); } static inline void open(const bool read) { card.openJobRecoveryFile(read); } static inline void close() { file.close(); } + static void check(); + static void resume(); static void purge(); + + static inline void cancel() { purge(); card.autostart_index = 0; } + static void load(); static void save(const bool force= #if ENABLED(SAVE_EACH_CMD_MODE) diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp index 8462dbe817..b85dc84c43 100644 --- a/Marlin/src/gcode/feature/powerloss/M1000.cpp +++ b/Marlin/src/gcode/feature/powerloss/M1000.cpp @@ -47,6 +47,10 @@ inline void plr_error(PGM_P const prefix) { #endif } +#if HAS_LCD_MENU + void lcd_power_loss_recovery_cancel(); +#endif + /** * M1000: Resume from power-loss (undocumented) * - With 'S' go to the Resume/Cancel menu @@ -64,6 +68,16 @@ void GcodeSuite::M1000() { SERIAL_ECHO_MSG("Resume requires LCD."); #endif } + else if (parser.seen('C')) { + #if HAS_LCD_MENU + lcd_power_loss_recovery_cancel(); + #else + recovery.cancel(); + #endif + #if ENABLED(EXTENSIBLE_UI) + ExtUI::onPrintTimerStopped(); + #endif + } else recovery.resume(); } diff --git a/Marlin/src/gcode/sdcard/M24_M25.cpp b/Marlin/src/gcode/sdcard/M24_M25.cpp index 046df659cf..d68031c0c9 100644 --- a/Marlin/src/gcode/sdcard/M24_M25.cpp +++ b/Marlin/src/gcode/sdcard/M24_M25.cpp @@ -86,6 +86,10 @@ void GcodeSuite::M24() { */ void GcodeSuite::M25() { + #if ENABLED(POWER_LOSS_RECOVERY) + if (recovery.enabled) recovery.save(true, false); + #endif + // 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(); diff --git a/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplay.cpp index d8e2a5bdb4..0807ca9a99 100644 --- a/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extensible_ui/lib/dgus/DGUSDisplay.cpp @@ -702,6 +702,7 @@ void DGUSScreenVariableHandler::HandleMotorLockUnlock(DGUS_VP_Variable &var, voi } #if ENABLED(POWER_LOSS_RECOVERY) + void DGUSScreenVariableHandler::HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr) { uint16_t value = swap16(*(uint16_t*)val_ptr); if (value) { @@ -709,11 +710,11 @@ void DGUSScreenVariableHandler::HandleMotorLockUnlock(DGUS_VP_Variable &var, voi ScreenHandler.GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); } else { - card.removeJobRecoveryFile(); - card.autostart_index = 0; + recovery.cancel(); ScreenHandler.GotoScreen(DGUSLCD_SCREEN_STATUS); } } + #endif void DGUSScreenVariableHandler::HandleSettings(DGUS_VP_Variable &var, void *val_ptr) { diff --git a/Marlin/src/lcd/menu/menu_job_recovery.cpp b/Marlin/src/lcd/menu/menu_job_recovery.cpp index a85b4934e8..1ac69aff75 100644 --- a/Marlin/src/lcd/menu/menu_job_recovery.cpp +++ b/Marlin/src/lcd/menu/menu_job_recovery.cpp @@ -39,8 +39,7 @@ static void lcd_power_loss_recovery_resume() { } void lcd_power_loss_recovery_cancel() { - card.removeJobRecoveryFile(); - card.autostart_index = 0; + recovery.cancel(); ui.return_to_status(); } diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index edd14dcf12..380b18a07c 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -95,10 +95,6 @@ MarlinUI ui; #include "../module/planner.h" #include "../module/motion.h" -#if ENABLED(POWER_LOSS_RECOVERY) - #include "../feature/power_loss_recovery.h" -#endif - #if ENABLED(AUTO_BED_LEVELING_UBL) #include "../feature/bedlevel/bedlevel.h" #endif @@ -1519,10 +1515,6 @@ void MarlinUI::update() { synchronize(GET_TEXT(MSG_PAUSE_PRINT)); #endif - #if ENABLED(POWER_LOSS_RECOVERY) - if (recovery.enabled) recovery.save(true, false); - #endif - #if ENABLED(HOST_PROMPT_SUPPORT) host_prompt_open(PROMPT_PAUSE_RESUME, PSTR("UI Pause"), PSTR("Resume")); #endif diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 38354fe924..ec75206bd7 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -1071,7 +1071,7 @@ void CardReader::printingHasFinished() { stopSDPrint(); #if ENABLED(POWER_LOSS_RECOVERY) - removeJobRecoveryFile(); + recovery.purge(); #endif #if ENABLED(SD_FINISHED_STEPPERRELEASE) && defined(SD_FINISHED_RELEASECOMMAND) diff --git a/platformio.ini b/platformio.ini index cc50614730..f3d24799a7 100644 --- a/platformio.ini +++ b/platformio.ini @@ -437,7 +437,7 @@ src_filter = ${common.default_src_filter} + # # Geeetech GTM32 (STM32F103VET6) -# +# [env:STM32F103VE_GTM32] platform = ststm32 board = genericSTM32F103VE