12#include <ESP8266WiFi.h>
28static const char *
const TAG =
"wled_light_effect";
33 AddressableLightEffect::start();
44 AddressableLightEffect::stop();
53 for (
int led = it.
size(); led-- > 0;) {
62 udp_ = make_unique<WiFiUDP>();
65 ESP_LOGW(TAG,
"Cannot bind WLEDLightEffect to %d.",
port_);
70 std::vector<uint8_t> payload;
71 while (uint16_t packet_size =
udp_->parsePacket()) {
72 payload.resize(packet_size);
74 if (!
udp_->read(&payload[0], payload.size())) {
78 if (!this->
parse_frame_(it, &payload[0], payload.size())) {
79 ESP_LOGD(TAG,
"Frame: Invalid (size=%zu, first=0x%02X).", payload.size(), payload[0]);
99 uint8_t protocol = payload[0];
100 uint8_t timeout = payload[1];
108 if (
port_ == 19446) {
144 if (timeout == UINT8_MAX) {
146 }
else if (timeout > 0) {
167 uint8_t payload_sync_group_mask = payload[34];
170 ESP_LOGD(TAG,
"sync group mask does not match");
174 uint8_t bri = payload[0];
175 uint8_t r = esp_scale8(payload[1], bri);
176 uint8_t g = esp_scale8(payload[2], bri);
177 uint8_t b = esp_scale8(payload[3], bri);
178 uint8_t w = esp_scale8(payload[8], bri);
180 for (
auto &&led : it) {
181 led.set(
Color(r, g, b, w));
189 if ((
size % 4) != 0) {
193 auto count =
size / 4;
194 auto max_leds = it.
size();
196 for (; count > 0; count--, payload += 4) {
197 uint8_t led = payload[0];
198 uint8_t r = payload[1];
199 uint8_t g = payload[2];
200 uint8_t b = payload[3];
202 if (led < max_leds) {
203 it[led].set(
Color(r, g, b));
212 if ((
size % 3) != 0) {
216 auto count =
size / 3;
217 auto max_leds = it.
size();
219 for (uint16_t led = 0; led < count; ++led, payload += 3) {
220 uint8_t r = payload[0];
221 uint8_t g = payload[1];
222 uint8_t b = payload[2];
224 if (led < max_leds) {
225 it[led].set(
Color(r, g, b));
234 if ((
size % 4) != 0) {
238 auto count =
size / 4;
239 auto max_leds = it.
size();
241 for (uint16_t led = 0; led < count; ++led, payload += 4) {
242 uint8_t r = payload[0];
243 uint8_t g = payload[1];
244 uint8_t b = payload[2];
245 uint8_t w = payload[3];
247 if (led < max_leds) {
248 it[led].set(
Color(r, g, b, w));
261 uint16_t led = (uint16_t(payload[0]) << 8) + payload[1];
266 if ((
size % 3) != 0) {
270 auto count =
size / 3;
271 auto max_leds = it.
size();
273 for (; count > 0; count--, payload += 3, led++) {
274 uint8_t r = payload[0];
275 uint8_t g = payload[1];
276 uint8_t b = payload[2];
278 if (led < max_leds) {
279 it[led].set(
Color(r, g, b));
virtual int32_t size() const =0
bool parse_dnrgb_frame_(light::AddressableLight &it, const uint8_t *payload, uint16_t size)
optional< uint32_t > blank_start_
bool parse_drgb_frame_(light::AddressableLight &it, const uint8_t *payload, uint16_t size)
bool parse_notifier_frame_(light::AddressableLight &it, const uint8_t *payload, uint16_t size)
void blank_all_leds_(light::AddressableLight &it)
std::unique_ptr< UDP > udp_
bool parse_frame_(light::AddressableLight &it, const uint8_t *payload, uint16_t size)
WLEDLightEffect(const char *name)
bool parse_warls_frame_(light::AddressableLight &it, const uint8_t *payload, uint16_t size)
bool parse_drgbw_frame_(light::AddressableLight &it, const uint8_t *payload, uint16_t size)
constexpr uint32_t DEFAULT_BLANK_TIME
uint32_t IRAM_ATTR HOT millis()