1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-14 17:22:20 +01:00
This commit is contained in:
J. Nick Koston
2025-06-17 15:55:10 +02:00
parent 685ed87581
commit 798ff32c40
2 changed files with 13 additions and 15 deletions

View File

@@ -70,7 +70,12 @@ void GPIOBinarySensor::dump_config() {
void GPIOBinarySensor::loop() { void GPIOBinarySensor::loop() {
if (this->use_interrupt_) { if (this->use_interrupt_) {
if (this->store_.has_changed()) { if (this->store_.is_changed()) {
// Clear the flag immediately to minimize the window where we might miss changes
this->store_.clear_changed();
// Read the state and publish it
// Note: If the ISR fires between clear_changed() and get_state(), that's fine -
// we'll process the new change on the next loop iteration
bool state = this->store_.get_state(); bool state = this->store_.get_state();
this->publish_state(state); this->publish_state(state);
} }

View File

@@ -21,21 +21,14 @@ class GPIOBinarySensorStore {
return this->state_; return this->state_;
} }
bool has_changed() { bool is_changed() const {
// No lock needed: single writer (ISR) / single reader (main loop) pattern // Simple read of volatile bool - no clearing here
// Volatile bool operations are atomic on all ESPHome-supported platforms return this->changed_;
//
// Note: There's a benign race where ISR could set changed_ = true between
// our read and clear. This is intentional and causes no issues because:
// 1. We'll process the state change on the next loop iteration
// 2. Multiple rapid changes between loop iterations would only result in
// one update anyway (we only care about the final state)
// 3. This avoids the overhead of atomic operations in the ISR
if (!this->changed_) {
return false;
} }
void clear_changed() {
// Separate method to clear the flag
this->changed_ = false; this->changed_ = false;
return true;
} }
protected: protected: