diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index a44b26ae56..f824e1bd2b 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -3745,24 +3745,36 @@ void kill_screen(const char* lcd_msg) { * "Print from SD" submenu * */ + #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) - uint32_t saved_encoderPosition = 0; - static millis_t assume_print_finished = 0; + uint32_t last_sdfile_encoderPosition = 0xFFFF; + + void lcd_reselect_last_file() { + if (last_sdfile_encoderPosition == 0xFFFF) return; + #if ENABLED(DOGLCD) + // Some of this is a hack to force the screen update to work. + // TODO: Fix the real issue that causes this! + lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; + _lcd_synchronize(); + safe_delay(50); + _lcd_synchronize(); + lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; + drawing_screen = screen_changed = true; + #endif + + lcd_goto_screen(lcd_sdcard_menu, last_sdfile_encoderPosition); + defer_return_to_status = true; + last_sdfile_encoderPosition == 0xFFFF; + + #if ENABLED(DOGLCD) + lcd_update(); + #endif + } #endif void lcd_sdcard_menu() { ENCODER_DIRECTION_MENUS(); - #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) - if (ELAPSED(millis(), assume_print_finished)) { // if the printer has been busy printing, lcd_sdcard_menu() should not - lcdDrawUpdate = LCDVIEW_REDRAW_NOW; // have been active for 5 seconds. In this case, restore the previous - encoderPosition = saved_encoderPosition; // encoderPosition to the last selected item. - assume_print_finished = millis() + 5000; - } - saved_encoderPosition = encoderPosition; - defer_return_to_status = true; - #endif - const uint16_t fileCnt = card.getnrfilenames(); START_MENU(); MENU_BACK(MSG_MAIN); @@ -4414,7 +4426,7 @@ void kill_screen(const char* lcd_msg) { void menu_action_sdfile(const char* filename, char* longFilename) { #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) - saved_encoderPosition = encoderPosition; // Save which file was selected for later use + last_sdfile_encoderPosition = encoderPosition; // Save which file was selected for later use #endif UNUSED(longFilename); card.openAndPrintFile(filename); @@ -4723,15 +4735,12 @@ void lcd_update() { uint16_t bbr2 = planner.block_buffer_runtime() >> 1; #if ENABLED(DOGLCD) - if ((lcdDrawUpdate || drawing_screen) && (!bbr2 || (bbr2 > max_display_update_time) - #if ENABLED(SDSUPPORT) - || (currentScreen == lcd_sdcard_menu) - #endif - )) + #define IS_DRAWING drawing_screen #else - if (lcdDrawUpdate && (!bbr2 || (bbr2 > max_display_update_time))) + #define IS_DRAWING false #endif - { + + if ((lcdDrawUpdate || IS_DRAWING) && (!bbr2 || bbr2 > max_display_update_time)) { #if ENABLED(DOGLCD) if (!drawing_screen) #endif @@ -4781,12 +4790,7 @@ void lcd_update() { // Return to Status Screen after a timeout if (currentScreen == lcd_status_screen || defer_return_to_status) - #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) - if (currentScreen != lcd_sdcard_menu) // lcd_sdcard_menu() does not time out if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) - return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS; // When the printer finishes a file, it will wait with the file selected for - #else // a re-print. return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS; - #endif else if (ELAPSED(ms, return_to_status_ms)) lcd_return_to_status(); diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index ef9bc7c2b7..9d2474d170 100644 --- a/Marlin/src/lcd/ultralcd.h +++ b/Marlin/src/lcd/ultralcd.h @@ -223,4 +223,8 @@ void lcd_reset_status(); #define BUZZ(d,f) lcd_buzz(d, f) #endif +#if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) + void lcd_reselect_last_file(); +#endif + #endif // ULTRALCD_H diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index 3afb050b25..a8e518e3e5 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -892,15 +892,6 @@ uint16_t CardReader::get_num_Files() { ; } -#if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) - typedef void (*screenFunc_t)(); - extern void lcd_sdcard_menu(); - extern void lcd_goto_screen(screenFunc_t screen, const uint32_t encoder = 0); - extern uint32_t saved_encoderPosition; - extern bool screen_changed, drawing_screen, defer_return_to_status; - void _lcd_synchronize(); // Not declared in any LCD header file. Probably, that should be changed. -#endif - void CardReader::printingHasFinished() { stepper.synchronize(); file.close(); @@ -922,15 +913,7 @@ void CardReader::printingHasFinished() { #endif #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) - lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; - _lcd_synchronize(); - safe_delay(50); - _lcd_synchronize(); - lcdDrawUpdate = LCDVIEW_CALL_REDRAW_NEXT; - drawing_screen = screen_changed = true; - lcd_goto_screen(lcd_sdcard_menu, saved_encoderPosition); - defer_return_to_status = true; - lcd_update(); + lcd_reselect_last_file(); #endif } }