mirror of
https://github.com/esphome/esphome.git
synced 2024-12-02 03:34:18 +01:00
96 lines
2.3 KiB
C++
96 lines
2.3 KiB
C++
#include "esp_range_view.h"
|
|
#include "addressable_light.h"
|
|
|
|
namespace esphome {
|
|
namespace light {
|
|
|
|
int32_t HOT interpret_index(int32_t index, int32_t size) {
|
|
if (index < 0)
|
|
return size + index;
|
|
return index;
|
|
}
|
|
|
|
ESPColorView ESPRangeView::operator[](int32_t index) const {
|
|
index = interpret_index(index, this->size()) + this->begin_;
|
|
return (*this->parent_)[index];
|
|
}
|
|
ESPRangeIterator ESPRangeView::begin() { return {*this, this->begin_}; }
|
|
ESPRangeIterator ESPRangeView::end() { return {*this, this->end_}; }
|
|
|
|
void ESPRangeView::set(const Color &color) {
|
|
for (int32_t i = this->begin_; i < this->end_; i++) {
|
|
(*this->parent_)[i] = color;
|
|
}
|
|
}
|
|
|
|
void ESPRangeView::set_red(uint8_t red) {
|
|
for (auto c : *this)
|
|
c.set_red(red);
|
|
}
|
|
void ESPRangeView::set_green(uint8_t green) {
|
|
for (auto c : *this)
|
|
c.set_green(green);
|
|
}
|
|
void ESPRangeView::set_blue(uint8_t blue) {
|
|
for (auto c : *this)
|
|
c.set_blue(blue);
|
|
}
|
|
void ESPRangeView::set_white(uint8_t white) {
|
|
for (auto c : *this)
|
|
c.set_white(white);
|
|
}
|
|
void ESPRangeView::set_effect_data(uint8_t effect_data) {
|
|
for (auto c : *this)
|
|
c.set_effect_data(effect_data);
|
|
}
|
|
|
|
void ESPRangeView::fade_to_white(uint8_t amnt) {
|
|
for (auto c : *this)
|
|
c.fade_to_white(amnt);
|
|
}
|
|
void ESPRangeView::fade_to_black(uint8_t amnt) {
|
|
for (auto c : *this)
|
|
c.fade_to_black(amnt);
|
|
}
|
|
void ESPRangeView::lighten(uint8_t delta) {
|
|
for (auto c : *this)
|
|
c.lighten(delta);
|
|
}
|
|
void ESPRangeView::darken(uint8_t delta) {
|
|
for (auto c : *this)
|
|
c.darken(delta);
|
|
}
|
|
ESPRangeView &ESPRangeView::operator=(const ESPRangeView &rhs) { // NOLINT
|
|
// If size doesn't match, error (todo warning)
|
|
if (rhs.size() != this->size())
|
|
return *this;
|
|
|
|
if (this->parent_ != rhs.parent_) {
|
|
for (int32_t i = 0; i < this->size(); i++)
|
|
(*this)[i].set(rhs[i].get());
|
|
return *this;
|
|
}
|
|
|
|
// If both equal, already done
|
|
if (rhs.begin_ == this->begin_)
|
|
return *this;
|
|
|
|
if (rhs.begin_ > this->begin_) {
|
|
// Copy from left
|
|
for (int32_t i = 0; i < this->size(); i++) {
|
|
(*this)[i].set(rhs[i].get());
|
|
}
|
|
} else {
|
|
// Copy from right
|
|
for (int32_t i = this->size() - 1; i >= 0; i--) {
|
|
(*this)[i].set(rhs[i].get());
|
|
}
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
ESPColorView ESPRangeIterator::operator*() const { return this->range_.parent_->get(this->i_); }
|
|
|
|
} // namespace light
|
|
} // namespace esphome
|