[] skyspy: Create formatting library, and use it where suitable.

master
Pavel Machek 2024-06-22 23:20:47 +02:00
parent 6eaad6f13a
commit 1fa0c219e3
1 changed files with 96 additions and 73 deletions

View File

@ -1,74 +1,97 @@
/* Sky spy */ /* Sky spy */
let fmt = {
icon_alt : "\0\x08\x1a\1\x00\x00\x00\x20\x30\x78\x7C\xFE\xFF\x00\xC3\xE7\xFF\xDB\xC3\xC3\xC3\xC3\x00\x00\x00\x00\x00\x00\x00\x00",
icon_m : "\0\x08\x1a\1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xC3\xE7\xFF\xDB\xC3\xC3\xC3\xC3\x00\x00\x00\x00\x00\x00\x00\x00",
icon_km : "\0\x08\x1a\1\xC3\xC6\xCC\xD8\xF0\xD8\xCC\xC6\xC3\x00\xC3\xE7\xFF\xDB\xC3\xC3\xC3\xC3\x00\x00\x00\x00\x00\x00\x00\x00",
icon_kph : "\0\x08\x1a\1\xC3\xC6\xCC\xD8\xF0\xD8\xCC\xC6\xC3\x00\xC3\xE7\xFF\xDB\xC3\xC3\xC3\xC3\x00\xFF\x00\xC3\xC3\xFF\xC3\xC3",
icon_c : "\0\x08\x1a\1\x00\x00\x60\x90\x90\x60\x00\x7F\xFF\xC0\xC0\xC0\xC0\xC0\xFF\x7F\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
let libgps = {
emulator: -1,
init: function(x) {
this.emulator = (process.env.BOARD=="EMSCRIPTEN"
|| process.env.BOARD=="EMSCRIPTEN2")?1:0;
},
state: {},
/* 0 .. DD.ddddd /* 0 .. DD.ddddd
1 .. DD MM.mmm' 1 .. DD MM.mmm'
2 .. DD MM'ss" 2 .. DD MM'ss"
*/ */
mode: 1, geo_mode : 1,
format: function(x) {
switch (this.mode) {
case 0:
return "" + x;
case 1: {
let d = Math.floor(x);
let m = x - d;
m = m*60;
return "" + d + " " + m.toFixed(3) + "'";
}
case 2: {
let d = Math.floor(x);
let m = x - d;
m = m*60;
let mf = Math.floor(m);
let s = m - mf;
s = s*60;
return "" + d + " " + mf + "'" + s.toFixed(0) + '"';
}
}
return "bad mode?";
},
on_gps: function(f) {
let fix = this.getGPSFix();
f(fix);
/* init: function() {},
"lat": number, // Latitude in degrees fmtDist: function(km) { return km.toFixed(1) + this.icon_km; },
"lon": number, // Longitude in degrees fmtSteps: function(n) { return fmtDist(0.001 * 0.719 * n); },
"alt": number, // altitude in M fmtAlt: function(m) { return m.toFixed(0) + this.icon_alt; },
"speed": number, // Speed in kph fmtTimeDiff: function(d) {
"course": number, // Course in degrees if (d < 180)
"time": Date, // Current Time (or undefined if not known) return ""+d.toFixed(0);
"satellites": 7, // Number of satellites d = d/60;
"fix": 1 // NMEA Fix state - 0 is no fix return ""+d.toFixed(0)+"m";
"hdop": number, // Horizontal Dilution of Precision },
*/ fmtAngle: function(x) {
this.state.timeout = setTimeout(this.on_gps, 1000, f); switch (this.geo_mode) {
}, case 0:
off_gps: function() { return "" + x;
clearTimeout(gps_state.timeout); case 1: {
}, let d = Math.floor(x);
getGPSFix: function() { let m = x - d;
if (!this.emulator) m = m*60;
return Bangle.getGPSFix(); return "" + d + " " + m.toFixed(3) + "'";
let fix = {}; }
fix.fix = 1; case 2: {
fix.lat = 50; let d = Math.floor(x);
fix.lon = 14; let m = x - d;
fix.alt = 200; m = m*60;
fix.speed = 5; let mf = Math.floor(m);
fix.course = 30; let s = m - mf;
fix.time = Date(); s = s*60;
fix.satellites = 5; return "" + d + " " + mf + "'" + s.toFixed(0) + '"';
fix.hdop = 12; }
return fix; }
} return "bad mode?";
},
fmtPos: function(pos) {
return this.fmtAngle(pos.lat) + "\n" + this.fmtAngle(pos.lon);
},
};
let gps = {
emulator: -1,
init: function(x) {
this.emulator = (process.env.BOARD=="EMSCRIPTEN"
|| process.env.BOARD=="EMSCRIPTEN2")?1:0;
},
state: {},
on_gps: function(f) {
let fix = this.getGPSFix();
f(fix);
/*
"lat": number, // Latitude in degrees
"lon": number, // Longitude in degrees
"alt": number, // altitude in M
"speed": number, // Speed in kph
"course": number, // Course in degrees
"time": Date, // Current Time (or undefined if not known)
"satellites": 7, // Number of satellites
"fix": 1 // NMEA Fix state - 0 is no fix
"hdop": number, // Horizontal Dilution of Precision
*/
this.state.timeout = setTimeout(this.on_gps, 1000, f);
},
off_gps: function() {
clearTimeout(gps_state.timeout);
},
getGPSFix: function() {
if (!this.emulator)
return Bangle.getGPSFix();
let fix = {};
fix.fix = 1;
fix.lat = 50;
fix.lon = 14;
fix.alt = 200;
fix.speed = 5;
fix.course = 30;
fix.time = Date();
fix.satellites = 5;
fix.hdop = 12;
return fix;
}
}; };
var display = 0; var display = 0;
@ -109,13 +132,13 @@ function calcAlt(alt, cur_altitude) {
return ddalt; return ddalt;
} }
function updateGps() { function updateGps() {
let have = false, lat = "lat ", lon = "lon ", alt = "?", let have = false, lat = "lat ", alt = "?",
speed = "speed ", hdop = "?", adelta = "adelta ", speed = "speed ", hdop = "?", adelta = "adelta ",
tdelta = "tdelta "; tdelta = "tdelta ";
if (cancel_gps) if (cancel_gps)
return; return;
fix = libgps.getGPSFix(); fix = gps.getGPSFix();
if (adj_time) { if (adj_time) {
print("Adjusting time"); print("Adjusting time");
setTime(fix.time.getTime()/1000); setTime(fix.time.getTime()/1000);
@ -136,16 +159,15 @@ function updateGps() {
tdelta = "" + (getTime() - fix.time.getTime()/1000).toFixed(0); tdelta = "" + (getTime() - fix.time.getTime()/1000).toFixed(0);
} }
if (fix && fix.fix && fix.lat) { if (fix && fix.fix && fix.lat) {
lat = "" + libgps.format(fix.lat); lat = "" + fmt.fmtPos(fix);
lon = "" + libgps.format(fix.lon);
alt = "" + fix.alt.toFixed(0); alt = "" + fix.alt.toFixed(0);
adelta = "" + (cur_altitude - fix.alt).toFixed(0); adelta = "" + (cur_altitude - fix.alt).toFixed(0);
speed = "" + fix.speed.toFixed(1); speed = "" + fix.speed.toFixed(1);
hdop = "" + fix.hdop.toFixed(0); hdop = "" + fix.hdop.toFixed(0);
have = true; have = true;
} else { } else {
lat = "NO FIX "; lat = "NO FIX\n"
lon = "" + (getTime() - gps_start).toFixed(0) + "s " + "" + (getTime() - gps_start).toFixed(0) + "s "
+ sats_used + "/" + snum; + sats_used + "/" + snum;
if (cur_altitude) if (cur_altitude)
adelta = "" + cur_altitude.toFixed(0); adelta = "" + cur_altitude.toFixed(0);
@ -154,7 +176,7 @@ function updateGps() {
let ddalt = calcAlt(alt, cur_altitude); let ddalt = calcAlt(alt, cur_altitude);
let msg = ""; let msg = "";
if (display == 1) { if (display == 1) {
msg = lat + "\n" + lon + msg = lat +
"\ne" + hdop + "m "+tdelta+"s\n" + "\ne" + hdop + "m "+tdelta+"s\n" +
speed + "km/h\n"+ alt + "m+" + adelta + "\nmsghere"; speed + "km/h\n"+ alt + "m+" + adelta + "\nmsghere";
} }
@ -349,7 +371,8 @@ function touchHandler(d) {
nextScreen(); nextScreen();
} }
libgps.init(); gps.init();
fmt.init();
Bangle.on("drag", touchHandler); Bangle.on("drag", touchHandler);
Bangle.setUI({ Bangle.setUI({