Skip to content

Commit 87f2be7

Browse files
committed
Add Dig2Go, relay lightson, infrared 10 presets, layer nroflights fix
Back-end ======== - ModuleIO: Octo -> Octa, Add Dig2Go, set index to 1 - Light control: rename pinRelayBrightness and pinToggleOnOff to pinRelayLightsOn and pinButtonLightsOn. readPins()/onUpdate: digitalWrite relay - Audio Sync: refactor no connection, set to 0 - Infrared: increase to 10 presets - Virtual layer: nrOfLights is max mapped
1 parent 3d0ef64 commit 87f2be7

File tree

8 files changed

+50
-27
lines changed

8 files changed

+50
-27
lines changed

docs/moonlight/drivers.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Want to add a Driver to MoonLight, see [develop](https://moonmodules.org/MoonLig
3333
| Parallel LED Driver | <img width="100" src="https://github.com/user-attachments/assets/9cbe487e-f330-40a5-8b40-6663c83e5d90"/> | <img width="320" alt="Parallel" src="https://github.com/user-attachments/assets/0c6f1543-623a-45bf-98d7-f5ddd072a1c6" /> | Drive multiple LED types, all devices including ESP32-P4(-nano) supported<br>Max Power and Light preset: See below<br>DMA buffer: set higher when LEDs flicker<br>Virtual LED Driver will be part of the Parallel LED driver.|
3434
| FastLED Driver | <img width="100" src="https://avatars.githubusercontent.com/u/5899270?s=48&v=4"/> | <img width="320" alt="FastLed" src="https://github.com/user-attachments/assets/d5ea1510-9766-4687-895a-b68c82575b8f" /> | Most used LED driver. Drive most common LEDs (WS2812).<br>Max Power: See below |
3535
| Art-Net | <img width="100" src="https://github.com/user-attachments/assets/9c65921c-64e9-4558-b6ef-aed2a163fd88"> | <img width="320" alt="Art-Net" src="https://github.com/user-attachments/assets/1428e990-daf7-43ba-9e50-667d51b456eb" /> | Drive LEDS and DMX lights over the network. See below |
36-
| AudioSync | <img width="100" src="https://github.com/user-attachments/assets/bfedf80b-6596-41e7-a563-ba7dd58cc476"/> | No controls | Listens to audio sent over the local network by WLED-AC or WLED-MM and allows audio reactive effects (♪ & ♫) to use audio data (volume and bands (FFT)) |
36+
| Audio Sync | <img width="100" src="https://github.com/user-attachments/assets/bfedf80b-6596-41e7-a563-ba7dd58cc476"/> | No controls | Listens to audio sent over the local network by WLED-AC or WLED-MM and allows audio reactive effects (♪ & ♫) to use audio data (volume and bands (FFT)) |
3737
| HUB75 Driver | <img width="100" src="https://github.com/user-attachments/assets/620f7c41-8078-4024-b2a0-39a7424f9678"/> | <img width="100" src="https://github.com/user-attachments/assets/4d386045-9526-4a5a-aa31-638058b31f32"/> | Drive HUB75 panels<br>Not implemented yet |
3838
| IR Driver 🆕🚧 | <img width="100" src="../../media/moonlight/IRDriver.jpeg"/> | | Receive IR commands and [Lights Control](https://moonmodules.org/MoonLight/moonlight/lightscontrol/) |
3939

src/MoonBase/Modules/ModuleIO.h

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ enum IO_Boards {
6666
board_none, //
6767
board_QuinLEDDigUnoV3,
6868
board_QuinLEDDigQuadV3,
69-
board_QuinLEDDigOctoV2,
69+
board_QuinLEDDigOctaV2,
70+
board_QuinLEDDig2Go,
7071
board_QuinLEDPenta,
7172
board_QuinLEDPentaPlus,
7273
board_SergUniShieldV5,
@@ -107,6 +108,7 @@ class ModuleIO : public Module {
107108
addControlValue(control, "QuinLED Dig Uno v3");
108109
addControlValue(control, "QuinLED Dig Quad v3");
109110
addControlValue(control, "QuinLED Dig Octa v2");
111+
addControlValue(control, "QuinLED Dig 2Go");
110112
addControlValue(control, "QuinLED Penta");
111113
addControlValue(control, "QuinLED Penta Plus");
112114
addControlValue(control, "Serg Universal Shield v5");
@@ -230,7 +232,7 @@ class ModuleIO : public Module {
230232
JsonObject pin = pins.add<JsonObject>();
231233
pin["GPIO"] = gpio_num;
232234
pin["usage"] = 0;
233-
pin["index"] = 0;
235+
pin["index"] = 1;
234236

235237
// Check if GPIO is valid
236238
bool is_valid = GPIO_IS_VALID_GPIO(gpio_num);
@@ -319,13 +321,26 @@ class ModuleIO : public Module {
319321
// pinAssigner.assignPin(13, pin_Temperature;
320322
// pinAssigner.assignPin(15, pin_I2S_SCK;
321323
// pinAssigner.assignPin(32, pin_Exposed;
322-
} else if (boardID == board_QuinLEDDigOctoV2) {
324+
} else if (boardID == board_QuinLEDDigOctaV2) {
323325
// Dig-Octa-32-8L
324326
uint8_t ledPins[8] = {0, 1, 2, 3, 4, 5, 12, 13}; // LED_PINS
325327
for (int i = 0; i < sizeof(ledPins); i++) pinAssigner.assignPin(ledPins[i], pin_LED);
326328
pinAssigner.assignPin(33, pin_Relay);
327329
pinAssigner.assignPin(34, pin_ButtonPush);
328-
330+
} else if (boardID == board_QuinLEDDig2Go) {
331+
// dig2go
332+
pinAssigner.assignPin(0, pin_Button_LightsOn);
333+
pinAssigner.assignPin(5, pin_Infrared);
334+
pinAssigner.assignPin(16, pin_LED);
335+
pinAssigner.assignPin(12, pin_Relay_LightsOn);
336+
pinAssigner.assignPin(19, pin_I2S_SD);
337+
pinAssigner.assignPin(4, pin_I2S_WS);
338+
pinAssigner.assignPin(18, pin_I2S_SCK);
339+
pinAssigner.assignPin(21, pin_I2C_SDA);
340+
pinAssigner.assignPin(22, pin_I2C_SCL);
341+
pinAssigner.assignPin(23, pin_Exposed);
342+
pinAssigner.assignPin(25, pin_Exposed);
343+
// pinAssigner.assignPin(xx, pin_I2S_MCLK);
329344
} else if (boardID == board_QuinLEDPenta) {
330345
uint8_t ledPins[5] = {14, 13, 12, 4, 2}; // LED_PINS
331346
for (int i = 0; i < sizeof(ledPins); i++) pinAssigner.assignPin(ledPins[i], pin_LED);

src/MoonLight/Layers/VirtualLayer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ void VirtualLayer::addLight(Coord3D position) {
336336
if (position.x != UINT16_MAX) { // can be set to UINT16_MAX by modifier todo: check multiple modifiers
337337
uint16_t indexV = XYZUnModified(position);
338338
if (indexV < mappingTableSize) {
339-
nrOfLights = indexV + 1;
339+
nrOfLights = MAX(nrOfLights, indexV + 1);
340340
addIndexP(mappingTable[indexV], layerP->indexP);
341341
}
342342
} else {

src/MoonLight/Modules/ModuleDrivers.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ class ModuleDrivers : public NodeManager {
6969

7070
void begin() override {
7171
defaultNodeName = getNameAndTags<PanelLayout>();
72-
7372
nodes = &layerP.nodes;
7473
NodeManager::begin();
7574

src/MoonLight/Modules/ModuleEffects.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ class ModuleEffects : public NodeManager {
2727
void begin() override {
2828
defaultNodeName = getNameAndTags<RandomEffect>();
2929
nodes = &(layerP.layers[0]->nodes); // to do add nodes from all layers...
30-
3130
NodeManager::begin();
3231

3332
#if FT_ENABLED(FT_MONITOR)

src/MoonLight/Modules/ModuleLightsControl.h

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ class ModuleLightsControl : public Module {
2525
PsychicHttpServer* _server;
2626
FileManager* _fileManager;
2727
ModuleIO* _moduleIO;
28-
uint8_t pinRelayBrightness = UINT8_MAX;
29-
uint8_t pinToggleOnOff = UINT8_MAX;
28+
uint8_t pinRelayLightsOn = UINT8_MAX;
29+
uint8_t pinButtonLightsOn = UINT8_MAX;
3030

3131
ModuleLightsControl(PsychicHttpServer* server, ESP32SvelteKit* sveltekit, FileManager* fileManager, ModuleIO* moduleIO) : Module("lightscontrol", server, sveltekit) {
3232
EXT_LOGV(ML_TAG, "constructor");
@@ -71,17 +71,20 @@ class ModuleLightsControl : public Module {
7171

7272
void readPins() {
7373
moduleIO.read([&](ModuleState& state) {
74-
pinRelayBrightness = UINT8_MAX;
75-
pinToggleOnOff = UINT8_MAX;
74+
pinRelayLightsOn = UINT8_MAX;
75+
pinButtonLightsOn = UINT8_MAX;
7676
for (JsonObject pinObject : state.data["pins"].as<JsonArray>()) {
7777
uint8_t usage = pinObject["usage"];
7878
if (usage == pin_Relay_LightsOn) {
79-
pinRelayBrightness = pinObject["GPIO"];
80-
EXT_LOGD(ML_TAG, "pinRelayBrightness found %d", pinRelayBrightness);
79+
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);
8184
} else if (usage == pin_Button_LightsOn) {
82-
pinToggleOnOff = pinObject["GPIO"];
83-
pinMode(pinToggleOnOff, INPUT_PULLUP);
84-
EXT_LOGD(ML_TAG, "pinToggleOnOff found %d", pinToggleOnOff);
85+
pinButtonLightsOn = pinObject["GPIO"];
86+
pinMode(pinButtonLightsOn, INPUT_PULLUP);
87+
EXT_LOGD(ML_TAG, "pinButtonLightsOn found %d", pinButtonLightsOn);
8588
}
8689
}
8790
// for (int i = 0; i < sizeof(pins); i++) EXT_LOGD(ML_TAG, "pin %d = %d", i, pins[i]);
@@ -151,8 +154,9 @@ class ModuleLightsControl : public Module {
151154
layerP.lights.header.blue = _state.data["blue"];
152155
} else if (updatedItem.name == "lightsOn" || updatedItem.name == "brightness") {
153156
uint8_t newBri = _state.data["lightsOn"] ? _state.data["brightness"] : 0;
154-
if (!!layerP.lights.header.brightness != !!newBri && pinRelayBrightness != UINT8_MAX) {
155-
EXT_LOGD(ML_TAG, "pinRelayBrightness %s", !!newBri ? "On" : "Off");
157+
if (!!layerP.lights.header.brightness != !!newBri && pinRelayLightsOn != UINT8_MAX) {
158+
EXT_LOGD(ML_TAG, "pinRelayLightsOn %s", !!newBri ? "On" : "Off");
159+
digitalWrite(pinRelayLightsOn, newBri>0?HIGH:LOW);
156160
};
157161
layerP.lights.header.brightness = newBri;
158162
} else if (updatedItem.name == "palette") {
@@ -251,7 +255,7 @@ class ModuleLightsControl : public Module {
251255
}
252256

253257
unsigned long lastPresetTime = 0;
254-
// see pinToggleOnOff
258+
// see pinButtonLightsOn
255259
unsigned long lastDebounceTime = 0;
256260
static constexpr unsigned long debounceDelay = 50; // 50ms debounce
257261
int lastState = HIGH;
@@ -303,8 +307,8 @@ class ModuleLightsControl : public Module {
303307
}
304308
}
305309

306-
if (pinToggleOnOff != UINT8_MAX) {
307-
int state = digitalRead(pinToggleOnOff);
310+
if (pinButtonLightsOn != UINT8_MAX) {
311+
int state = digitalRead(pinButtonLightsOn);
308312
if (state != lastState && (millis() - lastDebounceTime) > debounceDelay) {
309313
lastDebounceTime = millis();
310314
// Trigger only on button press (HIGH to LOW transition for INPUT_PULLUP)
@@ -326,7 +330,7 @@ class ModuleLightsControl : public Module {
326330
_socket->emitEvent("monitor", (char*)layerP.lights.channels, MIN(layerP.lights.header.nrOfLights * 3, layerP.lights.maxChannels)); //*3 is for 3 bytes position
327331
}
328332
memset(layerP.lights.channels, 0, layerP.lights.maxChannels); // set all the channels to 0 //cleaning the positions
329-
EXT_LOGD(ML_TAG, "positions sent to monitor (2 -> 3, noL:%d noC:%d)", layerP.lights.header.nrOfLights, layerP.lights.maxChannels);
333+
EXT_LOGD(ML_TAG, "positions sent to monitor (2 -> 3, #L:%d maxC:%d)", layerP.lights.header.nrOfLights, layerP.lights.maxChannels);
330334
layerP.lights.header.isPositions = 3;
331335
});
332336
} else if (layerP.lights.header.isPositions == 0 && layerP.lights.header.nrOfLights) { // send to UI

src/MoonLight/Nodes/Drivers/D_AudioSync.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
class AudioSyncDriver : public Node {
1818
public:
19-
static const char* name() { return "AudioSync"; }
19+
static const char* name() { return "Audio Sync"; }
2020
static uint8_t dim() { return _NoD; }
2121
static const char* tags() { return "☸️♫"; }
2222

@@ -26,14 +26,20 @@ 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;
2935
init = false;
3036
return;
3137
}
3238

3339
if (!init) {
3440
sync.begin();
3541
init = true;
36-
EXT_LOGI(ML_TAG, "AudioSync: Initialized");
42+
EXT_LOGI(ML_TAG, "Audio Sync: Initialized");
3743
}
3844

3945
if (sync.read()) {
@@ -42,7 +48,7 @@ class AudioSyncDriver : public Node {
4248
sharedData.volumeRaw = sync.volumeRaw;
4349
sharedData.majorPeak = sync.FFT_MajorPeak;
4450
// if (audio.bands[0] > 0) {
45-
// EXT_LOGV(ML_TAG, "AudioSync: %d %f", audio.bands[0], audio.volume);
51+
// EXT_LOGV(ML_TAG, "Audio Sync: %d %f", audio.bands[0], audio.volume);
4652
// }
4753
}
4854
}

src/MoonLight/Nodes/Drivers/D_Infrared.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,7 @@ class IRDriver : public Node {
353353
if (combined_code == codeOff || combined_code == codeOn) { // Lights on/off
354354
newState["lightsOn"] = state.data["lightsOn"].as<bool>() ? false : true;
355355
} else if (combined_code == codePaletteInc) { // palette increase
356-
newState["palette"] = min(state.data["palette"].as<uint8_t>() + 1, 8); // to do: replace 8 with max palette count
356+
newState["palette"] = min(state.data["palette"].as<uint8_t>() + 1, 10); // to do: replace 8 with max palette count
357357
} else if (combined_code == codePaletteDec) { // palette decrease
358358
newState["palette"] = max(state.data["palette"].as<uint8_t>() - 1, 0);
359359
} else if (combined_code == codePresetDec) { // next button - go to previous preset

0 commit comments

Comments
 (0)