From 6fa1d4adf2c2173657a174e79c9e48eb4d7a331c Mon Sep 17 00:00:00 2001 From: Marcel Licence Date: Sun, 8 Mar 2026 22:14:49 +0100 Subject: [PATCH] add missing file count function --- src/fs/fs_access.h | 1 + src/fs/fs_esp32.h | 43 +++++++++++++++++++++++++++++ src/fs/fs_rp2040.h | 69 ++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 107 insertions(+), 6 deletions(-) diff --git a/src/fs/fs_access.h b/src/fs/fs_access.h index 297ca34..95f9d5e 100644 --- a/src/fs/fs_access.h +++ b/src/fs/fs_access.h @@ -78,6 +78,7 @@ uint32_t getStaticPos(void); uint32_t getCurrentOffset(void); uint32_t readBytesFromAddr(uint8_t *buffer, uint32_t addr, uint32_t len); bool getFileFromIdx(uint32_t idx, char *filename, char *filter); +uint32_t getFileCount(char *filter); void WavToKeyboard(fs_id_t id, const char *dirname, void(*fileInd)(const char *filename, int offset, uint8_t note), int depth, int max_depth, uint8_t note); diff --git a/src/fs/fs_esp32.h b/src/fs/fs_esp32.h index 5019709..e58fc4b 100644 --- a/src/fs/fs_esp32.h +++ b/src/fs/fs_esp32.h @@ -322,6 +322,49 @@ static bool FS_SdCardInit(void) } #endif +static uint32_t getFileCountRecursive(File dir, char *filter) +{ + uint32_t count = 0; + + while (true) + { + File entry = dir.openNextFile(); + if (!entry) + { + break; + } + + if (entry.isDirectory()) + { + count += getFileCountRecursive(entry, filter); + } + else + { + if (str_ends_with_ul(entry.name(), filter)) + { + count++; + } + } + + entry.close(); + } + + return count; +} + +uint32_t getFileCount(char *filter) +{ + File dir = LittleFS.open("/", "r"); + if (!dir) + { + return 0; + } + + uint32_t count = getFileCountRecursive(dir, filter); + dir.close(); + return count; +} + void FS_Setup(void) { #ifdef SD_MMC_ENABLED diff --git a/src/fs/fs_rp2040.h b/src/fs/fs_rp2040.h index e0d6edc..e142f58 100644 --- a/src/fs/fs_rp2040.h +++ b/src/fs/fs_rp2040.h @@ -64,6 +64,8 @@ */ #define FST fs::FS +#define FILENAME_MAX_LEN 64 + /* * static function declarations */ @@ -169,7 +171,8 @@ uint32_t getFileFromIdx(File dir, int numTabs, uint32_t idx, char *filename, cha { if (idx == 0) { - strcpy(filename, entry.name()); + strncpy(filename, entry.name(), FILENAME_MAX_LEN - 1); + filename[FILENAME_MAX_LEN - 1] = '\0'; return idx; } idx -= 1; @@ -184,18 +187,66 @@ uint32_t getFileFromIdx(File dir, int numTabs, uint32_t idx, char *filename, cha bool getFileFromIdx(uint32_t idx, char *filename, char *filter) { File dir = LittleFS.open("/", "r"); - char filename_clean[64]; + char filename_clean[FILENAME_MAX_LEN - 1]; + + bool found = (getFileFromIdx(dir, 0, idx, filename_clean, filter) == 0); + + if (found) + { + snprintf(filename, FILENAME_MAX_LEN, "/%s", filename_clean); + } + + dir.close(); + return found; +} + +static uint32_t getFileCountRecursive(File dir, char *filter) +{ + uint32_t count = 0; + + while (true) + { + File entry = dir.openNextFile(); + if (!entry) + { + break; + } + + if (entry.isDirectory()) + { + count += getFileCountRecursive(entry, filter); + } + else + { + if (str_ends_with_ul(entry.name(), filter)) + { + count++; + } + } + + entry.close(); + } + + return count; +} + +uint32_t getFileCount(char *filter) +{ + File dir = LittleFS.open("/", "r"); + if (!dir) + { + return 0; + } - bool result = getFileFromIdx(dir, 0, idx, filename_clean, filter) == 0 ? true : false; - sprintf(filename, "/%s", filename_clean); + uint32_t count = getFileCountRecursive(dir, filter); dir.close(); - return result; + return count; } /* * function definitions */ -void FS_Setup(void) +void FS_Setup(bool listFiles) { if (!LittleFS.begin()) { @@ -205,6 +256,7 @@ void FS_Setup(void) Serial.printf("LittleFS Mount Successful!\n"); + if (listFiles) { Serial.printf("List files ...\n\n"); File dir = LittleFS.open("/", "r"); @@ -213,6 +265,11 @@ void FS_Setup(void) } } +void FS_Setup(void) +{ + FS_Setup(true); +} + #endif /* #ifdef ML_SYNTH_INLINE_DEFINITION */