@@ -23,7 +23,6 @@ class ArtNetInDriver : public Node {
2323 // uint16_t ARTNET_PORT = 6454;
2424 // uint16_t DDP_PORT = 4048;
2525 WiFiUDP artnetUdp;
26- WiFiUDP ddpUdp;
2726 uint8_t packetBuffer[1500 ];
2827
2928 bool ddp = false ;
@@ -55,19 +54,36 @@ class ArtNetInDriver : public Node {
5554 bool init = false ;
5655
5756 void loop () override {
58- if (!WiFi.localIP () && !ETH.localIP ()) return ;
57+ if (!WiFi.localIP () && !ETH.localIP ()) {
58+ if (init) {
59+ EXT_LOGI (ML_TAG, " Stop Listening for %s on port %d" , ddp ? " DDP" : " Art-Net" , port);
60+ artnetUdp.stop ();
61+ init = false ;
62+ }
63+ return ;
64+ }
65+
5966 if (!init) {
60- if (ddp)
61- ddpUdp.begin (port);
62- else
63- artnetUdp.begin (port);
64- EXT_LOGD (ML_TAG, " Listening for %s on port %d" , ddp ? " DDP" : " Art-Net" , port);
67+ artnetUdp.begin (port);
68+ EXT_LOGI (ML_TAG, " Listening for %s on port %d" , ddp ? " DDP" : " Art-Net" , port);
6569 init = true ;
6670 }
67- if (ddp)
68- handleDDP ();
69- else
70- handleArtNet ();
71+
72+ while (int packetSize = artnetUdp.parsePacket ()) {
73+ if (packetSize < sizeof (ArtNetHeader) || packetSize > sizeof (packetBuffer)) {
74+ artnetUdp.clear ();
75+ continue ;
76+ }
77+
78+ if (packetSize >= sizeof (ArtNetHeader)) {
79+ artnetUdp.read (packetBuffer, min (packetSize, (int )sizeof (packetBuffer)));
80+
81+ if (ddp)
82+ handleDDP ();
83+ else
84+ handleArtNet ();
85+ }
86+ }
7187 }
7288
7389 // Art-Net Configuration
@@ -95,39 +111,30 @@ class ArtNetInDriver : public Node {
95111 };
96112
97113 void handleArtNet () {
98- // Process ALL available packets in the buffer
99- while (int packetSize = artnetUdp.parsePacket ()) {
100- if (packetSize >= sizeof (ArtNetHeader)) {
101- artnetUdp.read (packetBuffer, min (packetSize, (int )sizeof (packetBuffer)));
102-
103- EXT_LOGD (ML_TAG, " size:%d" , packetSize);
104-
105- // Verify Art-Net packet
106- if (memcmp (packetBuffer, " Art-Net" , 7 ) == 0 ) {
107- ArtNetHeader* header = (ArtNetHeader*)packetBuffer;
108- uint16_t opcode = header->opcode ;
109-
110- EXT_LOGD (ML_TAG, " size:%d universe:%d" , packetSize, header->universe );
111-
112- // Check if it's a DMX packet (opcode 0x5000)
113- if (opcode == 0x5000 ) {
114- uint16_t universe = header->universe ;
115- uint16_t dataLength = (header->length >> 8 ) | (header->length << 8 );
116-
117- uint8_t * dmxData = packetBuffer + sizeof (ArtNetHeader);
118-
119- int startPixel = universe * (512 / layerP.lights .header .channelsPerLight );
120- int numPixels = min ((uint16_t )(dataLength / layerP.lights .header .channelsPerLight ), (uint16_t )(layerP.lights .header .nrOfLights - startPixel));
121-
122- for (int i = 0 ; i < numPixels; i++) {
123- int ledIndex = startPixel + i;
124- if (ledIndex < layerP.lights .header .nrOfLights ) {
125- if (view == 0 ) {
126- memcpy (&layerP.lights .channels [ledIndex * layerP.lights .header .channelsPerLight ], &dmxData[i * layerP.lights .header .channelsPerLight ], layerP.lights .header .channelsPerLight );
127- } else {
128- layerP.layers [view - 1 ]->setLight (ledIndex, &dmxData[i * layerP.lights .header .channelsPerLight ], 0 , layerP.lights .header .channelsPerLight );
129- }
130- }
114+ // Verify Art-Net packet
115+ if (memcmp (packetBuffer, " Art-Net" , 7 ) == 0 ) {
116+ ArtNetHeader* header = (ArtNetHeader*)packetBuffer;
117+ uint16_t opcode = header->opcode ;
118+
119+ // EXT_LOGD(ML_TAG, "size:%d universe:%d", packetSize, header->universe);
120+
121+ // Check if it's a DMX packet (opcode 0x5000)
122+ if (opcode == 0x5000 ) {
123+ uint16_t universe = header->universe ;
124+ uint16_t dataLength = (header->length >> 8 ) | (header->length << 8 );
125+
126+ uint8_t * dmxData = packetBuffer + sizeof (ArtNetHeader);
127+
128+ int startPixel = universe * (512 / layerP.lights .header .channelsPerLight );
129+ int numPixels = min ((uint16_t )(dataLength / layerP.lights .header .channelsPerLight ), (uint16_t )(layerP.lights .header .nrOfLights - startPixel));
130+
131+ for (int i = 0 ; i < numPixels; i++) {
132+ int ledIndex = startPixel + i;
133+ if (ledIndex < layerP.lights .header .nrOfLights ) {
134+ if (view == 0 ) {
135+ memcpy (&layerP.lights .channels [ledIndex * layerP.lights .header .channelsPerLight ], &dmxData[i * layerP.lights .header .channelsPerLight ], layerP.lights .header .channelsPerLight );
136+ } else {
137+ layerP.layers [view - 1 ]->setLight (ledIndex, &dmxData[i * layerP.lights .header .channelsPerLight ], 0 , layerP.lights .header .channelsPerLight );
131138 }
132139 }
133140 }
@@ -136,35 +143,27 @@ class ArtNetInDriver : public Node {
136143 }
137144
138145 void handleDDP () {
139- // drain all packets
140- while (int packetSize = ddpUdp.parsePacket ()) {
141- if (packetSize >= sizeof (DDPHeader)) {
142- ddpUdp.read (packetBuffer, min (packetSize, (int )sizeof (packetBuffer)));
143-
144- DDPHeader* header = (DDPHeader*)packetBuffer;
145-
146- bool pushFlag = (header->flags & 0x80 ) != 0 ;
147- uint8_t dataType = header->dataType ;
148-
149- uint32_t offset = (header->offset >> 24 ) | ((header->offset >> 8 ) & 0xFF00 ) | ((header->offset << 8 ) & 0xFF0000 ) | (header->offset << 24 );
150- uint16_t dataLen = (header->dataLen >> 8 ) | (header->dataLen << 8 );
151-
152- if (dataType == 0x01 ) {
153- uint8_t * pixelData = packetBuffer + sizeof (DDPHeader);
154-
155- int startPixel = offset / layerP.lights .header .channelsPerLight ;
156- int numPixels = min ((uint16_t )(dataLen / layerP.lights .header .channelsPerLight ), (uint16_t )(layerP.lights .header .nrOfLights - startPixel));
157-
158- for (int i = 0 ; i < numPixels; i++) {
159- int ledIndex = startPixel + i;
160- if (ledIndex < layerP.lights .header .nrOfLights ) {
161- memcpy (&layerP.lights .channels [ledIndex * layerP.lights .header .channelsPerLight ], &pixelData[i * layerP.lights .header .channelsPerLight ], layerP.lights .header .channelsPerLight );
162- if (view == 0 ) {
163- memcpy (&layerP.lights .channels [ledIndex * layerP.lights .header .channelsPerLight ], &pixelData[i * layerP.lights .header .channelsPerLight ], layerP.lights .header .channelsPerLight );
164- } else {
165- layerP.layers [view - 1 ]->setLight (ledIndex, &pixelData[i * layerP.lights .header .channelsPerLight ], 0 , layerP.lights .header .channelsPerLight );
166- }
167- }
146+ DDPHeader* header = (DDPHeader*)packetBuffer;
147+
148+ bool pushFlag = (header->flags & 0x80 ) != 0 ;
149+ uint8_t dataType = header->dataType ;
150+
151+ uint32_t offset = (header->offset >> 24 ) | ((header->offset >> 8 ) & 0xFF00 ) | ((header->offset << 8 ) & 0xFF0000 ) | (header->offset << 24 );
152+ uint16_t dataLen = (header->dataLen >> 8 ) | (header->dataLen << 8 );
153+
154+ if (dataType == 0x01 ) {
155+ uint8_t * pixelData = packetBuffer + sizeof (DDPHeader);
156+
157+ int startPixel = offset / layerP.lights .header .channelsPerLight ;
158+ int numPixels = min ((uint16_t )(dataLen / layerP.lights .header .channelsPerLight ), (uint16_t )(layerP.lights .header .nrOfLights - startPixel));
159+
160+ for (int i = 0 ; i < numPixels; i++) {
161+ int ledIndex = startPixel + i;
162+ if (ledIndex < layerP.lights .header .nrOfLights ) {
163+ if (view == 0 ) {
164+ memcpy (&layerP.lights .channels [ledIndex * layerP.lights .header .channelsPerLight ], &pixelData[i * layerP.lights .header .channelsPerLight ], layerP.lights .header .channelsPerLight );
165+ } else {
166+ layerP.layers [view - 1 ]->setLight (ledIndex, &pixelData[i * layerP.lights .header .channelsPerLight ], 0 , layerP.lights .header .channelsPerLight );
168167 }
169168 }
170169 }
0 commit comments