mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	cleanup
This commit is contained in:
		| @@ -70,7 +70,12 @@ void GPIOBinarySensor::dump_config() { | ||||
|  | ||||
| void GPIOBinarySensor::loop() { | ||||
|   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(); | ||||
|       this->publish_state(state); | ||||
|     } | ||||
|   | ||||
| @@ -21,21 +21,14 @@ class GPIOBinarySensorStore { | ||||
|     return this->state_; | ||||
|   } | ||||
|  | ||||
|   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; | ||||
|     } | ||||
|   bool is_changed() const { | ||||
|     // Simple read of volatile bool - no clearing here | ||||
|     return this->changed_; | ||||
|   } | ||||
|  | ||||
|   void clear_changed() { | ||||
|     // Separate method to clear the flag | ||||
|     this->changed_ = false; | ||||
|     return true; | ||||
|   } | ||||
|  | ||||
|  protected: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user