mirror of
https://github.com/esphome/esphome.git
synced 2024-12-22 13:34:54 +01:00
Fix parallel invocations of repeat action (#4480)
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
parent
14e7b8a1ef
commit
43fb68f8a0
2 changed files with 12 additions and 10 deletions
|
@ -254,7 +254,11 @@ async def repeat_action_to_code(config, action_id, template_arg, args):
|
||||||
var = cg.new_Pvariable(action_id, template_arg)
|
var = cg.new_Pvariable(action_id, template_arg)
|
||||||
count_template = await cg.templatable(config[CONF_COUNT], args, cg.uint32)
|
count_template = await cg.templatable(config[CONF_COUNT], args, cg.uint32)
|
||||||
cg.add(var.set_count(count_template))
|
cg.add(var.set_count(count_template))
|
||||||
actions = await build_action_list(config[CONF_THEN], template_arg, args)
|
actions = await build_action_list(
|
||||||
|
config[CONF_THEN],
|
||||||
|
cg.TemplateArguments(cg.uint32, *template_arg.args),
|
||||||
|
[(cg.uint32, "iteration"), *args],
|
||||||
|
)
|
||||||
cg.add(var.add_then(actions))
|
cg.add(var.add_then(actions))
|
||||||
return var
|
return var
|
||||||
|
|
||||||
|
|
|
@ -235,22 +235,21 @@ template<typename... Ts> class RepeatAction : public Action<Ts...> {
|
||||||
public:
|
public:
|
||||||
TEMPLATABLE_VALUE(uint32_t, count)
|
TEMPLATABLE_VALUE(uint32_t, count)
|
||||||
|
|
||||||
void add_then(const std::vector<Action<Ts...> *> &actions) {
|
void add_then(const std::vector<Action<uint32_t, Ts...> *> &actions) {
|
||||||
this->then_.add_actions(actions);
|
this->then_.add_actions(actions);
|
||||||
this->then_.add_action(new LambdaAction<Ts...>([this](Ts... x) {
|
this->then_.add_action(new LambdaAction<uint32_t, Ts...>([this](uint32_t iteration, Ts... x) {
|
||||||
this->iteration_++;
|
iteration++;
|
||||||
if (this->iteration_ == this->count_.value(x...))
|
if (iteration >= this->count_.value(x...))
|
||||||
this->play_next_tuple_(this->var_);
|
this->play_next_tuple_(this->var_);
|
||||||
else
|
else
|
||||||
this->then_.play_tuple(this->var_);
|
this->then_.play(iteration, x...);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
void play_complex(Ts... x) override {
|
void play_complex(Ts... x) override {
|
||||||
this->num_running_++;
|
this->num_running_++;
|
||||||
this->var_ = std::make_tuple(x...);
|
this->var_ = std::make_tuple(x...);
|
||||||
this->iteration_ = 0;
|
this->then_.play(0, x...);
|
||||||
this->then_.play_tuple(this->var_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void play(Ts... x) override { /* ignore - see play_complex */
|
void play(Ts... x) override { /* ignore - see play_complex */
|
||||||
|
@ -259,8 +258,7 @@ template<typename... Ts> class RepeatAction : public Action<Ts...> {
|
||||||
void stop() override { this->then_.stop(); }
|
void stop() override { this->then_.stop(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint32_t iteration_;
|
ActionList<uint32_t, Ts...> then_;
|
||||||
ActionList<Ts...> then_;
|
|
||||||
std::tuple<Ts...> var_;
|
std::tuple<Ts...> var_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue