diff --git a/esphome/components/dynamic_lamp/dynamic_lamp.cpp b/esphome/components/dynamic_lamp/dynamic_lamp.cpp index fc0d1b200a..8067993951 100644 --- a/esphome/components/dynamic_lamp/dynamic_lamp.cpp +++ b/esphome/components/dynamic_lamp/dynamic_lamp.cpp @@ -23,6 +23,11 @@ void DynamicLamp::setup() { this->restore_lamp_values_(i); } } + // for testing only + this->add_lamp_output_(0, this->available_outputs_[0]); + this->add_lamp_output_(0, this->available_outputs_[1]); + this->add_lamp_output_(0, this->available_outputs_[2]); + this->add_lamp_output_(0, this->available_outputs_[3]); } void DynamicLamp::loop() { @@ -100,6 +105,12 @@ void DynamicLamp::set_available_outputs(std::string output_list) { } } +void add_lamp_output_(uint8_t lamp_number, LinkedOutput output) { + uint8_t output_index; + output_index = this->index_of_(this->available_outputs_, this->available_outputs_ + 16, output); + this->active_lamps_[lamp_number].used_outputs[output_index] = true; +} + void DynamicLamp::set_lamp_values_(uint8_t lamp_number, bool active, uint16_t selected_outputs, uint8_t mode, uint8_t mode_value) { } @@ -108,6 +119,15 @@ void DynamicLamp::restore_lamp_values_(uint8_t lamp_number) { this->active_lamps_[lamp_number].active = false; } +template +size_t DynamicLamp::index_of_(Iter first, Iter last, typename const std::iterator_traits::value_type& x) +{ + size_t i = 0; + while (first != last && *first != x) + ++first, ++i; + return i; +} + std::string_view DynamicLamp::ltrim_(std::string_view str) { const auto pos(str.find_first_not_of(" \t\n\r\f\v")); diff --git a/esphome/components/dynamic_lamp/dynamic_lamp.h b/esphome/components/dynamic_lamp/dynamic_lamp.h index b37b1c83af..6f036107f1 100644 --- a/esphome/components/dynamic_lamp/dynamic_lamp.h +++ b/esphome/components/dynamic_lamp/dynamic_lamp.h @@ -28,6 +28,7 @@ struct LinkedOutput { struct CombinedLamp { bool active = false; + bool[16] used_outputs; }; class DynamicLamp : public Component { @@ -39,8 +40,11 @@ class DynamicLamp : public Component { void set_save_mode(uint8_t save_mode); protected: + int[16] get_lamp_outputs_(uint8_t lamp_number); + void add_lamp_output_(uint8_t lamp_number, 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); + size_t index_of_(Iter first, Iter last, typename const std::iterator_traits::value_type& x) std::string_view ltrim_(std::string_view str); std::string_view rtrim_(std::string_view str); std::string_view trim_(std::string_view str);