Browse Source

Better timezone handling; upload helper scripts

H. Peter Anvin 2 years ago
parent
commit
99c9b0ccc3

+ 1 - 0
.gitignore

@@ -32,3 +32,4 @@ fpga/output_files/*.htm
 fpga/output_files/*.htm_files/
 fpga/output_files/*.htm_files/
 tools/gnu/
 tools/gnu/
 version.*
 version.*
+!*.sed

+ 7 - 8
Makefile

@@ -23,18 +23,13 @@ $(SUBDIRS):
 version.mk:
 version.mk:
 	if [ -d '$(GIT_DIR)' ]; then \
 	if [ -d '$(GIT_DIR)' ]; then \
 	    TZ=UTC0 git log -n 1 --date=local --abbrev=8 \
 	    TZ=UTC0 git log -n 1 --date=local --abbrev=8 \
-		--pretty='format:COMMIT_VERSION=$(PROJECT)-%(describe:abbrev=6)%nCOMMIT_ID=%H%nCOMMIT_MAGIC=0x%h%nCOMMIT_DATE=%cd UTC%n' > $@.tmp ; \
+		--pretty='format:COMMIT_VERSION=$(PROJECT)-%(describe:abbrev=6)%nCOMMIT_ID=%H%nCOMMIT_MAGIC=%h%nCOMMIT_DATE=%cd UTC%n' > $@.tmp ; \
 		if cmp -q '$@' '$@.tmp' 2>/dev/null; then \
 		if cmp -q '$@' '$@.tmp' 2>/dev/null; then \
 			rm -f $@.tmp; else mv -f $@.tmp $@; fi \
 			rm -f $@.tmp; else mv -f $@.tmp $@; fi \
 	fi
 	fi
 
 
-version.h: version.mk
-	sed -e 's/^/#define /' -e 's/=/ "/' -e 's/$$/"/' \
-		-e '/ COMMIT_MAGIC /s/"//g' < $< > $@
-
-version.vh: version.mk
-	sed -e 's/^/`define /' -e 's/=/ "/' -e 's/$$/"/' \
-		-e '/ COMMIT_MAGIC /s/"//g' < $< > $@
+version.%: version.mk version.%.sed
+	sed -f $@.sed $< > $@
 
 
 $(SUBDIRS): version.mk
 $(SUBDIRS): version.mk
 
 
@@ -66,3 +61,7 @@ program-% flash-%: prefpga
 upload-esp:
 upload-esp:
 	$(MAKE) -C esp32 upload
 	$(MAKE) -C esp32 upload
 
 
+# Update via HTTP
+ip=max80
+upload-%:
+	curl -v --data-binary @fpga/output/$*.fw http://$(ip)/sys/fwupdate

+ 1 - 0
esp32/.gitignore

@@ -4,6 +4,7 @@
 *.zip
 *.zip
 applet/
 applet/
 build/
 build/
+cache/
 *.bootloader.bin
 *.bootloader.bin
 *.partitions.bin
 *.partitions.bin
 *.elf
 *.elf

+ 3 - 5
esp32/max80/config.c

@@ -8,6 +8,7 @@
 
 
 static const char * const default_config[] = {
 static const char * const default_config[] = {
     "TZ=CET-1CEST,M3.5.0,M10.5.0/3", /* Sweden */
     "TZ=CET-1CEST,M3.5.0,M10.5.0/3", /* Sweden */
+    "tzname=Europe/Stockholm",
     "hostname=max80",
     "hostname=max80",
     "sntp.enabled=on",
     "sntp.enabled=on",
     "sntp.server=time.max80.abc80.org",
     "sntp.server=time.max80.abc80.org",
@@ -274,11 +275,8 @@ bool getenv_bool(const char *var)
     unsigned char c = *var;
     unsigned char c = *var;
     unsigned char cl = c | 0x20;
     unsigned char cl = c | 0x20;
 
 
-    if (!c || c == '0' || cl == 'f' || cl == 'n' ||
-	cl == 'o' && (var[1] | 0x20) == 'f')
-	return false;
-    else
-	return true;
+    return !(!c || c == '0' || cl == 'f' || cl == 'n' || cl == 'd' ||
+	     (cl == 'o' && (var[1] | 0x20) == 'f'));
 }
 }
 
 
 void setenv_bool(const char *var, bool val)
 void setenv_bool(const char *var, bool val)

BIN
esp32/output/max80.ino.bin


+ 31 - 30
esp32/www/config.html

@@ -17,14 +17,14 @@
 	</div>
 	</div>
 	<div>
 	<div>
 	  <label for="wifi.psk">Network password (PSK):</label>
 	  <label for="wifi.psk">Network password (PSK):</label>
-	  <input class="mono" type="password" id="wifi.psk" name="wifi.psk" size="50" />
+	  <input class="mono" type="password" id="wifi.psk" name="wifi.psk" />
 	  <button type="button" class="show" onclick="showpwd('wifi.psk',this)"><span class="show">show</span><span class="hide">hide</span></button>
 	  <button type="button" class="show" onclick="showpwd('wifi.psk',this)"><span class="show">show</span><span class="hide">hide</span></button>
 	</div>
 	</div>
       </fieldset>
       </fieldset>
       <fieldset class="datetime">
       <fieldset class="datetime">
 	<legend>Date and Time</legend>
 	<legend>Date and Time</legend>
 	<div>
 	<div>
-	  <label for="tz">Timezone configuration:</label>
+	  <label for="tz">Time zone:</label>
 	  <select id="tzname" name="tzname" onchange="tzn(event,'tz')">
 	  <select id="tzname" name="tzname" onchange="tzn(event,'tz')">
 	  </select>
 	  </select>
 	  <input type="text" id="tz" name="TZ" oninput="tzt(event,'tzname')" />
 	  <input type="text" id="tz" name="TZ" oninput="tzt(event,'tzname')" />
@@ -45,40 +45,41 @@
       <button class="submit" type="submit" disabled>Update configuration</button>
       <button class="submit" type="submit" disabled>Update configuration</button>
     </form>
     </form>
     <script>
     <script>
-      fetchconfig('tz.txt').then(map => {
-	  var elem = getelem('tzname');
-	  var grp = elem;
-	  map.set('',''); map.set('UTC','UTC0');
-	  var zones = Array.from(map.keys());
-	  zones = zones.filter(v => v && v != 'UTC').sort();
-	  zones.unshift('','UTC');
-	  for (const z of zones) {
-	      const zz = z.match(/^(?:(\S+?)\/)?(\S*)$/,z);
-	      if (!zz) { continue; }
-	      if (zz[1] && zz[1] != grp.label) {
-		  grp = document.createElement('OPTGROUP');
-		  grp.label = zz[1];
-		  grp.classList.add('tz.'+zz[1]);
-		  elem.append(grp);
-	      } else if (!zz[1]) {
-		  grp = elem;
-	      }
-	      var opt = document.createElement('OPTION');
-	      opt.value = z;
-	      opt.classList.add('tz.'+z.replaceAll('/','.'));
-	      opt.classList.add('tz.'+zz[2].replaceAll('/','.'));
-	      opt.label = zz[2].replaceAll('_',' ').replaceAll('/',': ');
-	      opt.dataset.tz = map.get(z);
-	      grp.append(opt);
-	  }
-      });
       function tzn(e,p) {
       function tzn(e,p) {
 	  var tz = e.target.selectedOptions[0].dataset.tz;
 	  var tz = e.target.selectedOptions[0].dataset.tz;
 	  if (tz) { getelem(p).value = tz; }
 	  if (tz) { getelem(p).value = tz; }
       }
       }
       function tzt(e,p) { getelem(p).value = ''; }
       function tzt(e,p) { getelem(p).value = ''; }
+      fetchconfig('tz.txt')
+    .then(map => {
+	function cln(z) { return ('tz/'+z).replaceAll('/','_ ')
+			  .replaceAll(/[^\w ]+/g,'-'); }
+	var elem = getelem('tzname');
+	var grp = elem;
+	map.set('',''); map.set('UTC','UTC0');
+	var zones = Array.from(map.keys());
+	zones = zones.filter(v => v && v != 'UTC').sort();
+	zones.unshift('','UTC');
+	for (const z of zones) {
+	    const zz = z.match(/^(?:(\S+?)\/)?(\S*)$/,z);
+	    if (!zz) { continue; }
+	    if (zz[1] && zz[1] != grp.label) {
+		grp = document.createElement('OPTGROUP');
+		grp.label = zz[1];
+		grp.className = cln(zz[1]);
+		elem.append(grp);
+	    } else if (!zz[1]) {
+		grp = elem;
+	    }
+	    const pz = zz[2].replaceAll('_',' ').replaceAll('/',': ');
+	    var opt = new Option(pz, z);
+	    opt.className = cln(z);
+	    opt.dataset.tz = map.get(z);
+	    grp.append(opt);
+	}
+    })
+    .finally(() => {loadform('setconfig','sys/getconfig')});
     </script>
     </script>
-    <script>loadform('setconfig','sys/getconfig')</script>
     <script>translate()</script>
     <script>translate()</script>
   </body>
   </body>
 </html>
 </html>

+ 1 - 1
esp32/www/lang/sv

@@ -14,7 +14,7 @@ title.update=MAX80: Uppdatera
 "label[for='wifi.ssid']"=Nätverksnamn (SSID):
 "label[for='wifi.ssid']"=Nätverksnamn (SSID):
 "label[for='wifi.psk']"=Lösenord (PSK):
 "label[for='wifi.psk']"=Lösenord (PSK):
 .datetime legend=Datum och tid
 .datetime legend=Datum och tid
-"label[for='TZ']"=Tidszonsbeskrivning (POSIX):
+"label[for='tz']"=Tidszon:
 "label[for='sntp.enabled']"=Synkronisera tid från nätet (NTP):
 "label[for='sntp.enabled']"=Synkronisera tid från nätet (NTP):
 "label[for='sntp.server']"=NTP-server:
 "label[for='sntp.server']"=NTP-server:
 "label[for='ip4.dhcp.nosntp']"=Använd ej NTP-server från DHCP:
 "label[for='ip4.dhcp.nosntp']"=Använd ej NTP-server från DHCP:

+ 3 - 0
esp32/www/max80.css

@@ -94,6 +94,9 @@ input[type=file] {
     font-family: "arial", "sans-serif";
     font-family: "arial", "sans-serif";
     font-size: 80%;
     font-size: 80%;
 }
 }
+select#tzname {
+    margin-right: 1px;
+}
 button.show, button.hide {
 button.show, button.hide {
     width: 6ch;
     width: 6ch;
     padding: 0;
     padding: 0;

+ 6 - 5
esp32/www/max80.js

@@ -33,12 +33,13 @@ function initform(form,map) {
     form = getelem(form);
     form = getelem(form);
 
 
     for (var field of form.elements) {
     for (var field of form.elements) {
-	if ((field instanceof HTMLInputElement ||
-	     field instanceof HTMLSelectElement) &&
+	if (((field instanceof HTMLInputElement) ||
+	     (field instanceof HTMLSelectElement)) &&
 	    !field.classList.contains("noload")) {
 	    !field.classList.contains("noload")) {
-	    const val = map.get(field.name) || '';
-	    if (field.type == 'checkbox') {
-		const checked = !val.match(/^(0*|[fn].*|of.*)$/i);
+	    const val = map.get(field.name);
+	    if (val == null) {
+	    } else if (field.type == 'checkbox') {
+		const checked = !val.match(/^(0*|[fnd].*|of.*)$/i);
 		field.checked = checked;
 		field.checked = checked;
 		field.value = '1';
 		field.value = '1';
 	    } else if (field.type == 'radio') {
 	    } else if (field.type == 'radio') {

+ 3 - 3
fpga/max80.qpf

@@ -19,15 +19,15 @@
 #
 #
 # Quartus Prime
 # Quartus Prime
 # Version 21.1.0 Build 842 10/21/2021 SJ Lite Edition
 # Version 21.1.0 Build 842 10/21/2021 SJ Lite Edition
-# Date created = 01:22:16  May 03, 2022
+# Date created = 18:36:58  May 04, 2022
 #
 #
 # -------------------------------------------------------------------------- #
 # -------------------------------------------------------------------------- #
 
 
 QUARTUS_VERSION = "21.1"
 QUARTUS_VERSION = "21.1"
-DATE = "01:22:16  May 03, 2022"
+DATE = "18:36:58  May 04, 2022"
 
 
 # Revisions
 # Revisions
 
 
-PROJECT_REVISION = "v2"
 PROJECT_REVISION = "v1"
 PROJECT_REVISION = "v1"
+PROJECT_REVISION = "v2"
 PROJECT_REVISION = "bypass"
 PROJECT_REVISION = "bypass"

BIN
fpga/output/bypass.rbf.gz


BIN
fpga/output/bypass.rpd.gz


BIN
fpga/output/bypass.sof


BIN
fpga/output/bypass.svf.gz


BIN
fpga/output/bypass.xsvf.gz


BIN
fpga/output/v1.fw


BIN
fpga/output/v1.jic


BIN
fpga/output/v1.rbf.gz


BIN
fpga/output/v1.rpd.gz


BIN
fpga/output/v1.sof


BIN
fpga/output/v1.svf.gz


BIN
fpga/output/v1.xsvf.gz


BIN
fpga/output/v2.fw


BIN
fpga/output/v2.jic


BIN
fpga/output/v2.rbf.gz


BIN
fpga/output/v2.rpd.gz


BIN
fpga/output/v2.sof


BIN
fpga/output/v2.svf.gz


BIN
fpga/output/v2.xsvf.gz


+ 1 - 1
rv32/Makefile

@@ -35,7 +35,7 @@ gendeps   = -MD -MF $(@D)/.$(@F).d -MT $@
 genhdrs = iodevs.h irqtable.h
 genhdrs = iodevs.h irqtable.h
 gensrcs =
 gensrcs =
 
 
-all: sram.bin jtagupd.bin dram.bin.gz dram.hex checksum.h
+all: sram.bin jtagupd.bin dram.bin dram.hex checksum.h
 
 
 LIBS    = max80.a fatfs.a zlib.a
 LIBS    = max80.a fatfs.a zlib.a
 
 

+ 6 - 0
version.h.sed

@@ -0,0 +1,6 @@
+/^COMMIT_MAGIC=/s/=/ 0x/
+t def
+s/=/ "/
+s/$/"/
+: def
+s/^/#define /

+ 6 - 0
version.vh.sed

@@ -0,0 +1,6 @@
+/^COMMIT_MAGIC=/s/=/ 32'h/
+t def
+s/=/ "/
+s/$/"/
+: def
+s/^/`define /