This commit is contained in:
J. Nick Koston
2026-04-07 11:26:06 -10:00
parent 1ad84035c3
commit 35a7ba75de
2 changed files with 24 additions and 59 deletions
+2 -8
View File
@@ -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) {}
+22 -51
View File
@@ -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