From b0e282a74b9e14a7a1932cca08dbfc59cfb0d7b4 Mon Sep 17 00:00:00 2001
From: Scott Lahteine <github@thinkyhead.com>
Date: Thu, 26 Oct 2017 23:54:01 -0500
Subject: [PATCH] Cleanups for SD_REPRINT_LAST_SELECTED_FILE

---
 Marlin/cardreader.cpp | 19 +------------------
 Marlin/ultralcd.cpp   | 33 ++++++++++++++++++++++++---------
 Marlin/ultralcd.h     |  4 ++++
 3 files changed, 29 insertions(+), 27 deletions(-)

diff --git a/Marlin/cardreader.cpp b/Marlin/cardreader.cpp
index 7e5f93e36a..0d5031b3a1 100644
--- a/Marlin/cardreader.cpp
+++ b/Marlin/cardreader.cpp
@@ -860,15 +860,6 @@ void CardReader::updir() {
 
 #endif // SDCARD_SORT_ALPHA
 
-#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();
@@ -890,15 +881,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
   }
 }
diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp
index 76a2f32a07..b0bb367807 100644
--- a/Marlin/ultralcd.cpp
+++ b/Marlin/ultralcd.cpp
@@ -3755,24 +3755,39 @@ 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 = 0;
+
+      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;
+        lcd_goto_screen(lcd_sdcard_menu, last_sdfile_encoderPosition);
+        defer_return_to_status = true;
+        lcd_update();
+      }
     #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 
+        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();
       START_MENU();
       MENU_BACK(MSG_MAIN);
@@ -4422,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);
diff --git a/Marlin/ultralcd.h b/Marlin/ultralcd.h
index 3b156ee989..e8871cf3b9 100644
--- a/Marlin/ultralcd.h
+++ b/Marlin/ultralcd.h
@@ -205,4 +205,8 @@ void lcd_reset_status();
   float lcd_probe_pt(const float &lx, const float &ly);
 #endif
 
+#if ENABLED(SD_REPRINT_LAST_SELECTED_FILE)
+  void lcd_reselect_last_file();
+#endif
+
 #endif // ULTRALCD_H