// -------------------------------- // ! MyPower.CZ Microlog ! X ! // !------------------------------- // ! web interface base script ! // ! (C) 2024 MyPower.CZ ! // !------------------------------- // ! Licence: ! // ! free for noncommercial use. ! // -------------------------------- // ! ! OK ! ! // -------------------------------- __micrologversion=2.04; _last_xdata=false; _last_xdataauto=false; _mpwShowRefreshOptions_laststate=0; _mpwqTimer_enabled=true; _mpwqTimer_code=""; _mpwqTimer_counter=0; _mpwqTimer_unlockablecode=""; _lastPinSetupStr=""; _lastPinSetupObject=false; _lastDisplaySetupObject=false; _areaobjs=new Array(); _areatimer=false; _areaxid=0; _xtmsx=0; // ------------------------------------------- function mpwJSgetcontent() { xret='<'+'style>'; xret+='.textAreaEditContent{ margin-top:0; margin-bottom:0; margin-right:0; margin-left:30px; background:rgba(0,0,0,0.2); color:#FFFFFF;'+ 'width:400px; height:300px; display:block; border:0px none; font-size:11px; font-family:monospace; line-height:14px; } '+ '.textAreaWithLines { display:block; cursor:default; margin:0; border:0px none; '+ ' border-right:1px dotted #808080; background:rgba(255,255,255,0.03); color:#808080; '+ 'font-size:11px; font-family:monospace; line-height:14px; } '; xret+='.mpwmenu div { cursor:pointer; border-bottom:1px dotted #808080; padding:5px;font-size:11px; }'; xret+='.mpwmenu div:hover { background-color:rgba(0,0,0,0.1); }'; xret+='.mpwmenu div { color: #FFC000; }'; xret+='.mpwtext { border:1px solid #404040; font-size:11px; padding:2px; background:#101010; color:#FFFFFF; }'; xret+='.mpwbutton { border:1px solid #404040; font-size:11px; padding:2px; background:#303030; color:#FFC000; cursor:pointer; } '; xret+='body { min-width:900px; }'; xret+='<'+'/style>'; xret+='
';
xret+=' Hardware info ';
xret+='Analogové vstupy ';
xret+='Sampler ';
xret+='Display ';
if (__micrologversion>=2.02)
xret+='Digitální výstupy ';
if (__micrologversion>=2.03)
xret+='Záloha eprom ';
xret+=' | ';
xret+=' ';
xret+='< Klikněte na požadovanou funkci v levém sloupci. | ';
xret+='
'+xled.split("xunnamedled").join("xhttpled").split("xfill").join("#FF4000")+' | '+ ''+xled.split("xunnamedled").join("xhttpautoled").split("xfill").join("#40FF00")+' | '+ '
'+qres+""); } // ------------------------------------------- function mpwParseHexData(xv) { xret=""; xv=mpwtrim(xv); for (var ii=0;ii < xv.length;ii+=2) xret+=String.fromCharCode(parseInt("0x"+xv.charAt(ii)+xv.charAt(ii+1))); return xret; } // ------------------------------------------- function mpwdStr(xstr) { qstr=xstr; xarray=new Array(); while (qstr!="") { xarray.push(parseInt("0x"+qstr.substr(0,2))); qstr=qstr.substr(2); } var rstr=utfBytesToStr(xarray); var xrstr=""; for (var i=0;i < rstr.length;i++) { var ch=rstr.charAt(i); if (ch=="\\") { i++; ch=rstr.charAt(i); if (ch=="0") ch=String.fromCharCode(0); } xrstr+=ch; } return xrstr; } // ------------------------------------------- function mpwSetHTML(xhtml) { var o=document.getElementById("qmpwc"); if (o) o.innerHTML=xhtml; } // ------------------------------------------- var xhttp=new XMLHttpRequest(); xhttp.onreadystatechange=function() { mpwFlashWebLed("xhttpled"); if (this.readyState==4 && this.status==404) mpwOnNotFound(this); else if (this.readyState==4 && this.status==200) eval("mpwOnDataReceived(this,this.responseText,_last_xdata)"); } // ------------------------------------------- var xhttpauto=new XMLHttpRequest(); xhttpauto.onreadystatechange=function() { mpwFlashWebLed("xhttpautoled"); if (this.readyState==4 && this.status==404) mpwOnNotFound(this); else if (this.readyState==4 && this.status==200) eval("mpwOnDataReceived(this,this.responseText,_last_xdataauto)"); } // ------------------------------------------- function mpwSetWebLedState(xid,xstate) { var o=document.getElementById(xid); if (o) o.style.opacity=((xstate)?(0.9):(0.2)); } // ------------------------------------------- __mpwFlashWebLed_lasttimeout=false; function mpwFlashWebLed(xid) { mpwSetWebLedState(xid,true); if (__mpwFlashWebLed_lasttimeout) clearTimeout(__mpwFlashWebLed_lasttimeout); __mpwFlashWebLed_lasttimeout=setTimeout("mpwSetWebLedState('"+xid+"',false)",200); } setTimeout("mpwJSinit()",100); // ------------------------------------------- function mpwJSinit() { var e=document.getElementsByTagName("div"); for (var ii=0;ii < e.length;ii++) if (e[ii].getAttribute("x")=="n") { e[ii].innerHTML=mpwJSgetcontent(); break; } mpwqTimer(); mpwShowLedPanel(); } function mpwgraph_paint(xdiv,xparams,qtype) { var qparams=mpwgraph_parseParams(xparams); var cparams=qtype.split("."); xtype=cparams.shift(); if (xtype=="small") { var xtop=0; var xleft=0; var xwidth=306; var xheight=64; var s=''; s+=''; } if (xtype=="big") { var qwidth=xdiv.offsetWidth; var qheight=xdiv.offsetHeight-10; var xwidth=qwidth-120; var xheight=qheight-50; var xleft=60; var xtop=25; var qpinconf=false; if (_qpinconfs) qpinconf=_qpinconfs[qparams["xpin"]]; var s=''; s+=''; } xdiv.innerHTML=s; } function mpwgraph_polyline(qparams,xs,ys,xwidth,xheight,xmin,xmax) { var xout=new Array(); var xtimes=qparams["xtimes"].split(","); var xmintime=0; var xmaxtime=xtimes[xtimes.length-1]; var xdiftime=xmaxtime-xmintime; var xsamples=qparams["xdatasamples"].split(","); var xminsample=xmin; var xmaxsample=xmax; var xdifsample=xmaxsample-xminsample; if (xdifsample<=0) { xminsample=xmaxsample-1; xmaxsample++; xdifsample=xmaxsample-xminsample; } for (var x=0;x < qparams["xdatacount"]; x++) { var xtime=xtimes[x]-xmintime; var xsample=xsamples[x]-xminsample; var px=xs+(xwidth/xdiftime*xtime); var py=ys+(xheight-(xheight/xdifsample*xsample)); xout.push(px+","+py); } return (xout.join(" ")); } function mpwgraph_parseParams(xparams) { var xret=new Object; var qx=xparams.split("\n"); for (var i=0;i < qx.length;i++) { var px=qx[i].split("="); var xk=px.shift(); var xv=px.join("="); xret[xk]=xv; } return xret; } // ------------------------------------------- function mpwUTFhex(xval) { var s=""; var xarray=utfStrToBytes(xval); for(var ii=0;ii < xarray.length;ii++) { var q=xarray[ii].toString(16).toUpperCase(); while ((q.length & 1)==1) q="0"+q; s+=q; } return s; } // ------------------------------------------- function mpwtrim(inputString) { if (inputString==null) inputString=new String(""); if (typeof inputString != "string") inputString=new String(inputString); var retValue = inputString; var ch = retValue.substring(0, 1); while ((ch == " ") || (ch =="\n") || (ch =="\r")) { retValue = retValue.substring(1, retValue.length); ch = retValue.substring(0, 1); } ch = retValue.substring(retValue.length - 1, retValue.length); while ((ch == " ") || (ch =="\n") || (ch =="\r")) { retValue = retValue.substring(0, retValue.length - 1); ch = retValue.substring(retValue.length - 1, retValue.length); } return retValue; } // ------------------------------------------- function mpwtrimUTFstring(xstr,maxlen) { var xret=""; xstr=mpwtrim(xstr); for (var ii=0;ii < xstr.length;ii++) { var xch=xstr.charAt(ii); var xc=xret+xch; xha=utfStrToBytes(xc); if (xha.length<=maxlen) xret+=xch; else break; } return xret; } // ------------------------------------------- function mpwXUnitFormat(xval) { var xabsval=Math.abs(xval); if (xabsval<0.001) xabsval=0; else if (xabsval<1) xabsval=(Math.floor(xabsval*1000))/1000; else if (xabsval<1000) xabsval=(Math.floor(xabsval*100))/100; else if (xabsval<10000) xabsval=(Math.floor(xabsval/1000*100))/100+"k"; else if (xabsval<1000000) xabsval=(Math.floor(xabsval/1000*10))/10+"k"; else if (xabsval<10000000) xabsval=(Math.floor(xabsval/1000/1000*100))/100+"M"; else if (xabsval<1000000000) xabsval=(Math.floor(xabsval/1000/1000*10))/10+"M"; else if (xabsval<10000000000) xabsval=(Math.floor(xabsval/1000/1000/1000*100))/100+"G"; else if (xabsval<1000000000000) xabsval=(Math.floor(xabsval/1000/1000/1000*10))/10+"G"; else xabsval=mpwtrim(xabsval); if (xval<0) xabsval="-"+xabsval; return xabsval; } // ------------------------------------------- function CapacityEx(size,multiplier,unitname) { if (!(multiplier>0)) multiplier=1024; if ((!unitname) || (mpwtrim(unitname)=="")) unitname="B"; var mm="0"; tt=new Array("k","M","G","T","P","E"); var ii=0; if (size>0) { var xtt=""; while (size>=multiplier) { size=size/multiplier; xtt=tt[ii];ii++; if (ii>=tt.length) break; } mm=(Math.round(size*100)/100)+" "+xtt+unitname; } return mm; } // ------------------------------------------- function CFormatTime(tt) { var ss=new Object(); var tf=Math.floor(tt); if (tf!=tt) { var tms=Math.round((tt-tf)*100000)/100; if (tms>0) ss["msec"]=tms; } ss["sec"]=Math.floor(tt%60); tt=Math.floor(tt/60); if (tt>0) { ss["min"]=tt%60; tt=Math.floor(tt/60); if (tt>0) { ss["hrs"]=tt%24; tt=Math.floor(tt/24); if (tt>0) ss["days"]=tt; } } var xs=new Array(); for (var p in ss) { xs.unshift(mpwtrim(ss[p]+" "+p)); } return xs.join(" "); } // ------------------------------------------- function set_cookie ( name, value, exp_seconds, path, domain, secure ) { var cookie_string = name + "=" + escape ( value ); if ( exp_seconds ) { var expires = new Date (); ex=expires.valueOf()+exp_seconds*1000; expires = new Date (ex); cookie_string += "; expires=" + expires.toGMTString(); } if ( path ) cookie_string += "; path=" + escape ( path ); if ( domain ) cookie_string += "; domain=" + escape ( domain ); if ( secure ) cookie_string += "; secure"; document.cookie = cookie_string; } // ------------------------------------------- function delete_cookie(cookie_name) { var cookie_date=new Date(); cookie_date.setTime(cookie_date.getTime()-1); document.cookie=cookie_name+="=; expires="+cookie_date.toGMTString(); } function get_cookie ( cookie_name ) { var results = document.cookie.match ( cookie_name + '=(.*?)(;|$)' ); if (results) return ( unescape ( results[1] ) ); else return null; } // ------------------------------------------- function mpwlog(xtext) { mpwlogx(xtext,true); } function mpwlogadd(xtext) { mpwlogx(xtext,false); } // ------------------------------------------- function mpwlogx(xtext,xdelete) { var o=document.getElementById("xlog"); if (!o) { o=document.createElement("textarea"); document.body.appendChild(o); o.id="xlog"; o.style.position="fixed"; o.style.left="10px"; o.style.top="10px"; } var qx=""; if (typeof xtext == "object") { var s=""; for (var p in xtext) s+="["+p+"]="+xtext[p]+"\n"; qx=s; } else qx=xtext+"\n"; if (xdelete) o.value=qx; else o.value=o.value+qx; } // ------------------------------------------- function utfStrToBytes(str) { var out = new Array(); var p = 0; for (var i = 0; i < str.length; i++) { var c = str.charCodeAt(i); if (c < 128) out[p++] = c; else if (c < 2048) { out[p++] = (c >> 6) | 192; out[p++] = (c & 63) | 128; } else { out[p++] = (c >> 12) | 224; out[p++] = ((c >> 6) & 63) | 128; out[p++] = (c & 63) | 128; } } return out; } // ------------------------------------------- function utfBytesToStr(bytes) { var ix = 0; if( bytes.slice(0,3) == "\xEF\xBB\xBF") ix = 3; var string = ""; for( ; ix < bytes.length; ix++ ) { var byte1 = bytes[ix]; if( byte1 < 0x80 ) { string += String.fromCharCode(byte1); } else if( byte1 >= 0xC2 && byte1 < 0xE0 ) { var byte2 = bytes[++ix]; string += String.fromCharCode(((byte1&0x1F)<<6) + (byte2&0x3F)); } else if( byte1 >= 0xE0 && byte1 < 0xF0 ) { var byte2 = bytes[++ix]; var byte3 = bytes[++ix]; string += String.fromCharCode(((byte1&0xFF)<<12) + ((byte2&0x3F)<<6) + (byte3&0x3F)); } else if( byte1 >= 0xF0 && byte1 < 0xF5) { var byte2 = bytes[++ix]; var byte3 = bytes[++ix]; var byte4 = bytes[++ix]; var codepoint = ((byte1&0x07)<<18) + ((byte2&0x3F)<<12)+ ((byte3&0x3F)<<6) + (byte4&0x3F); codepoint -= 0x10000; string += String.fromCharCode((codepoint>>10) + 0xD800,(codepoint&0x3FF) + 0xDC00); } } return string; } function mpwtaxsetline() { if (_areaobjs.length>0) { var naobjs=new Array(); for (var ii=0;ii < _areaobjs.length;ii++) { var ox=_areaobjs[ii]; var xi = document.getElementById(ox["id"]); if (xi) { el=ox["el"]; ta=ox["ta"]; while (el.scrollHeight <= (ta.scrollHeight+20)) { var xlinenr=Math.round(el.getAttribute("xlinenr")); if (!((xlinenr<=0) || (xlinenr>=0))) xlinenr=0; var str=""; for(var no=0;no<10;no++) str += ((xlinenr+no+1)+'\n'); el.value=el.value+str; el.setAttribute("xlinenr",xlinenr+no); } el.scrollTop = ta.scrollTop; el.style.top = (ta.offsetTop) + "px"; el.style.left = (ta.offsetLeft - 30) + "px"; naobjs.push(ox); } } _areaobjs=naobjs; if ((!_areatimer) && (_areaobjs.length>0)) _areatimer=setTimeout("_areatimer=false;mpwtaxsetline();",100); } } function mpwDisableSelection(element) { if (typeof element.onselectstart != 'undefined') { element.onselectstart = function() { return false; }; } else if (typeof element.style.MozUserSelect != 'undefined') { element.style.MozUserSelect = 'none'; } else { element.onmousedown = function() { return false; }; } } function mpwcreateTextAreaWithLines(id) { _areaxid++; var el = document.createElement('TEXTAREA'); var ta = document.getElementById(id); var string = ''; el.className = 'textAreaWithLines'; el.style.width = "25px"; el.style.minWidth = el.style.width; el.style.maxWidth = el.style.width; el.style.minHeight = ta.offsetHeight+"px";; el.style.maxHeight = ta.offsetHeight+"px";; ta.style.minWidth = ta.offsetWidth+"px"; ta.style.maxWidth = ta.offsetWidth+"px"; ta.style.minHeight = ta.offsetHeight+"px"; ta.style.maxHeight = ta.offsetHeight+"px"; el.style.position = "absolute"; el.style.overflow = 'hidden'; el.style.textAlign = 'right'; el.style.paddingRight = '2px'; el.setAttribute("xlinenr",0); el.setAttribute("readonly","readonly"); el.setAttribute("readonly","readonly"); el.setAttribute("tabIndex", "-1"); el.onfocus = function() { ta.focus();}; var qqid="xlinearea__"+_areaxid; el.id=qqid; el.style.zIndex = 0; mpwDisableSelection(el); ta.style.zIndex = 1; ta.style.position = "relative"; ta.parentNode.insertBefore(el, ta.nextSibling); qx=new Object(); qx["id"]=qqid; qx["el"]=el; qx["ta"]=ta; _areaobjs.push(qx); if (_areaobjs.length==1) mpwtaxsetline(); ta.focus(); } // ------------------------------------------- function mpwStoreDisplaySetup() { var xdata=new Object(); xdata["cmd"]="wdp"; var o=document.getElementById("xmpwdisplaysrc"); if (o) { xdata["src"]=_mpwCheckDisplaySrcParsed; mpwJSsenddata(xdata); } } // ------------------------------------------- function mpwApplyDisplaySettings() { var ol=document.getElementById("xmpwdisplaysrclength"); var ot=document.getElementById("xmpwdisplaysrc"); var or=document.getElementById("xmpwdisplaysrclengthremain"); _mpwCheckDisplaySrcParsed=""; var xm=mpwCheckDisplaySrc(ot.value); if ((or) && (ol) && (ot)) { ol.innerHTML=_mpwCheckDisplaySrcParsed.length; or.innerHTML=_lastDisplaySetupObject["xmax"]-_mpwCheckDisplaySrcParsed.length; } var o=document.getElementById("xmpwdisplaystorebutton"); if (o) o.style.display=( (ot.getAttribute("xorigsrc")!=ot.value) && (xm=="") )?"block":"none"; var o=document.getElementById("xmpwdisplayerr"); if ((o) && (o.innerHTML!=xm)) o.innerHTML=xm; } // ------------------------------------------- _mpwCheckDisplaySrcParsed="" function mpwCheckDisplaySrc(xsrc) { var xp=new Array(); var xret=""; _mpwCheckDisplaySrcParsed=""; var xsrcx=xsrc.split("\n"); for (var ll=0;ll < xsrcx.length; ll++) { var t=xsrcx[ll]; var tx=""; for (var ii=0;ii < t.length; ii++) { var c=t.charCodeAt(ii); var ct=t.charAt(ii); if (c==13) continue; if (!( ((c>=32) && (c<127)) || (c==10) ) ) { var xii=ii-10; if (xii<0) xii=0; if (xret=="") xret="Řádek "+(ll+1)+", neplatný znak: "+t.substring(xii,ii)+ ">"+ct+ "<"+t.substring(ii+1,ii+10)+" (kód: "+c+")."; } tx+=ct; } xp.push(tx); var xmaxpline=50; if (t.length>xmaxpline) if (xret=="") xret="Řádek "+(ll+1)+" je příliš dlouhý. Největší akceptovatelná délka řádku je "+ xmaxpline+" znaků. Délka řádku je "+t.length+", přebývá "+(t.length-xmaxpline)+"."; } _mpwCheckDisplaySrcParsed=xp.join("\n"); var qlen=_mpwCheckDisplaySrcParsed.length; var maxlen=0; if (_lastDisplaySetupObject) maxlen=_lastDisplaySetupObject["xmax"]; if (qlen > maxlen) xret="Zdrojový text nastavení displaye je příliš velký. Maximum je "+maxlen+ " bajtů, aktuální délka: "+qlen+" bajtů. Rozdíl: "+(qlen-maxlen)+" bajtů."; return xret; } // ------------------------------------------- function mpwDisplayClickButton(xbutt) { var xdata=new Object(); xdata["cmd"]="db"; xdata["bid"]=xbutt; xdata["_eval"]="mpwDisplayClickButton_finished(qres)"; mpwJSsenddata(xdata); } // ------------------------------------------- function mpwDisplayClickButton_finished(qres) { if (qres!="OK") alert(qres); else { mpwLoadDisplayDump(); } } // ------------------------------------------- function mpwLoadDisplayDump() { var xdata=new Object(); xdata["_eval"]="mpwLoadDisplayDump_finished(qres)"; _last_xdataauto=xdata; xurl="./cfg?cmd="+mpwUTFhex("dd"); xhttpauto.open("GET",xurl,true); xhttpauto.send(); } // ------------------------------------------- function mpwLoadDisplayDump_finished(qres) { var s=qres.split("\r").join("").split("\n"); if (s.shift()=="~DD") var xlines=new Array(); var xdtype="" var xtype="" for (var ii=0;ii < s.length;ii++) { var ch=":"; var qx=s[ii].split(ch); var qk=qx.shift();qx=qx.join(ch); if (qk=="T") xdtype=qx; else if (qk=="S") { var cq=qx.split(","); var o=document.getElementById("qlcddispstats"); if (o) o.innerHTML="Počet proměnných: "+cq.shift()+"
'+
'Display - nastavení |
Podpora pro display je vypnuta. |
'+
' | ||||||||||
'+
'
| ||||||||||
'+
' Aktuální délka: , maximum: '+qobj["xmax"]+', zbývá: '+
'. '+
' | ' ' |
ALL OFF | '+
''+ ' | '+ ' |
'+
'
| '+
''+
'
| '+
'OFF | '+ '