BangleApps/apps/gpsrec/widget.js

99 lines
3.1 KiB
JavaScript

(() => {
var settings = {};
var hasFix = false;
var fixToggle = false; // toggles once for each reading
var gpsTrack; // file for GPS track
var gpsOn = false;
var lastFixTime = Date.now();
// draw your widget
function draw() {
if (!settings.recording) return;
g.reset();
g.drawImage(atob("GBgCAAAAAAAAAAQAAAAAAD8AAAAAAP/AAAAAAP/wAAAAAH/8C9AAAB/8L/QAAAfwv/wAAAHS//wAAAAL//gAAAAf/+AAAAAf/4AAAAL//gAAAAD/+DwAAAB/Uf8AAAAfA//AAAACAf/wAAAAAH/0AAAAAB/wAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"),this.x,this.y);
if (hasFix) {
g.setColor("#00FF00");
g.drawImage(fixToggle ? atob("CgoCAAAAA0AAOAAD5AAPwAAAAAAAAAAAAAAAAA==") : atob("CgoCAAABw0AcOAHj5A8PwHwAAvgAB/wABUAAAA=="),this.x,this.y+14);
} else {
g.setColor("#0000FF");
if (fixToggle)
g.setFont("6x8").drawString("?",this.x,this.y+14);
}
}
function onGPS(fix) {
hasFix = fix.fix;
fixToggle = !fixToggle;
WIDGETS["gpsrec"].draw();
if (hasFix) {
var period = fix.time.getTime() - lastFixTime;
if (period+500 > settings.period*1000) { // round up
lastFixTime = fix.time.getTime();
try {
if (gpsTrack) gpsTrack.write([
fix.time.getTime(),
fix.lat.toFixed(6),
fix.lon.toFixed(6),
fix.alt
].join(",")+"\n");
} catch(e) {
// If storage.write caused an error, disable
// GPS recording so we don't keep getting errors!
console.log("gpsrec: write error", e);
settings.recording = false;
require("Storage").write("gpsrec.json", settings);
reload();
}
}
}
}
// Called by the GPS app to reload settings and decide what to do
function reload() {
settings = require("Storage").readJSON("gpsrec.json",1)||{};
settings.period = settings.period||10;
settings.file |= 0;
Bangle.removeListener('GPS',onGPS);
var gOn = false;
if (settings.recording) {
WIDGETS["gpsrec"].width = 24;
Bangle.on('GPS', onGPS);
var n = settings.file.toString(36);
gpsTrack = require("Storage").open(".gpsrc"+n,"a");
gOn = true;
} else {
WIDGETS["gpsrec"].width = 0;
gpsTrack = undefined;
}
if (gOn != gpsOn) {
Bangle.setGPSPower(gOn,"gpsrec");
gpsOn = gOn;
}
}
// add the widget
WIDGETS["gpsrec"]={area:"tl",width:24,draw:draw,reload:function() {
reload();
Bangle.drawWidgets(); // relayout all widgets
},plotTrack:function(m) { // m=instance of openstmap module
// if we're here, settings was already loaded
var n = settings.file.toString(36);
var f = require("Storage").open(".gpsrc"+n,"r");
var l = f.readLine(f);
if (l===undefined) return;
var c = l.split(",");
var mp = m.latLonToXY(+c[1], +c[2]);
g.moveTo(mp.x,mp.y);
l = f.readLine(f);
while(l!==undefined) {
c = l.split(",");
mp = m.latLonToXY(+c[1], +c[2]);
g.lineTo(mp.x,mp.y);
g.fillCircle(mp.x,mp.y,2); // make the track more visible
l = f.readLine(f);
}
}};
// load settings, set correct widget width
reload();
})()