Improve TPM2.NET code
Add support for receiving TPM2.NET packets out of order, and hopefully prevent crashes if faced with protocol errors
This commit is contained in:
parent
62a795bd3b
commit
ce446dac92
@ -219,6 +219,8 @@ void handleNotifications()
|
|||||||
//TPM2.NET
|
//TPM2.NET
|
||||||
if (udpIn[0] == 0x9c)
|
if (udpIn[0] == 0x9c)
|
||||||
{
|
{
|
||||||
|
//WARNING: this code assumes that the final TMP2.NET payload is evenly distributed if using multiple packets (ie. frame size is constant)
|
||||||
|
//if the number of LEDs in your installation doesn't allow that, please include padding bytes at the end of the last packet
|
||||||
byte tpmType = udpIn[1];
|
byte tpmType = udpIn[1];
|
||||||
if (tpmType == 0xaa) { //TPM2.NET polling, expect answer
|
if (tpmType == 0xaa) { //TPM2.NET polling, expect answer
|
||||||
sendTPM2Ack(); return;
|
sendTPM2Ack(); return;
|
||||||
@ -229,18 +231,26 @@ void handleNotifications()
|
|||||||
realtimeLock(realtimeTimeoutMs, REALTIME_MODE_TPM2NET);
|
realtimeLock(realtimeTimeoutMs, REALTIME_MODE_TPM2NET);
|
||||||
if (realtimeOverride) return;
|
if (realtimeOverride) return;
|
||||||
|
|
||||||
uint16_t frameSize = (udpIn[2] << 8) + udpIn[3];
|
tpmPacketCount++; //increment the packet count
|
||||||
|
if (tpmPacketCount == 1) tpmPayloadFrameSize = (udpIn[2] << 8) + udpIn[3]; //save frame size for the whole payload if this is the first packet
|
||||||
byte packetNum = udpIn[4]; //starts with 1!
|
byte packetNum = udpIn[4]; //starts with 1!
|
||||||
byte numPackets = udpIn[5];
|
byte numPackets = udpIn[5];
|
||||||
|
|
||||||
uint16_t id = ((tpmFirstFrameSize/3)*(packetNum-1)) / 3; //start LED
|
uint16_t id = (tpmPayloadFrameSize/3)*(packetNum-1); //start LED
|
||||||
for (uint16_t i = 6; i < frameSize + 4; i += 3)
|
for (uint16_t i = 6; i < tpmPayloadFrameSize + 4; i += 3)
|
||||||
{
|
{
|
||||||
setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], 0);
|
if (id < ledCount)
|
||||||
id++; if (id >= ledCount) break;
|
{
|
||||||
|
setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], 0);
|
||||||
|
id++;
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
if (tpmPacketCount == numPackets) //reset packet count and show if all packets were received
|
||||||
|
{
|
||||||
|
tpmPacketCount = 0;
|
||||||
|
strip.show();
|
||||||
}
|
}
|
||||||
if (packetNum == 1) tpmFirstFrameSize = frameSize;
|
|
||||||
if (packetNum == numPackets) {strip.show(); } //show if last packet
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//UDP realtime: 1 warls 2 drgb 3 drgbw
|
//UDP realtime: 1 warls 2 drgb 3 drgbw
|
||||||
|
@ -428,7 +428,8 @@ WLED_GLOBAL byte realtimeMode _INIT(REALTIME_MODE_INACTIVE);
|
|||||||
WLED_GLOBAL byte realtimeOverride _INIT(REALTIME_OVERRIDE_NONE);
|
WLED_GLOBAL byte realtimeOverride _INIT(REALTIME_OVERRIDE_NONE);
|
||||||
WLED_GLOBAL IPAddress realtimeIP _INIT((0, 0, 0, 0));
|
WLED_GLOBAL IPAddress realtimeIP _INIT((0, 0, 0, 0));
|
||||||
WLED_GLOBAL unsigned long realtimeTimeout _INIT(0);
|
WLED_GLOBAL unsigned long realtimeTimeout _INIT(0);
|
||||||
WLED_GLOBAL uint16_t tpmFirstFrameSize _INIT(0);
|
WLED_GLOBAL uint8_t tpmPacketCount _INIT(0);
|
||||||
|
WLED_GLOBAL uint16_t tpmPayloadFrameSize _INIT(0);
|
||||||
|
|
||||||
// mqtt
|
// mqtt
|
||||||
WLED_GLOBAL long lastMqttReconnectAttempt _INIT(0);
|
WLED_GLOBAL long lastMqttReconnectAttempt _INIT(0);
|
||||||
|
Loading…
Reference in New Issue
Block a user