mirror of
https://github.com/esphome/esphome.git
synced 2024-11-27 01:08:03 +01:00
Add actions to animation (#4959)
This commit is contained in:
parent
b2ccd32cd7
commit
ee12c68b8f
2 changed files with 73 additions and 2 deletions
|
@ -1,6 +1,6 @@
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from esphome import core
|
from esphome import automation, core
|
||||||
from esphome.components import display, font
|
from esphome.components import display, font
|
||||||
import esphome.components.image as espImage
|
import esphome.components.image as espImage
|
||||||
from esphome.components.image import CONF_USE_TRANSPARENCY
|
from esphome.components.image import CONF_USE_TRANSPARENCY
|
||||||
|
@ -18,15 +18,28 @@ from esphome.core import CORE, HexInt
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
CODEOWNERS = ["@syndlex"]
|
||||||
DEPENDENCIES = ["display"]
|
DEPENDENCIES = ["display"]
|
||||||
MULTI_CONF = True
|
MULTI_CONF = True
|
||||||
|
|
||||||
CONF_LOOP = "loop"
|
CONF_LOOP = "loop"
|
||||||
CONF_START_FRAME = "start_frame"
|
CONF_START_FRAME = "start_frame"
|
||||||
CONF_END_FRAME = "end_frame"
|
CONF_END_FRAME = "end_frame"
|
||||||
|
CONF_FRAME = "frame"
|
||||||
|
|
||||||
Animation_ = display.display_ns.class_("Animation", espImage.Image_)
|
Animation_ = display.display_ns.class_("Animation", espImage.Image_)
|
||||||
|
|
||||||
|
# Actions
|
||||||
|
NextFrameAction = display.display_ns.class_(
|
||||||
|
"AnimationNextFrameAction", automation.Action, cg.Parented.template(Animation_)
|
||||||
|
)
|
||||||
|
PrevFrameAction = display.display_ns.class_(
|
||||||
|
"AnimationPrevFrameAction", automation.Action, cg.Parented.template(Animation_)
|
||||||
|
)
|
||||||
|
SetFrameAction = display.display_ns.class_(
|
||||||
|
"AnimationSetFrameAction", automation.Action, cg.Parented.template(Animation_)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def validate_cross_dependencies(config):
|
def validate_cross_dependencies(config):
|
||||||
"""
|
"""
|
||||||
|
@ -74,7 +87,35 @@ ANIMATION_SCHEMA = cv.Schema(
|
||||||
|
|
||||||
CONFIG_SCHEMA = cv.All(font.validate_pillow_installed, ANIMATION_SCHEMA)
|
CONFIG_SCHEMA = cv.All(font.validate_pillow_installed, ANIMATION_SCHEMA)
|
||||||
|
|
||||||
CODEOWNERS = ["@syndlex"]
|
NEXT_FRAME_SCHEMA = automation.maybe_simple_id(
|
||||||
|
{
|
||||||
|
cv.GenerateID(): cv.use_id(Animation_),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
PREV_FRAME_SCHEMA = automation.maybe_simple_id(
|
||||||
|
{
|
||||||
|
cv.GenerateID(): cv.use_id(Animation_),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
SET_FRAME_SCHEMA = cv.Schema(
|
||||||
|
{
|
||||||
|
cv.GenerateID(): cv.use_id(Animation_),
|
||||||
|
cv.Required(CONF_FRAME): cv.uint16_t,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@automation.register_action("animation.next_frame", NextFrameAction, NEXT_FRAME_SCHEMA)
|
||||||
|
@automation.register_action("animation.prev_frame", PrevFrameAction, PREV_FRAME_SCHEMA)
|
||||||
|
@automation.register_action("animation.set_frame", SetFrameAction, SET_FRAME_SCHEMA)
|
||||||
|
async def animation_action_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_FRAME in config:
|
||||||
|
template_ = await cg.templatable(config[CONF_FRAME], args, cg.uint16)
|
||||||
|
cg.add(var.set_frame(template_))
|
||||||
|
return var
|
||||||
|
|
||||||
|
|
||||||
async def to_code(config):
|
async def to_code(config):
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
|
|
||||||
|
#include "esphome/core/automation.h"
|
||||||
|
|
||||||
namespace esphome {
|
namespace esphome {
|
||||||
namespace display {
|
namespace display {
|
||||||
|
|
||||||
|
@ -33,5 +35,33 @@ class Animation : public Image {
|
||||||
int loop_current_iteration_;
|
int loop_current_iteration_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<typename... Ts> class AnimationNextFrameAction : public Action<Ts...> {
|
||||||
|
public:
|
||||||
|
AnimationNextFrameAction(Animation *parent) : parent_(parent) {}
|
||||||
|
void play(Ts... x) override { this->parent_->next_frame(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Animation *parent_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename... Ts> class AnimationPrevFrameAction : public Action<Ts...> {
|
||||||
|
public:
|
||||||
|
AnimationPrevFrameAction(Animation *parent) : parent_(parent) {}
|
||||||
|
void play(Ts... x) override { this->parent_->prev_frame(); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Animation *parent_;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<typename... Ts> class AnimationSetFrameAction : public Action<Ts...> {
|
||||||
|
public:
|
||||||
|
AnimationSetFrameAction(Animation *parent) : parent_(parent) {}
|
||||||
|
TEMPLATABLE_VALUE(uint16_t, frame)
|
||||||
|
void play(Ts... x) override { this->parent_->set_frame(this->frame_.value(x...)); }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Animation *parent_;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace display
|
} // namespace display
|
||||||
} // namespace esphome
|
} // namespace esphome
|
||||||
|
|
Loading…
Reference in a new issue