diff --git a/src/cmnds/cmd_newLEDDriver.c b/src/cmnds/cmd_newLEDDriver.c index e086b29be..2b3607c8b 100644 --- a/src/cmnds/cmd_newLEDDriver.c +++ b/src/cmnds/cmd_newLEDDriver.c @@ -3,6 +3,7 @@ #include "../new_pins.h" #include "../new_cfg.h" #include "../obk_config.h" +#include "../driver/drv_public.h" #include "../rgb2hsv.h" #include #include "cmd_local.h" @@ -217,8 +218,13 @@ void LED_SetEnableAll(int bEnable) { apply_smart_light(); + DRV_DGR_OnLedEnableAllChange(bEnable); + MQTT_PublishMain_StringInt("led_enableAll",g_lightEnableAll); } +int LED_GetEnableAll() { + return g_lightEnableAll; +} static int enableAll(const void *context, const char *cmd, const char *args, int cmdFlags){ //if (!wal_strnicmp(cmd, "POWERALL", 8)){ int bEnable; @@ -237,11 +243,15 @@ static int enableAll(const void *context, const char *cmd, const char *args, int //} //return 0; } - +float LED_GetDimmer() { + return g_brightness / g_cfg_brightnessMult; +} void LED_SetDimmer(int iVal) { g_brightness = iVal * g_cfg_brightnessMult; + DRV_DGR_OnLedDimmerChange(iVal); + apply_smart_light(); sendDimmerChange(); if(CFG_HasFlag(OBK_FLAG_MQTT_BROADCASTLEDPARAMSTOGETHER)) { diff --git a/src/cmnds/cmd_public.h b/src/cmnds/cmd_public.h index 06a23e44d..ea703e99b 100644 --- a/src/cmnds/cmd_public.h +++ b/src/cmnds/cmd_public.h @@ -60,6 +60,10 @@ void EventHandlers_ProcessVariableChange_Integer(byte eventCode, int oldValue, i int taslike_commands_init(); // cmd_newLEDDriver.c int NewLED_InitCommands(); +float LED_GetDimmer(); +void LED_SetDimmer(int iVal); +void LED_SetEnableAll(int bEnable); +int LED_GetEnableAll(); // cmd_test.c int fortest_commands_init(); // cmd_channels.c diff --git a/src/devicegroups/deviceGroups_public.h b/src/devicegroups/deviceGroups_public.h index 88409d744..627eda925 100644 --- a/src/devicegroups/deviceGroups_public.h +++ b/src/devicegroups/deviceGroups_public.h @@ -17,7 +17,7 @@ typedef struct dgrCallbacks_s { void (*processBrightnessPowerOn)(byte brightness); void (*processLightBrightness)(byte brightness); void (*processRGBCW)(byte r, byte g, byte b, byte c, byte w); - + int (*checkSequence)(int seq); } dgrCallbacks_t; typedef struct dgrGroupDef_s { @@ -31,7 +31,7 @@ typedef struct dgrDevice_s { dgrCallbacks_t cbs; } dgrDevice_t; -int DGR_Parse(const byte *data, int len, dgrDevice_t *dev); +int DGR_Parse(const byte *data, int len, dgrDevice_t *dev, struct sockaddr *addr); int DGR_Quick_FormatPowerState(byte *buffer, int maxSize, const char *groupName, int sequence, int flags, int channels, int numChannels); int DGR_Quick_FormatBrightness(byte *buffer, int maxSize, const char *groupName, int sequence, int flags, byte brightness); diff --git a/src/devicegroups/deviceGroups_read.c b/src/devicegroups/deviceGroups_read.c index f21c2c708..f6c76a25b 100644 --- a/src/devicegroups/deviceGroups_read.c +++ b/src/devicegroups/deviceGroups_read.c @@ -2,10 +2,11 @@ #include "deviceGroups_local.h" #include "../bitmessage/bitmessage_public.h" #include "../logging/logging.h" +#include "lwip/inet.h" -int DGR_Parse(const byte *data, int len, dgrDevice_t *dev) { +int DGR_Parse(const byte *data, int len, dgrDevice_t *dev, struct sockaddr *addr) { bitMessage_t msg; char groupName[32]; int sequence, flags, type; @@ -33,8 +34,17 @@ int DGR_Parse(const byte *data, int len, dgrDevice_t *dev) { sequence = MSG_ReadU16(&msg); flags = MSG_ReadU16(&msg); + // ack, not supported yet + if(flags == 8) { + return 1; + } - addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DGR_Parse: seq %i, flags %i\n",sequence, flags); + if(dev->cbs.checkSequence(sequence)) { + return 1; + } + + + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DGR_Parse: [%s] seq %i, flags %i\n",inet_ntoa(((struct sockaddr_in *)addr)->sin_addr),sequence, flags); while(MSG_EOF(&msg)==0) { type = MSG_ReadByte(&msg); addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"Next section - %i\n",type); diff --git a/src/driver/drv_public.h b/src/driver/drv_public.h index b8c7369e7..8983c05f8 100644 --- a/src/driver/drv_public.h +++ b/src/driver/drv_public.h @@ -11,6 +11,10 @@ void DRV_StopDriver(const char *name); bool DRV_IsRunning(const char *name); void DRV_OnChannelChanged(int channel,int iVal); void SM2135_Write(byte *rgbcw); +void DRV_DGR_OnLedDimmerChange(int iVal); +void DRV_DGR_OnLedEnableAllChange(int iVal); + + diff --git a/src/driver/drv_tasmotaDeviceGroups.c b/src/driver/drv_tasmotaDeviceGroups.c index d4b65d988..4f9451867 100644 --- a/src/driver/drv_tasmotaDeviceGroups.c +++ b/src/driver/drv_tasmotaDeviceGroups.c @@ -36,6 +36,19 @@ int port = 4447; // return 0; //} +byte Val255ToVal100(byte v){ + float fr; + // convert to our 0-100 range + fr = v / 255.0f; + v = fr * 100; + return v; +} +byte Val100ToVal255(byte v){ + float fr; + fr = v / 100.0f; + v = fr * 255; + return v; +} static int g_dgr_socket_receive = -1; static int g_dgr_socket_send = -1; static int g_dgr_send_seq = 0; @@ -215,13 +228,6 @@ void DRV_DGR_processPower(int relayStates, byte relaysCount) { } } } -byte Val255ToVal100(byte v){ - float fr; - // convert to our 0-100 range - fr = v / 255.0f; - v = fr * 100; - return v; -} void DRV_DGR_processBrightnessPowerOn(byte brightness) { addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DRV_DGR_processBrightnessPowerOn: %i\n",(int)brightness); @@ -240,8 +246,49 @@ void DRV_DGR_processLightBrightness(byte brightness) { LED_SetDimmer(Val255ToVal100(brightness)); } -void DRV_DGR_RunFrame() { +typedef struct dgrMmember_s { struct sockaddr_in addr; + int lastSeq; +} dgrMember_t; + +#define MAX_DGR_MEMBERS 32 +static dgrMember_t g_dgrMembers[MAX_DGR_MEMBERS]; +static int g_curDGRMembers = 0; +static struct sockaddr_in addr; + +dgrMember_t *findMember() { + int i; + for(i = 0; i < g_curDGRMembers; i++) { + if(!memcmp(&g_dgrMembers[i].addr, &addr,sizeof(addr))) { + return &g_dgrMembers[i]; + } + } + i = g_curDGRMembers; + if(i>=MAX_DGR_MEMBERS) + return 0; + memcpy(&g_dgrMembers[i].addr,&addr,sizeof(addr)); + return &g_dgrMembers[i]; +} + +int DGR_CheckSequence(int seq) { + dgrMember_t *m; + + m = findMember(); + + if(m == 0) + return 1; + if(seq > m->lastSeq) { + m->lastSeq = seq; + return 0; + } + if(seq + 4 < m->lastSeq) { + // hard reset + m->lastSeq = seq; + return 0; + } + return 1; +} +void DRV_DGR_RunFrame() { dgrDevice_t def; char msgbuf[64]; @@ -274,8 +321,9 @@ void DRV_DGR_RunFrame() { def.cbs.processLightBrightness = DRV_DGR_processLightBrightness; def.cbs.processPower = DRV_DGR_processPower; def.cbs.processRGBCW = DRV_DGR_processRGBCW; + def.cbs.checkSequence = DGR_CheckSequence; - DGR_Parse(msgbuf, nbytes, &def); + DGR_Parse(msgbuf, nbytes, &def, &addr); //DGR_Parse(msgbuf, nbytes); // puts(msgbuf); } @@ -332,6 +380,30 @@ int CMD_DGR_SendPower(const void *context, const char *cmd, const char *args, in return 1; } +void DRV_DGR_OnLedDimmerChange(int iVal) { + //addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DRV_DGR_OnLedDimmerChange: called\n"); + if(g_dgr_socket_receive==0) { + return; + } + if((CFG_DeviceGroups_GetSendFlags() & DGR_SHARE_LIGHT_BRI)==0) { + + return; + } + + //addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DRV_DGR_OnLedDimmerChange: will send Brightness\n"); + DRV_DGR_Send_Brightness(CFG_DeviceGroups_GetName(),Val100ToVal255(iVal)); +} +void DRV_DGR_OnLedEnableAllChange(int iVal) { + if(g_dgr_socket_receive==0) { + return; + } + if((CFG_DeviceGroups_GetSendFlags() & DGR_SHARE_POWER)==0) { + + return; + } + + DRV_DGR_Send_Power(CFG_DeviceGroups_GetName(),iVal,1); +} void DRV_DGR_OnChannelChanged(int ch, int value) { int channelValues; int channelsCount; @@ -355,8 +427,10 @@ void DRV_DGR_OnChannelChanged(int ch, int value) { } } } + if(channelsCount>0){ + DRV_DGR_Send_Power(groupName,channelValues,channelsCount); + } - DRV_DGR_Send_Power(groupName,channelValues,channelsCount); } @@ -380,6 +454,7 @@ int CMD_DGR_SendBrightness(const void *context, const char *cmd, const char *arg } void DRV_DGR_Init() { + memset(&g_dgrMembers[0],0,sizeof(g_dgrMembers)); #if 0 DRV_DGR_StartThread(); #else diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index 6e75a81f5..f496f91b5 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -117,9 +117,14 @@ int h_isChannelRelay(int tg_ch) { } return false; } + + int http_fn_index(http_request_t *request) { int j, i; char tmpA[128]; + int bRawPWMs; + + bRawPWMs = 0; http_setup(request, httpMimeTypeHTML); poststr(request,htmlHeader); @@ -290,7 +295,8 @@ int http_fn_index(http_request_t *request) { poststr(request, ""); } } - else if(h_isChannelPWM(i) || (channelType == ChType_Dimmer)) { + else if((bRawPWMs&&h_isChannelPWM(i)) || (channelType == ChType_Dimmer)) { + // PWM and dimmer both use a slider control const char *inputName = h_isChannelPWM(i) ? "pwm" : "dim"; int pwmValue; @@ -310,6 +316,63 @@ int http_fn_index(http_request_t *request) { poststr(request,""); } } + if(bRawPWMs == 0) { + int c_pwms; + + c_pwms = PIN_CountPinsWithRole(IOR_PWM); + + if(c_pwms > 0) { + const char *c; + if(CHANNEL_Check(i)) { + c = "bgrn"; + } else { + c = "bred"; + } + poststr(request, ""); + poststr(request,"
"); + hprintf128(request,"",SPECIAL_CHANNEL_LEDPOWER); + hprintf128(request,"
",c,SPECIAL_CHANNEL_LEDPOWER); + poststr(request, ""); + } + + if(c_pwms > 0) { + int pwmValue; + const char *inputName; + + inputName = "dim"; + + pwmValue = LED_GetDimmer(); + + poststr(request, ""); + hprintf128(request,"
",SPECIAL_CHANNEL_BRIGHTNESS); + hprintf128(request,"",inputName,SPECIAL_CHANNEL_BRIGHTNESS,pwmValue); + hprintf128(request,"",inputName,SPECIAL_CHANNEL_BRIGHTNESS); + hprintf128(request,"
",SPECIAL_CHANNEL_BRIGHTNESS); + + + poststr(request,""); + poststr(request, ""); + } + if(c_pwms == 1) { + // nothing else + } else if(c_pwms == 2) { + // TODO: temperature slider + } else if(c_pwms == 3) { + // TODO: RGB sliders + + } else if(c_pwms == 4) { + // TODO: RGBW sliders? + + } else if(c_pwms == 5) { + + } + + } poststr(request, ""); #ifndef OBK_DISABLE_ALL_DRIVERS DRV_AppendInformationToHTTPIndexPage(request); diff --git a/src/new_pins.c b/src/new_pins.c index 14d529bed..cd65619f9 100644 --- a/src/new_pins.c +++ b/src/new_pins.c @@ -518,6 +518,15 @@ void CHANNEL_Set(int ch, int iVal, int iFlags) { bForce = iFlags & CHANNEL_SET_FLAG_FORCE; bSilent = iFlags & CHANNEL_SET_FLAG_SILENT; + // special channels + if(ch == SPECIAL_CHANNEL_LEDPOWER) { + LED_SetEnableAll(iVal); + return; + } + if(ch == SPECIAL_CHANNEL_BRIGHTNESS) { + LED_SetDimmer(iVal); + return; + } if(ch < 0 || ch >= CHANNEL_MAX) { //if(bMustBeSilent==0) { addLogAdv(LOG_ERROR, LOG_FEATURE_GENERAL,"CHANNEL_Set: Channel index %i is out of range <0,%i)\n\r",ch,CHANNEL_MAX); @@ -590,6 +599,11 @@ int CHANNEL_FindMaxValueForChannel(int ch) { void CHANNEL_Toggle(int ch) { int prev; + // special channels + if(ch == SPECIAL_CHANNEL_LEDPOWER) { + LED_SetEnableAll(!LED_GetEnableAll()); + return; + } if(ch < 0 || ch >= CHANNEL_MAX) { addLogAdv(LOG_ERROR, LOG_FEATURE_GENERAL,"CHANNEL_Toggle: Channel index %i is out of range <0,%i)\n\r",ch,CHANNEL_MAX); return; diff --git a/src/new_pins.h b/src/new_pins.h index b9fd0bfbc..08746722d 100644 --- a/src/new_pins.h +++ b/src/new_pins.h @@ -64,6 +64,9 @@ enum ChannelType { #define CHANNEL_MAX 64 +#define SPECIAL_CHANNEL_BRIGHTNESS 129 +#define SPECIAL_CHANNEL_LEDPOWER 130 + typedef struct pinsState_s { // All above values are indexed by physical pin index // (so we assume we have maximum of 32 pins)