diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index 74a95959..1443b109 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 = 10; +constexpr uint8_t SETTINGS_COUNT = 11; constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; } // namespace @@ -37,6 +37,7 @@ bool CrossPointSettings::saveToFile() const { serialization::writePod(outputFile, fontFamily); serialization::writePod(outputFile, fontSize); serialization::writePod(outputFile, lineSpacing); + serialization::writePod(outputFile, sleepTimeout); outputFile.close(); Serial.printf("[%lu] [CPS] Settings saved to file\n", millis()); @@ -83,6 +84,8 @@ bool CrossPointSettings::loadFromFile() { if (++settingsRead >= fileSettingsCount) break; serialization::readPod(inputFile, lineSpacing); if (++settingsRead >= fileSettingsCount) break; + serialization::readPod(inputFile, sleepTimeout); + if (++settingsRead >= fileSettingsCount) break; } while (false); inputFile.close(); @@ -126,6 +129,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 108aecdf..ff91db62 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -44,6 +44,9 @@ class CrossPointSettings { enum FONT_SIZE { SMALL = 0, MEDIUM = 1, LARGE = 2, EXTRA_LARGE = 3 }; enum LINE_COMPRESSION { TIGHT = 0, NORMAL = 1, WIDE = 2 }; + // 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 @@ -62,6 +65,8 @@ class CrossPointSettings { uint8_t fontFamily = BOOKERLY; uint8_t fontSize = MEDIUM; uint8_t lineSpacing = NORMAL; + // Auto-sleep timeout setting (default 10 minutes) + uint8_t sleepTimeout = SLEEP_10_MIN; ~CrossPointSettings() = default; @@ -75,6 +80,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 fa0cc084..36cb1b80 100644 --- a/src/activities/settings/SettingsActivity.cpp +++ b/src/activities/settings/SettingsActivity.cpp @@ -9,7 +9,7 @@ // Define the static settings list namespace { -constexpr int settingsCount = 11; +constexpr int settingsCount = 12; const SettingInfo settingsList[settingsCount] = { // Should match with SLEEP_SCREEN_MODE {"Sleep Screen", SettingType::ENUM, &CrossPointSettings::sleepScreen, {"Dark", "Light", "Custom", "Cover"}}, @@ -34,6 +34,7 @@ const SettingInfo settingsList[settingsCount] = { {"Bookerly", "Noto Sans", "Open Dyslexic"}}, {"Reader Font Size", SettingType::ENUM, &CrossPointSettings::fontSize, {"Small", "Medium", "Large", "X Large"}}, {"Reader Line Spacing", SettingType::ENUM, &CrossPointSettings::lineSpacing, {"Tight", "Normal", "Wide"}}, + {"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 6859f41c..8d4b5f44 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; @@ -322,8 +320,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;