232 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html>
 | |
| <html lang="en">
 | |
| <head>
 | |
|     <title>WLED frame rate test tool</title>
 | |
|     <style>
 | |
|         body {
 | |
|             background-color: #222;
 | |
|             color: #fff;
 | |
|             font-family: Helvetica, Verdana, sans-serif;
 | |
|         }
 | |
|         input {
 | |
|             background-color: #333;
 | |
|             color: #fff;
 | |
|         }
 | |
|         #ip {
 | |
|             width: 100px;
 | |
|         }
 | |
|         #secs {
 | |
|             width: 36px;
 | |
|         }
 | |
|         #csva {
 | |
|             position: absolute;
 | |
|             top: -100px; /*gtfo*/
 | |
|         }
 | |
|         button {
 | |
|             background-color: #333;
 | |
|             color: #fff;
 | |
|         }
 | |
|         table, th, td {
 | |
|             border: 1px solid #aaa;
 | |
|             border-collapse: collapse;
 | |
|             text-align: center;
 | |
|         }
 | |
|         .red {
 | |
|             color: #d20;
 | |
|         }
 | |
|     </style>
 | |
|     <script>
 | |
|         var gotfx = false, running = false;
 | |
|         var pos = 0, prev = 0, min = 999, max = 0, fpslist = [], names = [], names_checked = [];
 | |
|         var to;
 | |
|         function S() {
 | |
|             document.getElementById('ip').value = localStorage.getItem('locIpFps');
 | |
|             if (document.getElementById('ip').value) req(false);
 | |
|         }
 | |
|         function loadC() {
 | |
|             hide(false);
 | |
|             var list = localStorage.getItem('fpsFxSelection');
 | |
|             if (!list) return;
 | |
|             list = JSON.parse(list);
 | |
|             var chks = document.querySelectorAll('.fxcheck');
 | |
|             for (let i = 0; i < chks.length; i++) {
 | |
|                if (i < list.length) chks[i].checked = list[i];
 | |
|             }
 | |
|         }
 | |
|         function saveC() {
 | |
|             var list = [];
 | |
|             var chks = document.querySelectorAll('.fxcheck');
 | |
|             for (let i = 0; i < chks.length; i++) {
 | |
|                 list.push(chks[i].checked);
 | |
|             }
 | |
|             localStorage.setItem('fpsFxSelection', JSON.stringify(list));
 | |
|         }
 | |
|         function setC(c) {
 | |
|             hide(false);
 | |
|             var chks = document.querySelectorAll('.fxcheck');
 | |
|             for (let i = 0; i < chks.length; i++) {
 | |
|                 chks[i].checked = (c == 255);
 | |
|             }
 | |
|             if (c == 1 && chks.length > 100) {
 | |
|                 chks[1].checked = true;  //Blink
 | |
|                 chks[15].checked = true; //Running
 | |
|                 chks[16].checked = true; //Saw
 | |
|                 chks[37].checked = true; //Running 2
 | |
|                 chks[44].checked = true; //Tetrix
 | |
|                 chks[63].checked = true; //Pride 2015
 | |
|                 chks[74].checked = true; //Colortwinkles
 | |
|                 chks[101].checked = true;//Pacifica
 | |
|             }
 | |
|         }
 | |
|         function hide(h) {
 | |
|             var trs = document.querySelectorAll('.trs');
 | |
|             var chks = document.querySelectorAll('.fxcheck');
 | |
|             for (let i = 0; i < trs.length; i++) {
 | |
|                 trs[i].style.display = (h && !chks[i].checked) ? "none":"table-row";
 | |
|             }
 | |
|         }
 | |
|         function run(init) {
 | |
|             if (init) {
 | |
|                 running = !running;
 | |
|                 document.getElementById('runbtn').innerText = running ? 'Stop':'Run';
 | |
|                 if (running) {pos = 0; prev = -1; min = 999; max = 0; fpslist = []; names_checked = []; hide(true);}
 | |
|                 clearTimeout(to);
 | |
|                 if (!running) {req({seg:{fx:0},v:true,stop:true}); return;}
 | |
|             }
 | |
|             if (!gotfx) {req(false); return;}
 | |
|             var chks = document.querySelectorAll('.fxcheck');
 | |
|             var fpsb = document.querySelectorAll('.fps');
 | |
|             if (prev >= 0) {pos++};
 | |
|             if (pos >= chks.length) {run(true); return;} //end
 | |
|             while (!chks[pos].checked) {
 | |
|                 fpsb[pos].innerText = "-";
 | |
|                 pos++;
 | |
|                 if (pos >= chks.length) {run(true); return;} //end
 | |
|             }
 | |
|             names_checked.push(names[pos]);
 | |
|             var extra = {};
 | |
|             try {
 | |
|                 extra = JSON.parse(document.getElementById('ej').value);
 | |
|             } catch (e) {
 | |
| 
 | |
|             }
 | |
|             var cmd = {seg:{fx:pos},v:true};
 | |
|             Object.assign(cmd, extra);
 | |
|             req(cmd);
 | |
|         }
 | |
|         function req(command) {
 | |
|             var ip = document.getElementById('ip').value;
 | |
|             if (!ip) {alert("Please enter WLED IP"); return;}
 | |
|             if (ip != localStorage.getItem('locIpFps')) localStorage.setItem('locIpFps', document.getElementById('ip').value);
 | |
|             var url = command ? `http://${ip}/json/si` : `http://${ip}/json/effects`;
 | |
|             var type = command ? 'post':'get';
 | |
|             var req = undefined;
 | |
|             if (command)
 | |
|             {
 | |
|                 req = JSON.stringify(command);
 | |
|             }
 | |
|             fetch
 | |
|             (url, {
 | |
|                 method: type,
 | |
|                 headers: {
 | |
|                     "Content-type": "application/json; charset=UTF-8"
 | |
|                 },
 | |
|                 body: req
 | |
|             })
 | |
|             .then(res => {
 | |
|                 if (!res.ok) {
 | |
|                     alert('Data malfunction');
 | |
|                 }
 | |
|                 return res.json();
 | |
|             })
 | |
|             .then(json => {
 | |
|                 if (!json) {
 | |
|                     alert('Empty response'); return;
 | |
|                 }
 | |
|                 if (!command) {
 | |
|                     names = json;
 | |
|                     var tblc = '';
 | |
|                     for (let i = 0; i < json.length; i++) {
 | |
| 		                tblc += `<tr class="trs"><td><input type="checkbox" class="fxcheck" /></td><td>${i}</td><td>${json[i]}</td><td class="fps"></td></tr>`
 | |
| 	                }
 | |
|                     var tbl = `<table>
 | |
|                         <tr>
 | |
|                             <th>Test?</th><th>ID</th><th>Effect Name</th><th>FPS</th>
 | |
|                         </tr>
 | |
|                         ${tblc}
 | |
|                     </table>`;
 | |
|                     document.getElementById('tablecon').innerHTML = tbl;
 | |
|                     setC(1);
 | |
|                     loadC();
 | |
|                     gotfx = true;
 | |
|                     document.getElementById('runbtn').innerText = "Run";
 | |
|                 } else {
 | |
|                     if (!json.info) return;
 | |
|                     document.getElementById('leds').innerText = json.info.leds.count;
 | |
|                     document.getElementById('seg').innerText = json.state.seg[0].len;
 | |
|                     document.getElementById('bri').innerText = json.state.bri;
 | |
|                     if (prev >= 0) {
 | |
|                         var lastfps = parseInt(json.info.leds.fps); //previous FX
 | |
|                         if (lastfps < min) min = lastfps;
 | |
|                         if (lastfps > max) max = lastfps;
 | |
|                         fpslist.push(lastfps);
 | |
|                         var sum = 0;
 | |
|                         for (let i = 0; i < fpslist.length; i++) {
 | |
|                             sum += fpslist[i];
 | |
|                         }
 | |
|                         sum /= fpslist.length;
 | |
|                         document.getElementById('fps_min').innerText = min;
 | |
|                         document.getElementById('fps_max').innerText = max;
 | |
|                         document.getElementById('fps_avg').innerText = Math.round(sum*10)/10;
 | |
|                         var fpsb = document.querySelectorAll('.fps');
 | |
|                         fpsb[prev].innerHTML = lastfps;
 | |
|                     }
 | |
|                     prev = pos;
 | |
|                     var delay = parseInt(document.getElementById('secs').value)*1000;
 | |
|                     delay = Math.min(Math.max(delay, 2000), 15000)
 | |
|                     if (!command.stop) to = setTimeout(run,delay);
 | |
|                 }
 | |
|             })
 | |
|             .catch(function (error) {
 | |
| 		        alert('Comms malfunction');
 | |
| 		        console.log(error);
 | |
| 	        });
 | |
|         }
 | |
|         function csv(n) {
 | |
|             var txt = "";
 | |
|             for (let i = 0; i < fpslist.length; i++) {
 | |
|                 if (!n) txt += names_checked[i] + ',';
 | |
|                 txt += fpslist[i]; txt += "\n";
 | |
|             }
 | |
|             document.getElementById('csva').value = txt;
 | |
|             var copyText = document.getElementById('csva');
 | |
| 
 | |
|             copyText.select();
 | |
|             copyText.setSelectionRange(0, 999999);
 | |
|             document.execCommand("copy");
 | |
|         }
 | |
|     </script>
 | |
| </head>
 | |
| <body onload="S()">
 | |
|     <h2>Starship monitoring dashboard</h2>
 | |
|     (or rather just a WLED frame rate tester lol)<br><br>
 | |
|     IP: <input id="ip" /><br>
 | |
|     Time per effect: <input type=number id=secs value=5 max=15 min=2 />s<br>
 | |
|     Effects to test:
 | |
|     <button type="button" onclick="setC(255)">All</button>
 | |
|     <button type="button" onclick="setC(1)">Selection 1</button>
 | |
|     <button type="button" onclick="setC(0)">None</button>
 | |
|     <button type="button" onclick="loadC()">Get LS</button>
 | |
|     <button type="button" class="red" onclick="saveC()">Save to LS</button><br>
 | |
|     Extra JSON: <input id="ej" /><br>
 | |
| 
 | |
|     <button type="button" onclick="run(true)" id="runbtn">Fetch FX list</button><br>
 | |
|     LEDs: <span id="leds">-</span>, Seg: <span id="seg">-</span>, Bri: <span id="bri">-</span><br>
 | |
|     FPS min: <span id="fps_min">-</span>, max: <span id="fps_max">-</span>, avg: <span id="fps_avg">-</span><br><br>
 | |
|     <div id="tablecon">
 | |
|     </div><br>
 | |
|     <button type="button" onclick="csv(false)">Copy csv to clipboard</button>
 | |
|     <button type="button" onclick="csv(true)">Copy csv (FPS only)</button>
 | |
|     <textarea id=csva></textarea>
 | |
| </body>
 | |
| </html> | 
