I’m building a config-driven dashboard on top of ESPHome using LVGL8.3. All testing is done on WT32S3-86S (ESP32-S3, 4", 480x480 screen, 8Mb PSRAM). The initial version works fine but uses local styles, so one of the main changes I’m adding is reusable styles.
To store new styles for a component, a C++ class is used.
class HaDeckWidgetStyle
{
public:
HaDeckWidgetStyle();
StyleGroup *get_main();
void set_bg_color(uint32_t value, lv_state_t selector);
void set_bg_opacity(uint8_t value, lv_state_t selector);
protected:
void set_bg_color_(StyleGroup *style, uint32_t value, lv_state_t selector);
void set_bg_opacity_(StyleGroup *style, uint8_t value, lv_state_t selector);
lv_style_t main_def_;
lv_style_t main_disabled_;
lv_style_t main_checked_;
StyleGroup main_ = {nullptr, nullptr, nullptr};
};
// Part of implementation
HaDeckWidgetStyle::HaDeckWidgetStyle() {
lv_style_init(&main_def_);
lv_style_init(&main_disabled_);
lv_style_init(&main_checked_);
main_.def = &main_def_;
main_.disabled = &main_disabled_;
main_.checked = &main_checked_;
}
void HaDeckWidgetStyle::set_bg_color(uint32_t value, lv_state_t selector) {
set_bg_color_(&main_, value, selector);
}
void HaDeckWidgetStyle::set_bg_opacity(uint8_t value, lv_state_t selector) {
set_bg_opacity_(&main_, value, selector);
}
void HaDeckWidgetStyle::set_bg_color_(StyleGroup *style, uint32_t value, lv_state_t selector) {
if (selector == LV_STATE_DEFAULT) {
lv_style_set_bg_color(style->def, lv_color_hex(value));
}
if (selector & LV_STATE_DISABLED) {
lv_style_set_bg_color(style->disabled, lv_color_hex(value));
}
if (selector & LV_STATE_CHECKED) {
lv_style_set_bg_color(style->checked, lv_color_hex(value));
}
}
void HaDeckWidgetStyle::set_bg_opacity_(StyleGroup *style, uint8_t value, lv_state_t selector) {
if (selector == LV_STATE_DEFAULT) {
lv_style_set_bg_opa(style->def, value);
}
if (selector & LV_STATE_DISABLED) {
lv_style_set_bg_opa(style->disabled, value);
}
if (selector & LV_STATE_CHECKED) {
lv_style_set_bg_opa(style->checked, value);
}
}
Everything works fine if lv_style_set_bg_opa is not used, but if I try to set the bg opacity - it crushes:
search_suitable_block at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_tlsf.c:564
(inlined by) block_locate_free at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_tlsf.c:770
lv_tlsf_malloc at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_tlsf.c:1102
lv_mem_alloc at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_mem.c:134
(inlined by) lv_mem_alloc at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_mem.c:125
lv_style_set_prop_internal at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_style.c:464
lv_style_set_prop at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_style.c:284
lv_style_set_bg_opa at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_style_gen.c:200
esphome::ha_deck::HaDeckWidgetStyle::set_bg_opacity_(esphome::ha_deck::StyleGroup*, unsigned char, unsigned short) at /config/.esphome/build/room-screen-1/src/esphome/components/ha_deck/ha_deck_widget.cpp:142
esphome::ha_deck::HaDeckWidgetStyle::set_bg_opacity(unsigned char, unsigned short) at /config/.esphome/build/room-screen-1/src/esphome/components/ha_deck/ha_deck_widget.cpp:103
setup() at /config/room-screen-1.yaml:89
loopTask(void*) at /config/.esphome/platformio/packages/framework-arduinoespressif32/cores/esp32/main.cpp:42
Any suggestion on what I’m doing wrong?