diff --git a/exercises/07_SD_Startup_Watcher/lib/startup_sd/StartupSdManager.cpp b/exercises/07_SD_Startup_Watcher/lib/startup_sd/StartupSdManager.cpp index 5cc77ed..a77f92e 100644 --- a/exercises/07_SD_Startup_Watcher/lib/startup_sd/StartupSdManager.cpp +++ b/exercises/07_SD_Startup_Watcher/lib/startup_sd/StartupSdManager.cpp @@ -71,6 +71,11 @@ void StartupSdManager::update() { bool mounted = mountPreferred(false); if (!mounted && (uint32_t)(now - lastFullScanMs_) >= cfg_.fullScanIntervalMs) { lastFullScanMs_ = now; + if (cfg_.recoveryRailCycleOnFullScan) { + logf("Watcher: recovery rail cycle before full scan"); + cycleSdRail(cfg_.recoveryRailOffMs, cfg_.recoveryRailOnSettleMs); + delay(150); + } logf("Watcher: preferred probe failed, running full scan"); mounted = mountCardFullScan(); } diff --git a/exercises/07_SD_Startup_Watcher/lib/startup_sd/StartupSdManager.h b/exercises/07_SD_Startup_Watcher/lib/startup_sd/StartupSdManager.h index 095f857..be9ef27 100644 --- a/exercises/07_SD_Startup_Watcher/lib/startup_sd/StartupSdManager.h +++ b/exercises/07_SD_Startup_Watcher/lib/startup_sd/StartupSdManager.h @@ -23,6 +23,9 @@ using SdStatusCallback = void (*)(SdEvent event, const char* message); struct SdWatcherConfig { bool enableSdRailCycle = true; bool enablePinDumps = true; + bool recoveryRailCycleOnFullScan = true; + uint32_t recoveryRailOffMs = 250; + uint32_t recoveryRailOnSettleMs = 700; uint32_t startupWarmupMs = 1500; uint32_t pollIntervalAbsentMs = 1000; uint32_t pollIntervalMountedMs = 2000; diff --git a/exercises/README.md b/exercises/README.md index a6b703a..2f7f118 100644 --- a/exercises/README.md +++ b/exercises/README.md @@ -45,6 +45,8 @@ Exercise 06: RTC check (PCF8563) read/set and persistence validation Exercise 07: SD startup watcher library harness with hot-insert detection +Exercise 08: SystemStartup package scaffold (shared begin/update API) + Each exercise is self-contained: its own platformio.ini