Browse Source

www: UI for flashing the board revision from the web UI

HTML/JS/CSS for flashing the board revision. Backend not yet
implemented.
H. Peter Anvin 2 years ago
parent
commit
a5830eef50
5 changed files with 92 additions and 18 deletions
  1. 8 0
      esp32/www/max80.css
  2. 1 18
      esp32/www/status.html
  3. 16 0
      esp32/www/status.js
  4. 31 0
      esp32/www/update.html
  5. 36 0
      esp32/www/update.js

+ 8 - 0
esp32/www/max80.css

@@ -193,3 +193,11 @@ output {
 .wip p {
     flex: 1;
 }
+p.norev {
+    font-weight: 600;
+    font-size: 100%;
+    margin: 0 0;
+}
+.hidden {
+    display: none;
+}

+ 1 - 18
esp32/www/status.html

@@ -4,24 +4,7 @@
     <link rel="stylesheet" href="max80.css" />
     <title class="status">MAX80</title>
     <script src="max80.js"></script>
-    <script>
-      var ref_tmr = 0;
-      function ref_status(seti) {
-	  clearTimeout(ref_tmr);
-	  var rt = document.getElementById('refresh_time');
-	  const setintv = (seti && rt.checkValidity()) ? '?'+rt.value : '';
-	  fetchconfig('sys/getstatus' + setintv)
-	      .then((map) => initform('getstatus',map,true))
-	      .catch(err => {})
-	      .finally (() => {
-		  const when = parseInt(valval(rt)) * 1000;
-		  ref_tmr = setTimeout(ref_status, when);
-	      });
-	  fetchconfig('version')
-	      .then((map) => initform('getstatus',map,true))
-	      .catch(err => {});
-      }
-    </script>
+    <script src="status.js"></script>
   </head>
   <body>
     <x-inc src="head.html"></x-inc>

+ 16 - 0
esp32/www/status.js

@@ -0,0 +1,16 @@
+var ref_tmr = 0;
+function ref_status(seti) {
+    clearTimeout(ref_tmr);
+    var rt = document.getElementById('refresh_time');
+    const setintv = (seti && rt.checkValidity()) ? '?'+rt.value : '';
+    fetchconfig('sys/getstatus' + setintv)
+	.then((map) => initform('getstatus',map,true))
+	.catch(err => {})
+	.finally (() => {
+	    const when = parseInt(valval(rt)) * 1000;
+	    ref_tmr = setTimeout(ref_status, when);
+	});
+    fetchconfig('version')
+	.then((map) => initform('getstatus',map,true))
+	.catch(err => {});
+}

+ 31 - 0
esp32/www/update.html

@@ -8,10 +8,40 @@
   <body>
     <x-inc src="head.html"></x-inc>
     <h1 class="update">Update</h1>
+    <form id="boardid" action="sys/boardrev" method="post"
+	  onsubmit="uploadform()" data-ref="1" data-ref-url="update.html">
+      <fieldset>
+	<legend>Board Revision</legend>
+	<label class="unlock">
+	  <b>Unlock Programming</b>
+	  <input type="checkbox" name="unlock" id="unlock" onchange="bropen()">
+	</label>
+	<label class="boardid">
+	  <b>Board Revision</b>
+	  <select name="boardrevs" id="boardrevs" onchange="brn()" disabled>
+	    <option value="MAX80 v1">v1.0.0</option>
+	    <option value="MAX80 v2">v2.0.0</option>
+	    <option value="MAX80 v2.0.1">v2.0.1</option>
+	    <option class="other" value="MAX80 v">other...</option>
+	  </select>
+	  <input type="text" name="ver" id="ver" oninput="brt()" disabled />
+	</label>
+	<p id="warnrev" class="warnrev hidden">Be careful: the board
+	might fail to boot if the board revision is programmed
+	incorrectly. In that case, reflashing via USB/serial port will
+	be necessary.</p>
+	<button type="submit" id="setrev" disabled>Write to flash</button>
+      </fieldset>
+    </form>
     <form id="upload" action="sys/fwupdate" method="post"
 	  onsubmit="uploadform()" data-ref="10" data-ref-url="status.html">
       <fieldset class="fw">
 	<legend>Firmware</legend>
+	<p id="norev" class="norev hidden">
+	  BOARD REVISION NOT PROGRAMMED. YOU MUST PROGRAM THE BOARD
+	  REVISION BEFORE UPDATING THE FIRMWARE. MAKE SURE YOU KNOW
+	  WHAT REVISION YOUR BOARD IS BEFORE DOING SO.
+	</p>
 	<input type="file" name="file" hidden accept=".fw" onchange="uploadform()" />
 	<button type="submit" class="fromfile" id="upload.start"
 		onclick="sib(this,'input').value=''">Update from file</button>
@@ -28,6 +58,7 @@
 	  <li class="console">Check serial console for more detailed status messages</li>
 	</ol>
       </div>
+      <script src="update.js"></script>
     </form>
   </body>
 </html>

+ 36 - 0
esp32/www/update.js

@@ -0,0 +1,36 @@
+var hwver = '';
+function reven() {
+    dis = !getelem('unlock').checked || !hwver;
+    getelem('setrev').disabled = dis;
+}
+function brev(ver,dover = true) {
+    const bsel = getelem('boardrevs');
+    const other = bsel.querySelector('option.other').value;
+    hwver = ver && ver.match(/^MAX80 v(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))*( [a-zA-Z0-9]+)?$/) ? ver : '';
+    if (dover)
+	getelem('ver').value = ver == other ? ver : hwver;
+    bsel.value = hwver;
+    if (bsel.selectedOptions.length == 0)
+	bsel.value = other;
+    reven();
+}
+function brn() { brev(event.target.selectedOptions[0].value); }
+function brt() { brev(event.target.value,false); }
+function bropen(ul) {
+    ulchk = getelem('unlock');
+    ulchk.checked = ul = (ul == undefined) ? ulchk.checked : ul;
+    getelem('boardrevs').disabled = !ul;
+    getelem('ver').disabled = !ul;
+    getelem('warnrev').classList.toggle('hidden',!ul);
+    reven();
+}
+
+fetchconfig('sys/getstatus')
+    .then(map => brev(map.get('max80.hw.ver')))
+    .catch(err => brev(undefined))
+    .finally(() =>  {
+	norev = !hwver;
+	bropen(norev);
+	getelem('norev').classList.toggle('hidden',!norev);
+	getelem('upload.start').disabled = norev;
+    });