From af7fdc98879778e4f81c36a216c8711e75d4fa0d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 10 Apr 2026 23:49:56 -1000 Subject: [PATCH] [status_led] Simplify loop body, rely on disable_loop for idle optimization --- esphome/components/status_led/status_led.cpp | 30 ++++++-------------- esphome/components/status_led/status_led.h | 2 -- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/esphome/components/status_led/status_led.cpp b/esphome/components/status_led/status_led.cpp index 87035f6284c..90216d244d4 100644 --- a/esphome/components/status_led/status_led.cpp +++ b/esphome/components/status_led/status_led.cpp @@ -7,10 +7,10 @@ namespace status_led { static const char *const TAG = "status_led"; +static constexpr uint32_t ERROR_PERIOD_MS = 250; static constexpr uint32_t ERROR_ON_MS = 150; -static constexpr uint32_t ERROR_OFF_MS = 100; +static constexpr uint32_t WARNING_PERIOD_MS = 1500; static constexpr uint32_t WARNING_ON_MS = 250; -static constexpr uint32_t WARNING_OFF_MS = 1250; StatusLED *global_status_led = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) @@ -25,28 +25,14 @@ void StatusLED::dump_config() { } void StatusLED::loop() { const uint32_t app_state = App.get_app_state(); - const bool error = (app_state & STATUS_LED_ERROR) != 0u; - const bool warning = (app_state & STATUS_LED_WARNING) != 0u; - if (!error && !warning) { - if (this->led_on_) { - this->led_on_ = false; - this->pin_->digital_write(false); - } - this->disable_loop(); - return; - } - const uint32_t now = App.get_loop_component_start_time(); - if ((int32_t) (now - this->next_toggle_) < 0) - return; - this->led_on_ = !this->led_on_; - uint32_t delay; - if (error) { - delay = this->led_on_ ? ERROR_ON_MS : ERROR_OFF_MS; + if ((app_state & STATUS_LED_ERROR) != 0u) { + this->pin_->digital_write(App.get_loop_component_start_time() % ERROR_PERIOD_MS < ERROR_ON_MS); + } else if ((app_state & STATUS_LED_WARNING) != 0u) { + this->pin_->digital_write(App.get_loop_component_start_time() % WARNING_PERIOD_MS < WARNING_ON_MS); } else { - delay = this->led_on_ ? WARNING_ON_MS : WARNING_OFF_MS; + this->pin_->digital_write(false); + this->disable_loop(); } - this->next_toggle_ = now + delay; - this->pin_->digital_write(this->led_on_); } float StatusLED::get_setup_priority() const { return setup_priority::HARDWARE; } diff --git a/esphome/components/status_led/status_led.h b/esphome/components/status_led/status_led.h index 16b6dcf7368..a4b5db93d7e 100644 --- a/esphome/components/status_led/status_led.h +++ b/esphome/components/status_led/status_led.h @@ -17,8 +17,6 @@ class StatusLED : public Component { protected: GPIOPin *pin_; - uint32_t next_toggle_{0}; - bool led_on_{false}; }; extern StatusLED *global_status_led; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)