diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index b567864c1..929b2adec 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -431,8 +431,9 @@ struct SCRIPT_MEM { IPAddress script_udp_remote_ip; #endif // USE_SCRIPT_GLOBVARS char web_mode; - uint8_t glob_script = 0; - uint8_t fast_script = 0; + char *glob_script = 0; + char *fast_script = 0; + char *web_pages[5]; uint32_t script_lastmillis; bool event_handeled = false; #ifdef USE_BUTTON_EVENT @@ -573,6 +574,16 @@ char *script; float fvalues[MAXVARS]; struct T_INDEX vtypes[MAXVARS]; + + //char strings[MAXSVARS*SCRIPT_MAXSSIZE]; + //char *strings_p = strings; + char *strings_op = (char*)calloc(MAXSVARS*SCRIPT_MAXSSIZE, 1); + char *strings_p = strings_op; + if (!strings_op) { + free(imemptr); + return -7; + } + /* uint32_t imemp = (uint32_t)imemptr; imemp += (MAXVARS*10); @@ -598,13 +609,10 @@ char *script; char *vnames_p = vnames; char **vnp_p = vnp; - char strings[MAXSVARS*SCRIPT_MAXSSIZE]; char *snp[MAXSVARS]; struct M_FILT mfilt[MAXFILT]; - char *strings_p = strings; - char **snp_p = snp; uint8_t numperm = 0; uint8_t numflt = 0; @@ -681,6 +689,7 @@ char *script; numflt++; if (numflt>MAXFILT) { if (imemptr) free(imemptr); + if (strings_p) free(strings_p); return -6; } } else { @@ -707,6 +716,7 @@ char *script; nvars++; if (nvars>MAXNVARS) { if (imemptr) free(imemptr); + if (strings_p) free(strings_p); return -1; } if (vtypes[vars].bits.is_filter) { @@ -717,7 +727,7 @@ char *script; if (isdigit(*op)) { // lenght define follows uint16_t flen = atoi(op); - if (flen>MAX_ARRAY_SIZE) { + if (flen > MAX_ARRAY_SIZE) { // limit array size flen = MAX_ARRAY_SIZE; } @@ -740,12 +750,14 @@ char *script; svars++; if (svars>MAXSVARS) { if (imemptr) free(imemptr); + if (strings_p) free(strings_p); return -2; } } vars++; if (vars>MAXVARS) { if (imemptr) free(imemptr); + if (strings_p) free(strings_p); return -3; } } @@ -797,6 +809,7 @@ char *script; script_mem = (uint8_t*)special_malloc(script_mem_size); if (!script_mem) { if (imemptr) free(imemptr); + if (strings_p) free(strings_p); return -4; } @@ -878,6 +891,7 @@ char *script; if (index > MAXVNSIZ) { free(glob_script_mem.script_mem); if (imemptr) free(imemptr); + if (strings_p) free(strings_p); return -5; } } @@ -887,7 +901,9 @@ char *script; // copy string variables char *cp1 = glob_script_mem.glob_snp; - char *sp = strings; + //char *sp = strings; + char *sp = strings_op; + for (count = 0; countG", -2, 0); + if (Run_Scripter(">G", -2, 0) == 99) {glob_script_mem.glob_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.glob_script = 0;} } #endif //USE_SCRIPT_GLOBVARS if (imemptr) { free(imemptr); + if (strings_p) free(strings_p); } return err; } @@ -982,6 +999,8 @@ char *script; #define SCRIPT_UDP_BUFFER_SIZE 128 #define SCRIPT_UDP_PORT 1999 +//#define SCRIPT_DEBUG_UDP + void Restart_globvars(void) { Script_Stop_UDP(); Script_Init_UDP(); @@ -1002,25 +1021,36 @@ void Script_Init_UDP() { if (glob_script_mem.udp_flags.udp_connected) return; if (glob_script_mem.Script_PortUdp.beginMulticast(WiFi.localIP(), IPAddress(239,255,255,250), SCRIPT_UDP_PORT)) { +#ifdef SCRIPT_DEBUG_UDP AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP "SCRIPT UDP started")); +#endif glob_script_mem.udp_flags.udp_connected = 1; } else { +#ifdef SCRIPT_DEBUG_UDP AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP "SCRIPT UDP failed")); +#endif glob_script_mem.udp_flags.udp_connected = 0; } } + + 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 ) { + uint32_t timeout = millis(); while (glob_script_mem.Script_PortUdp.parsePacket()) { + // not more then 500 ms + if (millis() - timeout > 500) { break;} char packet_buffer[SCRIPT_UDP_BUFFER_SIZE]; int32_t len = glob_script_mem.Script_PortUdp.read(packet_buffer, SCRIPT_UDP_BUFFER_SIZE - 1); packet_buffer[len] = 0; glob_script_mem.script_udp_remote_ip = glob_script_mem.Script_PortUdp.remoteIP(); +#ifdef SCRIPT_DEBUG_UDP //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); +#endif char *lp=packet_buffer; if (!strncmp(lp,"=>", 2)) { lp += 2; @@ -1039,10 +1069,14 @@ void Script_PollUdp(void) { uint32_t index; uint32_t res = match_vars(vnam, &fp, &sp, &index); if (res == NUM_RES) { +#ifdef SCRIPT_DEBUG_UDP AddLog(LOG_LEVEL_DEBUG, PSTR("num var found - %s - %d - %d"), vnam, res, index); +#endif *fp=CharToFloat(cp + 1); } else if (res == STR_RES) { +#ifdef SCRIPT_DEBUG_UDP AddLog(LOG_LEVEL_DEBUG, PSTR("string var found - %s - %d - %d"), vnam, res, index); +#endif strlcpy(sp, cp + 1, SCRIPT_MAXSSIZE); } else { // error var not found @@ -1051,8 +1085,8 @@ void Script_PollUdp(void) { // mark changed glob_script_mem.last_udp_ip = glob_script_mem.Script_PortUdp.remoteIP(); SetChanged(index); - if (glob_script_mem.glob_script == 99) { - Run_Scripter(">G", 2, 0); + if (glob_script_mem.glob_script) { + Run_Scripter(glob_script_mem.glob_script, 0, 0); } } } @@ -1076,10 +1110,14 @@ void script_udp_sendvar(char *vname,float *fp,char *sp) { char flstr[16]; dtostrfd(*fp, 8, flstr); strcat(sbuf, flstr); +#ifdef SCRIPT_DEBUG_UDP AddLog(LOG_LEVEL_DEBUG, PSTR("num var updated - %s"), sbuf); +#endif } else { strcat(sbuf, sp); +#ifdef SCRIPT_DEBUG_UDP AddLog(LOG_LEVEL_DEBUG, PSTR("string var updated - %s"), sbuf); +#endif } glob_script_mem.Script_PortUdp.beginPacket(IPAddress(239, 255, 255, 250), SCRIPT_UDP_PORT); // Udp.print(String("RET UC: ") + String(recv_Packet)); @@ -1225,8 +1263,14 @@ void Set_MFVal(uint8_t index, uint16_t bind, float val) { if (count==index) { uint16_t maxind = mflp->numvals & AND_FILT_MASK; if (!bind) { - if (val < 0 || val >= maxind) val = 0; - mflp->index = val; + + if (val < 0) { + // shift whole array by value + } else { + // set array index value + if (val < 0 || val >= maxind) val = 0; + mflp->index = val; + } } else { if (bind >= 1 && bind <= maxind) { mflp->rbuff[bind-1] = val; @@ -1448,6 +1492,8 @@ int32_t extract_from_file(uint8_t fref, char *ts_from, char *ts_to, int8_t coff } return cpos; } + uint32_t ipos = glob_script_mem.files[fref].position(); + glob_script_mem.files[fref].seek(0, SeekSet); uint32_t tsfrom = tstamp2l(ts_from); uint32_t tsto = tstamp2l(ts_to); uint16_t lines = 0; @@ -1514,21 +1560,36 @@ int32_t extract_from_file(uint8_t fref, char *ts_from, char *ts_to, int8_t coff if (colpos >= coffs && curpos < numa) { if (a_len[curpos]) { float fval = CharToFloat(rstr); - if (mflg[curpos] == 3) { + uint8_t flg = 1; + if ((mflg[curpos] & 1) == 1) { // absolute values, build diffs - float tmp = fval; - fval -= lastv[curpos]; - lastv[curpos] = tmp; + if (!(mflg[curpos] & 0x80)) { + lastv[curpos] = fval; + mflg[curpos] |= 0x80; + flg = 0; + } else { + if (!(mflg[curpos] & 2)) { + float tmp = fval; + fval -= lastv[curpos]; + // must be positive value +#ifndef EXTRACT_DIFF_NOCHK + if (fval < 0) fval = 0; +#endif + lastv[curpos] = tmp; + } + } } // average values - //AddLog(LOG_LEVEL_INFO, PSTR("cpos %d colp %d numa %d - %s %d"),curpos, colpos, a_len[curpos], rstr, (uint32_t)fval); - summs[curpos] += fval; - accnt[curpos] += 1; - if (accnt[curpos] == accum) { - *a_ptr[curpos]++ = summs[curpos] / accum; - summs[curpos] = 0; - accnt[curpos] = 0; - a_len[curpos]--; + //AddLog(LOG_LEVEL_INFO, PSTR("cpos %d colp %d numa %d - %s %d - %d"),curpos, colpos, a_len[curpos], rstr, (uint32_t)fval, flg); + if (flg) { + summs[curpos] += fval; + accnt[curpos] += 1; + if (accnt[curpos] == accum) { + *a_ptr[curpos]++ = summs[curpos] / accum; + summs[curpos] = 0; + accnt[curpos] = 0; + a_len[curpos]--; + } } } else { break; @@ -1542,6 +1603,11 @@ int32_t extract_from_file(uint8_t fref, char *ts_from, char *ts_to, int8_t coff lastpos = glob_script_mem.files[fref].position(); colpos = 0; lines ++; + if (lines == 1) { + if (ipos) { + glob_script_mem.files[fref].seek(ipos, SeekSet); + } + } } } rstr[sindex] = iob; @@ -2050,13 +2116,13 @@ chknext: case 'a': #ifdef USE_ANGLE_FUNC if (!strncmp(lp, "acos(", 5)) { - lp=GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv); + lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv); fvar = acosf(fvar); goto nfuncexit; } #endif if (!strncmp(lp, "abs(", 4)) { - lp=GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); + lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); fvar = fabs(fvar); goto nfuncexit; } @@ -2107,12 +2173,11 @@ chknext: float *fps; lp = get_array_by_name(lp, &fps, &alens); SCRIPT_SKIP_SPACES - if (alend != alens) { - fvar = -1; - } else { - memcpy(fpd, fps, alend * sizeof(float)); - fvar = 0; + if (alens < alend) { + alend = alens; } + memcpy(fpd, fps, alend * sizeof(float)); + fvar = alend; goto nfuncexit; } break; @@ -2128,13 +2193,12 @@ chknext: #ifdef USE_BUTTON_EVENT if (!strncmp(lp, "bt[", 3)) { // tasmota button state - GetNumericArgument(lp + 3, OPER_EQU, &fvar, gv); + lp = GetNumericArgument(lp + 3, OPER_EQU, &fvar, gv); uint32_t index = fvar; if (index<1 || index>MAX_KEYS) index = 1; fvar = glob_script_mem.script_button[index - 1]; glob_script_mem.script_button[index - 1] |= 0x80; - len++; - goto exit; + goto nfuncexit; } #endif //USE_BUTTON_EVENT break; @@ -2143,19 +2207,17 @@ chknext: // var changed struct T_INDEX ind; uint8_t vtype; - isvar(lp + 4, &vtype, &ind, 0, 0, gv); + lp = isvar(lp + 4, &vtype, &ind, 0, 0, gv); if (!ind.bits.constant) { uint8_t index = glob_script_mem.type[ind.index].index; if (glob_script_mem.fvars[index] != glob_script_mem.s_fvars[index]) { // var has changed glob_script_mem.s_fvars[index] = glob_script_mem.fvars[index]; fvar = 1; - len++; - goto exit; + goto nfuncexit; } else { fvar = 0; - len++; - goto exit; + goto nfuncexit; } } } @@ -2648,6 +2710,19 @@ chknext: fvar = UfsInfo(fvar, 0); goto nfuncexit; } + if (!strncmp(lp, "frn(", 4)) { + // rename a file + char fn_from[glob_script_mem.max_ssize + 1]; + lp = GetStringArgument(lp + 4, OPER_EQU, fn_from, 0); + SCRIPT_SKIP_SPACES + + char fn_to[glob_script_mem.max_ssize + 1]; + lp = GetStringArgument(lp, OPER_EQU, fn_to, 0); + SCRIPT_SKIP_SPACES + + fvar = ufsp->rename(fn_from, fn_to); + goto nfuncexit; + } #ifdef USE_FEXTRACT if (!strncmp(lp, "fxt(", 4)) { @@ -2667,25 +2742,29 @@ chknext: lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); SCRIPT_SKIP_SPACES - uint8_t coffs = fvar; - - lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); - SCRIPT_SKIP_SPACES - int16_t accum = fvar; - - uint16_t a_len[MAX_EXT_ARRAYS]; - float *a_ptr[MAX_EXT_ARRAYS]; - - uint8_t index = 0; - while (index < MAX_EXT_ARRAYS) { - lp = get_array_by_name(lp, &a_ptr[index], &a_len[index]); + int8_t coffs = fvar; + if (coffs >= 0) { + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); SCRIPT_SKIP_SPACES - index++; - if (*lp == ')' || *lp == '\n') { - break; + int16_t accum = fvar; + + uint16_t a_len[MAX_EXT_ARRAYS]; + float *a_ptr[MAX_EXT_ARRAYS]; + + uint8_t index = 0; + while (index < MAX_EXT_ARRAYS) { + lp = get_array_by_name(lp, &a_ptr[index], &a_len[index]); + SCRIPT_SKIP_SPACES + index++; + if (*lp == ')' || *lp == '\n') { + break; + } } + fvar = extract_from_file(fref, ts_from, ts_to, coffs, a_ptr, a_len, index, accum); + } else { + fvar = extract_from_file(fref, ts_from, ts_to, coffs, 0, 0, 0, 0); } - fvar = extract_from_file(fref, ts_from, ts_to, coffs, a_ptr, a_len, index, accum); + goto nfuncexit; } #endif // USE_FEXTRACT @@ -2712,7 +2791,7 @@ chknext: for (uint32_t cnt = 0; cnt < alen; cnt++) { dtostrfd(*fa, glob_script_mem.script_dprec, dstr); fa++; - if (cnt < (len - 1)) { + if (cnt < (alen - 1)) { strcat(dstr,"\t"); } else { if (!append) { @@ -3526,12 +3605,22 @@ chknext: #endif //USE_ANGLE_FUNC #if defined(USE_SML_M) && defined (USE_SML_SCRIPT_CMD) +extern char *SML_GetSVal(uint32_t index); + if (!strncmp(lp, "sml[", 4)) { lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar, gv); SCRIPT_SKIP_SPACES fvar = SML_GetVal(fvar); goto nfuncexit; } + if (!strncmp(lp, "smls[", 5)) { + lp = GetNumericArgument(lp + 5, OPER_EQU, &fvar, gv); + SCRIPT_SKIP_SPACES + lp++; + len = 0; + if (sp) strlcpy(sp, SML_GetSVal(fvar), glob_script_mem.max_ssize); + goto strexit;; + } if (!strncmp(lp, "sml(", 4)) { float fvar1; lp = GetNumericArgument(lp + 4, OPER_EQU, &fvar1, gv); @@ -4801,27 +4890,34 @@ int16_t retval; } 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; + uint8_t vtype = 0, sindex, xflg, floop = 0, globvindex, fromscriptcmd = 0; char *lp_next; - int16_t globaindex,saindex; + int16_t globaindex, saindex; struct T_INDEX ind; - uint8_t operand,lastop,numeric = 1,if_state[IF_NEST],if_exe[IF_NEST],if_result[IF_NEST],and_or,ifstck = 0; + uint8_t operand, lastop, numeric = 1, if_state[IF_NEST], if_exe[IF_NEST], if_result[IF_NEST], and_or, ifstck = 0; if_state[ifstck] = 0; if_result[ifstck] = 0; if_exe[ifstck] = 1; char cmpstr[SCRIPT_MAXSSIZE]; + float *dfvar, *cv_count, cv_max, cv_inc; + char *cv_ptr; + float fvar = 0, fvar1, sysvar, swvar; + uint8_t section = 0, sysv_type = 0, swflg = 0; + + char *lp; + if (tlen == 0) { + section = 1; + lp = (char*)type; + } else { + lp = glob_script_mem.scriptptr; + } + uint8_t check = 0; if (tlen<0) { tlen = abs(tlen); check = 1; } - float *dfvar,*cv_count,cv_max,cv_inc; - char *cv_ptr; - float fvar = 0,fvar1,sysvar,swvar; - uint8_t section = 0,sysv_type = 0,swflg = 0; - - char *lp = glob_script_mem.scriptptr; while (1) { // check line @@ -5405,7 +5501,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { } #endif //USE_SCRIPT_GLOBVARS if (glob_script_mem.type[globvindex].bits.is_filter) { - if (globaindex>=0) { + if (globaindex >= 0) { Set_MFVal(glob_script_mem.type[globvindex].index, globaindex, *dfvar); } else { Set_MFilter(glob_script_mem.type[globvindex].index, *dfvar); @@ -5620,7 +5716,7 @@ void ScripterEvery100ms(void) { } } if (bitRead(Settings->rule_enabled, 0)) { - if (glob_script_mem.fast_script == 99) Run_Scripter(">F", 2, 0); + if (glob_script_mem.fast_script) Run_Scripter(glob_script_mem.fast_script, 0, 0); } } @@ -6093,10 +6189,22 @@ void SaveScriptEnd(void) { Run_Scripter(">B\n", 3, 0); Run_Scripter(">BS", 3, 0); - glob_script_mem.fast_script = Run_Scripter(">F", -2, 0); + //glob_script_mem.fast_script = Run_Scripter(">F", -2, 0); + if (Run_Scripter(">F", -2, 0) == 99) {glob_script_mem.fast_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.fast_script = 0;} + + script_set_web_pages(); + } } +void script_set_web_pages(void) { + if (Run_Scripter(">W", -2, 0) == 99) {glob_script_mem.web_pages[0] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[0] = 0;} + if (Run_Scripter(">w ", -3, 0) == 99) {glob_script_mem.web_pages[1] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[1] = 0;} + if (Run_Scripter(">w1 ", -4, 0) == 99) {glob_script_mem.web_pages[2] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[2] = 0;} + if (Run_Scripter(">w2 ", -4, 0) == 99) {glob_script_mem.web_pages[3] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[3] = 0;} + if (Run_Scripter(">w3 ", -4, 0) == 99) {glob_script_mem.web_pages[4] = glob_script_mem.section_ptr;} else {glob_script_mem.web_pages[4] = 0;} +} + #endif // USE_WEBSERVER @@ -7100,8 +7208,43 @@ void ScriptGetSDCard(void) { } extern uint8_t *buffer; +bool script_download_busy; + +//#define USE_DLTASK void SendFile(char *fname) { + +#ifdef ESP8266 + SendFile_sub(fname); +#endif // ESP8266 + +#ifdef ESP32 +#ifdef USE_DLTASK + if (script_download_busy == true) { + AddLog(LOG_LEVEL_INFO, PSTR("UFS: Download is busy")); + return; + } + script_download_busy = true; + char *path = (char*)malloc(128); + strcpy(path, fname); + xTaskCreatePinnedToCore(script_download_task, "DT", 6000, (void*)path, 3, NULL, 1); +#else + SendFile_sub(fname); +#endif + +#endif // ESP32 +} + +#ifdef USE_DLTASK +void script_download_task(void *path) { + SendFile_sub((char*) path); + free(path); + script_download_busy = false; + vTaskDelete( NULL ); +} +#endif // USE_DLTASK + +void SendFile_sub(char *fname) { char buff[512]; const char *mime = 0; uint8_t sflg = 0; @@ -7133,7 +7276,6 @@ char buff[512]; if (!mime) return; - WSContentSend_P(HTTP_SCRIPT_MIMES, fname, mime); if (sflg) { @@ -7234,24 +7376,25 @@ char buff[512]; } #endif // USE_DISPLAY_DUMP } else { - File file = ufsp->open(fname,FS_FILE_READ); + File file = ufsp->open(fname, FS_FILE_READ); uint32_t siz = file.size(); uint32_t len = sizeof(buff); while (siz > 0) { - if (len>siz) len = siz; + if (len > siz) len = siz; file.read((uint8_t *)buff, len); Webserver->client().write((const char*)buff, len); siz -= len; } file.close(); + Webserver->client().stop(); } - Webserver->client().stop(); } #endif // USE_UFILESYS + #ifdef SCRIPT_FULL_WEBPAGE const char HTTP_WEB_FULL_DISPLAY[] PROGMEM = - "

"; + "

"; const char HTTP_SCRIPT_FULLPAGE1[] PROGMEM = "" @@ -7287,7 +7430,7 @@ const char HTTP_SCRIPT_FULLPAGE1[] PROGMEM = "}" "};" "if (rfsh) {" - "x.open('GET','./sfd?m=1'+a,true);" // ?m related to Webserver->hasArg("m") + "x.open('GET','./sfd%1d?m=1'+a,true);" // ?m related to Webserver->hasArg("m") "x.send();" "lt=setTimeout(la,%d);" // Settings->web_refresh "}" @@ -7313,9 +7456,21 @@ const char HTTP_SCRIPT_FULLPAGE2[] PROGMEM = "}" ""; +void ScriptFullWebpage1(void) { + ScriptFullWebpage(1); +} +void ScriptFullWebpage2(void) { + ScriptFullWebpage(2); +} +void ScriptFullWebpage3(void) { + ScriptFullWebpage(3); +} +void ScriptFullWebpage4(void) { + ScriptFullWebpage(4); +} -void ScriptFullWebpage(void) { - uint32_t fullpage_refresh=10000; +void ScriptFullWebpage(uint8_t page) { + uint32_t fullpage_refresh = 10000; if (!HttpCheckPriviledgedAccess()) { return; } String stmp = Webserver->uri(); @@ -7325,7 +7480,7 @@ void ScriptFullWebpage(void) { Script_Check_HTML_Setvars(); } WSContentBegin(200, CT_HTML); - ScriptWebShow('w'); + ScriptWebShow('w', page); WSContentEnd(); //Serial.printf("fwp update sv %s\n",stmp.c_str() ); return; //goto redraw; @@ -7340,7 +7495,7 @@ void ScriptFullWebpage(void) { WSContentBegin(200, CT_HTML); const char *title = "Full Screen"; - WSContentSend_P(HTTP_SCRIPT_FULLPAGE1, SettingsText(SET_DEVICENAME), title, fullpage_refresh); + WSContentSend_P(HTTP_SCRIPT_FULLPAGE1, SettingsText(SET_DEVICENAME), title, page , fullpage_refresh); WSContentSend_P(HTTP_SCRIPT_FULLPAGE2, fullpage_refresh); //WSContentSend_P(PSTR("
")); @@ -7348,10 +7503,10 @@ void ScriptFullWebpage(void) { WSContentSend_P(PSTR("
")); - ScriptWebShow('w'); + ScriptWebShow('w', page); WSContentSend_P(PSTR("
")); - ScriptWebShow('x'); + ScriptWebShow('x', page); WSContentStop(); } @@ -7518,15 +7673,15 @@ uint16 entries = 0; uint16_t cipos = 0; uint8_t anum = 0; - while (anum> 2 %d\n",len); - if (fa && len>=entries) { + if (fa && len >= entries) { if (!entries) { entries = len; } @@ -7588,19 +7743,22 @@ uint32_t cnt; nbuf[cnt] = 0; } -void ScriptWebShow(char mc) { +void ScriptWebShow(char mc, uint8_t page) { uint8_t web_script; glob_script_mem.web_mode = mc; if (mc=='w' || mc=='x') { if (mc=='x') { mc='$'; } - web_script = Run_Scripter(">w", -2, 0); + //web_script = Run_Scripter(">w", -2, 0); + glob_script_mem.section_ptr = glob_script_mem.web_pages[page]; } else { - web_script = Run_Scripter(">W", -2, 0); + //web_script = Run_Scripter(">W", -2, 0); + glob_script_mem.section_ptr = glob_script_mem.web_pages[0]; } - if (web_script==99) { + //if (web_script==99) { + if (glob_script_mem.section_ptr) { char tmp[256]; uint8_t optflg = 0; uint8_t chartindex = 1; @@ -8102,6 +8260,12 @@ exgc: lp = GetStringArgument(lp, OPER_EQU, label, 0); SCRIPT_SKIP_SPACES + uint8_t asflg = 1; + if (label[0] == '&') { + strcpy(label, &label[1]); + asflg = 0; + } + int16_t divflg = 1; int16_t todflg = -1; if (!strncmp(label, "cnt", 3)) { @@ -8123,7 +8287,7 @@ exgc: } uint16 segments = 1; for (uint32_t cnt = 0; cnt < strlen(lp); cnt++) { - if (lp[cnt]=='|') { + if (lp[cnt] == '|') { segments++; } } @@ -8131,18 +8295,18 @@ exgc: } uint32_t aind = ipos; - if (aind>=entries) aind = entries - 1; + if (aind >= entries) aind = entries - 1; for (uint32_t cnt = 0; cnt < entries; cnt++) { WSContentSend_PD("['"); char lbl[16]; - if (todflg>=0) { + if (todflg >= 0) { sprintf(lbl, "%d:%02d", todflg / divflg, (todflg % divflg) * (60 / divflg) ); todflg++; if (todflg >= entries) { todflg = 0; } } else { - if (todflg==-1) { + if (todflg == -1) { GetTextIndexed(lbl, sizeof(lbl), aind / divflg, label); } else { // day,hours,mins @@ -8155,14 +8319,20 @@ exgc: for (uint32_t ind = 0; ind < anum; ind++) { char acbuff[32]; float *fp = arrays[ind]; - f2char(fp[aind], glob_script_mem.script_dprec, glob_script_mem.script_lzero, acbuff); + float fval; + if (asflg) { + fval = fp[aind]; + } else { + fval = fp[cnt]; + } + f2char(fval, glob_script_mem.script_dprec, glob_script_mem.script_lzero, acbuff); WSContentSend_PD("%s", acbuff); - if (ind=entries) { + if (aind >= entries) { aind = 0; } } @@ -8338,11 +8508,10 @@ bool RulesProcessEvent(const char *json_event) { #define STASK_STACK 8192-2048 #endif -#if 1 - struct ESP32_Task { uint16_t task_timer; TaskHandle_t task_t; + char *tstart; } esp32_tasks[2]; @@ -8355,25 +8524,28 @@ void script_task1(void *arg) { //time=esp32_tasks[0].task_timer-time; //if (timerule_enabled, 0)) { - Run_Scripter(">t1", 3, 0); + if (esp32_tasks[0].tstart) Run_Scripter(esp32_tasks[0].tstart, 0, 0); + } + if (esp32_tasks[0].task_timer) { + delay(esp32_tasks[0].task_timer); + } else { + esp32_tasks[0].task_t = 0; + vTaskDelete( NULL ); } } } void script_task2(void *arg) { - //uint32_t lastms=millis(); - //uint32_t time; while (1) { - //time=millis()-lastms; - //lastms=millis(); - //time=esp32_tasks[1].task_timer-time; - //if (timerule_enabled, 0)) { - Run_Scripter(">t2", 3, 0); + if (esp32_tasks[1].tstart) Run_Scripter(esp32_tasks[1].tstart, 0, 0); + } + if (esp32_tasks[1].task_timer) { + delay(esp32_tasks[1].task_timer); + } else { + esp32_tasks[1].task_t = 0; + vTaskDelete( NULL ); } } } @@ -8389,49 +8561,23 @@ uint32_t scripter_create_task(uint32_t num, uint32_t time, uint32_t core, int32_ esp32_tasks[num].task_t = 0; } if (prio >= 0) { - res = xTaskCreatePinnedToCore(script_task1, num==0?"T1":"T2", STASK_STACK, NULL, prio, &esp32_tasks[num].task_t, core); + char *sp = 0; esp32_tasks[num].task_timer = time; + if (!num) { + if (Run_Scripter(">t1", -3, 0) == 99) { + sp = glob_script_mem.section_ptr + 2; + res = xTaskCreatePinnedToCore(script_task1, "T1", STASK_STACK, NULL, prio, &esp32_tasks[num].task_t, core); + } + } else { + if (Run_Scripter(">t2", -3, 0) == 99) { + sp = glob_script_mem.section_ptr + 2; + res = xTaskCreatePinnedToCore(script_task2, "T2", STASK_STACK, NULL, prio, &esp32_tasks[num].task_t, core); + } + } + esp32_tasks[num].tstart = sp; } return res; } -#else - -uint16_t task_timer1; -uint16_t task_timer2; -TaskHandle_t task_t1; -TaskHandle_t task_t2; - -void script_task1(void *arg) { - while (1) { - delay(task_timer1); - Run_Scripter(">t1", 3, 0); - } -} - -void script_task2(void *arg) { - while (1) { - delay(task_timer2); - Run_Scripter(">t2", 3, 0); - } -} - -uint32_t scripter_create_task(uint32_t num, uint32_t time, uint32_t core, int32_t prio) { - //return 0; - BaseType_t res = 0; - if (core > 1) { core = 1; } - if (num == 1) { - if (task_t1) { vTaskDelete(task_t1); } - res = xTaskCreatePinnedToCore(script_task1, "T1", STASK_STACK, NULL, prio, &task_t1, core); - task_timer1 = time; - } else { - if (task_t2) { vTaskDelete(task_t2); } - res = xTaskCreatePinnedToCore(script_task2, "T2", STASK_STACK, NULL, prio, &task_t2, core); - task_timer2 = time; - } - return res; -} -#endif - #endif // USE_SCRIPT_TASK #endif // ESP32 @@ -8443,13 +8589,14 @@ int32_t url2file(uint8_t fref, char *url) { HTTPClient http; int32_t httpCode = 0; String weburl = "http://"+UrlEncode(url); - for (uint32_t retry = 0; retry < 15; retry++) { + //for (uint32_t retry = 0; retry < 15; retry++) { http.begin(http_client, weburl); + delay(100); httpCode = http.GET(); - if (httpCode > 0) { - break; - } - } + //if (httpCode > 0) { + // break; + //} + //} if (httpCode < 0) { AddLog(LOG_LEVEL_INFO,PSTR("HTTP error %d = %s"), httpCode, http.errorToString(httpCode).c_str()); } @@ -9103,6 +9250,37 @@ int32_t retval = 0; #endif +#ifdef SCRIPT_FULL_WEBPAGE +void script_add_subpage(uint8_t num) { + //uint8_t web_script = Run_Scripter(code, -strlen(code), 0); + if (glob_script_mem.web_pages[num]) { + char bname[48]; + cpy2lf(bname, sizeof(bname), glob_script_mem.web_pages[num] + 3); + + void (*wptr)(void); + + char id[8]; + switch (num) { + case 1: + wptr = ScriptFullWebpage1; + break; + case 2: + wptr = ScriptFullWebpage2; + break; + case 3: + wptr = ScriptFullWebpage3; + break; + case 4: + wptr = ScriptFullWebpage4; + break; + } + sprintf_P(id, PSTR("/sfd%1d"), num); + Webserver->on(id, wptr); + WSContentSend_PD(HTTP_WEB_FULL_DISPLAY, num, bname); + } +} +#endif // SCRIPT_FULL_WEBPAGE + /*********************************************************************************************\ * Interface \*********************************************************************************************/ @@ -9265,7 +9443,8 @@ bool Xdrv10(uint8_t function) //case FUNC_INIT: if (bitRead(Settings->rule_enabled, 0)) { Run_Scripter(">B\n", 3, 0); - glob_script_mem.fast_script = Run_Scripter(">F", -2, 0); + if (Run_Scripter(">F", -2, 0) == 99) {glob_script_mem.fast_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.fast_script = 0;} + script_set_web_pages(); #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 @@ -9324,15 +9503,12 @@ bool Xdrv10(uint8_t function) #ifdef USE_SCRIPT_WEB_DISPLAY case FUNC_WEB_ADD_MAIN_BUTTON: if (bitRead(Settings->rule_enabled, 0)) { - ScriptWebShow('$'); + ScriptWebShow('$', 0); #ifdef SCRIPT_FULL_WEBPAGE - uint8_t web_script = Run_Scripter(">w", -2, 0); - if (web_script==99) { - char bname[48]; - cpy2lf(bname, sizeof(bname), glob_script_mem.section_ptr + 3); - WSContentSend_PD(HTTP_WEB_FULL_DISPLAY, bname); - Webserver->on("/sfd", ScriptFullWebpage); - } + script_add_subpage(1); + script_add_subpage(2); + script_add_subpage(3); + script_add_subpage(4); #endif // SCRIPT_FULL_WEBPAGE #ifdef USE_UFILESYS @@ -9368,7 +9544,7 @@ bool Xdrv10(uint8_t function) #ifdef USE_SCRIPT_WEB_DISPLAY case FUNC_WEB_SENSOR: if (bitRead(Settings->rule_enabled, 0)) { - ScriptWebShow(0); + ScriptWebShow(0, 0); } break; #endif //USE_SCRIPT_WEB_DISPLAY