From 24bf7316a90d41a79c43dcb24b228cbb8941fdc8 Mon Sep 17 00:00:00 2001 From: Andrey Klimov Date: Sun, 19 Jan 2020 23:59:05 +0300 Subject: [PATCH] Smooth DMX fadind for DUE --- build-flags/build_flags_due-5500 | 1 + build-flags/build_flags_lighthub21 | 1 + lighthub/dmx.cpp | 60 ++++++++++++++++++++++++++++-- lighthub/dmx.h | 33 ++++++++++++++++ lighthub/item.cpp | 2 +- lighthub/main.cpp | 8 ++-- lighthub/options.h | 4 ++ platformio.ini | 1 + 8 files changed, 102 insertions(+), 8 deletions(-) diff --git a/build-flags/build_flags_due-5500 b/build-flags/build_flags_due-5500 index a16f6e6..b8f9dd6 100644 --- a/build-flags/build_flags_due-5500 +++ b/build-flags/build_flags_due-5500 @@ -1,2 +1,3 @@ -DWiz5500 -DARTNET_ENABLE +-DDMX_SMOOTH diff --git a/build-flags/build_flags_lighthub21 b/build-flags/build_flags_lighthub21 index c6abf0d..34e4ee1 100644 --- a/build-flags/build_flags_lighthub21 +++ b/build-flags/build_flags_lighthub21 @@ -1,3 +1,4 @@ -DWiz5500 -DW5500_CS_PIN=53 -DARTNET_ENABLE +-DDMX_SMOOTH diff --git a/lighthub/dmx.cpp b/lighthub/dmx.cpp index 41d86bc..43941dd 100644 --- a/lighthub/dmx.cpp +++ b/lighthub/dmx.cpp @@ -21,6 +21,7 @@ e-mail anklimov@gmail.com //#include //#include #include "options.h" +#include "item.h" #ifdef _dmxin #if defined(ARDUINO_ARCH_AVR) @@ -35,6 +36,13 @@ DMXESPSerial dmxout; #endif uint8_t * DMXin = NULL; + +#ifdef DMX_SMOOTH +uint8_t * DMXinterimBuf = NULL; +uint16_t DMXOUT_Channels=0; +uint32_t checkTimestamp=0L; +#endif + int D_State=0; unsigned long D_checkT=0; @@ -61,16 +69,16 @@ int itemCtrl2(char* name,int r,int g, int b, int w) short itemaddr = aJson.getArrayItem(itemArr,1)->valueint; switch (itemtype){ #ifdef _dmxout - case 0: //Dimmed light + case CH_DIMMER: //Dimmed light DmxWrite(itemaddr, w); break; - case 1: //Colour RGBW + case CH_RGBW: //Colour RGBW DmxWrite(itemaddr+3, w); - case 2: // RGB + case CH_RGB: // RGB { DmxWrite(itemaddr, r); @@ -79,7 +87,7 @@ int itemCtrl2(char* name,int r,int g, int b, int w) break; } #endif - case 7: //Group + case CH_GROUP: //Group aJsonObject *groupArr= aJson.getArrayItem(itemArr, 1); if (groupArr && (groupArr->type==aJson_Array)) { aJsonObject *i =groupArr->child; @@ -162,6 +170,7 @@ for (short tch=0; tch<=3 ; tch++) { // CHSV hsv; // CRGB rgb; +DMXOUT_propagate(); #if defined(_dmxin) short t,tch; @@ -251,8 +260,42 @@ dmxout.setTxMaxChannels(channels); #ifndef DMX_DISABLE for (int i=1;i<=channels;i++) DmxWrite(i,0); #endif + +#ifdef DMX_SMOOTH +if (DMXinterimBuf) delete DMXinterimBuf; +DMXinterimBuf = new uint8_t [channels]; +DMXOUT_Channels=channels; +for (int i=1;i<=channels;i++) DMXinterimBuf[i]=0; +#endif } +void DMXOUT_propagate() +{ + #ifdef DMX_SMOOTH + uint32_t now = millis(); + if (now> 4; + if (!step) step=1; + + if (delta<0) + DmxWrite2(i,currLevel+step); + + if (delta>0) + DmxWrite2(i,currLevel-step); + } + } + checkTimestamp=now+DMX_SMOOTH_DELAY; + #endif +} + + void ArtnetSetup() { #ifdef _artnet @@ -261,3 +304,12 @@ void ArtnetSetup() if (artnet) artnet->setArtDmxCallback(onDmxFrame); #endif } + + +void DmxWriteBuf(uint16_t chan,uint8_t val) +{ +#ifdef DMX_SMOOTH +if (chan && chan<=DMXOUT_Channels) + DMXinterimBuf[chan-1] = val; +#endif +} diff --git a/lighthub/dmx.h b/lighthub/dmx.h index ca239bf..82b9445 100644 --- a/lighthub/dmx.h +++ b/lighthub/dmx.h @@ -32,6 +32,35 @@ e-mail anklimov@gmail.com #if defined(_dmxout) +#if defined DMX_SMOOTH + +#if defined(ARDUINO_ARCH_AVR) +#include +#define DmxWrite DmxSimple.write +//#define DmxWrite DmxWriteBuf +#endif + +#if defined(ESP8266) +#include +extern DMXESPSerial dmxout; +#define DmxWrite dmxout.write +//#define DmxWrite DmxWriteBuf +#endif + +#if defined(ARDUINO_ARCH_ESP32) +#include +extern DMXESPSerial dmxout; +#define DmxWrite dmxout.write +//#define DmxWrite DmxWriteBuf +#endif + +#if defined(__SAM3X8E__) +#include +#define DmxWrite2 dmxout.write +#define DmxWrite DmxWriteBuf +#endif + +#else #if defined(ARDUINO_ARCH_AVR) #include #define DmxWrite DmxSimple.write @@ -52,6 +81,8 @@ extern DMXESPSerial dmxout; #if defined(__SAM3X8E__) #include #define DmxWrite dmxout.write +#endif + #endif #endif @@ -78,3 +109,5 @@ void ArtnetSetup(); void DMXCheck(void); int itemCtrl2(char* name,int r,int g, int b, int w); void ArtnetSetup(); +void DmxWriteBuf(uint16_t chan,uint8_t val); +void DMXOUT_propagate(); diff --git a/lighthub/item.cpp b/lighthub/item.cpp index 3c7ec85..a11bee9 100644 --- a/lighthub/item.cpp +++ b/lighthub/item.cpp @@ -189,7 +189,7 @@ Item::Item(char *name) //Constructor { char* sub; if (sub=strchr(name,'/')) { - char buf [MQTT_SUBJECT_LENGTH]; + char buf [MQTT_SUBJECT_LENGTH+1]; short i; for(i=0;(name[i] && (name[i]!='/') && (i=1 ) { - DMXoutSetup(maxChannels = aJson.getArrayItem(dmxoutArr, 1)->valueint); + if (dmxoutArr && (numParams=aJson.getArraySize(dmxoutArr)) >=1 ) { + DMXoutSetup(maxChannels = aJson.getArrayItem(dmxoutArr, numParams-1)->valueint); debugSerial<