Refactor Gui Configure Domoticz save settings

This commit is contained in:
Theo Arends 2021-05-03 16:15:47 +02:00
parent f0f6f94374
commit 10484fbdce
2 changed files with 45 additions and 22 deletions

View File

@ -420,12 +420,39 @@ static void WebGetArg(const char* arg, char* out, size_t max)
// out[max-1] = '\0'; // Ensure terminating NUL
}
String AddWebCommand(const char* command, const char* webarg, const char* dflt) {
char arg[100]; // Allow parameter with lenght up to 99 characters
WebGetArg(webarg, arg, sizeof(arg));
char cmnd[120];
snprintf_P(cmnd, sizeof(cmnd), PSTR(";%s %s"), command, (!strlen(arg)) ? dflt : (StrCaseStr_P(command, PSTR("Password")) && (strlen(arg) < 5)) ? "" : arg);
String AddWebCommand(const char* command, const char* arg, const char* dflt) {
// OK but fixed max argument
char param[200]; // Allow parameter with lenght up to 199 characters
WebGetArg(arg, param, sizeof(param));
uint32_t len = strlen(param);
char cmnd[232];
snprintf_P(cmnd, sizeof(cmnd), PSTR(";%s %s"), command, (0 == len) ? dflt : (StrCaseStr_P(command, PSTR("Password")) && (len < 5)) ? "" : param);
return String(cmnd);
/*
// Any argument size (within stack space) +48 bytes
String param = Webserver->arg((const __FlashStringHelper *)arg);
uint32_t len = param.length();
// char cmnd[len + strlen_P(command) + strlen_P(dflt) + 4];
char cmnd[64 + len];
snprintf_P(cmnd, sizeof(cmnd), PSTR(";%s %s"), command, (0 == len) ? dflt : (StrCaseStr_P(command, PSTR("Password")) && (len < 5)) ? "" : param.c_str());
return String(cmnd);
*/
/*
// Exception (3) +24 bytes
String result = F(";");
result += command;
result += F(" ");
String param = Webserver->arg((const __FlashStringHelper *)arg);
uint32_t len = param.length();
if (0 == len) {
result += dflt;
}
else if (!(StrCaseStr_P(command, PSTR("Password")) && (len < 5))) {
result += param;
}
return result;
*/
}
static bool WifiIsInManagerMode(){

View File

@ -602,31 +602,27 @@ void HandleDomoticzConfiguration(void) {
}
void DomoticzSaveSettings(void) {
char tmp1[CMDSZ];
WebGetArg(PSTR("ut"), tmp1, sizeof(tmp1));
char command[500];
snprintf_P(command, sizeof(command), PSTR(D_CMND_BACKLOG "0 " D_PRFX_DOMOTICZ D_CMND_UPDATETIMER " %s"),
(!strlen(tmp1)) ? STR(DOMOTICZ_UPDATE_TIMER) : tmp1);
char arg_idx[8];
char tmp2[CMDSZ];
char tmp3[CMDSZ];
String cmnd = F(D_CMND_BACKLOG "0 ");
cmnd += AddWebCommand(PSTR(D_PRFX_DOMOTICZ D_CMND_UPDATETIMER), PSTR("ut"), STR(DOMOTICZ_UPDATE_TIMER));
char arg_idx[5];
char cmnd2[24];
for (uint32_t i = 1; i <= MAX_DOMOTICZ_IDX; i++) {
snprintf_P(cmnd2, sizeof(cmnd2), PSTR(D_PRFX_DOMOTICZ D_CMND_IDX "%d"), i);
snprintf_P(arg_idx, sizeof(arg_idx), PSTR("r%d"), i -1);
WebGetArg(arg_idx, tmp1, sizeof(tmp1));
cmnd += AddWebCommand(cmnd2, arg_idx, PSTR("0"));
snprintf_P(cmnd2, sizeof(cmnd2), PSTR(D_PRFX_DOMOTICZ D_CMND_KEYIDX "%d"), i);
arg_idx[0] = 'k';
WebGetArg(arg_idx, tmp2, sizeof(tmp2));
cmnd += AddWebCommand(cmnd2, arg_idx, PSTR("0"));
snprintf_P(cmnd2, sizeof(cmnd2), PSTR(D_PRFX_DOMOTICZ D_CMND_SWITCHIDX "%d"), i);
arg_idx[0] = 's';
WebGetArg(arg_idx, tmp3, sizeof(tmp3));
snprintf_P(command, sizeof(command),PSTR("%s;" D_PRFX_DOMOTICZ D_CMND_IDX "%d %s;" D_PRFX_DOMOTICZ D_CMND_KEYIDX "%d %s;" D_PRFX_DOMOTICZ D_CMND_SWITCHIDX "%d %s"),
command, i, (!strlen(tmp1)) ? "0" : tmp1, i, (!strlen(tmp2)) ? "0" : tmp2, i, (!strlen(tmp3)) ? "0" : tmp3);
cmnd += AddWebCommand(cmnd2, arg_idx, PSTR("0"));
}
for (uint32_t i = 1; i <= DZ_MAX_SENSORS; i++) {
snprintf_P(cmnd2, sizeof(cmnd2), PSTR(D_PRFX_DOMOTICZ D_CMND_SENSORIDX "%d"), i);
snprintf_P(arg_idx, sizeof(arg_idx), PSTR("l%d"), i -1);
WebGetArg(arg_idx, tmp1, sizeof(tmp1));
snprintf_P(command, sizeof(command),PSTR("%s;" D_PRFX_DOMOTICZ D_CMND_SENSORIDX "%d %s"),
command, i, (!strlen(tmp1)) ? "0" : tmp1);
cmnd += AddWebCommand(cmnd2, arg_idx, PSTR("0"));
}
ExecuteWebCommand(command); // Note: beware of max number of commands in backlog currently 30 (MAX_BACKLOG)
ExecuteWebCommand((char*)cmnd.c_str()); // Note: beware of max number of commands in backlog currently 30 (MAX_BACKLOG)
}
#endif // USE_WEBSERVER