Files
WLED/usermods/udp_name_sync/udp_name_sync.cpp
netmindz 2082b01a3c Apply suggestions from code review
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2025-08-21 08:53:11 +01:00

81 lines
2.5 KiB
C++

#include "wled.h"
class UdpNameSync : public Usermod {
private:
bool enabled = false;
bool initDone = false;
unsigned long lastTime = 0;
char segmentName[WLED_MAX_SEGNAME_LEN] = {0};
static const char _name[];
static const char _enabled[];
public:
/**
* Enable/Disable the usermod
*/
inline void enable(bool enable) { enabled = enable; }
/**
* Get usermod enabled/disabled state
*/
inline bool isEnabled() { return enabled; }
void setup() override {
initDone = true;
}
void loop() override {
if (!WLED_CONNECTED) return;
if (!udpConnected) return;
Segment& mainseg = strip.getMainSegment();
if (!strlen(segmentName) && !mainseg.name) return; //name was never set, do nothing
IPAddress broadcastIp = ~uint32_t(Network.subnetMask()) | uint32_t(Network.gatewayIP());
byte udpOut[WLED_MAX_SEGNAME_LEN + 2];
udpOut[0] = 2; // 0: wled notifier protocol, 1: warls protocol, 2 is free
if (strlen(segmentName) && !mainseg.name) { //name is back to null
notifierUdp.beginPacket(broadcastIp, udpPort);
strcpy(segmentName,"");
DEBUG_PRINTLN(F("UdpNameSync: sending Null name"));
notifierUdp.write( udpOut , 2);
notifierUdp.endPacket();
return;
}
const char* curName = mainseg.name ? mainseg.name : "";
if (strcmp(curName, segmentName) == 0) return; // same name, do nothing
notifierUdp.beginPacket(broadcastIp, udpPort);
DEBUG_PRINT(F("UdpNameSync: saving segment name "));
DEBUG_PRINTLN(mainseg.name);
size_t length = strlen(mainseg.name);
strlcpy(segmentName, mainseg.name, sizeof(segmentName));
strlcpy((char *)&udpOut[1], segmentName, sizeof(udpOut) - 1); // leave room for header byte
notifierUdp.write(udpOut, 2 + strnlen((char *)&udpOut[1], sizeof(udpOut) - 1));
notifierUdp.endPacket();
DEBUG_PRINT(F("UdpNameSync: Sent segment name : "));
DEBUG_PRINTLN(segmentName);
}
bool onUdpPacket(uint8_t * payload, uint8_t len) override {
DEBUG_PRINT(F("UdpNameSync: Received packet"));
if (payload[0] != 2) return false;
//else
Segment& mainseg = strip.getMainSegment();
mainseg.setName((char *)&payload[1]);
DEBUG_PRINT(F("UdpNameSync: set segment name"));
return true;
}
};
// add more strings here to reduce flash memory usage
const char UdpNameSync::_name[] PROGMEM = "UdpNameSync";
const char UdpNameSync::_enabled[] PROGMEM = "enabled";
static UdpNameSync udp_name_sync;
REGISTER_USERMOD(udp_name_sync);