From f7ab445b80a23d32e4e4e11e1a3cdd73f7837d48 Mon Sep 17 00:00:00 2001 From: openshwprojects Date: Mon, 31 Oct 2022 10:26:36 +0100 Subject: [PATCH] newLedDriver commands like "led_dimmer" or "led_enableAll" must use Tokenizer so we can support syntax like "led_dimmer $led_dimmer+10", etc --- src/cmnds/cmd_if.c | 45 +++++++++++++++++++++++++++++------- src/cmnds/cmd_newLEDDriver.c | 8 +++++-- src/cmnds/cmd_script.c | 23 ++++++++++++++++++ 3 files changed, 66 insertions(+), 10 deletions(-) diff --git a/src/cmnds/cmd_if.c b/src/cmnds/cmd_if.c index fdb215559..07f777b8c 100644 --- a/src/cmnds/cmd_if.c +++ b/src/cmnds/cmd_if.c @@ -106,6 +106,40 @@ bool strCompareBound(const char *s, const char *templ, const char *stopper, int } char *g_expDebugBuffer = 0; #define EXPRESSION_DEBUG_BUFFER_SIZE 128 + +// tries to expand a given string into a constant +// So, for $CH1 it will set out to given channel value +// For $led_dimmer it will set out to current led_dimmer value +// Etc etc +// Returns true if constant matches +// Returns false if no constants found +bool CMD_ExpandConstant(const char *s, const char *stop, float *out) { + int idx; + + if(strCompareBound(s,"MQTTOn", stop, false)) { + ADDLOG_INFO(LOG_FEATURE_EVENT, "CMD_ExpandConstant: MQTTOn"); + *out = Main_HasMQTTConnected(); + return true; + } + if(strCompareBound(s,"$CH*", stop, 1) || strCompareBound(s,"$CH**", stop, 1)) { + idx = atoi(s+3); + ADDLOG_INFO(LOG_FEATURE_EVENT, "CMD_ExpandConstant: channel value of idx %i",idx); + *out = CHANNEL_Get(idx); + return true; + } + if(strCompareBound(s,"$led_dimmer", stop, 1)) { + ADDLOG_INFO(LOG_FEATURE_EVENT, "CMD_ExpandConstant: led_dimmer"); + *out = LED_GetDimmer(); + return true; + } + if(strCompareBound(s,"$led_enableAll", stop, 1)) { + ADDLOG_INFO(LOG_FEATURE_EVENT, "CMD_ExpandConstant: led_enableAll"); + *out = LED_GetEnableAll(); + return true; + } + + return false; +} float CMD_EvaluateExpression(const char *s, const char *stop) { byte opCode; const char *op; @@ -200,15 +234,10 @@ float CMD_EvaluateExpression(const char *s, const char *stop) { if(s[0] == '!') { return !CMD_EvaluateExpression(s+1,stop); } - if(strCompareBound(s,"MQTTOn", stop, false)) { - ADDLOG_INFO(LOG_FEATURE_EVENT, "CMD_EvaluateExpression: MQTTOn"); - return Main_HasMQTTConnected(); - } - if(strCompareBound(s,"$CH*", stop, 1) || strCompareBound(s,"$CH**", stop, 1)) { - idx = atoi(s+3); - ADDLOG_INFO(LOG_FEATURE_EVENT, "CMD_EvaluateExpression: channel value of idx %i",idx); - return CHANNEL_Get(idx); + if(CMD_ExpandConstant(s,stop,&c)) { + return c; } + ADDLOG_INFO(LOG_FEATURE_EVENT, "CMD_EvaluateExpression: will call atof for %s",s); return atof(s); } diff --git a/src/cmnds/cmd_newLEDDriver.c b/src/cmnds/cmd_newLEDDriver.c index d52d09a01..482d58825 100644 --- a/src/cmnds/cmd_newLEDDriver.c +++ b/src/cmnds/cmd_newLEDDriver.c @@ -361,7 +361,9 @@ static int enableAll(const void *context, const char *cmd, const char *args, int int bEnable; ADDLOG_INFO(LOG_FEATURE_CMD, " enableAll (%s) received with args %s",cmd,args); - bEnable = parsePowerArgument(args); + Tokenizer_TokenizeString(args, 0); + + bEnable = Tokenizer_GetArgInteger(0); LED_SetEnableAll(bEnable); @@ -483,7 +485,9 @@ static int dimmer(const void *context, const char *cmd, const char *args, int cm cJSON_Delete(json); } } else { - iVal = parsePowerArgument(args); + Tokenizer_TokenizeString(args, 0); + + iVal = Tokenizer_GetArgInteger(0); LED_SetDimmer(iVal); } diff --git a/src/cmnds/cmd_script.c b/src/cmnds/cmd_script.c index f1e8971c3..33e909bf6 100644 --- a/src/cmnds/cmd_script.c +++ b/src/cmnds/cmd_script.c @@ -178,6 +178,29 @@ setChannel 20 1.1==1.0 // Channel 19 = 1 // Channel 20 = 0 +// Example 6: + +// brightness loop +// First makes it gradually brighter, then darker +// Channel 10 is dimmer delta +// Channel 11 is delay step in ms +// NOTE: with the current state of things, this is a MQTT killer + +setChannel 10 2 +setChannel 11 25 +led_enableAll 1 + +again: + +if $led_dimmer>100 then "setChannel 10 -2" +if $led_dimmer<0 then "setChannel 10 2" + +delay_ms $CH11 +led_dimmer $led_dimmer+$CH10 +goto again + + + */ typedef struct scriptFile_s {