diff --git a/sonoff/xdrv_01_webserver.ino b/sonoff/xdrv_01_webserver.ino index 606e40616..ec1303c33 100644 --- a/sonoff/xdrv_01_webserver.ino +++ b/sonoff/xdrv_01_webserver.ino @@ -92,6 +92,7 @@ const char HTTP_SCRIPT_COUNTER[] PROGMEM = "wl(u);"; const char HTTP_SCRIPT_ROOT[] PROGMEM = + "function la(p){" "var a='';" "if(la.arguments.length==1){" @@ -110,6 +111,12 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = "x.send();" "lt=setTimeout(la,%d);" // Settings.web_refresh "}" +#ifdef USE_SCRIPT_WEB_DISPLAY + "function seva(par,ivar){" + "la('&sv='+ivar+'_'+par);" + "}" +#endif + #ifdef USE_JAVASCRIPT_ES6 "lb=p=>la('&d='+p);" // Dark - Bright &d related to lb(value) and WebGetArg("d", tmp, sizeof(tmp)); @@ -1009,6 +1016,10 @@ bool HandleRootStatusRefresh(void) return false; } + #ifdef USE_SCRIPT_WEB_DISPLAY + Script_Check_HTML_Setvars(); + #endif + char tmp[8]; // WebGetArg numbers only char svalue[32]; // Command and number parameter diff --git a/sonoff/xdrv_10_scripter.ino b/sonoff/xdrv_10_scripter.ino index a8dc6adf4..fc9995aa9 100644 --- a/sonoff/xdrv_10_scripter.ino +++ b/sonoff/xdrv_10_scripter.ino @@ -3206,6 +3206,7 @@ void HandleScriptTextareaConfiguration(void) { } void HandleScriptConfiguration(void) { + if (!HttpCheckPriviledgedAccess()) { return; } AddLog_P(LOG_LEVEL_DEBUG, S_LOG_HTTP, S_CONFIGURE_SCRIPT); @@ -3579,6 +3580,70 @@ String ScriptUnsubscribe(const char * data, int data_len) #endif // SUPPORT_MQTT_EVENT #ifdef USE_SCRIPT_WEB_DISPLAY + + +void Script_Check_HTML_Setvars(void) { + + if (!HttpCheckPriviledgedAccess()) { return; } + + if (WebServer->hasArg("sv")) { + String stmp = WebServer->arg("sv"); + char cmdbuf[64]; + memset(cmdbuf,0,sizeof(cmdbuf)); + char *cp=cmdbuf; + *cp++='>'; + strncpy(cp,stmp.c_str(),sizeof(cmdbuf)-1); + char *cp1=strchr(cp,'_'); + if (!cp1) return; + *cp1=0; + char vname[32]; + strncpy(vname,cp,sizeof(vname)); + *cp1='='; + cp1++; + + struct T_INDEX ind; + uint8_t vtype; + isvar(vname,&vtype,&ind,0,0,0); + if (vtype!=NUM_RES && vtype&STYPE) { + // string type must insert quotes + uint8_t tlen=strlen(cp1); + memmove(cp1+1,cp1,tlen); + *cp1='\"'; + *(cp1+tlen+1)='\"'; + } + + //toLog(cmdbuf); + execute_script(cmdbuf); + } +} + +const char SCRIPT_MSG_SLIDER[] PROGMEM = + "
%s
%s%s
" + "
"; + +const char SCRIPT_MSG_BUTTON[] PROGMEM = + "
"; + +const char SCRIPT_MSG_CHKBOX[] PROGMEM = + "
"; + +const char SCRIPT_MSG_TEXTINP[] PROGMEM = + "
"; + +// +// + +void ScriptGetVarname(char *nbuf,char *sp, uint32_t blen) { +uint32_t cnt; + for (cnt=0;cntW",-2,0); if (web_script==99) { @@ -3604,8 +3669,112 @@ void ScriptWebShow(void) { } cp++; } - Replace_Cmd_Vars(line,tmp,sizeof(tmp)); - WSContentSend_PD(PSTR("{s}%s{e}"),tmp); + // check for input elements + if (!strncmp(line,"sl(",3)) { + // insert slider sl(min max var left mid right) + char *lp=line; + float min; + lp=GetNumericResult(lp+3,OPER_EQU,&min,0); + SCRIPT_SKIP_SPACES + // arg2 + float max; + lp=GetNumericResult(lp,OPER_EQU,&max,0); + SCRIPT_SKIP_SPACES + float val; + char *slp=lp; + lp=GetNumericResult(lp,OPER_EQU,&val,0); + SCRIPT_SKIP_SPACES + + char vname[16]; + ScriptGetVarname(vname,slp,sizeof(vname)); + + char left[SCRIPT_MAXSSIZE]; + lp=GetStringResult(lp,OPER_EQU,left,0); + SCRIPT_SKIP_SPACES + char mid[SCRIPT_MAXSSIZE]; + lp=GetStringResult(lp,OPER_EQU,mid,0); + SCRIPT_SKIP_SPACES + char right[SCRIPT_MAXSSIZE]; + lp=GetStringResult(lp,OPER_EQU,right,0); + SCRIPT_SKIP_SPACES + + WSContentSend_PD(SCRIPT_MSG_SLIDER,left,mid,right,(uint32_t)min,(uint32_t)max,(uint32_t)val,vname); + + + } else if (!strncmp(line,"ck(",3)) { + char *lp=line+3; + char *slp=lp; + float val; + lp=GetNumericResult(lp,OPER_EQU,&val,0); + SCRIPT_SKIP_SPACES + + char vname[16]; + ScriptGetVarname(vname,slp,sizeof(vname)); + + char label[SCRIPT_MAXSSIZE]; + lp=GetStringResult(lp,OPER_EQU,label,0); + char *cp; + uint8_t uval; + if (val>0) { + cp="checked='checked'"; + uval=0; + } else { + cp=""; + uval=1; + } + WSContentSend_PD(SCRIPT_MSG_CHKBOX,label,cp,uval,vname); + + } else if (!strncmp(line,"bu(",3)) { + char *lp=line+3; + char *slp=lp; + float val; + lp=GetNumericResult(lp,OPER_EQU,&val,0); + SCRIPT_SKIP_SPACES + + char vname[16]; + ScriptGetVarname(vname,slp,sizeof(vname)); + + SCRIPT_SKIP_SPACES + char ontxt[SCRIPT_MAXSSIZE]; + lp=GetStringResult(lp,OPER_EQU,ontxt,0); + SCRIPT_SKIP_SPACES + char offtxt[SCRIPT_MAXSSIZE]; + lp=GetStringResult(lp,OPER_EQU,offtxt,0); + + char *cp; + uint8_t uval; + if (val>0) { + cp=ontxt; + uval=0; + } else { + cp=offtxt; + uval=1; + } + WSContentSend_PD(SCRIPT_MSG_BUTTON,uval,vname,cp); + + } else if (!strncmp(line,"tx(",3)) { + char *lp=line+3; + char *slp=lp; + char str[SCRIPT_MAXSSIZE]; + lp=ForceStringVar(lp,str); + SCRIPT_SKIP_SPACES + char label[SCRIPT_MAXSSIZE]; + lp=GetStringResult(lp,OPER_EQU,label,0); + + char vname[16]; + ScriptGetVarname(vname,slp,sizeof(vname)); + + WSContentSend_PD(SCRIPT_MSG_TEXTINP,label,str,vname); + + } + else { + Replace_Cmd_Vars(line,tmp,sizeof(tmp)); + if (tmp[0]=='@') { + WSContentSend_PD(PSTR("
%s
"),&tmp[1]); + } else { + WSContentSend_PD(PSTR("{s}%s{e}"),tmp); + } + } } if (*lp==SCRIPT_EOL) { lp++; @@ -3769,6 +3938,7 @@ bool Xdrv10(uint8_t function) case FUNC_WEB_ADD_HANDLER: WebServer->on("/" WEB_HANDLE_SCRIPT, HandleScriptConfiguration); WebServer->on("/ta",HTTP_POST, HandleScriptTextareaConfiguration); + #ifdef USE_SCRIPT_FATFS WebServer->on("/u3", HTTP_POST,[]() { WebServer->sendHeader("Location","/u3");WebServer->send(303);},script_upload); WebServer->on("/u3", HTTP_GET,ScriptFileUploadSuccess);