12#include <ESP8266WiFi.h>
29static const char *
const TAG =
"wled_light_effect";
34 AddressableLightEffect::start();
45 AddressableLightEffect::stop();
54 for (
int led = it.
size(); led-- > 0;) {
63 udp_ = make_unique<WiFiUDP>();
66 ESP_LOGW(TAG,
"Cannot bind WLEDLightEffect to %d.",
port_);
71 std::vector<uint8_t> payload;
72 while (uint16_t packet_size =
udp_->parsePacket()) {
73 payload.resize(packet_size);
75 if (!
udp_->read(&payload[0], payload.size())) {
79 if (!this->
parse_frame_(it, &payload[0], payload.size())) {
80 ESP_LOGD(TAG,
"Frame: Invalid (size=%zu, first=0x%02X).", payload.size(), payload[0]);
100 uint8_t protocol = payload[0];
101 uint8_t timeout = payload[1];
109 if (
port_ == 19446) {
145 if (timeout == UINT8_MAX) {
147 }
else if (timeout > 0) {
168 uint8_t payload_sync_group_mask = payload[34];
171 ESP_LOGD(TAG,
"sync group mask does not match");
175 uint8_t bri = payload[0];
176 uint8_t r = esp_scale8(payload[1], bri);
177 uint8_t g = esp_scale8(payload[2], bri);
178 uint8_t b = esp_scale8(payload[3], bri);
179 uint8_t w = esp_scale8(payload[8], bri);
181 for (
auto &&led : it) {
182 led.set(
Color(r, g, b, w));
190 if ((
size % 4) != 0) {
194 auto count =
size / 4;
195 auto max_leds = it.
size();
197 for (; count > 0; count--, payload += 4) {
198 uint8_t led = payload[0];
199 uint8_t r = payload[1];
200 uint8_t g = payload[2];
201 uint8_t b = payload[3];
203 if (led < max_leds) {
204 it[led].set(
Color(r, g, b));
213 if ((
size % 3) != 0) {
217 auto count =
size / 3;
218 auto max_leds = it.
size();
220 for (uint16_t led = 0; led < count; ++led, payload += 3) {
221 uint8_t r = payload[0];
222 uint8_t g = payload[1];
223 uint8_t b = payload[2];
225 if (led < max_leds) {
226 it[led].set(
Color(r, g, b));
235 if ((
size % 4) != 0) {
239 auto count =
size / 4;
240 auto max_leds = it.
size();
242 for (uint16_t led = 0; led < count; ++led, payload += 4) {
243 uint8_t r = payload[0];
244 uint8_t g = payload[1];
245 uint8_t b = payload[2];
246 uint8_t w = payload[3];
248 if (led < max_leds) {
249 it[led].set(
Color(r, g, b, w));
262 uint16_t led = (uint16_t(payload[0]) << 8) + payload[1];
267 if ((
size % 3) != 0) {
271 auto count =
size / 3;
272 auto max_leds = it.
size();
274 for (; count > 0; count--, payload += 3, led++) {
275 uint8_t r = payload[0];
276 uint8_t g = payload[1];
277 uint8_t b = payload[2];
279 if (led < max_leds) {
280 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
Providing packet encoding functions for exchanging data with a remote host.
uint32_t IRAM_ATTR HOT millis()