From 8949c8c0a529038eceb0a3a177b77d223c043ec6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 26 Oct 2017 23:39:51 -0500 Subject: [PATCH 1/3] Move SD_REPRINT_LAST_SELECTED_FILE to ultralcd.cpp --- Marlin/src/lcd/ultralcd.cpp | 55 ++++++++++++++++++++++++++---------- Marlin/src/lcd/ultralcd.h | 4 +++ Marlin/src/sd/cardreader.cpp | 19 +------------ 3 files changed, 45 insertions(+), 33 deletions(-) diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index a44b26ae5..444300614 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -3745,22 +3745,45 @@ 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) + 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 = saved_encoderPosition; // encoderPosition to the last selected item. + encoderPosition = last_sdfile_encoderPosition; // encoderPosition to the last selected item. assume_print_finished = millis() + 5000; } - saved_encoderPosition = encoderPosition; - defer_return_to_status = true; + 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(); @@ -4414,7 +4437,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); @@ -4722,16 +4745,18 @@ void lcd_update() { // then we want to use 1/2 of the time only. 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) + 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 - )) - #else - if (lcdDrawUpdate && (!bbr2 || (bbr2 > max_display_update_time))) - #endif - { + ) { #if ENABLED(DOGLCD) if (!drawing_screen) #endif diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h index ef9bc7c2b..9d2474d17 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 3afb050b2..a8e518e3e 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 } } From 9a4cf1183539dd35cb457472ec9e72a4b2b7c121 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 29 Oct 2017 19:37:40 -0500 Subject: [PATCH 2/3] Remove return_to_status_ms hack, just use defer... --- Marlin/src/lcd/ultralcd.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 444300614..44290b1d4 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -3783,7 +3783,6 @@ void kill_screen(const char* lcd_msg) { 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(); @@ -4806,12 +4805,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(); From 12458cefc4230129878f2f733a87ba68371c1459 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 29 Oct 2017 19:44:49 -0500 Subject: [PATCH 3/3] Remove 5s timer hack. Encoder pos is saved on print start! --- Marlin/src/lcd/ultralcd.cpp | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 44290b1d4..f824e1bd2 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -3775,16 +3775,6 @@ void kill_screen(const char* lcd_msg) { 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 - #endif - const uint16_t fileCnt = card.getnrfilenames(); START_MENU(); MENU_BACK(MSG_MAIN); @@ -4744,18 +4734,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