Implemented UDP protocol

This protocol is used for high performance updates of the LEDs.
This commit is contained in:
Thomas Kolb 2019-11-17 17:57:21 +01:00
parent 926ea316f7
commit b155ab1eb1
3 changed files with 121 additions and 1 deletions

25
include/UDPProto.h Normal file
View file

@ -0,0 +1,25 @@
#pragma once
#include <WiFiUdp.h>
class Fader;
class UDPProto
{
public:
enum {
SET_COLOUR = 0,
FADE_COLOUR = 1,
ADD_COLOUR = 2,
SET_FADESTEP = 3
};
UDPProto(Fader *fader);
bool start(uint16_t port);
bool loop(void);
private:
WiFiUDP m_udpServer;
Fader *m_fader;
};

89
src/UDPProto.cpp Normal file
View file

@ -0,0 +1,89 @@
#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::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;
}
}

View file

@ -7,6 +7,7 @@
#include "WLAN_Logins.h"
#include "HTTPServer.h"
#include "Fader.h"
#include "UDPProto.h"
#include <esp32_digital_led_lib.h>
#include <esp32_digital_led_funcs.h>
@ -26,7 +27,8 @@ size_t frame;
WiFiMulti WiFiMulti;
Fader ledFader(NUM_LEDS);
Fader ledFader(NUM_STRIPS, NUM_LEDS);
UDPProto udpProto(&ledFader);
bool initLEDs()
{
@ -84,6 +86,8 @@ static void ledTask( void * parameter )
uint32_t start_time = micros();
udpProto.loop();
led_idx++;
if(led_idx >= STRANDS[0].numPixels) {
led_idx = 0;
@ -174,6 +178,8 @@ void setup()
HTTPServer::instance().setFader(&ledFader);
udpProto.start(2703);
ledFader.set_color(Fader::Color{64,0,0,0});
ledFader.fade_color(Fader::Color{0,64,0,0});