mirror of https://github.com/espruino/BangleApps
69 lines
2.0 KiB
JavaScript
69 lines
2.0 KiB
JavaScript
|
const landColor = 0x8FAB, seaColor= 0x365D, markerColor = 0xF800;
|
||
|
let lastSuccess = true;
|
||
|
|
||
|
const mapImg = {
|
||
|
width : 240,
|
||
|
height : 240,
|
||
|
palette: new Uint16Array([landColor, seaColor]),
|
||
|
buffer: require("Storage").read("whereworld.worldmap")
|
||
|
};
|
||
|
|
||
|
function getMarkerImg(x, y) {
|
||
|
const b = Graphics.createArrayBuffer(240, 240, 2, {msb:true});
|
||
|
b.setColor(1);
|
||
|
b.drawLine(x, 0, x, b.getHeight());
|
||
|
b.drawLine(0, y, b.getWidth(), y);
|
||
|
const pal = new Uint16Array([0, markerColor]);
|
||
|
return {width: 240, height: 240, bpp: 2, palette: pal, buffer: b.buffer, transparent: 0};
|
||
|
}
|
||
|
|
||
|
function degreesToRadians(deg) {
|
||
|
return (deg / 180) * Math.PI;
|
||
|
}
|
||
|
|
||
|
function coordsToScreenLocation(lat, lon) {
|
||
|
const maxMapHeight = g.getHeight() - 1, maxMapWidth = g.getWidth() - 1;
|
||
|
const maxLong = 180;
|
||
|
const x = ((lon + maxLong) / (maxLong * 2)) * maxMapWidth;
|
||
|
const mercN = Math.log(Math.tan((Math.PI / 4) + (degreesToRadians(lat) / 2)));
|
||
|
const y = (maxMapHeight / 2) - (maxMapWidth * mercN / (2 * Math.PI));
|
||
|
return {x: x, y: y};
|
||
|
}
|
||
|
|
||
|
function drawLocation(lat, lon) {
|
||
|
const location = coordsToScreenLocation(lat, lon);
|
||
|
g.drawImages([
|
||
|
{image: mapImg},
|
||
|
{image: getMarkerImg(location.x, location.y)}
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
function drawNoFixMessage() {
|
||
|
const b = Graphics.createArrayBuffer(240, 216, 1, {msb:true});
|
||
|
const throbber = ".".repeat(new Date().getSeconds() % 4);
|
||
|
b.setColor(1);
|
||
|
b.setFont("6x8", 2);
|
||
|
b.drawString("Finding GPS Fix" + throbber, 15, 94);
|
||
|
g.drawImage({
|
||
|
width: b.getWidth(),
|
||
|
height: b.getHeight(),
|
||
|
palette: new Uint16Array([0, 0xF800]),
|
||
|
buffer: b.buffer
|
||
|
}, 0, 24);
|
||
|
}
|
||
|
|
||
|
Bangle.setGPSPower(1);
|
||
|
Bangle.loadWidgets();
|
||
|
Bangle.on('GPS', function(gps) {
|
||
|
if (gps.fix) {
|
||
|
drawLocation(gps.lat, gps.lon);
|
||
|
lastSuccess = true;
|
||
|
}
|
||
|
else {
|
||
|
if (lastSuccess) {
|
||
|
Bangle.drawWidgets();
|
||
|
lastSuccess = false;
|
||
|
}
|
||
|
drawNoFixMessage();
|
||
|
}
|
||
|
});
|