some fixes and enhancements

This commit is contained in:
gemu2015 2021-12-30 09:00:14 +01:00
parent 0bfa5af3ad
commit a2857e1c53

View File

@ -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; count<svars; count++) {
strcpy(cp1,sp);
sp += strlen(sp) + 1;
@ -967,12 +983,13 @@ char *script;
#ifdef USE_SCRIPT_GLOBVARS
if (glob_script_mem.udp_flags.udp_used) {
Script_Init_UDP();
glob_script_mem.glob_script = Run_Scripter(">G", -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 =
"<p><form action='" "sfd" "' method='get'><button>" "%s" "</button></form></p>";
"<p><form action='" "sfd%1d" "' method='get'><button>" "%s" "</button></form></p>";
const char HTTP_SCRIPT_FULLPAGE1[] PROGMEM =
"<!DOCTYPE html><html lang=\"" D_HTML_LANGUAGE "\" class=\"\">"
@ -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 =
"}"
"</script>";
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("<div id='l1' name='l1'></div>"));
@ -7348,10 +7503,10 @@ void ScriptFullWebpage(void) {
WSContentSend_P(PSTR("<div id='l1' name='l1'>"));
ScriptWebShow('w');
ScriptWebShow('w', page);
WSContentSend_P(PSTR("</div>"));
ScriptWebShow('x');
ScriptWebShow('x', page);
WSContentStop();
}
@ -7518,15 +7673,15 @@ uint16 entries = 0;
uint16_t cipos = 0;
uint8_t anum = 0;
while (anum<MAX_GARRAY) {
if (*lp==')' || *lp==0) break;
while (anum < MAX_GARRAY) {
if (*lp == ')' || *lp == 0) break;
char *lp1 = lp;
float sysvar;
lp=isvar(lp, &vtype, &ind, &sysvar, 0, 0);
if (vtype!=VAR_NV) {
if (vtype != VAR_NV) {
SCRIPT_SKIP_SPACES
uint8_t index = glob_script_mem.type[ind.index].index;
if ((vtype&STYPE)==0) {
if ((vtype&STYPE) == 0) {
// numeric result
//Serial.printf("numeric %d - %d \n",ind.index,index);
if (glob_script_mem.type[ind.index].bits.is_filter) {
@ -7534,7 +7689,7 @@ uint16_t cipos = 0;
uint16_t len = 0;
float *fa = Get_MFAddr(index, &len, &cipos);
//Serial.printf(">> 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<anum - 1) { WSContentSend_PD(","); }
if (ind < anum - 1) { WSContentSend_PD(","); }
}
WSContentSend_PD("]");
if (cnt<entries - 1) { WSContentSend_PD(","); }
if (cnt < entries - 1) { WSContentSend_PD(","); }
aind++;
if (aind>=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 (time<esp32_tasks[1].task_timer) {delay(time); }
//if (time<=esp32_tasks[0].task_timer) {vTaskDelay( pdMS_TO_TICKS( time ) ); }
delay(esp32_tasks[0].task_timer);
if (bitRead(Settings->rule_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 (time<esp32_tasks[1].task_timer) {delay(time); }
//if (time<=esp32_tasks[1].task_timer) {vTaskDelay( pdMS_TO_TICKS( time ) ); }
delay(esp32_tasks[1].task_timer);
if (bitRead(Settings->rule_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