Add auto-sleep timeout setting and handle it in loop

Incremented settings count, added autoSleepMinutes to CrossPointSettings, updated save/load functions, and integrated auto-sleep logic based on the new setting.
This commit is contained in:
altsysrq
2026-01-03 22:27:02 -06:00
parent 490ae79ede
commit 9ab27f848c
10 changed files with 213 additions and 54 deletions

View File

@@ -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 = 12;
constexpr uint8_t SETTINGS_COUNT = 13;
constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin";
} // namespace
@@ -39,6 +39,7 @@ bool CrossPointSettings::saveToFile() const {
serialization::writePod(outputFile, lineSpacing);
serialization::writePod(outputFile, bluetoothEnabled);
serialization::writePod(outputFile, useCoverArtPicker);
serialization::writePod(outputFile, autoSleepMinutes);
outputFile.close();
Serial.printf("[%lu] [CPS] Settings saved to file\n", millis());
@@ -89,6 +90,8 @@ bool CrossPointSettings::loadFromFile() {
if (++settingsRead >= fileSettingsCount) break;
serialization::readPod(inputFile, useCoverArtPicker);
if (++settingsRead >= fileSettingsCount) break;
serialization::readPod(inputFile, autoSleepMinutes);
if (++settingsRead >= fileSettingsCount) break;
} while (false);
inputFile.close();

View File

@@ -66,6 +66,8 @@ class CrossPointSettings {
uint8_t bluetoothEnabled = 0;
// File browser settings
uint8_t useCoverArtPicker = 0;
// Auto-sleep timeout (enum index: 0=5min, 1=10min, 2=15min, 3=20min, 4=30min, 5=60min, 6=Never)
uint8_t autoSleepMinutes = 1; // Default to 10 minutes
~CrossPointSettings() = default;
@@ -74,6 +76,19 @@ class CrossPointSettings {
uint16_t getPowerButtonDuration() const { return shortPwrBtn ? 10 : 400; }
int getReaderFontId() const;
unsigned long getAutoSleepTimeoutMs() const {
// Map enum index to milliseconds: 0=5min, 1=10min, 2=15min, 3=20min, 4=30min, 5=60min, 6=Never(0)
constexpr unsigned long timeouts[] = {
5UL * 60UL * 1000UL, // 0: 5 minutes
10UL * 60UL * 1000UL, // 1: 10 minutes (default)
15UL * 60UL * 1000UL, // 2: 15 minutes
20UL * 60UL * 1000UL, // 3: 20 minutes
30UL * 60UL * 1000UL, // 4: 30 minutes
60UL * 60UL * 1000UL, // 5: 60 minutes
0UL // 6: Never (disabled)
};
return (autoSleepMinutes < 7) ? timeouts[autoSleepMinutes] : timeouts[1];
}
bool saveToFile() const;
bool loadFromFile();

View File

@@ -9,7 +9,7 @@
// Define the static settings list
namespace {
constexpr int settingsCount = 13;
constexpr int settingsCount = 14;
const SettingInfo settingsList[settingsCount] = {
// Should match with SLEEP_SCREEN_MODE
{"Sleep Screen", SettingType::ENUM, &CrossPointSettings::sleepScreen, {"Dark", "Light", "Custom", "Cover"}},
@@ -35,6 +35,10 @@ const SettingInfo settingsList[settingsCount] = {
{"Reader Font Size", SettingType::ENUM, &CrossPointSettings::fontSize, {"Small", "Medium", "Large", "X Large"}},
{"Reader Line Spacing", SettingType::ENUM, &CrossPointSettings::lineSpacing, {"Tight", "Normal", "Wide"}},
{"Cover Art Picker", SettingType::TOGGLE, &CrossPointSettings::useCoverArtPicker, {}},
{"Auto Sleep Timeout",
SettingType::ENUM,
&CrossPointSettings::autoSleepMinutes,
{"5 min", "10 min", "15 min", "20 min", "30 min", "60 min", "Never"}},
{"Bluetooth", SettingType::TOGGLE, &CrossPointSettings::bluetoothEnabled, {}},
{"Check for updates", SettingType::ACTION, nullptr, {}},
};

View File

@@ -127,8 +127,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;
@@ -330,8 +328,10 @@ 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);
// Check auto-sleep timeout (if enabled - 0 means never sleep)
const unsigned long autoSleepTimeout = SETTINGS.getAutoSleepTimeoutMs();
if (autoSleepTimeout > 0 && millis() - lastActivityTime >= autoSleepTimeout) {
Serial.printf("[%lu] [SLP] Auto-sleep triggered after %lu ms of inactivity\n", millis(), autoSleepTimeout);
enterDeepSleep();
// This should never be hit as `enterDeepSleep` calls esp_deep_sleep_start
return;