From 24a5e95a66d6a62d05b8fa15d9a5ce5501afb8d7 Mon Sep 17 00:00:00 2001 From: Oliver Kleinecke Date: Sat, 15 Feb 2025 13:47:39 +0100 Subject: [PATCH] fix: refactor add_lamp_output to use reference and add remove_lamp method for better lamp management --- .../components/dynamic_lamp/dynamic_lamp.cpp | 39 +++++++++++++++---- .../components/dynamic_lamp/dynamic_lamp.h | 2 +- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/esphome/components/dynamic_lamp/dynamic_lamp.cpp b/esphome/components/dynamic_lamp/dynamic_lamp.cpp index f54286bae4..e26d66a17f 100644 --- a/esphome/components/dynamic_lamp/dynamic_lamp.cpp +++ b/esphome/components/dynamic_lamp/dynamic_lamp.cpp @@ -32,6 +32,13 @@ void DynamicLamp::begin() { this->restore_lamp_values_(i); } } + /* keep example for future reference + this->add_lamp_("First Lamp"); + this->add_lamp_output_("First Lamp", this->available_outputs_[0]); + this->add_lamp_output_("First Lamp", this->available_outputs_[1]); + this->add_lamp_output_("First Lamp", this->available_outputs_[2]); + this->add_lamp_output_("First Lamp", this->available_outputs_[3]); + */ } void DynamicLamp::loop() { @@ -85,10 +92,10 @@ void DynamicLamp::dump_config() { } } this->add_lamp_("First Lamp"); - this->add_lamp_output_("First Lamp", this->available_outputs_[0]); - this->add_lamp_output_("First Lamp", this->available_outputs_[1]); - this->add_lamp_output_("First Lamp", this->available_outputs_[2]); - this->add_lamp_output_("First Lamp", this->available_outputs_[3]); + this->add_lamp_output_("First Lamp", &this->available_outputs_[0]); + this->add_lamp_output_("First Lamp", &this->available_outputs_[1]); + this->add_lamp_output_("First Lamp", &this->available_outputs_[2]); + this->add_lamp_output_("First Lamp", &this->available_outputs_[3]); } void DynamicLamp::set_save_mode(uint8_t save_mode) { @@ -117,20 +124,38 @@ void DynamicLamp::add_lamp_(std::string name) { this->active_lamps_[this->lamp_count_].active = true; this->active_lamps_[this->lamp_count_].name = name; this->active_lamps_[this->lamp_count_].lamp_index = this->lamp_count_; + for (uint8_t i = 0; i < 16; i++) { + this->active_lamps_[this->lamp_count_].used_outputs[i] = false; + } return; } ESP_LOGW(TAG, "No more lamps available, max 16 lamps supported!"); this->status_set_warning(); } -void DynamicLamp::add_lamp_output_(std::string lamp_name, LinkedOutput output) { +void DynamicLamp::remove_lamp_(std::string name) { + uint8_t i = 0; + while (i < this->lamp_count_) { + if (this->active_lamps_[i].name == name) { + for (uint8_t j = i; j < this->lamp_count_; j++) { + this->active_lamps_[i].used_outputs[j] = false; + this->available_outputs_[j].in_use = false; + } + this->active_lamps_[i].active = false; + return; + } + } + this->status_set_warning(); + ESP_LOGW(TAG, "No lamp with name %s defined !", lamp_name.c_str()); +} + +void DynamicLamp::add_lamp_output_(std::string lamp_name, LinkedOutput &output) { uint8_t i = 0; while (i < 16) { if (this->active_lamps_[i].name == lamp_name) { this->active_lamps_[i].used_outputs[output.output_index] = true; output.in_use = true; - //ESP_LOGV(TAG, "Added output %s to lamp %s", output.output_id.c_str(), lamp_name.c_str()); - ESP_LOGCONFIG(TAG, "Added output %s to lamp %s", output.output_id.c_str(), lamp_name.c_str()); + ESP_LOGV(TAG, "Added output %s to lamp %s", output.output_id.c_str(), lamp_name.c_str()); return; } i++; diff --git a/esphome/components/dynamic_lamp/dynamic_lamp.h b/esphome/components/dynamic_lamp/dynamic_lamp.h index ffc379c767..c9e94c2cbc 100644 --- a/esphome/components/dynamic_lamp/dynamic_lamp.h +++ b/esphome/components/dynamic_lamp/dynamic_lamp.h @@ -50,7 +50,7 @@ class DynamicLamp : public Component { void begin(); void add_lamp_(std::string name); std::array get_lamp_outputs_(uint8_t lamp_number); - void add_lamp_output_(std::string lamp_name, LinkedOutput output); + void add_lamp_output_(std::string lamp_name, LinkedOutput &output); void restore_lamp_values_(uint8_t lamp_number); void set_lamp_values_(uint8_t lamp_number, bool active, uint16_t selected_outputs, uint8_t mode, uint8_t mode_value); std::string_view ltrim_(std::string_view str);