feat: add rainbow effect for segments

This commit is contained in:
Philip Stark 2023-05-12 17:16:24 +02:00
parent dd1408c5cb
commit b712b90be1
3 changed files with 93 additions and 25 deletions

View file

@ -80,23 +80,31 @@ void Wordclock::update() {
// Color on = this->on_color * this->on_transformer->apply().value_or(255);
// Color off = this->off_color * this->off_transformer->apply().value_or(255);
this->current_position = 0;
uint8_t transition_progress = this->on_transformer->apply().value_or(255);
// uint8_t on_progress = this->on_transformer->apply().value_or(255);
// uint8_t off_progress = this->off_transformer->apply().value_or(255);
// ESP_LOGD("wordclock.cpp", "off progress [%d]", off_progress);
Color added_color = this->off_color.gradient(this->on_color, transition_progress);
// Color added_color = this->off_color.gradient(this->on_color, transition_progress);
Color removed_color = this->on_color.gradient(this->off_color, transition_progress);
// ESP_LOGD("wordclock.cpp", "transition progress [%d], added [0x%06x], removed [0x%06x]", transition_progress, added_color.raw_32, removed_color.raw_32);
for (uint16_t segment_idx : *this->added_segments) {
// ESP_LOGD("wordclock.cpp", "on [%d]", segment_idx);
this->draw_segment(segment_idx, added_color);
// this->draw_segment(segment_idx, on_progress);
}
for (uint16_t segment_idx : *this->removed_segments) {
// ESP_LOGD("wordclock.cpp", "off [%d]", segment_idx);
this->draw_segment(segment_idx, removed_color);
// this->disable_segment(segment_idx, this->off_color, transition_progress);
this->disable_segment_effect(segment_idx, this->off_color, transition_progress);
// this->disable_segment(segment_idx, removed_color);
// this->draw_segment(segment_idx, off_progress);
}
for (uint16_t segment_idx : *this->added_segments) {
// ESP_LOGD("wordclock.cpp", "on [%d]", segment_idx);
// this->segment_effect_base(segment_idx, this->off_color, transition_progress);
this->enable_segment_effect(segment_idx, this->off_color, transition_progress);
// this->draw_segment(segment_idx, on_progress);
}
for (uint16_t segment_idx : *this->staying_segments) {
this->apply_segment_effect(segment_idx);
}
}
}
@ -106,6 +114,8 @@ void Wordclock::find_difference(std::vector<uint16_t> *a_vec, std::vector<uint16
// }
this->added_segments->clear();
this->removed_segments->clear();
this->staying_segments->clear();
auto a = a_vec->begin();
auto b = b_vec->begin();
@ -115,10 +125,22 @@ void Wordclock::find_difference(std::vector<uint16_t> *a_vec, std::vector<uint16
else if (b == b_vec->end()) { this->removed_segments->push_back(*a); a++; }
else if (*a > *b) { this->added_segments-> push_back(*b); b++; }
else if (*a < *b) { this->removed_segments->push_back(*a); a++; }
else if (*a == *b) { a++; b++; }
else if (*a == *b) { this->staying_segments->push_back(*a); a++; b++; }
}
}
Color Wordclock::get_next_color(uint32_t position, const Color &current_color) {
uint32_t speed_ = 3;
uint16_t width_ = 100;
// uint16_t width_ = 50;
esphome::light::ESPHSVColor hsv;
hsv.value = 255;
hsv.saturation = 240;
hsv.hue = ((millis() * speed_ + (position * (0xFFFF / width_))) % 0xFFFF) >> 8;
// hsv.hue = hue >> 8;
return hsv.to_rgb();
}
int8_t Wordclock::find_hour(uint8_t target_value) {
std::vector<Hour> *elements = this->hours;
for (int i = 0; i < elements->size(); i++) {
@ -184,6 +206,7 @@ Wordclock::Wordclock(
this->added_segments = new std::vector<uint16_t>();
this->removed_segments = new std::vector<uint16_t>();
this->staying_segments = new std::vector<uint16_t>();
this->on_transformer = new BrightnessTransitionTransformer();
// this->on_transformer->setup(0, this->brightness, 700);