From 1a07fc7deb1c9b81fc46821c70fc8046640280b7 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Tue, 2 Feb 2021 16:02:52 +0100 Subject: [PATCH] refactor + bugfixes --- tasmota/xdrv_10_scripter.ino | 578 +++++++++++++++++++---------------- 1 file changed, 323 insertions(+), 255 deletions(-) diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 9dd314b71..4cdd08a7e 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -46,13 +46,9 @@ adapt 3 options \*********************************************************************************************/ #define XDRV_10 10 -#define XI2C_37 37 // See I2CDEVICES.md #define SCRIPT_DEBUG 0 -#define FORMAT_SPIFFS_IF_FAILED true - - #ifndef MAXVARS #define MAXVARS 50 #endif @@ -204,9 +200,6 @@ void alt_eeprom_readBytes(uint32_t adr, uint32_t len, uint8_t *buf) { //#include #endif -#ifndef UFILESYSTEM -//FS *ufsp; -#endif #endif // LITTLEFS_SCRIPT_SIZE @@ -217,75 +210,19 @@ void alt_eeprom_readBytes(uint32_t adr, uint32_t len, uint8_t *buf) { enum {OPER_EQU=1,OPER_PLS,OPER_MIN,OPER_MUL,OPER_DIV,OPER_PLSEQU,OPER_MINEQU,OPER_MULEQU,OPER_DIVEQU,OPER_EQUEQU,OPER_NOTEQU,OPER_GRTEQU,OPER_LOWEQU,OPER_GRT,OPER_LOW,OPER_PERC,OPER_XOR,OPER_AND,OPER_OR,OPER_ANDEQU,OPER_OREQU,OPER_XOREQU,OPER_PERCEQU}; enum {SCRIPT_LOGLEVEL=1,SCRIPT_TELEPERIOD,SCRIPT_EVENT_HANDLED}; -#ifdef USE_SCRIPT_FATFS - -#if USE_SCRIPT_FATFS>=0 -//#include -//#include -//#include - -#ifdef ESP32 -//#include "FFat.h" -#ifndef UFILESYSTEM -//FS *ufsp; -#endif -#else -#ifndef UFILESYSTEM -//SDClass *ufsp; -#endif -#endif -#endif //USE_SCRIPT_FATFS - -#ifndef FAT_SCRIPT_SIZE -#define FAT_SCRIPT_SIZE 4096 -#endif - - -#ifndef ESP32 -// esp8266 - -#if USE_SCRIPT_FATFS>=0 -// old fs -//#undef FILE_WRITE -//#define FILE_WRITE (sdfat::O_READ | sdfat::O_WRITE | sdfat::O_CREAT) -//#undef FILE_APPEND -//#define FILE_APPEND (sdfat::O_READ | sdfat::O_WRITE | sdfat::O_CREAT | sdfat::O_APPEND) - -#else -// new fs -//undef FILE_WRITE -//#define FILE_WRITE "w" -//#undef FILE_READ -//#define FILE_READ "r" -//#undef FILE_APPEND -//#define FILE_APPEND "a" -#endif - -#endif // USE_SCRIPT_FATFS>=0 - +#ifdef USE_UFILESYS extern uint8_t ufs_type; extern FS *ufsp; - #ifndef UFSYS_SIZE #define UFSYS_SIZE 8192 #endif - -#ifdef ESP32 -#undef FAT_SCRIPT_NAME #define FAT_SCRIPT_NAME "/script.txt" -#else -#undef FAT_SCRIPT_NAME -#define FAT_SCRIPT_NAME "/script.txt" -#endif -//#if USE_STANDARD_SPI_LIBRARY==0 -//#warning ("FATFS standard spi should be used"); -//#endif +#endif // USE_UFILESYS -#endif // USE_SCRIPT_FATFS #ifdef SUPPORT_MQTT_EVENT #include // Import LinkedList library @@ -300,6 +237,9 @@ extern FS *ufsp; #ifdef USE_DISPLAY #ifdef USE_TOUCH_BUTTONS #include +#ifndef MAX_TOUCH_BUTTONS +#define MAX_TOUCH_BUTTONS 16 +#endif extern VButton *buttons[MAX_TOUCH_BUTTONS]; #endif #endif @@ -403,6 +343,13 @@ typedef union { } FS_FLAGS; +struct GVARS { + JsonParserObject *jo; + int16_t numind; + int16_t strind; +}; + + #define NUM_RES 0xfe #define STR_RES 0xfd #define VAR_NV 0xff @@ -458,27 +405,22 @@ struct SCRIPT_MEM { #endif //USE_SCRIPT_FATFS #ifdef USE_SCRIPT_GLOBVARS UDP_FLAGS udp_flags; -#endif + IPAddress last_udp_ip; + WiFiUDP Script_PortUdp; + IPAddress script_udp_remote_ip; +#endif // USE_SCRIPT_GLOBVARS char web_mode; + uint8_t glob_script = 0; + uint8_t fast_script = 0; + uint32_t script_lastmillis; + bool event_handeled = false; +#ifdef USE_BUTTON_EVENT + int8_t script_button[MAX_KEYS]; +#endif //USE_BUTTON_EVENT } glob_script_mem; - -bool event_handeled = false; - - -#ifdef USE_SCRIPT_GLOBVARS -IPAddress last_udp_ip; -WiFiUDP Script_PortUdp; - -#endif //USE_SCRIPT_GLOBVARS - -int16_t last_findex; -int16_t last_sindex; uint8_t tasm_cmd_activ=0; -uint8_t fast_script=0; -uint8_t glob_script=0; -uint32_t script_lastmillis; void flt2char(float num, char *nbuff) { dtostrfd(num, glob_script_mem.script_dprec, nbuff); @@ -505,12 +447,10 @@ void f2char(float num, uint32_t dprec, uint32_t lzeros, char *nbuff) { } } -#ifdef USE_BUTTON_EVENT -int8_t script_button[MAX_KEYS]; -#endif //USE_BUTTON_EVENT -char *GetNumericArgument(char *lp,uint8_t lastop,float *fp, JsonParserObject *jo); -char *GetStringArgument(char *lp,uint8_t lastop,char *cp, JsonParserObject *jo); + +char *GetNumericArgument(char *lp,uint8_t lastop,float *fp, struct GVARS *gv); +char *GetStringArgument(char *lp,uint8_t lastop,char *cp, struct GVARS *gv); char *ForceStringVar(char *lp,char *dstr); void send_download(void); uint8_t UfsReject(char *name); @@ -519,8 +459,8 @@ void ScriptEverySecond(void) { if (bitRead(Settings.rule_enabled, 0)) { struct T_INDEX *vtp = glob_script_mem.type; - float delta = (millis() - script_lastmillis) / 1000.0; - script_lastmillis = millis(); + float delta = (millis() - glob_script_mem.script_lastmillis) / 1000.0; + glob_script_mem.script_lastmillis = millis(); for (uint8_t count=0; countT", 2, TasmotaGlobal.mqtt_data); } - - - #define SCRIPT_SKIP_SPACES while (*lp==' ' || *lp=='\t') lp++; #define SCRIPT_SKIP_EOL while (*lp==SCRIPT_EOL) lp++; @@ -978,7 +915,7 @@ char *script; #ifdef USE_SCRIPT_GLOBVARS if (glob_script_mem.udp_flags.udp_used) { Script_Init_UDP(); - glob_script = Run_Scripter(">G", -2, 0); + glob_script_mem.glob_script = Run_Scripter(">G", -2, 0); } #endif //USE_SCRIPT_GLOBVARS @@ -992,7 +929,6 @@ char *script; #ifdef USE_SCRIPT_GLOBVARS #define SCRIPT_UDP_BUFFER_SIZE 128 #define SCRIPT_UDP_PORT 1999 -IPAddress script_udp_remote_ip; void Restart_globvars(void) { Script_Stop_UDP(); @@ -1002,8 +938,8 @@ void Restart_globvars(void) { void Script_Stop_UDP(void) { if (!glob_script_mem.udp_flags.udp_used) return; if (glob_script_mem.udp_flags.udp_connected) { - Script_PortUdp.flush(); - Script_PortUdp.stop(); + glob_script_mem.Script_PortUdp.flush(); + glob_script_mem.Script_PortUdp.stop(); glob_script_mem.udp_flags.udp_connected = 0; } } @@ -1013,7 +949,7 @@ void Script_Init_UDP() { if (!glob_script_mem.udp_flags.udp_used) return; if (glob_script_mem.udp_flags.udp_connected) return; - if (Script_PortUdp.beginMulticast(WiFi.localIP(), IPAddress(239,255,255,250), SCRIPT_UDP_PORT)) { + if (glob_script_mem.Script_PortUdp.beginMulticast(WiFi.localIP(), IPAddress(239,255,255,250), SCRIPT_UDP_PORT)) { AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP "SCRIPT UDP started")); glob_script_mem.udp_flags.udp_connected = 1; } else { @@ -1026,12 +962,13 @@ void Script_PollUdp(void) { if (TasmotaGlobal.global_state.network_down) return; if (!glob_script_mem.udp_flags.udp_used) return; if (glob_script_mem.udp_flags.udp_connected ) { - while (Script_PortUdp.parsePacket()) { + while (glob_script_mem.Script_PortUdp.parsePacket()) { char packet_buffer[SCRIPT_UDP_BUFFER_SIZE]; - int32_t len = Script_PortUdp.read(packet_buffer, SCRIPT_UDP_BUFFER_SIZE - 1); + int32_t len = glob_script_mem.Script_PortUdp.read(packet_buffer, SCRIPT_UDP_BUFFER_SIZE - 1); packet_buffer[len] = 0; - script_udp_remote_ip = Script_PortUdp.remoteIP(); - AddLog(LOG_LEVEL_DEBUG, PSTR("UDP: Packet %s - %d - %_I"), packet_buffer, len, (uint32_t)script_udp_remote_ip); + glob_script_mem.script_udp_remote_ip = glob_script_mem.Script_PortUdp.remoteIP(); + //AddLog(LOG_LEVEL_DEBUG, PSTR("UDP: Packet %s - %d - %s"), packet_buffer, len, script_udp_remote_ip.toString().c_str()); + AddLog(LOG_LEVEL_DEBUG, PSTR("UDP: Packet %s - %d - %_I"), packet_buffer, len, (uint32_t)glob_script_mem.script_udp_remote_ip); char *lp=packet_buffer; if (!strncmp(lp,"=>", 2)) { lp += 2; @@ -1060,9 +997,9 @@ void Script_PollUdp(void) { } if (res) { // mark changed - last_udp_ip = Script_PortUdp.remoteIP(); + glob_script_mem.last_udp_ip = glob_script_mem.Script_PortUdp.remoteIP(); glob_script_mem.type[index].bits.changed = 1; - if (glob_script==99) { + if (glob_script_mem.glob_script == 99) { Run_Scripter(">G", 2, 0); } } @@ -1092,10 +1029,10 @@ void script_udp_sendvar(char *vname,float *fp,char *sp) { strcat(sbuf, sp); AddLog(LOG_LEVEL_DEBUG, PSTR("string var updated - %s"), sbuf); } - Script_PortUdp.beginPacket(IPAddress(239, 255, 255, 250), SCRIPT_UDP_PORT); + glob_script_mem.Script_PortUdp.beginPacket(IPAddress(239, 255, 255, 250), SCRIPT_UDP_PORT); // Udp.print(String("RET UC: ") + String(recv_Packet)); - Script_PortUdp.write((const uint8_t*)sbuf, strlen(sbuf)); - Script_PortUdp.endPacket(); + glob_script_mem.Script_PortUdp.write((const uint8_t*)sbuf, strlen(sbuf)); + glob_script_mem.Script_PortUdp.endPacket(); } #endif //USE_SCRIPT_GLOBVARS @@ -1163,7 +1100,7 @@ float *Get_MFAddr(uint8_t index, uint16_t *len, uint16_t *ipos) { return 0; } -char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, JsonParserObject *jo); +char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, struct GVARS *gv); float *get_array_by_name(char *name, uint16_t *alen) { @@ -1495,7 +1432,7 @@ char *isargs(char *lp, uint32_t isind) { return lp; } -char *isget(char *lp, char *sp, uint32_t isind) { +char *isget(char *lp, char *sp, uint32_t isind, struct GVARS *gv) { float fvar; lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); SCRIPT_SKIP_SPACES @@ -1504,7 +1441,7 @@ float fvar; uint8_t index = fvar; if (index<1) index = 1; index--; - last_sindex = index; + if (gv) gv->strind = index; glob_script_mem.sind_num = isind; if (glob_script_mem.last_index_string[isind]) { if (!glob_script_mem.si_num[isind]) { @@ -1525,7 +1462,7 @@ float fvar; // vtype => ff=nothing found, fe=constant number,fd = constant string else bit 7 => 80 = string, 0 = number // no flash strings here for performance reasons!!! -char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, JsonParserObject *jo) { +char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, struct GVARS *gv) { uint16_t count,len = 0; uint8_t nres = 0; char vname[64]; @@ -1613,8 +1550,10 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, char dvnam[32]; strcpy (dvnam, vname); uint8_t olen = len; - last_findex = -1; - last_sindex = -1; + if (gv) { + gv->numind = -1; + gv->strind = -1; + } char *ja = strchr(dvnam, '['); if (ja) { *ja = 0; @@ -1634,8 +1573,8 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, if (vtp[count].bits.is_filter) { if (ja) { lp += olen + 1; - lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); - last_findex = fvar; + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); + if (gv) gv->numind = fvar; fvar = Get_MFVal(index, fvar); len = 1; } else { @@ -1656,7 +1595,7 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, } } - if (jo) { + if (gv && gv->jo) { // look for json input char jvname[64]; strcpy(jvname, vname); @@ -1670,12 +1609,12 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, ja++; // fetch array index float fvar; - GetNumericArgument(ja, OPER_EQU, &fvar, 0); + GetNumericArgument(ja, OPER_EQU, &fvar, gv); aindex = fvar; if (aindex<1 || aindex>6) aindex = 1; aindex--; } - if (jo->isValid()) { + if (gv->jo->isValid()) { char *subtype = strchr(jvname, '#'); char *subtype2; if (subtype) { @@ -1688,23 +1627,23 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, } } vn = jvname; - str_value = (*jo)[vn].getStr(); - if ((*jo)[vn].isValid()) { + str_value = (*gv->jo)[vn].getStr(); + if ((*gv->jo)[vn].isValid()) { if (subtype) { - JsonParserObject jobj1 = (*jo)[vn]; + JsonParserObject jobj1 = (*gv->jo)[vn]; if (jobj1.isValid()) { vn = subtype; - jo = &jobj1; - str_value = (*jo)[vn].getStr(); - if ((*jo)[vn].isValid()) { + gv->jo = &jobj1; + str_value = (*gv->jo)[vn].getStr(); + if ((*gv->jo)[vn].isValid()) { // 2. stage if (subtype2) { - JsonParserObject jobj2 = (*jo)[vn]; - if ((*jo)[vn].isValid()) { + JsonParserObject jobj2 = (*gv->jo)[vn]; + if ((*gv->jo)[vn].isValid()) { vn = subtype2; - jo = &jobj2; - str_value = (*jo)[vn].getStr(); - if ((*jo)[vn].isValid()) { + gv->jo = &jobj2; + str_value = (*gv->jo)[vn].getStr(); + if ((*gv->jo)[vn].isValid()) { goto skip; } else { goto chknext; @@ -1723,10 +1662,10 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, skip: if (ja) { // json array - str_value = (*jo)[vn].getArray()[aindex].getStr(); + str_value = (*gv->jo)[vn].getArray()[aindex].getStr(); } if (str_value && *str_value) { - if ((*jo)[vn].isStr()) { + if ((*gv->jo)[vn].isStr()) { if (!strncmp(str_value, "ON", 2)) { if (fp) *fp = 1; goto nexit; @@ -1765,14 +1704,14 @@ chknext: case 'a': #ifdef USE_ANGLE_FUNC if (!strncmp(vname, "acos(", 5)) { - lp=GetNumericArgument(lp + 5, OPER_EQU, &fvar, 0); + lp=GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv); fvar = acosf(fvar); lp++; len = 0; goto exit; } if (!strncmp(vname, "abs(", 4)) { - lp=GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp=GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); fvar = fabs(fvar); lp++; len = 0; @@ -1781,18 +1720,18 @@ chknext: #endif if (!strncmp(vname, "asc(", 4)) { char str[SCRIPT_MAXSSIZE]; - lp = GetStringArgument(lp + 4, OPER_EQU, str, 0); + lp = GetStringArgument(lp + 4, OPER_EQU, str, gv); fvar = str[0]; lp++; len = 0; goto exit; } if (!strncmp(vname, "adc(", 4)) { - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); while (*lp==' ') lp++; float fvar1 = 1; if (*lp!=')') { - lp = GetNumericArgument(lp, OPER_EQU, &fvar1, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar1, gv); if (fvar1<32 || fvar1>39) fvar1 = 32; } lp++; @@ -1828,11 +1767,11 @@ chknext: #ifdef USE_BUTTON_EVENT if (!strncmp(vname, "bt[", 3)) { // tasmota button state - GetNumericArgument(vname+3, OPER_EQU, &fvar, 0); + GetNumericArgument(vname+3, OPER_EQU, &fvar, gv); uint32_t index = fvar; if (index<1 || index>MAX_KEYS) index = 1; - fvar=script_button[index - 1]; - script_button[index - 1] |= 0x80; + fvar = glob_script_mem.script_button[index - 1]; + glob_script_mem.script_button[index - 1] |= 0x80; len++; goto exit; } @@ -1866,10 +1805,10 @@ chknext: } #ifdef USE_M5STACK_CORE2 if (!strncmp(vname, "c2ps(", 5)) { - lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv); while (*lp==' ') lp++; float fvar1; - lp = GetNumericArgument(lp, OPER_EQU, &fvar1, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar1, gv); fvar = core2_setaxppin(fvar, fvar1); lp++; len=0; @@ -1879,16 +1818,16 @@ chknext: #ifdef USE_SCRIPT_TASK if (!strncmp(vname, "ct(", 3)) { - lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, gv); while (*lp==' ') lp++; float fvar1; - lp = GetNumericArgument(lp, OPER_EQU, &fvar1, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar1, gv); while (*lp==' ') lp++; float fvar2; - lp = GetNumericArgument(lp, OPER_EQU, &fvar2, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); float prio = STASK_PRIO; if (*lp!=')') { - lp = GetNumericArgument(lp, OPER_EQU, &prio, 0); + lp = GetNumericArgument(lp, OPER_EQU, &prio, gv); } lp++; fvar = scripter_create_task(fvar, fvar1, fvar2, prio); @@ -1914,13 +1853,13 @@ chknext: goto exit; } if (!strncmp(vname, "eres", 4)) { - fvar = event_handeled; + fvar = glob_script_mem.event_handeled; tind->index = SCRIPT_EVENT_HANDLED; goto exit_settable; } #ifdef USE_ENERGY_SENSOR if (!strncmp(vname, "enrg[", 5)) { - lp=GetNumericArgument(lp + 5, OPER_EQU, &fvar, 0); + lp=GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv); while (*lp==' ') lp++; switch ((uint32_t)fvar) { case 0: @@ -1995,7 +1934,7 @@ chknext: } lp++; } else { - lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); mode = fvar; } fvar = -1; @@ -2040,7 +1979,7 @@ chknext: goto exit; } if (!strncmp(vname, "fc(", 3)) { - lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, gv); if (fvar>=0) { uint8_t ind = fvar; if (ind>=SFS_MAX) ind = SFS_MAX - 1; @@ -2056,7 +1995,7 @@ chknext: goto exit; } if (!strncmp(vname, "ff(", 3)) { - lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, gv); uint8_t ind = fvar; if (ind>=SFS_MAX) ind = SFS_MAX - 1; glob_script_mem.files[ind].flush(); @@ -2069,7 +2008,7 @@ chknext: char str[SCRIPT_MAXSSIZE]; lp = ForceStringVar(lp + 3, str); while (*lp==' ') lp++; - lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); uint8_t ind = fvar; if (ind>=SFS_MAX) ind = SFS_MAX - 1; if (glob_script_mem.file_flags[ind].is_open) { @@ -2102,7 +2041,7 @@ chknext: goto exit; } while (*lp==' ') lp++; - lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); uint8_t find = fvar; if (find>=SFS_MAX) find = SFS_MAX - 1; uint8_t index = 0; @@ -2164,10 +2103,10 @@ chknext: } #if defined(ESP32) && defined(USE_WEBCAM) if (!strncmp(vname, "fwp(", 4)) { - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); while (*lp==' ') lp++; float fvar1; - lp = GetNumericArgument(lp, OPER_EQU, &fvar1, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar1, gv); uint8_t ind = fvar1; if (ind>=SFS_MAX) ind = SFS_MAX - 1; if (glob_script_mem.file_flags[ind].is_open) { @@ -2240,7 +2179,7 @@ chknext: } if (!strncmp(vname, "fsi(", 4)) { - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); fvar = UfsInfo(fvar, 0); lp++; len = 0; @@ -2261,7 +2200,7 @@ chknext: } while (*lp==' ') lp++; - lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); uint8_t index = fvar; if (index>=SFS_MAX) index = SFS_MAX - 1; if (glob_script_mem.file_flags[index].is_open) { @@ -2300,7 +2239,7 @@ chknext: } while (*lp==' ') lp++; - lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); uint8_t find = fvar; if (find>=SFS_MAX) find = SFS_MAX - 1; char str[glob_script_mem.max_ssize + 1]; @@ -2382,6 +2321,73 @@ chknext: if (sp) strlcpy(sp, SettingsText(SET_MQTT_GRP_TOPIC), glob_script_mem.max_ssize); goto strexit; } +#ifdef USE_WEBSEND_RESPONSE + if (!strncmp(vname, "gwr(", 4)) { + char delim[SCRIPT_MAXSSIZE]; + lp = GetStringArgument(lp + 4, OPER_EQU, delim, 0); + SCRIPT_SKIP_SPACES + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); + SCRIPT_SKIP_SPACES + char rstring[SCRIPT_MAXSSIZE]; + rstring[0] = 0; + int8_t index = fvar; + char *wd = TasmotaGlobal.mqtt_data; + strlcpy(rstring, wd, glob_script_mem.max_ssize); + if (index) { + if (strlen(wd) && index) { + if (index<0) { + // assume val=xxx + rstring[0] = 0; + char *cp = strstr(wd, delim); + if (cp) { + cp = strchr(cp, '='); + if (cp) { + cp++; + for (uint32_t cnt = 0; cnt < glob_script_mem.max_ssize; cnt++) { + if (*cp==',' || *cp==':' || *cp==0) { + rstring[cnt] = 0; + break; + } + rstring[cnt] = *cp++; + } + } + } + } else { + // preserve mqtt_data + char *mqd = (char*)malloc(MESSZ+2); + if (mqd) { + strlcpy(mqd, TasmotaGlobal.mqtt_data, MESSZ); + wd = mqd; + char *lwd = wd; + while (index) { + char *cp = strstr(wd, delim); + if (cp) { + index--; + if (!index) { + // take this substring + *cp = 0; + strlcpy(rstring, lwd, glob_script_mem.max_ssize); + } else { + wd = cp + strlen(delim); + lwd = wd; + } + } else { + // fail or last string + strlcpy(rstring, lwd, glob_script_mem.max_ssize); + break; + } + } + free(mqd); + } + } + } + } + if (sp) strlcpy(sp, rstring, glob_script_mem.max_ssize); + lp++; + len = 0; + goto strexit; + } +#endif #ifdef SCRIPT_GET_HTTPS_JP if (!strncmp(vname, "gjp(", 4)) { @@ -2407,7 +2413,7 @@ chknext: goto exit; } if (!strncmp(vname, "hn(", 3)) { - lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, gv); if (fvar<0 || fvar>255) fvar = 0; lp++; len = 0; @@ -2417,7 +2423,7 @@ chknext: goto strexit; } if (!strncmp(vname, "hx(", 3)) { - lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, gv); lp++; len = 0; if (sp) { @@ -2433,19 +2439,31 @@ chknext: len = 0; goto exit; } + if (!strncmp(vname, "http(", 5)) { + char host[SCRIPT_MAXSSIZE]; + lp = GetStringArgument(lp + 5, OPER_EQU, host, 0); + SCRIPT_SKIP_SPACES + char request[SCRIPT_MAXSSIZE]; + lp = GetStringArgument(lp, OPER_EQU, request, 0); + SCRIPT_SKIP_SPACES + fvar = http_req(host, request); + lp++; + len = 0; + goto exit; + } #ifdef USE_LIGHT if (!strncmp(vname, "hsvrgb(", 7)) { - lp = GetNumericArgument(lp + 7, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 7, OPER_EQU, &fvar, gv); if (fvar<0 || fvar>360) fvar = 0; SCRIPT_SKIP_SPACES // arg2 float fvar2; - lp = GetNumericArgument(lp, OPER_EQU, &fvar2, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); if (fvar2<0 || fvar2>100) fvar2 = 0; SCRIPT_SKIP_SPACES // arg3 float fvar3; - lp = GetNumericArgument(lp, OPER_EQU, &fvar3, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar3, gv); if (fvar3<0 || fvar3>100) fvar3 = 0; fvar = HSVToRGB(fvar, fvar2, fvar3); @@ -2457,7 +2475,7 @@ chknext: break; case 'i': if (!strncmp(vname, "int(", 4)) { - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); fvar = floor(fvar); lp++; len = 0; @@ -2482,17 +2500,17 @@ chknext: goto exit; } if (!strncmp(vname, "is[", 3)) { - lp = isget(lp + 3, sp, 0); + lp = isget(lp + 3, sp, 0, gv); len = 0; goto strexit; } if (!strncmp(vname, "is1[", 4)) { - lp = isget(lp + 4, sp, 1); + lp = isget(lp + 4, sp, 1, gv); len = 0; goto strexit; } if (!strncmp(vname, "is2[", 4)) { - lp = isget(lp + 4, sp, 2); + lp = isget(lp + 4, sp, 2, gv); len = 0; goto strexit; } @@ -2504,7 +2522,7 @@ chknext: } #ifdef USE_SCRIPT_GLOBVARS if (!strncmp(vname, "luip", 4)) { - if (sp) strlcpy(sp, last_udp_ip.toString().c_str(), glob_script_mem.max_ssize); + if (sp) strlcpy(sp, glob_script_mem.last_udp_ip.toString().c_str(), glob_script_mem.max_ssize); goto strexit; } #endif //USE_SCRIPT_GLOBVARS @@ -2522,11 +2540,11 @@ chknext: case 'm': if (!strncmp(vname, "med(", 4)) { float fvar1; - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar1, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar1, gv); SCRIPT_SKIP_SPACES // arg2 float fvar2; - lp = GetNumericArgument(lp, OPER_EQU, &fvar2, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); fvar = DoMedian5(fvar1, fvar2); lp++; len = 0; @@ -2534,7 +2552,7 @@ chknext: } #ifdef USE_ANGLE_FUNC if (!strncmp(vname, "mpt(", 4)) { - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); fvar = MeasurePulseTime(fvar); lp++; len = 0; @@ -2577,13 +2595,13 @@ chknext: } if (!strncmp(vname, "mp(", 3)) { float fvar1; - lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar1, 0); + lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar1, gv); SCRIPT_SKIP_SPACES while (*lp!=')') { char *opp = lp; lp++; float fvar2; - lp = GetNumericArgument(lp, OPER_EQU, &fvar2, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); SCRIPT_SKIP_SPACES fvar = fvar1; if ((*opp=='<' && fvar1MAX_COUNTERS) index = 1; fvar = RtcSettings.pulse_counter[index - 1]; len += 1; goto exit; } + break; case 'r': @@ -2729,7 +2748,7 @@ chknext: } if (!strncmp(vname, "rnd(", 4)) { // tasmota switch state - GetNumericArgument(vname + 4, OPER_EQU, &fvar, 0); + GetNumericArgument(vname + 4, OPER_EQU, &fvar, gv); if (fvar<0) { randomSeed(-fvar); fvar = 0; @@ -2745,7 +2764,7 @@ chknext: char str[SCRIPT_MAXSSIZE]; lp = GetStringArgument(lp + 4, OPER_EQU, str, 0); SCRIPT_SKIP_SPACES - lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); fvar = i2s_record(str, fvar); len++; goto exit; @@ -2759,7 +2778,7 @@ chknext: } if (!strncmp(vname, "sw[", 3)) { // tasmota switch state - GetNumericArgument(vname + 3, OPER_EQU, &fvar, 0); + GetNumericArgument(vname + 3, OPER_EQU, &fvar, gv); fvar = SwitchLastState((uint32_t)fvar); // skip ] bracket len++; @@ -2792,10 +2811,10 @@ chknext: lp = GetStringArgument(lp + 3, OPER_EQU, str, 0); SCRIPT_SKIP_SPACES float fvar1; - lp = GetNumericArgument(lp, OPER_EQU, &fvar1, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar1, gv); SCRIPT_SKIP_SPACES float fvar2; - lp = GetNumericArgument(lp, OPER_EQU, &fvar2, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); lp++; len = 0; if (fvar1<0) { @@ -2813,7 +2832,7 @@ chknext: token[0] = *lp++; token[1] = 0; while (*lp==' ') lp++; - lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); // skip ) bracket lp++; len = 0; @@ -2839,7 +2858,7 @@ chknext: goto strexit; } if (!strncmp(vname, "s(", 2)) { - lp = GetNumericArgument(lp + 2, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 2, OPER_EQU, &fvar, gv); char str[glob_script_mem.max_ssize + 1]; f2char(fvar, glob_script_mem.script_dprec, glob_script_mem.script_lzero, str); if (sp) strlcpy(sp, str, glob_script_mem.max_ssize); @@ -2860,7 +2879,7 @@ chknext: #ifdef ESP32 if (!strncmp(vname, "sf(", 3)) { - lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, gv); if (fvar<80) fvar = 80; if (fvar>240) fvar = 240; setCpuFrequencyMhz(fvar); @@ -2872,7 +2891,7 @@ chknext: #endif //ESP32 #ifdef USE_TTGO_WATCH if (!strncmp(vname, "slp(", 4)) { - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); SCRIPT_SKIP_SPACES TTGO_Sleep(fvar); lp++; @@ -2893,7 +2912,7 @@ chknext: #ifdef USE_SHUTTER if (!strncmp(vname, "sht[", 4)) { - GetNumericArgument(vname + 4, OPER_EQU, &fvar, 0); + GetNumericArgument(vname + 4, OPER_EQU, &fvar, gv); uint8_t index = fvar; if (index<=TasmotaGlobal.shutters_present) { fvar = Settings.shutter_position[index - 1]; @@ -2906,14 +2925,14 @@ chknext: #endif //USE_SHUTTER #ifdef USE_ANGLE_FUNC if (!strncmp(vname, "sin(", 4)) { - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); fvar = sinf(fvar); lp++; len = 0; goto exit; } if (!strncmp(vname, "sqrt(", 5)) { - lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv); fvar = sqrtf(fvar); lp++; len = 0; @@ -2923,7 +2942,7 @@ chknext: #if defined(USE_SML_M) && defined (USE_SML_SCRIPT_CMD) if (!strncmp(vname, "sml[", 4)) { - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); SCRIPT_SKIP_SPACES fvar = SML_GetVal(fvar); lp++; @@ -2932,14 +2951,14 @@ chknext: } if (!strncmp(vname, "sml(", 4)) { float fvar1; - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar1, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar1, gv); SCRIPT_SKIP_SPACES float fvar2; - lp = GetNumericArgument(lp, OPER_EQU, &fvar2, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); SCRIPT_SKIP_SPACES if (fvar2==0) { float fvar3; - lp = GetNumericArgument(lp, OPER_EQU, &fvar3, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar3, gv); fvar = SML_SetBaud(fvar1, fvar3); } else if (fvar2==1) { char str[SCRIPT_MAXSSIZE]; @@ -2995,7 +3014,7 @@ chknext: } #ifdef USE_SCRIPT_TIMER if (!strncmp(vname, "ts1(", 4)) { - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); if (fvar<10) fvar = 10; Script_ticker1.attach_ms(fvar, Script_ticker1_end); lp++; @@ -3003,7 +3022,7 @@ chknext: goto exit; } if (!strncmp(vname, "ts2(", 4)) { - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); if (fvar<10) fvar = 10; Script_ticker2.attach_ms(fvar, Script_ticker2_end); lp++; @@ -3011,7 +3030,7 @@ chknext: goto exit; } if (!strncmp(vname, "ts3(", 4)) { - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); if (fvar<10) fvar = 10; Script_ticker3.attach_ms(fvar, Script_ticker3_end); lp++; @@ -3019,7 +3038,7 @@ chknext: goto exit; } if (!strncmp(vname, "ts4(", 4)) { - lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); if (fvar<10) fvar = 10; Script_ticker4.attach_ms(fvar, Script_ticker4_end); lp++; @@ -3031,7 +3050,7 @@ chknext: #ifdef USE_DISPLAY #ifdef USE_TOUCH_BUTTONS if (!strncmp(vname, "tbut[", 5)) { - GetNumericArgument(vname + 5, OPER_EQU, &fvar, 0); + GetNumericArgument(vname + 5, OPER_EQU, &fvar, gv); uint8_t index = fvar; if (index<1 || index>MAX_TOUCH_BUTTONS) index = 1; index--; @@ -3046,9 +3065,9 @@ chknext: #endif //USE_TOUCH_BUTTONS #endif //USE_DISPLAY -#if 1 +#if 0 if (!strncmp(vname, "test(", 5)) { - lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv); uint32_t cycles; uint64_t accu=0; char sbuffer[32]; @@ -3105,26 +3124,26 @@ chknext: #if defined(ESP32) && defined(USE_WEBCAM) if (!strncmp(vname, "wc(", 3)) { float fvar1; - lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar1, 0); + lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar1, gv); SCRIPT_SKIP_SPACES switch ((uint32)fvar1) { case 0: { float fvar2; - lp = GetNumericArgument(lp, OPER_EQU, &fvar2, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); fvar = WcSetup(fvar2); } break; case 1: { float fvar2; - lp = GetNumericArgument(lp, OPER_EQU, &fvar2, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); fvar = WcGetFrame(fvar2); } break; case 2: { float fvar2,fvar3; - lp = GetNumericArgument(lp, OPER_EQU, &fvar2, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); SCRIPT_SKIP_SPACES - lp = GetNumericArgument(lp, OPER_EQU, &fvar3, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar3, gv); fvar = WcSetOptions(fvar2, fvar3); } break; @@ -3136,20 +3155,20 @@ chknext: break; case 5: { float fvar2; - lp = GetNumericArgument(lp, OPER_EQU, &fvar2, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); fvar = WcSetStreamserver(fvar2); } break; case 6: { float fvar2; - lp = GetNumericArgument(lp, OPER_EQU, &fvar2, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); fvar = WcSetMotionDetect(fvar2); } break; #ifdef USE_FACE_DETECT case 7: { float fvar2; - lp = GetNumericArgument(lp, OPER_EQU, &fvar2, 0); + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); fvar = WcSetFaceDetect(fvar2); } break; @@ -3174,7 +3193,7 @@ chknext: #endif // USE_TTGO_WATCH #if defined(USE_FT5206) if (!strncmp(vname, "wtch(", 5)) { - lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, 0); + lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv); fvar = Touch_Status(fvar); lp++; len = 0; @@ -3371,14 +3390,14 @@ uint16_t GetStack(void) { } #endif //ESP8266 -char *GetStringArgument(char *lp, uint8_t lastop, char *cp, JsonParserObject *jo) { +char *GetStringArgument(char *lp, uint8_t lastop, char *cp, struct GVARS *gv) { uint8_t operand = 0; uint8_t vtype; char *slp; struct T_INDEX ind; char str[SCRIPT_MAXSSIZE],str1[SCRIPT_MAXSSIZE]; while (1) { - lp=isvar(lp, &vtype, &ind, 0, str1, jo); + lp=isvar(lp, &vtype, &ind, 0, str1, gv); if (vtype!=STR_RES && !(vtype & STYPE)) { // numeric type glob_script_mem.glob_error = 1; @@ -3417,7 +3436,7 @@ char *GetStringArgument(char *lp, uint8_t lastop, char *cp, JsonParserObject *jo return lp; } -char *GetNumericArgument(char *lp, uint8_t lastop, float *fp, JsonParserObject *jo) { +char *GetNumericArgument(char *lp, uint8_t lastop, float *fp, struct GVARS *gv) { uint8_t operand = 0; float fvar1,fvar; char *slp; @@ -3427,11 +3446,11 @@ struct T_INDEX ind; // get 1. value if (*lp=='(') { lp++; - lp = GetNumericArgument(lp, OPER_EQU, &fvar1, jo); + lp = GetNumericArgument(lp, OPER_EQU, &fvar1, gv); lp++; //if (*lp==')') lp++; } else { - lp = isvar(lp, &vtype, &ind, &fvar1, 0, jo); + lp = isvar(lp, &vtype, &ind, &fvar1, 0, gv); if ((vtype!=NUM_RES) && (vtype&STYPE)) { // string type glob_script_mem.glob_error = 1; @@ -3643,7 +3662,7 @@ void toSLog(const char *str) { #endif } -char *Evaluate_expression(char *lp, uint8_t and_or, uint8_t *result, JsonParserObject *jo) { +char *Evaluate_expression(char *lp, uint8_t and_or, uint8_t *result, struct GVARS *gv) { float fvar,*dfvar,fvar1; uint8_t numeric; struct T_INDEX ind; @@ -3660,7 +3679,7 @@ char *Evaluate_expression(char *lp, uint8_t and_or, uint8_t *result, JsonParserO loop: SCRIPT_SKIP_SPACES - lp = Evaluate_expression(lp, xand_or, &res, jo); + lp = Evaluate_expression(lp, xand_or, &res, gv); if (*lp==')') { lp++; goto exit0; @@ -3693,18 +3712,18 @@ exit0: glob_script_mem.glob_error = 0; slp = lp; numeric = 1; - lp = GetNumericArgument(lp, OPER_EQU, dfvar, 0); + lp = GetNumericArgument(lp, OPER_EQU, dfvar, gv); if (glob_script_mem.glob_error==1) { // was string, not number char cmpstr[SCRIPT_MAXSSIZE]; lp = slp; numeric = 0; // get the string - lp = isvar(lp, &vtype, &ind, 0, cmpstr, 0); + lp = isvar(lp, &vtype, &ind, 0, cmpstr, gv); lp = getop(lp, &lastop); // compare string char str[SCRIPT_MAXSSIZE]; - lp = GetStringArgument(lp, OPER_EQU, str, jo); + lp = GetStringArgument(lp, OPER_EQU, str, gv); if (lastop==OPER_EQUEQU || lastop==OPER_NOTEQU) { res = strcmp(cmpstr, str); if (lastop==OPER_EQUEQU) res=!res; @@ -3715,7 +3734,7 @@ exit0: // numeric // evaluate operand lp = getop(lp, &lastop); - lp = GetNumericArgument(lp, OPER_EQU, &fvar1, jo); + lp = GetNumericArgument(lp, OPER_EQU, &fvar1, gv); switch (lastop) { case OPER_EQUEQU: res = (*dfvar==fvar1); @@ -3801,7 +3820,7 @@ void esp_pwm(int32_t value, uint32 freq, uint32_t channel) { #ifdef ESP32 if (channel < 1 || channel > 8) channel = 1; - channel+=7; + channel += 7; if (value < 0) { if (value <= -64) value = 0; // set range to 10 bit @@ -3860,6 +3879,8 @@ char *scripter_sub(char *lp, uint8_t fromscriptcmd) { return lp; } +int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv); + #define IF_NEST 8 // execute section of scripter int16_t Run_Scripter(const char *type, int8_t tlen, char *js) { @@ -3871,20 +3892,25 @@ int16_t retval; if (tasm_cmd_activ && tlen>0) return 0; + struct GVARS gv; + JsonParserObject jo; + if (js) { //String jss = js; // copy the string to a new buffer, not sure we can change the original buffer //JsonParser parser((char*)jss.c_str()); JsonParser parser(js); jo = parser.getRootObject(); - retval = Run_script_sub(type, tlen, &jo); + gv.jo = &jo; + retval = Run_script_sub(type, tlen, &gv); } else { - retval = Run_script_sub(type, tlen, 0); + gv.jo = 0; + retval = Run_script_sub(type, tlen, &gv); } return retval; } -int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { +int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { uint8_t vtype=0,sindex,xflg,floop=0,globvindex,fromscriptcmd=0; char *lp_next; int16_t globaindex,saindex; @@ -4210,7 +4236,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { Restart_globvars(); goto next_line; } -#endif +#endif // USE_SCRIPT_GLOBVARS #ifdef USE_LIGHT #ifdef USE_WS2812 else if (!strncmp(lp, "ws2812(", 7)) { @@ -4364,14 +4390,14 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { char *svd_sp = glob_script_mem.scriptptr; strcat(str, "\n#"); glob_script_mem.scriptptr = str; - Run_script_sub(">", 1, jo); + Run_script_sub(">", 1, gv); glob_script_mem.scriptptr = svd_sp; } // check for variable result if (if_state[ifstck]==1) { // evaluate exxpression - lp = Evaluate_expression(lp, and_or, &if_result[ifstck], jo); + lp = Evaluate_expression(lp, and_or, &if_result[ifstck], gv); SCRIPT_SKIP_SPACES if (*lp=='{' && if_state[ifstck]==1) { lp += 1; // then @@ -4381,7 +4407,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { goto next_line; } else { char *vnp = lp; - lp = isvar(lp, &vtype, &ind, &sysvar, 0, 0); + lp = isvar(lp, &vtype, &ind, &sysvar, 0, gv); if (vtype!=VAR_NV) { #ifdef USE_SCRIPT_GLOBVARS char varname[16]; @@ -4392,7 +4418,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { // found variable as result globvindex = ind.index; // save destination var index here - globaindex = last_findex; + if (gv) globaindex = gv->numind; uint8_t index = glob_script_mem.type[ind.index].index; if ((vtype&STYPE)==0) { // numeric result @@ -4412,17 +4438,17 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { lp = getop(lp, &lastop); char *slp = lp; glob_script_mem.glob_error = 0; - lp = GetNumericArgument(lp, OPER_EQU, &fvar, jo); + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); if (glob_script_mem.glob_error==1) { // mismatch was string, not number // get the string and convert to number - lp = isvar(slp, &vtype, &ind, 0, cmpstr, jo); + lp = isvar(slp, &vtype, &ind, 0, cmpstr, gv); fvar = CharToFloat(cmpstr); } switch (lastop) { case OPER_EQU: if (glob_script_mem.var_not_found) { - if (!jo) toLogEOL("var not found: ",lp); + if (!gv || !gv->jo) toLogEOL("var not found: ",lp); goto next_line; } *dfvar = fvar; @@ -4481,7 +4507,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { Settings.tele_period = *dfvar; break; case SCRIPT_EVENT_HANDLED: - event_handeled = *dfvar; + glob_script_mem.event_handeled = *dfvar; break; } sysv_type = 0; @@ -4490,14 +4516,14 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { // string result numeric = 0; sindex = index; - saindex = last_sindex; + saindex = gv->strind; // string result char str[SCRIPT_MAXSSIZE]; lp = getop(lp, &lastop); char *slp = lp; glob_script_mem.glob_error = 0; - lp = GetStringArgument(lp, OPER_EQU, str, jo); - if (!jo && glob_script_mem.glob_error) { + lp = GetStringArgument(lp, OPER_EQU, str, gv); + if ((!gv || !gv->jo) && glob_script_mem.glob_error) { // mismatch lp = GetNumericArgument(slp, OPER_EQU, &fvar, 0); dtostrfd(fvar, 6, str); @@ -4518,7 +4544,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { } else if (lastop==OPER_PLSEQU) { strncat(glob_script_mem.last_index_string[glob_script_mem.sind_num] + (saindex * glob_script_mem.max_ssize), str, glob_script_mem.max_ssize); } - last_sindex = -1; + gv->strind = -1; } else { if (lastop==OPER_EQU) { strlcpy(glob_script_mem.glob_snp + (sindex * glob_script_mem.max_ssize), str, glob_script_mem.max_ssize); @@ -4652,7 +4678,7 @@ void ScripterEvery100ms(void) { } } if (Settings.rule_enabled) { - if (fast_script==99) Run_Scripter(">F", 2, 0); + if (glob_script_mem.fast_script == 99) Run_Scripter(">F", 2, 0); } } @@ -4815,7 +4841,7 @@ const char HTTP_FORM_SCRIPT1d[] PROGMEM = const char S_SCRIPT_FILE_UPLOAD[] PROGMEM = D_SDCARD_UPLOAD; -#endif +#endif // USE_SCRIPT_FATFS uint8_t *script_ex_ptr; @@ -4951,7 +4977,7 @@ uint8_t DownloadFile(char *file) { return 0; } -#endif +#endif // USE_SCRIPT_FATFS void HandleScriptTextareaConfiguration(void) { @@ -4978,7 +5004,7 @@ void HandleScriptConfiguration(void) { if (Webserver->hasArg("d2")) { DownloadFile(glob_script_mem.flink[1]); } -#endif +#endif // USE_SCRIPT_FATFS WSContentStart_P(PSTR(D_CONFIGURE_SCRIPT)); WSContentSendStyle(); @@ -4991,7 +5017,7 @@ void HandleScriptConfiguration(void) { WSContentSend_P(HTTP_FORM_SCRIPT1,1,1,bitRead(Settings.rule_enabled,0) ? PSTR(" checked") : "",ssize); #else WSContentSend_P(HTTP_FORM_SCRIPT1,1,1,bitRead(Settings.rule_enabled,0) ? PSTR(" checked") : "",glob_script_mem.script_size); -#endif +#endif // xSCRIPT_STRIP_COMMENTS // script is to large for WSContentSend_P if (glob_script_mem.script_ram[0]) { @@ -5119,7 +5145,7 @@ void SaveScriptEnd(void) { Run_Scripter(">B\n", 3, 0); Run_Scripter(">BS", 3, 0); - fast_script = Run_Scripter(">F", -2, 0); + glob_script_mem.fast_script = Run_Scripter(">F", -2, 0); } } @@ -5854,7 +5880,7 @@ uint32_t JsonParsePath(JsonParserObject *jobj, const char *spath, char delim, fl #ifndef MQTT_EVENT_MSIZE #define MQTT_EVENT_MSIZE 256 -#endif +#endif // MQTT_EVENT_MSIZE @@ -5935,7 +5961,7 @@ bool ScriptMqttData(void) json_valid = 1; value = sres; } -#endif +#endif // SUPPORT_MQTT_EVENT_MORE if (json_valid) { value.trim(); char sbuffer[128]; @@ -7288,6 +7314,47 @@ uint32_t scripter_create_task(uint32_t num, uint32_t time, uint32_t core, uint32 #endif // USE_SCRIPT_TASK #endif // ESP32 + +int32_t http_req(char *host, char *request) { + HTTPClient http; + int32_t httpCode = 0; + uint8_t mode = 0; + char hbuff[128]; + strcpy(hbuff, "http://"); + strcat(hbuff, host); + + if (*request == '_') { + mode = 1; + request++; + } + + if (!mode) { + // GET + strcat(hbuff, request); + //AddLog(LOG_LEVEL_INFO, PSTR("HTTP GET %s"),hbuff); + http.begin(hbuff); + httpCode = http.GET(); + } else { + // POST + //AddLog(LOG_LEVEL_INFO, PSTR("HTTP POST %s - %s"),hbuff, request); + http.begin(hbuff); + http.addHeader("Content-Type", "text/plain"); + httpCode = http.POST(request); + } + +#ifdef USE_WEBSEND_RESPONSE + strlcpy(TasmotaGlobal.mqtt_data, http.getString().c_str(), MESSZ); + //AddLog(LOG_LEVEL_INFO, PSTR("HTTP RESULT %s"), TasmotaGlobal.mqtt_data); + Run_Scripter(">E", 2, TasmotaGlobal.mqtt_data); + glob_script_mem.glob_error = 0; +#endif + + http.end(); + + return httpCode; +} + + #ifdef SCRIPT_GET_HTTPS_JP #ifdef ESP8266 #include "WiFiClientSecureLightBearSSL.h" @@ -7308,6 +7375,7 @@ uint32_t call2https(const char *host, const char *path) { #endif httpsClient->setTimeout(1500); + httpsClient->setInsecure(); uint32_t retry = 0; while ((!httpsClient->connect(host, 443)) && (retry < 5)) { @@ -7365,7 +7433,7 @@ void cpy2lf(char *dst, uint32_t dstlen, char *src) { bool Xdrv10(uint8_t function) { bool result = false; - event_handeled = false; + glob_script_mem.event_handeled = false; char *sprt; switch (function) { @@ -7482,7 +7550,7 @@ bool Xdrv10(uint8_t function) #ifdef USE_BUTTON_EVENT for (uint32_t cnt = 0; cnt < MAX_KEYS; cnt++) { - script_button[cnt] = -1; + glob_script_mem.script_button[cnt] = -1; } #endif //USE_BUTTON_EVENT @@ -7508,7 +7576,7 @@ bool Xdrv10(uint8_t function) //case FUNC_INIT: if (bitRead(Settings.rule_enabled, 0)) { Run_Scripter(">B\n", 3, 0); - fast_script = Run_Scripter(">F", -2, 0); + glob_script_mem.fast_script = Run_Scripter(">F", -2, 0); #if defined(USE_SCRIPT_HUE) && defined(USE_WEBSERVER) && defined(USE_EMULATION) && defined(USE_EMULATION_HUE) && defined(USE_LIGHT) Script_Check_Hue(0); #endif //USE_SCRIPT_HUE @@ -7529,14 +7597,14 @@ bool Xdrv10(uint8_t function) #else if (bitRead(Settings.rule_enabled, 0)) { Run_Scripter(">E", 2, 0); - result = event_handeled; + result = glob_script_mem.event_handeled; } #endif //SCRIPT_POWER_SECTION break; case FUNC_RULES_PROCESS: if (bitRead(Settings.rule_enabled, 0)) { Run_Scripter(">E", 2, TasmotaGlobal.mqtt_data); - result = event_handeled; + result = glob_script_mem.event_handeled; } break; #ifdef USE_WEBSERVER @@ -7601,8 +7669,8 @@ bool Xdrv10(uint8_t function) #ifdef USE_BUTTON_EVENT case FUNC_BUTTON_PRESSED: if (bitRead(Settings.rule_enabled, 0)) { - if ((script_button[XdrvMailbox.index]&1)!=(XdrvMailbox.payload&1)) { - script_button[XdrvMailbox.index] = XdrvMailbox.payload; + if ((glob_script_mem.script_button[XdrvMailbox.index]&1)!=(XdrvMailbox.payload&1)) { + glob_script_mem.script_button[XdrvMailbox.index] = XdrvMailbox.payload; Run_Scripter(">b", 2, 0); } }