mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-29 05:36:39 +00:00
Refactor command line arguments
This commit is contained in:
parent
aea856ca2c
commit
f43c098158
@ -276,11 +276,20 @@ char* subStr(char* dest, char* str, const char *delim, int index) {
|
|||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
char* ArgV(char* dest, int index) {
|
char* ArgV(char* dest, int index) {
|
||||||
return subStr(dest, XdrvMailbox.data, ",", index);
|
return subStr(dest, XdrvMailbox.data, ",", index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t ParseParameters(uint32_t count, uint32_t *params)
|
||||||
|
{
|
||||||
|
char *p;
|
||||||
|
uint32_t i = 0;
|
||||||
|
for (char *str = strtok_r(XdrvMailbox.data, ", ", &p); str && i < count; str = strtok_r(nullptr, ", ", &p), i++) {
|
||||||
|
params[i] = strtoul(str, nullptr, 0);
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
float CharToFloat(const char *str)
|
float CharToFloat(const char *str)
|
||||||
{
|
{
|
||||||
// simple ascii to double, because atof or strtod are too large
|
// simple ascii to double, because atof or strtod are too large
|
||||||
@ -631,16 +640,6 @@ bool ParseIPv4(uint32_t* addr, const char* str_p)
|
|||||||
return (3 == i);
|
return (3 == i);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t ParseParameters(uint32_t count, uint32_t *params)
|
|
||||||
{
|
|
||||||
char *p;
|
|
||||||
uint32_t i = 0;
|
|
||||||
for (char *str = strtok_r(XdrvMailbox.data, ", ", &p); str && i < count; str = strtok_r(nullptr, ", ", &p), i++) {
|
|
||||||
params[i] = strtoul(str, nullptr, 0);
|
|
||||||
}
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Function to parse & check if version_str is newer than our currently installed version.
|
// Function to parse & check if version_str is newer than our currently installed version.
|
||||||
bool NewerVersion(char* version_str)
|
bool NewerVersion(char* version_str)
|
||||||
{
|
{
|
||||||
|
@ -1208,13 +1208,13 @@ void CmndKnxGa(void)
|
|||||||
{
|
{
|
||||||
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_KNX_GA)) {
|
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_KNX_GA)) {
|
||||||
if (XdrvMailbox.data_len) {
|
if (XdrvMailbox.data_len) {
|
||||||
if (strchr(XdrvMailbox.data, ',') != nullptr) { // Process parameter entry
|
if (ArgC() > 1) { // Process parameter entry
|
||||||
char sub_string[XdrvMailbox.data_len];
|
char argument[XdrvMailbox.data_len];
|
||||||
|
|
||||||
int ga_option = atoi(subStr(sub_string, XdrvMailbox.data, ",", 1));
|
int ga_option = atoi(ArgV(argument, 1));
|
||||||
int ga_area = atoi(subStr(sub_string, XdrvMailbox.data, ",", 2));
|
int ga_area = atoi(ArgV(argument, 2));
|
||||||
int ga_line = atoi(subStr(sub_string, XdrvMailbox.data, ",", 3));
|
int ga_line = atoi(ArgV(argument, 3));
|
||||||
int ga_member = atoi(subStr(sub_string, XdrvMailbox.data, ",", 4));
|
int ga_member = atoi(ArgV(argument, 4));
|
||||||
|
|
||||||
if ( ((ga_area == 0) && (ga_line == 0) && (ga_member == 0))
|
if ( ((ga_area == 0) && (ga_line == 0) && (ga_member == 0))
|
||||||
|| (ga_area > 31) || (ga_line > 7) || (ga_member > 255)
|
|| (ga_area > 31) || (ga_line > 7) || (ga_member > 255)
|
||||||
@ -1259,13 +1259,13 @@ void CmndKnxCb(void)
|
|||||||
{
|
{
|
||||||
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_KNX_CB)) {
|
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_KNX_CB)) {
|
||||||
if (XdrvMailbox.data_len) {
|
if (XdrvMailbox.data_len) {
|
||||||
if (strchr(XdrvMailbox.data, ',') != nullptr) { // Process parameter entry
|
if (ArgC() > 1) { // Process parameter entry
|
||||||
char sub_string[XdrvMailbox.data_len];
|
char argument[XdrvMailbox.data_len];
|
||||||
|
|
||||||
int cb_option = atoi(subStr(sub_string, XdrvMailbox.data, ",", 1));
|
int cb_option = atoi(ArgV(argument, 1));
|
||||||
int cb_area = atoi(subStr(sub_string, XdrvMailbox.data, ",", 2));
|
int cb_area = atoi(ArgV(argument, 2));
|
||||||
int cb_line = atoi(subStr(sub_string, XdrvMailbox.data, ",", 3));
|
int cb_line = atoi(ArgV(argument, 3));
|
||||||
int cb_member = atoi(subStr(sub_string, XdrvMailbox.data, ",", 4));
|
int cb_member = atoi(ArgV(argument, 4));
|
||||||
|
|
||||||
if ( ((cb_area == 0) && (cb_line == 0) && (cb_member == 0))
|
if ( ((cb_area == 0) && (cb_line == 0) && (cb_member == 0))
|
||||||
|| (cb_area > 31) || (cb_line > 7) || (cb_member > 255)
|
|| (cb_area > 31) || (cb_line > 7) || (cb_member > 255)
|
||||||
|
@ -289,48 +289,36 @@ void WindMeterTriggerTele(void)
|
|||||||
|
|
||||||
bool Xsns68Cmnd(void)
|
bool Xsns68Cmnd(void)
|
||||||
{
|
{
|
||||||
bool serviced = true;
|
if (ArgC() > 1) {
|
||||||
bool show_parms = true;
|
char argument[XdrvMailbox.data_len];
|
||||||
char sub_string[XdrvMailbox.data_len +1];
|
switch (XdrvMailbox.payload) {
|
||||||
switch (XdrvMailbox.payload) {
|
case 1:
|
||||||
case 1:
|
Settings.windmeter_radius = (uint16_t)strtol(ArgV(argument, 2), nullptr, 10);
|
||||||
if (strchr(XdrvMailbox.data, ',') != nullptr) {
|
break;
|
||||||
Settings.windmeter_radius = (uint16_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10);
|
case 2:
|
||||||
}
|
Settings.windmeter_pulses_x_rot = (uint8_t)strtol(ArgV(argument, 2), nullptr, 10);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 3:
|
||||||
if (strchr(XdrvMailbox.data, ',') != nullptr) {
|
Settings.windmeter_pulse_debounce = (uint16_t)strtol(ArgV(argument, 2), nullptr, 10);
|
||||||
Settings.windmeter_pulses_x_rot = (uint8_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10);
|
break;
|
||||||
}
|
case 4:
|
||||||
break;
|
Settings.windmeter_speed_factor = (int16_t)(CharToFloat(ArgV(argument, 2)) * 1000);
|
||||||
case 3:
|
break;
|
||||||
if (strchr(XdrvMailbox.data, ',') != nullptr) {
|
case 5:
|
||||||
Settings.windmeter_pulse_debounce = (uint16_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10);
|
Settings.windmeter_tele_pchange = (uint8_t)strtol(ArgV(argument, 2), nullptr, 10);
|
||||||
}
|
break;
|
||||||
break;
|
}
|
||||||
case 4:
|
|
||||||
if (strchr(XdrvMailbox.data, ',') != nullptr) {
|
|
||||||
Settings.windmeter_speed_factor = (int16_t)(CharToFloat(subStr(sub_string, XdrvMailbox.data, ",", 2)) * 1000);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
if (strchr(XdrvMailbox.data, ',') != nullptr) {
|
|
||||||
Settings.windmeter_tele_pchange = (uint8_t)strtol(subStr(sub_string, XdrvMailbox.data, ",", 2), nullptr, 10);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (show_parms) {
|
float speed_factor = (float)Settings.windmeter_speed_factor / 1000;
|
||||||
char speed_factor_string[FLOATSZ];
|
char tele_pchange_string[4] = "off";
|
||||||
dtostrfd((float)Settings.windmeter_speed_factor / 1000, 3, speed_factor_string);
|
if (Settings.windmeter_tele_pchange <= 100) {
|
||||||
char tele_pchange_string[4] = "off";
|
itoa(Settings.windmeter_tele_pchange, tele_pchange_string, 10);
|
||||||
if (Settings.windmeter_tele_pchange <= 100) {
|
|
||||||
itoa(Settings.windmeter_tele_pchange, tele_pchange_string, 10);
|
|
||||||
}
|
|
||||||
Response_P(PSTR("{\"" D_WINDMETER_NAME "\":{\"Radius\":%d,\"PulsesPerRot\":%d,\"PulseDebounce\":%d,\"SpeedFactor\":%s,\"TeleTriggerMin%Change\":%s}}"),
|
|
||||||
Settings.windmeter_radius, Settings.windmeter_pulses_x_rot, Settings.windmeter_pulse_debounce, speed_factor_string, tele_pchange_string);
|
|
||||||
}
|
}
|
||||||
return serviced;
|
Response_P(PSTR("{\"" D_WINDMETER_NAME "\":{\"Radius\":%d,\"PulsesPerRot\":%d,\"PulseDebounce\":%d,\"SpeedFactor\":%3_f,\"TeleTriggerMin%Change\":%s}}"),
|
||||||
|
Settings.windmeter_radius, Settings.windmeter_pulses_x_rot, Settings.windmeter_pulse_debounce, &speed_factor, tele_pchange_string);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
|
Loading…
x
Reference in New Issue
Block a user