BangleApps/apps/clkinfogps/clkinfo.js

128 lines
2.8 KiB
JavaScript

(function () {
var timeout;
var last_fix;
var fixTs;
var geo = require("geotools");
var debug = function(o) {
//console.log(o);
};
var resetLastFix = function() {
last_fix = {
fix: 0,
alt: 0,
lat: 0,
lon: 0,
speed: 0,
time: 0,
course: 0,
satellites: 0
};
};
var formatTime = function(now) {
try {
var fd = now.toUTCString().split(" ");
return fd[4];
} catch (e) {
return "00:00:00";
}
};
var clearTimer = function() {
if (timeout) {
clearTimeout(timeout);
timeout = undefined;
debug("timer cleared");
}
};
var queueGPSon = function() {
clearTimer();
// power on the GPS again in 90 seconds
timeout = setTimeout(function() {
timeout = undefined;
Bangle.setGPSPower(1,"clkinfo");
}, 90000);
debug("gps on queued");
};
var onGPS = function(fix) {
debug(fix);
last_fix.time = fix.time;
// we got a fix
if (fix.fix) {
last_fix = fix;
fixTs = Math.round(getTime());
// cancel the timeout, if not already timed out
clearTimer();
// power off the GPS
Bangle.setGPSPower(0,"clkinfo");
queueGPSon();
}
// if our last fix was more than 4 minutes ago, reset the fix to show gps time + satelites
if (Math.round(getTime()) - fixTs > 240) {
resetLastFix();
fixTs = Math.round(getTime());
// cancel the timeout and power off the gps, tap required to restart
clearTimer();
Bangle.setGPSPower(0,"clkinfo");
}
info.items[0].emit("redraw");
};
var img = function() {
return atob("GBgBAAAAAAAAABgAAb2ABzzgB37gD37wHn54AAAADEwIPn58Pn58Pv58Pn58FmA4AAAAHn54D37wD37gBzzAAb2AABgAAAAAAAAA");
};
var gpsText = function() {
if (last_fix === undefined)
return '';
// show gps time and satelite count
if (!last_fix.fix)
return formatTime(last_fix.time) + ' ' + last_fix.satellites;
return geo.gpsToOSMapRef(last_fix);
};
var info = {
name: "GPS",
items: [
{
name: "gridref",
get: function () { return ({
img: img(),
text: gpsText()
}); },
run : function() {
debug("run");
// if the timer is already runnuing reset it, we can get multiple run calls by tapping
clearTimer();
Bangle.setGPSPower(1,"clkinfo");
},
show: function () {
debug("show");
resetLastFix();
fixTs = Math.round(getTime());
Bangle.on("GPS",onGPS);
this.run();
},
hide: function() {
debug("hide");
clearTimer();
Bangle.setGPSPower(0,"clkinfo");
Bangle.removeListener("GPS", onGPS);
resetLastFix();
}
}
]
};
return info;
})