#include "Fader.h" #include "UDPProto.h" #define WS2801_CMD_LEN 7 UDPProto::UDPProto(Fader *fader) : m_fader(fader) { } bool UDPProto::start(uint16_t port) { Serial.print("UDPProto: Starting UDP server on port "); Serial.println(port); if(!m_udpServer.begin(port)) { Serial.println("UDPProto: UDP server start FAILED!"); return false; } Serial.println("UDPProto: setup done"); return true; } bool UDPProto::check(void) { int packetSize = m_udpServer.parsePacket(); if(packetSize) { byte buf[1024]; int len; while((len = m_udpServer.read(buf, 1024)) == 1024) { // do nothing } m_udpServer.endPacket(); return true; } else { return false; } } bool UDPProto::loop(void) { byte cmd[WS2801_CMD_LEN]; byte action, strip, module, r, g, b, w; int len; int packetSize = m_udpServer.parsePacket(); if(packetSize) { // read the packet into packetBufffer while((len = m_udpServer.read(cmd, WS2801_CMD_LEN)) == WS2801_CMD_LEN) { action = cmd[0]; strip = cmd[1]; module = cmd[2]; r = cmd[3]; g = cmd[4]; b = cmd[5]; w = cmd[6]; Fader::Color color{r,g,b,w}; if(strip >= m_fader->strips()) { // strip index out of range continue; } if(module >= m_fader->modules_per_strip()) { // module index out of range continue; } switch(action) { case SET_COLOUR: m_fader->set_color(strip, module, color); break; case FADE_COLOUR: m_fader->fade_color(strip, module, color); break; case ADD_COLOUR: m_fader->add_color(strip, module, color); break; case SET_FADESTEP: m_fader->set_fadestep(r); // red channel contains the fadestep in this case break; default: break; } } // send a reply, to the IP address and port that sent us the packet we received /* ws2801UDP.beginPacket(ws2801UDP.remoteIP(), ws2801UDP.remotePort()); ws2801UDP.write("OK\n"); */ m_udpServer.endPacket(); return true; // processed a packet } else { return false; } }