feat(display): night-dim backlight window for screensaver

- DisplaySettings: nightDimEnabled/startHour/endHour/duty
  (default 22:00-07:00 at duty 20), persisted in display.properties
- Display settings page: Night dim switch + Dim from/until hour
  dropdowns + Dim brightness slider
- DisplayIdle: screensaver runs at the dimmed level when the local
  hour is inside the window (wrap-around aware); falls back to the
  regular duty when time is unknown (year < 2025)
This commit is contained in:
Adolfo Reyna
2026-09-12 08:17:45 -04:00
parent 87c82f5314
commit 85da419a98
4 changed files with 225 additions and 2 deletions
+41 -1
View File
@@ -26,6 +26,10 @@ constexpr auto* SETTINGS_KEY_BACKLIGHT_DUTY = "backlightDuty";
constexpr auto* SETTINGS_KEY_TIMEOUT_ENABLED = "backlightTimeoutEnabled";
constexpr auto* SETTINGS_KEY_TIMEOUT_MS = "backlightTimeoutMs";
constexpr auto* SETTINGS_KEY_SCREENSAVER_TYPE = "screensaverType";
constexpr auto* SETTINGS_KEY_NIGHT_DIM_ENABLED = "nightDimEnabled";
constexpr auto* SETTINGS_KEY_NIGHT_DIM_START_HOUR = "nightDimStartHour";
constexpr auto* SETTINGS_KEY_NIGHT_DIM_END_HOUR = "nightDimEndHour";
constexpr auto* SETTINGS_KEY_NIGHT_DIM_DUTY = "nightDimDuty";
static Orientation getDefaultOrientation() {
auto* display = lv_display_get_default();
@@ -202,6 +206,30 @@ bool load(DisplaySettings& settings) {
fromString(screensaver_entry->second, screensaver_type);
}
auto night_dim_enabled_entry = map.find(SETTINGS_KEY_NIGHT_DIM_ENABLED);
bool night_dim_enabled = false;
if (night_dim_enabled_entry != map.end()) {
night_dim_enabled = (night_dim_enabled_entry->second == "1" || night_dim_enabled_entry->second == "true" || night_dim_enabled_entry->second == "True");
}
auto night_dim_start_entry = map.find(SETTINGS_KEY_NIGHT_DIM_START_HOUR);
int night_dim_start_hour = 22;
if (night_dim_start_entry != map.end()) {
night_dim_start_hour = atoi(night_dim_start_entry->second.c_str());
}
auto night_dim_end_entry = map.find(SETTINGS_KEY_NIGHT_DIM_END_HOUR);
int night_dim_end_hour = 7;
if (night_dim_end_entry != map.end()) {
night_dim_end_hour = atoi(night_dim_end_entry->second.c_str());
}
auto night_dim_duty_entry = map.find(SETTINGS_KEY_NIGHT_DIM_DUTY);
int night_dim_duty = 20;
if (night_dim_duty_entry != map.end()) {
night_dim_duty = atoi(night_dim_duty_entry->second.c_str());
}
settings.orientation = orientation;
settings.fontSize = font_size;
settings.gammaCurve = gamma_curve;
@@ -209,6 +237,10 @@ bool load(DisplaySettings& settings) {
settings.backlightTimeoutEnabled = timeout_enabled;
settings.backlightTimeoutMs = timeout_ms;
settings.screensaverType = screensaver_type;
settings.nightDimEnabled = night_dim_enabled;
settings.nightDimStartHour = static_cast<uint8_t>(night_dim_start_hour < 0 ? 0 : (night_dim_start_hour > 23 ? 23 : night_dim_start_hour));
settings.nightDimEndHour = static_cast<uint8_t>(night_dim_end_hour < 0 ? 0 : (night_dim_end_hour > 23 ? 23 : night_dim_end_hour));
settings.nightDimDuty = static_cast<uint8_t>(night_dim_duty < 0 ? 0 : (night_dim_duty > 255 ? 255 : night_dim_duty));
return true;
}
@@ -221,7 +253,11 @@ DisplaySettings getDefault() {
.backlightDuty = 200,
.backlightTimeoutEnabled = false,
.backlightTimeoutMs = 60000,
.screensaverType = ScreensaverType::BouncingBalls
.screensaverType = ScreensaverType::BouncingBalls,
.nightDimEnabled = false,
.nightDimStartHour = 22,
.nightDimEndHour = 7,
.nightDimDuty = 20
};
}
@@ -242,6 +278,10 @@ bool save(const DisplaySettings& settings) {
map[SETTINGS_KEY_TIMEOUT_ENABLED] = settings.backlightTimeoutEnabled ? "1" : "0";
map[SETTINGS_KEY_TIMEOUT_MS] = std::to_string(settings.backlightTimeoutMs);
map[SETTINGS_KEY_SCREENSAVER_TYPE] = toString(settings.screensaverType);
map[SETTINGS_KEY_NIGHT_DIM_ENABLED] = settings.nightDimEnabled ? "1" : "0";
map[SETTINGS_KEY_NIGHT_DIM_START_HOUR] = std::to_string(settings.nightDimStartHour);
map[SETTINGS_KEY_NIGHT_DIM_END_HOUR] = std::to_string(settings.nightDimEndHour);
map[SETTINGS_KEY_NIGHT_DIM_DUTY] = std::to_string(settings.nightDimDuty);
auto settings_path = getSettingsFilePath();
if (!file::findOrCreateParentDirectory(settings_path, 0755)) {
return false;