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
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<int>(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<uint8_t>(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<int>(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];
}

View File

@ -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;

View File

@ -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);
}

View File

@ -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

View File

@ -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) {

View File

@ -14,7 +14,7 @@ ScreenMarginSelectionActivity::ScreenMarginSelectionActivity(GfxRenderer& render
if (index >= options.size()) {
return;
}
SETTINGS.screenMargin = CrossPointSettings::SCREEN_MARGIN_VALUES[index];
SETTINGS.screenMargin = static_cast<uint8_t>(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<size_t>(idx) < options.size()) {
selectorIndex = static_cast<size_t>(idx);
if (SETTINGS.screenMargin < options.size()) {
selectorIndex = SETTINGS.screenMargin;
} else {
selectorIndex = 0;
}