@@ -95,87 +95,78 @@ class ArtNetInDriver : public Node {
9595 };
9696
9797 void handleArtNet () {
98- int packetSize = artnetUdp. parsePacket ();
99-
100- if (packetSize >= sizeof (ArtNetHeader)) {
101- artnetUdp.read (packetBuffer, packetSize);
102-
103- // Verify Art-Net packet
104- if ( memcmp (packetBuffer, " Art-Net " , 7 ) == 0 ) {
105- ArtNetHeader* header = (ArtNetHeader*)packetBuffer;
106- uint16_t opcode = header-> opcode ;
107- //
108- EXT_LOGD (ML_TAG, " size:%d universe:%d " , packetSize, header->universe ) ;
109-
110- // Check if it's a DMX packet (opcode 0x5000)
111- if (opcode == 0x5000 ) {
112- uint16_t universe = header-> universe ;
113- uint16_t dataLength = (header-> length >> 8 ) | (header-> length << 8 ); // Swap bytes
114-
115- // Process if it's our universe
116-
117- // if (universe == artnetUniverse) { // all universes welcome
118- uint8_t * dmxData = packetBuffer + sizeof (ArtNetHeader);
119-
120- // Map DMX channels to LEDs (3 channels per LED: RGB)
121- // Calculate starting LED position based on universe
122- // Each Art-Net universe supports up to 512 DMX channels
123- int startPixel = universe * ( 512 / layerP. lights . header . channelsPerLight ) ;
124- int numPixels = min (( uint16_t )(dataLength / layerP.lights .header .channelsPerLight ), ( uint16_t )(layerP. lights . header . nrOfLights - startPixel));
125-
126- // Write to the correct offset
127- for ( int i = 0 ; i < numPixels; i++) {
128- int ledIndex = startPixel + i ;
129- if (ledIndex < layerP. lights . header . nrOfLights ) {
130- memcpy (&layerP. lights . channels [ledIndex * layerP. lights . header . channelsPerLight ], &dmxData[i * layerP. lights . header . channelsPerLight ], layerP. lights . header . channelsPerLight );
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+ }
131131 }
132132 }
133-
134- // FastLED.show();
135- // Serial.println("Art-Net: " + String(numPixels) + " pixels updated");
136- // }
137133 }
138134 }
139135 }
140136 }
141137
142138 void handleDDP () {
143- int packetSize = ddpUdp. parsePacket ();
144-
145- if (packetSize >= sizeof (DDPHeader)) {
146- ddpUdp.read (packetBuffer, packetSize);
139+ // drain all packets
140+ while ( int packetSize = ddpUdp. parsePacket ()) {
141+ if (packetSize >= sizeof (DDPHeader)) {
142+ ddpUdp.read (packetBuffer, min ( packetSize, ( int ) sizeof (packetBuffer)) );
147143
148- DDPHeader* header = (DDPHeader*)packetBuffer;
144+ DDPHeader* header = (DDPHeader*)packetBuffer;
149145
150- // Extract header fields
151- bool pushFlag = (header->flags & 0x80 ) != 0 ; // Bit 7
152- uint8_t dataType = header->dataType ;
146+ bool pushFlag = (header->flags & 0x80 ) != 0 ;
147+ uint8_t dataType = header->dataType ;
153148
154- // Convert big-endian offset and length
155- uint32_t offset = (header-> offset >> 24 ) | (( header->offset >> 8 ) & 0xFF00 ) | (( header->offset << 8 ) & 0xFF0000 ) | (header-> offset << 24 );
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 );
156151
157- uint16_t dataLen = (header->dataLen >> 8 ) | (header->dataLen << 8 );
152+ if (dataType == 0x01 ) {
153+ uint8_t * pixelData = packetBuffer + sizeof (DDPHeader);
158154
159- // Validate data type (0x01 = RGB)
160- if (dataType == 0x01 ) {
161- uint8_t * pixelData = packetBuffer + sizeof (DDPHeader);
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));
162157
163- // Calculate starting pixel from byte offset (3 bytes per pixel)
164- int startPixel = offset / layerP.lights .header .channelsPerLight ;
165- int numPixels = min ((uint16_t )(dataLen / layerP.lights .header .channelsPerLight ), (uint16_t )(layerP.lights .header .nrOfLights - startPixel));
166-
167- // Update LEDs
168- for (int i = 0 ; i < numPixels; i++) {
169- int ledIndex = startPixel + i;
170- if (ledIndex < layerP.lights .header .nrOfLights ) {
171- memcpy (&layerP.lights .channels [ledIndex * layerP.lights .header .channelsPerLight ], &pixelData[i * layerP.lights .header .channelsPerLight ], layerP.lights .header .channelsPerLight );
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+ }
172168 }
173169 }
174- // Only update display if push flag is set
175- if (pushFlag) {
176- // FastLED.show();
177- // Serial.println("DDP: " + String(numPixels) + " pixels updated (offset: " + String(startPixel) + ")");
178- }
179170 }
180171 }
181172 }
0 commit comments