#include "CrossPointSettings.h" #include #include #include #include "fontIds.h" // 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 = 10; 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); serialization::writePod(outputFile, fontFamily); serialization::writePod(outputFile, fontSize); serialization::writePod(outputFile, lineSpacing); 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; serialization::readPod(inputFile, fontFamily); if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, fontSize); if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, lineSpacing); if (++settingsRead >= fileSettingsCount) break; } while (false); inputFile.close(); Serial.printf("[%lu] [CPS] Settings loaded from file\n", millis()); return true; } float CrossPointSettings::getReaderLineCompression() const { switch (fontFamily) { case BOOKERLY: default: switch (lineSpacing) { case TIGHT: return 0.95f; case NORMAL: default: return 1.0f; case WIDE: return 1.1f; } case NOTOSANS: switch (lineSpacing) { case TIGHT: return 0.90f; case NORMAL: default: return 0.95f; case WIDE: return 1.0f; } case OPENDYSLEXIC: switch (lineSpacing) { case TIGHT: return 0.90f; case NORMAL: default: return 0.95f; case WIDE: return 1.0f; } } } int CrossPointSettings::getReaderFontId() const { switch (fontFamily) { case BOOKERLY: default: switch (fontSize) { case SMALL: return BOOKERLY_12_FONT_ID; case MEDIUM: default: return BOOKERLY_14_FONT_ID; case LARGE: return BOOKERLY_16_FONT_ID; case EXTRA_LARGE: return BOOKERLY_18_FONT_ID; } case NOTOSANS: switch (fontSize) { case SMALL: return NOTOSANS_12_FONT_ID; case MEDIUM: default: return NOTOSANS_14_FONT_ID; case LARGE: return NOTOSANS_16_FONT_ID; case EXTRA_LARGE: return NOTOSANS_18_FONT_ID; } case OPENDYSLEXIC: switch (fontSize) { case SMALL: return OPENDYSLEXIC_8_FONT_ID; case MEDIUM: default: return OPENDYSLEXIC_10_FONT_ID; case LARGE: return OPENDYSLEXIC_12_FONT_ID; case EXTRA_LARGE: return OPENDYSLEXIC_14_FONT_ID; } } }