feat: add sleep screen selection

This commit is contained in:
dpoulter 2026-02-01 12:03:01 +02:00
parent d4036bf1f7
commit 78ebcf7856
6 changed files with 38 additions and 26 deletions

View File

@ -24,6 +24,21 @@ constexpr uint8_t SETTINGS_FILE_VERSION = 1;
// Increment this when adding new persisted settings fields // Increment this when adding new persisted settings fields
constexpr uint8_t SETTINGS_COUNT = 24; constexpr uint8_t SETTINGS_COUNT = 24;
constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; 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<int>(i);
}
}
return -1;
}
} // namespace } // namespace
bool CrossPointSettings::saveToFile() const { bool CrossPointSettings::saveToFile() const {
@ -114,6 +129,11 @@ bool CrossPointSettings::loadFromFile() {
readAndValidate(inputFile, refreshFrequency, REFRESH_FREQUENCY_COUNT); readAndValidate(inputFile, refreshFrequency, REFRESH_FREQUENCY_COUNT);
if (++settingsRead >= fileSettingsCount) break; if (++settingsRead >= fileSettingsCount) break;
serialization::readPod(inputFile, screenMargin); 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<uint8_t>(idx) : 0;
}
if (++settingsRead >= fileSettingsCount) break; if (++settingsRead >= fileSettingsCount) break;
readAndValidate(inputFile, sleepScreenCoverMode, SLEEP_SCREEN_COVER_MODE_COUNT); readAndValidate(inputFile, sleepScreenCoverMode, SLEEP_SCREEN_COVER_MODE_COUNT);
if (++settingsRead >= fileSettingsCount) break; if (++settingsRead >= fileSettingsCount) break;
@ -326,12 +346,10 @@ const char* CrossPointSettings::getScreenMarginString(uint8_t index) {
return SCREEN_MARGIN_OPTIONS[MARGIN_5]; return SCREEN_MARGIN_OPTIONS[MARGIN_5];
} }
int CrossPointSettings::getScreenMarginIndex(uint8_t pixelValue) { uint8_t CrossPointSettings::getScreenMarginPixels() const {
for (size_t i = 0; i < SCREEN_MARGIN_COUNT; i++) { if (screenMargin < SCREEN_MARGIN_COUNT) {
if (SCREEN_MARGIN_VALUES[i] == pixelValue) { return SCREEN_MARGIN_PIXEL_VALUES[screenMargin];
return static_cast<int>(i);
}
} }
return -1; return SCREEN_MARGIN_PIXEL_VALUES[MARGIN_5];
} }

View File

@ -124,11 +124,6 @@ class CrossPointSettings {
#undef X #undef X
SCREEN_MARGIN_COUNT 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 // Short power button press actions
enum SHORT_PWRBTN { IGNORE = 0, SLEEP = 1, PAGE_TURN = 2, SHORT_PWRBTN_COUNT }; 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 refreshFrequency = REFRESH_15;
uint8_t hyphenationEnabled = 0; uint8_t hyphenationEnabled = 0;
// Reader screen margin settings // Reader screen margin (enum index; use getScreenMarginPixels() for pixel value)
uint8_t screenMargin = 5; uint8_t screenMargin = MARGIN_5;
// OPDS browser settings // OPDS browser settings
char opdsServerUrl[128] = ""; char opdsServerUrl[128] = "";
char opdsUsername[64] = ""; char opdsUsername[64] = "";
@ -197,8 +192,8 @@ class CrossPointSettings {
static const char* getSleepScreenString(uint8_t value); static const char* getSleepScreenString(uint8_t value);
static const char* getSleepTimeoutString(uint8_t value); static const char* getSleepTimeoutString(uint8_t value);
static const char* getScreenMarginString(uint8_t index); static const char* getScreenMarginString(uint8_t index);
/** Returns index for pixel value, or -1 if not in allowed list. */ /** Returns pixel margin for current screenMargin index (e.g. 5, 10, 15...). */
static int getScreenMarginIndex(uint8_t pixelValue); uint8_t getScreenMarginPixels() const;
float getReaderLineCompression() const; float getReaderLineCompression() const;
unsigned long getSleepTimeoutMs() const; unsigned long getSleepTimeoutMs() const;

View File

@ -281,17 +281,17 @@ void EpubReaderActivity::renderScreen() {
int orientedMarginTop, orientedMarginRight, orientedMarginBottom, orientedMarginLeft; int orientedMarginTop, orientedMarginRight, orientedMarginBottom, orientedMarginLeft;
renderer.getOrientedViewableTRBL(&orientedMarginTop, &orientedMarginRight, &orientedMarginBottom, renderer.getOrientedViewableTRBL(&orientedMarginTop, &orientedMarginRight, &orientedMarginBottom,
&orientedMarginLeft); &orientedMarginLeft);
orientedMarginTop += SETTINGS.screenMargin; orientedMarginTop += SETTINGS.getScreenMarginPixels();
orientedMarginLeft += SETTINGS.screenMargin; orientedMarginLeft += SETTINGS.getScreenMarginPixels();
orientedMarginRight += SETTINGS.screenMargin; orientedMarginRight += SETTINGS.getScreenMarginPixels();
orientedMarginBottom += SETTINGS.screenMargin; orientedMarginBottom += SETTINGS.getScreenMarginPixels();
// Add status bar margin // Add status bar margin
if (SETTINGS.statusBar != CrossPointSettings::STATUS_BAR_MODE::NONE) { if (SETTINGS.statusBar != CrossPointSettings::STATUS_BAR_MODE::NONE) {
// Add additional margin for status bar if progress bar is shown // Add additional margin for status bar if progress bar is shown
const bool showProgressBar = SETTINGS.statusBar == CrossPointSettings::STATUS_BAR_MODE::FULL_WITH_PROGRESS_BAR || const bool showProgressBar = SETTINGS.statusBar == CrossPointSettings::STATUS_BAR_MODE::FULL_WITH_PROGRESS_BAR ||
SETTINGS.statusBar == CrossPointSettings::STATUS_BAR_MODE::ONLY_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); (showProgressBar ? (ScreenComponents::BOOK_PROGRESS_BAR_HEIGHT + progressBarMarginTop) : 0);
} }

View File

@ -156,7 +156,7 @@ void TxtReaderActivity::initializeReader() {
// Store current settings for cache validation // Store current settings for cache validation
cachedFontId = SETTINGS.getReaderFontId(); cachedFontId = SETTINGS.getReaderFontId();
cachedScreenMargin = SETTINGS.screenMargin; cachedScreenMargin = SETTINGS.getScreenMarginPixels();
cachedParagraphAlignment = SETTINGS.paragraphAlignment; cachedParagraphAlignment = SETTINGS.paragraphAlignment;
// Calculate viewport dimensions // Calculate viewport dimensions

View File

@ -312,7 +312,7 @@ void CategorySettingsActivity::render() const {
valueText = CrossPointSettings::getRefreshFrequencyString(SETTINGS.refreshFrequency); valueText = CrossPointSettings::getRefreshFrequencyString(SETTINGS.refreshFrequency);
} else if (settingsList[i].type == SettingType::ACTION && strcmp(settingsList[i].name, "Screen Margin") == 0) { } else if (settingsList[i].type == SettingType::ACTION && strcmp(settingsList[i].name, "Screen Margin") == 0) {
// Format margin value as "X px" // 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) { } else if (settingsList[i].type == SettingType::ACTION && strcmp(settingsList[i].name, "Time to Sleep") == 0) {
valueText = CrossPointSettings::getSleepTimeoutString(SETTINGS.sleepTimeout); valueText = CrossPointSettings::getSleepTimeoutString(SETTINGS.sleepTimeout);
} else if (settingsList[i].type == SettingType::ACTION && strcmp(settingsList[i].name, "Select Sleep BMP") == 0) { } else if (settingsList[i].type == SettingType::ACTION && strcmp(settingsList[i].name, "Select Sleep BMP") == 0) {

View File

@ -14,7 +14,7 @@ ScreenMarginSelectionActivity::ScreenMarginSelectionActivity(GfxRenderer& render
if (index >= options.size()) { if (index >= options.size()) {
return; return;
} }
SETTINGS.screenMargin = CrossPointSettings::SCREEN_MARGIN_VALUES[index]; SETTINGS.screenMargin = static_cast<uint8_t>(index);
SETTINGS.saveToFile(); SETTINGS.saveToFile();
onBack(); onBack();
}, },
@ -25,9 +25,8 @@ ScreenMarginSelectionActivity::ScreenMarginSelectionActivity(GfxRenderer& render
} }
void ScreenMarginSelectionActivity::loadItems() { void ScreenMarginSelectionActivity::loadItems() {
const int idx = CrossPointSettings::getScreenMarginIndex(SETTINGS.screenMargin); if (SETTINGS.screenMargin < options.size()) {
if (idx >= 0 && static_cast<size_t>(idx) < options.size()) { selectorIndex = SETTINGS.screenMargin;
selectorIndex = static_cast<size_t>(idx);
} else { } else {
selectorIndex = 0; selectorIndex = 0;
} }