Skip to content

Commit 1c6bd4d

Browse files
committed
Art-Net in tweaks
Back-end ======== - Module IO: jumper1 triggers redefine - Art-Net in: process all packets, store in physical layer or virtual
1 parent e54963e commit 1c6bd4d

File tree

4 files changed

+62
-70
lines changed

4 files changed

+62
-70
lines changed

src/MoonBase/Modules/ModuleIO.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,11 @@ class ModuleIO : public Module {
451451
EXT_LOGD(MB_TAG, "%s[%d]%s[%d].%s = %s -> %s", updatedItem.parent[0].c_str(), updatedItem.index[0], updatedItem.parent[1].c_str(), updatedItem.index[1], updatedItem.name.c_str(), updatedItem.oldValue.c_str(), updatedItem.value.as<String>().c_str());
452452
newBoardID = _state.data["boardPreset"]; // run in sveltekit task
453453
}
454-
} else if (updatedItem.name == "usage" && !_state.updateOriginId.contains("server")) { // not done by this module: done by UI
454+
} else if (updatedItem.name == "jumper1" && !_state.updateOriginId.contains("server")) { // not done by this module: done by UI
455+
// rebuild with new jumper setting
456+
_state.data["modded"] = false;
457+
newBoardID = _state.data["boardPreset"]; // run in sveltekit task
458+
} else if (updatedItem.name == "usage" && !_state.updateOriginId.contains("server")) { // not done by this module: done by UI
455459
// EXT_LOGD(MB_TAG, "%s[%d]%s[%d].%s = %s -> %s", updatedItem.parent[0].c_str(), updatedItem.index[0], updatedItem.parent[1].c_str(), updatedItem.index[1], updatedItem.name.c_str(), updatedItem.oldValue.c_str(), updatedItem.value.as<String>().c_str());
456460
// set pins to default if modded is turned off
457461
JsonDocument doc;

src/MoonLight/Modules/ModuleLightsControl.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ class ModuleLightsControl : public Module {
9191
});
9292
}
9393

94-
uint8_t nrOfPalettes = 0;
9594
// define the data model
9695
void setupDefinition(const JsonArray& controls) override {
9796
EXT_LOGV(ML_TAG, "");
@@ -123,7 +122,6 @@ class ModuleLightsControl : public Module {
123122
addControlValue(control, "Random");
124123
addControlValue(control, "Quin");
125124
addControlValue(control, "Orange");
126-
nrOfPalettes = control["values"].as<JsonArray>().size();
127125

128126
control = addControl(controls, "preset", "pad");
129127
control["width"] = 8;

src/MoonLight/Nodes/Drivers/D_ArtnetIn.h

Lines changed: 56 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/MoonLight/Nodes/Drivers/D_Infrared.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -350,11 +350,10 @@ class IRDriver : public Node {
350350

351351
// do not process longpress
352352
if (nec_repeat == false) {
353-
ModuleLightsControl* lc = (ModuleLightsControl*)moduleControl;
354353
if (combined_code == codeOff || combined_code == codeOn) { // Lights on/off
355354
newState["lightsOn"] = state.data["lightsOn"].as<bool>() ? false : true;
356355
} else if (combined_code == codePaletteInc) { // palette increase
357-
newState["palette"] = MIN(state.data["palette"].as<uint8_t>() + 1, lc->nrOfPalettes); // to do: replace 8 with max palette count
356+
newState["palette"] = MIN(state.data["palette"].as<uint8_t>() + 1, 11); // to do: replace 8 with max palette count
358357
} else if (combined_code == codePaletteDec) { // palette decrease
359358
newState["palette"] = MAX(state.data["palette"].as<uint8_t>() - 1, 0);
360359
} else if (combined_code == codePresetDec) { // next button - go to previous preset

0 commit comments

Comments
 (0)