Skip to content

Commit 966b2b5

Browse files
committed
readPins pin check and Art-Net in clear buffer bugfix
Back end ======== - IO (Ethernet), LightsControl(button and relay lightson), : Add pincheck in readPins - Artnet in: refactor and add artnetUDP.clear (fixed the bug)
1 parent 1c6bd4d commit 966b2b5

File tree

5 files changed

+131
-96
lines changed

5 files changed

+131
-96
lines changed

src/MoonBase/Modules/ModuleIO.h

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -454,8 +454,8 @@ class ModuleIO : public Module {
454454
} else if (updatedItem.name == "jumper1" && !_state.updateOriginId.contains("server")) { // not done by this module: done by UI
455455
// rebuild with new jumper setting
456456
_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
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
459459
// 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());
460460
// set pins to default if modded is turned off
461461
JsonDocument doc;
@@ -506,11 +506,36 @@ class ModuleIO : public Module {
506506
for (JsonObject pinObject : _state.data["pins"].as<JsonArray>()) {
507507
uint8_t usage = pinObject["usage"];
508508
uint8_t gpio = pinObject["GPIO"];
509-
if (usage == pin_SPI_SCK) ess->v_ETH_SPI_SCK = gpio;
510-
if (usage == pin_SPI_MISO) ess->v_ETH_SPI_MISO = gpio;
511-
if (usage == pin_SPI_MOSI) ess->v_ETH_SPI_MOSI = gpio;
512-
if (usage == pin_PHY_CS) ess->v_ETH_PHY_CS = gpio;
513-
if (usage == pin_PHY_IRQ) ess->v_ETH_PHY_IRQ = gpio;
509+
if (usage == pin_SPI_SCK) {
510+
if (GPIO_IS_VALID_GPIO(gpio))
511+
ess->v_ETH_SPI_SCK = gpio;
512+
else
513+
EXT_LOGE(MB_TAG, "%d: gpio %d not valid", usage, gpio);
514+
}
515+
if (usage == pin_SPI_MISO) {
516+
if (GPIO_IS_VALID_GPIO(gpio))
517+
ess->v_ETH_SPI_MISO = gpio;
518+
else
519+
EXT_LOGE(MB_TAG, "%d: gpio %d not valid", usage, gpio);
520+
}
521+
if (usage == pin_SPI_MOSI) {
522+
if (GPIO_IS_VALID_GPIO(gpio))
523+
ess->v_ETH_SPI_MOSI = gpio;
524+
else
525+
EXT_LOGE(MB_TAG, "%d: gpio %d not valid", usage, gpio);
526+
}
527+
if (usage == pin_PHY_CS) {
528+
if (GPIO_IS_VALID_GPIO(gpio))
529+
ess->v_ETH_PHY_CS = gpio;
530+
else
531+
EXT_LOGE(MB_TAG, "%d: gpio %d not valid", usage, gpio);
532+
}
533+
if (usage == pin_PHY_IRQ) {
534+
if (GPIO_IS_VALID_GPIO(gpio))
535+
ess->v_ETH_PHY_IRQ = gpio;
536+
else
537+
EXT_LOGE(MB_TAG, "%d: gpio %d not valid", usage, gpio);
538+
}
514539
}
515540

516541
// allocate the pins found

src/MoonLight/Modules/ModuleLightsControl.h

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,20 @@ class ModuleLightsControl : public Module {
7777
uint8_t usage = pinObject["usage"];
7878
if (usage == pin_Relay_LightsOn) {
7979
pinRelayLightsOn = pinObject["GPIO"];
80-
pinMode(pinRelayLightsOn, OUTPUT);
81-
uint8_t newBri = _state.data["lightsOn"] ? _state.data["brightness"] : 0;
82-
digitalWrite(pinRelayLightsOn, newBri > 0 ? HIGH : LOW);
83-
EXT_LOGD(ML_TAG, "pinRelayLightsOn found %d", pinRelayLightsOn);
80+
if (GPIO_IS_VALID_OUTPUT_GPIO(pinRelayLightsOn)) {
81+
pinMode(pinRelayLightsOn, OUTPUT);
82+
uint8_t newBri = _state.data["lightsOn"] ? _state.data["brightness"] : 0;
83+
digitalWrite(pinRelayLightsOn, newBri > 0 ? HIGH : LOW);
84+
EXT_LOGD(ML_TAG, "pinRelayLightsOn found %d", pinRelayLightsOn);
85+
} else
86+
EXT_LOGE(MB_TAG, "gpio %d not valid", pinRelayLightsOn);
8487
} else if (usage == pin_Button_LightsOn) {
8588
pinButtonLightsOn = pinObject["GPIO"];
86-
pinMode(pinButtonLightsOn, INPUT_PULLUP);
87-
EXT_LOGD(ML_TAG, "pinButtonLightsOn found %d", pinButtonLightsOn);
89+
if (GPIO_IS_VALID_GPIO(pinButtonLightsOn)) {
90+
pinMode(pinButtonLightsOn, INPUT_PULLUP);
91+
EXT_LOGD(ML_TAG, "pinButtonLightsOn found %d", pinButtonLightsOn);
92+
} else
93+
EXT_LOGE(MB_TAG, "gpio %d not valid", pinButtonLightsOn);
8894
}
8995
}
9096
// for (int i = 0; i < sizeof(pins); i++) EXT_LOGD(ML_TAG, "pin %d = %d", i, pins[i]);

src/MoonLight/Nodes/Drivers/D_ArtnetIn.h

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

src/MoonLight/Nodes/Drivers/D_AudioSync.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,15 @@ class AudioSyncDriver : public Node {
2626
void loop() override {
2727
if (!WiFi.isConnected() && !ETH.connected()) {
2828
// make WLED Audio Sync network failure resilient - WIP
29-
if (init) EXT_LOGI(ML_TAG, "Audio Sync: stopped");
30-
//set all data to 0
31-
memset(sharedData.bands, 0, sizeof(sharedData.bands));
32-
sharedData.volume = 0;
33-
sharedData.volumeRaw = 0;
34-
sharedData.majorPeak = 0;
35-
init = false;
29+
if (init) {
30+
// set all data to 0
31+
memset(sharedData.bands, 0, sizeof(sharedData.bands));
32+
sharedData.volume = 0;
33+
sharedData.volumeRaw = 0;
34+
sharedData.majorPeak = 0;
35+
init = false;
36+
EXT_LOGI(ML_TAG, "Audio Sync: stopped");
37+
}
3638
return;
3739
}
3840

src/MoonLight/Nodes/Drivers/D_Infrared.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ class IRDriver : public Node {
4444
uint8_t usage = pinObject["usage"];
4545
if (usage == pin_Infrared) {
4646
pinInfrared = pinObject["GPIO"];
47-
EXT_LOGD(ML_TAG, "pin_Infrared found %d", pinInfrared);
47+
if (GPIO_IS_VALID_GPIO(pinInfrared)) {
48+
EXT_LOGD(ML_TAG, "pin_Infrared found %d", pinInfrared);
49+
} else
50+
EXT_LOGE(MB_TAG, "gpio %d not valid", pinInfrared);
4851
}
4952
}
5053
if (pinInfrared != UINT8_MAX) {
@@ -352,9 +355,9 @@ class IRDriver : public Node {
352355
if (nec_repeat == false) {
353356
if (combined_code == codeOff || combined_code == codeOn) { // Lights on/off
354357
newState["lightsOn"] = state.data["lightsOn"].as<bool>() ? false : true;
355-
} else if (combined_code == codePaletteInc) { // palette increase
358+
} else if (combined_code == codePaletteInc) { // palette increase
356359
newState["palette"] = MIN(state.data["palette"].as<uint8_t>() + 1, 11); // to do: replace 8 with max palette count
357-
} else if (combined_code == codePaletteDec) { // palette decrease
360+
} else if (combined_code == codePaletteDec) { // palette decrease
358361
newState["palette"] = MAX(state.data["palette"].as<uint8_t>() - 1, 0);
359362
} else if (combined_code == codePresetDec) { // next button - go to previous preset
360363
newState["preset"] = state.data["preset"];

0 commit comments

Comments
 (0)