From 78ebcf7856d6f3a6ad5ea19fb487238be3ab4b04 Mon Sep 17 00:00:00 2001 From: dpoulter Date: Sun, 1 Feb 2026 12:03:01 +0200 Subject: [PATCH] feat: add sleep screen selection --- src/CrossPointSettings.cpp | 30 +++++++++++++++---- src/CrossPointSettings.h | 13 +++----- src/activities/reader/EpubReaderActivity.cpp | 10 +++---- src/activities/reader/TxtReaderActivity.cpp | 2 +- .../settings/CategorySettingsActivity.cpp | 2 +- .../ScreenMarginSelectionActivity.cpp | 7 ++--- 6 files changed, 38 insertions(+), 26 deletions(-) diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index 4348b516..2b33bafe 100644 --- a/src/CrossPointSettings.cpp +++ b/src/CrossPointSettings.cpp @@ -24,6 +24,21 @@ constexpr uint8_t SETTINGS_FILE_VERSION = 1; // Increment this when adding new persisted settings fields constexpr uint8_t SETTINGS_COUNT = 24; constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; + +const uint8_t SCREEN_MARGIN_PIXEL_VALUES[CrossPointSettings::SCREEN_MARGIN_COUNT] = { + #define X(val, str) val, + SCREEN_MARGIN_DATA + #undef X +}; + +int screenMarginPixelToIndex(uint8_t pixelValue) { + for (size_t i = 0; i < CrossPointSettings::SCREEN_MARGIN_COUNT; i++) { + if (SCREEN_MARGIN_PIXEL_VALUES[i] == pixelValue) { + return static_cast(i); + } + } + return -1; +} } // namespace bool CrossPointSettings::saveToFile() const { @@ -114,6 +129,11 @@ bool CrossPointSettings::loadFromFile() { readAndValidate(inputFile, refreshFrequency, REFRESH_FREQUENCY_COUNT); if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, screenMargin); + // Migrate old format: stored pixel value (5,10,15...) → index (0,1,2...) + if (screenMargin >= SCREEN_MARGIN_COUNT) { + const int idx = screenMarginPixelToIndex(screenMargin); + screenMargin = (idx >= 0) ? static_cast(idx) : 0; + } if (++settingsRead >= fileSettingsCount) break; readAndValidate(inputFile, sleepScreenCoverMode, SLEEP_SCREEN_COVER_MODE_COUNT); if (++settingsRead >= fileSettingsCount) break; @@ -326,12 +346,10 @@ const char* CrossPointSettings::getScreenMarginString(uint8_t index) { return SCREEN_MARGIN_OPTIONS[MARGIN_5]; } -int CrossPointSettings::getScreenMarginIndex(uint8_t pixelValue) { - for (size_t i = 0; i < SCREEN_MARGIN_COUNT; i++) { - if (SCREEN_MARGIN_VALUES[i] == pixelValue) { - return static_cast(i); - } +uint8_t CrossPointSettings::getScreenMarginPixels() const { + if (screenMargin < SCREEN_MARGIN_COUNT) { + return SCREEN_MARGIN_PIXEL_VALUES[screenMargin]; } - return -1; + return SCREEN_MARGIN_PIXEL_VALUES[MARGIN_5]; } diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index bdb8221f..3d359a3a 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -124,11 +124,6 @@ class CrossPointSettings { #undef X SCREEN_MARGIN_COUNT }; - static inline constexpr uint8_t SCREEN_MARGIN_VALUES[SCREEN_MARGIN_COUNT] = { - #define X(val, str) val, - SCREEN_MARGIN_DATA - #undef X - }; // Short power button press actions enum SHORT_PWRBTN { IGNORE = 0, SLEEP = 1, PAGE_TURN = 2, SHORT_PWRBTN_COUNT }; @@ -166,8 +161,8 @@ class CrossPointSettings { uint8_t refreshFrequency = REFRESH_15; uint8_t hyphenationEnabled = 0; - // Reader screen margin settings - uint8_t screenMargin = 5; + // Reader screen margin (enum index; use getScreenMarginPixels() for pixel value) + uint8_t screenMargin = MARGIN_5; // OPDS browser settings char opdsServerUrl[128] = ""; char opdsUsername[64] = ""; @@ -197,8 +192,8 @@ class CrossPointSettings { static const char* getSleepScreenString(uint8_t value); static const char* getSleepTimeoutString(uint8_t value); static const char* getScreenMarginString(uint8_t index); - /** Returns index for pixel value, or -1 if not in allowed list. */ - static int getScreenMarginIndex(uint8_t pixelValue); + /** Returns pixel margin for current screenMargin index (e.g. 5, 10, 15...). */ + uint8_t getScreenMarginPixels() const; float getReaderLineCompression() const; unsigned long getSleepTimeoutMs() const; diff --git a/src/activities/reader/EpubReaderActivity.cpp b/src/activities/reader/EpubReaderActivity.cpp index 58668c68..392c6cda 100644 --- a/src/activities/reader/EpubReaderActivity.cpp +++ b/src/activities/reader/EpubReaderActivity.cpp @@ -281,17 +281,17 @@ void EpubReaderActivity::renderScreen() { int orientedMarginTop, orientedMarginRight, orientedMarginBottom, orientedMarginLeft; renderer.getOrientedViewableTRBL(&orientedMarginTop, &orientedMarginRight, &orientedMarginBottom, &orientedMarginLeft); - orientedMarginTop += SETTINGS.screenMargin; - orientedMarginLeft += SETTINGS.screenMargin; - orientedMarginRight += SETTINGS.screenMargin; - orientedMarginBottom += SETTINGS.screenMargin; + orientedMarginTop += SETTINGS.getScreenMarginPixels(); + orientedMarginLeft += SETTINGS.getScreenMarginPixels(); + orientedMarginRight += SETTINGS.getScreenMarginPixels(); + orientedMarginBottom += SETTINGS.getScreenMarginPixels(); // Add status bar margin if (SETTINGS.statusBar != CrossPointSettings::STATUS_BAR_MODE::NONE) { // Add additional margin for status bar if progress bar is shown const bool showProgressBar = SETTINGS.statusBar == CrossPointSettings::STATUS_BAR_MODE::FULL_WITH_PROGRESS_BAR || SETTINGS.statusBar == CrossPointSettings::STATUS_BAR_MODE::ONLY_PROGRESS_BAR; - orientedMarginBottom += statusBarMargin - SETTINGS.screenMargin + + orientedMarginBottom += statusBarMargin - SETTINGS.getScreenMarginPixels() + (showProgressBar ? (ScreenComponents::BOOK_PROGRESS_BAR_HEIGHT + progressBarMarginTop) : 0); } diff --git a/src/activities/reader/TxtReaderActivity.cpp b/src/activities/reader/TxtReaderActivity.cpp index e9303de3..63555317 100644 --- a/src/activities/reader/TxtReaderActivity.cpp +++ b/src/activities/reader/TxtReaderActivity.cpp @@ -156,7 +156,7 @@ void TxtReaderActivity::initializeReader() { // Store current settings for cache validation cachedFontId = SETTINGS.getReaderFontId(); - cachedScreenMargin = SETTINGS.screenMargin; + cachedScreenMargin = SETTINGS.getScreenMarginPixels(); cachedParagraphAlignment = SETTINGS.paragraphAlignment; // Calculate viewport dimensions diff --git a/src/activities/settings/CategorySettingsActivity.cpp b/src/activities/settings/CategorySettingsActivity.cpp index 8d6fee09..d1639028 100644 --- a/src/activities/settings/CategorySettingsActivity.cpp +++ b/src/activities/settings/CategorySettingsActivity.cpp @@ -312,7 +312,7 @@ void CategorySettingsActivity::render() const { valueText = CrossPointSettings::getRefreshFrequencyString(SETTINGS.refreshFrequency); } else if (settingsList[i].type == SettingType::ACTION && strcmp(settingsList[i].name, "Screen Margin") == 0) { // Format margin value as "X px" - valueText = std::to_string(SETTINGS.screenMargin) + " px"; + valueText = CrossPointSettings::getScreenMarginString(SETTINGS.screenMargin); } else if (settingsList[i].type == SettingType::ACTION && strcmp(settingsList[i].name, "Time to Sleep") == 0) { valueText = CrossPointSettings::getSleepTimeoutString(SETTINGS.sleepTimeout); } else if (settingsList[i].type == SettingType::ACTION && strcmp(settingsList[i].name, "Select Sleep BMP") == 0) { diff --git a/src/activities/settings/ScreenMarginSelectionActivity.cpp b/src/activities/settings/ScreenMarginSelectionActivity.cpp index 4ab70d4c..837c8f21 100644 --- a/src/activities/settings/ScreenMarginSelectionActivity.cpp +++ b/src/activities/settings/ScreenMarginSelectionActivity.cpp @@ -14,7 +14,7 @@ ScreenMarginSelectionActivity::ScreenMarginSelectionActivity(GfxRenderer& render if (index >= options.size()) { return; } - SETTINGS.screenMargin = CrossPointSettings::SCREEN_MARGIN_VALUES[index]; + SETTINGS.screenMargin = static_cast(index); SETTINGS.saveToFile(); onBack(); }, @@ -25,9 +25,8 @@ ScreenMarginSelectionActivity::ScreenMarginSelectionActivity(GfxRenderer& render } void ScreenMarginSelectionActivity::loadItems() { - const int idx = CrossPointSettings::getScreenMarginIndex(SETTINGS.screenMargin); - if (idx >= 0 && static_cast(idx) < options.size()) { - selectorIndex = static_cast(idx); + if (SETTINGS.screenMargin < options.size()) { + selectorIndex = SETTINGS.screenMargin; } else { selectorIndex = 0; }