diff --git a/libs/hardware/SDCardManager/include/SDCardManager.h b/libs/hardware/SDCardManager/include/SDCardManager.h index 1734632..216c6a4 100644 --- a/libs/hardware/SDCardManager/include/SDCardManager.h +++ b/libs/hardware/SDCardManager/include/SDCardManager.h @@ -1,9 +1,10 @@ #pragma once -#include -#include -#include #include +#include + +#include +#include class SDCardManager { public: @@ -40,7 +41,14 @@ class SDCardManager { bool openFileForWrite(const char* moduleName, const String& path, FsFile& file); bool removeDir(const char* path); - static SDCardManager& getInstance() { return instance; } + /** + * Format the SD card as FAT32/exFAT (auto-selected based on size) + * @param pr Optional Print destination for progress output (e.g., &Serial) + * @return true on success, false on failure + */ + bool format(Print* pr = nullptr); + + static SDCardManager& getInstance() { return instance; } private: static SDCardManager instance; diff --git a/libs/hardware/SDCardManager/src/SDCardManager.cpp b/libs/hardware/SDCardManager/src/SDCardManager.cpp index 55ad5ae..4c4433a 100644 --- a/libs/hardware/SDCardManager/src/SDCardManager.cpp +++ b/libs/hardware/SDCardManager/src/SDCardManager.cpp @@ -275,3 +275,30 @@ bool SDCardManager::removeDir(const char* path) { return sd.rmdir(path); } + +bool SDCardManager::format(Print* pr) { + if (!initialized) { + if (pr) pr->println("[SD] SDCardManager: not initialized"); + return false; + } + + Serial.printf("[%lu] [SD] Starting format...\n", millis()); + if (pr) pr->println("[SD] Formatting card, please wait..."); + + // SdFat's format() method handles FAT16/FAT32/exFAT selection automatically + // based on card size (<=32GB = FAT, >32GB = exFAT) + bool success = sd.format(pr); + + if (success) { + Serial.printf("[%lu] [SD] Format succeeded, re-initializing...\n", millis()); + if (pr) pr->println("[SD] Format complete, remounting..."); + // Re-initialize after format to mount the new filesystem + initialized = false; + success = begin(); + } else { + Serial.printf("[%lu] [SD] Format failed\n", millis()); + if (pr) pr->println("[SD] Format failed!"); + } + + return success; +}