8static const uint32_t ADALIGHT_ACK_INTERVAL = 1000;
9static const uint32_t ADALIGHT_RECEIVE_TIMEOUT = 1000;
14 AddressableLightEffect::start();
24 AddressableLightEffect::stop();
32 return 3 + 2 + 1 + led_count * 3;
39 frame_.reserve(buffer_capacity);
43 for (
int led = it.
size(); led-- > 0;) {
52 if (now - this->
last_ack_ >= ADALIGHT_ACK_INTERVAL) {
53 ESP_LOGV(TAG,
"Sending ACK");
59 ESP_LOGW(TAG,
"Frame: Reset.");
65 if (!this->
frame_.empty() && now - this->last_byte_ >= ADALIGHT_RECEIVE_TIMEOUT) {
66 ESP_LOGW(TAG,
"Frame: Receive timeout (size=%zu).", this->
frame_.size());
73 ESP_LOGV(TAG,
"Frame: Available (size=%zu).", avail);
77 [
this, &it, now](uint8_t data) {
78 this->
frame_.push_back(data);
83 ESP_LOGD(TAG,
"Frame: Invalid (size=%zu, first=%d).", this->
frame_.size(), this->frame_[0]);
91 ESP_LOGV(TAG,
"Frame: Consumed (size=%zu).", this->
frame_.size());
123 if (
frame_.size() < buffer_size)
127 auto accepted_led_count = std::min<int>(led_count, it.
size());
128 uint8_t *led_data = &
frame_[6];
130 for (
int led = 0; led < accepted_led_count; led++, led_data += 3) {
131 auto white = std::min({led_data[0], led_data[1], led_data[2]});
133 it[led].set(
Color(led_data[0], led_data[1], led_data[2], white));
unsigned int get_frame_size_(int led_count) const
void blank_all_leds_(light::AddressableLight &it)
Frame parse_frame_(light::AddressableLight &it)
std::vector< uint8_t > frame_
AdalightLightEffect(const char *name)
void reset_frame_(light::AddressableLight &it)
virtual int32_t size() const =0
void write_str(const char *str)
bool read_available(F &&on_byte)
Same as read_available_chunks(), calling on_byte(uint8_t) once per byte.
ESPHOME_LOG_TAG(TAG, "adalight_light_effect")
uint32_t IRAM_ATTR HOT millis()