BangleApps/apps/gpsinfo/gps-info.js

171 lines
5.6 KiB
JavaScript
Raw Normal View History

2021-09-30 16:02:17 +00:00
function satelliteImage() {
return require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4AGnE4F1wvsF34wgFldcLdyMYsoACF1WJF4YxPFzOtF4wxNFzAvKSiIvU1ovIGAkJAAQucF5QxCFwYwbF4QwLrwvjYIVfrwABrtdq9Wqwvkq4oCAAtXmYvi1teE4NXrphCrxoCGAbvdSIoAHNQNeFzQvGeRQvCsowrYYNfF8YwHZQQFCF8QwGF4owjeYovBroHEMERhEF8IwNrtWryYFF8YwCq4vhGBeJF5AwaxIwKwVXFwwvandfMJeJF8M6nZiLGQIvdstfGAVlGBZkCxJeZJQIwCGIRjMFzYACGIc6r/+FsIvGGIYABEzYvPGQYvusovkAH4A/AH4A/ACo="));
}
2019-11-13 11:09:41 +00:00
2021-09-30 16:02:17 +00:00
var Layout = require("Layout");
var layout;
//Bangle.setGPSPower(1, "app");
E.showMessage(/*LANG*/"Waiting for GNS data..."); // avoid showing rubbish on screen
2019-11-13 11:09:41 +00:00
var lastFix = {
2021-09-30 16:02:17 +00:00
fix: -1,
2019-11-13 11:09:41 +00:00
alt: 0,
lat: 0,
lon: 0,
speed: 0,
2019-11-13 11:09:41 +00:00
time: 0,
satellites: 0
};
var SATinView = 0, lastSATinView = -1, nofGP = 0, nofBD = 0, nofGL = 0;
2022-01-18 10:44:31 +00:00
const leaveNofixLayout = 1; // 0 = stay on initial screen for debugging (default = 1)
var listenerGPSraw = 0;
var dataCounter = 0;
2019-11-13 11:09:41 +00:00
function formatTime(now) {
if (now == undefined) {
return "no GPS time available";
} else {
var fd = now.toUTCString().split(" ");
var time = fd[4].substr(0, 5);
var date = [fd[0], fd[1], fd[2]].join(" ");
return time + " - " + date;
}
2019-11-13 11:09:41 +00:00
}
function getMaidenHead(param1,param2){
var lat=-100.0;
var lon=0.0;
var U = 'ABCDEFGHIJKLMNOPQRSTUVWX';
var L = U.toLowerCase();
2019-11-13 11:09:41 +00:00
lat = param1;
lon = param2;
lon = lon + 180;
2021-09-30 16:02:17 +00:00
var t = lon/20;
2024-04-02 18:24:59 +00:00
const fLon = Math.floor(t);
t = (t % fLon)*10;
2024-04-02 18:24:59 +00:00
const sqLon = Math.floor(t);
2021-09-30 16:02:17 +00:00
t = (t-sqLon)*24;
2024-04-02 18:24:59 +00:00
const subLon = Math.floor(t);
const extLon = Math.floor((t-subLon)*10);
2021-09-30 16:02:17 +00:00
lat = lat + 90;
t = lat/10;
2024-04-02 18:24:59 +00:00
const fLat = Math.floor(t);
t = (t % fLat)*10;
2024-04-02 18:24:59 +00:00
const sqLat = Math.floor(t);
t=(t-sqLat)*24;
2024-04-02 18:24:59 +00:00
const subLat = Math.floor(t);
const extLat = Math.floor((t-subLat)*10);
return U[fLon]+U[fLat]+sqLon+sqLat+L[subLon]+L[subLat]+extLon+extLat;
}
2019-11-13 11:09:41 +00:00
function onGPS(fix) {
2023-01-15 14:46:54 +00:00
dataCounter++;
2021-09-30 16:02:17 +00:00
if (lastFix.fix != fix.fix) {
// if fix is different, change the layout
if (fix.fix && leaveNofixLayout) {
2021-09-30 16:02:17 +00:00
layout = new Layout( {
type:"v", c: [
{type:"txt", font:"6x8:2", label:"GPS Info" },
{type:"img", src:satelliteImage, pad:4 },
{type:"txt", font:"6x8", label:"", fillx:true, id:"alt" },
{type:"txt", font:"6x8", label:"", fillx:true, id:"lat" },
{type:"txt", font:"6x8", label:"", fillx:true, id:"lon" },
{type:"txt", font:"6x8", label:"", fillx:true, id:"speed" },
{type:"txt", font:"6x8", label:"", fillx:true, id:"time" },
{type:"txt", font:"6x8", label:"", fillx:true, id:"sat" },
{type:"txt", font:"6x8", label:"", fillx:true, id:"maidenhead" },
]},{lazy:true});
2021-09-30 16:02:17 +00:00
} else {
layout = new Layout( {
type:"v", c: [
{type:"txt", font:"6x8:2", label:"GPS Info" },
{type:"img", src:satelliteImage, pad:4 },
{type:"txt", font:"6x8", label:"Waiting for GPS fix" },
2021-09-30 16:02:17 +00:00
{type:"h", c: [
{type:"txt", font:"10%", label:fix.satellites, pad:2, id:"sat" },
{type:"txt", font:"6x8", pad:3, label:"Satellites used" }
2021-09-30 16:02:17 +00:00
]},
{type:"h", c: [
{type:"txt", font:"10%", label:dataCounter, pad:2, id:"dataCounter" },
{type:"txt", font:"6x8", pad:3, label:"packets received" }
]},
{type:"txt", font:"6x8", label:"", fillx:true, id:"progress" }
]},{lazy:false});
2021-09-30 16:02:17 +00:00
}
g.clearRect(0,24,g.getWidth(),g.getHeight());
2021-09-30 16:02:17 +00:00
layout.render();
}
if (fix.fix && leaveNofixLayout) {
if (listenerGPSraw == 1) {
Bangle.removeListener('GPS-raw', onGPSraw);
listenerGPSraw = 0;
lastSATinView = -1;
2022-01-18 10:44:31 +00:00
Bangle.buzz(50);
}
2021-09-30 16:02:17 +00:00
var locale = require("locale");
2019-11-13 11:09:41 +00:00
var satellites = fix.satellites;
2021-09-30 16:02:17 +00:00
var maidenhead = getMaidenHead(fix.lat,fix.lon);
layout.alt.label = "Altitude: "+locale.distance(fix.alt);
layout.lat.label = "Lat: "+fix.lat.toFixed(6);
layout.lon.label = "Lon: "+fix.lon.toFixed(6);
layout.speed.label = "Speed: "+locale.speed(fix.speed);
layout.time.label = "Time: "+formatTime(fix.time);
layout.sat.label = "Satellites: "+satellites;
layout.maidenhead.label = "Maidenhead: "+maidenhead;
layout.render();
2019-11-13 11:09:41 +00:00
} else {
if (fix.satelites != lastFix.satelites) {
layout.clear(layout.sat);
layout.sat.label = fix.satellites;
layout.render(layout.sat);
}
if (SATinView != lastSATinView) {
if (!leaveNofixLayout) SATinView = -1;
lastSATinView = SATinView;
layout.clear(layout.progress);
layout.progress.label = "in view GP/BD/GL: " + nofGP + " " + nofBD + " " + nofGL;
2022-01-18 10:44:31 +00:00
// console.log("in view GP/BD/GL: " + nofGP + " " + nofBD + " " + nofGL);
layout.render(layout.progress);
}
2023-01-15 16:09:09 +00:00
layout.clear(layout.dataCounter);
layout.dataCounter.label = dataCounter;
layout.render(layout.dataCounter);
2019-11-13 11:09:41 +00:00
}
if (listenerGPSraw == 0 && !fix.fix) {
setTimeout(() => Bangle.on('GPS-raw', onGPSraw), 10);
listenerGPSraw = 1;
}
lastFix = fix;
2019-11-13 11:09:41 +00:00
}
function onGPSraw(nmea) {
if (nmea.slice(3,6) == "GSV") {
// console.log(nmea.slice(1,3) + " " + nmea.slice(11,13));
if (nmea.slice(0,7) == "$GPGSV,") nofGP = Number(nmea.slice(11,13));
if (nmea.slice(0,7) == "$BDGSV,") nofBD = Number(nmea.slice(11,13));
if (nmea.slice(0,7) == "$GLGSV,") nofGL = Number(nmea.slice(11,13));
SATinView = nofGP + nofBD + nofGL;
}
}
2021-09-30 16:02:17 +00:00
Bangle.loadWidgets();
Bangle.drawWidgets();
2019-11-13 11:09:41 +00:00
Bangle.on('GPS', onGPS);
//Bangle.on('GPS-raw', onGPSraw);
Bangle.setGPSPower(1, "app");
2023-01-15 14:46:54 +00:00
function exitApp() {
load();
}
setWatch(_=>exitApp(), BTN1);
if (global.BTN2) {
setWatch(_=>exitApp(), BTN2);
setWatch(_=>exitApp(), BTN3);
}