diff --git a/_web-build_do.sh b/_web-build_do.sh index 752725d..2f2eabe 100755 --- a/_web-build_do.sh +++ b/_web-build_do.sh @@ -9,6 +9,7 @@ BLDDIR=html rm -rf "$BLDDIR/pages" rm -rf "$BLDDIR/js" rm -rf "$BLDDIR/css" +rm -rf "$BLDDIR/img" cd "$SRCDIR" gulp --production @@ -16,11 +17,14 @@ cd .. cp -R "$SRCDIR/css" "$BLDDIR" cp -R "$SRCDIR/js" "$BLDDIR" +cp -R "$SRCDIR/img" "$BLDDIR" find "$BLDDIR" -name "*.map" -delete mkdir -p "$BLDDIR/pages" php "$SRCDIR/page_status.php" > "$BLDDIR/pages/status.tpl" +php "$SRCDIR/page_about.php" > "$BLDDIR/pages/about.tpl" php "$SRCDIR/page_wifi.php" > "$BLDDIR/pages/wifi.tpl" -php "$SRCDIR/page_waveform.php" > "$BLDDIR/pages/waveform.html" # no substitutions, .html allows to gzip it. +php "$SRCDIR/page_waveform.php" > "$BLDDIR/pages/wfm.html" # no substitutions, .html allows to gzip it. +php "$SRCDIR/page_fft.php" > "$BLDDIR/pages/fft.html" # same diff --git a/esp_meas.pro b/esp_meas.pro index c75df62..f40f1a6 100644 --- a/esp_meas.pro +++ b/esp_meas.pro @@ -60,7 +60,8 @@ SOURCES += \ user/page_status.c \ user/page_waveform.c \ user/utils.c \ - sbmp/library/payload_builder.c + sbmp/library/payload_builder.c \ + user/page_about.c HEADERS += \ include/uart_hw.h \ @@ -142,7 +143,9 @@ HEADERS += \ user/page_waveform.h \ libesphttpd/include/espmissingprotos.h \ user/utils.h \ - sbmp/library/payload_builder.h + sbmp/library/payload_builder.h \ + user/page_about.h \ + user/fw_version.h DISTFILES += \ style.astylerc \ diff --git a/esp_meas.pro.user b/esp_meas.pro.user index 7ce2894..c6e4ff7 100644 --- a/esp_meas.pro.user +++ b/esp_meas.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/html/css/app.css b/html/css/app.css index c98a261..3f2dbdd 100644 --- a/html/css/app.css +++ b/html/css/app.css @@ -1 +1 @@ -*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}figure,nav{display:block}canvas,progress{display:inline-block;vertical-align:baseline}[hidden]{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b{font-weight:700}h1,h2{font-size:2em;margin:.67em 0}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,pre{font-family:monospace;font-size:1em}button,input,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}legend{border:0;padding:0}textarea{overflow:auto}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}.ct-zoom-rect{fill:rgba(200,100,100,.3);stroke:#ff2b12}.ct-axis-title{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ct-axis-title,.ct-label{fill:rgba(255,255,255,.8)}.ct-label{color:rgba(255,255,255,.8);font-size:.75rem;line-height:1}.ct-label.ct-horizontal.ct-start{align-items:flex-end;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-horizontal.ct-end{align-items:flex-start;justify-content:flex-start;text-align:left;text-anchor:start;transform:translate(-4px) rotate(45deg)}.ct-label.ct-vertical.ct-start{align-items:flex-end;justify-content:flex-end;text-align:right;text-anchor:end;transform:translateY(20%)}.ct-label.ct-vertical.ct-end{align-items:flex-end;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:flex}.ct-chart-bar .ct-label.ct-horizontal.ct-start{align-items:flex-end;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-end{align-items:flex-start;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{align-items:flex-end;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{align-items:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{align-items:center;justify-content:flex-end;text-align:right;text-anchor:end}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{align-items:center;justify-content:flex-start;text-align:left;text-anchor:end}.ct-grid{stroke:rgba(255,255,255,.3);stroke-width:1px;stroke-dasharray:2px}.ct-point{stroke-width:4px;stroke-linecap:round}.ct-line{fill:none;stroke-width:2px}.ct-area{stroke:none;fill-opacity:.1}.ct-bar{fill:none;stroke-width:10px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-point{stroke:#f05b4f}.ct-series-a .ct-area,.ct-series-a .ct-slice-pie{fill:#f05b4f}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point{stroke:#6188e2}.ct-series-b .ct-area,.ct-series-b .ct-slice-pie{fill:#6188e2}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point{stroke:#59922b}.ct-series-c .ct-area,.ct-series-c .ct-slice-pie{fill:#59922b}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point{stroke:#eacf7d}.ct-series-d .ct-area,.ct-series-d .ct-slice-pie{fill:#eacf7d}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point{stroke:#a748ca}.ct-series-e .ct-area,.ct-series-e .ct-slice-pie{fill:#a748ca}.ct-wide{display:block;position:relative;width:100%}.ct-wide:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:62.5%}.ct-wide:after{content:"";display:table;clear:both}.ct-wide>svg{display:block;position:absolute;top:0;left:0}.ct-narrow{display:block;position:relative;width:100%}.ct-narrow:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:66.6666666667%}.ct-narrow:after{content:"";display:table;clear:both}.ct-narrow>svg{display:block;position:absolute;top:0;left:0}.center{text-align:center}.invis{visibility:hidden}.hidden{display:none}html{font-family:Arial,sans-serif;color:#D0D0D0;background:#131315}body,html{border:0 none;margin:0;padding:0;text-decoration:none;width:100%;height:100%;overflow:hidden}a,a:link,a:visited{color:#5abfff;text-decoration:none}a:hover{color:#5abfff;text-decoration:underline}#outer{display:flex;position:absolute;width:100%;height:100%;left:0;right:0;top:0;bottom:0;overflow:hidden;flex-direction:row}@media screen and (max-width:544px){#outer{display:block;overflow-y:scroll}}#menu{flex:0 0 15rem;background:#2bab5f}#menu>*{display:block;text-decoration:none;padding:.6180469716rem 1rem;white-space:nowrap;word-wrap:normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#menu #brand{color:white;background:#218248;font-size:120%;text-align:center;position:relative;margin-bottom:1rem}@media screen and (max-width:544px){#menu #brand{background:#2bab5f;cursor:pointer}#menu #brand:after{position:absolute;color:rgba(0,0,0,.2);right:1rem;content:'>';top:50%;font-size:120%;font-weight:700;transform:translateY(-50%) rotate(90deg)}}#menu.expanded #brand{background:#218248}@media screen and (max-width:544px){#menu.expanded #brand:after{transform:translateY(-50%) rotate(-90deg)}}#menu a{font-size:130%;color:white;transition:background-color .2s;text-shadow:0 0 5px rgba(0,0,0,.4)}#menu a.selected,#menu a:hover{background:#1bd886;text-shadow:0 0 5px rgba(0,0,0,.6)}#menu a.selected{position:relative;box-shadow:0 0 5px rgba(0,0,0,.5)}#menu a:before{content:"▸";padding-right:.5rem;position:relative;top:-.1rem}@media screen and (max-width:544px){#menu a{display:none}}#menu.expanded a{display:block}@media screen and (min-width:545px) and (max-width:1000px){#menu{flex-basis:10rem}#menu #brand{font-size:95%;margin-bottom:.6180469716rem}#menu a{font-size:105%}#menu>*{padding:.3819820591rem .6180469716rem}}#content{flex-grow:1;overflow-y:auto;padding:1rem}@media screen and (max-width:544px){#content{padding:.6180469716rem}}#content>*{margin-left:auto;margin-right:auto}#content h1{text-align:center;font-size:2.2806973457em;margin-top:0;margin-bottom:1rem}#content h2{font-size:1.423828125em;margin-bottom:.6180469716rem}#content td,#content th{padding:.3819820591rem}#content tbody th{text-align:right;width:130px;color:#fff}.Box{display:block;max-width:900px;margin-top:1rem;padding:.6180469716rem;border-radius:3px;background-color:rgba(255,255,255,.07)}@media screen and (max-width:544px){.Box{margin-top:.6180469716rem}}.Box h2,h1+.Box{margin-top:0}.Box.wide{width:initial;max-width:initial}.Box.medium{max-width:1200px}.Modal{position:fixed;width:100%;height:100%;left:0;top:0;right:0;bottom:0;display:flex;justify-content:center;align-items:center;transition:opacity .5s;background:rgba(0,0,0,.65);opacity:0}.Modal.visible{opacity:1}.Modal.hidden{display:none}.Dialog{margin:.6180469716rem;padding:1rem .6180469716rem;overflow:hidden;max-width:100%;max-height:100%;flex:0 1 30rem;background:#1c1c1e;border-left:6px solid #217b3a;border-right:6px solid #217b3a;box-shadow:0 0 2px 0 #434349,0 0 6px 0 black;border-radius:6px}.button,button,input[type=button],input[type=reset],input[type=submit]{text-align:center;cursor:pointer;display:inline-block;border-radius:2px;padding:0 .6em;border:0 none;outline:0 none!important;line-height:1.8em;font-size:1.1em;margin-bottom:3px;min-width:5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-shadow:1.5px 1.5px 2px rgba(0,0,0,.8)}.button:active,button:active,input[type=button]:active,input[type=reset]:active,input[type=submit]:active{position:relative;top:2px}.button.narrow,button.narrow,input[type=button].narrow,input[type=reset].narrow,input[type=submit].narrow{min-width:initial}.btn-green,input[type=submit]{background-color:#2ca94b;box-shadow:0 3px 0 #1d7032;text-decoration:none!important}.btn-green,.btn-green:link,.btn-green:visited,input[type=submit],input[type=submit]:link,input[type=submit]:visited{color:#FEFEFE}.btn-green.active,.btn-green.selected,.btn-green:active,.btn-green:hover,input[type=submit].active,input[type=submit].selected,input[type=submit]:active,input[type=submit]:hover{background-color:#28ba5c;color:#FEFEFE}.btn-green.active,.btn-green.selected,.btn-green:hover,input[type=submit].active,input[type=submit].selected,input[type=submit]:hover{box-shadow:0 3px 0 #1a773b}.btn-green:active,input[type=submit]:active{box-shadow:0 1px 0 #1a773b}.btn-red,input[type=reset]{background-color:#D04E51;box-shadow:0 3px 0 #aa2d30;text-decoration:none!important}.btn-red,.btn-red:link,.btn-red:visited,input[type=reset],input[type=reset]:link,input[type=reset]:visited{color:#FEFEFE}.btn-red.active,.btn-red.selected,.btn-red:active,.btn-red:hover,input[type=reset].active,input[type=reset].selected,input[type=reset]:active,input[type=reset]:hover{background-color:#d4403f;color:#FEFEFE}.btn-red.active,.btn-red.selected,.btn-red:hover,input[type=reset].active,input[type=reset].selected,input[type=reset]:hover{box-shadow:0 3px 0 #9e2423}.btn-red:active,input[type=reset]:active{box-shadow:0 1px 0 #9e2423}input[type=number],input[type=password],input[type=text],select,textarea{border:0 none;border-bottom:2px solid #217b3a;background-color:#303030;color:#fff;padding:6px;line-height:1em;outline:0 none!important;-moz-outline:0 none!important;font-weight:400}input[type=number]:focus,input[type=number]:hover,input[type=password]:focus,input[type=password]:hover,input[type=text]:focus,input[type=text]:hover,select:focus,select:hover,textarea:focus,textarea:hover{border-bottom-color:#28bc65}input[type=number],input[type=password],input[type=text],textarea{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;cursor:text}textarea{font-family:monospace;line-height:1.2em;display:block}form{border:0 none;margin:0;padding:0;text-decoration:none}input[type=number],input[type=password],input[type=text],label.select-wrap,select,textarea{width:250px}form .Row{vertical-align:middle;margin:14px auto;text-align:left;display:flex;flex-direction:row}form .Row:first-child{margin-top:0}form .Row:last-child{margin-bottom:0}form .Row .spacer{width:130px}@media screen and (max-width:544px){form .Row .spacer{display:none}}form .Row.buttons .button,form .Row.buttons input{margin-right:.6180469716rem}form .Row.centered{justify-content:center}form .Row.message{font-size:1em;text-shadow:1px 1px 3px black;text-align:center}form .Row.message.error{color:crimson}form .Row.message.ok{color:#0fe851}form .Row.separator{padding-top:14px;border-top:2px solid rgba(255,255,255,.1)}form .Row textarea{display:inline-block;vertical-align:top;min-height:10rem;flex-grow:1;resize:vertical}form .Row label{font-weight:700;color:#fff;text-shadow:1px 1px 3px black;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}form .Row .checkbox-wrap,form .Row label{display:inline-block;width:130px;text-align:right;padding:8px;align-self:flex-start}form .Row .checkbox-wrap input[type=checkbox]{margin:auto;width:auto;height:auto}form .Row .checkbox-wrap+label{width:250px;padding-left:0;text-align:left;cursor:pointer}@media screen and (max-width:544px){form .Row{flex-direction:column}form .Row.buttons,form .Row.centered{flex-direction:row}form .Row.buttons{justify-content:center}form .Row.buttons :last-child{margin-right:0}form .Row label{padding-left:0;text-align:left;width:auto}form .Row .checkbox-wrap{order:1;text-align:left;padding-bottom:0;border-radius:.4px;width:auto}form .Row .checkbox-wrap+label{width:auto}form .Row input[type=number],form .Row input[type=password],form .Row input[type=text],form .Row textarea{width:100%}}form span.required{color:red}.RadioGroup{display:inline-block;line-height:1.5em;vertical-align:middle}.RadioGroup label{width:auto;text-align:left;cursor:pointer;font-weight:400}.RadioGroup input[type=radio]{vertical-align:middle;margin:0 0 0 5px}@media screen and (-webkit-min-device-pixel-ratio:0){select{padding-right:18px}}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;line-height:1.4em;padding:3.5px;padding-right:1em}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #fff}select option{background:#303030}label.select-wrap{position:relative;display:inline!important;margin:0!important;padding:0!important;width:auto!important}label.select-wrap:after{content:'<>';font-family:Consolas,monospace;font-weight:700;color:#28bc65;top:50%;transform:translateY(-50%) rotate(90deg);right:2px;position:absolute;z-index:100;pointer-events:none}#ap-list{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:0;-moz-column-gap:0;column-gap:0;margin:0 -.2360828548rem}@media screen and (min-width:545px) and (max-width:1000px){#ap-list{-webkit-column-count:2;-moz-column-count:2;column-count:2}}@media screen and (max-width:544px){#ap-list{-webkit-column-count:1;-moz-column-count:1;column-count:1}}#ap-loader{background:rgba(255,255,255,.1);border-radius:5px;padding:.3819820591rem;margin-bottom:.3819820591rem}#ap-box{padding-bottom:.3819820591rem}#psk-modal form{display:flex;align-items:center;margin:.3819820591rem}#psk-modal form>*{margin-left:.3819820591rem;margin-right:.3819820591rem}#psk-modal form>:first-child{margin-left:0}#psk-modal form>:last-child{margin-right:0}#psk-modal form input[type=password]{min-width:5rem}.AP{-webkit-column-break-inside:avoid;page-break-inside:avoid;break-inside:avoid-column;max-width:500px;padding:.2360828548rem}.AP.selected .inner{background:#43de81!important;cursor:default;top:0!important}.AP .inner{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;border-radius:3px;color:#222;background:#afafaf;transition:background-color .5s;display:flex}.AP .inner:active{left:0;top:1px}.AP .inner:hover{background:white}.AP .inner>*{padding:.6180469716rem;white-space:nowrap;word-wrap:normal}.AP .inner .rssi{min-width:2rem;flex:0 0 15%;text-align:right}.AP .inner .rssi:after{padding-left:.090179415rem;content:'%';font-size:.8888888889em}.AP .inner .essid{flex:1 1 70%;min-width:0;text-overflow:ellipsis;overflow:hidden;font-weight:700}.AP .inner .auth{flex:0 0 15%}.page-home #staRSSIperc:after{padding-left:.1459102934rem;content:'%';font-size:.8888888889em}.page-home #staRSSI:after{padding-left:.1459102934rem;content:'dBm';font-size:.8888888889em}#samp-ctrl{display:flex;padding:.3819820591rem;flex-direction:row;justify-content:center;align-items:stretch}@media screen and (max-width:544px){#samp-ctrl{flex-direction:column}}#samp-ctrl>div{margin:.3819820591rem}#samp-ctrl label{line-height:1.8;font-weight:700}#samp-ctrl input{width:150px}@media screen and (max-width:544px){#samp-ctrl input{width:100%}}.Box.chartbox{display:flex;flex-direction:row}@media screen and (max-width:544px){.Box.chartbox{flex-direction:column}}.Box.chartbox .stats{flex:0 1}@media screen and (max-width:544px){.Box.chartbox .stats table{margin:0 auto}.Box.chartbox .stats td,.Box.chartbox .stats th{width:50%}}.Box.chartbox .stats td,.Box.chartbox .stats th{white-space:nowrap;word-wrap:normal}.Box.chartbox .stats th sub{font-weight:400}.Box.chartbox .stats td{min-width:100px}.Box.chartbox .stats td:after{font-size:90%;padding-left:.5em}.Box.chartbox .stats #stat-f-s:after{content:"Hz"}.Box.chartbox .stats #stat-i-peak:after,.Box.chartbox .stats #stat-i-rms:after{content:"mA"}@media screen and (min-width:1001px){.mq-tablet-max{display:none}}@media screen and (max-width:1000px){.mq-normal-min{display:none}} \ No newline at end of file +*,:after,:before{box-sizing:border-box}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}figure,nav{display:block}canvas,progress{display:inline-block;vertical-align:baseline}[hidden]{display:none}a{background-color:transparent}a:active,a:hover{outline:0}b{font-weight:700}h1,h2{font-size:2em;margin:.67em 0}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,pre{font-family:monospace;font-size:1em}button,input,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}legend{border:0;padding:0}textarea{overflow:auto}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}.ct-zoom-rect{fill:rgba(200,100,100,.3);stroke:#ff2b12}.ct-axis-title{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ct-axis-title,.ct-label{fill:rgba(255,255,255,.8)}.ct-label{color:rgba(255,255,255,.8);font-size:.75rem;line-height:1}.ct-label.ct-horizontal.ct-start{align-items:flex-end;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-horizontal.ct-end{align-items:flex-start;justify-content:flex-start;text-align:left;text-anchor:start;transform:translate(-4px) rotate(45deg)}.ct-label.ct-vertical.ct-start{align-items:flex-end;justify-content:flex-end;text-align:right;text-anchor:end;transform:translateY(20%)}.ct-label.ct-vertical.ct-end{align-items:flex-end;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:flex}.ct-chart-bar .ct-label.ct-horizontal.ct-start{align-items:flex-end;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-end{align-items:flex-start;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{align-items:flex-end;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{align-items:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{align-items:center;justify-content:flex-end;text-align:right;text-anchor:end}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{align-items:center;justify-content:flex-start;text-align:left;text-anchor:end}.ct-grid{stroke:rgba(255,255,255,.3);stroke-width:1px;stroke-dasharray:2px}.ct-point{stroke-width:4px;stroke-linecap:round}.ct-line{fill:none;stroke-width:2px}.ct-with-area .ct-line{stroke-width:1px}.ct-area{stroke:none;fill-opacity:.3}.ct-bar{fill:none;stroke-width:10px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-point{stroke:#f05b4f}.ct-series-a .ct-area,.ct-series-a .ct-slice-pie{fill:#f05b4f}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point{stroke:#6188e2}.ct-series-b .ct-area,.ct-series-b .ct-slice-pie{fill:#6188e2}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point{stroke:#59922b}.ct-series-c .ct-area,.ct-series-c .ct-slice-pie{fill:#59922b}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point{stroke:#eacf7d}.ct-series-d .ct-area,.ct-series-d .ct-slice-pie{fill:#eacf7d}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point{stroke:#a748ca}.ct-series-e .ct-area,.ct-series-e .ct-slice-pie{fill:#a748ca}.ct-wide{display:block;position:relative;width:100%}.ct-wide:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:62.5%}.ct-wide:after{content:"";display:table;clear:both}.ct-wide>svg{display:block;position:absolute;top:0;left:0}.ct-narrow{display:block;position:relative;width:100%}.ct-narrow:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:66.6666666667%}.ct-narrow:after{content:"";display:table;clear:both}.ct-narrow>svg{display:block;position:absolute;top:0;left:0}.center{text-align:center}.invis{visibility:hidden}.hidden{display:none}html{font-family:Arial,sans-serif;color:#D0D0D0;background:#131315}body,html{border:0 none;margin:0;padding:0;text-decoration:none;width:100%;height:100%;overflow:hidden}a,a:link,a:visited{color:#5abfff;text-decoration:none}a:hover{color:#5abfff;text-decoration:underline}#outer{display:flex;position:absolute;width:100%;height:100%;left:0;right:0;top:0;bottom:0;overflow:hidden;flex-direction:row}@media screen and (max-width:544px){#outer{display:block;overflow-y:scroll}}#menu{flex:0 0 15rem;background:#2bab5f}#menu>*{display:block;text-decoration:none;padding:.6180469716rem 1rem;white-space:nowrap;word-wrap:normal;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#menu #brand{color:white;background:#218248;font-size:120%;text-align:center;position:relative;margin-bottom:1rem}@media screen and (max-width:544px){#menu #brand{background:#2bab5f;cursor:pointer}#menu #brand:after{position:absolute;color:rgba(0,0,0,.2);right:1rem;content:'>';top:50%;font-size:120%;font-weight:700;transform:translateY(-50%) rotate(90deg)}}#menu.expanded #brand{background:#218248}@media screen and (max-width:544px){#menu.expanded #brand:after{transform:translateY(-50%) rotate(-90deg)}}#menu a{font-size:130%;color:white;transition:background-color .2s;text-shadow:0 0 5px rgba(0,0,0,.4)}#menu a.selected,#menu a:hover{background:#1bd886;text-shadow:0 0 5px rgba(0,0,0,.6)}#menu a.selected{position:relative;box-shadow:0 0 5px rgba(0,0,0,.5)}#menu a:before{content:"▸";padding-right:.5rem;position:relative;top:-.1rem}@media screen and (max-width:544px){#menu a{display:none}}#menu.expanded a{display:block}@media screen and (min-width:545px) and (max-width:1000px){#menu{flex-basis:10rem}#menu #brand{font-size:95%;margin-bottom:.6180469716rem}#menu a{font-size:105%}#menu>*{padding:.3819820591rem .6180469716rem}}#content{flex-grow:1;overflow-y:auto;padding:1rem}@media screen and (max-width:544px){#content{padding:.6180469716rem}}#content>*{margin-left:auto;margin-right:auto}#content h1{text-align:center;font-size:2.2806973457em;margin-top:0;margin-bottom:1rem}#content h2{font-size:1.423828125em;margin-bottom:.6180469716rem}#content td,#content th{padding:.3819820591rem}#content tbody th{text-align:right;width:130px;color:#fff}.Box{display:block;max-width:900px;margin-top:1rem;padding:.6180469716rem 1rem;border-radius:3px;background-color:rgba(255,255,255,.07)}@media screen and (max-width:544px){.Box{margin-top:.6180469716rem}}.Box h2,h1+.Box{margin-top:0}.Box.wide{width:initial;max-width:initial}.Box.medium{max-width:1200px}.Modal{position:fixed;width:100%;height:100%;left:0;top:0;right:0;bottom:0;display:flex;justify-content:center;align-items:center;transition:opacity .5s;background:rgba(0,0,0,.65);opacity:0}.Modal.visible{opacity:1}.Modal.hidden{display:none}.Dialog{margin:.6180469716rem;padding:1rem .6180469716rem;overflow:hidden;max-width:100%;max-height:100%;flex:0 1 30rem;background:#1c1c1e;border-left:6px solid #217b3a;border-right:6px solid #217b3a;box-shadow:0 0 2px 0 #434349,0 0 6px 0 black;border-radius:6px}.button,button,input[type=button],input[type=reset],input[type=submit]{text-align:center;cursor:pointer;display:inline-block;border-radius:2px;padding:0 .6em;border:0 none;outline:0 none!important;line-height:1.8em;font-size:1.1em;margin-bottom:3px;min-width:5em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-shadow:1.5px 1.5px 2px rgba(0,0,0,.8)}.button:active,button:active,input[type=button]:active,input[type=reset]:active,input[type=submit]:active{position:relative;top:2px}.button.narrow,button.narrow,input[type=button].narrow,input[type=reset].narrow,input[type=submit].narrow{min-width:initial}.btn-green,input[type=submit]{background-color:#2ca94b;box-shadow:0 3px 0 #1d7032;text-decoration:none!important}.btn-green,.btn-green:link,.btn-green:visited,input[type=submit],input[type=submit]:link,input[type=submit]:visited{color:#FEFEFE}.btn-green.active,.btn-green.selected,.btn-green:active,.btn-green:hover,input[type=submit].active,input[type=submit].selected,input[type=submit]:active,input[type=submit]:hover{background-color:#28ba5c;color:#FEFEFE}.btn-green.active,.btn-green.selected,.btn-green:hover,input[type=submit].active,input[type=submit].selected,input[type=submit]:hover{box-shadow:0 3px 0 #1a773b}.btn-green:active,input[type=submit]:active{box-shadow:0 1px 0 #1a773b}.btn-red,input[type=reset]{background-color:#D04E51;box-shadow:0 3px 0 #aa2d30;text-decoration:none!important}.btn-red,.btn-red:link,.btn-red:visited,input[type=reset],input[type=reset]:link,input[type=reset]:visited{color:#FEFEFE}.btn-red.active,.btn-red.selected,.btn-red:active,.btn-red:hover,input[type=reset].active,input[type=reset].selected,input[type=reset]:active,input[type=reset]:hover{background-color:#d4403f;color:#FEFEFE}.btn-red.active,.btn-red.selected,.btn-red:hover,input[type=reset].active,input[type=reset].selected,input[type=reset]:hover{box-shadow:0 3px 0 #9e2423}.btn-red:active,input[type=reset]:active{box-shadow:0 1px 0 #9e2423}.btn-blue{background-color:#3983cd;box-shadow:0 3px 0 #265f98;text-decoration:none!important}.btn-blue,.btn-blue:link,.btn-blue:visited{color:#FEFEFE}.btn-blue.active,.btn-blue.selected,.btn-blue:active,.btn-blue:hover{background-color:#2076C6;color:#FEFEFE}.btn-blue.active,.btn-blue.selected,.btn-blue:hover{box-shadow:0 3px 0 #154c80}.btn-blue:active{box-shadow:0 1px 0 #154c80}input[type=number],input[type=password],input[type=text],select,textarea{border:0 none;border-bottom:2px solid #217b3a;background-color:#303030;color:#fff;padding:6px;line-height:1em;outline:0 none!important;-moz-outline:0 none!important;font-weight:400}input[type=number]:focus,input[type=number]:hover,input[type=password]:focus,input[type=password]:hover,input[type=text]:focus,input[type=text]:hover,select:focus,select:hover,textarea:focus,textarea:hover{border-bottom-color:#28bc65}input[type=number],input[type=password],input[type=text],textarea{-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;cursor:text}textarea{font-family:monospace;line-height:1.2em;display:block}form{border:0 none;margin:0;padding:0;text-decoration:none}input[type=number],input[type=password],input[type=text],label.select-wrap,select,textarea{width:250px}form .Row{vertical-align:middle;margin:14px auto;text-align:left;display:flex;flex-direction:row}form .Row:first-child{margin-top:0}form .Row:last-child{margin-bottom:0}form .Row .spacer{width:130px}@media screen and (max-width:544px){form .Row .spacer{display:none}}form .Row.buttons .button,form .Row.buttons input{margin-right:.6180469716rem}form .Row.centered{justify-content:center}form .Row.message{font-size:1em;text-shadow:1px 1px 3px black;text-align:center}form .Row.message.error{color:crimson}form .Row.message.ok{color:#0fe851}form .Row.separator{padding-top:14px;border-top:2px solid rgba(255,255,255,.1)}form .Row textarea{display:inline-block;vertical-align:top;min-height:10rem;flex-grow:1;resize:vertical}form .Row label{font-weight:700;color:#fff;text-shadow:1px 1px 3px black;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}form .Row .checkbox-wrap,form .Row label{display:inline-block;width:130px;text-align:right;padding:8px;align-self:flex-start}form .Row .checkbox-wrap input[type=checkbox]{margin:auto;width:auto;height:auto}form .Row .checkbox-wrap+label{width:250px;padding-left:0;text-align:left;cursor:pointer}@media screen and (max-width:544px){form .Row{flex-direction:column}form .Row.buttons,form .Row.centered{flex-direction:row}form .Row.buttons{justify-content:center}form .Row.buttons :last-child{margin-right:0}form .Row label{padding-left:0;text-align:left;width:auto}form .Row .checkbox-wrap{order:1;text-align:left;padding-bottom:0;border-radius:.4px;width:auto}form .Row .checkbox-wrap+label{width:auto}form .Row input[type=number],form .Row input[type=password],form .Row input[type=text],form .Row textarea{width:100%}}form span.required{color:red}.RadioGroup{display:inline-block;line-height:1.5em;vertical-align:middle}.RadioGroup label{width:auto;text-align:left;cursor:pointer;font-weight:400}.RadioGroup input[type=radio]{vertical-align:middle;margin:0 0 0 5px}@media screen and (-webkit-min-device-pixel-ratio:0){select{padding-right:18px}}select{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;line-height:1.4em;padding:3.5px;padding-right:1em}select:-moz-focusring{color:transparent;text-shadow:0 0 0 #fff}select option{background:#303030}label.select-wrap{position:relative;display:inline!important;margin:0!important;padding:0!important;width:auto!important}label.select-wrap:after{content:'<>';font-family:Consolas,monospace;font-weight:700;color:#28bc65;top:50%;transform:translateY(-50%) rotate(90deg);right:2px;position:absolute;z-index:100;pointer-events:none}#ap-list{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:0;-moz-column-gap:0;column-gap:0;margin:0 -.2360828548rem}@media screen and (min-width:545px) and (max-width:1000px){#ap-list{-webkit-column-count:2;-moz-column-count:2;column-count:2}}@media screen and (max-width:544px){#ap-list{-webkit-column-count:1;-moz-column-count:1;column-count:1}}#ap-loader{background:rgba(255,255,255,.1);border-radius:5px;padding:.3819820591rem;margin-bottom:.3819820591rem}#ap-box{padding-bottom:.3819820591rem}#psk-modal form{display:flex;align-items:center;margin:.3819820591rem}#psk-modal form>*{margin-left:.3819820591rem;margin-right:.3819820591rem}#psk-modal form>:first-child{margin-left:0}#psk-modal form>:last-child{margin-right:0}#psk-modal form input[type=password]{min-width:5rem}.AP{-webkit-column-break-inside:avoid;page-break-inside:avoid;break-inside:avoid-column;max-width:500px;padding:.2360828548rem}.AP.selected .inner{background:#43de81!important;cursor:default;top:0!important}.AP .inner{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;border-radius:3px;color:#222;background:#afafaf;transition:background-color .5s;display:flex}.AP .inner:active{left:0;top:1px}.AP .inner:hover{background:white}.AP .inner>*{padding:.6180469716rem;white-space:nowrap;word-wrap:normal}.AP .inner .rssi{min-width:2rem;flex:0 0 15%;text-align:right}.AP .inner .rssi:after{padding-left:.090179415rem;content:'%';font-size:.8888888889em}.AP .inner .essid{flex:1 1 70%;min-width:0;text-overflow:ellipsis;overflow:hidden;font-weight:700}.AP .inner .auth{flex:0 0 15%}.page-home #staRSSIperc:after{padding-left:.1459102934rem;content:'%';font-size:.8888888889em}.page-home #staRSSI:after{padding-left:.1459102934rem;content:'dBm';font-size:.8888888889em}#samp-ctrl{display:flex;padding:.3819820591rem;flex-direction:row;justify-content:center;align-items:stretch}@media screen and (max-width:544px){#samp-ctrl{flex-direction:column}}#samp-ctrl>div{margin:.3819820591rem .6180469716rem}#samp-ctrl label{line-height:1.8;font-weight:700}#samp-ctrl input,#samp-ctrl select{width:6em}@media screen and (max-width:544px){#samp-ctrl input,#samp-ctrl select{width:100%}}.Box.chartbox{display:flex;flex-direction:row}@media screen and (max-width:544px){.Box.chartbox{flex-direction:column}}.Box.chartbox .stats{flex:0 1;position:relative}@media screen and (max-width:544px){.Box.chartbox .stats table{margin:0 auto}.Box.chartbox .stats td,.Box.chartbox .stats th{width:50%}}.Box.chartbox .stats td,.Box.chartbox .stats th{white-space:nowrap;word-wrap:normal}.Box.chartbox .stats th sub{font-weight:400}.Box.chartbox .stats td{min-width:100px}.Box.chartbox .stats td:after{font-size:90%;padding-left:.5em}.Box.chartbox .stats #stat-f-s:after{content:"Hz"}.Box.chartbox .stats #stat-i-peak:after,.Box.chartbox .stats #stat-i-rms:after{content:"mA"}.Box.chartbox .stats .ar{position:absolute;bottom:.3819820591rem;width:100%;text-align:center}.Box.chartbox .stats .ar input[type=number]{width:4em}.Box.chartbox .stats .ar input[type=button]{margin-left:.3819820591rem}.page-about .Box{padding-left:1rem;padding-right:1rem}.page-about .Box a{font-weight:700}.page-about #logo{float:right;height:130px}.page-about #logo2{max-width:150px}@media screen and (min-width:545px){.mq-phone{display:none}}@media screen and (max-width:544px){.mq-tablet-min{display:none}}@media screen and (min-width:1001px){.mq-tablet-max{display:none}}@media screen and (max-width:1000px){.mq-normal-min{display:none}} \ No newline at end of file diff --git a/html/img/cvut.svg b/html/img/cvut.svg new file mode 100644 index 0000000..dc015d3 --- /dev/null +++ b/html/img/cvut.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/html/js/all.js b/html/js/all.js index 6e3b813..218c058 100644 --- a/html/js/all.js +++ b/html/js/all.js @@ -1,2 +1,3 @@ -function bool(t){return 1===t||"1"===t||t===!0||"true"===t}function e(t){return String(t).replace(/&/g,"&").replace(/"/g,""").replace(/'/g,"'").replace(//g,">")}function isArray(t){return"[object Array]"===Object.prototype.toString.call(t)}function isObject(t){return"[object Object]"===Object.prototype.toString.call(t)}function regexEscape(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}!function(){"use strict";function t(){var t;for(f=!0,t=0;t=0;n-=1)t(e[n])}function i(t){return t.replace(/-\w/g,function(t){return t.charAt(1).toUpperCase()})}function s(t,e){return t.currentStyle?t.currentStyle[i(e)]:x.getComputedStyle?x.getComputedStyle(t,null).getPropertyValue(e):null}function r(t,e){return encodeURIComponent(t).replace(/%20/g,"+")+"="+encodeURIComponent(e).replace(/%20/g,"+")}function a(t,e,n){try{t.style[i(e)]=n}catch(s){}}function o(t){t.style.display="","none"===s(t,"display")&&(t.style.display="block")}function c(t){var e,i,s,a="";if(t.constructor===Object){for(e in t)if(t.hasOwnProperty(e))if(t[e].constructor===Array)for(i=0;i0&&(a+="&"+r(e.name,e.value));break;case"select-multiple":for(s=0;s0?a.substring(1):""}function u(t,e,i){var s,r,a,o=!1;return t&&(s=t.split(/\s+/),n(function(t){for(a=0;a0?w[0].className.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"").replace(/\s+/," "):void 0},e.setClass=function(t){return(t||""===t)&&n(function(e){e.className=t},w),e},e.addClass=function(t){return t&&n(function(e){e.className+=" "+t},w),e},e.removeClass=function(t){return u(t,"remove",w),e},e.toggleClass=function(t){return u(t,"toggle",w),e},e.hasClass=function(t){return u(t,"has",w)},e.html=function(t){return t||""===t?(n(function(e){e.innerHTML=t},w),e):w[0]?w[0].innerHTML:void 0},e.htmlBefore=function(t){return l(t,"before",w),e},e.htmlAfter=function(t){return l(t,"after",w),e},e.htmlAppend=function(t){return l(t,"append",w),e},e.htmlPrepend=function(t){return l(t,"prepend",w),e},e.attr=function(t,i){if(t){if(t=t.toLowerCase(),"undefined"!=typeof i)return n(function(e){"style"===t?e.style.cssText=i:"class"===t?e.className=i:e.setAttribute(t,i)},w),e;if(w[0])if("style"===t){if(w[0].style.cssText)return w[0].style.cssText}else if("class"===t){if(w[0].className)return w[0].className}else if(w[0].getAttribute(t))return w[0].getAttribute(t)}},e.data=function(t,n){return t?e.attr("data-"+t,n):void 0},e.val=function(t){var i,s,r;if(t||""===t)return n(function(e){switch(e.nodeName){case"SELECT":for("string"!=typeof t&&"number"!=typeof t||(t=[t]),s=0;s1?i:i[0];case"INPUT":case"TEXTAREA":case"BUTTON":return w[0].value}},e.checked=function(t){return"boolean"==typeof t?(n(function(e){"INPUT"!==e.nodeName||"checkbox"!==e.type&&"radio"!==e.type||(e.checked=t)},w),e):!w[0]||"INPUT"!==w[0].nodeName||"checkbox"!==w[0].type&&"radio"!==w[0].type?void 0:!!w[0].checked},e.on=function(i,s){return t!==x&&t!==v||(w=[t]),n(function(t){v.addEventListener?t.addEventListener(i,s,!1):v.attachEvent&&(t[i+s]=function(){return s.apply(t,arguments)},t.attachEvent("on"+i,t[i+s]))},w),e},e.off=function(i,s){return t!==x&&t!==v||(w=[t]),n(function(t){v.addEventListener?t.removeEventListener(i,s,!1):v.attachEvent&&(t.detachEvent("on"+i,t[i+s]),t[i+s]=null)},w),e},e.ajax=function(t,n,i,s,r){var a,o,u=c(w),l=n?n.toUpperCase():"GET",h=new RegExp("http[s]?://(.*?)/","gi"),d=h.exec(t),p="_ts="+ +new Date,f=v.getElementsByTagName("head")[0],m="chibi"+ +new Date+(g+=1);return!u||"GET"!==l&&"DELETE"!==l||(t+=-1===t.indexOf("?")?"?"+u:"&"+u,u=null),"GET"===l&&!r&&d&&x.location.host!==d[1]?(s&&(t+=-1===t.indexOf("?")?"?"+p:"&"+p),t=t.replace("=%3F","=?"),i&&-1!==t.indexOf("=?")&&(t=t.replace("=?","="+m),x[m]=function(t){try{i(t,200)}catch(e){}x[m]=void 0}),o=document.createElement("script"),o.async=!0,o.src=t,o.onload=function(){f.removeChild(o)},f.appendChild(o)):(x.XMLHttpRequest?a=new XMLHttpRequest:x.ActiveXObject&&(a=new ActiveXObject("Microsoft.XMLHTTP")),a&&(s&&(t+=-1===t.indexOf("?")?"?"+p:"&"+p),a.open(l,t,!0),a.onreadystatechange=function(){4===a.readyState&&i&&i(a.responseText,a.status)},a.setRequestHeader("X-Requested-With","XMLHttpRequest"),"POST"!==l&&"PUT"!==l||a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.send(u))),e},e.get=function(t,n,i,s){return e.ajax(t,"get",n,i,s)},e.post=function(t,n,i){return e.ajax(t,"post",n,i)},e}var d=[],p=[],f=!1,m=!1,g=0,v=document,x=window;v.addEventListener?(v.addEventListener("DOMContentLoaded",t,!1),x.addEventListener("load",e,!1)):v.attachEvent?(v.attachEvent("onreadystatechange",t),x.attachEvent("onload",e)):x.onload=e,x.$=h}(),function(t,e){t.Chartist=e()}(this,function(){var t={version:"0.9.7"};return function(t,e,n){"use strict";n.namespaces={svg:"http://www.w3.org/2000/svg",xmlns:"http://www.w3.org/2000/xmlns/",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",ct:"http://gionkunz.github.com/chartist-js/ct"},n.noop=function(t){return t},n.alphaNumerate=function(t){return String.fromCharCode(97+t%26)},n.extend=function(t){t=t||{};var e=Array.prototype.slice.call(arguments,1);return e.forEach(function(e){for(var i in e)"object"!=typeof e[i]||null===e[i]||e[i]instanceof Array?t[i]=e[i]:t[i]=n.extend({},t[i],e[i])}),t},n.replaceAll=function(t,e,n){return t.replace(new RegExp(e,"g"),n)},n.ensureUnit=function(t,e){return"number"==typeof t&&(t+=e),t},n.quantity=function(t){if("string"==typeof t){var e=/^(\d+)\s*(.*)$/g.exec(t);return{value:+e[1],unit:e[2]||void 0}}return{value:t}},n.querySelector=function(t){return t instanceof Node?t:e.querySelector(t)},n.times=function(t){return Array.apply(null,new Array(t))},n.sum=function(t,e){return t+(e?e:0)},n.mapMultiply=function(t){return function(e){return e*t}},n.mapAdd=function(t){return function(e){return e+t}},n.serialMap=function(t,e){var i=[],s=Math.max.apply(null,t.map(function(t){return t.length}));return n.times(s).forEach(function(n,s){var r=t.map(function(t){return t[s]});i[s]=e.apply(null,r)}),i},n.roundWithPrecision=function(t,e){var i=Math.pow(10,e||n.precision);return Math.round(t*i)/i},n.precision=8,n.escapingMap={"&":"&","<":"<",">":">",'"':""","'":"'"},n.serialize=function(t){return null===t||void 0===t?t:("number"==typeof t?t=""+t:"object"==typeof t&&(t=JSON.stringify({data:t})),Object.keys(n.escapingMap).reduce(function(t,e){return n.replaceAll(t,e,n.escapingMap[e])},t))},n.deserialize=function(t){if("string"!=typeof t)return t;t=Object.keys(n.escapingMap).reduce(function(t,e){return n.replaceAll(t,n.escapingMap[e],e)},t);try{t=JSON.parse(t),t=void 0!==t.data?t.data:t}catch(e){}return t},n.createSvg=function(t,e,i,s){var r;return e=e||"100%",i=i||"100%",Array.prototype.slice.call(t.querySelectorAll("svg")).filter(function(t){return t.getAttributeNS(n.namespaces.xmlns,"ct")}).forEach(function(e){t.removeChild(e)}),r=new n.Svg("svg").attr({width:e,height:i}).addClass(s).attr({style:"width: "+e+"; height: "+i+";"}),t.appendChild(r._node),r},n.normalizeData=function(t){if(t=t||{series:[],labels:[]},t.series=t.series||[],t.labels=t.labels||[],t.series.length>0&&0===t.labels.length){var e,i=n.getDataArray(t);e=i.every(function(t){return t instanceof Array})?Math.max.apply(null,i.map(function(t){return t.length})):i.length,t.labels=n.times(e).map(function(){return""})}return t},n.reverseData=function(t){t.labels.reverse(),t.series.reverse();for(var e=0;er.high&&(r.high=n),o&&n0?r.low=0:(r.high=1,r.low=0)),r},n.isNum=function(t){return!isNaN(t)&&isFinite(t)},n.isFalseyButZero=function(t){return!t&&0!==t},n.getNumberOrUndefined=function(t){return isNaN(+t)?void 0:+t},n.getMultiValue=function(t,e){return n.isNum(t)?+t:t?t[e||"y"]||0:0},n.rho=function(t){function e(t,n){return t%n===0?n:e(n,t%n)}function n(t){return t*t+1}if(1===t)return t;var i,s=2,r=2;if(t%2===0)return 2;do s=n(s)%t,r=n(n(r))%t,i=e(Math.abs(s-r),t);while(1===i);return i},n.getBounds=function(t,e,i,s){var r,a,o,c=0,u={high:e.high,low:e.low};u.valueRange=u.high-u.low,u.oom=n.orderOfMagnitude(u.valueRange),u.step=Math.pow(10,u.oom),u.min=Math.floor(u.low/u.step)*u.step,u.max=Math.ceil(u.high/u.step)*u.step,u.range=u.max-u.min,u.numberOfSteps=Math.round(u.range/u.step);var l=n.projectLength(t,u.step,u),h=i>l,d=s?n.rho(u.range):0;if(s&&n.projectLength(t,1,u)>=i)u.step=1;else if(s&&d=i)u.step=d;else for(;;){if(h&&n.projectLength(t,u.step,u)<=i)u.step*=2;else{if(h||!(n.projectLength(t,u.step/2,u)>=i))break;if(u.step/=2,s&&u.step%1!==0){u.step*=2;break}}if(c++>1e3)throw new Error("Exceeded maximum number of iterations while optimizing scale step!")}for(a=u.min,o=u.max;a+u.step<=u.low;)a+=u.step;for(;o-u.step>=u.high;)o-=u.step;for(u.min=a,u.max=o,u.range=u.max-u.min,u.values=[],r=u.min;r<=u.max;r+=u.step)u.values.push(n.roundWithPrecision(r));return u},n.polarToCartesian=function(t,e,n,i){var s=(i-90)*Math.PI/180;return{x:t+n*Math.cos(s),y:e+n*Math.sin(s)}},n.createChartRect=function(t,e,i){var s=!(!e.axisX&&!e.axisY),r=s?e.axisY.offset:0,a=s?e.axisX.offset:0,o=t.width()||n.quantity(e.width).value||0,c=t.height()||n.quantity(e.height).value||0,u=n.normalizePadding(e.chartPadding,i);o=Math.max(o,r+u.left+u.right),c=Math.max(c,a+u.top+u.bottom);var l={padding:u,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return s?("start"===e.axisX.position?(l.y2=u.top+a,l.y1=Math.max(c-u.bottom,l.y2+1)):(l.y2=u.top,l.y1=Math.max(c-u.bottom-a,l.y2+1)),"start"===e.axisY.position?(l.x1=u.left+r,l.x2=Math.max(o-u.right,l.x1+1)):(l.x1=u.left,l.x2=Math.max(o-u.right-r,l.x1+1))):(l.x1=u.left,l.x2=Math.max(o-u.right,l.x1+1),l.y2=u.top,l.y1=Math.max(c-u.bottom,l.y2+1)),l},n.createGrid=function(t,e,i,s,r,a,o,c){var u={};u[i.units.pos+"1"]=Math.round(t)+.5,u[i.units.pos+"2"]=Math.round(t)+.5,u[i.counterUnits.pos+"1"]=s,u[i.counterUnits.pos+"2"]=s+r;var l=a.elem("line",u,o.join(" "));c.emit("draw",n.extend({type:"grid",axis:i,index:e,group:a,element:l},u))},n.createLabel=function(t,e,i,s,r,a,o,c,u,l,h){var d,p={};p[r.units.pos]=t+o[r.units.pos],p[r.counterUnits.pos]=o[r.counterUnits.pos],p[r.units.len]=e,p[r.counterUnits.len]=a-10;var f=s[i];if(f=Math.round(100*+f)/100,l){var m=''+f+"";d=c.foreignObject(m,n.extend({style:"overflow: visible;"},p))}else d=c.elem("text",p,u.join(" ")).text(f);h.emit("draw",n.extend({type:"label",axis:r,index:i,group:c,element:d,text:f},p))},n.getSeriesOption=function(t,e,n){if(t.name&&e.series&&e.series[t.name]){var i=e.series[t.name];return i.hasOwnProperty(n)?i[n]:e[n]}return e[n]},n.optionsProvider=function(e,i,s){function r(e){var r=o;if(o=n.extend({},u),i)for(c=0;c=2&&e[r]<=e[r-2]?s=!0:(s&&(i.push({pathCoordinates:[],valueData:[]}),s=!1),i[i.length-1].pathCoordinates.push(e[r],e[r+1]),i[i.length-1].valueData.push(n[r/2]));return i}var i={fillHoles:!1};return t=n.extend({},i,t),function s(t,i){var r=e(t,i);if(r.length){if(r.length>1){var a=[];return r.forEach(function(t){a.push(s(t.pathCoordinates,t.valueData))}),n.Svg.Path.join(a)}if(t=r[0].pathCoordinates,i=r[0].valueData,t.length<=4)return n.Interpolation.none()(t,i);var o,c,u=[],l=[],h=t.length/2,d=[],p=[],f=[],m=[];for(o=0;h>o;o++)u[o]=t[2*o],l[o]=t[2*o+1];for(o=0;h-1>o;o++)f[o]=l[o+1]-l[o],m[o]=u[o+1]-u[o],p[o]=f[o]/m[o];for(d[0]=p[0],d[h-1]=p[h-2],o=1;h-1>o;o++)0===p[o]||0===p[o-1]||p[o-1]>0!=p[o]>0?d[o]=0:(d[o]=3*(m[o-1]+m[o])/((2*m[o]+m[o-1])/p[o-1]+(m[o]+2*m[o-1])/p[o]),isFinite(d[o])||(d[o]=0));for(c=(new n.Svg.Path).move(u[0],l[0],!1,i[0]),o=0;h-1>o;o++)c.curve(u[o]+m[o]/3,l[o]+d[o]*m[o]/3,u[o+1]-m[o]/3,l[o+1]-d[o+1]*m[o]/3,u[o+1],l[o+1],!1,i[o+1]);return c}return n.Interpolation.none()([])}},n.Interpolation.step=function(t){var e={postpone:!0,fillHoles:!1};return t=n.extend({},e,t),function(e,i){for(var s,r,a,o=new n.Svg.Path,c=0;c1}).map(function(t){var e=t.pathElements[0],n=t.pathElements[t.pathElements.length-1];return t.clone(!0).position(0).remove(1).move(e.x,v).line(e.x,e.y).position(t.pathElements.length+1).line(n.x,v)}).forEach(function(n){var o=c.elem("path",{d:n.stringify()},t.classNames.area,!0);this.eventEmitter.emit("draw",{type:"area",values:e.normalized[a],path:n.clone(),series:r,seriesIndex:a,axisX:i,axisY:s,chartRect:u,index:a,group:c,element:o})}.bind(this))}}.bind(this)),this.eventEmitter.emit("created",{bounds:s.bounds,chartRect:u,axisX:i,axisY:s,svg:this.svg,options:t})}function s(t,e,i,s){n.Line["super"].constructor.call(this,t,e,r,n.extend({},r,i),s)}var r={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:n.noop,type:void 0},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:n.noop,type:void 0,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,showLine:!0,showPoint:!0,showArea:!1,areaBase:0,lineSmooth:!0,low:void 0,high:void 0,chartPadding:{top:15,right:15,bottom:5,left:10},fullWidth:!1,reverseData:!1,classNames:{chart:"ct-chart-line",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",line:"ct-line",point:"ct-point",area:"ct-area",grid:"ct-grid",gridGroup:"ct-grids",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}};n.Line=n.Base.extend({constructor:s,createChart:i})}(window,document,t),function(t,e,n){"use strict";function i(t){this.data=n.normalizeData(this.data);var e,i={raw:this.data,normalized:t.distributeSeries?n.getDataArray(this.data,t.reverseData,t.horizontalBars?"x":"y").map(function(t){return[t]}):n.getDataArray(this.data,t.reverseData,t.horizontalBars?"x":"y")};this.svg=n.createSvg(this.container,t.width,t.height,t.classNames.chart+(t.horizontalBars?" "+t.classNames.horizontalBars:""));var s=this.svg.elem("g").addClass(t.classNames.gridGroup),a=this.svg.elem("g"),o=this.svg.elem("g").addClass(t.classNames.labelGroup);if(t.stackBars&&0!==i.normalized.length){var c=n.serialMap(i.normalized,function(){return Array.prototype.slice.call(arguments).map(function(t){return t}).reduce(function(t,e){return{x:t.x+(e&&e.x)||0,y:t.y+(e&&e.y)||0}},{x:0,y:0})});e=n.getHighLow([c],n.extend({},t,{referenceValue:0}),t.horizontalBars?"x":"y")}else e=n.getHighLow(i.normalized,n.extend({},t,{referenceValue:0}),t.horizontalBars?"x":"y");e.high=+t.high||(0===t.high?0:e.high),e.low=+t.low||(0===t.low?0:e.low);var u,l,h,d,p,f=n.createChartRect(this.svg,t,r.padding);l=t.distributeSeries&&t.stackBars?i.raw.labels.slice(0,1):i.raw.labels,t.horizontalBars?(u=d=void 0===t.axisX.type?new n.AutoScaleAxis(n.Axis.units.x,i,f,n.extend({},t.axisX,{highLow:e,referenceValue:0})):t.axisX.type.call(n,n.Axis.units.x,i,f,n.extend({},t.axisX,{highLow:e,referenceValue:0})),h=p=void 0===t.axisY.type?new n.StepAxis(n.Axis.units.y,i,f,{ticks:l}):t.axisY.type.call(n,n.Axis.units.y,i,f,t.axisY)):(h=d=void 0===t.axisX.type?new n.StepAxis(n.Axis.units.x,i,f,{ticks:l}):t.axisX.type.call(n,n.Axis.units.x,i,f,t.axisX),u=p=void 0===t.axisY.type?new n.AutoScaleAxis(n.Axis.units.y,i,f,n.extend({},t.axisY,{highLow:e,referenceValue:0})):t.axisY.type.call(n,n.Axis.units.y,i,f,n.extend({},t.axisY,{highLow:e,referenceValue:0})));var m=t.horizontalBars?f.x1+u.projectValue(0):f.y1-u.projectValue(0),g=[];h.createGridAndLabels(s,o,this.supportsForeignObject,t,this.eventEmitter),u.createGridAndLabels(s,o,this.supportsForeignObject,t,this.eventEmitter),i.raw.series.forEach(function(e,s){var r,o,c=s-(i.raw.series.length-1)/2;r=t.distributeSeries&&!t.stackBars?h.axisLength/i.normalized.length/2:t.distributeSeries&&t.stackBars?h.axisLength/2:h.axisLength/i.normalized[s].length/2,o=a.elem("g"),o.attr({"ct:series-name":e.name,"ct:meta":n.serialize(e.meta)}),o.addClass([t.classNames.series,e.className||t.classNames.series+"-"+n.alphaNumerate(s)].join(" ")),i.normalized[s].forEach(function(a,l){var v,x,y,w;if(w=t.distributeSeries&&!t.stackBars?s:t.distributeSeries&&t.stackBars?0:l,v=t.horizontalBars?{x:f.x1+u.projectValue(a&&a.x?a.x:0,l,i.normalized[s]),y:f.y1-h.projectValue(a&&a.y?a.y:0,w,i.normalized[s])}:{x:f.x1+h.projectValue(a&&a.x?a.x:0,w,i.normalized[s]),y:f.y1-u.projectValue(a&&a.y?a.y:0,l,i.normalized[s])},h instanceof n.StepAxis&&(h.options.stretch||(v[h.units.pos]+=r*(t.horizontalBars?-1:1)),v[h.units.pos]+=t.stackBars||t.distributeSeries?0:c*t.seriesBarDistance*(t.horizontalBars?-1:1)),y=g[l]||m,g[l]=y-(m-v[h.counterUnits.pos]),void 0!==a){var b={};b[h.units.pos+"1"]=v[h.units.pos],b[h.units.pos+"2"]=v[h.units.pos],!t.stackBars||"accumulate"!==t.stackMode&&t.stackMode?(b[h.counterUnits.pos+"1"]=m,b[h.counterUnits.pos+"2"]=v[h.counterUnits.pos]):(b[h.counterUnits.pos+"1"]=y,b[h.counterUnits.pos+"2"]=g[l]),b.x1=Math.min(Math.max(b.x1,f.x1),f.x2),b.x2=Math.min(Math.max(b.x2,f.x1),f.x2),b.y1=Math.min(Math.max(b.y1,f.y2),f.y1),b.y2=Math.min(Math.max(b.y2,f.y2),f.y1),x=o.elem("line",b,t.classNames.bar).attr({"ct:value":[a.x,a.y].filter(n.isNum).join(","),"ct:meta":n.getMetaData(e,l)}),this.eventEmitter.emit("draw",n.extend({type:"bar",value:a,index:l,meta:n.getMetaData(e,l),series:e,seriesIndex:s,axisX:d,axisY:p,chartRect:f,group:o,element:x},b))}}.bind(this))}.bind(this)),this.eventEmitter.emit("created",{bounds:u.bounds,chartRect:f,axisX:d,axisY:p,svg:this.svg,options:t})}function s(t,e,i,s){n.Bar["super"].constructor.call(this,t,e,r,n.extend({},r,i),s)}var r={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:n.noop,scaleMinSpace:30,onlyInteger:!1},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:n.noop,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,high:void 0,low:void 0,chartPadding:{top:15,right:15,bottom:5,left:10},seriesBarDistance:15,stackBars:!1,stackMode:"accumulate",horizontalBars:!1,distributeSeries:!1,reverseData:!1,classNames:{chart:"ct-chart-bar",horizontalBars:"ct-horizontal-bars",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",bar:"ct-bar",grid:"ct-grid",gridGroup:"ct-grids",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}};n.Bar=n.Base.extend({constructor:s,createChart:i})}(window,document,t),t}),function(t,e){t["Chartist.plugins.ctAxisTitle"]=e()}(this,function(){return function(t,e,n){"use strict";var i={axisTitle:"",axisClass:"ct-axis-title",offset:{x:0,y:0},textAnchor:"middle",flipText:!1},s={axisX:i,axisY:i};n.plugins=n.plugins||{},n.plugins.ctAxisTitle=function(t){return t=n.extend({},s,t),console.log(t),function(e){e.on("created",function(e){var i,s,r;if(t.axisX.axisTitle&&e.axisX&&(i=e.axisX.axisLength/2+e.options.axisY.offset+e.options.chartPadding.left,s=e.options.chartPadding.top,"end"===e.options.axisY.position&&(i-=e.options.axisY.offset),"end"===e.options.axisX.position&&(s+=e.axisY.axisLength),r=new n.Svg("text"),r.addClass(t.axisX.axisClass),r.text(t.axisX.axisTitle),r.attr({x:i+t.axisX.offset.x,y:s+t.axisX.offset.y,"text-anchor":t.axisX.textAnchor}),e.svg.append(r,!0)),t.axisY.axisTitle&&e.axisY){i=0,s=e.axisY.axisLength/2+e.options.chartPadding.top,"start"===e.options.axisX.position&&(s+=e.options.axisX.offset),"end"===e.options.axisY.position&&(i=e.axisX.axisLength);var a="rotate("+(t.axisY.flipText?-90:90)+", "+i+", "+s+")";r=new n.Svg("text"),r.addClass(t.axisY.axisClass),r.text(t.axisY.axisTitle),r.attr({x:i+t.axisY.offset.x,y:s+t.axisY.offset.y,transform:a,"text-anchor":t.axisY.textAnchor}),e.svg.append(r,!0)}})}}}(window,document,Chartist),Chartist.plugins.ctAxisTitle}),function(t,e){t["Chartist.plugins.zoom"]=e()}(this,function(){return function(t,e,n){"use strict";function i(t){t.attr({style:"display:none"})}function s(t){t.attr({style:"display:block"})}function r(t,e){var n=t.x,i=t.y,s=e.x-n,r=e.y-i;return 0>s&&(s=-s,n=e.x),0>r&&(r=-r,i=e.y),{x:n,y:i,width:s,height:r}}function a(t,e){return o(t.clientX,t.clientY,e)}function o(t,e,n){var i="svg"===n.tagName?n:n.ownerSVGElement,s=i.getScreenCTM(),r=i.createSVGPoint();return r.x=t,r.y=e,r=r.matrixTransform(s.inverse()),r||{x:0,y:0}}function c(t,e){var n=e.bounds.max,i=e.bounds.min;if(e.scale&&"log"===e.scale.type){var s=e.scale.base;return Math.pow(s,t*u(n/i,s)/e.axisLength)*i}return t*e.bounds.range/e.axisLength+i}function u(t,e){return Math.log(t)/Math.log(e)}var l={};n.plugins=n.plugins||{},n.plugins.zoom=function(t){return t=n.extend({},l,t),function(e){function o(t){var e=a(t,w);return e.id=t.identifier,e}function u(t){for(var e=0;e1&&(y.attr(r(O[0],O[1])),s(y))}function h(t){for(var e=t.changedTouches,n=0;n1&&(y.attr(r(O[0],O[1])),s(y),t.preventDefault())}function d(t){p(t.changedTouches)}function p(t){for(var e=0;e=0&&O.splice(n,1)}}function f(t){O.length>1&&v(r(O[0],O[1])),p(t.changedTouches),i(y)}function m(t){0===t.button&&(S=a(t,w),y.attr(r(S,S)),s(y),t.preventDefault())}function g(e){if(0===e.button){var n=r(S,a(e,w));v(n),S=null,i(y),e.preventDefault()}else t.resetOnRightMouseBtn&&2===e.button&&(M(),e.preventDefault())}function v(t){if(t.width>5&&t.height>5){var n=t.x-A.x1,i=n+t.width,s=A.y1-t.y,r=s-t.height;e.options.axisX.highLow={low:c(n,b),high:c(i,b)},e.options.axisY.highLow={low:c(r,E),high:c(s,E)},e.update(e.data,e.options),C&&C(e,M)}}function x(t){if(S){var e=a(t,w);y.attr(r(S,e)),t.preventDefault()}}if(e instanceof n.Line){var y,w,b,E,A,S,C=t.onZoom,O=[];e.on("draw",function(t){var e=t.type;"line"!==e&&"bar"!==e&&"area"!==e&&"point"!==e||t.element.attr({"clip-path":"url(#zoom-mask)"})}),e.on("created",function(t){b=t.axisX,E=t.axisY,A=t.chartRect,w=t.svg._node,y=t.svg.elem("rect",{x:10,y:10,width:100,height:100},"ct-zoom-rect"),i(y);var e=t.svg.querySelector("defs")||t.svg.elem("defs"),n=A.width(),s=A.height();e.elem("clipPath",{id:"zoom-mask"}).elem("rect",{x:A.x1,y:A.y2,width:n,height:s,fill:"white"}),w.addEventListener("mousedown",m),w.addEventListener("mouseup",g),w.addEventListener("mousemove",x),w.addEventListener("touchstart",l),w.addEventListener("touchmove",h),w.addEventListener("touchend",f),w.addEventListener("touchcancel",d)});var M=function(){e.options.axisX.highLow=null,e.options.axisY.highLow=null,e.update(e.data,e.options)}}}}}(window,document,Chartist),Chartist.plugins.zoom}),String.prototype.format=function(){var t=this,e=arguments;1==arguments.length&&(isArray(arguments[0])||isObject(arguments[0]))&&(e=arguments[0]);for(var n in e)if(e.hasOwnProperty(n)){var i=n;n.match(/^\{.*\}$/)||(n="{"+n+"}");var s=new RegExp(regexEscape(n),"g");t=t.replace(s,e[i])}return t};var modal=function(){var t={};return t.show=function(t){var e=$(t);e.removeClass("hidden visible"),setTimeout(function(){e.addClass("visible")},1)},t.hide=function(t){var e=$(t);e.removeClass("visible"),setTimeout(function(){e.addClass("hidden")},500)},t.init=function(){$(".Modal").on("click",function(){t.hide(this)}),$(".Dialog").on("click",function(t){t.stopImmediatePropagation()}),$(window).on("keydown",function(e){27==e.which&&t.hide(".Modal")})},t}();$().ready(function(){setInterval(function(){$(".anim-dots").each(function(t){var e=$(t),n=e.html()+".";5==n.length&&(n="."),e.html(n)})},1e3),modal.init()});var page_wifi=function(){function t(t,n){if(200!=n)return void i(5e3);t=JSON.parse(t);var a=!bool(t.result.inProgress)&&t.result.APs.length>0;if(i(a?15e3:1e3),a){var o=$("#ap-list");$(".AP").remove(),o.toggle(a),$("#ap-loader").toggle(!a),t.result.APs.sort(function(t,e){return e.rssi-t.rssi}).forEach(function(t){if(t.enc=parseInt(t.enc),!(t.enc>4)){var n=document.createElement("div"),i=$(n).data("ssid",t.essid).data("pwd",0!=t.enc).addClass("AP");t.essid==s.current&&i.addClass("selected");var a=document.createElement("div");$(a).addClass("inner").htmlAppend('
{0}
'.format(t.rssi_perc)).htmlAppend('
{0}
'.format(e(t.essid))).htmlAppend('
{0}
'.format(r[t.enc]));i.on("click",function(){var t=$(this);$("#conn-essid").val(t.data("ssid")),$("#conn-passwd").val(""),t.data("pwd")?modal.show("#psk-modal"):$("#conn-form").submit()}),n.appendChild(a),o[0].appendChild(n)}})}}function n(){$().get("/wifi/scan.cgi",t,!0,!0)}function i(t){setTimeout(n,t)}var s={},r=["Open","WEP","WPA","WPA2","WPA/WPA2"];return s.init=function(){n()},s}(),page_waveform=function(){function t(t,e,i){var s=[];t.samples.forEach(function(t,e){s.push({x:e,y:t})});var r=[],a=window.matchMedia("screen and (min-width: 544px)"),o=!a.matches;o||r.push(Chartist.plugins.ctAxisTitle({axisX:{axisTitle:e,offset:{x:0,y:55}},axisY:{axisTitle:i,flipText:!0,offset:{x:0,y:15}}})),r.push(Chartist.plugins.zoom({resetOnRightMouseBtn:!0,onZoom:function(t,e){n=e}}));var c=t.stats.peak;new Chartist.Line("#chart",{series:[{name:"a",data:s}]},{showPoint:!1,fullWidth:!0,chartPadding:o?{right:20,bottom:5,left:0}:{right:25,bottom:30,left:25},series:{a:{lineSmooth:Chartist.Interpolation.monotoneCubic()}},axisX:{type:Chartist.AutoScaleAxis,onlyInteger:!0},axisY:{type:Chartist.AutoScaleAxis,high:c,low:-c},plugins:r})}function e(e,n){if(200!=n)return void alert("Request failed.");var i=JSON.parse(e);return i.success?(i.stats.peak=Math.max(-i.stats.min,i.stats.max),t(i,"Sample number","Current - mA"),$("#stat-count").html(i.stats.count),$("#stat-f-s").html(i.stats.freq),$("#stat-i-peak").html(i.stats.peak),$("#stat-i-rms").html(i.stats.rms),void $(".stats").removeClass("invis")):void alert("Sampling failed.")}var n,i={};return i.init=function(){function t(){var t=$("#count").val(),n=$("#freq").val();$().get("/api/raw.json?n="+t+"&fs="+n,e,!0,!0)}$("#load").on("click",t),$("#count,#freq").on("keyup",function(e){13==e.which&&t()}),$("#chart").on("contextmenu",function(t){return n&&n(),n=null,t.preventDefault(),!1})},i}(),page_status=function(){function t(t,n){if(200!=n)console.error("Update failed.");else try{var i=JSON.parse(t);$(".sta-only").toggle(i.sta),$(".ap-only").toggle(i.ap),$("#uptime").html(i.uptime),$("#heap").html(i.heap+" bytes"),$("#wmode").html(i.wifiMode),i.sta&&($("#staSSID").html(i.sta.SSID),$("#staRSSIperc").html(i.sta.RSSIperc),$("#staRSSI").html(i.sta.RSSI),$("#staMAC").html(i.sta.MAC)),i.ap&&($("#apSSID").html(i.ap.SSID),$("#apHidden").html(i.ap.hidden?"Yes":"No"),$("#apAuth").html(i.ap.auth),$(".ap-auth-only").toggle("Open"!=i.ap.auth),$("#apPwd").html(i.ap.pwd),$("#apChan").html(i.ap.chan),$("#apMAC").html(i.ap.MAC))}catch(s){console.error(s)}setTimeout(e,1e4)}function e(){$().get("/api/status.json",t,!0,!0)}var n={};return n.init=function(){e(),setTimeout(e,1e4)},n}(); \ No newline at end of file +function bool(t){return 1===t||"1"===t||t===!0||"true"===t}!function(){"use strict";function t(){var t;for(p=!0,t=0;t=0;n-=1)t(e[n])}function r(t){return t.replace(/-\w/g,function(t){return t.charAt(1).toUpperCase()})}function i(t,e){return t.currentStyle?t.currentStyle[r(e)]:x.getComputedStyle?x.getComputedStyle(t,null).getPropertyValue(e):null}function a(t,e){return encodeURIComponent(t).replace(/%20/g,"+")+"="+encodeURIComponent(e).replace(/%20/g,"+")}function s(t,e,n){try{t.style[r(e)]=n}catch(i){}}function o(t){t.style.display="","none"===i(t,"display")&&(t.style.display="block")}function u(t){var e,r,i,s="";if(t.constructor===Object){for(e in t)if(t.hasOwnProperty(e))if(t[e].constructor===Array)for(r=0;r0&&(s+="&"+a(e.name,e.value));break;case"select-multiple":for(i=0;i0?s.substring(1):""}function c(t,e,r){var i,a,s,o=!1;return t&&(i=t.split(/\s+/),n(function(t){for(s=0;s0?b[0].className.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"").replace(/\s+/," "):void 0},e.setClass=function(t){return(t||""===t)&&n(function(e){e.className=t},b),e},e.addClass=function(t){return t&&n(function(e){e.className+=" "+t},b),e},e.removeClass=function(t){return c(t,"remove",b),e},e.toggleClass=function(t){return c(t,"toggle",b),e},e.hasClass=function(t){return c(t,"has",b)},e.html=function(t){return t||""===t?(n(function(e){e.innerHTML=t},b),e):b[0]?b[0].innerHTML:void 0},e.htmlBefore=function(t){return l(t,"before",b),e},e.htmlAfter=function(t){return l(t,"after",b),e},e.htmlAppend=function(t){return l(t,"append",b),e},e.htmlPrepend=function(t){return l(t,"prepend",b),e},e.attr=function(t,r){if(t){if(t=t.toLowerCase(),"undefined"!=typeof r)return n(function(e){"style"===t?e.style.cssText=r:"class"===t?e.className=r:e.setAttribute(t,r)},b),e;if(b[0])if("style"===t){if(b[0].style.cssText)return b[0].style.cssText}else if("class"===t){if(b[0].className)return b[0].className}else if(b[0].getAttribute(t))return b[0].getAttribute(t)}},e.data=function(t,n){return t?e.attr("data-"+t,n):void 0},e.val=function(t){var r,i,a;if(t||""===t)return n(function(e){switch(e.nodeName){case"SELECT":for("string"!=typeof t&&"number"!=typeof t||(t=[t]),i=0;i1?r:r[0];case"INPUT":case"TEXTAREA":case"BUTTON":return b[0].value}},e.checked=function(t){return"boolean"==typeof t?(n(function(e){"INPUT"!==e.nodeName||"checkbox"!==e.type&&"radio"!==e.type||(e.checked=t)},b),e):!b[0]||"INPUT"!==b[0].nodeName||"checkbox"!==b[0].type&&"radio"!==b[0].type?void 0:!!b[0].checked},e.on=function(r,i){return t!==x&&t!==g||(b=[t]),n(function(t){g.addEventListener?t.addEventListener(r,i,!1):g.attachEvent&&(t[r+i]=function(){return i.apply(t,arguments)},t.attachEvent("on"+r,t[r+i]))},b),e},e.off=function(r,i){return t!==x&&t!==g||(b=[t]),n(function(t){g.addEventListener?t.removeEventListener(r,i,!1):g.attachEvent&&(t.detachEvent("on"+r,t[r+i]),t[r+i]=null)},b),e},e.ajax=function(t,n,r,i,a){var s,o,c=u(b),l=n?n.toUpperCase():"GET",h=new RegExp("http[s]?://(.*?)/","gi"),f=h.exec(t),d="_ts="+ +new Date,p=g.getElementsByTagName("head")[0],m="chibi"+ +new Date+(v+=1);return!c||"GET"!==l&&"DELETE"!==l||(t+=-1===t.indexOf("?")?"?"+c:"&"+c,c=null),"GET"===l&&!a&&f&&x.location.host!==f[1]?(i&&(t+=-1===t.indexOf("?")?"?"+d:"&"+d),t=t.replace("=%3F","=?"),r&&-1!==t.indexOf("=?")&&(t=t.replace("=?","="+m),x[m]=function(t){try{r(t,200)}catch(e){}x[m]=void 0}),o=document.createElement("script"),o.async=!0,o.src=t,o.onload=function(){p.removeChild(o)},p.appendChild(o)):(x.XMLHttpRequest?s=new XMLHttpRequest:x.ActiveXObject&&(s=new ActiveXObject("Microsoft.XMLHTTP")),s&&(i&&(t+=-1===t.indexOf("?")?"?"+d:"&"+d),s.open(l,t,!0),s.onreadystatechange=function(){4===s.readyState&&r&&r(s.responseText,s.status)},s.setRequestHeader("X-Requested-With","XMLHttpRequest"),"POST"!==l&&"PUT"!==l||s.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),s.send(c))),e},e.get=function(t,n,r,i){return e.ajax(t,"get",n,r,i)},e.post=function(t,n,r){return e.ajax(t,"post",n,r)},e}var f=[],d=[],p=!1,m=!1,v=0,g=document,x=window;g.addEventListener?(g.addEventListener("DOMContentLoaded",t,!1),x.addEventListener("load",e,!1)):g.attachEvent?(g.attachEvent("onreadystatechange",t),x.attachEvent("onload",e)):x.onload=e,x.$=h}(),function(t,e){t.Chartist=e()}(this,function(){var t={version:"0.9.7"};return function(t,e,n){"use strict";n.namespaces={svg:"http://www.w3.org/2000/svg",xmlns:"http://www.w3.org/2000/xmlns/",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",ct:"http://gionkunz.github.com/chartist-js/ct"},n.noop=function(t){return t},n.alphaNumerate=function(t){return String.fromCharCode(97+t%26)},n.extend=function(t){t=t||{};var e=Array.prototype.slice.call(arguments,1);return e.forEach(function(e){for(var r in e)"object"!=typeof e[r]||null===e[r]||e[r]instanceof Array?t[r]=e[r]:t[r]=n.extend({},t[r],e[r])}),t},n.replaceAll=function(t,e,n){return t.replace(new RegExp(e,"g"),n)},n.ensureUnit=function(t,e){return"number"==typeof t&&(t+=e),t},n.quantity=function(t){if("string"==typeof t){var e=/^(\d+)\s*(.*)$/g.exec(t);return{value:+e[1],unit:e[2]||void 0}}return{value:t}},n.querySelector=function(t){return t instanceof Node?t:e.querySelector(t)},n.times=function(t){return Array.apply(null,new Array(t))},n.sum=function(t,e){return t+(e?e:0)},n.mapMultiply=function(t){return function(e){return e*t}},n.mapAdd=function(t){return function(e){return e+t}},n.serialMap=function(t,e){var r=[],i=Math.max.apply(null,t.map(function(t){return t.length}));return n.times(i).forEach(function(n,i){var a=t.map(function(t){return t[i]});r[i]=e.apply(null,a)}),r},n.roundWithPrecision=function(t,e){var r=Math.pow(10,e||n.precision);return Math.round(t*r)/r},n.precision=8,n.serialize=function(t){return null===t||void 0===t?t:("number"==typeof t?t=""+t:"object"==typeof t&&(t=JSON.stringify({data:t})),_.escape(t))},n.deserialize=function(t){if("string"!=typeof t)return t;t=_.unescape(t);try{t=JSON.parse(t),t=void 0!==t.data?t.data:t}catch(e){}return t},n.createSvg=function(t,e,r,i){var a;return e=e||"100%",r=r||"100%",Array.prototype.slice.call(t.querySelectorAll("svg")).filter(function(t){return t.getAttributeNS(n.namespaces.xmlns,"ct")}).forEach(function(e){t.removeChild(e)}),a=new n.Svg("svg").attr({width:e,height:r}).addClass(i).attr({style:"width: "+e+"; height: "+r+";"}),t.appendChild(a._node),a},n.normalizeData=function(t){if(t=t||{series:[],labels:[]},t.series=t.series||[],t.labels=t.labels||[],t.series.length>0&&0===t.labels.length){var e,r=n.getDataArray(t);e=r.every(function(t){return t instanceof Array})?Math.max.apply(null,r.map(function(t){return t.length})):r.length,t.labels=n.times(e).map(function(){return""})}return t},n.reverseData=function(t){t.labels.reverse(),t.series.reverse();for(var e=0;ea.high&&(a.high=n),o&&n0?a.low=0:(a.high=1,a.low=0)),a},n.isNum=function(t){return!isNaN(t)&&isFinite(t)},n.isFalseyButZero=function(t){return!t&&0!==t},n.getNumberOrUndefined=function(t){return isNaN(+t)?void 0:+t},n.getMultiValue=function(t,e){return n.isNum(t)?+t:t?t[e||"y"]||0:0},n.rho=function(t){function e(t,n){return t%n===0?n:e(n,t%n)}function n(t){return t*t+1}if(1===t)return t;var r,i=2,a=2;if(t%2===0)return 2;do i=n(i)%t,a=n(n(a))%t,r=e(Math.abs(i-a),t);while(1===r);return r},n.getBounds=function(t,e,r,i){var a,s,o,u=0,c={high:e.high,low:e.low};c.valueRange=c.high-c.low,c.oom=n.orderOfMagnitude(c.valueRange),c.step=Math.pow(10,c.oom),c.min=Math.floor(c.low/c.step)*c.step,c.max=Math.ceil(c.high/c.step)*c.step,c.range=c.max-c.min,c.numberOfSteps=Math.round(c.range/c.step);var l=n.projectLength(t,c.step,c),h=r>l,f=i?n.rho(c.range):0;if(i&&n.projectLength(t,1,c)>=r)c.step=1;else if(i&&f=r)c.step=f;else for(;;){if(h&&n.projectLength(t,c.step,c)<=r)c.step*=2;else{if(h||!(n.projectLength(t,c.step/2,c)>=r))break;if(c.step/=2,i&&c.step%1!==0){c.step*=2;break}}if(u++>1e3)throw new Error("Exceeded maximum number of iterations while optimizing scale step!")}for(s=c.min,o=c.max;s+c.step<=c.low;)s+=c.step;for(;o-c.step>=c.high;)o-=c.step;for(c.min=s,c.max=o,c.range=c.max-c.min,c.values=[],a=c.min;a<=c.max;a+=c.step)c.values.push(n.roundWithPrecision(a));return c},n.createChartRect=function(t,e,r){var i=!(!e.axisX&&!e.axisY),a=i?e.axisY.offset:0,s=i?e.axisX.offset:0,o=t.width()||n.quantity(e.width).value||0,u=t.height()||n.quantity(e.height).value||0,c=n.normalizePadding(e.chartPadding,r);o=Math.max(o,a+c.left+c.right),u=Math.max(u,s+c.top+c.bottom);var l={padding:c,width:function(){return this.x2-this.x1},height:function(){return this.y1-this.y2}};return i?("start"===e.axisX.position?(l.y2=c.top+s,l.y1=Math.max(u-c.bottom,l.y2+1)):(l.y2=c.top,l.y1=Math.max(u-c.bottom-s,l.y2+1)),"start"===e.axisY.position?(l.x1=c.left+a,l.x2=Math.max(o-c.right,l.x1+1)):(l.x1=c.left,l.x2=Math.max(o-c.right-a,l.x1+1))):(l.x1=c.left,l.x2=Math.max(o-c.right,l.x1+1),l.y2=c.top,l.y1=Math.max(u-c.bottom,l.y2+1)),l},n.createGrid=function(t,e,r,i,a,s,o,u){var c={};c[r.units.pos+"1"]=Math.round(t)+.5,c[r.units.pos+"2"]=Math.round(t)+.5,c[r.counterUnits.pos+"1"]=i,c[r.counterUnits.pos+"2"]=i+a;var l=s.elem("line",c,o.join(" "));u.emit("draw",n.extend({type:"grid",axis:r,index:e,group:s,element:l},c))},n.createLabel=function(t,e,r,i,a,s,o,u,c,l,h){var f,d={};d[a.units.pos]=t+o[a.units.pos],d[a.counterUnits.pos]=o[a.counterUnits.pos],d[a.units.len]=e,d[a.counterUnits.len]=s-10;var p=i[r];if(_.isNumber(p)&&(p=n.roundWithPrecision(p,2)),l){var m=''+p+"";f=u.foreignObject(m,n.extend({style:"overflow: visible;"},d))}else f=u.elem("text",d,c.join(" ")).text(p);h.emit("draw",n.extend({type:"label",axis:a,index:r,group:u,element:f,text:p},d))},n.getSeriesOption=function(t,e,n){if(t.name&&e.series&&e.series[t.name]){var r=e.series[t.name];return r.hasOwnProperty(n)?r[n]:e[n]}return e[n]},n.optionsProvider=function(e,r,i){function a(e){var a=o;if(o=n.extend({},c),r)for(u=0;u=2&&e[a]<=e[a-2]?i=!0:(i&&(r.push({pathCoordinates:[],valueData:[]}),i=!1),r[r.length-1].pathCoordinates.push(e[a],e[a+1]),r[r.length-1].valueData.push(n[a/2]));return r}var r={fillHoles:!1};return t=n.extend({},r,t),function i(t,r){var a=e(t,r);if(a.length){if(a.length>1){var s=[];return a.forEach(function(t){s.push(i(t.pathCoordinates,t.valueData))}),n.Svg.Path.join(s)}if(t=a[0].pathCoordinates,r=a[0].valueData,t.length<=4)return n.Interpolation.none()(t,r);var o,u,c=[],l=[],h=t.length/2,f=[],d=[],p=[],m=[];for(o=0;h>o;o++)c[o]=t[2*o],l[o]=t[2*o+1];for(o=0;h-1>o;o++)p[o]=l[o+1]-l[o],m[o]=c[o+1]-c[o],d[o]=p[o]/m[o];for(f[0]=d[0],f[h-1]=d[h-2],o=1;h-1>o;o++)0===d[o]||0===d[o-1]||d[o-1]>0!=d[o]>0?f[o]=0:(f[o]=3*(m[o-1]+m[o])/((2*m[o]+m[o-1])/d[o-1]+(m[o]+2*m[o-1])/d[o]),isFinite(f[o])||(f[o]=0));for(u=(new n.Svg.Path).move(c[0],l[0],!1,r[0]),o=0;h-1>o;o++)u.curve(c[o]+m[o]/3,l[o]+f[o]*m[o]/3,c[o+1]-m[o]/3,l[o+1]-f[o+1]*m[o]/3,c[o+1],l[o+1],!1,r[o+1]);return u}return n.Interpolation.none()([])}},n.Interpolation.step=function(t){var e={postpone:!0,fillHoles:!1};return t=n.extend({},e,t),function(e,r){for(var i,a,s,o=new n.Svg.Path,u=0;u1}).map(function(t){var e=t.pathElements[0],n=t.pathElements[t.pathElements.length-1];return t.clone(!0).position(0).remove(1).move(e.x,g).line(e.x,e.y).position(t.pathElements.length+1).line(n.x,g)}).forEach(function(n){var o=u.elem("path",{d:n.stringify()},t.classNames.area,!0);this.eventEmitter.emit("draw",{type:"area",values:e.normalized[s],path:n.clone(),series:a,seriesIndex:s,axisX:r,axisY:i,chartRect:c,index:s,group:u,element:o})}.bind(this))}}.bind(this)),this.eventEmitter.emit("created",{bounds:i.bounds,chartRect:c,axisX:r,axisY:i,svg:this.svg,options:t})}function i(t,e,r,i){n.Line["super"].constructor.call(this,t,e,a,n.extend({},a,r),i)}var a={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:n.noop,type:void 0},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:n.noop,type:void 0,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,showLine:!0,showPoint:!0,showArea:!1,areaBase:0,lineSmooth:!0,low:void 0,high:void 0,chartPadding:{top:15,right:15,bottom:5,left:10},fullWidth:!1,reverseData:!1,classNames:{chart:"ct-chart-line",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",line:"ct-line",point:"ct-point",area:"ct-area",grid:"ct-grid",gridGroup:"ct-grids",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}};n.Line=n.Base.extend({constructor:i,createChart:r})}(window,document,t),function(t,e,n){"use strict";function r(t){this.data=n.normalizeData(this.data);var e,r={raw:this.data,normalized:t.distributeSeries?n.getDataArray(this.data,t.reverseData,t.horizontalBars?"x":"y").map(function(t){return[t]}):n.getDataArray(this.data,t.reverseData,t.horizontalBars?"x":"y")};this.svg=n.createSvg(this.container,t.width,t.height,t.classNames.chart+(t.horizontalBars?" "+t.classNames.horizontalBars:""));var i=this.svg.elem("g").addClass(t.classNames.gridGroup),s=this.svg.elem("g"),o=this.svg.elem("g").addClass(t.classNames.labelGroup);if(t.stackBars&&0!==r.normalized.length){var u=n.serialMap(r.normalized,function(){return Array.prototype.slice.call(arguments).map(function(t){return t}).reduce(function(t,e){return{x:t.x+(e&&e.x)||0,y:t.y+(e&&e.y)||0}},{x:0,y:0})});e=n.getHighLow([u],n.extend({},t,{referenceValue:0}),t.horizontalBars?"x":"y")}else e=n.getHighLow(r.normalized,n.extend({},t,{referenceValue:0}),t.horizontalBars?"x":"y");e.high=+t.high||(0===t.high?0:e.high),e.low=+t.low||(0===t.low?0:e.low);var c,l,h,f,d,p=n.createChartRect(this.svg,t,a.padding);l=t.distributeSeries&&t.stackBars?r.raw.labels.slice(0,1):r.raw.labels,t.horizontalBars?(c=f=void 0===t.axisX.type?new n.AutoScaleAxis(n.Axis.units.x,r,p,n.extend({},t.axisX,{highLow:e,referenceValue:0})):t.axisX.type.call(n,n.Axis.units.x,r,p,n.extend({},t.axisX,{highLow:e,referenceValue:0})),h=d=void 0===t.axisY.type?new n.StepAxis(n.Axis.units.y,r,p,{ticks:l}):t.axisY.type.call(n,n.Axis.units.y,r,p,t.axisY)):(h=f=void 0===t.axisX.type?new n.StepAxis(n.Axis.units.x,r,p,{ticks:l}):t.axisX.type.call(n,n.Axis.units.x,r,p,t.axisX),c=d=void 0===t.axisY.type?new n.AutoScaleAxis(n.Axis.units.y,r,p,n.extend({},t.axisY,{highLow:e,referenceValue:0})):t.axisY.type.call(n,n.Axis.units.y,r,p,n.extend({},t.axisY,{highLow:e,referenceValue:0})));var m=t.horizontalBars?p.x1+c.projectValue(0):p.y1-c.projectValue(0),v=[];h.createGridAndLabels(i,o,this.supportsForeignObject,t,this.eventEmitter),c.createGridAndLabels(i,o,this.supportsForeignObject,t,this.eventEmitter),r.raw.series.forEach(function(e,i){var a,o,u=i-(r.raw.series.length-1)/2;a=t.distributeSeries&&!t.stackBars?h.axisLength/r.normalized.length/2:t.distributeSeries&&t.stackBars?h.axisLength/2:h.axisLength/r.normalized[i].length/2,o=s.elem("g"),o.attr({"ct:series-name":e.name,"ct:meta":n.serialize(e.meta)}),o.addClass([t.classNames.series,e.className||t.classNames.series+"-"+n.alphaNumerate(i)].join(" ")),r.normalized[i].forEach(function(s,l){var g,x,y,b;if(b=t.distributeSeries&&!t.stackBars?i:t.distributeSeries&&t.stackBars?0:l,g=t.horizontalBars?{x:p.x1+c.projectValue(s&&s.x?s.x:0,l,r.normalized[i]),y:p.y1-h.projectValue(s&&s.y?s.y:0,b,r.normalized[i])}:{x:p.x1+h.projectValue(s&&s.x?s.x:0,b,r.normalized[i]),y:p.y1-c.projectValue(s&&s.y?s.y:0,l,r.normalized[i])},h instanceof n.StepAxis&&(h.options.stretch||(g[h.units.pos]+=a*(t.horizontalBars?-1:1)),g[h.units.pos]+=t.stackBars||t.distributeSeries?0:u*t.seriesBarDistance*(t.horizontalBars?-1:1)),y=v[l]||m,v[l]=y-(m-g[h.counterUnits.pos]),void 0!==s){var w={};w[h.units.pos+"1"]=g[h.units.pos],w[h.units.pos+"2"]=g[h.units.pos],!t.stackBars||"accumulate"!==t.stackMode&&t.stackMode?(w[h.counterUnits.pos+"1"]=m,w[h.counterUnits.pos+"2"]=g[h.counterUnits.pos]):(w[h.counterUnits.pos+"1"]=y,w[h.counterUnits.pos+"2"]=v[l]),w.x1=Math.min(Math.max(w.x1,p.x1),p.x2),w.x2=Math.min(Math.max(w.x2,p.x1),p.x2),w.y1=Math.min(Math.max(w.y1,p.y2),p.y1),w.y2=Math.min(Math.max(w.y2,p.y2),p.y1),x=o.elem("line",w,t.classNames.bar).attr({"ct:value":[s.x,s.y].filter(n.isNum).join(","),"ct:meta":n.getMetaData(e,l)}),this.eventEmitter.emit("draw",n.extend({type:"bar",value:s,index:l,meta:n.getMetaData(e,l),series:e,seriesIndex:i,axisX:f,axisY:d,chartRect:p,group:o,element:x},w))}}.bind(this))}.bind(this)),this.eventEmitter.emit("created",{bounds:c.bounds,chartRect:p,axisX:f,axisY:d,svg:this.svg,options:t})}function i(t,e,r,i){n.Bar["super"].constructor.call(this,t,e,a,n.extend({},a,r),i)}var a={axisX:{offset:30,position:"end",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:n.noop,scaleMinSpace:30,onlyInteger:!1},axisY:{offset:40,position:"start",labelOffset:{x:0,y:0},showLabel:!0,showGrid:!0,labelInterpolationFnc:n.noop,scaleMinSpace:20,onlyInteger:!1},width:void 0,height:void 0,high:void 0,low:void 0,chartPadding:{top:15,right:15,bottom:5,left:10},seriesBarDistance:15,stackBars:!1,stackMode:"accumulate",horizontalBars:!1,distributeSeries:!1,reverseData:!1,classNames:{chart:"ct-chart-bar",horizontalBars:"ct-horizontal-bars",label:"ct-label",labelGroup:"ct-labels",series:"ct-series",bar:"ct-bar",grid:"ct-grid",gridGroup:"ct-grids",vertical:"ct-vertical",horizontal:"ct-horizontal",start:"ct-start",end:"ct-end"}};n.Bar=n.Base.extend({constructor:i,createChart:r})}(window,document,t),t}),function(t,e){t["Chartist.plugins.ctAxisTitle"]=e()}(this,function(){return function(t,e,n){"use strict";var r={axisTitle:"",axisClass:"ct-axis-title",offset:{x:0,y:0},textAnchor:"middle",flipText:!1},i={axisX:r,axisY:r};n.plugins=n.plugins||{},n.plugins.ctAxisTitle=function(t){return t=n.extend({},i,t),function(e){e.on("created",function(e){var r,i,a;if(t.axisX.axisTitle&&e.axisX&&(r=e.axisX.axisLength/2+e.options.axisY.offset+e.options.chartPadding.left,i=e.options.chartPadding.top,"end"===e.options.axisY.position&&(r-=e.options.axisY.offset),"end"===e.options.axisX.position&&(i+=e.axisY.axisLength),a=new n.Svg("text"),a.addClass(t.axisX.axisClass),a.text(t.axisX.axisTitle),a.attr({x:r+t.axisX.offset.x,y:i+t.axisX.offset.y,"text-anchor":t.axisX.textAnchor}),e.svg.append(a,!0)),t.axisY.axisTitle&&e.axisY){r=0,i=e.axisY.axisLength/2+e.options.chartPadding.top,"start"===e.options.axisX.position&&(i+=e.options.axisX.offset),"end"===e.options.axisY.position&&(r=e.axisX.axisLength);var s="rotate("+(t.axisY.flipText?-90:90)+", "+r+", "+i+")";a=new n.Svg("text"),a.addClass(t.axisY.axisClass),a.text(t.axisY.axisTitle),a.attr({x:r+t.axisY.offset.x,y:i+t.axisY.offset.y,transform:s,"text-anchor":t.axisY.textAnchor}),e.svg.append(a,!0)}})}}}(window,document,Chartist),Chartist.plugins.ctAxisTitle}),function(t,e){t["Chartist.plugins.zoom"]=e()}(this,function(){return function(t,e,n){"use strict";function r(t){t.attr({style:"display:none"})}function i(t){t.attr({style:"display:block"})}function a(t,e){var n=t.x,r=t.y,i=e.x-n,a=e.y-r;return 0>i&&(i=-i,n=e.x),0>a&&(a=-a,r=e.y),{x:n,y:r,width:i,height:a}}function s(t,e){return o(t.clientX,t.clientY,e)}function o(t,e,n){var r="svg"===n.tagName?n:n.ownerSVGElement,i=r.getScreenCTM(),a=r.createSVGPoint();return a.x=t,a.y=e,a=a.matrixTransform(i.inverse()),a||{x:0,y:0}}function u(t,e){var n=e.bounds.max,r=e.bounds.min;if(e.scale&&"log"===e.scale.type){var i=e.scale.base;return Math.pow(i,t*c(n/r,i)/e.axisLength)*r}return t*e.bounds.range/e.axisLength+r}function c(t,e){return Math.log(t)/Math.log(e)}var l={};n.plugins=n.plugins||{},n.plugins.zoom=function(t){return t=n.extend({},l,t),function(e){function o(t){var e=s(t,b);return e.id=t.identifier,e}function c(t){for(var e=0;e1&&(y.attr(a(O[0],O[1])),i(y))}function h(t){for(var e=t.changedTouches,n=0;n1&&(y.attr(a(O[0],O[1])),i(y),t.preventDefault())}function f(t){d(t.changedTouches)}function d(t){for(var e=0;e=0&&O.splice(n,1)}}function p(t){O.length>1&&g(a(O[0],O[1])),d(t.changedTouches),r(y)}function m(t){0===t.button&&(S=s(t,b),y.attr(a(S,S)),i(y),t.preventDefault())}function v(e){if(0===e.button){var n=a(S,s(e,b));g(n),S=null,r(y),e.preventDefault()}else t.resetOnRightMouseBtn&&2===e.button&&(L(),e.preventDefault())}function g(t){if(t.width>5&&t.height>5){var n=t.x-E.x1,r=n+t.width,i=E.y1-t.y,a=i-t.height,s=u(n,w),o=u(r,w),c=u(a,A),l=u(i,A),h=e.options.explicitBounds;_.isUndefined(h)||(_.isUndefined(h.xLow)||(s=Math.max(h.xLow,s)),_.isUndefined(h.xHigh)||(o=Math.min(h.xHigh,o)),_.isUndefined(h.yLow)||(c=Math.max(h.yLow,c)),_.isUndefined(h.yHigh)||(l=Math.min(h.yHigh,l))),e.options.axisX.highLow={low:s,high:o},e.options.axisY.highLow={low:c,high:l},e.update(e.data,e.options),C&&C(e,L)}}function x(t){if(S){var e=s(t,b);y.attr(a(S,e)),t.preventDefault()}}if(e instanceof n.Line){var y,b,w,A,E,S,C=t.onZoom,O=[];e.on("draw",function(t){var e=t.type;"line"!==e&&"bar"!==e&&"area"!==e&&"point"!==e||t.element.attr({"clip-path":"url(#zoom-mask)"})}),e.on("created",function(t){w=t.axisX,A=t.axisY,E=t.chartRect,b=t.svg._node,y=t.svg.elem("rect",{x:10,y:10,width:100,height:100},"ct-zoom-rect"),r(y);var e=t.svg.querySelector("defs")||t.svg.elem("defs"),n=E.width(),i=E.height();e.elem("clipPath",{id:"zoom-mask"}).elem("rect",{x:E.x1,y:E.y2,width:n,height:i,fill:"white"}),b.addEventListener("mousedown",m),b.addEventListener("mouseup",v),b.addEventListener("mousemove",x),b.addEventListener("touchstart",l),b.addEventListener("touchmove",h),b.addEventListener("touchend",p),b.addEventListener("touchcancel",f)});var L=function(){e.options.axisX.highLow=null,e.options.axisY.highLow=null,e.update(e.data,e.options)}}}}}(window,document,Chartist),Chartist.plugins.zoom}),function(){function t(t,e){return t.set(e[0],e[1]),t}function e(t,e){return t.add(e),t}function n(t,e){for(var n=-1,r=t.length;++n-1&&t%1==0&&e>t}function f(t){var e=-1,n=Array(t.size);return t.forEach(function(t,r){n[++e]=[r,t]}),n}function d(t){var e=-1,n=Array(t.size);return t.forEach(function(t){n[++e]=t}),n}function p(t){return gn[t]}function m(){}function v(){}function g(t,e){return y(t,e)&&delete t[e]}function x(t,e){if(Gn){var n=t[e];return n===ye?ve:n}return Nn.call(t,e)?t[e]:ve}function y(t,e){return Gn?t[e]!==ve:Nn.call(t,e)}function b(t,e,n){t[e]=Gn&&n===ve?ye:n}function w(t){var e=-1,n=t?t.length:0;for(this.clear();++en)return!1;var r=t.length-1;return n==r?t.pop():Rn.call(t,n,1),!0}function P(t,e){var n=$(t,e);return 0>n?ve:t[n][1]}function z(t,e){return $(t,e)>-1}function $(t,e){for(var n=t.length;n--;)if(Yt(t[n][0],e))return n;return-1}function I(t,e,n){var r=$(t,e);0>r?t.push([e,n]):t[r][1]=n}function B(t,e,n){var r=t[e];Nn.call(t,e)&&Yt(r,n)&&(n!==ve||e in t)||(t[e]=n)}function X(t,e){return t&&pt(e,se(e),t)}function U(t){return"function"==typeof t?t:de}function R(t){return ar(t)?t:Bt(t)}function Y(t,e,r,i,a,s,o){var u;if(i&&(u=s?i(t,a,s,o):i(t)),u!==ve)return u;if(!Gt(t))return t;var c=ar(t);if(c){if(u=Lt(t),!e)return dt(t,u)}else{var h=Ct(t),f=h==Me||h==Ne;if(sr(t))return st(t,e);if(h==Pe||h==_e||f&&!s){if(l(t))return s?t:{};if(u=jt(f?{}:t),!e)return u=X(u,t),r?vt(t,u):u}else{if(!mn[h])return s?t:{};u=Mt(t,h,e)}}o||(o=new O);var d=o.get(t);return d?d:(o.set(t,u),(c?n:F)(t,function(n,a){B(u,a,Y(n,e,r,i,a,t,o))}),r&&!c?vt(t,u):u)}function D(t){return Gt(t)?Xn(t):{}}function F(t,e){return t&&nr(t,e,se)}function q(t,e){e=kt(e,t)?[e+""]:R(e);for(var n=0,r=e.length;null!=t&&r>n;)t=t[e[n++]];return n&&n==r?t:ve}function H(t,e){return Nn.call(t,e)||"object"==typeof t&&e in t&&null===In(t)}function V(t,e){return e in Object(t)}function G(t,e,n,r,i){return t===e?!0:null==t||null==e||!Gt(t)&&!Wt(e)?t!==t&&e!==e:W(t,e,G,n,r,i)}function W(t,e,n,r,i,a){var s=ar(t),o=ar(e),u=Ce,c=Ce;s||(u=Ct(t),u=u==_e?Pe:u),o||(c=Ct(e),c=c==_e?Pe:c);var h=u==Pe&&!l(t),f=c==Pe&&!l(e),d=u==c;if(d&&!h)return a||(a=new O),s||te(t)?bt(t,e,n,r,i,a):wt(t,e,u,n,r,i,a);if(!(i&we)){var p=h&&Nn.call(t,"__wrapped__"),m=f&&Nn.call(e,"__wrapped__");if(p||m)return a||(a=new O),n(p?t.value():t,m?e.value():e,r,i,a)}return d?(a||(a=new O),At(t,e,n,r,i,a)):!1}function Q(t,e,n,r){var i=n.length,a=i,s=!r;if(null==t)return!a;for(t=Object(t);i--;){var o=n[i];if(s&&o[2]?o[1]!==t[o[0]]:!(o[0]in t))return!1}for(;++ie&&(e=-e>i?0:i+e),n=n>i?i:n,0>n&&(n+=i),i=e>n?0:n-e>>>0,e>>>=0;for(var a=Array(i);++re?1:-1:ne(r)||0,it(e,n,r,t)}}function bt(t,e,n,r,i,s){var o=-1,u=i&we,c=i&be,l=t.length,h=e.length;if(l!=h&&!(u&&h>l))return!1;var f=s.get(t);if(f)return f==e;var d=!0;for(s.set(t,e);++o-1&&t%1==0&&Ee>=t}function Gt(t){var e=typeof t;return!!t&&("object"==e||"function"==e)}function Wt(t){return!!t&&"object"==typeof t}function Qt(t){return null==t?!1:Ht(t)?kn.test(Mn.call(t)):Wt(t)&&(l(t)?kn:hn).test(t)}function Zt(t){return"number"==typeof t||Wt(t)&&Tn.call(t)==ke}function Jt(t){return"string"==typeof t||!ar(t)&&Wt(t)&&Tn.call(t)==Ie}function Kt(t){return"symbol"==typeof t||Wt(t)&&Tn.call(t)==Be}function te(t){return Wt(t)&&Vt(t.length)&&!!pn[Tn.call(t)]}function ee(t){return t===ve}function ne(t){if(Gt(t)){var e=Ht(t.valueOf)?t.valueOf():t;t=Gt(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(sn,"");var n=ln.test(t);return n||fn.test(t)?yn(t.slice(2),n?2:8):cn.test(t)?Se:+t}function re(t){if("string"==typeof t)return t;if(null==t)return"";if(Kt(t))return tr?tr.call(t):"";var e=t+"";return"0"==e&&1/t==-Ae?"-0":e}function ie(t,e,n){var r=null==t?ve:q(t,e);return r===ve?n:r}function ae(t,e){return Ot(t,e,V)}function se(t){var e=zt(t);if(!e&&!Ft(t))return J(t);var n=Nt(t),r=!!n,i=n||[],a=i.length;for(var s in t)!H(t,s)||r&&("length"==s||h(s,a))||e&&"constructor"==s||i.push(s);return i}function oe(t){return o(t,se(t))}function ue(t){return t=re(t),t&&Ke.test(t)?t.replace(Ze,c):t}function ce(t){return t=re(t),t&&an.test(t)?t.replace(rn,"\\$&"):t}function le(){var t=arguments,e=re(t[0]);return t.length<3?e:e.replace(t[1],t[2])}function he(t){return t=re(t),t&&Je.test(t)?t.replace(Qe,p):t}function fe(t){return function(){return t}}function de(t){return t}function pe(t){return Z("function"==typeof t?t:Y(t,!0))}function me(t){return kt(t)?nt(t):rt(t)}var ve,ge="4.6.1",xe=200,ye="__lodash_hash_undefined__",be=1,we=2,Ae=1/0,Ee=9007199254740991,Se=NaN,_e="[object Arguments]",Ce="[object Array]",Oe="[object Boolean]",Le="[object Date]",je="[object Error]",Me="[object Function]",Ne="[object GeneratorFunction]",Te="[object Map]",ke="[object Number]",Pe="[object Object]",ze="[object RegExp]",$e="[object Set]",Ie="[object String]",Be="[object Symbol]",Xe="[object WeakMap]",Ue="[object ArrayBuffer]",Re="[object Float32Array]",Ye="[object Float64Array]",De="[object Int8Array]",Fe="[object Int16Array]",qe="[object Int32Array]",He="[object Uint8Array]",Ve="[object Uint8ClampedArray]",Ge="[object Uint16Array]",We="[object Uint32Array]",Qe=/&(?:amp|lt|gt|quot|#39|#96);/g,Ze=/[&<>"'`]/g,Je=RegExp(Qe.source),Ke=RegExp(Ze.source),tn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,en=/^\w*$/,nn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g,rn=/[\\^$.*+?()[\]{}|]/g,an=RegExp(rn.source),sn=/^\s+|\s+$/g,on=/\\(\\)?/g,un=/\w*$/,cn=/^[-+]0x[0-9a-f]+$/i,ln=/^0b[01]+$/i,hn=/^\[object .+?Constructor\]$/,fn=/^0o[0-7]+$/i,dn=/^(?:0|[1-9]\d*)$/,pn={};pn[Re]=pn[Ye]=pn[De]=pn[Fe]=pn[qe]=pn[He]=pn[Ve]=pn[Ge]=pn[We]=!0,pn[_e]=pn[Ce]=pn[Ue]=pn[Oe]=pn[Le]=pn[je]=pn[Me]=pn[Te]=pn[ke]=pn[Pe]=pn[ze]=pn[$e]=pn[Ie]=pn[Xe]=!1;var mn={};mn[_e]=mn[Ce]=mn[Ue]=mn[Oe]=mn[Le]=mn[Re]=mn[Ye]=mn[De]=mn[Fe]=mn[qe]=mn[Te]=mn[ke]=mn[Pe]=mn[ze]=mn[$e]=mn[Ie]=mn[Be]=mn[He]=mn[Ve]=mn[Ge]=mn[We]=!0,mn[je]=mn[Me]=mn[Xe]=!1;var vn={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},gn={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},xn={"function":!0,object:!0},yn=parseInt,bn=xn[typeof exports]&&exports&&!exports.nodeType?exports:ve,wn=xn[typeof module]&&module&&!module.nodeType?module:ve,An=wn&&wn.exports===bn?bn:ve,En=u(bn&&wn&&"object"==typeof global&&global),Sn=u(xn[typeof self]&&self),_n=u(xn[typeof window]&&window),Cn=u(xn[typeof this]&&this),On=En||_n!==(Cn&&Cn.window)&&_n||Sn||Cn||Function("return this")(),Ln=Array.prototype,jn=Object.prototype,Mn=Function.prototype.toString,Nn=jn.hasOwnProperty,Tn=jn.toString,kn=RegExp("^"+Mn.call(Nn).replace(rn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Pn=An?On.Buffer:ve,zn=On.Symbol,$n=On.Uint8Array,In=Object.getPrototypeOf,Bn=Object.getOwnPropertySymbols,Xn=Object.create,Un=jn.propertyIsEnumerable,Rn=Ln.splice,Yn=Math.ceil,Dn=Object.keys,Fn=Math.max,qn=_t(On,"Map"),Hn=_t(On,"Set"),Vn=_t(On,"WeakMap"),Gn=_t(Object,"create"),Wn=qn?Mn.call(qn):"",Qn=Hn?Mn.call(Hn):"",Zn=Vn?Mn.call(Vn):"",Jn=zn?zn.prototype:ve,Kn=Jn?Jn.valueOf:ve,tr=Jn?Jn.toString:ve,er=gt(F),nr=xt(),rr=nt("length"),ir=Bn||function(){return[]};(qn&&Ct(new qn)!=Te||Hn&&Ct(new Hn)!=$e||Vn&&Ct(new Vn)!=Xe)&&(Ct=function(t){var e=Tn.call(t),n=e==Pe?t.constructor:null,r="function"==typeof n?Mn.call(n):"";if(r)switch(r){case Wn:return Te;case Qn:return $e;case Zn:return Xe}return e});var ar=Array.isArray,sr=Pn?function(t){return t instanceof Pn}:fe(!1),or=yt();v.prototype=Gn?Gn(null):jn,w.prototype.clear=A,w.prototype["delete"]=E,w.prototype.get=S,w.prototype.has=_,w.prototype.set=C,O.prototype.clear=L,O.prototype["delete"]=j,O.prototype.get=M,O.prototype.has=N,O.prototype.set=T,m.constant=fe,m.iteratee=pe,m.keys=se,m.map=Rt,m.property=me,m.range=or,m.toPairs=oe,m.eq=Yt,m.escape=ue,m.escapeRegExp=ce,m.forEach=Ut,m.get=ie,m.hasIn=ae,m.identity=de,m.isArguments=Dt,m.isArray=ar,m.isArrayLike=Ft,m.isArrayLikeObject=qt,m.isBuffer=sr,m.isFunction=Ht,m.isLength=Vt,m.isNative=Qt,m.isNumber=Zt,m.isObject=Gt,m.isObjectLike=Wt,m.isString=Jt,m.isSymbol=Kt,m.isTypedArray=te,m.isUndefined=ee,m.last=Xt,m.replace=le,m.toNumber=ne,m.toString=re,m.unescape=he,m.each=Ut,m.VERSION=ge,(_n||Sn||{})._=m,On._=m}.call(this),String.prototype.format=function(){var t=this,e=arguments;1==arguments.length&&(_.isArray(arguments[0])||_.isObject(arguments[0]))&&(e=arguments[0]);for(var n in e)if(e.hasOwnProperty(n)){var r=n;n.match(/^\{.*\}$/)||(n="{"+n+"}");var i=new RegExp(_.escapeRegExp(n),"g");t=t.replace(i,e[r])}return t};var modal=function(){var t={};return t.show=function(t){var e=$(t);e.removeClass("hidden visible"),setTimeout(function(){e.addClass("visible")},1)},t.hide=function(t){var e=$(t);e.removeClass("visible"),setTimeout(function(){e.addClass("hidden")},500)},t.init=function(){$(".Modal").on("click",function(){t.hide(this)}),$(".Dialog").on("click",function(t){t.stopImmediatePropagation()}),$(window).on("keydown",function(e){27==e.which&&t.hide(".Modal")})},t}();$().ready(function(){setInterval(function(){$(".anim-dots").each(function(t){var e=$(t),n=e.html()+".";5==n.length&&(n="."),e.html(n)})},1e3),modal.init()});var page_wifi=function(){function t(t,e){if(200!=e)return void n(5e3);t=JSON.parse(t);var a=!bool(t.result.inProgress)&&t.result.APs.length>0;if(n(a?15e3:1e3),a){var s=$("#ap-list");$(".AP").remove(),s.toggle(a),$("#ap-loader").toggle(!a),t.result.APs.sort(function(t,e){return e.rssi-t.rssi}).forEach(function(t){if(t.enc=parseInt(t.enc),!(t.enc>4)){var e=document.createElement("div"),n=$(e).data("ssid",t.essid).data("pwd",0!=t.enc).addClass("AP");t.essid==r.current&&n.addClass("selected");var a=document.createElement("div");$(a).addClass("inner").htmlAppend('
{0}
'.format(t.rssi_perc)).htmlAppend('
{0}
'.format(_.escape(t.essid))).htmlAppend('
{0}
'.format(i[t.enc]));n.on("click",function(){var t=$(this);$("#conn-essid").val(t.data("ssid")),$("#conn-passwd").val(""),t.data("pwd")?modal.show("#psk-modal"):$("#conn-form").submit()}),e.appendChild(a),s[0].appendChild(e)}})}}function e(){$().get("http://192.168.1.13/wifi/scan.cgi",t,!0,!0)}function n(t){setTimeout(e,t)}var r={},i=["Open","WEP","WPA","WPA2","WPA/WPA2"];return r.init=function(){e()},r}(),page_waveform=function(){function t(t){var e,n,i=window.matchMedia("screen and (min-width: 544px)"),o=!i.matches,u="FFT"==t.stats.format;u?(e="Frequency - [ Hz ]",n="Magnitude - [ mA ]"):(e="Sample time - [ ms ]",n="Current - [ mA ]");var c=Math.max(-t.stats.min,t.stats.max),l=Math.max(c,10);$("#stat-count").html(t.stats.count),$("#stat-f-s").html(t.stats.freq),$("#stat-i-peak").html(c),$("#stat-i-rms").html(t.stats.rms),$(".stats").removeClass("invis");var h=u?t.stats.freq/t.stats.count:1e3/t.stats.freq,f=_.map(t.samples,function(t,e){return{x:e*h,y:t}}),d=[Chartist.plugins.zoom({resetOnRightMouseBtn:!0,onZoom:function(t,e){r=e,a=t.options.axisX.highLow,s=t.options.axisY.highLow}})];o||d.push(Chartist.plugins.ctAxisTitle({axisX:{axisTitle:e,offset:{x:0,y:55}},axisY:{axisTitle:n,flipText:!0,offset:{x:0,y:15}}}));var p,m,v,g;a?(p=a.high,m=a.low,v=s.high,g=s.low):(v=u?void 0:l,g=u?0:-l),new Chartist.Line("#chart",{series:[{name:"a",data:f}]},{showPoint:!1,showArea:u,fullWidth:!0,chartPadding:o?{right:20,bottom:5,left:0}:{right:25,bottom:30,left:25},series:{a:{lineSmooth:Chartist.Interpolation.monotoneCubic()}},axisX:{type:Chartist.AutoScaleAxis,high:p,low:m},axisY:{type:Chartist.AutoScaleAxis,high:v,low:g},explicitBounds:{xLow:0,yLow:u?0:void 0,xHigh:f[f.length-1].x +},plugins:d})}function e(e,r){if(u=!1,200!=r)return void(0!=r&&alert("Request failed."));var i=JSON.parse(e);return i.success?(c&&(h=setTimeout(n,l)),void t(i)):void alert("Sampling failed.")}function n(){if(u)return!1;u=!0;var t="/api/{fmt}.json?n={n}&fs={fs}".format({fmt:i,n:$("#count").val(),fs:$("#freq").val()});return $().get(t,e,!0,!0),!0}var r,i,a,s,o={},u=!1,c=!1,l=1,h=-1;return o.init=function(t){i=t,$("#load").on("click",n),$("#count,#freq").on("keyup",function(t){13==t.which&&n()}),$("#chart").on("contextmenu",function(t){return r&&r(),r=null,a=null,s=null,t.preventDefault(),!1}),$("input[type=number]").on("mousewheel",function(t){var e=+$(this).val(),n=+($(this).attr("step")||1);t.wheelDelta>0?e+=n:e-=n,$(this).val(e)}),$("#ar-btn").on("click",function(){l=1e3*+$("#ar-time").val(),c=!c,c?n():clearTimeout(h),$("#ar-btn").toggleClass("btn-blue").toggleClass("btn-red").val(c?"Stop":"Auto")})},o}(),page_status=function(){function t(t,n){if(200!=n)console.error("Update failed.");else try{var r=JSON.parse(t);$(".sta-only").toggle(r.sta),$(".ap-only").toggle(r.ap),$("#uptime").html(r.uptime),$("#heap").html(r.heap+" bytes"),$("#wmode").html(r.wifiMode),r.sta&&($("#staSSID").html(r.sta.SSID),$("#staRSSIperc").html(r.sta.RSSIperc),$("#staRSSI").html(r.sta.RSSI),$("#staMAC").html(r.sta.MAC)),r.ap&&($("#apSSID").html(r.ap.SSID),$("#apHidden").html(r.ap.hidden?"Yes":"No"),$("#apAuth").html(r.ap.auth),$(".ap-auth-only").toggle("Open"!=r.ap.auth),$("#apPwd").html(r.ap.pwd),$("#apChan").html(r.ap.chan),$("#apMAC").html(r.ap.MAC))}catch(i){console.error(i)}setTimeout(e,1e4)}function e(){$().get("/api/status.json",t,!0,!0)}var n={};return n.init=function(){e(),setTimeout(e,1e4)},n}(); \ No newline at end of file diff --git a/html/pages/about.tpl b/html/pages/about.tpl new file mode 100644 index 0000000..5f6d0fd --- /dev/null +++ b/html/pages/about.tpl @@ -0,0 +1,66 @@ + + + + + + + + About - Current analyzer + + + + + + + +
+ +
+ +

About

+ +
+ +

Current Analyser

+ + + +

© Ondřej Hruška, 2016 <ondra@ondrovo.com>

+ +

Katedra měření FEL ČVUT
Department of Measurement, FEE CTU

+
+ +
+

Firmware

+ +

+ The ESP8266 firmware is based on the amazing esp-httpd + library by Jeroen Domburg. +

+ + + + + + + + + + + + + + + + + + +
Firmwarev%vers_fw%, build %date% at %time%
HTTPDv%vers_httpd%
SBMPv%vers_sbmp%
IoT SDKv%vers_sdk%
+
+ +
+
+ + diff --git a/html/pages/fft.html b/html/pages/fft.html new file mode 100644 index 0000000..c2c31d1 --- /dev/null +++ b/html/pages/fft.html @@ -0,0 +1,85 @@ + + + + + + + + FFT - Current analyzer + + + + + + + +
+ +
+ +

FFT

+ +
+
+ + +
+
+ + + Hz +
+
+ Load +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + +
Samples
fs
Ipeak
IRMS
+
+  s + +
+
+
+ + + +
+
+ + diff --git a/html/pages/status.tpl b/html/pages/status.tpl index 4f531fa..eb1343f 100644 --- a/html/pages/status.tpl +++ b/html/pages/status.tpl @@ -15,8 +15,8 @@
+
Current Analyser
+ HomeWiFi configWaveformFFTAbout

System Status

@@ -24,7 +24,6 @@

Runtime

- @@ -33,7 +32,6 @@ -
Uptime: %uptime%Free heap: %heap%
diff --git a/html/pages/waveform.html b/html/pages/wfm.html similarity index 79% rename from html/pages/waveform.html rename to html/pages/wfm.html index 214a739..4240a6f 100644 --- a/html/pages/waveform.html +++ b/html/pages/wfm.html @@ -15,8 +15,8 @@
+
Current Analyser
+ HomeWiFi configWaveformFFTAbout

Waveform

@@ -41,7 +41,7 @@
- + @@ -57,11 +57,15 @@
#Samples
+
+  s + +
diff --git a/html/pages/wifi.tpl b/html/pages/wifi.tpl index 7599f5d..74306d4 100644 --- a/html/pages/wifi.tpl +++ b/html/pages/wifi.tpl @@ -15,8 +15,8 @@
+
Current Analyser
+ HomeWiFi configWaveformFFTAbout

Wireless Setup

diff --git a/html_src/_start.php b/html_src/_start.php index af31bcc..77476e1 100644 --- a/html_src/_start.php +++ b/html_src/_start.php @@ -4,10 +4,10 @@ $menu = [ 'home' => [ '/', 'Home' ], 'wifi' => [ '/wifi', 'WiFi config' ], 'waveform' => [ '/waveform', 'Waveform' ], -// 'fft' => [ '/fft', 'FFT' ], + 'fft' => [ '/fft', 'FFT' ], // 'spectrogram' => [ '/spectrogram', 'Spectrogram' ], // 'transient' => [ '/transient', 'Power-on transient' ], -// 'about' => [ '/about', 'Credits & About' ], + 'about' => [ '/about', 'About' ], ]; $appname = 'Current analyzer'; @@ -37,7 +37,7 @@ $appname = 'Current analyzer';
diff --git a/html_src/sass/app.scss b/html_src/sass/app.scss index ae30221..5cda087 100644 --- a/html_src/sass/app.scss +++ b/html_src/sass/app.scss @@ -45,29 +45,20 @@ $c-form-highlight-a: #28bc65; @import "pages/wifi"; @import "pages/home"; @import "pages/wfm"; +@import "pages/about"; -/* @include media($tablet-min) { - .mq-phone { - display: none; - } + .mq-phone { display: none; } } @include media($phone) { - .mq-tablet-min { - display: none; - } + .mq-tablet-min { display: none; } } -*/ @include media($normal-min) { - .mq-tablet-max { - display: none; - } + .mq-tablet-max { display: none; } } @include media($tablet-max) { - .mq-normal-min { - display: none; - } + .mq-normal-min { display: none; } } diff --git a/html_src/sass/form/_buttons.scss b/html_src/sass/form/_buttons.scss index dec4a4d..646e975 100644 --- a/html_src/sass/form/_buttons.scss +++ b/html_src/sass/form/_buttons.scss @@ -55,7 +55,7 @@ input[type="reset"], .btn-red { @include fancy-btn-colors($btn-red-f, $btn-red-b, $btn-red-fa, $btn-red-ba) } -//&.blue {@include fancy-btn-colors($btn-blue-f, $btn-blue-b, $btn-blue-fa, $btn-blue-ba)} +&.btn-blue {@include fancy-btn-colors($btn-blue-f, $btn-blue-b, $btn-blue-fa, $btn-blue-ba)} //&, &.orange {@include fancy-btn-colors($btn-orange-f, $btn-orange-b, $btn-orange-fa, $btn-orange-ba)} /* diff --git a/html_src/sass/layout/_box.scss b/html_src/sass/layout/_box.scss index 24a5635..e4121af 100644 --- a/html_src/sass/layout/_box.scss +++ b/html_src/sass/layout/_box.scss @@ -3,7 +3,7 @@ max-width: 900px; margin-top: dist(0); - padding: dist(-1); + padding: dist(-1) dist(0); @include media($phone) { margin-top: dist(-1); diff --git a/html_src/sass/lib/chartist/_chartist-settings.scss b/html_src/sass/lib/chartist/_chartist-settings.scss index 5b68718..1c0d61a 100644 --- a/html_src/sass/lib/chartist/_chartist-settings.scss +++ b/html_src/sass/lib/chartist/_chartist-settings.scss @@ -30,7 +30,7 @@ $ct-point-size: 4px !default; // Line chart point, can be either round or square $ct-point-shape: round !default; // Area fill transparency between 0 and 1 -$ct-area-opacity: 0.1 !default; +$ct-area-opacity: 0.3 !default; // Bar chart bar width $ct-bar-width: 10px !default; diff --git a/html_src/sass/lib/chartist/_chartist.scss b/html_src/sass/lib/chartist/_chartist.scss index 88a3484..cd64c05 100644 --- a/html_src/sass/lib/chartist/_chartist.scss +++ b/html_src/sass/lib/chartist/_chartist.scss @@ -207,6 +207,10 @@ @include ct-chart-line($ct-line-width); } + .ct-with-area .ct-line { + stroke-width: 1px; + } + .ct-area { @include ct-chart-area(); } diff --git a/html_src/sass/pages/_about.scss b/html_src/sass/pages/_about.scss new file mode 100644 index 0000000..065c72e --- /dev/null +++ b/html_src/sass/pages/_about.scss @@ -0,0 +1,17 @@ +.page-about { + .Box { + padding-left:dist(0); + padding-right:dist(0); + + a {font-weight: bold;} + } + + #logo { + float:right; + height: 130px; + } + + #logo2 { + max-width: 150px; + } +} diff --git a/html_src/sass/pages/_wfm.scss b/html_src/sass/pages/_wfm.scss index 6d4d33d..82a4607 100644 --- a/html_src/sass/pages/_wfm.scss +++ b/html_src/sass/pages/_wfm.scss @@ -11,7 +11,7 @@ align-items: stretch; > div { - margin: dist(-2); + margin: dist(-2) dist(-1); } label { @@ -19,8 +19,8 @@ font-weight: bold; } - input { - width: 150px; + input,select { + width: 6em; @include media($phone) { width: 100%; @@ -38,6 +38,7 @@ .stats { flex: 0 1; + position: relative; @include media($phone) { table { @@ -68,5 +69,21 @@ #stat-f-s:after {content: "Hz"} #stat-i-peak:after {content: "mA"} #stat-i-rms:after {content: "mA"} + + // auto reload box + .ar { + position: absolute; + bottom:dist(-2); + width:100%; + text-align: center; + + input[type=number] { + width: 4em; + } + + input[type=button] { + margin-left: dist(-2); + } + } } } diff --git a/html_src/page_layout.php b/html_src/x_page_layout.php similarity index 100% rename from html_src/page_layout.php rename to html_src/x_page_layout.php diff --git a/libesphttpd/include/httpd.h b/libesphttpd/include/httpd.h index 8c563f2..7224ed4 100644 --- a/libesphttpd/include/httpd.h +++ b/libesphttpd/include/httpd.h @@ -3,7 +3,7 @@ #include -#define HTTPDVER "0.4" +#define HTTPDVER "0.4-based" #define HTTPD_CGI_MORE 0 #define HTTPD_CGI_DONE 1 diff --git a/libesphttpd/include/logging.h b/libesphttpd/include/logging.h index 01b1fc6..8cc999b 100644 --- a/libesphttpd/include/logging.h +++ b/libesphttpd/include/logging.h @@ -20,7 +20,7 @@ do { \ printf(LOG_EOL "\x1b[32;1m"); \ uptime_print(); \ - printf(" [i] "fmt"\x1b[0m" LOG_EOL, ##__VA_ARGS__); \ + printf(" [i] "fmt"\x1b[0m" LOG_EOL LOG_EOL, ##__VA_ARGS__); \ } while(0) diff --git a/user/fw_version.h b/user/fw_version.h new file mode 100644 index 0000000..71ce838 --- /dev/null +++ b/user/fw_version.h @@ -0,0 +1,6 @@ +#ifndef FW_VERSION_H +#define FW_VERSION_H + +#define FIRMWARE_VERSION "0.1.1" + +#endif // FW_VERSION_H diff --git a/user/page_about.c b/user/page_about.c new file mode 100644 index 0000000..19aefe6 --- /dev/null +++ b/user/page_about.c @@ -0,0 +1,35 @@ +#include +#include +#include "page_about.h" +#include "fw_version.h" +#include "sbmp.h" + +/** "About" page */ +int FLASH_FN tplAbout(HttpdConnData *connData, char *token, void **arg) +{ + // arg is unused + (void)arg; + + if (token == NULL) return HTTPD_CGI_DONE; + + if (streq(token, "vers_fw")) { + httpdSend(connData, FIRMWARE_VERSION, -1); + + } else if (streq(token, "date")) { + httpdSend(connData, __DATE__, -1); + + } else if (streq(token, "time")) { + httpdSend(connData, __TIME__, -1); + + } else if (streq(token, "vers_httpd")) { + httpdSend(connData, HTTPDVER, -1); + + } else if (streq(token, "vers_sbmp")) { + httpdSend(connData, SBMP_VER, -1); + + } else if (streq(token, "vers_sdk")) { + httpdSend(connData, STR(ESP_SDK_VERSION), -1); + } + + return HTTPD_CGI_DONE; +} diff --git a/user/page_about.h b/user/page_about.h new file mode 100644 index 0000000..db47f99 --- /dev/null +++ b/user/page_about.h @@ -0,0 +1,8 @@ +#ifndef PAGE_ABOUT_H +#define PAGE_ABOUT_H + +#include + +int tplAbout(HttpdConnData *connData, char *token, void **arg); + +#endif // PAGE_ABOUT_H diff --git a/user/routes.c b/user/routes.c index 61e7a9a..bafd609 100644 --- a/user/routes.c +++ b/user/routes.c @@ -12,6 +12,7 @@ // user files #include "page_status.h" #include "page_waveform.h" +#include "page_about.h" #define WIFI_PROTECT 0 @@ -45,8 +46,13 @@ HttpdBuiltInUrl builtInUrls[] = { ROUTE_TPL_FILE("/api/status.json", tplSystemStatus, "/json/status.tpl"), + // About + ROUTE_TPL_FILE("/about", tplAbout, "/pages/about.tpl"), + // Waveform page - ROUTE_FILE("/waveform", "/pages/waveform.html"), // static file, html -> can use gzip + ROUTE_FILE("/waveform", "/pages/wfm.html"), // static file, html -> can use gzip + // FFT + ROUTE_FILE("/fft", "/pages/fft.html"), // static file, html -> can use gzip ROUTE_TPL_FILE("/api/raw.json", tplWaveformJSON, "/json/samples.tpl"), ROUTE_TPL_FILE("/api/fft.json", tplFourierJSON, "/json/samples.tpl"), diff --git a/user/user_main.c b/user/user_main.c index e87b25a..4b368b6 100644 --- a/user/user_main.c +++ b/user/user_main.c @@ -21,6 +21,7 @@ #include "datalink.h" #include "uptime.h" #include "routes.h" +#include "fw_version.h" extern HttpdBuiltInUrl builtInUrls[]; @@ -80,11 +81,14 @@ void user_init(void) serialInit(); uptime_timer_init(); - banner("*** ESP8266 starting ***"); + banner("*** AC current analyser - WiFi module ***"); + info("(c) Ondrej Hruska, 2016"); + info("Katedra mereni FEL CVUT"); + info(""); + info("Version "FIRMWARE_VERSION", built "__DATE__" at "__TIME__); info("HTTPD v."HTTPDVER", SBMP v."SBMP_VER", IoT SDK v."STR(ESP_SDK_VERSION)); printf(LOG_EOL); - // reset button etc ioInit();