Stop infinite loop in light on_turn_on (#1219)

Co-authored-by: Otto Winter <otto@otto-winter.com>
This commit is contained in:
Emil Hesslow 2020-07-29 00:13:51 -07:00 committed by GitHub
parent 949c71dc97
commit 36e4a8b444
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -103,10 +103,14 @@ class LightTurnOnTrigger : public Trigger<> {
LightTurnOnTrigger(LightState *a_light) { LightTurnOnTrigger(LightState *a_light) {
a_light->add_new_remote_values_callback([this, a_light]() { a_light->add_new_remote_values_callback([this, a_light]() {
auto is_on = a_light->current_values.is_on(); auto is_on = a_light->current_values.is_on();
if (is_on && !last_on_) { // only trigger when going from off to on
auto should_trigger = is_on && !last_on_;
// Set new state immediately so that trigger() doesn't devolve
// into infinite loop
last_on_ = is_on;
if (should_trigger) {
this->trigger(); this->trigger();
} }
last_on_ = is_on;
}); });
last_on_ = a_light->current_values.is_on(); last_on_ = a_light->current_values.is_on();
} }
@ -120,10 +124,14 @@ class LightTurnOffTrigger : public Trigger<> {
LightTurnOffTrigger(LightState *a_light) { LightTurnOffTrigger(LightState *a_light) {
a_light->add_new_remote_values_callback([this, a_light]() { a_light->add_new_remote_values_callback([this, a_light]() {
auto is_on = a_light->current_values.is_on(); auto is_on = a_light->current_values.is_on();
if (!is_on && last_on_) { // only trigger when going from on to off
auto should_trigger = !is_on && last_on_;
// Set new state immediately so that trigger() doesn't devolve
// into infinite loop
last_on_ = is_on;
if (should_trigger) {
this->trigger(); this->trigger();
} }
last_on_ = is_on;
}); });
last_on_ = a_light->current_values.is_on(); last_on_ = a_light->current_values.is_on();
} }