mirror of
https://github.com/esphome/esphome.git
synced 2025-04-14 06:40:32 +01:00
78 lines
2.1 KiB
Python
78 lines
2.1 KiB
Python
import esphome.codegen as cg
|
|
from esphome.components.binary_sensor import BinarySensor
|
|
import esphome.config_validation as cv
|
|
from esphome.const import CONF_GROUP, CONF_ID
|
|
|
|
from .defines import (
|
|
CONF_ENCODERS,
|
|
CONF_INITIAL_FOCUS,
|
|
CONF_KEYPADS,
|
|
CONF_LONG_PRESS_REPEAT_TIME,
|
|
CONF_LONG_PRESS_TIME,
|
|
literal,
|
|
)
|
|
from .helpers import lvgl_components_required
|
|
from .lvcode import lv, lv_assign, lv_expr, lv_Pvariable
|
|
from .schemas import ENCODER_SCHEMA
|
|
from .types import lv_group_t, lv_indev_type_t
|
|
|
|
KEYPAD_KEYS = (
|
|
"up",
|
|
"down",
|
|
"right",
|
|
"left",
|
|
"esc",
|
|
"del",
|
|
"backspace",
|
|
"enter",
|
|
"next",
|
|
"prev",
|
|
"home",
|
|
"end",
|
|
"0",
|
|
"1",
|
|
"2",
|
|
"3",
|
|
"4",
|
|
"5",
|
|
"6",
|
|
"7",
|
|
"8",
|
|
"9",
|
|
"#",
|
|
"*",
|
|
)
|
|
|
|
KEYPADS_CONFIG = cv.ensure_list(
|
|
ENCODER_SCHEMA.extend(
|
|
{cv.Optional(key): cv.use_id(BinarySensor) for key in KEYPAD_KEYS}
|
|
)
|
|
)
|
|
|
|
|
|
async def keypads_to_code(var, config, default_group):
|
|
for enc_conf in config[CONF_KEYPADS]:
|
|
lvgl_components_required.add("KEY_LISTENER")
|
|
lpt = enc_conf[CONF_LONG_PRESS_TIME].total_milliseconds
|
|
lprt = enc_conf[CONF_LONG_PRESS_REPEAT_TIME].total_milliseconds
|
|
listener = cg.new_Pvariable(
|
|
enc_conf[CONF_ID], lv_indev_type_t.LV_INDEV_TYPE_KEYPAD, lpt, lprt
|
|
)
|
|
await cg.register_parented(listener, var)
|
|
for key in [x for x in enc_conf if x in KEYPAD_KEYS]:
|
|
b_sensor = await cg.get_variable(enc_conf[key])
|
|
cg.add(listener.add_button(b_sensor, literal(f"LV_KEY_{key.upper()}")))
|
|
if group := enc_conf.get(CONF_GROUP):
|
|
group = lv_Pvariable(lv_group_t, group)
|
|
lv_assign(group, lv_expr.group_create())
|
|
else:
|
|
group = default_group
|
|
lv.indev_set_group(lv_expr.indev_drv_register(listener.get_drv()), group)
|
|
|
|
|
|
async def initial_focus_to_code(config):
|
|
for enc_conf in config[CONF_ENCODERS]:
|
|
if default_focus := enc_conf.get(CONF_INITIAL_FOCUS):
|
|
obj = await cg.get_variable(default_focus)
|
|
lv.group_focus_obj(obj)
|