@@ -27,15 +27,15 @@ class ArtNetInDriver : public Node {
2727 uint8_t packetBuffer[1500 ];
2828
2929 bool ddp = false ;
30- uint8_t view = 0 ;
30+ uint8_t view = 0 ; // physical layer
3131 uint16_t port = 6454 ;
3232
3333 void setup () override {
3434 addControl (ddp, " DDP" , " checkbox" );
3535 addControl (port, " port" , " number" , 0 , 65538 );
3636 addControl (view, " view" , " select" );
3737 addControlValue (" Physical layer" );
38- uint8_t i = 0 ;
38+ uint8_t i = 1 ; // start with one
3939 for (VirtualLayer* layer : layerP.layers ) {
4040 Char<32 > layerName;
4141 layerName.format (" Layer %d" , i);
@@ -95,8 +95,6 @@ class ArtNetInDriver : public Node {
9595 };
9696
9797 void handleArtNet () {
98- // LightsHeader* header = &layerP.lights.header;
99-
10098 int packetSize = artnetUdp.parsePacket ();
10199
102100 if (packetSize >= sizeof (ArtNetHeader)) {
@@ -107,7 +105,7 @@ class ArtNetInDriver : public Node {
107105 ArtNetHeader* header = (ArtNetHeader*)packetBuffer;
108106 uint16_t opcode = header->opcode ;
109107 //
110- // EXT_LOGD(ML_TAG, "%d" , header->universe);
108+ EXT_LOGD (ML_TAG, " size:%d universe:%d " , packetSize , header->universe );
111109
112110 // Check if it's a DMX packet (opcode 0x5000)
113111 if (opcode == 0x5000 ) {
@@ -120,10 +118,17 @@ class ArtNetInDriver : public Node {
120118 uint8_t * dmxData = packetBuffer + sizeof (ArtNetHeader);
121119
122120 // Map DMX channels to LEDs (3 channels per LED: RGB)
123- int numPixels = min ((uint16_t )(dataLength / layerP.lights .header .channelsPerLight ), (uint16_t )(layerP.lights .header .nrOfLights ));
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));
124125
126+ // Write to the correct offset
125127 for (int i = 0 ; i < numPixels; i++) {
126- memcpy (&layerP.lights .channels [i * layerP.lights .header .channelsPerLight ], &dmxData[i * layerP.lights .header .channelsPerLight ], layerP.lights .header .channelsPerLight );
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 );
131+ }
127132 }
128133
129134 // FastLED.show();
@@ -177,5 +182,3 @@ class ArtNetInDriver : public Node {
177182};
178183
179184#endif
180-
181- // #include <WiFi.h>
0 commit comments