GPS info update for Bangle 2

master
Gordon Williams 2021-09-30 17:02:17 +01:00
parent c5d7a73f4f
commit d0fd2f0172
3 changed files with 58 additions and 39 deletions

View File

@ -1124,9 +1124,9 @@
"id": "gpsinfo", "id": "gpsinfo",
"name": "GPS Info", "name": "GPS Info",
"icon": "gps-info.png", "icon": "gps-info.png",
"version":"0.04", "version":"0.05",
"description": "An application that displays information about altitude, lat/lon, satellites and time", "description": "An application that displays information about altitude, lat/lon, satellites and time",
"tags": "gps", "tags": "gps,b2",
"type": "app", "type": "app",
"storage": [ "storage": [
{"name":"gpsinfo.app.js","url": "gps-info.js"}, {"name":"gpsinfo.app.js","url": "gps-info.js"},

View File

@ -1,3 +1,4 @@
0.02: Ensure screen doesn't display garbage at startup 0.02: Ensure screen doesn't display garbage at startup
0.03: Show number of satellites while waiting for fix 0.03: Show number of satellites while waiting for fix
0.04: Add Maidenhead readout of GPS location 0.04: Add Maidenhead readout of GPS location
0.05: Refactor to use 'layout' library for multi-device support

View File

@ -1,11 +1,14 @@
var img = require("heatshrink").decompress(atob("mEwghC/AH4AKg9wC6t3u4uVC6wWBI6t3uJeVuMQCqcBLisAi4XLxAABFxAXKgc4DBAuBRhQXEDAq7MmYXEwBHEXZYXFGAOqAAKDMmczC4mIC62CC50PC4JIBkQABiIvRmURAAUSjQXSFwMoxGKC6CRFwUSVYgXLPIgXXwMYegoXLJAYXCGBnzGA0hPQIwMgYwGC6gwCC4ZIMC4gYBC604C4ZISmcRVgapQAAMhC6GIJIwXCMBcIxGDDBAuLC4IwGAARGMAAQWGmAXPJQoWMC4pwCCpoXJAB4XXAH4A/ABQA=")) function satelliteImage() {
return require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4AGnE4F1wvsF34wgFldcLdyMYsoACF1WJF4YxPFzOtF4wxNFzAvKSiIvU1ovIGAkJAAQucF5QxCFwYwbF4QwLrwvjYIVfrwABrtdq9Wqwvkq4oCAAtXmYvi1teE4NXrphCrxoCGAbvdSIoAHNQNeFzQvGeRQvCsowrYYNfF8YwHZQQFCF8QwGF4owjeYovBroHEMERhEF8IwNrtWryYFF8YwCq4vhGBeJF5AwaxIwKwVXFwwvandfMJeJF8M6nZiLGQIvdstfGAVlGBZkCxJeZJQIwCGIRjMFzYACGIc6r/+FsIvGGIYABEzYvPGQYvusovkAH4A/AH4A/ACo="));
}
Bangle.setGPSPower(1); var Layout = require("Layout");
Bangle.setLCDMode("doublebuffered"); var layout;
Bangle.setGPSPower(1, "app");
E.showMessage("Loading..."); // avoid showing rubbish on screen E.showMessage("Loading..."); // avoid showing rubbish on screen
var lastFix = { var lastFix = {
fix: 0, fix: -1,
alt: 0, alt: 0,
lat: 0, lat: 0,
lon: 0, lon: 0,
@ -31,7 +34,7 @@ function getMaidenHead(param1,param2){
lon = param2; lon = param2;
lon = lon + 180; lon = lon + 180;
t = lon/20; var t = lon/20;
fLon = Math.floor(t); fLon = Math.floor(t);
t = (t % fLon)*10; t = (t % fLon)*10;
sqLon = Math.floor(t); sqLon = Math.floor(t);
@ -51,43 +54,58 @@ function getMaidenHead(param1,param2){
return U[fLon]+U[fLat]+sqLon+sqLat+L[subLon]+L[subLat]+extLon+extLat; return U[fLon]+U[fLat]+sqLon+sqLat+L[subLon]+L[subLat]+extLon+extLat;
} }
function onGPS(fix) { function onGPS(fix) {
if (lastFix.fix != fix.fix) {
// if fix is different, change the layout
if (fix.fix) {
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});
} 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" },
{type:"h", c: [
{type:"txt", font:"10%", label:fix.satellites, pad:2, id:"sat" },
{type:"txt", font:"6x8", pad:3, label:"Satellites" }
]},
{type:"txt", font:"6x8", label:"", id:"progress" }
]},[],{lazy:true});
}
g.clearRect(0,24,g.getWidth(),g.getHeight());
layout.render();
}
lastFix = fix; lastFix = fix;
g.clear();
g.setFontAlign(-1, -1);
g.drawImage(img, 20, -12);
g.setFont("6x8");
g.setFontVector(22);
g.drawString("GPS Info", 70, 0);
if (fix.fix) { if (fix.fix) {
nofix = 0; nofix = 0;
var alt = fix.alt; var locale = require("locale");
var lat = fix.lat;
var lon = fix.lon;
var speed = fix.speed;
var time = formatTime(fix.time);
var satellites = fix.satellites; var satellites = fix.satellites;
var maidenhead = getMaidenHead(lat,lon); var maidenhead = getMaidenHead(fix.lat,fix.lon);
var s = 15; layout.alt.label = "Altitude: "+locale.distance(fix.alt);
g.setFontVector(s); layout.lat.label = "Lat: "+fix.lat.toFixed(6);
g.drawString("Altitude: "+alt+" m",10,36); layout.lon.label = "Lon: "+fix.lon.toFixed(6);
g.drawString("Lat: "+lat,10,54); layout.speed.label = "Speed: "+locale.speed(fix.speed);
g.drawString("Lon: "+lon,10,72); layout.time.label = "Time: "+formatTime(fix.time);
g.drawString("Speed: "+speed.toFixed(1)+" km/h",10,90); layout.sat.label = "Satellites: "+satellites;
g.drawString("Time: "+time,10,108); layout.maidenhead.label = "Maidenhead: "+maidenhead;
g.drawString("Satellites: "+satellites,10,126);
g.drawString("Maidenhead: "+maidenhead,10,144);
} else { } else {
g.setFontAlign(0, 1); layout.sat.label = fix.satellites;
g.setFont("6x8", 2);
g.drawString("Waiting for GPS", 120, 80);
nofix = (nofix+1) % 4; nofix = (nofix+1) % 4;
g.drawString(".".repeat(nofix) + " ".repeat(4-nofix), 120, 120); layout.progress.label = ".".repeat(nofix) + " ".repeat(4-nofix);
// Show number of satellites:
g.setFontAlign(0,0);
g.setFont("6x8");
g.drawString(fix.satellites+" satellites", 120, 100);
} }
g.flip(); layout.render();
} }
Bangle.loadWidgets();
Bangle.drawWidgets();
Bangle.on('GPS', onGPS); Bangle.on('GPS', onGPS);