From 536d85026c611e1692f40725d57a758787d995f4 Mon Sep 17 00:00:00 2001 From: ratedcounsel Date: Wed, 31 Dec 2025 08:55:42 +0000 Subject: [PATCH] feat: add Time to Sleep user preference setting Add configurable auto-sleep timeout in Settings with options: - 1 minute - 5 minutes - 10 minutes (default) - 15 minutes - 30 minutes Changes: - Add SLEEP_TIMEOUT enum and sleepTimeout field to CrossPointSettings - Add getSleepTimeoutMs() helper method - Add sleepTimeout to settings serialization - Add 'Time to Sleep' option in SettingsActivity - Replace hardcoded AUTO_SLEEP_TIMEOUT_MS with SETTINGS.getSleepTimeoutMs() --- src/CrossPointSettings.cpp | 21 +++++++++++++++++++- src/CrossPointSettings.h | 6 ++++++ src/activities/settings/SettingsActivity.cpp | 1 + src/main.cpp | 7 +++---- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index 74bc0d26..ea98371a 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 = 11; +constexpr uint8_t SETTINGS_COUNT = 12; constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; } // namespace @@ -38,6 +38,7 @@ bool CrossPointSettings::saveToFile() const { serialization::writePod(outputFile, fontSize); serialization::writePod(outputFile, lineSpacing); serialization::writePod(outputFile, paragraphAlignment); + serialization::writePod(outputFile, sleepTimeout); outputFile.close(); Serial.printf("[%lu] [CPS] Settings saved to file\n", millis()); @@ -86,6 +87,8 @@ bool CrossPointSettings::loadFromFile() { if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, paragraphAlignment); if (++settingsRead >= fileSettingsCount) break; + serialization::readPod(inputFile, sleepTimeout); + if (++settingsRead >= fileSettingsCount) break; } while (false); inputFile.close(); @@ -129,6 +132,22 @@ float CrossPointSettings::getReaderLineCompression() const { } } +unsigned long CrossPointSettings::getSleepTimeoutMs() const { + switch (sleepTimeout) { + case SLEEP_1_MIN: + return 1UL * 60 * 1000; + case SLEEP_5_MIN: + return 5UL * 60 * 1000; + case SLEEP_10_MIN: + default: + return 10UL * 60 * 1000; + case SLEEP_15_MIN: + return 15UL * 60 * 1000; + case SLEEP_30_MIN: + return 30UL * 60 * 1000; + } +} + int CrossPointSettings::getReaderFontId() const { switch (fontFamily) { case BOOKERLY: diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index b9cce85e..9377ad70 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -45,6 +45,9 @@ class CrossPointSettings { enum LINE_COMPRESSION { TIGHT = 0, NORMAL = 1, WIDE = 2 }; enum PARAGRAPH_ALIGNMENT { JUSTIFIED = 0, LEFT_ALIGN = 1, CENTER_ALIGN = 2, RIGHT_ALIGN = 3 }; + // 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 }; + // Sleep screen settings uint8_t sleepScreen = DARK; // Status bar settings @@ -64,6 +67,8 @@ class CrossPointSettings { uint8_t fontSize = MEDIUM; uint8_t lineSpacing = NORMAL; uint8_t paragraphAlignment = JUSTIFIED; + // Auto-sleep timeout setting (default 10 minutes) + uint8_t sleepTimeout = SLEEP_10_MIN; ~CrossPointSettings() = default; @@ -77,6 +82,7 @@ class CrossPointSettings { bool loadFromFile(); float getReaderLineCompression() const; + unsigned long getSleepTimeoutMs() const; }; // Helper macro to access settings diff --git a/src/activities/settings/SettingsActivity.cpp b/src/activities/settings/SettingsActivity.cpp index d9d19411..c8436804 100644 --- a/src/activities/settings/SettingsActivity.cpp +++ b/src/activities/settings/SettingsActivity.cpp @@ -38,6 +38,7 @@ const SettingInfo settingsList[settingsCount] = { SettingType::ENUM, &CrossPointSettings::paragraphAlignment, {"Justify", "Left", "Center", "Right"}}, + {"Time to Sleep", SettingType::ENUM, &CrossPointSettings::sleepTimeout, {"1 min", "5 min", "10 min", "15 min", "30 min"}}, {"Check for updates", SettingType::ACTION, nullptr, {}}, }; } // namespace diff --git a/src/main.cpp b/src/main.cpp index b9e33426..b8d2bfb3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -126,8 +126,6 @@ EpdFont ui12RegularFont(&ubuntu_12_regular); EpdFont ui12BoldFont(&ubuntu_12_bold); EpdFontFamily ui12FontFamily(&ui12RegularFont, &ui12BoldFont); -// Auto-sleep timeout (10 minutes of inactivity) -constexpr unsigned long AUTO_SLEEP_TIMEOUT_MS = 10 * 60 * 1000; // measurement of power button press duration calibration value unsigned long t1 = 0; unsigned long t2 = 0; @@ -323,8 +321,9 @@ void loop() { lastActivityTime = millis(); // Reset inactivity timer } - if (millis() - lastActivityTime >= AUTO_SLEEP_TIMEOUT_MS) { - Serial.printf("[%lu] [SLP] Auto-sleep triggered after %lu ms of inactivity\n", millis(), AUTO_SLEEP_TIMEOUT_MS); + 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(); // This should never be hit as `enterDeepSleep` calls esp_deep_sleep_start return;