Refactor command line arguments

This commit is contained in:
Theo Arends 2021-01-30 12:27:48 +01:00
parent 75c6cbb45c
commit 1e0631d7e1
3 changed files with 41 additions and 52 deletions

View File

@ -252,39 +252,33 @@ uint32_t ChrCount(const char *str, const char *delim) {
return count; return count;
} }
uint32_t ArgC(void) {
return ChrCount(XdrvMailbox.data, ",") +1;
}
// Function to return a substring defined by a delimiter at an index // Function to return a substring defined by a delimiter at an index
char* subStr(char* dest, char* str, const char *delim, int index) { char* subStr(char* dest, char* str, const char *delim, int index) {
/* char* write = dest;
// Exceptions on empty fields char* read = str;
char *act; char ch = '.';
char *sub = nullptr;
char *ptr;
int i;
// Since strtok consumes the first arg, make a copy while (index && (ch != '\0')) {
strncpy(dest, str, strlen(str)+1); ch = *read++;
for (i = 1, act = dest; i <= index; i++, act = nullptr) { if (strchr(delim, ch)) {
sub = strtok_r(act, delim, &ptr); index--;
if (sub == nullptr) break; if (index) { write = dest; }
} else {
*write++ = ch;
}
} }
return sub; *write = '\0';
*/ dest = Trim(dest);
uint32_t len = strlen(str) -1; return dest;
// Since strtok consumes the first arg, make a copy }
strncpy(dest, str, len +2);
// Since strtok_r will exception if last char is delim change to space
if (strchr(delim, dest[len]) != nullptr) { dest[len] = ' '; }
char *ptr = dest;
char *sub;
int i = index;
while ( ptr && ((sub = strtok_r(ptr, delim, &ptr))) && (--i) ) {
// Serial.printf("%s|", sub);
}
// Serial.printf("%s|=\n|", sub);
sub = Trim(sub); char* ArgV(char* dest, int index) {
return sub; return subStr(dest, XdrvMailbox.data, ",", index);
} }
float CharToFloat(const char *str) float CharToFloat(const char *str)

View File

@ -2283,14 +2283,14 @@ void CmndScale(void)
{ {
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RULE_VARS)) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RULE_VARS)) {
if (XdrvMailbox.data_len > 0) { if (XdrvMailbox.data_len > 0) {
if (strchr(XdrvMailbox.data, ',') != nullptr) { // Process parameter entry if (ArgC() > 1) { // Process parameter entry
char sub_string[XdrvMailbox.data_len +1]; char argument[XdrvMailbox.data_len];
float valueIN = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 1)); float valueIN = CharToFloat(ArgV(argument, 1));
float fromLow = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 2)); float fromLow = CharToFloat(ArgV(argument, 2));
float fromHigh = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 3)); float fromHigh = CharToFloat(ArgV(argument, 3));
float toLow = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 4)); float toLow = CharToFloat(ArgV(argument, 4));
float toHigh = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 5)); float toHigh = CharToFloat(ArgV(argument, 5));
float value = map_double(valueIN, fromLow, fromHigh, toLow, toHigh); float value = map_double(valueIN, fromLow, fromHigh, toLow, toHigh);
dtostrfd(value, Settings.flag2.calc_resolution, rules_vars[XdrvMailbox.index -1]); dtostrfd(value, Settings.flag2.calc_resolution, rules_vars[XdrvMailbox.index -1]);
bitSet(Rules.vars_event, XdrvMailbox.index -1); bitSet(Rules.vars_event, XdrvMailbox.index -1);

View File

@ -591,8 +591,8 @@ void CmndAdcParam(void) {
if (XdrvMailbox.data_len) { if (XdrvMailbox.data_len) {
if (XdrvMailbox.payload > ADC_INPUT) { if (XdrvMailbox.payload > ADC_INPUT) {
AdcGetSettings(idx); AdcGetSettings(idx);
if (ChrCount(XdrvMailbox.data, ",") > 2) { // Process parameter entry if (ArgC() > 3) { // Process parameter entry
char sub_string[XdrvMailbox.data_len +1]; char argument[XdrvMailbox.data_len];
// AdcParam 2, 32000, 10000, 3350 // AdcParam 2, 32000, 10000, 3350
// AdcParam 3, 10000, 12518931, -1.405 // AdcParam 3, 10000, 12518931, -1.405
// AdcParam 4, 128, 0, 0 // AdcParam 4, 128, 0, 0
@ -601,29 +601,24 @@ void CmndAdcParam(void) {
// AdcParam 7, 0, 2146, 0.23 // AdcParam 7, 0, 2146, 0.23
// AdcParam 8, 1000, 0, 0 // AdcParam 8, 1000, 0, 0
Adc[idx].type = XdrvMailbox.payload; Adc[idx].type = XdrvMailbox.payload;
Adc[idx].param1 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10); Adc[idx].param1 = strtol(ArgV(argument, 2), nullptr, 10);
Adc[idx].param2 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 3), nullptr, 10); Adc[idx].param2 = strtol(ArgV(argument, 3), nullptr, 10);
if (ADC_RANGE == XdrvMailbox.payload) { if (ADC_RANGE == XdrvMailbox.payload) {
Adc[idx].param3 = abs(strtol(subStr(sub_string, XdrvMailbox.data, ",", 4), nullptr, 10)); Adc[idx].param3 = abs(strtol(ArgV(argument, 4), nullptr, 10));
Adc[idx].param4 = abs(strtol(subStr(sub_string, XdrvMailbox.data, ",", 5), nullptr, 10)); Adc[idx].param4 = abs(strtol(ArgV(argument, 5), nullptr, 10));
} else { } else {
Adc[idx].param3 = (int)(CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 4)) * 10000); Adc[idx].param3 = (int)(CharToFloat(ArgV(argument, 4)) * 10000);
} }
if (ADC_PH == XdrvMailbox.payload) { if (ADC_PH == XdrvMailbox.payload) {
char *phLow_chr = subStr(sub_string, XdrvMailbox.data, ",", 2); float phLow = CharToFloat(ArgV(argument, 2));
char *phHigh_chr = subStr(sub_string, XdrvMailbox.data, ",", 4); float phHigh = CharToFloat(ArgV(argument, 4));
float phLow = CharToFloat(phLow_chr);
float phHigh = CharToFloat(phHigh_chr);
Adc[idx].param1 = phLow * ANALOG_PH_DECIMAL_MULTIPLIER; Adc[idx].param1 = phLow * ANALOG_PH_DECIMAL_MULTIPLIER;
Adc[idx].param2 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 3), nullptr, 10); Adc[idx].param2 = strtol(ArgV(argument, 3), nullptr, 10);
Adc[idx].param3 = phHigh * ANALOG_PH_DECIMAL_MULTIPLIER; Adc[idx].param3 = phHigh * ANALOG_PH_DECIMAL_MULTIPLIER;
Adc[idx].param4 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 5), nullptr, 10); Adc[idx].param4 = strtol(ArgV(argument, 5), nullptr, 10);
AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION "Analog pH probe calibrated. cal-low(pH=ADC) %2_f=%d, cal-high(pH=ADC) %2_f=%d"),
AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION "Analog pH probe calibrated. cal-low(pH=ADC): %s=%d, cal-high(pH=ADC): %s=%d"), phLow_chr, Adc[idx].param2, phHigh_chr, Adc[idx].param4); &phLow, Adc[idx].param2, &phHigh, Adc[idx].param4);
} }
if (ADC_CT_POWER == XdrvMailbox.payload) { if (ADC_CT_POWER == XdrvMailbox.payload) {
if (((1 == Adc[idx].param1) & CT_FLAG_ENERGY_RESET) > 0) { if (((1 == Adc[idx].param1) & CT_FLAG_ENERGY_RESET) > 0) {
for (uint32_t idx = 0; idx < MAX_ADCS; idx++) { for (uint32_t idx = 0; idx < MAX_ADCS; idx++) {