mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 06:33:51 +00:00 
			
		
		
		
	Merge branch 'pca9554_loop_churn_fix' into integration
This commit is contained in:
		| @@ -37,10 +37,9 @@ void PCA9554Component::setup() { | ||||
| } | ||||
|  | ||||
| void PCA9554Component::loop() { | ||||
|   // The read_inputs_() method will cache the input values from the chip. | ||||
|   this->read_inputs_(); | ||||
|   // Clear all the previously read flags. | ||||
|   this->was_previously_read_ = 0x00; | ||||
|   // Invalidate the cache at the start of each loop. | ||||
|   // The actual read will happen on demand in digital_read() | ||||
|   this->cache_valid_ = false; | ||||
| } | ||||
|  | ||||
| void PCA9554Component::dump_config() { | ||||
| @@ -55,16 +54,10 @@ void PCA9554Component::dump_config() { | ||||
| } | ||||
|  | ||||
| bool PCA9554Component::digital_read(uint8_t pin) { | ||||
|   // Note: We want to try and avoid doing any I2C bus read transactions here | ||||
|   // to conserve I2C bus bandwidth. So what we do is check to see if we | ||||
|   // have seen a read during the time esphome is running this loop. If we have, | ||||
|   // we do an I2C bus transaction to get the latest value. If we haven't | ||||
|   // we return a cached value which was read at the time loop() was called. | ||||
|   if (this->was_previously_read_ & (1 << pin)) | ||||
|     this->read_inputs_();  // Force a read of a new value | ||||
|   // Indicate we saw a read request for this pin in case a | ||||
|   // read happens later in the same loop. | ||||
|   this->was_previously_read_ |= (1 << pin); | ||||
|   // Read the inputs once per loop on demand and cache the result | ||||
|   if (!this->cache_valid_ && this->read_inputs_()) { | ||||
|     this->cache_valid_ = true; | ||||
|   } | ||||
|   return this->input_mask_ & (1 << pin); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -45,8 +45,8 @@ class PCA9554Component : public Component, public i2c::I2CDevice { | ||||
|   uint16_t output_mask_{0x00}; | ||||
|   /// The state of the actual input pin states - 1 means HIGH, 0 means LOW | ||||
|   uint16_t input_mask_{0x00}; | ||||
|   /// Flags to check if read previously during this loop | ||||
|   uint16_t was_previously_read_ = {0x00}; | ||||
|   /// Cache validity flag - true if we've read inputs this loop cycle | ||||
|   bool cache_valid_{false}; | ||||
|   /// Storage for last I2C error seen | ||||
|   esphome::i2c::ErrorCode last_error_; | ||||
| }; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user