[lvgl] Post-process size arguments in meter config (#9466)

Co-authored-by: clydebarrow <2366188+clydebarrow@users.noreply.github.com>
This commit is contained in:
Peter Zich 2025-07-12 22:43:32 -07:00 committed by GitHub
parent cd8e1548bf
commit 6f19808eff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 25 additions and 18 deletions

View File

@ -29,9 +29,9 @@ from ..defines import (
) )
from ..helpers import add_lv_use, lvgl_components_required from ..helpers import add_lv_use, lvgl_components_required
from ..lv_validation import ( from ..lv_validation import (
angle,
get_end_value, get_end_value,
get_start_value, get_start_value,
lv_angle,
lv_bool, lv_bool,
lv_color, lv_color,
lv_float, lv_float,
@ -162,7 +162,7 @@ SCALE_SCHEMA = cv.Schema(
cv.Optional(CONF_RANGE_FROM, default=0.0): cv.float_, cv.Optional(CONF_RANGE_FROM, default=0.0): cv.float_,
cv.Optional(CONF_RANGE_TO, default=100.0): cv.float_, cv.Optional(CONF_RANGE_TO, default=100.0): cv.float_,
cv.Optional(CONF_ANGLE_RANGE, default=270): cv.int_range(0, 360), cv.Optional(CONF_ANGLE_RANGE, default=270): cv.int_range(0, 360),
cv.Optional(CONF_ROTATION): angle, cv.Optional(CONF_ROTATION): lv_angle,
cv.Optional(CONF_INDICATORS): cv.ensure_list(INDICATOR_SCHEMA), cv.Optional(CONF_INDICATORS): cv.ensure_list(INDICATOR_SCHEMA),
} }
) )
@ -187,7 +187,7 @@ class MeterType(WidgetType):
for scale_conf in config.get(CONF_SCALES, ()): for scale_conf in config.get(CONF_SCALES, ()):
rotation = 90 + (360 - scale_conf[CONF_ANGLE_RANGE]) / 2 rotation = 90 + (360 - scale_conf[CONF_ANGLE_RANGE]) / 2
if CONF_ROTATION in scale_conf: if CONF_ROTATION in scale_conf:
rotation = scale_conf[CONF_ROTATION] // 10 rotation = await lv_angle.process(scale_conf[CONF_ROTATION])
with LocalVariable( with LocalVariable(
"meter_var", "lv_meter_scale_t", lv_expr.meter_add_scale(var) "meter_var", "lv_meter_scale_t", lv_expr.meter_add_scale(var)
) as meter_var: ) as meter_var:
@ -205,21 +205,20 @@ class MeterType(WidgetType):
var, var,
meter_var, meter_var,
ticks[CONF_COUNT], ticks[CONF_COUNT],
ticks[CONF_WIDTH], await size.process(ticks[CONF_WIDTH]),
ticks[CONF_LENGTH], await size.process(ticks[CONF_LENGTH]),
color, color,
) )
if CONF_MAJOR in ticks: if CONF_MAJOR in ticks:
major = ticks[CONF_MAJOR] major = ticks[CONF_MAJOR]
color = await lv_color.process(major[CONF_COLOR])
lv.meter_set_scale_major_ticks( lv.meter_set_scale_major_ticks(
var, var,
meter_var, meter_var,
major[CONF_STRIDE], major[CONF_STRIDE],
major[CONF_WIDTH], await size.process(major[CONF_WIDTH]),
major[CONF_LENGTH], await size.process(major[CONF_LENGTH]),
color, await lv_color.process(major[CONF_COLOR]),
major[CONF_LABEL_GAP], await size.process(major[CONF_LABEL_GAP]),
) )
for indicator in scale_conf.get(CONF_INDICATORS, ()): for indicator in scale_conf.get(CONF_INDICATORS, ()):
(t, v) = next(iter(indicator.items())) (t, v) = next(iter(indicator.items()))
@ -233,7 +232,11 @@ class MeterType(WidgetType):
lv_assign( lv_assign(
ivar, ivar,
lv_expr.meter_add_needle_line( lv_expr.meter_add_needle_line(
var, meter_var, v[CONF_WIDTH], color, v[CONF_R_MOD] var,
meter_var,
await size.process(v[CONF_WIDTH]),
color,
await size.process(v[CONF_R_MOD]),
), ),
) )
if t == CONF_ARC: if t == CONF_ARC:
@ -241,7 +244,11 @@ class MeterType(WidgetType):
lv_assign( lv_assign(
ivar, ivar,
lv_expr.meter_add_arc( lv_expr.meter_add_arc(
var, meter_var, v[CONF_WIDTH], color, v[CONF_R_MOD] var,
meter_var,
await size.process(v[CONF_WIDTH]),
color,
await size.process(v[CONF_R_MOD]),
), ),
) )
if t == CONF_TICK_STYLE: if t == CONF_TICK_STYLE:
@ -257,7 +264,7 @@ class MeterType(WidgetType):
color_start, color_start,
color_end, color_end,
v[CONF_LOCAL], v[CONF_LOCAL],
v[CONF_WIDTH], size.process(v[CONF_WIDTH]),
), ),
) )
if t == CONF_IMAGE: if t == CONF_IMAGE:

View File

@ -919,21 +919,21 @@ lvgl:
text_color: 0xFFFFFF text_color: 0xFFFFFF
scales: scales:
- ticks: - ticks:
width: 1 width: !lambda return 1;
count: 61 count: 61
length: 20 length: 20%
color: 0xFFFFFF color: 0xFFFFFF
range_from: 0 range_from: 0
range_to: 60 range_to: 60
angle_range: 360 angle_range: 360
rotation: 270 rotation: !lambda return 2700;
indicators: indicators:
- line: - line:
opa: 50% opa: 50%
id: minute_hand id: minute_hand
color: 0xFF0000 color: 0xFF0000
r_mod: -1 r_mod: !lambda return -1;
width: 3 width: !lambda return 3;
- -
angle_range: 330 angle_range: 330
rotation: 300 rotation: 300