From ae1815dc52543eb3d7f264891b3aafbfddbd916b Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 3 Jul 2022 09:48:19 +0200 Subject: [PATCH] When over the SD limit, continue from the last sorted file This gives a significant speed boost when just above the sorting limit, while only costing 2 bytes of ram --- Firmware/cardreader.cpp | 12 +++++++++++- Firmware/cardreader.h | 4 +++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 4e9df733a..630b0cbd1 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -779,7 +779,15 @@ void CardReader::getfilename_sorted(const uint16_t nr, uint8_t sdSort) { if (nr < sort_count) getfilename_simple(sort_entries[(sdSort == SD_SORT_ALPHA) ? (sort_count - nr - 1) : nr]); else - getfilename(nr); + getfilename_afterMaxSorting(nr); +} + +void CardReader::getfilename_afterMaxSorting(uint16_t entry, const char * const match/*=NULL*/) +{ + curDir = &workDir; + nrFiles = entry - sort_count + 1; + curDir->seekSet(lastSortedFilePosition << 5); + lsDive("", *curDir, match, LS_GetFilename); } /** @@ -830,6 +838,7 @@ void CardReader::presort() { LongTimer sortingSpeedtestTimer; sortingSpeedtestTimer.start(); #endif //SORTING_SPEEDTEST + lastSortedFilePosition = position >> 5; // By default re-read the names from SD for every compare // retaining only two filenames at a time. This is very @@ -989,6 +998,7 @@ void CardReader::presort() { void CardReader::flush_presort() { sort_count = 0; + lastSortedFilePosition = 0; } #endif // SDCARD_SORT_ALPHA diff --git a/Firmware/cardreader.h b/Firmware/cardreader.h index 3d3054557..0ccde2323 100644 --- a/Firmware/cardreader.h +++ b/Firmware/cardreader.h @@ -64,6 +64,7 @@ public: #ifdef SDCARD_SORT_ALPHA void presort(); void getfilename_sorted(const uint16_t nr, uint8_t sdSort); + void getfilename_afterMaxSorting(uint16_t entry, const char * const match = NULL); #endif FORCE_INLINE bool isFileOpen() { return file.isOpen(); } @@ -98,8 +99,8 @@ public: int lastnr; //last number of the autostart; #ifdef SDCARD_SORT_ALPHA bool presort_flag; - char dir_names[MAX_DIR_DEPTH][9]; #endif // SDCARD_SORT_ALPHA + char dir_names[MAX_DIR_DEPTH][9]; private: SdFile root,*curDir,workDir,workDirParents[MAX_DIR_DEPTH]; uint16_t workDirDepth; @@ -108,6 +109,7 @@ private: #ifdef SDCARD_SORT_ALPHA uint16_t sort_count; // Count of sorted items in the current directory uint16_t sort_entries[SDSORT_LIMIT]; + uint16_t lastSortedFilePosition; #endif // SDCARD_SORT_ALPHA