diff --git a/apps.json b/apps.json index 71865bcd3..9b0cb73da 100644 --- a/apps.json +++ b/apps.json @@ -1124,9 +1124,9 @@ "id": "gpsinfo", "name": "GPS Info", "icon": "gps-info.png", - "version":"0.04", + "version":"0.05", "description": "An application that displays information about altitude, lat/lon, satellites and time", - "tags": "gps", + "tags": "gps,b2", "type": "app", "storage": [ {"name":"gpsinfo.app.js","url": "gps-info.js"}, diff --git a/apps/accellog/app.js b/apps/accellog/app.js index dcc7702c9..3ee88059b 100644 --- a/apps/accellog/app.js +++ b/apps/accellog/app.js @@ -94,9 +94,9 @@ function startRecord(force) { var Layout = require("Layout"); var layout = new Layout({ type: "v", c: [ {type:"txt", font:"6x8", label:"Samples", pad:2}, - {type:"txt", id:"samples", font:"6x8:2", label:" - ", pad:5}, + {type:"txt", id:"samples", font:"6x8:2", label:" - ", pad:5, bgCol:g.theme.bg}, {type:"txt", font:"6x8", label:"Time", pad:2}, - {type:"txt", id:"time", font:"6x8:2", label:" - ", pad:5}, + {type:"txt", id:"time", font:"6x8:2", label:" - ", pad:5, bgCol:g.theme.bg}, {type:"txt", font:"6x8:2", label:"RECORDING", bgCol:"#f00", pad:5, fillx:1}, ] },[ // Buttons... diff --git a/apps/gpsinfo/ChangeLog b/apps/gpsinfo/ChangeLog index ceff7011e..381412c16 100644 --- a/apps/gpsinfo/ChangeLog +++ b/apps/gpsinfo/ChangeLog @@ -1,3 +1,4 @@ 0.02: Ensure screen doesn't display garbage at startup 0.03: Show number of satellites while waiting for fix 0.04: Add Maidenhead readout of GPS location +0.05: Refactor to use 'layout' library for multi-device support diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js index 1a8cb2fd1..047c1bc17 100644 --- a/apps/gpsinfo/gps-info.js +++ b/apps/gpsinfo/gps-info.js @@ -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); -Bangle.setLCDMode("doublebuffered"); +var Layout = require("Layout"); +var layout; +Bangle.setGPSPower(1, "app"); E.showMessage("Loading..."); // avoid showing rubbish on screen var lastFix = { - fix: 0, + fix: -1, alt: 0, lat: 0, lon: 0, @@ -31,14 +34,14 @@ function getMaidenHead(param1,param2){ lon = param2; lon = lon + 180; - t = lon/20; + var t = lon/20; fLon = Math.floor(t); t = (t % fLon)*10; sqLon = Math.floor(t); - t=(t-sqLon)*24; + t = (t-sqLon)*24; subLon = Math.floor(t); extLon = Math.floor((t-subLon)*10); - + lat = lat + 90; t = lat/10; fLat = Math.floor(t); @@ -51,43 +54,58 @@ function getMaidenHead(param1,param2){ return U[fLon]+U[fLat]+sqLon+sqLat+L[subLon]+L[subLat]+extLon+extLat; } 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; - 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) { nofix = 0; - var alt = fix.alt; - var lat = fix.lat; - var lon = fix.lon; - var speed = fix.speed; - var time = formatTime(fix.time); + var locale = require("locale"); var satellites = fix.satellites; - var maidenhead = getMaidenHead(lat,lon); - var s = 15; - g.setFontVector(s); - g.drawString("Altitude: "+alt+" m",10,36); - g.drawString("Lat: "+lat,10,54); - g.drawString("Lon: "+lon,10,72); - g.drawString("Speed: "+speed.toFixed(1)+" km/h",10,90); - g.drawString("Time: "+time,10,108); - g.drawString("Satellites: "+satellites,10,126); - g.drawString("Maidenhead: "+maidenhead,10,144); + 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; } else { - g.setFontAlign(0, 1); - g.setFont("6x8", 2); - g.drawString("Waiting for GPS", 120, 80); + layout.sat.label = fix.satellites; nofix = (nofix+1) % 4; - g.drawString(".".repeat(nofix) + " ".repeat(4-nofix), 120, 120); - // Show number of satellites: - g.setFontAlign(0,0); - g.setFont("6x8"); - g.drawString(fix.satellites+" satellites", 120, 100); + layout.progress.label = ".".repeat(nofix) + " ".repeat(4-nofix); } - g.flip(); + layout.render(); } +Bangle.loadWidgets(); +Bangle.drawWidgets(); Bangle.on('GPS', onGPS); diff --git a/modules/Layout.js b/modules/Layout.js index fe3d512db..5ac0cab16 100644 --- a/modules/Layout.js +++ b/modules/Layout.js @@ -312,14 +312,17 @@ Layout.prototype.update = function() { l._h = 24; l._w = 14 + l.label.length*8; }, "img": function(l) { - var src = l.src(); - if (typeof(src) === 'object') { - l._h = ("width" in src) ? src.width : src.getWidth(); - l._w = ("height" in src) ? src.height : src.getHeight(); + var src = l.src(); // get width and height out of image + if (src[0]) { + l._w = src[0]; + l._h = src[1]; + } else if ('object'==typeof src) { + l._w = ("width" in src) ? src.width : src.getWidth(); + l._h = ("height" in src) ? src.height : src.getHeight(); } else { var im = E.toString(src); - l._h = im.charCodeAt(0); - l._w = im.charCodeAt(1); + l._w = im.charCodeAt(0); + l._h = im.charCodeAt(1); } }, "": function(l) { // size should already be set up in width/height