mirror of https://github.com/arendst/Tasmota.git
Merge pull request #8816 from gemu2015/scripter-string_array
scripter support for string array
This commit is contained in:
commit
04dca1e61f
|
@ -363,6 +363,10 @@ struct SCRIPT_MEM {
|
||||||
uint8_t max_ssize;
|
uint8_t max_ssize;
|
||||||
uint8_t script_loglevel;
|
uint8_t script_loglevel;
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
|
uint8_t si_num;
|
||||||
|
uint8_t siro_num;
|
||||||
|
char *last_index_string;
|
||||||
|
|
||||||
#ifdef USE_SCRIPT_FATFS
|
#ifdef USE_SCRIPT_FATFS
|
||||||
File files[SFS_MAX];
|
File files[SFS_MAX];
|
||||||
FILE_FLAGS file_flags[SFS_MAX];
|
FILE_FLAGS file_flags[SFS_MAX];
|
||||||
|
@ -374,12 +378,15 @@ struct SCRIPT_MEM {
|
||||||
#endif
|
#endif
|
||||||
} glob_script_mem;
|
} glob_script_mem;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef USE_SCRIPT_GLOBVARS
|
#ifdef USE_SCRIPT_GLOBVARS
|
||||||
IPAddress last_udp_ip;
|
IPAddress last_udp_ip;
|
||||||
WiFiUDP Script_PortUdp;
|
WiFiUDP Script_PortUdp;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int16_t last_findex;
|
int16_t last_findex;
|
||||||
|
int16_t last_sindex;
|
||||||
uint8_t tasm_cmd_activ=0;
|
uint8_t tasm_cmd_activ=0;
|
||||||
uint8_t fast_script=0;
|
uint8_t fast_script=0;
|
||||||
uint8_t glob_script=0;
|
uint8_t glob_script=0;
|
||||||
|
@ -1312,6 +1319,7 @@ char *isvar(char *lp, uint8_t *vtype,struct T_INDEX *tind,float *fp,char *sp,Jso
|
||||||
strcpy (dvnam,vname);
|
strcpy (dvnam,vname);
|
||||||
uint8_t olen=len;
|
uint8_t olen=len;
|
||||||
last_findex=-1;
|
last_findex=-1;
|
||||||
|
last_sindex=-1;
|
||||||
char *ja=strchr(dvnam,'[');
|
char *ja=strchr(dvnam,'[');
|
||||||
if (ja) {
|
if (ja) {
|
||||||
*ja=0;
|
*ja=0;
|
||||||
|
@ -1981,6 +1989,7 @@ chknext:
|
||||||
//#endif
|
//#endif
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
#define MAX_SARRAY_NUM 32
|
||||||
case 'i':
|
case 'i':
|
||||||
if (!strncmp(vname,"int(",4)) {
|
if (!strncmp(vname,"int(",4)) {
|
||||||
lp=GetNumericResult(lp+4,OPER_EQU,&fvar,0);
|
lp=GetNumericResult(lp+4,OPER_EQU,&fvar,0);
|
||||||
|
@ -1996,21 +2005,74 @@ chknext:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
lp++;
|
lp++;
|
||||||
char *sstr=lp;
|
|
||||||
|
if (glob_script_mem.si_num>0 && glob_script_mem.last_index_string) {
|
||||||
|
free(glob_script_mem.last_index_string);
|
||||||
|
}
|
||||||
|
char *sstart=lp;
|
||||||
|
uint8_t slen=0;
|
||||||
for (uint32_t cnt=0; cnt<256; cnt++) {
|
for (uint32_t cnt=0; cnt<256; cnt++) {
|
||||||
if (lp[cnt]='\n' || lp[cnt]=='"') {
|
if (*lp=='\n' || *lp=='"' || *lp==0) {
|
||||||
lp+=cnt+1;
|
lp++;
|
||||||
|
if (cnt>0 && !slen) {
|
||||||
|
slen++;
|
||||||
|
}
|
||||||
|
glob_script_mem.siro_num=slen;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (*lp=='|') {
|
||||||
|
slen++;
|
||||||
|
}
|
||||||
|
lp++;
|
||||||
}
|
}
|
||||||
char str[SCRIPT_MAXSSIZE];
|
|
||||||
GetTextIndexed(str, sizeof(str), fvar, sstr);
|
glob_script_mem.si_num = fvar;
|
||||||
|
if (glob_script_mem.si_num>0) {
|
||||||
|
if (glob_script_mem.si_num>MAX_SARRAY_NUM) {
|
||||||
|
glob_script_mem.si_num=MAX_SARRAY_NUM;
|
||||||
|
}
|
||||||
|
|
||||||
|
glob_script_mem.last_index_string=(char*)calloc(glob_script_mem.max_ssize*glob_script_mem.si_num,1);
|
||||||
|
for (uint32_t cnt=0; cnt<glob_script_mem.siro_num; cnt++) {
|
||||||
|
char str[SCRIPT_MAXSSIZE];
|
||||||
|
GetTextIndexed(str, sizeof(str), cnt, sstart);
|
||||||
|
strlcpy(glob_script_mem.last_index_string+(cnt*glob_script_mem.max_ssize),str,glob_script_mem.max_ssize);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
glob_script_mem.last_index_string=sstart;
|
||||||
|
}
|
||||||
|
|
||||||
lp++;
|
lp++;
|
||||||
if (sp) strlcpy(sp,str,glob_script_mem.max_ssize);
|
|
||||||
fvar=0;
|
fvar=0;
|
||||||
len=0;
|
len=0;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
if (!strncmp(vname,"is[",3)) {
|
||||||
|
lp=GetNumericResult(lp+3,OPER_EQU,&fvar,0);
|
||||||
|
SCRIPT_SKIP_SPACES
|
||||||
|
char str[SCRIPT_MAXSSIZE];
|
||||||
|
str[0]=0;
|
||||||
|
uint8_t index=fvar;
|
||||||
|
if (index<1) index=1;
|
||||||
|
index--;
|
||||||
|
last_sindex = index;
|
||||||
|
if (glob_script_mem.last_index_string) {
|
||||||
|
if (!glob_script_mem.si_num) {
|
||||||
|
if (index<=glob_script_mem.siro_num) {
|
||||||
|
GetTextIndexed(str, sizeof(str), index , glob_script_mem.last_index_string);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (index>glob_script_mem.si_num) {
|
||||||
|
fvar=glob_script_mem.si_num;
|
||||||
|
}
|
||||||
|
strlcpy(str,glob_script_mem.last_index_string+(index*glob_script_mem.max_ssize),glob_script_mem.max_ssize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lp++;
|
||||||
|
if (sp) strlcpy(sp,str,glob_script_mem.max_ssize);
|
||||||
|
len=0;
|
||||||
|
goto strexit;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'l':
|
case 'l':
|
||||||
if (!strncmp(vname,"lip",3)) {
|
if (!strncmp(vname,"lip",3)) {
|
||||||
|
@ -3219,7 +3281,7 @@ int16_t Run_Scripter(const char *type, int8_t tlen, char *js) {
|
||||||
|
|
||||||
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;
|
char *lp_next;
|
||||||
int8_t globaindex;
|
int8_t globaindex,saindex;
|
||||||
struct T_INDEX ind;
|
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_state[ifstck]=0;
|
||||||
|
@ -3778,6 +3840,7 @@ int16_t Run_Scripter(const char *type, int8_t tlen, char *js) {
|
||||||
// string result
|
// string result
|
||||||
numeric=0;
|
numeric=0;
|
||||||
sindex=index;
|
sindex=index;
|
||||||
|
saindex=last_sindex;
|
||||||
// string result
|
// string result
|
||||||
char str[SCRIPT_MAXSSIZE];
|
char str[SCRIPT_MAXSSIZE];
|
||||||
lp=getop(lp,&lastop);
|
lp=getop(lp,&lastop);
|
||||||
|
@ -3799,10 +3862,19 @@ int16_t Run_Scripter(const char *type, int8_t tlen, char *js) {
|
||||||
script_udp_sendvar(varname,0,str);
|
script_udp_sendvar(varname,0,str);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (lastop==OPER_EQU) {
|
if (saindex>=0) {
|
||||||
strlcpy(glob_script_mem.glob_snp+(sindex*glob_script_mem.max_ssize),str,glob_script_mem.max_ssize);
|
if (lastop==OPER_EQU) {
|
||||||
} else if (lastop==OPER_PLSEQU) {
|
strlcpy(glob_script_mem.last_index_string+(saindex*glob_script_mem.max_ssize),str,glob_script_mem.max_ssize);
|
||||||
strncat(glob_script_mem.glob_snp+(sindex*glob_script_mem.max_ssize),str,glob_script_mem.max_ssize);
|
} else if (lastop==OPER_PLSEQU) {
|
||||||
|
strncat(glob_script_mem.last_index_string+(saindex*glob_script_mem.max_ssize),str,glob_script_mem.max_ssize);
|
||||||
|
}
|
||||||
|
last_sindex=-1;
|
||||||
|
} else {
|
||||||
|
if (lastop==OPER_EQU) {
|
||||||
|
strlcpy(glob_script_mem.glob_snp+(sindex*glob_script_mem.max_ssize),str,glob_script_mem.max_ssize);
|
||||||
|
} else if (lastop==OPER_PLSEQU) {
|
||||||
|
strncat(glob_script_mem.glob_snp+(sindex*glob_script_mem.max_ssize),str,glob_script_mem.max_ssize);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5494,7 +5566,6 @@ void ScriptGetSDCard(void) {
|
||||||
}
|
}
|
||||||
HandleNotFound();
|
HandleNotFound();
|
||||||
}
|
}
|
||||||
#endif // USE_SCRIPT_FATFS
|
|
||||||
|
|
||||||
void SendFile(char *fname) {
|
void SendFile(char *fname) {
|
||||||
char buff[512];
|
char buff[512];
|
||||||
|
@ -5528,6 +5599,7 @@ char buff[512];
|
||||||
|
|
||||||
Webserver->client().stop();
|
Webserver->client().stop();
|
||||||
}
|
}
|
||||||
|
#endif // USE_SCRIPT_FATFS
|
||||||
|
|
||||||
void ScriptFullWebpage(void) {
|
void ScriptFullWebpage(void) {
|
||||||
uint32_t fullpage_refresh=10000;
|
uint32_t fullpage_refresh=10000;
|
||||||
|
|
Loading…
Reference in New Issue