mirror of
https://github.com/esphome/esphome.git
synced 2025-03-15 15:18:16 +00:00
fix: initialize available outputs in DynamicLampComponent and enhance restore_lamp_settings_ logic
This commit is contained in:
parent
f12f551fae
commit
2d21f49fad
@ -26,6 +26,7 @@ void DynamicLampComponent::begin() {
|
|||||||
for (uint8_t i=0; i < 16; i++) {
|
for (uint8_t i=0; i < 16; i++) {
|
||||||
this->active_lamps_[i] = CombinedLamp();
|
this->active_lamps_[i] = CombinedLamp();
|
||||||
this->active_lamps_[i].active = false;
|
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_lamp_settings_();
|
||||||
this->restore_timers_();
|
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) {
|
void DynamicLampComponent::add_available_output(output::FloatOutput * output, std::string output_id) {
|
||||||
uint8_t counter = 0;
|
uint8_t counter = 0;
|
||||||
while (this->available_outputs_[counter].available) {
|
while (this->available_outputs_[counter].available == true) {
|
||||||
counter++;
|
counter++;
|
||||||
}
|
}
|
||||||
this->available_outputs_[counter] = LinkedOutput{
|
if (counter > 15) {
|
||||||
true,
|
ESP_LOGW(TAG, "No more outputs available, max 16 outputs supported!");
|
||||||
false,
|
this->status_set_warning();
|
||||||
output_id,
|
return;
|
||||||
counter,
|
}
|
||||||
output,
|
this->available_outputs_[counter].available = true;
|
||||||
0, 0, 1.0, false
|
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++;
|
counter++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -427,9 +430,29 @@ void DynamicLampComponent::restore_lamp_settings_() {
|
|||||||
this->status_set_warning();
|
this->status_set_warning();
|
||||||
break;
|
break;
|
||||||
case SAVE_MODE_FRAM:
|
case SAVE_MODE_FRAM:
|
||||||
|
CombinedLamp lamp;
|
||||||
for (uint8_t i=0; i < 16; i++) {
|
for (uint8_t i=0; i < 16; i++) {
|
||||||
|
lamp = this->fram_->read((0x0000 + (i * 24)), reinterpret_cast<unsigned char *>(&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<bool>(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;
|
this->active_lamps_[i].active = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user