newLedDriver commands like "led_dimmer" or "led_enableAll" must use Tokenizer so we can support syntax like "led_dimmer $led_dimmer+10", etc

This commit is contained in:
openshwprojects
2022-10-31 10:26:36 +01:00
parent a7f704cf92
commit f7ab445b80
3 changed files with 66 additions and 10 deletions

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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 {