#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) { m_udpServer.flush(); 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 packets_processed = 0; bool done_something = false; int32_t seq = -1; while(packets_processed < MAX_PACKETS_PER_UPDATE) { 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; case END_OF_UPDATE: packets_processed = MAX_PACKETS_PER_UPDATE; break; case ACK_REQUEST: seq = ((int32_t)r) << 8 | (int32_t)g; default: break; } } // send a reply, to the IP address and port that sent us the packet we received if(seq >= 0) { uint8_t data[2]; data[0] = (seq >> 8) & 0xFF; data[1] = seq & 0xFF; m_udpServer.beginPacket(m_udpServer.remoteIP(), m_udpServer.remotePort()); m_udpServer.write(data, 2); m_udpServer.endPacket(); } m_udpServer.flush(); done_something = true; } else { break; } } return done_something; }