#include "CrossPointSettings.h" #include #include #include // Initialize the static instance CrossPointSettings CrossPointSettings::instance; namespace { constexpr uint8_t SETTINGS_FILE_VERSION = 1; // Increment this when adding new persisted settings fields constexpr uint8_t SETTINGS_COUNT = 7; constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; } // namespace bool CrossPointSettings::saveToFile() const { // Make sure the directory exists SdMan.mkdir("/.crosspoint"); FsFile outputFile; if (!SdMan.openFileForWrite("CPS", SETTINGS_FILE, outputFile)) { return false; } serialization::writePod(outputFile, SETTINGS_FILE_VERSION); serialization::writePod(outputFile, SETTINGS_COUNT); serialization::writePod(outputFile, sleepScreen); serialization::writePod(outputFile, extraParagraphSpacing); serialization::writePod(outputFile, shortPwrBtn); serialization::writePod(outputFile, statusBar); serialization::writePod(outputFile, orientation); serialization::writePod(outputFile, frontButtonLayout); serialization::writePod(outputFile, sideButtonLayout); outputFile.close(); Serial.printf("[%lu] [CPS] Settings saved to file\n", millis()); return true; } bool CrossPointSettings::loadFromFile() { FsFile inputFile; if (!SdMan.openFileForRead("CPS", SETTINGS_FILE, inputFile)) { return false; } uint8_t version; serialization::readPod(inputFile, version); if (version != SETTINGS_FILE_VERSION) { Serial.printf("[%lu] [CPS] Deserialization failed: Unknown version %u\n", millis(), version); inputFile.close(); return false; } uint8_t fileSettingsCount = 0; serialization::readPod(inputFile, fileSettingsCount); // load settings that exist (support older files with fewer fields) uint8_t settingsRead = 0; do { serialization::readPod(inputFile, sleepScreen); if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, extraParagraphSpacing); if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, shortPwrBtn); if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, statusBar); if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, orientation); if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, frontButtonLayout); if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, sideButtonLayout); if (++settingsRead >= fileSettingsCount) break; } while (false); inputFile.close(); Serial.printf("[%lu] [CPS] Settings loaded from file\n", millis()); return true; }