Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
language: "en-US"

review:
enable_review: true
enable_fix_suggestions: true
enable_tests_generation: false

context:
timeout_ms: 900000 # 15 minutes max
early_access: true
reviews:
profile: "chill"
request_changes_workflow: true
high_level_summary: true
poem: true
review_status: true
collapse_walkthrough: false
auto_review:
enabled: true
drafts: true
tools:
github-checks:
timeout_ms: 900000 # 15 minutes max
chat:
auto_reply: true
88 changes: 75 additions & 13 deletions src/MoonBase/Modules/ModuleDevices.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,58 @@

#include "MoonBase/Module.h"
#include "MoonBase/Utilities.h"
#include "MoonBase/pal.h"

struct UDPMessage {
uint8_t rommel[6];
Char<32> name;
Char<32> version;
uint32_t uptime;
uint8_t brightness;
uint8_t palette;
uint8_t preset;
};

class ModuleDevices : public Module {
public:
NetworkUDP deviceUDP;
uint16_t deviceUDPPort = 65506;
bool deviceUDPConnected = false;
Module* _moduleLightsControl;

ModuleDevices(PsychicHttpServer* server, ESP32SvelteKit* sveltekit, Module* moduleLightsControl) : Module("devices", server, sveltekit) {
EXT_LOGV(MB_TAG, "constructor");
_moduleLightsControl = moduleLightsControl;

_moduleLightsControl->addUpdateHandler([this](const String& originId) {
if (deviceUDP.beginPacket(IPAddress(255, 255, 255, 255), deviceUDPPort)) {
UDPMessage message{}; // {}: zero message
message.name = esp32sveltekit.getWiFiSettingsService()->getHostname().c_str();
message.version = APP_VERSION;
_moduleLightsControl->read(
[&](ModuleState& state) {
message.brightness = state.data["brightness"];
message.palette = state.data["palette"];
message.preset = state.data["preset"]["selected"];
String ddd;
serializeJson(state.data["preset"], ddd);
EXT_LOGD(MB_TAG, "pr %s", ddd.c_str());
},
_moduleName);

EXT_LOGD(MB_TAG, "b: %d pa %d pr %d", message.brightness, message.palette, message.preset);
message.uptime = time(nullptr) - pal::millis() / 1000;
deviceUDP.write((uint8_t*)&message, sizeof(message));
deviceUDP.endPacket();

// IPAddress activeIP = WiFi.isConnected() ? WiFi.localIP() : ETH.localIP();
// // EXT_LOGD(MB_TAG, "UDP packet written (%s -> %d)", message.name.c_str(), activeIP[3]);
// updateDevices(message, activeIP);
}
});

ModuleDevices(PsychicHttpServer* server, ESP32SvelteKit* sveltekit) : Module("devices", server, sveltekit) { EXT_LOGV(MB_TAG, "constructor"); }
// writeUDP(); }, false);
}

void setupDefinition(const JsonArray& controls) override {
EXT_LOGV(MB_TAG, "");
Expand All @@ -44,10 +83,15 @@ class ModuleDevices : public Module {
addControl(rows, "ip", "ip", 0, 32, true);
addControl(rows, "time", "time", 0, 32, true);
addControl(rows, "mac", "text", 0, 32, true);
addControl(rows, "version", "text", 0, 32, true);
addControl(rows, "uptime", "time", 0, 32, true);
addControl(rows, "brightness", "slider", 0, 255);
addControl(rows, "palette", "slider", 0, 71);
addControl(rows, "preset", "slider", 0, 64);
}
}

void loop1s() {
void loop20ms() {
if (!WiFi.localIP() && !ETH.localIP()) return;

if (!deviceUDPConnected) return;
Expand All @@ -68,7 +112,7 @@ class ModuleDevices : public Module {
writeUDP(); // and updateDevices with own device
}

void updateDevices(const char* name, IPAddress ip) {
void updateDevices(const UDPMessage& message, IPAddress ip) {
// EXT_LOGD(ML_TAG, "updateDevices ...%d %s", ip[3], name);
if (_state.data["devices"].isNull()) _state.data["devices"].to<JsonArray>();

Expand All @@ -90,12 +134,17 @@ class ModuleDevices : public Module {
}
if (device.isNull()) {
device = devices.add<JsonObject>();
EXT_LOGD(ML_TAG, "added ...%d %s", ip[3], name);
EXT_LOGD(ML_TAG, "added ...%d %s", ip[3], message.name);
device["ip"] = ip.toString();
}

device["name"] = name; // name can change
device["time"] = time(nullptr); // time will change, triggering update
device["name"] = message.name;
device["version"] = message.version;
device["uptime"] = message.uptime;
device["brightness"] = message.brightness;
device["palette"] = message.palette;
device["preset"] = message.preset;

if (!_socket->getConnectedClients()) return; // no need to update if no clients

Expand All @@ -118,26 +167,39 @@ class ModuleDevices : public Module {
}

void readUDP() {
size_t packetSize = deviceUDP.parsePacket();
if (packetSize >= sizeof(UDPMessage)) { // WLED has 44, MM has 38 ATM
char buffer[packetSize];
deviceUDP.read(buffer, packetSize);
// EXT_LOGD(ML_TAG, "UDP packet read from %d: %s (%d)", deviceUDP.remoteIP()[3], buffer + 6, packetSize);

updateDevices(buffer + 6, deviceUDP.remoteIP());
while (size_t packetSize = deviceUDP.parsePacket()) {
if (packetSize >= 38) { // WLED has 44, MM had ! 38
char buffer[packetSize];
UDPMessage message;
deviceUDP.read(buffer, packetSize);
memcpy(&message, buffer, ::min(packetSize, sizeof(message)));
// EXT_LOGD(ML_TAG, "UDP packet read from %d: %s (%d)", deviceUDP.remoteIP()[3], buffer + 6, packetSize);

updateDevices(message, deviceUDP.remoteIP());
}
}
}

void writeUDP() {
if (deviceUDP.beginPacket(IPAddress(255, 255, 255, 255), deviceUDPPort)) {
UDPMessage message;
message.name = esp32sveltekit.getWiFiSettingsService()->getHostname().c_str();
message.version = APP_VERSION;
_moduleLightsControl->read(
[&](ModuleState& state) {
message.brightness = state.data["brightness"];
message.palette = state.data["palette"];
message.preset = state.data["preset"]["selected"];
},
_moduleName);

message.uptime = time(nullptr) ? time(nullptr) - pal::millis() / 1000 : pal::millis() / 1000;
deviceUDP.write((uint8_t*)&message, sizeof(message));
deviceUDP.endPacket();

IPAddress activeIP = WiFi.isConnected() ? WiFi.localIP() : ETH.localIP();
// EXT_LOGD(MB_TAG, "UDP packet written (%s -> %d)", message.name.c_str(), activeIP[3]);
updateDevices(message.name.c_str(), activeIP);
updateDevices(message, activeIP);
}
}
};
Expand Down
1 change: 1 addition & 0 deletions src/MoonLight/Modules/ModuleLightsControl.h
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,7 @@ class ModuleLightsControl : public Module {
return;
}

//get board preset info
moduleIO.read(
[&](ModuleState& state) {
pinRelayLightsOn = UINT8_MAX;
Expand Down
51 changes: 28 additions & 23 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,6 @@ ESP32SvelteKit esp32sveltekit(&server, NROF_END_POINTS); // 🌙 pio variable
#include "MoonBase/Modules/ModuleTasks.h"

FileManager fileManager = FileManager(&server, &esp32sveltekit);
ModuleDevices moduleDevices = ModuleDevices(&server, &esp32sveltekit);
ModuleTasks moduleTasks = ModuleTasks(&server, &esp32sveltekit);
ModuleIO moduleIO = ModuleIO(&server, &esp32sveltekit);

Expand All @@ -101,6 +100,7 @@ ModuleIO moduleIO = ModuleIO(&server, &esp32sveltekit);
#include "MoonLight/Modules/ModuleLightsControl.h"
#include "MoonLight/Modules/ModuleMoonLightInfo.h"
ModuleLightsControl moduleLightsControl = ModuleLightsControl(&server, &esp32sveltekit, &fileManager, &moduleIO);
ModuleDevices moduleDevices = ModuleDevices(&server, &esp32sveltekit, &moduleLightsControl);
ModuleEffects moduleEffects = ModuleEffects(&server, &esp32sveltekit, &fileManager); // fileManager for Live Scripts
ModuleDrivers moduleDrivers = ModuleDrivers(&server, &esp32sveltekit, &fileManager, &moduleLightsControl, &moduleIO); // fileManager for Live Scripts, Lights control for drivers
#if FT_ENABLED(FT_LIVESCRIPT)
Expand Down Expand Up @@ -361,37 +361,42 @@ void setup() {
esp32sveltekit.addLoopFunction([]() {
for (Module* module : modules) module->loop();

// every second
static unsigned long lastSecond = 0;
if (millis() - lastSecond >= 1000) {
lastSecond = millis();
static unsigned long last20ms = 0;
if (millis() - last20ms >= 20) {
last20ms = millis();
moduleDevices.loop20ms();

moduleIO.loop1s();
moduleDevices.loop1s();
moduleTasks.loop1s();
// every second
static unsigned long lastSecond = 0;
if (millis() - lastSecond >= 1000) {
lastSecond = millis();

// logYield();
moduleIO.loop1s();
moduleTasks.loop1s();

// logYield();

#if FT_ENABLED(FT_MOONLIGHT)
// set shared data (eg used in scrolling text effect)
sharedData.fps = esp32sveltekit.getAnalyticsService()->lps;
sharedData.connectionStatus = (uint8_t)esp32sveltekit.getConnectionStatus();
sharedData.clientListSize = esp32sveltekit.getServer()->getClientList().size();
sharedData.connectedClients = esp32sveltekit.getSocket()->getConnectedClients();
sharedData.activeClients = esp32sveltekit.getSocket()->getActiveClients();
// set shared data (eg used in scrolling text effect)
sharedData.fps = esp32sveltekit.getAnalyticsService()->lps;
sharedData.connectionStatus = (uint8_t)esp32sveltekit.getConnectionStatus();
sharedData.clientListSize = esp32sveltekit.getServer()->getClientList().size();
sharedData.connectedClients = esp32sveltekit.getSocket()->getConnectedClients();
sharedData.activeClients = esp32sveltekit.getSocket()->getActiveClients();

#if FT_ENABLED(FT_LIVESCRIPT)
moduleLiveScripts.loop1s();
moduleLiveScripts.loop1s();
#endif
#endif
}

// every 10 seconds
static unsigned long last10Second = 0;
if (millis() - last10Second >= 10000) {
last10Second = millis();

// every 10 seconds
static unsigned long last10Second = 0;
if (millis() - last10Second >= 10000) {
last10Second = millis();

moduleDevices.loop10s();
moduleDevices.loop10s();
}
}
}
});

Expand Down
Loading