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:
Adolfo Reyna
2026-07-12 15:27:08 -04:00
parent 78382d6deb
commit e7fb5fb38f
123 changed files with 16637 additions and 36 deletions
@@ -5,6 +5,7 @@
#include <tactility/check.h>
#include <Tactility/hal/touch/TouchDevice.h>
#include <cassert>
#include <esp_lcd_panel_ops.h>
#include <esp_lvgl_port_disp.h>
static const auto LOGGER = tt::Logger("EspLcdDisplay");
@@ -128,3 +129,30 @@ std::shared_ptr<tt::hal::display::DisplayDriver> EspLcdDisplay::getDisplayDriver
}
return displayDriver;
}
void EspLcdDisplay::setInvertColor(bool invert) {
currentInvertColor = invert;
if (panelHandle != nullptr) {
esp_err_t err = esp_lcd_panel_invert_color(panelHandle, invert);
if (err != ESP_OK) {
LOGGER.warn("Failed to invert color: {}", esp_err_to_name(err));
}
}
}
bool EspLcdDisplay::supportsMonochromeThreshold() const {
// Generic EspLcdDisplay doesn't know - subclasses override
return false;
}
void EspLcdDisplay::setMonochromeThreshold(uint8_t threshold) {
// Defined in esp_lvgl_port component
extern uint8_t g_mono_threshold;
if (threshold == 0) threshold = 1; // avoid 0 meaning default
g_mono_threshold = threshold;
}
uint8_t EspLcdDisplay::getMonochromeThreshold() const {
extern uint8_t g_mono_threshold;
return g_mono_threshold ? g_mono_threshold : 60;
}
@@ -15,11 +15,13 @@ class EspLcdDisplay : public tt::hal::display::DisplayDevice {
std::shared_ptr<tt::hal::display::DisplayDriver> displayDriver;
/** @warning This is never changed, so a driver that needs BGR is not supported */
lcd_rgb_element_order_t rgbElementOrder = LCD_RGB_ELEMENT_ORDER_RGB;
bool currentInvertColor = false;
protected:
// Used for sending commands such as setting curves
esp_lcd_panel_io_handle_t getIoHandle() const { return ioHandle; }
esp_lcd_panel_handle_t getPanelHandle() const { return panelHandle; }
virtual bool createIoHandle(esp_lcd_panel_io_handle_t& outHandle) = 0;
@@ -41,6 +43,22 @@ public:
bool stop() final;
// region Invert
bool supportsInvertColor() const override { return true; }
void setInvertColor(bool invert) override;
bool getInvertColor() const override { return currentInvertColor; }
// endregion
// region Mono threshold (for ST7305 reflective etc)
bool supportsMonochromeThreshold() const override;
void setMonochromeThreshold(uint8_t threshold) override;
uint8_t getMonochromeThreshold() const override;
// endregion
// region LVGL
bool supportsLvgl() const final { return true; }
+6
View File
@@ -70,6 +70,12 @@ bool St7305Display::createPanelHandle(esp_lcd_panel_io_handle_t ioHandle, esp_lc
}
vTaskDelay(pdMS_TO_TICKS(50));
if (configuration->invertColor) {
if (esp_lcd_panel_invert_color(panelHandle, true) != ESP_OK) {
LOGGER.warn("Failed to apply initial invertColor");
}
}
return true;
}
+2
View File
@@ -94,6 +94,8 @@ public:
}
bool supportsBacklightDuty() const override { return configuration->backlightDutyFunction != nullptr; }
bool supportsMonochromeThreshold() const override { return true; }
};
std::shared_ptr<tt::hal::display::DisplayDevice> createDisplay();