diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index ea98371a..d304c4e4 100644 --- a/src/CrossPointSettings.cpp +++ b/src/CrossPointSettings.cpp @@ -12,7 +12,7 @@ CrossPointSettings CrossPointSettings::instance; namespace { constexpr uint8_t SETTINGS_FILE_VERSION = 1; // Increment this when adding new persisted settings fields -constexpr uint8_t SETTINGS_COUNT = 12; +constexpr uint8_t SETTINGS_COUNT = 13; constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; } // namespace @@ -39,6 +39,7 @@ bool CrossPointSettings::saveToFile() const { serialization::writePod(outputFile, lineSpacing); serialization::writePod(outputFile, paragraphAlignment); serialization::writePod(outputFile, sleepTimeout); + serialization::writePod(outputFile, refreshFrequency); outputFile.close(); Serial.printf("[%lu] [CPS] Settings saved to file\n", millis()); @@ -89,6 +90,8 @@ bool CrossPointSettings::loadFromFile() { if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, sleepTimeout); if (++settingsRead >= fileSettingsCount) break; + serialization::readPod(inputFile, refreshFrequency); + if (++settingsRead >= fileSettingsCount) break; } while (false); inputFile.close(); @@ -148,6 +151,22 @@ unsigned long CrossPointSettings::getSleepTimeoutMs() const { } } +int CrossPointSettings::getRefreshFrequency() const { + switch (refreshFrequency) { + case REFRESH_1: + return 1; + case REFRESH_5: + return 5; + case REFRESH_10: + return 10; + case REFRESH_15: + default: + return 15; + case REFRESH_30: + return 30; + } +} + int CrossPointSettings::getReaderFontId() const { switch (fontFamily) { case BOOKERLY: diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index 9377ad70..bb38df68 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -48,6 +48,9 @@ class CrossPointSettings { // Auto-sleep timeout options (in minutes) enum SLEEP_TIMEOUT { SLEEP_1_MIN = 0, SLEEP_5_MIN = 1, SLEEP_10_MIN = 2, SLEEP_15_MIN = 3, SLEEP_30_MIN = 4 }; + // E-ink refresh frequency (pages between full refreshes) + enum REFRESH_FREQUENCY { REFRESH_1 = 0, REFRESH_5 = 1, REFRESH_10 = 2, REFRESH_15 = 3, REFRESH_30 = 4 }; + // Sleep screen settings uint8_t sleepScreen = DARK; // Status bar settings @@ -69,6 +72,8 @@ class CrossPointSettings { uint8_t paragraphAlignment = JUSTIFIED; // Auto-sleep timeout setting (default 10 minutes) uint8_t sleepTimeout = SLEEP_10_MIN; + // E-ink refresh frequency (default 15 pages) + uint8_t refreshFrequency = REFRESH_15; ~CrossPointSettings() = default; @@ -83,6 +88,7 @@ class CrossPointSettings { float getReaderLineCompression() const; unsigned long getSleepTimeoutMs() const; + int getRefreshFrequency() const; }; // Helper macro to access settings diff --git a/src/activities/reader/EpubReaderActivity.cpp b/src/activities/reader/EpubReaderActivity.cpp index 4348625d..d3cd5016 100644 --- a/src/activities/reader/EpubReaderActivity.cpp +++ b/src/activities/reader/EpubReaderActivity.cpp @@ -13,7 +13,7 @@ #include "fontIds.h" namespace { -constexpr int pagesPerRefresh = 15; +// pagesPerRefresh now comes from SETTINGS.getRefreshFrequency() constexpr unsigned long skipChapterMs = 700; constexpr unsigned long goHomeMs = 1000; constexpr int topPadding = 5; @@ -379,7 +379,7 @@ void EpubReaderActivity::renderContents(std::unique_ptr page, const int or renderStatusBar(orientedMarginRight, orientedMarginBottom, orientedMarginLeft); if (pagesUntilFullRefresh <= 1) { renderer.displayBuffer(EInkDisplay::HALF_REFRESH); - pagesUntilFullRefresh = pagesPerRefresh; + pagesUntilFullRefresh = SETTINGS.getRefreshFrequency(); } else { renderer.displayBuffer(); pagesUntilFullRefresh--; diff --git a/src/activities/reader/XtcReaderActivity.cpp b/src/activities/reader/XtcReaderActivity.cpp index efdd18a2..c0580cf6 100644 --- a/src/activities/reader/XtcReaderActivity.cpp +++ b/src/activities/reader/XtcReaderActivity.cpp @@ -11,13 +11,13 @@ #include #include +#include "CrossPointSettings.h" #include "CrossPointState.h" #include "MappedInputManager.h" #include "XtcReaderChapterSelectionActivity.h" #include "fontIds.h" namespace { -constexpr int pagesPerRefresh = 15; constexpr unsigned long skipPageMs = 700; constexpr unsigned long goHomeMs = 1000; } // namespace @@ -266,7 +266,7 @@ void XtcReaderActivity::renderPage() { // Display BW with conditional refresh based on pagesUntilFullRefresh if (pagesUntilFullRefresh <= 1) { renderer.displayBuffer(EInkDisplay::HALF_REFRESH); - pagesUntilFullRefresh = pagesPerRefresh; + pagesUntilFullRefresh = SETTINGS.getRefreshFrequency(); } else { renderer.displayBuffer(); pagesUntilFullRefresh--; @@ -346,7 +346,7 @@ void XtcReaderActivity::renderPage() { // Display with appropriate refresh if (pagesUntilFullRefresh <= 1) { renderer.displayBuffer(EInkDisplay::HALF_REFRESH); - pagesUntilFullRefresh = pagesPerRefresh; + pagesUntilFullRefresh = SETTINGS.getRefreshFrequency(); } else { renderer.displayBuffer(); pagesUntilFullRefresh--; diff --git a/src/activities/settings/SettingsActivity.cpp b/src/activities/settings/SettingsActivity.cpp index c8436804..20cfe372 100644 --- a/src/activities/settings/SettingsActivity.cpp +++ b/src/activities/settings/SettingsActivity.cpp @@ -9,7 +9,7 @@ // Define the static settings list namespace { -constexpr int settingsCount = 12; +constexpr int settingsCount = 14; const SettingInfo settingsList[settingsCount] = { // Should match with SLEEP_SCREEN_MODE {"Sleep Screen", SettingType::ENUM, &CrossPointSettings::sleepScreen, {"Dark", "Light", "Custom", "Cover"}}, @@ -39,6 +39,10 @@ const SettingInfo settingsList[settingsCount] = { &CrossPointSettings::paragraphAlignment, {"Justify", "Left", "Center", "Right"}}, {"Time to Sleep", SettingType::ENUM, &CrossPointSettings::sleepTimeout, {"1 min", "5 min", "10 min", "15 min", "30 min"}}, + {"Refresh Frequency", + SettingType::ENUM, + &CrossPointSettings::refreshFrequency, + {"1 page", "5 pages", "10 pages", "15 pages", "30 pages"}}, {"Check for updates", SettingType::ACTION, nullptr, {}}, }; } // namespace