12 #include <ESP8266WiFi.h> 25 static const char *
const TAG =
"wled_light_effect";
30 AddressableLightEffect::start();
36 AddressableLightEffect::stop();
45 for (
int led = it.
size(); led-- > 0;) {
54 udp_ = make_unique<WiFiUDP>();
57 ESP_LOGW(TAG,
"Cannot bind WLEDLightEffect to %d.",
port_);
62 std::vector<uint8_t> payload;
63 while (uint16_t packet_size =
udp_->parsePacket()) {
64 payload.resize(packet_size);
66 if (!
udp_->read(&payload[0], payload.size())) {
70 if (!this->
parse_frame_(it, &payload[0], payload.size())) {
71 ESP_LOGD(TAG,
"Frame: Invalid (size=%zu, first=0x%02X).", payload.size(), payload[0]);
91 uint8_t protocol = payload[0];
92 uint8_t timeout = payload[1];
100 if (
port_ == 19446) {
133 if (timeout == UINT8_MAX) {
135 }
else if (timeout > 0) {
152 if ((size % 4) != 0) {
156 auto count = size / 4;
157 auto max_leds = it.
size();
159 for (; count > 0; count--, payload += 4) {
160 uint8_t led = payload[0];
161 uint8_t r = payload[1];
162 uint8_t g = payload[2];
163 uint8_t b = payload[3];
165 if (led < max_leds) {
166 it[led].set(
Color(r, g, b));
175 if ((size % 3) != 0) {
179 auto count = size / 3;
180 auto max_leds = it.
size();
182 for (uint16_t led = 0; led < count; ++led, payload += 3) {
183 uint8_t r = payload[0];
184 uint8_t g = payload[1];
185 uint8_t b = payload[2];
187 if (led < max_leds) {
188 it[led].set(
Color(r, g, b));
197 if ((size % 4) != 0) {
201 auto count = size / 4;
202 auto max_leds = it.
size();
204 for (uint16_t led = 0; led < count; ++led, payload += 4) {
205 uint8_t r = payload[0];
206 uint8_t g = payload[1];
207 uint8_t b = payload[2];
208 uint8_t w = payload[3];
210 if (led < max_leds) {
211 it[led].set(
Color(r, g, b, w));
224 uint16_t led = (uint16_t(payload[0]) << 8) + payload[1];
229 if ((size % 3) != 0) {
233 auto count = size / 3;
234 auto max_leds = it.
size();
236 for (; count > 0; count--, payload += 3, led++) {
237 uint8_t r = payload[0];
238 uint8_t g = payload[1];
239 uint8_t b = payload[2];
241 if (led < max_leds) {
242 it[led].set(
Color(r, g, b));
252 #endif // USE_ARDUINO
bool parse_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)
bool parse_dnrgb_frame_(light::AddressableLight &it, const uint8_t *payload, uint16_t size)
std::unique_ptr< UDP > udp_
const int DEFAULT_BLANK_TIME
uint32_t IRAM_ATTR HOT millis()
bool parse_drgbw_frame_(light::AddressableLight &it, const uint8_t *payload, uint16_t size)
bool parse_drgb_frame_(light::AddressableLight &it, const uint8_t *payload, uint16_t size)
virtual int32_t size() const =0
void blank_all_leds_(light::AddressableLight &it)
WLEDLightEffect(const std::string &name)
bool parse_warls_frame_(light::AddressableLight &it, const uint8_t *payload, uint16_t size)