mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-24 11:16:34 +00:00
Refactor command line arguments
This commit is contained in:
parent
75c6cbb45c
commit
1e0631d7e1
@ -252,39 +252,33 @@ uint32_t ChrCount(const char *str, const char *delim) {
|
||||
return count;
|
||||
}
|
||||
|
||||
uint32_t ArgC(void) {
|
||||
return ChrCount(XdrvMailbox.data, ",") +1;
|
||||
}
|
||||
|
||||
// Function to return a substring defined by a delimiter at an index
|
||||
char* subStr(char* dest, char* str, const char *delim, int index) {
|
||||
/*
|
||||
// Exceptions on empty fields
|
||||
char *act;
|
||||
char *sub = nullptr;
|
||||
char *ptr;
|
||||
int i;
|
||||
char* write = dest;
|
||||
char* read = str;
|
||||
char ch = '.';
|
||||
|
||||
// Since strtok consumes the first arg, make a copy
|
||||
strncpy(dest, str, strlen(str)+1);
|
||||
for (i = 1, act = dest; i <= index; i++, act = nullptr) {
|
||||
sub = strtok_r(act, delim, &ptr);
|
||||
if (sub == nullptr) break;
|
||||
while (index && (ch != '\0')) {
|
||||
ch = *read++;
|
||||
if (strchr(delim, ch)) {
|
||||
index--;
|
||||
if (index) { write = dest; }
|
||||
} else {
|
||||
*write++ = ch;
|
||||
}
|
||||
}
|
||||
return sub;
|
||||
*/
|
||||
uint32_t len = strlen(str) -1;
|
||||
// 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] = ' '; }
|
||||
*write = '\0';
|
||||
dest = Trim(dest);
|
||||
return dest;
|
||||
}
|
||||
|
||||
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);
|
||||
return sub;
|
||||
char* ArgV(char* dest, int index) {
|
||||
return subStr(dest, XdrvMailbox.data, ",", index);
|
||||
}
|
||||
|
||||
float CharToFloat(const char *str)
|
||||
|
@ -2283,14 +2283,14 @@ void CmndScale(void)
|
||||
{
|
||||
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RULE_VARS)) {
|
||||
if (XdrvMailbox.data_len > 0) {
|
||||
if (strchr(XdrvMailbox.data, ',') != nullptr) { // Process parameter entry
|
||||
char sub_string[XdrvMailbox.data_len +1];
|
||||
if (ArgC() > 1) { // Process parameter entry
|
||||
char argument[XdrvMailbox.data_len];
|
||||
|
||||
float valueIN = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 1));
|
||||
float fromLow = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 2));
|
||||
float fromHigh = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 3));
|
||||
float toLow = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 4));
|
||||
float toHigh = CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 5));
|
||||
float valueIN = CharToFloat(ArgV(argument, 1));
|
||||
float fromLow = CharToFloat(ArgV(argument, 2));
|
||||
float fromHigh = CharToFloat(ArgV(argument, 3));
|
||||
float toLow = CharToFloat(ArgV(argument, 4));
|
||||
float toHigh = CharToFloat(ArgV(argument, 5));
|
||||
float value = map_double(valueIN, fromLow, fromHigh, toLow, toHigh);
|
||||
dtostrfd(value, Settings.flag2.calc_resolution, rules_vars[XdrvMailbox.index -1]);
|
||||
bitSet(Rules.vars_event, XdrvMailbox.index -1);
|
||||
|
@ -591,8 +591,8 @@ void CmndAdcParam(void) {
|
||||
if (XdrvMailbox.data_len) {
|
||||
if (XdrvMailbox.payload > ADC_INPUT) {
|
||||
AdcGetSettings(idx);
|
||||
if (ChrCount(XdrvMailbox.data, ",") > 2) { // Process parameter entry
|
||||
char sub_string[XdrvMailbox.data_len +1];
|
||||
if (ArgC() > 3) { // Process parameter entry
|
||||
char argument[XdrvMailbox.data_len];
|
||||
// AdcParam 2, 32000, 10000, 3350
|
||||
// AdcParam 3, 10000, 12518931, -1.405
|
||||
// AdcParam 4, 128, 0, 0
|
||||
@ -601,29 +601,24 @@ void CmndAdcParam(void) {
|
||||
// AdcParam 7, 0, 2146, 0.23
|
||||
// AdcParam 8, 1000, 0, 0
|
||||
Adc[idx].type = XdrvMailbox.payload;
|
||||
Adc[idx].param1 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10);
|
||||
Adc[idx].param2 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 3), nullptr, 10);
|
||||
Adc[idx].param1 = strtol(ArgV(argument, 2), nullptr, 10);
|
||||
Adc[idx].param2 = strtol(ArgV(argument, 3), nullptr, 10);
|
||||
if (ADC_RANGE == XdrvMailbox.payload) {
|
||||
Adc[idx].param3 = abs(strtol(subStr(sub_string, XdrvMailbox.data, ",", 4), nullptr, 10));
|
||||
Adc[idx].param4 = abs(strtol(subStr(sub_string, XdrvMailbox.data, ",", 5), nullptr, 10));
|
||||
Adc[idx].param3 = abs(strtol(ArgV(argument, 4), nullptr, 10));
|
||||
Adc[idx].param4 = abs(strtol(ArgV(argument, 5), nullptr, 10));
|
||||
} 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) {
|
||||
char *phLow_chr = subStr(sub_string, XdrvMailbox.data, ",", 2);
|
||||
char *phHigh_chr = subStr(sub_string, XdrvMailbox.data, ",", 4);
|
||||
float phLow = CharToFloat(phLow_chr);
|
||||
float phHigh = CharToFloat(phHigh_chr);
|
||||
|
||||
float phLow = CharToFloat(ArgV(argument, 2));
|
||||
float phHigh = CharToFloat(ArgV(argument, 4));
|
||||
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].param4 = strtol(subStr(sub_string, XdrvMailbox.data, ",", 5), nullptr, 10);
|
||||
|
||||
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);
|
||||
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"),
|
||||
&phLow, Adc[idx].param2, &phHigh, Adc[idx].param4);
|
||||
}
|
||||
|
||||
if (ADC_CT_POWER == XdrvMailbox.payload) {
|
||||
if (((1 == Adc[idx].param1) & CT_FLAG_ENERGY_RESET) > 0) {
|
||||
for (uint32_t idx = 0; idx < MAX_ADCS; idx++) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user