Add Backup & Reset sub-page with factory reset (developer feature)

Moves the previously standalone "Backup settings"/"Restore settings"
buttons out of the System menu into a new "Backup & Reset" sub-page
(replaced in the System menu by a single folder button, placed
directly above "Info"), and adds a third entry "Reset settings" - a
factory reset for developers/testers that deletes the entire
Flightradar folder from the SD card (settings, logbook, location
presets, WiFi, calibration - everything) and restarts the device. The
next boot picks up isFirstRun automatically (via the missing
SD_SETTINGS_FILE) and runs the full first-time setup again, exactly
like on the very first boot - no need to pull the SD card.

Since this is irreversible, it requires a full-screen red warning
confirmation first, reusing the same overlay previously built only for
the flight-logbook enable warning (confirmLogbookEnable() generalized
to confirmWarningScreen(), taking title/body StringIds as parameters).

New SdStorage::deleteDirectoryRecursive() and
SettingsBackup::factoryReset() implement the actual deletion + restart.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Eiswolf-BG
2026-08-12 05:34:22 +02:00
parent 3c12b7bdfb
commit 9d2930bd8b
12 changed files with 219 additions and 26 deletions

View File

@@ -143,4 +143,35 @@ void logEvent(const char* csvLine) {
f.close();
}
bool deleteDirectoryRecursive(const char* path) {
File dir = SD.open(path);
if (!dir || !dir.isDirectory()) {
if (dir) dir.close();
return false;
}
// Gleiches vorsichtiges "entry.name() koennte relativ ODER absolut
// sein"-Muster wie in flight_logbook.cpp::resetAllData() - anders als
// dort aber mit echter Rekursion in Unterordner (statt sie zu
// ueberspringen), da der Flightradar-Ordner welche enthaelt (logs/,
// screenshots/).
File entry = dir.openNextFile();
while (entry) {
bool isDir = entry.isDirectory();
String name = String(entry.name());
entry.close();
String fullPath = name.startsWith("/") ? name : String(path) + "/" + name;
if (isDir) {
deleteDirectoryRecursive(fullPath.c_str());
} else {
SD.remove(fullPath);
}
entry = dir.openNextFile();
}
dir.close();
return SD.rmdir(path);
}
}