From 3b8b6c64293ea56dc3b11e27493c6e011b6896ea Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 20 Oct 2026 15:51:07 -1000 Subject: [PATCH] [ac_dimmer] Pack members and drop the unused zero-cross ISR pin (#21193) --- esphome/components/ac_dimmer/ac_dimmer.cpp | 28 ++++++++-------------- esphome/components/ac_dimmer/ac_dimmer.h | 21 +++++++--------- 2 files changed, 19 insertions(+), 30 deletions(-) diff --git a/esphome/components/ac_dimmer/ac_dimmer.cpp b/esphome/components/ac_dimmer/ac_dimmer.cpp index e126a3d52ab..d3eb9a89394 100644 --- a/esphome/components/ac_dimmer/ac_dimmer.cpp +++ b/esphome/components/ac_dimmer/ac_dimmer.cpp @@ -184,11 +184,9 @@ void AcDimmer::setup() { this->store_.zero_cross_pin_number = this->zero_cross_pin_->get_pin(); this->store_.min_power = static_cast(this->min_power_ * 1000); this->min_power_ = 0; - this->store_.method = this->method_; if (setup_zero_cross_pin) { this->zero_cross_pin_->setup(); - this->store_.zero_cross_pin = this->zero_cross_pin_->to_isr(); this->zero_cross_pin_->attach_interrupt(&AcDimmerDataStore::s_gpio_intr, &this->store_, this->zero_cross_interrupt_type_); } @@ -227,24 +225,18 @@ void AcDimmer::dump_config() { ESP_LOGCONFIG(TAG, "AcDimmer:\n" " Min Power: %.1f%%\n" - " Init with half cycle: %s", - this->store_.min_power / 10.0f, YESNO(this->init_with_half_cycle_)); + " Init with half cycle: %s\n" + " Interrupt Type: %s\n" + " Method: %s", + this->store_.min_power / 10.0f, YESNO(this->init_with_half_cycle_), + this->zero_cross_interrupt_type_ == gpio::INTERRUPT_RISING_EDGE ? LOG_STR_LITERAL("rising") + : this->zero_cross_interrupt_type_ == gpio::INTERRUPT_FALLING_EDGE ? LOG_STR_LITERAL("falling") + : LOG_STR_LITERAL("any"), + this->store_.method == DIM_METHOD_LEADING_PULSE ? LOG_STR_LITERAL("leading pulse") + : this->store_.method == DIM_METHOD_LEADING ? LOG_STR_LITERAL("leading") + : LOG_STR_LITERAL("trailing")); LOG_PIN(" Output Pin: ", this->gate_pin_); LOG_PIN(" Zero-Cross Pin: ", this->zero_cross_pin_); - if (this->zero_cross_interrupt_type_ == gpio::INTERRUPT_RISING_EDGE) { - ESP_LOGCONFIG(TAG, " Interrupt Type: rising"); - } else if (this->zero_cross_interrupt_type_ == gpio::INTERRUPT_FALLING_EDGE) { - ESP_LOGCONFIG(TAG, " Interrupt Type: falling"); - } else { - ESP_LOGCONFIG(TAG, " Interrupt Type: any"); - } - if (method_ == DIM_METHOD_LEADING_PULSE) { - ESP_LOGCONFIG(TAG, " Method: leading pulse"); - } else if (method_ == DIM_METHOD_LEADING) { - ESP_LOGCONFIG(TAG, " Method: leading"); - } else { - ESP_LOGCONFIG(TAG, " Method: trailing"); - } LOG_FLOAT_OUTPUT(this); ESP_LOGV(TAG, " Estimated Frequency: %.3fHz", 1e6f / this->store_.cycle_time_us / 2); } diff --git a/esphome/components/ac_dimmer/ac_dimmer.h b/esphome/components/ac_dimmer/ac_dimmer.h index 783a9d7e246..0fcac7b257e 100644 --- a/esphome/components/ac_dimmer/ac_dimmer.h +++ b/esphome/components/ac_dimmer/ac_dimmer.h @@ -6,19 +6,11 @@ namespace esphome::ac_dimmer { -enum DimMethod { DIM_METHOD_LEADING_PULSE = 0, DIM_METHOD_LEADING, DIM_METHOD_TRAILING }; +enum DimMethod : uint8_t { DIM_METHOD_LEADING_PULSE = 0, DIM_METHOD_LEADING, DIM_METHOD_TRAILING }; struct AcDimmerDataStore { - /// Zero-cross pin - ISRInternalGPIOPin zero_cross_pin; - /// Zero-cross pin number - used to share ZC pin across multiple dimmers - uint8_t zero_cross_pin_number; /// Output pin to write to ISRInternalGPIOPin gate_pin; - /// Value of the dimmer - 0 to 65535. - uint16_t value; - /// Minimum power for activation - uint16_t min_power; /// Time between the last two ZC pulses uint32_t cycle_time_us; /// Time (in micros()) of last ZC signal @@ -27,6 +19,12 @@ struct AcDimmerDataStore { uint32_t enable_time_us; /// Time since last ZC pulse to disable gate pin. 0 means no disable. uint32_t disable_time_us; + /// Value of the dimmer - 0 to 65535. + uint16_t value; + /// Minimum power for activation + uint16_t min_power; + /// Zero-cross pin number - used to share ZC pin across multiple dimmers + uint8_t zero_cross_pin_number; /// Set to send the first half ac cycle complete bool init_cycle; /// Dimmer method @@ -50,17 +48,16 @@ class AcDimmer final : public output::FloatOutput, public Component { void set_zero_cross_pin(InternalGPIOPin *zero_cross_pin) { zero_cross_pin_ = zero_cross_pin; } void set_zero_cross_interrupt_type(gpio::InterruptType type) { zero_cross_interrupt_type_ = type; } void set_init_with_half_cycle(bool init_with_half_cycle) { init_with_half_cycle_ = init_with_half_cycle; } - void set_method(DimMethod method) { method_ = method; } + void set_method(DimMethod method) { this->store_.method = method; } protected: void write_state(float state) override; InternalGPIOPin *gate_pin_; InternalGPIOPin *zero_cross_pin_; - gpio::InterruptType zero_cross_interrupt_type_; AcDimmerDataStore store_; + gpio::InterruptType zero_cross_interrupt_type_; bool init_with_half_cycle_; - DimMethod method_; }; } // namespace esphome::ac_dimmer