Added TPM2.NET protocol support

pull/941/head
cschwinne 2020-05-18 16:36:31 +02:00
rodzic 579f355852
commit fec8343f45
9 zmienionych plików z 158 dodań i 116 usunięć

Wyświetl plik

@ -212,7 +212,7 @@ build_flags = ${common.build_flags_esp8266}
[env:d1_mini] [env:d1_mini]
board = d1_mini board = d1_mini
platform = ${common.platform_latest} platform = ${common.platform_latest}
upload_speed = 921500 upload_speed = 921600
board_build.ldscript = ${common.ldscript_4m1m} board_build.ldscript = ${common.ldscript_4m1m}
build_flags = ${common.build_flags_esp8266} build_flags = ${common.build_flags_esp8266}

Wyświetl plik

@ -44,6 +44,7 @@
#define REALTIME_MODE_E131 4 #define REALTIME_MODE_E131 4
#define REALTIME_MODE_ADALIGHT 5 #define REALTIME_MODE_ADALIGHT 5
#define REALTIME_MODE_ARTNET 6 #define REALTIME_MODE_ARTNET 6
#define REALTIME_MODE_TPM2NET 7
//realtime override modes //realtime override modes
#define REALTIME_OVERRIDE_NONE 0 #define REALTIME_OVERRIDE_NONE 0

Wyświetl plik

@ -110,11 +110,7 @@ bool deserializeState(JsonObject root)
presetCycleMin = ccnf["min"] | presetCycleMin; presetCycleMin = ccnf["min"] | presetCycleMin;
presetCycleMax = ccnf["max"] | presetCycleMax; presetCycleMax = ccnf["max"] | presetCycleMax;
tr = ccnf["time"] | -1; tr = ccnf["time"] | -1;
if (tr >= 2) if (tr >= 2) presetCycleTime = tr;
{
presetCycleTime = tr;
presetCycleTime *= 100;
}
JsonObject nl = root["nl"]; JsonObject nl = root["nl"];
nightlightActive = nl["on"] | nightlightActive; nightlightActive = nl["on"] | nightlightActive;
@ -237,11 +233,11 @@ void serializeState(JsonObject root)
root["pss"] = savedPresets; root["pss"] = savedPresets;
root["pl"] = (presetCyclingEnabled) ? 0: -1; root["pl"] = (presetCyclingEnabled) ? 0: -1;
//temporary for preser cycle //temporary for preset cycle
JsonObject ccnf = root.createNestedObject("ccnf"); JsonObject ccnf = root.createNestedObject("ccnf");
ccnf["min"] = presetCycleMin; ccnf["min"] = presetCycleMin;
ccnf["max"] = presetCycleMax; ccnf["max"] = presetCycleMax;
ccnf["time"] = presetCycleTime/100; ccnf["time"] = presetCycleTime;
JsonObject nl = root.createNestedObject("nl"); JsonObject nl = root.createNestedObject("nl");
nl["on"] = nightlightActive; nl["on"] = nightlightActive;
@ -321,6 +317,7 @@ void serializeInfo(JsonObject root)
case REALTIME_MODE_E131: root["lm"] = "E1.31"; break; case REALTIME_MODE_E131: root["lm"] = "E1.31"; break;
case REALTIME_MODE_ADALIGHT: root["lm"] = F("USB Adalight"); case REALTIME_MODE_ADALIGHT: root["lm"] = F("USB Adalight");
case REALTIME_MODE_ARTNET: root["lm"] = "Art-Net"; break; case REALTIME_MODE_ARTNET: root["lm"] = "Art-Net"; break;
case REALTIME_MODE_TPM2NET: root["lm"] = F("tpm2.net"); break;
} }
if (realtimeIP[0] == 0) if (realtimeIP[0] == 0)

Wyświetl plik

@ -251,11 +251,12 @@ void handleNightlight()
} }
//also handle preset cycle here //also handle preset cycle here
if (presetCyclingEnabled && (millis() - presetCycledTime > presetCycleTime)) if (presetCyclingEnabled && (millis() - presetCycledTime > (100*presetCycleTime)))
{ {
if (presetCycCurr < presetCycleMin) presetCycCurr = presetCycleMin;
applyPreset(presetCycCurr,presetApplyBri); applyPreset(presetCycCurr,presetApplyBri);
presetCycCurr++; if (presetCycCurr > presetCycleMax) presetCycCurr = presetCycleMin; presetCycCurr++; if (presetCycCurr > presetCycleMax) presetCycCurr = presetCycleMin;
if (presetCycCurr > 25) presetCycCurr = 1; if (presetCycCurr > 16) presetCycCurr = 1;
colorUpdated(NOTIFIER_CALL_MODE_PRESET_CYCLE); colorUpdated(NOTIFIER_CALL_MODE_PRESET_CYCLE);
presetCycledTime = millis(); presetCycledTime = millis();
} }

Wyświetl plik

@ -468,7 +468,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req)
pos = req.indexOf("PT="); //sets cycle time in ms pos = req.indexOf("PT="); //sets cycle time in ms
if (pos > 0) { if (pos > 0) {
int v = getNumVal(&req, pos); int v = getNumVal(&req, pos);
if (v > 49) presetCycleTime = v; if (v > 100) presetCycleTime = v/100;
} }
pos = req.indexOf("PA="); //apply brightness from preset pos = req.indexOf("PA="); //apply brightness from preset

Wyświetl plik

@ -1,7 +1,7 @@
#include "wled.h" #include "wled.h"
/* /*
* UDP sync notifier * UDP sync notifier / Realtime / Hyperion / TPM2.NET
*/ */
#define WLEDPACKETSIZE 29 #define WLEDPACKETSIZE 29
@ -89,6 +89,16 @@ void realtimeLock(uint32_t timeoutMs, byte md)
} }
#define TMP2NET_OUT_PORT 65442
void sendTPM2Ack() {
notifierUdp.beginPacket(notifierUdp.remoteIP(), TMP2NET_OUT_PORT);
uint8_t response_ack = 0xac;
notifierUdp.write(&response_ack, 1);
notifierUdp.endPacket();
}
void handleNotifications() void handleNotifications()
{ {
//send second notification if enabled //send second notification if enabled
@ -139,122 +149,152 @@ void handleNotifications()
} }
//notifier and UDP realtime //notifier and UDP realtime
if (packetSize > UDP_IN_MAXSIZE) return; if (!packetSize || packetSize > UDP_IN_MAXSIZE) return;
if(packetSize && notifierUdp.remoteIP() != WiFi.localIP()) //don't process broadcasts we send ourselves if (notifierUdp.remoteIP() == WiFi.localIP()) return; //don't process broadcasts we send ourselves
uint8_t udpIn[packetSize];
notifierUdp.read(udpIn, packetSize);
//wled notifier, block if realtime packets active
if (udpIn[0] == 0 && !realtimeMode && receiveNotifications)
{ {
uint8_t udpIn[packetSize]; //ignore notification if received within a second after sending a notification ourselves
notifierUdp.read(udpIn, packetSize); if (millis() - notificationSentTime < 1000) return;
if (udpIn[1] > 199) return; //do not receive custom versions
//wled notifier, block if realtime packets active bool someSel = (receiveNotificationBrightness || receiveNotificationColor || receiveNotificationEffects);
if (udpIn[0] == 0 && !realtimeMode && receiveNotifications) //apply colors from notification
if (receiveNotificationColor || !someSel)
{ {
//ignore notification if received within a second after sending a notification ourselves col[0] = udpIn[3];
if (millis() - notificationSentTime < 1000) return; col[1] = udpIn[4];
if (udpIn[1] > 199) return; //do not receive custom versions col[2] = udpIn[5];
if (udpIn[11] > 0) //sending module's white val is intended
bool someSel = (receiveNotificationBrightness || receiveNotificationColor || receiveNotificationEffects);
//apply colors from notification
if (receiveNotificationColor || !someSel)
{ {
col[0] = udpIn[3]; col[3] = udpIn[10];
col[1] = udpIn[4]; if (udpIn[11] > 1)
col[2] = udpIn[5];
if (udpIn[11] > 0) //sending module's white val is intended
{ {
col[3] = udpIn[10]; colSec[0] = udpIn[12];
if (udpIn[11] > 1) colSec[1] = udpIn[13];
{ colSec[2] = udpIn[14];
colSec[0] = udpIn[12]; colSec[3] = udpIn[15];
colSec[1] = udpIn[13]; }
colSec[2] = udpIn[14]; if (udpIn[11] > 5)
colSec[3] = udpIn[15]; {
} uint32_t t = (udpIn[25] << 24) | (udpIn[26] << 16) | (udpIn[27] << 8) | (udpIn[28]);
if (udpIn[11] > 5) t += 2;
{ t -= millis();
uint32_t t = (udpIn[25] << 24) | (udpIn[26] << 16) | (udpIn[27] << 8) | (udpIn[28]); strip.timebase = t;
t += 2; }
t -= millis(); if (udpIn[11] > 6)
strip.timebase = t; {
} strip.setColor(2, udpIn[20], udpIn[21], udpIn[22], udpIn[23]); //tertiary color
if (udpIn[11] > 6)
{
strip.setColor(2, udpIn[20], udpIn[21], udpIn[22], udpIn[23]); //tertiary color
}
} }
} }
}
//apply effects from notification //apply effects from notification
if (udpIn[11] < 200 && (receiveNotificationEffects || !someSel)) if (udpIn[11] < 200 && (receiveNotificationEffects || !someSel))
{
if (udpIn[8] < strip.getModeCount()) effectCurrent = udpIn[8];
effectSpeed = udpIn[9];
if (udpIn[11] > 2) effectIntensity = udpIn[16];
if (udpIn[11] > 4 && udpIn[19] < strip.getPaletteCount()) effectPalette = udpIn[19];
}
if (udpIn[11] > 3)
{
transitionDelayTemp = ((udpIn[17] << 0) & 0xFF) + ((udpIn[18] << 8) & 0xFF00);
}
nightlightActive = udpIn[6];
if (nightlightActive) nightlightDelayMins = udpIn[7];
if (receiveNotificationBrightness || !someSel) bri = udpIn[2];
colorUpdated(NOTIFIER_CALL_MODE_NOTIFICATION);
} else if (udpIn[0] > 0 && udpIn[0] < 5 && receiveDirect) //1 warls //2 drgb //3 drgbw
{ {
realtimeIP = notifierUdp.remoteIP(); if (udpIn[8] < strip.getModeCount()) effectCurrent = udpIn[8];
DEBUG_PRINTLN(notifierUdp.remoteIP()); effectSpeed = udpIn[9];
if (packetSize < 2) return; if (udpIn[11] > 2) effectIntensity = udpIn[16];
if (udpIn[11] > 4 && udpIn[19] < strip.getPaletteCount()) effectPalette = udpIn[19];
}
if (udpIn[1] == 0) if (udpIn[11] > 3)
{ {
realtimeTimeout = 0; transitionDelayTemp = ((udpIn[17] << 0) & 0xFF) + ((udpIn[18] << 8) & 0xFF00);
return; }
} else {
realtimeLock(udpIn[1]*1000 +1, REALTIME_MODE_UDP); nightlightActive = udpIn[6];
} if (nightlightActive) nightlightDelayMins = udpIn[7];
if (receiveNotificationBrightness || !someSel) bri = udpIn[2];
colorUpdated(NOTIFIER_CALL_MODE_NOTIFICATION);
}
if (!receiveDirect) return;
//TPM2.NET
if (udpIn[0] == 0x9c)
{
byte tpmType = udpIn[1];
if (tpmType == 0xaa) { //TPM2.NET polling, expect answer
sendTPM2Ack(); return;
}
if (tpmType == 0xda) { //TPM2.NET data
realtimeIP = notifierUdp.remoteIP();
realtimeLock(realtimeTimeoutMs, REALTIME_MODE_TPM2NET);
if (realtimeOverride) return; if (realtimeOverride) return;
if (udpIn[0] == 1) //warls uint16_t frameSize = (udpIn[2] << 8) + udpIn[3];
{ byte packetNum = udpIn[4]; //starts with 1!
for (uint16_t i = 2; i < packetSize -3; i += 4) byte numPackets = udpIn[5];
{
setRealtimePixel(udpIn[i], udpIn[i+1], udpIn[i+2], udpIn[i+3], 0);
}
} else if (udpIn[0] == 2) //drgb
{
uint16_t id = 0;
for (uint16_t i = 2; i < packetSize -2; i += 3)
{
setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], 0);
id++; if (id >= ledCount) break; uint16_t id = tpmDataReceived / 3; //start LED
} for (uint16_t i = 6; i < frameSize + 4; i += 3)
} else if (udpIn[0] == 3) //drgbw
{ {
uint16_t id = 0; setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], 0);
for (uint16_t i = 2; i < packetSize -3; i += 4) id++; if (id >= ledCount) break;
{
setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], udpIn[i+3]);
id++; if (id >= ledCount) break;
}
} else if (udpIn[0] == 4) //dnrgb
{
uint16_t id = ((udpIn[3] << 0) & 0xFF) + ((udpIn[2] << 8) & 0xFF00);
for (uint16_t i = 4; i < packetSize -2; i += 3)
{
if (id >= ledCount) break;
setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], 0);
id++;
}
} }
strip.show(); tpmDataReceived += frameSize;
if (packetNum == numPackets) {strip.show(); tpmDataReceived = 0;} //show if last packet
} }
} }
//UDP realtime: 1 warls 2 drgb 3 drgbw
if (udpIn[0] > 0 && udpIn[0] < 5)
{
realtimeIP = notifierUdp.remoteIP();
DEBUG_PRINTLN(notifierUdp.remoteIP());
if (packetSize < 2) return;
if (udpIn[1] == 0)
{
realtimeTimeout = 0;
return;
} else {
realtimeLock(udpIn[1]*1000 +1, REALTIME_MODE_UDP);
}
if (realtimeOverride) return;
if (udpIn[0] == 1) //warls
{
for (uint16_t i = 2; i < packetSize -3; i += 4)
{
setRealtimePixel(udpIn[i], udpIn[i+1], udpIn[i+2], udpIn[i+3], 0);
}
} else if (udpIn[0] == 2) //drgb
{
uint16_t id = 0;
for (uint16_t i = 2; i < packetSize -2; i += 3)
{
setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], 0);
id++; if (id >= ledCount) break;
}
} else if (udpIn[0] == 3) //drgbw
{
uint16_t id = 0;
for (uint16_t i = 2; i < packetSize -3; i += 4)
{
setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], udpIn[i+3]);
id++; if (id >= ledCount) break;
}
} else if (udpIn[0] == 4) //dnrgb
{
uint16_t id = ((udpIn[3] << 0) & 0xFF) + ((udpIn[2] << 8) & 0xFF00);
for (uint16_t i = 4; i < packetSize -2; i += 3)
{
if (id >= ledCount) break;
setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], 0);
id++;
}
}
strip.show();
}
} }

Wyświetl plik

@ -8,7 +8,7 @@
*/ */
// version code in format yymmddb (b = daily build) // version code in format yymmddb (b = daily build)
#define VERSION 2005100 #define VERSION 2005180
// ESP8266-01 (blue) got too little storage space to work with all features of WLED. To use it, you must use ESP8266 Arduino Core v2.4.2 and the setting 512K(No SPIFFS). // ESP8266-01 (blue) got too little storage space to work with all features of WLED. To use it, you must use ESP8266 Arduino Core v2.4.2 and the setting 512K(No SPIFFS).
@ -415,7 +415,7 @@ WLED_GLOBAL bool blynkEnabled _INIT(false);
// preset cycling // preset cycling
WLED_GLOBAL bool presetCyclingEnabled _INIT(false); WLED_GLOBAL bool presetCyclingEnabled _INIT(false);
WLED_GLOBAL byte presetCycleMin _INIT(1), presetCycleMax _INIT(5); WLED_GLOBAL byte presetCycleMin _INIT(1), presetCycleMax _INIT(5);
WLED_GLOBAL uint16_t presetCycleTime _INIT(1250); WLED_GLOBAL uint16_t presetCycleTime _INIT(12);
WLED_GLOBAL unsigned long presetCycledTime _INIT(0); WLED_GLOBAL unsigned long presetCycledTime _INIT(0);
WLED_GLOBAL byte presetCycCurr _INIT(presetCycleMin); WLED_GLOBAL byte presetCycCurr _INIT(presetCycleMin);
WLED_GLOBAL bool presetApplyBri _INIT(true); WLED_GLOBAL bool presetApplyBri _INIT(true);
@ -426,6 +426,7 @@ 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 tpmDataReceived _INIT(0);
// mqtt // mqtt
WLED_GLOBAL long lastMqttReconnectAttempt _INIT(0); WLED_GLOBAL long lastMqttReconnectAttempt _INIT(0);

Wyświetl plik

@ -7,7 +7,7 @@
*/ */
//eeprom Version code, enables default settings instead of 0 init on update //eeprom Version code, enables default settings instead of 0 init on update
#define EEPVER 20 #define EEPVER 21
//0 -> old version, default //0 -> old version, default
//1 -> 0.4p 1711272 and up //1 -> 0.4p 1711272 and up
//2 -> 0.4p 1711302 and up //2 -> 0.4p 1711302 and up
@ -29,6 +29,7 @@
//18-> 0.9.1-e131 //18-> 0.9.1-e131
//19-> 0.9.1n //19-> 0.9.1n
//20-> 0.9.1p //20-> 0.9.1p
//21-> 0.10.1p
void commit() void commit()
{ {
@ -547,6 +548,7 @@ void loadSettingsFromEEPROM(bool first)
{ {
presetCyclingEnabled = EEPROM.read(2205); presetCyclingEnabled = EEPROM.read(2205);
presetCycleTime = EEPROM.read(2206) + ((EEPROM.read(2207) << 8) & 0xFF00); presetCycleTime = EEPROM.read(2206) + ((EEPROM.read(2207) << 8) & 0xFF00);
if (lastEEPROMversion < 21) presetCycleTime /= 100; //was stored in ms, now is in tenths of a second
presetCycleMin = EEPROM.read(2208); presetCycleMin = EEPROM.read(2208);
presetCycleMax = EEPROM.read(2209); presetCycleMax = EEPROM.read(2209);
presetApplyBri = EEPROM.read(2210); presetApplyBri = EEPROM.read(2210);

Wyświetl plik

@ -77,7 +77,7 @@ char* XML_response(AsyncWebServerRequest *request, char* dest)
mesg += "."; mesg += ".";
mesg += realtimeIP[i]; mesg += realtimeIP[i];
} }
} else if (realtimeMode == REALTIME_MODE_UDP || realtimeMode == REALTIME_MODE_HYPERION) { } else if (realtimeMode == REALTIME_MODE_UDP || realtimeMode == REALTIME_MODE_HYPERION || realtimeMode == REALTIME_MODE_TPM2NET) {
mesg += "UDP from "; mesg += "UDP from ";
mesg += realtimeIP[0]; mesg += realtimeIP[0];
for (int i = 1; i < 4; i++) for (int i = 1; i < 4; i++)