mirror of
https://github.com/esphome/esphome.git
synced 2026-09-11 23:37:34 +00:00
reduce
This commit is contained in:
@@ -24,14 +24,8 @@ template<typename... Ts> class ToggleAction : public Action<Ts...> {
|
||||
LightState *state_;
|
||||
};
|
||||
|
||||
/** Compact light control action — every field is a function pointer.
|
||||
*
|
||||
* Python codegen wraps constant values in stateless lambdas, so each field
|
||||
* is either nullptr (unset) or a typed function pointer. No tagged union,
|
||||
* no type dispatch, no memcpy — just call through the pointer.
|
||||
*
|
||||
* Size: ~72 bytes on ESP32 (vs ~128 bytes with TemplatableValue per field).
|
||||
*/
|
||||
/// Compact light control action — each field is a function pointer (nullptr = unset).
|
||||
/// Codegen wraps constants in stateless lambdas. 72 bytes vs 128 with TemplatableValue.
|
||||
template<typename... Ts> class LightControlAction : public Action<Ts...> {
|
||||
public:
|
||||
explicit LightControlAction(LightState *parent) : parent_(parent) {}
|
||||
|
||||
@@ -172,58 +172,29 @@ def _resolve_effect_index(config: ConfigType) -> int:
|
||||
async def light_control_to_code(config, action_id, template_arg, args):
|
||||
paren = await cg.get_variable(config[CONF_ID])
|
||||
var = cg.new_Pvariable(action_id, template_arg, paren)
|
||||
if CONF_COLOR_MODE in config:
|
||||
cg.add(
|
||||
var.set_color_mode(
|
||||
await _as_lambda(config[CONF_COLOR_MODE], args, ColorMode)
|
||||
|
||||
# (config_key, setter_name, c++ type)
|
||||
FIELDS = (
|
||||
(CONF_COLOR_MODE, "set_color_mode", ColorMode),
|
||||
(CONF_STATE, "set_state", bool),
|
||||
(CONF_TRANSITION_LENGTH, "set_transition_length", cg.uint32),
|
||||
(CONF_FLASH_LENGTH, "set_flash_length", cg.uint32),
|
||||
(CONF_BRIGHTNESS, "set_brightness", float),
|
||||
(CONF_COLOR_BRIGHTNESS, "set_color_brightness", float),
|
||||
(CONF_RED, "set_red", float),
|
||||
(CONF_GREEN, "set_green", float),
|
||||
(CONF_BLUE, "set_blue", float),
|
||||
(CONF_WHITE, "set_white", float),
|
||||
(CONF_COLOR_TEMPERATURE, "set_color_temperature", float),
|
||||
(CONF_COLD_WHITE, "set_cold_white", float),
|
||||
(CONF_WARM_WHITE, "set_warm_white", float),
|
||||
)
|
||||
for conf_key, setter, type_ in FIELDS:
|
||||
if conf_key in config:
|
||||
cg.add(
|
||||
getattr(var, setter)(await _as_lambda(config[conf_key], args, type_))
|
||||
)
|
||||
)
|
||||
if CONF_STATE in config:
|
||||
cg.add(var.set_state(await _as_lambda(config[CONF_STATE], args, bool)))
|
||||
if CONF_TRANSITION_LENGTH in config:
|
||||
cg.add(
|
||||
var.set_transition_length(
|
||||
await _as_lambda(config[CONF_TRANSITION_LENGTH], args, cg.uint32)
|
||||
)
|
||||
)
|
||||
if CONF_FLASH_LENGTH in config:
|
||||
cg.add(
|
||||
var.set_flash_length(
|
||||
await _as_lambda(config[CONF_FLASH_LENGTH], args, cg.uint32)
|
||||
)
|
||||
)
|
||||
if CONF_BRIGHTNESS in config:
|
||||
cg.add(
|
||||
var.set_brightness(await _as_lambda(config[CONF_BRIGHTNESS], args, float))
|
||||
)
|
||||
if CONF_COLOR_BRIGHTNESS in config:
|
||||
cg.add(
|
||||
var.set_color_brightness(
|
||||
await _as_lambda(config[CONF_COLOR_BRIGHTNESS], args, float)
|
||||
)
|
||||
)
|
||||
if CONF_RED in config:
|
||||
cg.add(var.set_red(await _as_lambda(config[CONF_RED], args, float)))
|
||||
if CONF_GREEN in config:
|
||||
cg.add(var.set_green(await _as_lambda(config[CONF_GREEN], args, float)))
|
||||
if CONF_BLUE in config:
|
||||
cg.add(var.set_blue(await _as_lambda(config[CONF_BLUE], args, float)))
|
||||
if CONF_WHITE in config:
|
||||
cg.add(var.set_white(await _as_lambda(config[CONF_WHITE], args, float)))
|
||||
if CONF_COLOR_TEMPERATURE in config:
|
||||
cg.add(
|
||||
var.set_color_temperature(
|
||||
await _as_lambda(config[CONF_COLOR_TEMPERATURE], args, float)
|
||||
)
|
||||
)
|
||||
if CONF_COLD_WHITE in config:
|
||||
cg.add(
|
||||
var.set_cold_white(await _as_lambda(config[CONF_COLD_WHITE], args, float))
|
||||
)
|
||||
if CONF_WARM_WHITE in config:
|
||||
cg.add(
|
||||
var.set_warm_white(await _as_lambda(config[CONF_WARM_WHITE], args, float))
|
||||
)
|
||||
|
||||
if CONF_EFFECT in config:
|
||||
if isinstance(config[CONF_EFFECT], Lambda):
|
||||
# Lambda returns a string — wrap in a C++ lambda that resolves
|
||||
|
||||
Reference in New Issue
Block a user