diff --git a/src/bitmessage/bitmessage_public.h b/src/bitmessage/bitmessage_public.h new file mode 100644 index 000000000..79117bb99 --- /dev/null +++ b/src/bitmessage/bitmessage_public.h @@ -0,0 +1,27 @@ +#include "../new_common.h" + +typedef struct bitMessage_s { + byte *data; + int position; + int totalSize; +} bitMessage_t; + +// bitmessage_read.c +void MSG_BeginReading(bitMessage_t *msg, byte *data, int dataSize); +int MSG_ReadString(bitMessage_t *msg, char *out, int outBufferSize); +int MSG_SkipBytes(bitMessage_t *msg, int c); +int MSG_CheckAndSkip(bitMessage_t *msg, const char *s, int len); +unsigned short MSG_ReadU16(bitMessage_t *msg); +byte MSG_ReadByte(bitMessage_t *msg); +int MSG_Read3Bytes(bitMessage_t *msg); +int MSG_EOF(bitMessage_t *msg); +const char *MSG_GetStringPointerAtCurrentPosition(bitMessage_t *msg); + +// bitmessage_write.c +void MSG_BeginWriting(bitMessage_t *msg, byte *data, int dataSize); +int MSG_WriteBytes(bitMessage_t *msg, void *p, int numBytes); +int MSG_WriteString(bitMessage_t *msg, const char *s); +int MSG_WriteU16(bitMessage_t *msg, unsigned short s); +int MSG_WriteByte(bitMessage_t *msg, byte s); +int MSG_Write3Bytes(bitMessage_t *msg, int s); + diff --git a/src/bitmessage/bitmessage_read.c b/src/bitmessage/bitmessage_read.c new file mode 100644 index 000000000..bb6b1faec --- /dev/null +++ b/src/bitmessage/bitmessage_read.c @@ -0,0 +1,92 @@ +#include "bitmessage_public.h" + + + +void MSG_BeginReading(bitMessage_t *msg, byte *data, int dataSize) { + msg->position = 0; + msg->totalSize = dataSize; + msg->data = data; +} +const char *MSG_GetStringPointerAtCurrentPosition(bitMessage_t *msg) { + const char *r = (const char*)(msg->data+msg->position); + return r; +} +int MSG_SkipBytes(bitMessage_t *msg, int c) { + if(msg->position + c > msg->totalSize) + return 0; + msg->position += c; + return c; +} +int MSG_ReadString(bitMessage_t *msg, char *out, int outBufferSize) { + const char *start; + + start = (const char*)(msg->data + msg->position); + while(1) { + if(msg->position >= msg->totalSize) { + return -1; + } + if(msg->data[msg->position] == 0) { + msg->position++; + break; + } + msg->position++; + } + + strcpy_safe(out, start,outBufferSize); + return strlen(out); +} +unsigned short MSG_ReadU16(bitMessage_t *msg) { + unsigned short ret; + + if(msg->position + sizeof(unsigned short) > msg->totalSize) + return 0; + + ret = *(unsigned short*)(msg->data + msg->position); + + msg->position += sizeof(unsigned short); + + return ret; +} +int MSG_Read3Bytes(bitMessage_t *msg) { + int ret = 0; + + if(msg->position + 3 > msg->totalSize) + return 0; + + memcpy(&ret,msg->data + msg->position, 3); + + msg->position += 3; + + return ret; + +} +byte MSG_ReadByte(bitMessage_t *msg) { + byte ret; + + if(msg->position + sizeof(byte) > msg->totalSize) + return 0; + + ret = *(byte*)(msg->data + msg->position); + + msg->position += sizeof(byte); + + return ret; +} +int MSG_CheckAndSkip(bitMessage_t *msg, const char *s, int len) { + int i; + if(msg->position + len > msg->totalSize) + return 0; + for(i = 0; i < len; i++) { + if(msg->data[msg->position+i] != s[i]) + return 0; + } + msg->position += len; + return len; +} +int MSG_EOF(bitMessage_t *msg) { + if(msg->position >= msg->totalSize) + return 1; + return 0; +} + + diff --git a/src/bitmessage/bitmessage_write.c b/src/bitmessage/bitmessage_write.c new file mode 100644 index 000000000..35483206d --- /dev/null +++ b/src/bitmessage/bitmessage_write.c @@ -0,0 +1,28 @@ +#include "bitmessage_public.h" + +void MSG_BeginWriting(bitMessage_t *msg, byte *data, int dataSize) { + msg->position = 0; + msg->totalSize = dataSize; + msg->data = data; +} + +int MSG_WriteBytes(bitMessage_t *msg, void *p, int numBytes) { + if(msg->position + numBytes >= msg->totalSize) + return 0; + memcpy(msg->data + msg->position,p,numBytes); + msg->position += numBytes; + return numBytes; +} +int MSG_WriteString(bitMessage_t *msg, const char *s) { + return MSG_WriteBytes(msg,s,strlen(s)+1); +} +int MSG_WriteU16(bitMessage_t *msg, unsigned short s) { + return MSG_WriteBytes(msg,&s, sizeof(s)); +} +int MSG_WriteByte(bitMessage_t *msg, byte s) { + return MSG_WriteBytes(msg,&s, sizeof(s)); +} + +int MSG_Write3Bytes(bitMessage_t *msg, int s) { + return MSG_WriteBytes(msg,&s, 3); +} diff --git a/src/cmnds/cmd_newLEDDriver.c b/src/cmnds/cmd_newLEDDriver.c index 1f6511b29..8bbd3b1a6 100644 --- a/src/cmnds/cmd_newLEDDriver.c +++ b/src/cmnds/cmd_newLEDDriver.c @@ -192,16 +192,22 @@ static int temperature(const void *context, const char *cmd, const char *args, i //} //return 0; } +void LED_SetEnableAll(int bEnable) { + g_lightEnableAll = bEnable; + + apply_smart_light(); + + MQTT_PublishMain_StringInt("led_enableAll",g_lightEnableAll); +} static int enableAll(const void *context, const char *cmd, const char *args, int cmdFlags){ //if (!wal_strnicmp(cmd, "POWERALL", 8)){ - + int bEnable; ADDLOG_INFO(LOG_FEATURE_CMD, " enableAll (%s) received with args %s",cmd,args); - g_lightEnableAll = parsePowerArgument(args); + bEnable = parsePowerArgument(args); - apply_smart_light(); + LED_SetEnableAll(bEnable); - MQTT_PublishMain_StringInt("led_enableAll",g_lightEnableAll); // sendColorChange(); // sendDimmerChange(); @@ -212,6 +218,14 @@ static int enableAll(const void *context, const char *cmd, const char *args, int //return 0; } +void LED_SetDimmer(int iVal) { + + g_brightness = iVal * g_cfg_brightnessMult; + + apply_smart_light(); + sendDimmerChange(); + +} static int dimmer(const void *context, const char *cmd, const char *args, int cmdFlags){ //if (!wal_strnicmp(cmd, "POWERALL", 8)){ int iVal = 0; @@ -220,10 +234,7 @@ static int dimmer(const void *context, const char *cmd, const char *args, int cm iVal = parsePowerArgument(args); - g_brightness = iVal * g_cfg_brightnessMult; - - apply_smart_light(); - sendDimmerChange(); + LED_SetDimmer(iVal); return 1; //} diff --git a/src/devicegroups/deviceGroups_local.h b/src/devicegroups/deviceGroups_local.h new file mode 100644 index 000000000..ea529bedf --- /dev/null +++ b/src/devicegroups/deviceGroups_local.h @@ -0,0 +1,74 @@ + +#include "../new_common.h" +#include "deviceGroups_public.h" + +#define TASMOTA_DEVICEGROUPS_HEADER "TASMOTA_DGR" + +#define DGR_ITEM_EOL 0 +#define DGR_ITEM_STATUS 1 +#define DGR_ITEM_FLAGS 2 +#define DGR_ITEM_LIGHT_FADE 3 +#define DGR_ITEM_LIGHT_SPEED 4 +#define DGR_ITEM_LIGHT_BRI 5 +#define DGR_ITEM_LIGHT_SCHEME 6 +#define DGR_ITEM_LIGHT_FIXED_COLOR 7 +#define DGR_ITEM_BRI_PRESET_LOW 8 +#define DGR_ITEM_BRI_PRESET_HIGH 9 +#define DGR_ITEM_BRI_POWER_ON 10 +#define DGR_ITEM_LAST_8BIT 11 +#define DGR_ITEM_MAX_8BIT 63 + +#define DGR_ITEM_LAST_16BIT 64 +#define DGR_ITEM_MAX_16BIT 127 + +#define DGR_ITEM_POWER 128 +#define DGR_ITEM_NO_STATUS_SHARE 129 +#define DGR_ITEM_LAST_32BIT 130 +#define DGR_ITEM_MAX_32BIT 191 + +#define DGR_ITEM_EVENT 192 +#define DGR_ITEM_COMMAND 193 +#define DGR_ITEM_LAST_STRING 194 +#define DGR_ITEM_MAX_STRING 223 + +#define DGR_ITEM_LIGHT_CHANNELS 224 +#define DGR_ITEM_LAST_ARRAY 225 +#define DGR_ITEM_MAX_ARRAY 255 + + + +#define DGR_RELAY_NONE 0 +#define DGR_RELAY_1 1 +#define DGR_RELAY_2 2 +#define DGR_RELAY_3 4 +#define DGR_RELAY_4 8 +#define DGR_RELAY_5 16 +#define DGR_RELAY_6 32 +#define DGR_RELAY_7 64 +#define DGR_RELAY_8 128 +#define DGR_RELAY_9 256 +#define DGR_RELAY_10 512 +#define DGR_RELAY_11 1024 +#define DGR_RELAY_12 2048 +#define DGR_RELAY_13 4096 +#define DGR_RELAY_14 8192 +#define DGR_RELAY_15 16384 +#define DGR_RELAY_16 32768 +#define DGR_RELAY_17 65536 +#define DGR_RELAY_18 131072 +#define DGR_RELAY_19 262144 +#define DGR_RELAY_20 524288 +#define DGR_RELAY_21 1048576 +#define DGR_RELAY_22 2097152 +#define DGR_RELAY_23 4194304 +#define DGR_RELAY_24 8388608 + + + + + +u32 DGR_GetMaskForItem(byte item); +int DGR_IsItemInMask(byte item, u32 mask); + + + diff --git a/src/devicegroups/deviceGroups_public.h b/src/devicegroups/deviceGroups_public.h new file mode 100644 index 000000000..0b573516a --- /dev/null +++ b/src/devicegroups/deviceGroups_public.h @@ -0,0 +1,40 @@ +#ifndef __DGR_PUBLIC_H__ +#define __DGR_PUBLIC_H__ + +#include "../new_common.h" + +#define DGR_SHARE_POWER 1 +#define DGR_SHARE_LIGHT_BRI 2 +#define DGR_SHARE_LIGHT_FADE 4 +#define DGR_SHARE_LIGHT_SCHEME 8 +#define DGR_SHARE_LIGHT_COLOR 16 +#define DGR_SHARE_DIMMER_SETTINGS 32 +#define DGR_SHARE_EVENT 64 + +typedef struct dgrCallbacks_s { + void (*processPower)(int relayStates, byte relaysCount); + // they are both sent together by Tasmota devices + void (*processBrightnessPowerOn)(byte brightness); + void (*processLightBrightness)(byte brightness); + +} dgrCallbacks_t; + +typedef struct dgrGroupDef_s { + char groupName[32]; + u32 devGroupShare_In; + u32 devGroupShare_Out; +} dgrGroupDef_t; + +typedef struct dgrDevice_s { + dgrGroupDef_t gr; + dgrCallbacks_t cbs; +} dgrDevice_t; + +int DGR_Parse(const byte *data, int len, dgrDevice_t *dev); + +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); + + + +#endif diff --git a/src/devicegroups/deviceGroups_read.c b/src/devicegroups/deviceGroups_read.c new file mode 100644 index 000000000..8b5e51c92 --- /dev/null +++ b/src/devicegroups/deviceGroups_read.c @@ -0,0 +1,124 @@ +#include "deviceGroups_public.h" +#include "deviceGroups_local.h" +#include "../bitmessage/bitmessage_public.h" +#include "../logging/logging.h" + + + +int DGR_Parse(const byte *data, int len, dgrDevice_t *dev) { + bitMessage_t msg; + char groupName[32]; + int sequence, flags, type; + int bGotEOL = 0; + int relayFlags,i; + byte vals; + byte relaysCnt; + + MSG_BeginReading(&msg,data,len); + + if(MSG_CheckAndSkip(&msg,TASMOTA_DEVICEGROUPS_HEADER,strlen(TASMOTA_DEVICEGROUPS_HEADER))==0) { + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DGR_Parse: data chunk with len %i had bad header\n",len); + return 1; + } + if(MSG_ReadString(&msg,groupName,sizeof(groupName)) <= 0) { + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DGR_Parse: data chunk with len %i failed to read group name\n",len); + return 1; + } + if(dev != 0) { + // right now, only single group support + if(strcmp(dev->gr.groupName,groupName)) { + return -1; + } + } + sequence = MSG_ReadU16(&msg); + flags = MSG_ReadU16(&msg); + + + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DGR_Parse: seq %i, flags %i\n",sequence, flags); + while(MSG_EOF(&msg)==0) { + type = MSG_ReadByte(&msg); + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"Next section - %i\n",type); + if(type == DGR_ITEM_EOL) { + bGotEOL = 1; + } else if(type < DGR_ITEM_MAX_8BIT) { + vals = MSG_ReadByte(&msg); + if(type == DGR_ITEM_BRI_POWER_ON) { + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DGR_ITEM_BRI_POWER_ON: %i\n",vals); + // FORWARD TO PROCESSING BY API + if(dev) { + if(DGR_IsItemInMask(type, dev->gr.devGroupShare_In)) { + dev->cbs.processBrightnessPowerOn(vals); + } + } + } else if(type == DGR_ITEM_LIGHT_BRI) { + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DGR_ITEM_LIGHT_BRI: %i\n",vals); + // FORWARD TO PROCESSING BY API + if(dev) { + if(DGR_IsItemInMask(type, dev->gr.devGroupShare_In)) { + dev->cbs.processLightBrightness(vals); + } + } + } else { + + } + } else if(type < DGR_ITEM_MAX_16BIT) { + MSG_SkipBytes(&msg,2); + } else if(type < DGR_ITEM_MAX_32BIT) { + if(type == DGR_ITEM_POWER) { + int total = 0; + + relayFlags = MSG_Read3Bytes(&msg); + relaysCnt = MSG_ReadByte(&msg); + + // FORWARD TO PROCESSING BY API + if(dev) { + if(DGR_IsItemInMask(type, dev->gr.devGroupShare_In)) { + dev->cbs.processPower(relayFlags,relaysCnt); + } + } + + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"Power event - values %i, numChannels %i, chans=",relayFlags,relaysCnt); + for(i = 0; i < relaysCnt; i++) { + if(BIT_CHECK(relayFlags,i)) { + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"[ON]"); + } else { + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"[OFF]"); + } + } + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"\n"); + } else { + MSG_SkipBytes(&msg,4); + } + } else if(type < DGR_ITEM_MAX_STRING) { + byte sLen = MSG_ReadByte(&msg); + // DevGroupSend 193=Tst + // Gives sLen 4 + if(type == DGR_ITEM_COMMAND) { + const char *cmd = MSG_GetStringPointerAtCurrentPosition(&msg); + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DGR_ITEM_COMMAND: %s\n",cmd); + } + MSG_SkipBytes(&msg,sLen); + } else if(type == DGR_ITEM_LIGHT_CHANNELS) { + byte sLen = MSG_ReadByte(&msg); + if(sLen == 5) { + byte r, g, b, c, w; + r = MSG_ReadByte(&msg); + g = MSG_ReadByte(&msg); + b = MSG_ReadByte(&msg); + c = MSG_ReadByte(&msg); + w = MSG_ReadByte(&msg); + } else { + MSG_SkipBytes(&msg,sLen); + } + } else { + byte sLen = MSG_ReadByte(&msg); + MSG_SkipBytes(&msg,sLen); + } + if(bGotEOL) { + break; + } + } + + + return 0; +} \ No newline at end of file diff --git a/src/devicegroups/deviceGroups_util.c b/src/devicegroups/deviceGroups_util.c new file mode 100644 index 000000000..141dea2e8 --- /dev/null +++ b/src/devicegroups/deviceGroups_util.c @@ -0,0 +1,32 @@ +#include "deviceGroups_local.h" + +u32 DGR_GetMaskForItem(byte item) +{ + u32 mask = 0; + if (item == DGR_ITEM_LIGHT_BRI || item == DGR_ITEM_BRI_POWER_ON) + mask = DGR_SHARE_LIGHT_BRI; + else if (item == DGR_ITEM_POWER) + mask = DGR_SHARE_POWER; + else if (item == DGR_ITEM_LIGHT_SCHEME) + mask = DGR_SHARE_LIGHT_SCHEME; + else if (item == DGR_ITEM_LIGHT_FIXED_COLOR || item == DGR_ITEM_LIGHT_CHANNELS) + mask = DGR_SHARE_LIGHT_COLOR; + else if (item == DGR_ITEM_LIGHT_FADE || item == DGR_ITEM_LIGHT_SPEED) + mask = DGR_SHARE_LIGHT_FADE; + else if (item == DGR_ITEM_BRI_PRESET_LOW || item == DGR_ITEM_BRI_PRESET_HIGH) + mask = DGR_SHARE_DIMMER_SETTINGS; + else if (item == DGR_ITEM_EVENT) + mask = DGR_SHARE_EVENT; + return mask; +} +int DGR_IsItemInMask(byte item, u32 mask) { + u32 itemMask; + + itemMask = DGR_GetMaskForItem(item); + + if(mask & itemMask) + return 1; + return 0; +} + + diff --git a/src/devicegroups/deviceGroups_write.c b/src/devicegroups/deviceGroups_write.c new file mode 100644 index 000000000..4180785a1 --- /dev/null +++ b/src/devicegroups/deviceGroups_write.c @@ -0,0 +1,67 @@ +#include "deviceGroups_local.h" +#include "../bitmessage/bitmessage_public.h" +#include "../logging/logging.h" + +int DGR_BeginWriting(bitMessage_t *msg, const char *groupName, unsigned short sequence, unsigned short flags) { + if(MSG_WriteBytes(msg,TASMOTA_DEVICEGROUPS_HEADER,strlen(TASMOTA_DEVICEGROUPS_HEADER))==0) { + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DGR_BeginWriting: no space for header\n"); + return 1; + } + if(MSG_WriteString(msg,groupName) <= 0) { + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DGR_BeginWriting: no space for group name\n"); + return 1; + } + if(MSG_WriteU16(msg,sequence) <= 0) { + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DGR_BeginWriting: no space for sequence\n"); + return 1; + } + if(MSG_WriteU16(msg,flags) <= 0) { + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DGR_BeginWriting: no space for flags\n"); + return 1; + } + return 0; +} +void DGR_AppendPowerState(bitMessage_t *msg, int numChannels, int channelBits) { + MSG_WriteByte(msg,DGR_ITEM_POWER); + MSG_Write3Bytes(msg,channelBits); + MSG_WriteByte(msg,numChannels); +} +void DGR_AppendColorRGBCW(bitMessage_t *msg, byte r, byte g, byte b, byte c, byte w) { + MSG_WriteByte(msg,DGR_ITEM_LIGHT_CHANNELS); + MSG_WriteByte(msg,5); + MSG_WriteByte(msg,r); + MSG_WriteByte(msg,g); + MSG_WriteByte(msg,b); + MSG_WriteByte(msg,c); + MSG_WriteByte(msg,w); +} +void DGR_AppendDimmer(bitMessage_t *msg, byte dimmValue) { + MSG_WriteByte(msg,DGR_ITEM_LIGHT_BRI); + MSG_WriteByte(msg,dimmValue); +} +void DGR_Finish(bitMessage_t *msg) { + MSG_WriteByte(msg,DGR_ITEM_EOL); + +} + + +int DGR_Quick_FormatPowerState(byte *buffer, int maxSize, const char *groupName, int sequence, int flags, int channels, int numChannels) { + bitMessage_t msg; + MSG_BeginWriting(&msg,buffer,maxSize); + DGR_BeginWriting(&msg,groupName, sequence,flags); + DGR_AppendPowerState(&msg,numChannels,channels); + DGR_Finish(&msg); + return msg.position; +} + +int DGR_Quick_FormatBrightness(byte *buffer, int maxSize, const char *groupName, int sequence,int flags, byte brightness) { + bitMessage_t msg; + MSG_BeginWriting(&msg,buffer,maxSize); + DGR_BeginWriting(&msg,groupName, sequence,flags); + DGR_AppendDimmer(&msg,brightness); + DGR_Finish(&msg); + return msg.position; +} + + + diff --git a/src/driver/drv_bl0937.c b/src/driver/drv_bl0937.c index 983d119b4..243df318f 100644 --- a/src/driver/drv_bl0937.c +++ b/src/driver/drv_bl0937.c @@ -48,7 +48,7 @@ int BL0937_PowerSet(const void *context, const char *cmd, const char *args, int float realPower; if(args==0||*args==0) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"This command needs one argument"); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"This command needs one argument"); return 1; } realPower = atof(args); @@ -56,14 +56,14 @@ int BL0937_PowerSet(const void *context, const char *cmd, const char *args, int { char dbg[128]; sprintf(dbg,"CurrentSet: you gave %f, set ref to %f\n", realPower, calib_p); - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,dbg); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,dbg); } return 0; } int BL0937_PowerRef(const void *context, const char *cmd, const char *args, int cmdFlags) { if(args==0||*args==0) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"This command needs one argument"); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"This command needs one argument"); return 1; } calib_p = atof(args); @@ -72,7 +72,7 @@ int BL0937_PowerRef(const void *context, const char *cmd, const char *args, int int BL0937_CurrentRef(const void *context, const char *cmd, const char *args, int cmdFlags) { if(args==0||*args==0) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"This command needs one argument"); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"This command needs one argument"); return 1; } calib_c = atof(args); @@ -81,7 +81,7 @@ int BL0937_CurrentRef(const void *context, const char *cmd, const char *args, in int BL0937_VoltageRef(const void *context, const char *cmd, const char *args, int cmdFlags) { if(args==0||*args==0) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"This command needs one argument"); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"This command needs one argument"); return 1; } calib_v = atof(args); @@ -91,7 +91,7 @@ int BL0937_VoltageSet(const void *context, const char *cmd, const char *args, in float realV; if(args==0||*args==0) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"This command needs one argument"); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"This command needs one argument"); return 1; } realV = atof(args); @@ -99,7 +99,7 @@ int BL0937_VoltageSet(const void *context, const char *cmd, const char *args, in { char dbg[128]; sprintf(dbg,"CurrentSet: you gave %f, set ref to %f\n", realV, calib_v); - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,dbg); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,dbg); } return 0; @@ -108,7 +108,7 @@ int BL0937_CurrentSet(const void *context, const char *cmd, const char *args, in float realI; if(args==0||*args==0) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"This command needs one argument"); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"This command needs one argument"); return 1; } realI = atof(args); @@ -116,7 +116,7 @@ int BL0937_CurrentSet(const void *context, const char *cmd, const char *args, in { char dbg[128]; sprintf(dbg,"CurrentSet: you gave %f, set ref to %f\n", realI, calib_c); - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,dbg); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,dbg); } return 0; } @@ -164,7 +164,7 @@ void BL0937_RunFrame() { res_p = g_p_pulses; g_p_pulses = 0; - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"Voltage pulses %i, current %i, power %i\n", res_v, res_c, res_p); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"Voltage pulses %i, current %i, power %i\n", res_v, res_c, res_p); final_v = res_v * calib_v; final_c = res_c * calib_c; @@ -172,7 +172,7 @@ void BL0937_RunFrame() { { char dbg[128]; sprintf(dbg,"Voltage %f, current %f, power %f\n", final_v, final_c, final_p); - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,dbg); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,dbg); } BL_ProcessUpdate(final_v,final_c,final_p); diff --git a/src/driver/drv_bl0942.c b/src/driver/drv_bl0942.c index d25f4ff58..edf7ea818 100644 --- a/src/driver/drv_bl0942.c +++ b/src/driver/drv_bl0942.c @@ -51,7 +51,7 @@ int BL0942_TryToGetNextBL0942Packet() { } } if(c_garbage_consumed > 0){ - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"Consumed %i unwanted non-header byte in BL0942 buffer\n", c_garbage_consumed); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"Consumed %i unwanted non-header byte in BL0942 buffer\n", c_garbage_consumed); } if(cs < BL0942_PACKET_LEN) { return 0; @@ -76,11 +76,11 @@ int BL0942_TryToGetNextBL0942Packet() { sprintf(buffer2,"%02X ",UART_GetNextByte(i)); strcat_safe(buffer_for_log,buffer2,sizeof(buffer_for_log)); } - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"BL0942 received: %s\n", buffer_for_log); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"BL0942 received: %s\n", buffer_for_log); } #endif if(checksum != UART_GetNextByte(BL0942_PACKET_LEN-1)) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"Skipping packet with bad checksum %02X wanted %02X\n",checksum,UART_GetNextByte(BL0942_PACKET_LEN-1)); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"Skipping packet with bad checksum %02X wanted %02X\n",checksum,UART_GetNextByte(BL0942_PACKET_LEN-1)); UART_ConsumeBytes(BL0942_PACKET_LEN); return 1; } @@ -93,7 +93,7 @@ int BL0942_TryToGetNextBL0942Packet() { raw_unscaled_freq = (UART_GetNextByte(17) << 8) | UART_GetNextByte(16); // those are not values like 230V, but unscaled - //addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"Unscaled current %d, voltage %d, power %d, freq %d\n", raw_unscaled_current, raw_unscaled_voltage,raw_unscaled_power,raw_unscaled_freq); + //addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"Unscaled current %d, voltage %d, power %d, freq %d\n", raw_unscaled_current, raw_unscaled_voltage,raw_unscaled_power,raw_unscaled_freq); // those are final values, like 230V { @@ -111,7 +111,7 @@ int BL0942_TryToGetNextBL0942Packet() { char res[128]; // V=245.107925,I=109.921143,P=0.035618 sprintf(res,"V=%f,I=%f,P=%f\n",lastReadings[OBK_VOLTAGE],lastReadings[OBK_CURRENT],lastReadings[OBK_POWER]); - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,res ); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,res ); } #endif @@ -129,7 +129,7 @@ int BL0942_PowerSet(const void *context, const char *cmd, const char *args, int float realPower; if(args==0||*args==0) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"This command needs one argument"); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"This command needs one argument"); return 1; } realPower = atof(args); @@ -137,14 +137,14 @@ int BL0942_PowerSet(const void *context, const char *cmd, const char *args, int { char dbg[128]; sprintf(dbg,"CurrentSet: you gave %f, set ref to %f\n", realPower, BL0942_PREF); - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,dbg); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,dbg); } return 0; } int BL0942_PowerRef(const void *context, const char *cmd, const char *args, int cmdFlags) { if(args==0||*args==0) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"This command needs one argument"); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"This command needs one argument"); return 1; } BL0942_PREF = atof(args); @@ -153,7 +153,7 @@ int BL0942_PowerRef(const void *context, const char *cmd, const char *args, int int BL0942_CurrentRef(const void *context, const char *cmd, const char *args, int cmdFlags) { if(args==0||*args==0) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"This command needs one argument"); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"This command needs one argument"); return 1; } BL0942_IREF = atof(args); @@ -162,7 +162,7 @@ int BL0942_CurrentRef(const void *context, const char *cmd, const char *args, in int BL0942_VoltageRef(const void *context, const char *cmd, const char *args, int cmdFlags) { if(args==0||*args==0) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"This command needs one argument"); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"This command needs one argument"); return 1; } BL0942_UREF = atof(args); @@ -172,7 +172,7 @@ int BL0942_VoltageSet(const void *context, const char *cmd, const char *args, in float realV; if(args==0||*args==0) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"This command needs one argument"); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"This command needs one argument"); return 1; } realV = atof(args); @@ -180,7 +180,7 @@ int BL0942_VoltageSet(const void *context, const char *cmd, const char *args, in { char dbg[128]; sprintf(dbg,"CurrentSet: you gave %f, set ref to %f\n", realV, BL0942_UREF); - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,dbg); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,dbg); } return 0; @@ -189,7 +189,7 @@ int BL0942_CurrentSet(const void *context, const char *cmd, const char *args, in float realI; if(args==0||*args==0) { - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"This command needs one argument"); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"This command needs one argument"); return 1; } realI = atof(args); @@ -197,7 +197,7 @@ int BL0942_CurrentSet(const void *context, const char *cmd, const char *args, in { char dbg[128]; sprintf(dbg,"CurrentSet: you gave %f, set ref to %f\n", realI, BL0942_IREF); - addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,dbg); + addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,dbg); } return 0; } @@ -215,7 +215,7 @@ void BL0942_Init() { void BL0942_RunFrame() { int len; - //addLogAdv(LOG_INFO, LOG_FEATURE_BL0942,"UART buffer size %i\n", UART_GetDataSize()); + //addLogAdv(LOG_INFO, LOG_FEATURE_BL09XX,"UART buffer size %i\n", UART_GetDataSize()); len = BL0942_TryToGetNextBL0942Packet(); if(len > 0) { diff --git a/src/driver/drv_bl_shared.c b/src/driver/drv_bl_shared.c index bbc40c216..452cf03d2 100644 --- a/src/driver/drv_bl_shared.c +++ b/src/driver/drv_bl_shared.c @@ -52,8 +52,17 @@ int changeSendAlwaysFrames = 60; void BL09XX_AppendInformationToHTTPIndexPage(http_request_t *request) { char tmp[128]; - sprintf(tmp, "

BL0942 Voltage=%f, Current=%f, Power=%f (changes sent %i, skipped %i)

", - lastReadings[OBK_VOLTAGE],lastReadings[OBK_CURRENT], lastReadings[OBK_POWER], + const char *mode; + + if(DRV_IsRunning("BL0937")) { + mode = "BL0937"; + } else if(DRV_IsRunning("BL0942")) { + mode = "BL0942"; + } else { + mode = "PWR"; + } + sprintf(tmp, "

%s Voltage=%f, Current=%f, Power=%f (changes sent %i, skipped %i)

", + mode, lastReadings[OBK_VOLTAGE],lastReadings[OBK_CURRENT], lastReadings[OBK_POWER], stat_updatesSent, stat_updatesSkipped); hprintf128(request,tmp); diff --git a/src/driver/drv_local.h b/src/driver/drv_local.h index 39a9fc46a..06c4506b4 100644 --- a/src/driver/drv_local.h +++ b/src/driver/drv_local.h @@ -12,5 +12,7 @@ void DRV_DGR_RunFrame(); void BL_ProcessUpdate(float voltage, float current, float power); void BL09XX_AppendInformationToHTTPIndexPage(http_request_t *request); +bool DRV_IsRunning(const char *name); + diff --git a/src/driver/drv_main.c b/src/driver/drv_main.c index f2fc6a319..b31ec2dbc 100644 --- a/src/driver/drv_main.c +++ b/src/driver/drv_main.c @@ -33,6 +33,19 @@ static driver_t g_drivers[] = { }; static int g_numDrivers = sizeof(g_drivers)/sizeof(g_drivers[0]); +bool DRV_IsRunning(const char *name) { + int i; + + for(i = 0; i < g_numDrivers; i++) { + if(g_drivers[i].bLoaded) { + if(!stricmp(name,g_drivers[i].name)) { + return true; + } + } + } + return false; +} + void DRV_OnEverySecond() { int i; @@ -44,26 +57,20 @@ void DRV_OnEverySecond() { } } } -// startDriver DGR -// startDriver BL0942 -// startDriver BL0937 -int DRV_Start(const void *context, const char *cmd, const char *args, int cmdFlags) { +void DRV_StartDriver(const char *name) { int i; - const char *name; - - name = args; for(i = 0; i < g_numDrivers; i++) { if(!stricmp(g_drivers[i].name,name)) { if(g_drivers[i].bLoaded){ addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Drv %s is already loaded.\n",name); - return 1; + return ; } else { g_drivers[i].initFunc(); g_drivers[i].bLoaded = true; addLogAdv(LOG_INFO, LOG_FEATURE_NTP,"Started %s.\n",name); - return 1; + return ; } } } @@ -76,6 +83,13 @@ int DRV_Start(const void *context, const char *cmd, const char *args, int cmdFla addLogAdv(LOG_INFO, LOG_FEATURE_NTP,", %s",g_drivers[i].name); } } +} +// startDriver DGR +// startDriver BL0942 +// startDriver BL0937 +static int DRV_Start(const void *context, const char *cmd, const char *args, int cmdFlags) { + + DRV_StartDriver(args); return 1; } diff --git a/src/driver/drv_public.h b/src/driver/drv_public.h index 8a03b3abe..8f081f4c3 100644 --- a/src/driver/drv_public.h +++ b/src/driver/drv_public.h @@ -4,4 +4,6 @@ void DRV_Generic_Init(); #include "../httpserver/new_http.h" void DRV_AppendInformationToHTTPIndexPage(http_request_t *request); -void DRV_OnEverySecond(); \ No newline at end of file +void DRV_OnEverySecond(); +void DRV_StartDriver(const char *name); + diff --git a/src/driver/drv_tasmotaDeviceGroups.c b/src/driver/drv_tasmotaDeviceGroups.c index 9df9bb662..7a6591671 100644 --- a/src/driver/drv_tasmotaDeviceGroups.c +++ b/src/driver/drv_tasmotaDeviceGroups.c @@ -6,6 +6,7 @@ // Commands register, execution API and cmd tokenizer #include "../cmnds/cmd_public.h" #include "../logging/logging.h" +#include "../devicegroups/deviceGroups_public.h" #include "lwip/sockets.h" #include "lwip/ip_addr.h" #include "lwip/inet.h" @@ -59,6 +60,8 @@ void DRV_DGR_CreateSocket_Receive() { if (iResult != 0) { addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"failed to do setsockopt SO_BROADCAST\n"); + close(g_dgr_socket); + g_dgr_socket = 0; return ; } } @@ -71,6 +74,8 @@ void DRV_DGR_CreateSocket_Receive() { ) < 0 ){ addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"failed to do setsockopt SO_REUSEADDR\n"); + close(g_dgr_socket); + g_dgr_socket = 0; return ; } } @@ -86,6 +91,8 @@ void DRV_DGR_CreateSocket_Receive() { // if (bind(g_dgr_socket, (struct sockaddr*) &addr, sizeof(addr)) < 0) { addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"failed to do bind\n"); + close(g_dgr_socket); + g_dgr_socket = 0; return ; } @@ -113,14 +120,71 @@ void DRV_DGR_CreateSocket_Receive() { iResult < 0 ){ addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"failed to do setsockopt IP_ADD_MEMBERSHIP %i\n",iResult); + close(g_dgr_socket); + g_dgr_socket = 0; return ; } } + lwip_fcntl(g_dgr_socket, F_SETFL,O_NONBLOCK); + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"Waiting for packets\n"); } + +void DRV_DGR_processPower(int relayStates, byte relaysCount) { + int startIndex; + int i; + int ch; + + LED_SetEnableAll(BIT_CHECK(relayStates,0)); + //if(CHANNEL_HasChannelSomeOutputPin(0)) { + // startIndex = 0; + //} else { + // startIndex = 1; + //} + //for(i = 0; i < relaysCount; i++) { + // int bOn; + // bOn = BIT_CHECK(relayStates,i); + // ch = startIndex+i; + // if(bOn) { + // if(CHANNEL_HasChannelPinWithRole(ch,IOR_PWM)) { + + // } else { + // CHANNEL_Set(ch,1,0); + // } + // } else { + // CHANNEL_Set(ch,0,0); + // } + //} +} +void DRV_DGR_processBrightnessPowerOn(byte brightness) { + int numPWMs; + int idx_pin; + int idx_channel; + float fr; + + addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"DRV_DGR_processBrightnessPowerOn: %i\n",(int)brightness); + + // convert to our 0-100 range + fr = brightness / 255.0f; + brightness = fr * 100; + + + LED_SetDimmer(brightness); + + //numPWMs = PIN_CountPinsWithRole(IOR_PWM); + //idx_pin = PIN_FindPinIndexForRole(IOR_PWM,0); + //idx_channel = PIN_GetPinChannelForPinIndex(idx_pin); + + //CHANNEL_Set(idx_channel,brightness,0); + +} +void DRV_DGR_processLightBrightness(byte brightness) { + +} void DRV_DGR_RunFrame() { struct sockaddr_in addr; + dgrDevice_t def; if(g_dgr_socket==0) { addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"no sock\n"); @@ -139,11 +203,20 @@ void DRV_DGR_RunFrame() { &addrlen ); if (nbytes <= 0) { - addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"nothing\n"); + //addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"nothing\n"); return ; } addLogAdv(LOG_INFO, LOG_FEATURE_DGR,"Received %i bytes\n",nbytes); msgbuf[nbytes] = '\0'; + + strcpy(def.gr.groupName,CFG_DeviceGroups_GetName()); + def.gr.devGroupShare_In = CFG_DeviceGroups_GetRecvFlags(); + def.gr.devGroupShare_Out = CFG_DeviceGroups_GetSendFlags(); + def.cbs.processBrightnessPowerOn = DRV_DGR_processBrightnessPowerOn; + def.cbs.processLightBrightness = DRV_DGR_processLightBrightness; + def.cbs.processPower = DRV_DGR_processPower; + + DGR_Parse(msgbuf, nbytes, &def); //DGR_Parse(msgbuf, nbytes); // puts(msgbuf); } @@ -180,7 +253,6 @@ void DRV_DGR_Init() #else DRV_DGR_CreateSocket_Receive(); - lwip_fcntl(g_dgr_socket, F_SETFL,O_NONBLOCK); #endif } diff --git a/src/httpserver/http_fns.c b/src/httpserver/http_fns.c index eb154d192..42fc146e0 100644 --- a/src/httpserver/http_fns.c +++ b/src/httpserver/http_fns.c @@ -12,6 +12,7 @@ #include "../hal/hal_pins.h" #include "../hal/hal_flashConfig.h" #include "../logging/logging.h" +#include "../devicegroups/deviceGroups_public.h" #ifdef WINDOWS // nothing @@ -944,6 +945,8 @@ int http_fn_startup_command(http_request_t *request) { if(http_getArg(request->url,"data",tmpA,sizeof(tmpA))) { hprintf128(request,"

Set command to %s!

",tmpA); CFG_SetShortStartupCommand(tmpA); + + CFG_Save_IfThereArePendingChanges(); } else { } @@ -1176,6 +1179,7 @@ int http_fn_cfg(http_request_t *request) { poststr(request,"
"); poststr(request,"
"); poststr(request,"
"); + poststr(request,"
"); poststr(request,"
"); poststr(request,"
"); poststr(request,"
"); @@ -1339,11 +1343,8 @@ int http_fn_cfg_pins(http_request_t *request) { } int http_fn_cfg_generic(http_request_t *request) { - int iChanged = 0; - int iChangedRequested = 0; int i; char tmpA[128]; - char tmpB[64]; http_setup(request, httpMimeTypeHTML); poststr(request,htmlHeader); @@ -1405,6 +1406,7 @@ int http_fn_cfg_startup(http_request_t *request) { Channel_SaveInFlashIfNeeded(channelIndex); hprintf128(request,"
Setting channel %i start value to %i
",channelIndex,newValue); + CFG_Save_IfThereArePendingChanges(); } } @@ -1436,6 +1438,102 @@ int http_fn_cfg_startup(http_request_t *request) { return 0; } +int http_fn_cfg_dgr(http_request_t *request) { + int iChanged = 0; + int iChangedRequested = 0; + int channelIndex; + int newValue; + int i; + char tmpA[128]; + char tmpB[64]; + + http_setup(request, httpMimeTypeHTML); + poststr(request,htmlHeader); + poststr(request,g_header); + + hprintf128(request,"
Here you can configure Tasmota Device Groups
"); + + + if( http_getArg(request->url,"name",tmpA,sizeof(tmpA))) { + int newSendFlags; + int newRecvFlags; + + newSendFlags = 0; + newRecvFlags = 0; + + if(http_getArgInteger(request->url,"s_pwr")) + newSendFlags |= DGR_SHARE_POWER; + if(http_getArgInteger(request->url,"r_pwr")) + newRecvFlags |= DGR_SHARE_POWER; + if(http_getArgInteger(request->url,"s_lbr")) + newSendFlags |= DGR_SHARE_LIGHT_BRI; + if(http_getArgInteger(request->url,"r_lbr")) + newRecvFlags |= DGR_SHARE_LIGHT_BRI; + if(http_getArgInteger(request->url,"s_lcl")) + newSendFlags |= DGR_SHARE_LIGHT_COLOR; + if(http_getArgInteger(request->url,"r_lcl")) + newRecvFlags |= DGR_SHARE_LIGHT_COLOR; + + CFG_DeviceGroups_SetName(tmpA); + CFG_DeviceGroups_SetSendFlags(newSendFlags); + CFG_DeviceGroups_SetRecvFlags(newRecvFlags); + + if(tmpA[0] != 0) { + DRV_StartDriver("DGR"); + } + CFG_Save_IfThereArePendingChanges(); + } + { + int newSendFlags; + int newRecvFlags; + const char *groupName = CFG_DeviceGroups_GetName(); + + + newSendFlags = CFG_DeviceGroups_GetSendFlags(); + newRecvFlags = CFG_DeviceGroups_GetRecvFlags(); + + poststr(request,"


"); + + poststr(request," "); + + poststr(request," "); + + poststr(request," "); + + poststr(request," "); + poststr(request," "); + + poststr(request,"
NameTasmota CodeReceiveSend
Power1
Light Brightness 2
Light Color 16
"); + } + + poststr(request,htmlReturnToCfg); + HTTP_AddBuildFooter(request); + poststr(request,htmlEnd); + + poststr(request, NULL); + return 0; +} + void XR809_RequestOTAHTTP(const char *s); int http_fn_ota_exec(http_request_t *request) { diff --git a/src/httpserver/http_fns.h b/src/httpserver/http_fns.h index c415e48d1..b5964baf7 100644 --- a/src/httpserver/http_fns.h +++ b/src/httpserver/http_fns.h @@ -31,3 +31,4 @@ int http_fn_cm(http_request_t *request); int http_fn_startup_command(http_request_t *request); int http_fn_cfg_generic(http_request_t *request); int http_fn_cfg_startup(http_request_t *request); +int http_fn_cfg_dgr(http_request_t *request); diff --git a/src/httpserver/new_http.c b/src/httpserver/new_http.c index 14ab43119..9ca43961a 100644 --- a/src/httpserver/new_http.c +++ b/src/httpserver/new_http.c @@ -217,6 +217,12 @@ int http_getArg(const char *base, const char *name, char *o, int maxSize) { } return 0; } +int http_getArgInteger(const char *base, const char *name) { + char tmp[16]; + if(http_getArg(base,name,tmp,sizeof(tmp))==0) + return 0; + return atoi(tmp); +} const char *htmlPinRoleNames[] = { " ", @@ -532,6 +538,7 @@ int HTTP_ProcessPacket(http_request_t *request) { if(http_checkUrlBase(urlStr,"startup_command")) return http_fn_startup_command(request); if(http_checkUrlBase(urlStr,"cfg_generic")) return http_fn_cfg_generic(request); if(http_checkUrlBase(urlStr,"cfg_startup")) return http_fn_cfg_startup(request); + if(http_checkUrlBase(urlStr,"cfg_dgr")) return http_fn_cfg_dgr(request); if(http_checkUrlBase(urlStr,"cfg_quick")) return http_fn_cfg_quick(request); if(http_checkUrlBase(urlStr,"cfg_ha")) return http_fn_cfg_ha(request); diff --git a/src/httpserver/new_http.h b/src/httpserver/new_http.h index c2b140455..58771fe44 100644 --- a/src/httpserver/new_http.h +++ b/src/httpserver/new_http.h @@ -57,6 +57,7 @@ int postany(http_request_t *request, const char *str, int len); void misc_formatUpTimeString(int totalSeconds, char *o); void HTTP_AddBuildFooter(http_request_t *request); int http_getArg(const char *base, const char *name, char *o, int maxSize); +int http_getArgInteger(const char *base, const char *name); // poststr with format - for results LESS THAN 128 int hprintf128(http_request_t *request, const char *fmt, ...); diff --git a/src/logging/logging.h b/src/logging/logging.h index 54af7f194..c46af16eb 100644 --- a/src/logging/logging.h +++ b/src/logging/logging.h @@ -69,7 +69,7 @@ typedef enum { LOG_FEATURE_NTP = 11, LOG_FEATURE_TUYAMCU = 12, LOG_FEATURE_I2C = 13, - LOG_FEATURE_BL0942 = 14, + LOG_FEATURE_BL09XX = 14, LOG_FEATURE_EVENT = 15, LOG_FEATURE_DGR = 16, // add in here - but also in names in logging.c diff --git a/src/new_cfg.c b/src/new_cfg.c index c7d4fd742..30a8b17c7 100644 --- a/src/new_cfg.c +++ b/src/new_cfg.c @@ -337,6 +337,34 @@ void CFG_Save_IfThereArePendingChanges() { g_cfg_pendingChanges = 0; } } +void CFG_DeviceGroups_SetName(const char *s) { + // this will return non-zero if there were any changes + if(strcpy_safe_checkForChanges(g_cfg.dgr_name, s,sizeof(g_cfg.dgr_name))) { + // mark as dirty (value has changed) + g_cfg_pendingChanges++; + } +} +void CFG_DeviceGroups_SetSendFlags(int newSendFlags) { + if(g_cfg.dgr_sendFlags != newSendFlags) { + g_cfg.dgr_sendFlags = newSendFlags; + g_cfg_pendingChanges++; + } +} +void CFG_DeviceGroups_SetRecvFlags(int newRecvFlags) { + if(g_cfg.dgr_recvFlags != newRecvFlags) { + g_cfg.dgr_recvFlags = newRecvFlags; + g_cfg_pendingChanges++; + } +} +const char *CFG_DeviceGroups_GetName() { + return g_cfg.dgr_name; +} +int CFG_DeviceGroups_GetSendFlags() { + return g_cfg.dgr_sendFlags; +} +int CFG_DeviceGroups_GetRecvFlags() { + return g_cfg.dgr_recvFlags; +} void CFG_SetChannelStartupValue(int channelIndex,short newValue) { if(channelIndex < 0 || channelIndex >= CHANNEL_MAX) { addLogAdv(LOG_ERROR, LOG_FEATURE_CFG, "CFG_SetChannelStartupValue: Channel index %i out of range <0,%i).",channelIndex,CHANNEL_MAX); diff --git a/src/new_cfg.h b/src/new_cfg.h index 446c095cf..2fd485f24 100644 --- a/src/new_cfg.h +++ b/src/new_cfg.h @@ -48,8 +48,12 @@ int CFG_GetBootOkSeconds(); void CFG_SetChannelStartupValue(int channelIndex,short newValue); short CFG_GetChannelStartupValue(int channelIndex); void CFG_ApplyChannelStartValues(); - - +void CFG_DeviceGroups_SetName(const char *s); +void CFG_DeviceGroups_SetSendFlags(int newSendFlags); +void CFG_DeviceGroups_SetRecvFlags(int newSendFlags); +const char *CFG_DeviceGroups_GetName(); +int CFG_DeviceGroups_GetSendFlags(); +int CFG_DeviceGroups_GetRecvFlags(); diff --git a/src/new_common.h b/src/new_common.h index a4175b646..dcd704a20 100644 --- a/src/new_common.h +++ b/src/new_common.h @@ -32,6 +32,10 @@ This platform is not supported, error! #endif +#define BIT_SET(PIN,N) (PIN |= (1<0){ + DRV_StartDriver("DGR"); + } + break; /* for softap mode */ case WIFI_AP_CONNECTED: @@ -412,6 +417,7 @@ void Main_Init() // this actually sets the pins, moved out so we could avoid if necessary PIN_SetupPins(); PIN_StartButtonScanThread(); + } } diff --git a/windowsTest_msvc2008.vcproj b/windowsTest_msvc2008.vcproj index cb8a3c985..65b65b50e 100644 --- a/windowsTest_msvc2008.vcproj +++ b/windowsTest_msvc2008.vcproj @@ -728,7 +728,7 @@ > + + + + + + + + + + + + + + + + + +