mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-30 22:53:59 +00:00 
			
		
		
		
	Merge branch 'optimize_pcf8574' into memory_api
This commit is contained in:
		| @@ -27,11 +27,13 @@ void GPIOExpanderTestComponent::setup() { | ||||
|  | ||||
| bool GPIOExpanderTestComponent::digital_read_hw(uint8_t pin) { | ||||
|   ESP_LOGD(TAG, "digital_read_hw pin=%d", pin); | ||||
|   // Return true to indicate successful read operation | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| bool GPIOExpanderTestComponent::digital_read_cache(uint8_t pin) { | ||||
|   ESP_LOGD(TAG, "digital_read_cache pin=%d", pin); | ||||
|   // Return the pin state (always HIGH for testing) | ||||
|   return true; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -0,0 +1,24 @@ | ||||
| import esphome.codegen as cg | ||||
| import esphome.config_validation as cv | ||||
| from esphome.const import CONF_ID | ||||
|  | ||||
| AUTO_LOAD = ["gpio_expander"] | ||||
|  | ||||
| gpio_expander_test_component_uint16_ns = cg.esphome_ns.namespace( | ||||
|     "gpio_expander_test_component_uint16" | ||||
| ) | ||||
|  | ||||
| GPIOExpanderTestUint16Component = gpio_expander_test_component_uint16_ns.class_( | ||||
|     "GPIOExpanderTestUint16Component", cg.Component | ||||
| ) | ||||
|  | ||||
| CONFIG_SCHEMA = cv.Schema( | ||||
|     { | ||||
|         cv.GenerateID(): cv.declare_id(GPIOExpanderTestUint16Component), | ||||
|     } | ||||
| ).extend(cv.COMPONENT_SCHEMA) | ||||
|  | ||||
|  | ||||
| async def to_code(config): | ||||
|     var = cg.new_Pvariable(config[CONF_ID]) | ||||
|     await cg.register_component(var, config) | ||||
| @@ -0,0 +1,43 @@ | ||||
| #include "gpio_expander_test_component_uint16.h" | ||||
| #include "esphome/core/log.h" | ||||
|  | ||||
| namespace esphome::gpio_expander_test_component_uint16 { | ||||
|  | ||||
| static const char *const TAG = "gpio_expander_test_uint16"; | ||||
|  | ||||
| void GPIOExpanderTestUint16Component::setup() { | ||||
|   ESP_LOGD(TAG, "Testing uint16_t bank (single 16-pin bank)"); | ||||
|  | ||||
|   // Test reading all 16 pins - first should trigger hw read, rest use cache | ||||
|   for (uint8_t pin = 0; pin < 16; pin++) { | ||||
|     this->digital_read(pin); | ||||
|   } | ||||
|  | ||||
|   // Reset cache and test specific reads | ||||
|   ESP_LOGD(TAG, "Resetting cache for uint16_t test"); | ||||
|   this->reset_pin_cache_(); | ||||
|  | ||||
|   // First read triggers hw for entire bank | ||||
|   this->digital_read(5); | ||||
|   // These should all use cache since they're in the same bank | ||||
|   this->digital_read(10); | ||||
|   this->digital_read(15); | ||||
|   this->digital_read(0); | ||||
|  | ||||
|   ESP_LOGD(TAG, "DONE_UINT16"); | ||||
| } | ||||
|  | ||||
| bool GPIOExpanderTestUint16Component::digital_read_hw(uint8_t pin) { | ||||
|   ESP_LOGD(TAG, "uint16_digital_read_hw pin=%d", pin); | ||||
|   // In a real component, this would read from I2C/SPI into internal state | ||||
|   // For testing, we just return true to indicate successful read | ||||
|   return true;  // Return true to indicate successful read | ||||
| } | ||||
|  | ||||
| bool GPIOExpanderTestUint16Component::digital_read_cache(uint8_t pin) { | ||||
|   ESP_LOGD(TAG, "uint16_digital_read_cache pin=%d", pin); | ||||
|   // Return the actual pin state from our test pattern | ||||
|   return (this->test_state_ >> pin) & 1; | ||||
| } | ||||
|  | ||||
| }  // namespace esphome::gpio_expander_test_component_uint16 | ||||
| @@ -0,0 +1,23 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "esphome/components/gpio_expander/cached_gpio.h" | ||||
| #include "esphome/core/component.h" | ||||
|  | ||||
| namespace esphome::gpio_expander_test_component_uint16 { | ||||
|  | ||||
| // Test component using uint16_t bank type (single 16-pin bank) | ||||
| class GPIOExpanderTestUint16Component : public Component, | ||||
|                                         public esphome::gpio_expander::CachedGpioExpander<uint16_t, 16> { | ||||
|  public: | ||||
|   void setup() override; | ||||
|  | ||||
|  protected: | ||||
|   bool digital_read_hw(uint8_t pin) override; | ||||
|   bool digital_read_cache(uint8_t pin) override; | ||||
|   void digital_write_hw(uint8_t pin, bool value) override{}; | ||||
|  | ||||
|  private: | ||||
|   uint16_t test_state_{0xAAAA};  // Test pattern: alternating bits | ||||
| }; | ||||
|  | ||||
| }  // namespace esphome::gpio_expander_test_component_uint16 | ||||
| @@ -12,6 +12,10 @@ external_components: | ||||
|   - source: | ||||
|       type: local | ||||
|       path: EXTERNAL_COMPONENT_PATH | ||||
|     components: [gpio_expander_test_component] | ||||
|     components: [gpio_expander_test_component, gpio_expander_test_component_uint16] | ||||
|  | ||||
| # Test with uint8_t (multiple banks) | ||||
| gpio_expander_test_component: | ||||
|  | ||||
| # Test with uint16_t (single bank) | ||||
| gpio_expander_test_component_uint16: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user