mirror of
https://github.com/esphome/esphome.git
synced 2025-09-14 17:22:20 +01:00
mark_loop_done
This commit is contained in:
@@ -17,7 +17,11 @@ void Anova::setup() {
|
|||||||
this->current_request_ = 0;
|
this->current_request_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Anova::loop() {}
|
void Anova::loop() {
|
||||||
|
// This component uses polling via update() and BLE callbacks
|
||||||
|
// Empty loop not needed, mark as done to save CPU cycles
|
||||||
|
this->mark_loop_done();
|
||||||
|
}
|
||||||
|
|
||||||
void Anova::control(const ClimateCall &call) {
|
void Anova::control(const ClimateCall &call) {
|
||||||
if (call.get_mode().has_value()) {
|
if (call.get_mode().has_value()) {
|
||||||
|
@@ -480,7 +480,11 @@ void BedJetHub::set_clock(uint8_t hour, uint8_t minute) {
|
|||||||
|
|
||||||
/* Internal */
|
/* Internal */
|
||||||
|
|
||||||
void BedJetHub::loop() {}
|
void BedJetHub::loop() {
|
||||||
|
// This component uses polling via update() and BLE callbacks
|
||||||
|
// Empty loop not needed, mark as done to save CPU cycles
|
||||||
|
this->mark_loop_done();
|
||||||
|
}
|
||||||
void BedJetHub::update() { this->dispatch_status_(); }
|
void BedJetHub::update() { this->dispatch_status_(); }
|
||||||
|
|
||||||
void BedJetHub::dump_config() {
|
void BedJetHub::dump_config() {
|
||||||
|
@@ -83,7 +83,11 @@ void BedJetClimate::reset_state_() {
|
|||||||
this->publish_state();
|
this->publish_state();
|
||||||
}
|
}
|
||||||
|
|
||||||
void BedJetClimate::loop() {}
|
void BedJetClimate::loop() {
|
||||||
|
// This component is controlled via the parent BedJetHub
|
||||||
|
// Empty loop not needed, mark as done to save CPU cycles
|
||||||
|
this->mark_loop_done();
|
||||||
|
}
|
||||||
|
|
||||||
void BedJetClimate::control(const ClimateCall &call) {
|
void BedJetClimate::control(const ClimateCall &call) {
|
||||||
ESP_LOGD(TAG, "Received BedJetClimate::control");
|
ESP_LOGD(TAG, "Received BedJetClimate::control");
|
||||||
|
@@ -11,7 +11,11 @@ namespace ble_client {
|
|||||||
|
|
||||||
static const char *const TAG = "ble_rssi_sensor";
|
static const char *const TAG = "ble_rssi_sensor";
|
||||||
|
|
||||||
void BLEClientRSSISensor::loop() {}
|
void BLEClientRSSISensor::loop() {
|
||||||
|
// This component uses polling via update() and BLE GAP callbacks
|
||||||
|
// Empty loop not needed, mark as done to save CPU cycles
|
||||||
|
this->mark_loop_done();
|
||||||
|
}
|
||||||
|
|
||||||
void BLEClientRSSISensor::dump_config() {
|
void BLEClientRSSISensor::dump_config() {
|
||||||
LOG_SENSOR("", "BLE Client RSSI Sensor", this);
|
LOG_SENSOR("", "BLE Client RSSI Sensor", this);
|
||||||
|
@@ -11,7 +11,11 @@ namespace ble_client {
|
|||||||
|
|
||||||
static const char *const TAG = "ble_sensor";
|
static const char *const TAG = "ble_sensor";
|
||||||
|
|
||||||
void BLESensor::loop() {}
|
void BLESensor::loop() {
|
||||||
|
// This component uses polling via update() and BLE callbacks
|
||||||
|
// Empty loop not needed, mark as done to save CPU cycles
|
||||||
|
this->mark_loop_done();
|
||||||
|
}
|
||||||
|
|
||||||
void BLESensor::dump_config() {
|
void BLESensor::dump_config() {
|
||||||
LOG_SENSOR("", "BLE Sensor", this);
|
LOG_SENSOR("", "BLE Sensor", this);
|
||||||
|
@@ -14,7 +14,11 @@ static const char *const TAG = "ble_text_sensor";
|
|||||||
|
|
||||||
static const std::string EMPTY = "";
|
static const std::string EMPTY = "";
|
||||||
|
|
||||||
void BLETextSensor::loop() {}
|
void BLETextSensor::loop() {
|
||||||
|
// This component uses polling via update() and BLE callbacks
|
||||||
|
// Empty loop not needed, mark as done to save CPU cycles
|
||||||
|
this->mark_loop_done();
|
||||||
|
}
|
||||||
|
|
||||||
void BLETextSensor::dump_config() {
|
void BLETextSensor::dump_config() {
|
||||||
LOG_TEXT_SENSOR("", "BLE Text Sensor", this);
|
LOG_TEXT_SENSOR("", "BLE Text Sensor", this);
|
||||||
|
@@ -168,6 +168,8 @@ void ESP32ImprovComponent::loop() {
|
|||||||
case improv::STATE_PROVISIONED: {
|
case improv::STATE_PROVISIONED: {
|
||||||
this->incoming_data_.clear();
|
this->incoming_data_.clear();
|
||||||
this->set_status_indicator_state_(false);
|
this->set_status_indicator_state_(false);
|
||||||
|
// Provisioning complete, no further loop execution needed
|
||||||
|
this->mark_loop_done();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -42,6 +42,8 @@ void SafeModeComponent::loop() {
|
|||||||
ESP_LOGI(TAG, "Boot seems successful; resetting boot loop counter");
|
ESP_LOGI(TAG, "Boot seems successful; resetting boot loop counter");
|
||||||
this->clean_rtc();
|
this->clean_rtc();
|
||||||
this->boot_successful_ = true;
|
this->boot_successful_ = true;
|
||||||
|
// Mark loop as done since we no longer need to check
|
||||||
|
this->mark_loop_done();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -67,6 +67,9 @@ void SNTPComponent::loop() {
|
|||||||
time.minute, time.second);
|
time.minute, time.second);
|
||||||
this->time_sync_callback_.call();
|
this->time_sync_callback_.call();
|
||||||
this->has_time_ = true;
|
this->has_time_ = true;
|
||||||
|
|
||||||
|
// Time is now synchronized, no need to check anymore
|
||||||
|
this->mark_loop_done();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace sntp
|
} // namespace sntp
|
||||||
|
@@ -29,17 +29,18 @@ const float LATE = -100.0f;
|
|||||||
|
|
||||||
} // namespace setup_priority
|
} // namespace setup_priority
|
||||||
|
|
||||||
// Component state uses bits 0-1 (4 states)
|
// Component state uses bits 0-2 (8 states, 5 used)
|
||||||
const uint8_t COMPONENT_STATE_MASK = 0x03;
|
const uint8_t COMPONENT_STATE_MASK = 0x07;
|
||||||
const uint8_t COMPONENT_STATE_CONSTRUCTION = 0x00;
|
const uint8_t COMPONENT_STATE_CONSTRUCTION = 0x00;
|
||||||
const uint8_t COMPONENT_STATE_SETUP = 0x01;
|
const uint8_t COMPONENT_STATE_SETUP = 0x01;
|
||||||
const uint8_t COMPONENT_STATE_LOOP = 0x02;
|
const uint8_t COMPONENT_STATE_LOOP = 0x02;
|
||||||
const uint8_t COMPONENT_STATE_FAILED = 0x03;
|
const uint8_t COMPONENT_STATE_FAILED = 0x03;
|
||||||
// Status LED uses bits 2-3
|
const uint8_t COMPONENT_STATE_LOOP_DONE = 0x04;
|
||||||
const uint8_t STATUS_LED_MASK = 0x0C;
|
// Status LED uses bits 3-4
|
||||||
|
const uint8_t STATUS_LED_MASK = 0x18;
|
||||||
const uint8_t STATUS_LED_OK = 0x00;
|
const uint8_t STATUS_LED_OK = 0x00;
|
||||||
const uint8_t STATUS_LED_WARNING = 0x04; // Bit 2
|
const uint8_t STATUS_LED_WARNING = 0x08; // Bit 3
|
||||||
const uint8_t STATUS_LED_ERROR = 0x08; // Bit 3
|
const uint8_t STATUS_LED_ERROR = 0x10; // Bit 4
|
||||||
|
|
||||||
const uint32_t WARN_IF_BLOCKING_OVER_MS = 50U; ///< Initial blocking time allowed without warning
|
const uint32_t WARN_IF_BLOCKING_OVER_MS = 50U; ///< Initial blocking time allowed without warning
|
||||||
const uint32_t WARN_IF_BLOCKING_INCREMENT_MS = 10U; ///< How long the blocking time must be larger to warn again
|
const uint32_t WARN_IF_BLOCKING_INCREMENT_MS = 10U; ///< How long the blocking time must be larger to warn again
|
||||||
@@ -111,6 +112,9 @@ void Component::call() {
|
|||||||
case COMPONENT_STATE_FAILED: // NOLINT(bugprone-branch-clone)
|
case COMPONENT_STATE_FAILED: // NOLINT(bugprone-branch-clone)
|
||||||
// State failed: Do nothing
|
// State failed: Do nothing
|
||||||
break;
|
break;
|
||||||
|
case COMPONENT_STATE_LOOP_DONE: // NOLINT(bugprone-branch-clone)
|
||||||
|
// State loop done: Do nothing, component has finished its work
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -133,6 +137,11 @@ void Component::mark_failed() {
|
|||||||
this->component_state_ |= COMPONENT_STATE_FAILED;
|
this->component_state_ |= COMPONENT_STATE_FAILED;
|
||||||
this->status_set_error();
|
this->status_set_error();
|
||||||
}
|
}
|
||||||
|
void Component::mark_loop_done() {
|
||||||
|
ESP_LOGD(TAG, "Component %s loop marked as done.", this->get_component_source());
|
||||||
|
this->component_state_ &= ~COMPONENT_STATE_MASK;
|
||||||
|
this->component_state_ |= COMPONENT_STATE_LOOP_DONE;
|
||||||
|
}
|
||||||
void Component::reset_to_construction_state() {
|
void Component::reset_to_construction_state() {
|
||||||
if ((this->component_state_ & COMPONENT_STATE_MASK) == COMPONENT_STATE_FAILED) {
|
if ((this->component_state_ & COMPONENT_STATE_MASK) == COMPONENT_STATE_FAILED) {
|
||||||
ESP_LOGI(TAG, "Component %s is being reset to construction state.", this->get_component_source());
|
ESP_LOGI(TAG, "Component %s is being reset to construction state.", this->get_component_source());
|
||||||
@@ -169,6 +178,10 @@ bool Component::is_ready() const {
|
|||||||
return (this->component_state_ & COMPONENT_STATE_MASK) == COMPONENT_STATE_LOOP ||
|
return (this->component_state_ & COMPONENT_STATE_MASK) == COMPONENT_STATE_LOOP ||
|
||||||
(this->component_state_ & COMPONENT_STATE_MASK) == COMPONENT_STATE_SETUP;
|
(this->component_state_ & COMPONENT_STATE_MASK) == COMPONENT_STATE_SETUP;
|
||||||
}
|
}
|
||||||
|
bool Component::should_skip_loop() const {
|
||||||
|
uint8_t state = this->component_state_ & COMPONENT_STATE_MASK;
|
||||||
|
return state == COMPONENT_STATE_FAILED || state == COMPONENT_STATE_LOOP_DONE;
|
||||||
|
}
|
||||||
bool Component::can_proceed() { return true; }
|
bool Component::can_proceed() { return true; }
|
||||||
bool Component::status_has_warning() const { return this->component_state_ & STATUS_LED_WARNING; }
|
bool Component::status_has_warning() const { return this->component_state_ & STATUS_LED_WARNING; }
|
||||||
bool Component::status_has_error() const { return this->component_state_ & STATUS_LED_ERROR; }
|
bool Component::status_has_error() const { return this->component_state_ & STATUS_LED_ERROR; }
|
||||||
|
@@ -58,6 +58,7 @@ extern const uint8_t COMPONENT_STATE_CONSTRUCTION;
|
|||||||
extern const uint8_t COMPONENT_STATE_SETUP;
|
extern const uint8_t COMPONENT_STATE_SETUP;
|
||||||
extern const uint8_t COMPONENT_STATE_LOOP;
|
extern const uint8_t COMPONENT_STATE_LOOP;
|
||||||
extern const uint8_t COMPONENT_STATE_FAILED;
|
extern const uint8_t COMPONENT_STATE_FAILED;
|
||||||
|
extern const uint8_t COMPONENT_STATE_LOOP_DONE;
|
||||||
extern const uint8_t STATUS_LED_MASK;
|
extern const uint8_t STATUS_LED_MASK;
|
||||||
extern const uint8_t STATUS_LED_OK;
|
extern const uint8_t STATUS_LED_OK;
|
||||||
extern const uint8_t STATUS_LED_WARNING;
|
extern const uint8_t STATUS_LED_WARNING;
|
||||||
@@ -150,10 +151,23 @@ class Component {
|
|||||||
this->mark_failed();
|
this->mark_failed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Mark this component's loop as done. The loop will no longer be called.
|
||||||
|
*
|
||||||
|
* This is useful for components that only need to run for a certain period of time
|
||||||
|
* and then no longer need their loop() method called, saving CPU cycles.
|
||||||
|
*/
|
||||||
|
void mark_loop_done();
|
||||||
|
|
||||||
bool is_failed() const;
|
bool is_failed() const;
|
||||||
|
|
||||||
bool is_ready() const;
|
bool is_ready() const;
|
||||||
|
|
||||||
|
/** Check if this component should skip its loop execution.
|
||||||
|
*
|
||||||
|
* @return True if the component is in FAILED or LOOP_DONE state
|
||||||
|
*/
|
||||||
|
bool should_skip_loop() const;
|
||||||
|
|
||||||
virtual bool can_proceed();
|
virtual bool can_proceed();
|
||||||
|
|
||||||
bool status_has_warning() const;
|
bool status_has_warning() const;
|
||||||
|
@@ -211,8 +211,8 @@ void HOT Scheduler::call() {
|
|||||||
// Not reached timeout yet, done for this call
|
// Not reached timeout yet, done for this call
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// Don't run on failed components
|
// Don't run on failed or loop-done components
|
||||||
if (item->component != nullptr && item->component->is_failed()) {
|
if (item->component != nullptr && item->component->should_skip_loop()) {
|
||||||
LockGuard guard{this->lock_};
|
LockGuard guard{this->lock_};
|
||||||
this->pop_raw_();
|
this->pop_raw_();
|
||||||
continue;
|
continue;
|
||||||
|
Reference in New Issue
Block a user