some fixes and formatting (#23084)

This commit is contained in:
gemu 2025-03-01 15:11:35 +01:00 committed by GitHub
parent 3c171c1ed8
commit 2e35a2ab93
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -49,7 +49,7 @@ keywords if then else endif, or, and are better readable for beginners (others m
// float = 4, double = 8 bytes // float = 4, double = 8 bytes
const uint8_t SCRIPT_VERS[2] = {5, 3}; const uint8_t SCRIPT_VERS[2] = {5, 4};
#define SCRIPT_DEBUG 0 #define SCRIPT_DEBUG 0
@ -99,6 +99,9 @@ const uint8_t SCRIPT_VERS[2] = {5, 3};
#define SPI_FLASH_2SEC_SIZE SPI_FLASH_SEC_SIZE*2 #define SPI_FLASH_2SEC_SIZE SPI_FLASH_SEC_SIZE*2
#define UNIX_TS_OFFSET 0
//1740389573
#define SCRIPT_EOL '\n' #define SCRIPT_EOL '\n'
#define SCRIPT_FLOAT_PRECISION 2 #define SCRIPT_FLOAT_PRECISION 2
#define PMEM_SIZE sizeof(Settings->script_pram) #define PMEM_SIZE sizeof(Settings->script_pram)
@ -248,6 +251,10 @@ char *Get_esc_char(char *cp, char *esc_chr);
#endif #endif
#ifndef NO_SCRIPT_FATFS_EXT
#undef USE_SCRIPT_FATFS_EXT
#define USE_SCRIPT_FATFS_EXT
#endif
#ifdef USE_SCRIPT_TIMER #ifdef USE_SCRIPT_TIMER
#include <Ticker.h> #include <Ticker.h>
@ -351,7 +358,7 @@ void alt_eeprom_readBytes(uint32_t adr, uint32_t len, uint8_t *buf) {
#include <TasmotaSerial.h> #include <TasmotaSerial.h>
#ifdef TESLA_POWERWALL #if defined(ESP32) && defined(TESLA_POWERWALL)
#include "SSLClient/ESP_SSLClient.h" #include "SSLClient/ESP_SSLClient.h"
#include "include/powerwall.h" #include "include/powerwall.h"
#endif #endif
@ -949,6 +956,35 @@ uint32_t Script_Find_Vars(char *sp) {
return (svars << 16) | numvars; return (svars << 16) | numvars;
} }
// get integer with math
int32_t get_math_intval(char *cp) {
int32_t result = strtol(cp, &cp, 10);
while (*cp) {
while (*cp == ' ') cp++;
if (*cp == SCRIPT_EOL) { break; }
switch (*cp) {
case '+':
cp++;
result += strtol(cp, &cp, 10);
break;
case '-':
cp++;
result -= strtol(cp, &cp, 10);
break;
case '*':
cp++;
result *= strtol(cp, &cp, 10);
break;
case '/':
cp++;
result /= strtol(cp, &cp, 10);
break;
}
}
return result;
//return atoi(cp);
}
// allocates all variables and presets them // allocates all variables and presets them
int16_t Init_Scripter(void) { int16_t Init_Scripter(void) {
@ -1043,6 +1079,8 @@ char *script;
glob_script_mem.scriptptr = 0; glob_script_mem.scriptptr = 0;
char init = 0; char init = 0;
uint8_t pflg = 0;
uint16_t pmem = 0;
while (1) { while (1) {
// check line // check line
// skip leading spaces // skip leading spaces
@ -1065,10 +1103,12 @@ char *script;
lp += 2; lp += 2;
if (numperm < SCRIPT_MAXPERM) { if (numperm < SCRIPT_MAXPERM) {
vtypes[vars].bits.is_permanent = 1; vtypes[vars].bits.is_permanent = 1;
pflg = 1;
numperm++; numperm++;
} }
} else { } else {
vtypes[vars].bits.is_permanent = 0; vtypes[vars].bits.is_permanent = 0;
pflg = 0;
} }
if (*lp == 't' && *(lp + 1) == ':') { if (*lp == 't' && *(lp + 1) == ':') {
lp += 2; lp += 2;
@ -1169,9 +1209,11 @@ char *script;
op++; op++;
} }
while (*op == ' ') op++; while (*op == ' ') op++;
uint16_t flen = 1;
if (isdigit(*op)) { if (isdigit(*op)) {
// lenght define follows // lenght define follows
uint16_t flen = atoi(op); //flen = atoi(op);
flen = get_math_intval(op);
if (flen > MAX_ARRAY_SIZE) { if (flen > MAX_ARRAY_SIZE) {
// limit array size // limit array size
flen = MAX_ARRAY_SIZE; flen = MAX_ARRAY_SIZE;
@ -1179,10 +1221,23 @@ char *script;
mfilt[numflt - 1].numvals &= OR_FILT_MASK; mfilt[numflt - 1].numvals &= OR_FILT_MASK;
mfilt[numflt - 1].numvals |= flen & AND_FILT_MASK; mfilt[numflt - 1].numvals |= flen & AND_FILT_MASK;
} }
if (pflg) {
pmem += sizeof(TS_FLOAT) * flen;
pflg = 0;
}
} else {
if (pflg) {
pmem += sizeof(TS_FLOAT);
pflg = 0;
}
} }
} else { } else {
// string vars // string vars
if (pflg) {
pmem += glob_script_mem.max_ssize;
pflg = 0;
}
op++; op++;
*snp_p ++= strings_p; *snp_p ++= strings_p;
while (*op != '\"') { while (*op != '\"') {
@ -1233,6 +1288,10 @@ char *script;
fsize += sizeof(struct M_FILT) + ((mfilt[count].numvals & AND_FILT_MASK) - 1) * sizeof(TS_FLOAT); fsize += sizeof(struct M_FILT) + ((mfilt[count].numvals & AND_FILT_MASK) - 1) * sizeof(TS_FLOAT);
} }
if (pmem >= glob_script_mem.script_pram_size) {
return -6;
}
// now copy vars to memory // now copy vars to memory
uint32_t script_mem_size = uint32_t script_mem_size =
// number and number shadow vars // number and number shadow vars
@ -1346,7 +1405,7 @@ char *script;
// variables usage info // variables usage info
uint32_t tot_mem = sizeof(glob_script_mem) + glob_script_mem.script_mem_size + glob_script_mem.script_size + index; uint32_t tot_mem = sizeof(glob_script_mem) + glob_script_mem.script_mem_size + glob_script_mem.script_size + index;
AddLog(LOG_LEVEL_INFO, PSTR("SCR: nv=%d, tv=%d, vns=%d, vmem=%d, smem=%d, gmem=%d, tmem=%d "), nvars, svars, index, glob_script_mem.script_mem_size, glob_script_mem.script_size, sizeof(glob_script_mem), tot_mem); AddLog(LOG_LEVEL_INFO, PSTR("SCR: nv=%d, tv=%d, vns=%d, vmem=%d, smem=%d, gmem=%d, pmem=%d, tmem=%d"), nvars, svars, index, glob_script_mem.script_mem_size, glob_script_mem.script_size, sizeof(glob_script_mem), pmem, tot_mem);
// copy string variables // copy string variables
char *cp1 = glob_script_mem.glob_snp; char *cp1 = glob_script_mem.glob_snp;
@ -4316,7 +4375,7 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
} }
#endif //SCRIPT_GET_HTTPS_JP #endif //SCRIPT_GET_HTTPS_JP
#ifdef TESLA_POWERWALL #if defined(ESP32) && defined(TESLA_POWERWALL)
if (!strncmp_XP(lp, XPSTR("gpwl("), 5)) { if (!strncmp_XP(lp, XPSTR("gpwl("), 5)) {
char *path; char *path;
//lp = GetStringArgument(lp + 5, OPER_EQU, path, 0); //lp = GetStringArgument(lp + 5, OPER_EQU, path, 0);
@ -4952,6 +5011,8 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
break; break;
#endif // USE_SCRIPT_ONEWIRE #endif // USE_SCRIPT_ONEWIRE
int32_t I2SPlayFile(const char *path, uint32_t decoder_type);
case 'p': case 'p':
if (!strncmp_XP(lp, XPSTR("pin["), 4)) { if (!strncmp_XP(lp, XPSTR("pin["), 4)) {
// raw pin level // raw pin level
@ -4975,7 +5036,8 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
#if !defined(ESP_IDF_VERSION) || (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5,0,0)) #if !defined(ESP_IDF_VERSION) || (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5,0,0))
Play_mp3(path); Play_mp3(path);
#else #else
I2SPlayMp3(path); //I2SPlayMp3(path);
I2SPlayFile(path, 1);
#endif #endif
len++; len++;
len = 0; len = 0;
@ -5782,13 +5844,15 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
mbp++; mbp++;
crc = 0; crc = 0;
} }
crc = MBUS_calculateCRC(mbp, mbp[2] + 3, crc); uint8_t pos = 6; // mbp[2] + 3
crc = MBUS_calculateCRC(mbp, pos, crc);
//AddLog(LOG_LEVEL_INFO,PSTR("SCR: >> %04x"), crc);
if (opts == 1) { if (opts == 1) {
if ((mbp[mbp[2] + 3] != highByte(crc)) || (mbp[mbp[2] + 4] != lowByte(crc))) { if ((mbp[pos] != highByte(crc)) || (mbp[pos + 1] != lowByte(crc))) {
fvar = -2; fvar = -2;
} }
} else { } else {
if ((mbp[mbp[2] + 3] != lowByte(crc)) || (mbp[mbp[2] + 4] != highByte(crc))) { if ((mbp[pos] != lowByte(crc)) || (mbp[pos + 1] != highByte(crc))) {
fvar = -2; fvar = -2;
} }
} }
@ -5823,13 +5887,15 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
if (nvals > alend) { if (nvals > alend) {
nvals = alend; nvals = alend;
} }
TS_FLOAT code = 4;
if (*lp != ')') {
lp = GetNumericArgument(lp, OPER_EQU, &code, 0);
}
uint8_t modbus_response[128]; uint8_t modbus_response[128];
uint8_t mb_index = 0; uint8_t mb_index = 0;
modbus_response[mb_index] = addr; modbus_response[mb_index] = addr;
mb_index++; mb_index++;
modbus_response[mb_index] = 4; modbus_response[mb_index] = code;
mb_index++; mb_index++;
if (mode == 0) { if (mode == 0) {
@ -6031,13 +6097,24 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value);
len = 0; len = 0;
goto strexit; goto strexit;
} }
#ifdef USE_FEXTRACT #ifdef USE_FEXTRACT
if (!strncmp_XP(lp, XPSTR("s2t("), 4)) { if (!strncmp_XP(lp, XPSTR("s2t("), 4)) {
lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0);
char str[SCRIPT_MAX_SBSIZE]; char str[SCRIPT_MAX_SBSIZE];
s2tstamp(str, SCRIPT_MAX_SBSIZE, fvar, 0); while (*lp == ' ') lp++;
if (*lp == 'i') {
uint32_t secs = *(uint32_t*)&fvar;
s2tstamp(str, SCRIPT_MAX_SBSIZE, secs, 0);
lp++;
} else {
uint32_t secs = (uint32_t)fvar + (uint32_t)glob_script_mem.epoch_offset;
s2tstamp(str, SCRIPT_MAX_SBSIZE, secs, 0);
}
if (sp) strlcpy(sp, str, glob_script_mem.max_ssize); if (sp) strlcpy(sp, str, glob_script_mem.max_ssize);
len = 0; len = 0;
lp++;
goto strexit; goto strexit;
} }
#endif // USE_FEXTRACT #endif // USE_FEXTRACT
@ -6206,7 +6283,14 @@ void tmod_directModeOutput(uint32_t pin);
if (!strncmp_XP(lp, XPSTR("tsn("), 4)) { if (!strncmp_XP(lp, XPSTR("tsn("), 4)) {
char str[SCRIPT_MAX_SBSIZE]; char str[SCRIPT_MAX_SBSIZE];
lp = GetStringArgument(lp + 4, OPER_EQU, str, 0); lp = GetStringArgument(lp + 4, OPER_EQU, str, 0);
fvar = tstamp2l(str); while (*lp == ' ') lp++;
if (*lp == 'i') {
lp++;
uint32_t result = tstamp2l(str);
fvar = *(float*)&result;
} else {
fvar = tstamp2l(str) - (uint32_t)glob_script_mem.epoch_offset;
}
goto nfuncexit; goto nfuncexit;
} }
#endif #endif
@ -6303,7 +6387,11 @@ void tmod_directModeOutput(uint32_t pin);
case 6: case 6:
{ TS_FLOAT fvar2; { TS_FLOAT fvar2;
lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv);
#ifdef USE_WEBCAM_V2
fvar = 0;
#else
fvar = WcSetMotionDetect(fvar2); fvar = WcSetMotionDetect(fvar2);
#endif
} }
break; break;
/* /*
@ -7342,7 +7430,7 @@ void Replace_Cmd_Vars(char *srcbuf, uint32_t srcsize, char *dstbuf, uint32_t dst
if (*(cp + 1) == '.' || *(cp + 1) == ',') { if (*(cp + 1) == '.' || *(cp + 1) == ',') {
dsep = *(cp + 1); dsep = *(cp + 1);
lzero = *cp & 0xf; lzero = *cp & 0xf;
cp+=2; cp += 2;
} }
dprec = *cp & 0xf; dprec = *cp & 0xf;
cp++; cp++;
@ -7351,7 +7439,7 @@ void Replace_Cmd_Vars(char *srcbuf, uint32_t srcsize, char *dstbuf, uint32_t dst
lzero = glob_script_mem.script_lzero; lzero = glob_script_mem.script_lzero;
dsep = glob_script_mem.script_sepc; dsep = glob_script_mem.script_sepc;
} }
if (*cp=='(') { if (*cp == '(') {
// math expression // math expression
cp++; cp++;
glob_script_mem.glob_error = 0; glob_script_mem.glob_error = 0;
@ -7395,7 +7483,7 @@ void Replace_Cmd_Vars(char *srcbuf, uint32_t srcsize, char *dstbuf, uint32_t dst
count += 2; count += 2;
while (*cp != '%') { while (*cp != '%') {
if (*cp == 0 || *cp == SCRIPT_EOL) { if (*cp == 0 || *cp == SCRIPT_EOL) {
dstbuf[count+1] = 0; dstbuf[count + 1] = 0;
return; return;
} }
cp++; cp++;
@ -7405,15 +7493,15 @@ void Replace_Cmd_Vars(char *srcbuf, uint32_t srcsize, char *dstbuf, uint32_t dst
} }
} }
} else { } else {
if (*cp=='\\') { if (*cp == '\\') {
cp++; cp++;
if (*cp=='n') { if (*cp == 'n') {
dstbuf[count] = '\n'; dstbuf[count] = '\n';
} else if (*cp=='r') { } else if (*cp == 'r') {
dstbuf[count] = '\r'; dstbuf[count] = '\r';
} else if (*cp=='\\') { } else if (*cp == '\\') {
dstbuf[count] = '\\'; dstbuf[count] = '\\';
} else if (*cp=='#') { } else if (*cp == '#') {
dstbuf[count] = '#'; dstbuf[count] = '#';
} else { } else {
dstbuf[count] = *cp; dstbuf[count] = *cp;
@ -7421,7 +7509,7 @@ void Replace_Cmd_Vars(char *srcbuf, uint32_t srcsize, char *dstbuf, uint32_t dst
} else { } else {
dstbuf[count] = *cp; dstbuf[count] = *cp;
} }
if (*cp==0) { if (*cp == 0) {
break; break;
} }
cp++; cp++;
@ -10442,7 +10530,11 @@ bool ScriptCommand(void) {
*SSIZE_PSTORE = XdrvMailbox.payload; *SSIZE_PSTORE = XdrvMailbox.payload;
TasmotaGlobal.restart_flag = 2; TasmotaGlobal.restart_flag = 2;
} }
Response_P(PSTR("{\"script buffer\":%d}"), *SSIZE_PSTORE); uint16_t ssize = *SSIZE_PSTORE;
if (!ssize) {
ssize = UFSYS_SIZE;
}
Response_P(PSTR("{\"script buffer\":%d}"), ssize);
serviced = true; serviced = true;
#endif #endif
#endif #endif
@ -11705,6 +11797,7 @@ int32_t web_send_file(char mc, char *fname) {
char *web_send_line(char mc, char *lp1) { char *web_send_line(char mc, char *lp1) {
//char tmp[256]; //char tmp[256];
char *tmp = (char*)malloc(SCRIPT_WS_LINE_SIZE); char *tmp = (char*)malloc(SCRIPT_WS_LINE_SIZE);
if (!tmp) { if (!tmp) {
return 0; return 0;
@ -13024,7 +13117,7 @@ int32_t http_req(char *host, char *header, char *request) {
#ifdef SCRIPT_GET_HTTPS_JP #ifdef SCRIPT_GET_HTTPS_JP
#ifdef TESLA_POWERWALL #if defined(ESP32) && defined(TESLA_POWERWALL)
Powerwall powerwall = Powerwall(); Powerwall powerwall = Powerwall();
int32_t call2pwl(const char *url) { int32_t call2pwl(const char *url) {
@ -13682,7 +13775,6 @@ bool Xdrv10(uint32_t function) {
//case FUNC_PRE_INIT: //case FUNC_PRE_INIT:
//case FUNC_INIT: //case FUNC_INIT:
case FUNC_SETUP_RING1: // We need to setup SCRIPT before call to ScriptLoadSection() case FUNC_SETUP_RING1: // We need to setup SCRIPT before call to ScriptLoadSection()
//bitWrite(Settings->rule_enabled, 0, 0); // >>>>>>>>>>> //bitWrite(Settings->rule_enabled, 0, 0); // >>>>>>>>>>>
#ifndef NO_SCRIPT_STOP_ON_ERROR #ifndef NO_SCRIPT_STOP_ON_ERROR
bitWrite(Settings->rule_stop, 0, 1); bitWrite(Settings->rule_stop, 0, 1);