From a9d76de4e474649ff5a62659864302d565d1130c Mon Sep 17 00:00:00 2001 From: Dave Williams | DitroniX | G8PUO Date: Sat, 13 Jun 2026 09:23:50 +0100 Subject: [PATCH] Update tca6408.h --- components/TCA6408/tca6408.h | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/components/TCA6408/tca6408.h b/components/TCA6408/tca6408.h index aad0014..eae3cfd 100644 --- a/components/TCA6408/tca6408.h +++ b/components/TCA6408/tca6408.h @@ -9,14 +9,13 @@ namespace esphome { namespace tca6408 { /** - * TCA6408 8-bit I²C I/O Expander Component + * TCA6408 8-bit I²C I/O Expander * - * Features: - * - 8 bidirectional GPIO pins (0-7) - * - Hardware polarity inversion (for inputs) - * - Interrupt support (active-low open-drain INT pin) - * - Cached GPIO access for efficiency - * - Works with ESP32 (including C5), ESP8266, etc. + * Supports: + * - 8 bidirectional pins + * - Hardware polarity inversion for inputs + * - Interrupt-driven inputs (active-low open-drain INT) + * - Efficient cached access */ class TCA6408Component : public Component, public i2c::I2CDevice, @@ -27,32 +26,26 @@ class TCA6408Component : public Component, void dump_config() override; float get_setup_priority() const override { return setup_priority::IO; } - /** Set I²C address (default 0x20) */ void set_address(uint8_t address) { this->address_ = address; } - - /** Set ESP GPIO connected to TCA6408 INT pin (recommended) */ void set_interrupt_pin(InternalGPIOPin *pin) { this->interrupt_pin_ = pin; } - /** Set hardware polarity inversion for a specific pin (used internally) */ void set_polarity_inversion(uint8_t pin, bool inverted); protected: - /** Interrupt Service Routine - lightweight, runs in ISR context */ static void IRAM_ATTR gpio_intr(TCA6408Component *arg); - // GPIO Expander overrides 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; void pin_mode(uint8_t pin, gpio::Flags flags) override; - uint8_t mode_mask_{0xFF}; // 1 = input, 0 = output (Config Register 0x03) - uint8_t output_mask_{0x00}; // Output Port Register 0x01 - uint8_t input_mask_{0x00}; // Input Port Register 0x00 - uint8_t polarity_mask_{0x00}; // Polarity Inversion Register 0x02 (1 = inverted) + uint8_t mode_mask_{0xFF}; // 1 = input, 0 = output + uint8_t output_mask_{0x00}; + uint8_t input_mask_{0x00}; + uint8_t polarity_mask_{0x00}; // Hardware polarity inversion - InternalGPIOPin *interrupt_pin_{nullptr}; // ESP pin connected to TCA6408 INT - bool interrupt_triggered_{false}; // Flag set by ISR + InternalGPIOPin *interrupt_pin_{nullptr}; + bool interrupt_triggered_{false}; private: bool read_gpio_outputs_();