From 5e5a177934c06a3cbd24f781fa4a476fd2089980 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 29 Oct 2017 19:49:28 -0500 Subject: [PATCH] No hacks needed for SD_REPRINT_LAST_SELECTED_FILE --- Marlin/ultralcd.cpp | 63 ++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 38 deletions(-) diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index 7c1a97e8c..95b4d1996 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -3758,37 +3758,34 @@ void kill_screen(const char* lcd_msg) { */ #if ENABLED(SD_REPRINT_LAST_SELECTED_FILE) - uint32_t last_sdfile_encoderPosition = 0; + uint32_t last_sdfile_encoderPosition = 0xFFFF; void lcd_reselect_last_file() { - // 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; + 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; - lcd_update(); + 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) - static millis_t assume_print_finished = 0; - 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 = last_sdfile_encoderPosition; // encoderPosition to the last selected item. - assume_print_finished = millis() + 5000; - } - last_sdfile_encoderPosition = encoderPosition; // needed as a workaround for the 5s timer - //defer_return_to_status = true; // already done in lcd_reselect_last_file - #endif - const uint16_t fileCnt = card.getnrfilenames(); START_MENU(); MENU_BACK(MSG_MAIN); @@ -4746,18 +4743,13 @@ void lcd_update() { // then we want to use 1/2 of the time only. uint16_t bbr2 = planner.block_buffer_runtime() >> 1; - if ( - #if ENABLED(DOGLCD) - (lcdDrawUpdate || drawing_screen) && ( - !bbr2 || (bbr2 > max_display_update_time) - #if ENABLED(SDSUPPORT) - || currentScreen == lcd_sdcard_menu - #endif - ) - #else - lcdDrawUpdate && (!bbr2 || (bbr2 > max_display_update_time)) - #endif - ) { + #if ENABLED(DOGLCD) + #define IS_DRAWING drawing_screen + #else + #define IS_DRAWING false + #endif + + if ((lcdDrawUpdate || IS_DRAWING) && (!bbr2 || bbr2 > max_display_update_time)) { #if ENABLED(DOGLCD) if (!drawing_screen) #endif @@ -4807,12 +4799,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();