esp32-sk6812/src/UDPProto.cpp

121 lines
2.3 KiB
C++

#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;
}