mirror of
https://github.com/esphome/esphome.git
synced 2025-09-14 09:12:19 +01:00
Merge branch 'integration' of https://github.com/esphome/esphome into integration
This commit is contained in:
@@ -29,7 +29,7 @@ void GPIOBinarySensorStore::setup(InternalGPIOPin *pin, gpio::InterruptType type
|
||||
|
||||
void GPIOBinarySensor::setup() {
|
||||
if (this->use_interrupt_ && !this->pin_->is_internal()) {
|
||||
ESP_LOGW(TAG, "Interrupts not supported for this pin type, falling back to polling");
|
||||
ESP_LOGD(TAG, "GPIO is not internal, falling back to polling mode");
|
||||
this->use_interrupt_ = false;
|
||||
}
|
||||
|
||||
|
@@ -24,6 +24,13 @@ class GPIOBinarySensorStore {
|
||||
bool has_changed() {
|
||||
// No lock needed: single writer (ISR) / single reader (main loop) pattern
|
||||
// Volatile bool operations are atomic on all ESPHome-supported platforms
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user