From cecf5a3fa74d299b60699898c6b48d6d88687e97 Mon Sep 17 00:00:00 2001 From: Irene Ying Date: Sun, 25 Jan 2026 00:25:10 -0800 Subject: [PATCH] Create new Show Sleep Screen setting --- src/CrossPointSettings.cpp | 5 ++++- src/CrossPointSettings.h | 5 ++++- src/activities/boot_sleep/SleepActivity.cpp | 6 +++++- src/activities/boot_sleep/SleepActivity.h | 6 ++++-- src/activities/settings/SettingsActivity.cpp | 6 +++--- src/main.cpp | 8 ++++---- 6 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index 17b5d053..eb98286a 100644 --- a/src/CrossPointSettings.cpp +++ b/src/CrossPointSettings.cpp @@ -14,7 +14,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 = 18; +constexpr uint8_t SETTINGS_COUNT = 19; constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; } // namespace @@ -30,6 +30,7 @@ bool CrossPointSettings::saveToFile() const { serialization::writePod(outputFile, SETTINGS_FILE_VERSION); serialization::writePod(outputFile, SETTINGS_COUNT); serialization::writePod(outputFile, sleepScreen); + serialization::writePod(outputFile, showSleepScreen); serialization::writePod(outputFile, extraParagraphSpacing); serialization::writePod(outputFile, shortPwrBtn); serialization::writePod(outputFile, statusBar); @@ -76,6 +77,8 @@ bool CrossPointSettings::loadFromFile() { do { serialization::readPod(inputFile, sleepScreen); if (++settingsRead >= fileSettingsCount) break; + serialization::readPod(inputFile, showSleepScreen); + if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, extraParagraphSpacing); if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, shortPwrBtn); diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index f1de49ec..925a3260 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -16,7 +16,8 @@ class CrossPointSettings { CrossPointSettings& operator=(const CrossPointSettings&) = delete; // Should match with SettingsActivity text - enum SLEEP_SCREEN_MODE { DARK = 0, LIGHT = 1, CUSTOM = 2, COVER = 3, BLANK = 4, LAST_SCREEN = 5 }; + enum SLEEP_SCREEN_MODE { DARK = 0, LIGHT = 1, CUSTOM = 2, COVER = 3, BLANK = 4 }; + enum SHOW_SLEEP_SCREEN { ALWAYS = 0, EXCEPT_TIMEOUT = 1, NEVER = 2 }; enum SLEEP_SCREEN_COVER_MODE { FIT = 0, CROP = 1 }; // Status bar display type enum @@ -60,6 +61,8 @@ class CrossPointSettings { // Sleep screen settings uint8_t sleepScreen = DARK; + // Show sleep screen settings + uint8_t showSleepScreen = ALWAYS; // Sleep screen cover mode settings uint8_t sleepScreenCoverMode = FIT; // Status bar settings diff --git a/src/activities/boot_sleep/SleepActivity.cpp b/src/activities/boot_sleep/SleepActivity.cpp index bd47a187..962e0b41 100644 --- a/src/activities/boot_sleep/SleepActivity.cpp +++ b/src/activities/boot_sleep/SleepActivity.cpp @@ -13,8 +13,12 @@ #include "util/StringUtils.h" void SleepActivity::onEnter() { + const bool SHOW_SLEEP_SCREEN = + SETTINGS.showSleepScreen == CrossPointSettings::SHOW_SLEEP_SCREEN::ALWAYS || + (!fromTimeout && SETTINGS.showSleepScreen == CrossPointSettings::SHOW_SLEEP_SCREEN::EXCEPT_TIMEOUT); + Activity::onEnter(); - if (SETTINGS.sleepScreen != CrossPointSettings::SLEEP_SCREEN_MODE::LAST_SCREEN) { + if (SHOW_SLEEP_SCREEN) { renderPopup("Entering Sleep..."); } else { return renderLastScreenSleepScreen(); diff --git a/src/activities/boot_sleep/SleepActivity.h b/src/activities/boot_sleep/SleepActivity.h index 56f0d13a..01263311 100644 --- a/src/activities/boot_sleep/SleepActivity.h +++ b/src/activities/boot_sleep/SleepActivity.h @@ -5,8 +5,8 @@ class Bitmap; class SleepActivity final : public Activity { public: - explicit SleepActivity(GfxRenderer& renderer, MappedInputManager& mappedInput) - : Activity("Sleep", renderer, mappedInput) {} + explicit SleepActivity(GfxRenderer& renderer, MappedInputManager& mappedInput, bool fromTimeout) + : Activity("Sleep", renderer, mappedInput), fromTimeout(fromTimeout) {} void onEnter() override; private: @@ -17,4 +17,6 @@ class SleepActivity final : public Activity { void renderBitmapSleepScreen(const Bitmap& bitmap) const; void renderLastScreenSleepScreen() const; void renderBlankSleepScreen() const; + + bool fromTimeout = false; }; diff --git a/src/activities/settings/SettingsActivity.cpp b/src/activities/settings/SettingsActivity.cpp index 7e1c767b..95d356cb 100644 --- a/src/activities/settings/SettingsActivity.cpp +++ b/src/activities/settings/SettingsActivity.cpp @@ -13,11 +13,11 @@ // Define the static settings list namespace { -constexpr int settingsCount = 20; +constexpr int settingsCount = 21; const SettingInfo settingsList[settingsCount] = { // Should match with SLEEP_SCREEN_MODE - SettingInfo::Enum("Sleep Screen", &CrossPointSettings::sleepScreen, - {"Dark", "Light", "Custom", "Cover", "Last Screen", "None"}), + SettingInfo::Enum("Sleep Screen", &CrossPointSettings::sleepScreen, {"Dark", "Light", "Custom", "Cover", "None"}), + SettingInfo::Enum("Show Sleep Screen", &CrossPointSettings::showSleepScreen, {"Always", "Except Timeout", "Never"}), SettingInfo::Enum("Sleep Screen Cover Mode", &CrossPointSettings::sleepScreenCoverMode, {"Fit", "Crop"}), SettingInfo::Enum("Status Bar", &CrossPointSettings::statusBar, {"None", "No Progress", "Full"}), SettingInfo::Enum("Hide Battery %", &CrossPointSettings::hideBatteryPercentage, {"Never", "In Reader", "Always"}), diff --git a/src/main.cpp b/src/main.cpp index 8a7c3b91..8ba8a1ad 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -195,9 +195,9 @@ void waitForPowerRelease() { } // Enter deep sleep mode -void enterDeepSleep() { +void enterDeepSleep(bool fromTimeout) { exitActivity(); - enterNewActivity(new SleepActivity(renderer, mappedInputManager)); + enterNewActivity(new SleepActivity(renderer, mappedInputManager, fromTimeout)); einkDisplay.deepSleep(); Serial.printf("[%lu] [ ] Power button press calibration value: %lu ms\n", millis(), t2 - t1); @@ -340,14 +340,14 @@ void loop() { const unsigned long sleepTimeoutMs = SETTINGS.getSleepTimeoutMs(); if (millis() - lastActivityTime >= sleepTimeoutMs) { Serial.printf("[%lu] [SLP] Auto-sleep triggered after %lu ms of inactivity\n", millis(), sleepTimeoutMs); - enterDeepSleep(); + enterDeepSleep(true); // This should never be hit as `enterDeepSleep` calls esp_deep_sleep_start return; } if (inputManager.isPressed(InputManager::BTN_POWER) && inputManager.getHeldTime() > SETTINGS.getPowerButtonDuration()) { - enterDeepSleep(); + enterDeepSleep(false); // This should never be hit as `enterDeepSleep` calls esp_deep_sleep_start return; }