From 98233b1de0c5871869f9f74c6e4a79247f7fb4f3 Mon Sep 17 00:00:00 2001
From: Robby Candra <robbycandra.mail@gmail.com>
Date: Tue, 17 Sep 2019 05:49:55 +0700
Subject: [PATCH] Add root flag to CardReader (#15275)

---
 Marlin/src/lcd/extensible_ui/ui_api.cpp |  3 +--
 Marlin/src/lcd/menu/menu_media.cpp      | 11 ++---------
 Marlin/src/sd/cardreader.cpp            | 12 ++++++------
 Marlin/src/sd/cardreader.h              |  3 ++-
 4 files changed, 11 insertions(+), 18 deletions(-)

diff --git a/Marlin/src/lcd/extensible_ui/ui_api.cpp b/Marlin/src/lcd/extensible_ui/ui_api.cpp
index 7b166250a8..4f9f075d83 100644
--- a/Marlin/src/lcd/extensible_ui/ui_api.cpp
+++ b/Marlin/src/lcd/extensible_ui/ui_api.cpp
@@ -975,8 +975,7 @@ namespace ExtUI {
 
   bool FileList::isAtRootDir() {
     #if ENABLED(SDSUPPORT)
-      card.getWorkDirName();
-      return card.filename[0] == '/';
+      card.flag.workDirIsRoot;
     #else
       return true;
     #endif
diff --git a/Marlin/src/lcd/menu/menu_media.cpp b/Marlin/src/lcd/menu/menu_media.cpp
index cb83807fb6..c909606f6a 100644
--- a/Marlin/src/lcd/menu/menu_media.cpp
+++ b/Marlin/src/lcd/menu/menu_media.cpp
@@ -127,21 +127,14 @@ void menu_media() {
 
   #if HAS_GRAPHICAL_LCD
     static uint16_t fileCnt;
-    static bool at_root;
-    if (ui.first_page) {
-      fileCnt = card.get_num_Files();
-      card.getWorkDirName();
-      at_root = card.filename[0] == '/';
-    }
+    if (ui.first_page) fileCnt = card.get_num_Files();
   #else
     const uint16_t fileCnt = card.get_num_Files();
-    card.getWorkDirName();
-    const bool at_root = card.filename[0] == '/';
   #endif
 
   START_MENU();
   MENU_BACK(MSG_MAIN);
-  if (at_root) {
+  if (card.flag.workDirIsRoot) {
     #if !PIN_EXISTS(SD_DETECT)
       MENU_ITEM(function, LCD_STR_REFRESH MSG_REFRESH, lcd_sd_refresh);
     #endif
diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp
index 77bc84d594..41cc167394 100644
--- a/Marlin/src/sd/cardreader.cpp
+++ b/Marlin/src/sd/cardreader.cpp
@@ -629,7 +629,7 @@ void CardReader::getfilename(uint16_t nr, const char * const match/*=nullptr*/)
   lsDive(nullptr, workDir, match);
 }
 
-uint16_t CardReader::getnrfilenames() {
+uint16_t CardReader::countFilesInWorkDir() {
   lsAction = LS_Count;
   nrFiles = 0;
   workDir.rewind();
@@ -707,6 +707,7 @@ void CardReader::chdir(const char * relpath) {
 
   if (newDir.open(parent, relpath, O_READ)) {
     workDir = newDir;
+    flag.workDirIsRoot = false;
     if (workDirDepth < MAX_DIR_DEPTH)
       workDirParents[workDirDepth++] = workDir;
     #if ENABLED(SDCARD_SORT_ALPHA)
@@ -726,14 +727,13 @@ int8_t CardReader::updir() {
       presort();
     #endif
   }
+  if (!workDirDepth) flag.workDirIsRoot = true;
   return workDirDepth;
 }
 
 void CardReader::setroot() {
-  /*if (!workDir.openRoot(&volume)) {
-    SERIAL_ECHOLNPGM(MSG_SD_WORKDIR_FAIL);
-  }*/
   workDir = root;
+  flag.workDirIsRoot = true;
   #if ENABLED(SDCARD_SORT_ALPHA)
     presort();
   #endif
@@ -801,7 +801,7 @@ void CardReader::setroot() {
     #endif
 
     // If there are files, sort up to the limit
-    uint16_t fileCnt = getnrfilenames();
+    uint16_t fileCnt = countFilesInWorkDir();
     if (fileCnt > 0) {
 
       // Never sort more than the max allowed
@@ -981,7 +981,7 @@ uint16_t CardReader::get_num_Files() {
     #if ENABLED(SDCARD_SORT_ALPHA) && SDSORT_USES_RAM && SDSORT_CACHE_NAMES
       nrFiles // no need to access the SD card for filenames
     #else
-      getnrfilenames()
+      countFilesInWorkDir()
     #endif
   ;
 }
diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h
index 94e2a9821c..38b6004e83 100644
--- a/Marlin/src/sd/cardreader.h
+++ b/Marlin/src/sd/cardreader.h
@@ -41,6 +41,7 @@ typedef struct {
        sdprinting:1,
        mounted:1,
        filenameIsDir:1,
+       workDirIsRoot:1,
        abort_sd_printing:1
        #if ENABLED(BINARY_FILE_TRANSFER)
          , binary_mode:1
@@ -79,7 +80,7 @@ public:
   #endif
 
   static void getfilename(uint16_t nr, const char* const match=nullptr);
-  static uint16_t getnrfilenames();
+  static uint16_t countFilesInWorkDir();
 
   static void getAbsFilename(char *t);
 
-- 
GitLab