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:
@@ -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; }
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user