From 2d21f49fad04ddc1671e385397a73ae10a2290c1 Mon Sep 17 00:00:00 2001 From: Oliver Kleinecke Date: Wed, 19 Feb 2025 22:18:14 +0100 Subject: [PATCH] fix: initialize available outputs in DynamicLampComponent and enhance restore_lamp_settings_ logic --- .../components/dynamic_lamp/dynamic_lamp.cpp | 43 ++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/esphome/components/dynamic_lamp/dynamic_lamp.cpp b/esphome/components/dynamic_lamp/dynamic_lamp.cpp index 4211f67809..2c79b5a9e2 100644 --- a/esphome/components/dynamic_lamp/dynamic_lamp.cpp +++ b/esphome/components/dynamic_lamp/dynamic_lamp.cpp @@ -26,6 +26,7 @@ void DynamicLampComponent::begin() { for (uint8_t i=0; i < 16; i++) { this->active_lamps_[i] = CombinedLamp(); this->active_lamps_[i].active = false; + this->available_outputs_[i] = LinkedOutput{ false, false, "", 0, nullptr, 0, 0, 0, std::nullopt, std::nullopt, false }; } this->restore_lamp_settings_(); this->restore_timers_(); @@ -111,17 +112,19 @@ void DynamicLampComponent::set_save_mode(uint8_t save_mode) { void DynamicLampComponent::add_available_output(output::FloatOutput * output, std::string output_id) { uint8_t counter = 0; - while (this->available_outputs_[counter].available) { + while (this->available_outputs_[counter].available == true) { counter++; } - this->available_outputs_[counter] = LinkedOutput{ - true, - false, - output_id, - counter, - output, - 0, 0, 1.0, false - }; + if (counter > 15) { + ESP_LOGW(TAG, "No more outputs available, max 16 outputs supported!"); + this->status_set_warning(); + return; + } + this->available_outputs_[counter].available = true; + this->available_outputs_[counter].output_id = output_id; + this->available_outputs_[counter].output = output; + this->available_outputs_[counter].output_index = counter; + this->available_outputs_[counter].state = output->state; counter++; } @@ -427,8 +430,28 @@ void DynamicLampComponent::restore_lamp_settings_() { this->status_set_warning(); break; case SAVE_MODE_FRAM: + CombinedLamp lamp; for (uint8_t i=0; i < 16; i++) { - this->active_lamps_[i].active = false; + lamp = this->fram_->read((0x0000 + (i * 24)), reinterpret_cast(&lamp), 24); + if (lamp.validation_byte == 'L' && lamp.active == true) { + this->active_lamps_[i] = lamp; + for (uint8_t j = 0; j < 16; j++) { + uint8_t k = 0; + uint8_t l = j; + if (j > 7) { + k = 1; + l = j - 8; + } + bool output_in_use = static_cast(lamp.used_outputs[k] & (1 << l)); + if (output_in_use == true) { + this->available_outputs_[j].in_use = true; + } + } + } else { + lamp = CombinedLamp(); + this->active_lamps_[i] = lamp; + this->active_lamps_[i].active = false; + } } break; }