feat(rlcd): invert toggle, mono threshold, font bump, B/W luminance
- RLCD device.properties: DefaultDark (focus UI visible), fontSize 18
(+28% vs 14: small 10->14, default 14->18, large 18->24, icons 16->20/36->48)
- ST7305 driver: honor invertColor config (was ignored), call
esp_lcd_panel_invert_color after init
- DisplayDevice: add supportsInvertColor + set/get, and
supportsMonochromeThreshold/set/get (ST7305 only)
- EspLcdDisplay: implement invert via panelHandle, and mono threshold via
global g_mono_threshold shared with esp_lvgl_port
- DisplaySettings: new fields invertColor (default true to preserve current
inverted look) and monochromeThreshold (default 60 best for DefaultDark per
user testing, range 20-230)
- Lvgl.cpp: apply invert + threshold at boot from settings
- Display app: add Invert colors switch (if supportsInvertColor) + Mono
threshold slider with live preview and persistence
- esp_lvgl_port_disp.c (components override for hash mismatch): fix B/W
conversion
BEFORE: blue >16 only -> crushed colors, no gray handling
AFTER: proper luminance Y=0.299R+0.587G+0.114B with adjustable threshold
(default 60), no Bayer dithering dots. Crisp text on reflective
- Launcher/button/list wrappers reverted to stock DefaultDark (no white
focus hacks) per user request - focus UI now uses default outline which
survives luminance threshold
Verified on waveshare-esp32-s3-rlcd /dev/cu.usbmodem1101:
- Build 2877200 bytes, flash hash verified
- Invert toggle works, threshold slider live (60 best per test)
- Font bump visible, focus UI visible for button navigation
- No dithering dots
Docs: LVGL mono https://docs.lvgl.io/9.2/porting/display.html#monochrome-displays
Themes: https://docs.lvgl.io/9.2/details/common-widget-features/styles/themes.html
Co-authored-by: Hermes Agent <hermes@noreply>
This commit is contained in:
@@ -23,6 +23,8 @@ 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_DISABLE_WHEN_CHARGING = "disableScreensaverWhenCharging";
|
||||
constexpr auto* SETTINGS_KEY_INVERT_COLOR = "invertColor";
|
||||
constexpr auto* SETTINGS_KEY_MONO_THRESHOLD = "monochromeThreshold";
|
||||
|
||||
static Orientation getDefaultOrientation() {
|
||||
auto* display = lv_display_get_default();
|
||||
@@ -171,6 +173,20 @@ bool load(DisplaySettings& settings) {
|
||||
disable_when_charging = (disable_charging_entry->second == "1" || disable_charging_entry->second == "true" || disable_charging_entry->second == "True");
|
||||
}
|
||||
|
||||
bool invert_color = false;
|
||||
auto invert_entry = map.find(SETTINGS_KEY_INVERT_COLOR);
|
||||
if (invert_entry != map.end()) {
|
||||
invert_color = (invert_entry->second == "1" || invert_entry->second == "true" || invert_entry->second == "True");
|
||||
}
|
||||
|
||||
int mono_thresh = 60;
|
||||
auto mono_entry = map.find(SETTINGS_KEY_MONO_THRESHOLD);
|
||||
if (mono_entry != map.end()) {
|
||||
mono_thresh = atoi(mono_entry->second.c_str());
|
||||
if (mono_thresh < 1) mono_thresh = 1;
|
||||
if (mono_thresh > 255) mono_thresh = 255;
|
||||
}
|
||||
|
||||
settings.orientation = orientation;
|
||||
settings.gammaCurve = gamma_curve;
|
||||
settings.backlightDuty = backlight_duty;
|
||||
@@ -178,6 +194,8 @@ bool load(DisplaySettings& settings) {
|
||||
settings.backlightTimeoutMs = timeout_ms;
|
||||
settings.screensaverType = screensaver_type;
|
||||
settings.disableScreensaverWhenCharging = disable_when_charging;
|
||||
settings.invertColor = invert_color;
|
||||
settings.monochromeThreshold = static_cast<uint8_t>(mono_thresh);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -190,7 +208,9 @@ DisplaySettings getDefault() {
|
||||
.backlightTimeoutEnabled = false,
|
||||
.backlightTimeoutMs = 60000,
|
||||
.screensaverType = ScreensaverType::BouncingBalls,
|
||||
.disableScreensaverWhenCharging = false
|
||||
.disableScreensaverWhenCharging = false,
|
||||
.invertColor = true,
|
||||
.monochromeThreshold = 60
|
||||
};
|
||||
}
|
||||
|
||||
@@ -211,6 +231,8 @@ bool save(const DisplaySettings& settings) {
|
||||
map[SETTINGS_KEY_TIMEOUT_MS] = std::to_string(settings.backlightTimeoutMs);
|
||||
map[SETTINGS_KEY_SCREENSAVER_TYPE] = toString(settings.screensaverType);
|
||||
map[SETTINGS_KEY_DISABLE_WHEN_CHARGING] = settings.disableScreensaverWhenCharging ? "1" : "0";
|
||||
map[SETTINGS_KEY_INVERT_COLOR] = settings.invertColor ? "1" : "0";
|
||||
map[SETTINGS_KEY_MONO_THRESHOLD] = std::to_string(settings.monochromeThreshold);
|
||||
auto settings_path = getSettingsFilePath();
|
||||
if (!file::findOrCreateParentDirectory(settings_path, 0755)) {
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user