diff --git a/apps/shownearby/ChangeLog b/apps/shownearby/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/shownearby/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/shownearby/app-icon.js b/apps/shownearby/app-icon.js new file mode 100644 index 000000000..c5b3cdffe --- /dev/null +++ b/apps/shownearby/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEw4UA///rkcr+W8H5Ie8/4AKIgf//gLIh5XBERILBEhAuBGA0BqtUEIMP+ALEqoABBY8FqtlBZEV0ulBYPABYkBq2WBYN/+A7Egtqq2lyt/KYsF1VaBZEWBYdfO4pRCAANXR4oLKgNq1Nq0upKgP0BYuq0uqBY4JBBYV/6hSEBYZIBqoLJrQLJQoILEKYgACBZ4jGsoLJyoLKAAJrIAIOUQZGWBYtaTYQLCqizIAANQBZ7jDAQOpoALDfYYCCBQYLBtVWa4NaIwZICq2WBYNpFwgABitlOgOVFwipDsuVUoYAEKI4xEqp0EAHg=")) diff --git a/apps/shownearby/app.js b/apps/shownearby/app.js new file mode 100644 index 000000000..bde1a557d --- /dev/null +++ b/apps/shownearby/app.js @@ -0,0 +1,86 @@ +var m = require("openstmap"); +var HASWIDGETS = true; +var y1,y2; +var fix = {}; + +function redraw() { + g.setClipRect(0,y1,g.getWidth()-1,y2); + m.draw(); + if (fix.fix) drawMarker(fix,"#f00"); + if (WIDGETS["gpsrec"] && WIDGETS["gpsrec"].plotTrack) { + g.flip(); // force immediate draw on double-buffered screens - track will update later + g.setColor(0.75,0.2,0); + WIDGETS["gpsrec"].plotTrack(m); + } + g.setClipRect(0,0,g.getWidth()-1,g.getHeight()-1); +} + +function drawMarker(pt, col) { + var p = m.latLonToXY(pt.lat, pt.lon); + g.setColor(col).fillRect(p.x-3, p.y-3, p.x+3, p.y+3); +} + +var fix; +Bangle.on('GPS',function(f) { + fix=f; + g.reset().clearRect(0,y1,g.getWidth()-1,y1+8).setFont("6x8").setFontAlign(0,0); + var txt = fix.satellites+" satellites"; + if (!fix.fix) + txt += " - NO FIX"; + g.drawString(txt,g.getWidth()/2,y1 + 4); + if (fix.fix) drawMarker(fix,"#f00"); + if (fix.fix) { + var fdata = new Float32Array([f.lat,f.lon]); + NRF.setAdvertising({},{ + phy:"coded", + connectable:false, + scannable:false, + showName:false, + manufacturer:0x0590, + manufacturerData:fdata.buffer + }); + } +}); +Bangle.setGPSPower(1, "app"); + +if (HASWIDGETS) { + Bangle.loadWidgets(); + Bangle.drawWidgets(); + y1 = 24; + var hasBottomRow = Object.keys(WIDGETS).some(w=>WIDGETS[w].area[0]=="b"); + y2 = g.getHeight() - (hasBottomRow ? 24 : 1); +} else { + y1=0; + y2=g.getHeight()-1; +} + +redraw(); + +function recenter() { + if (!fix.fix) return; + m.lat = fix.lat; + m.lon = fix.lon; + redraw(); +} + +setWatch(recenter, global.BTN2?BTN2:BTN1, {repeat:true}); + +var hasScrolled = false; +Bangle.on('drag',e=>{ + if (e.b) { + g.setClipRect(0,y1,g.getWidth()-1,y2); + g.scroll(e.dx,e.dy); + m.scroll(e.dx,e.dy); + g.setClipRect(0,0,g.getWidth()-1,g.getHeight()-1); + hasScrolled = true; + } else if (hasScrolled) { + hasScrolled = false; + redraw(); + } +}); + +// Start scanning +NRF.setScan(function(d) { + var latLon = new Float32Array(d.manufacturerData); + drawMarker({lat:latLon[0], lon:latLon[1]},"#0f0"); +},{phy:"coded",filters: [{ manufacturerData:{0x0590:{}} }]}); diff --git a/apps/shownearby/app.png b/apps/shownearby/app.png new file mode 100644 index 000000000..5c2ed44cc Binary files /dev/null and b/apps/shownearby/app.png differ diff --git a/apps/shownearby/metadata.json b/apps/shownearby/metadata.json new file mode 100644 index 000000000..143cc3a3f --- /dev/null +++ b/apps/shownearby/metadata.json @@ -0,0 +1,14 @@ +{ + "id": "shownearby", + "name": "Show Nearby", + "version": "0.01", + "description": "Uses BLE long range advertising, advertises current location and shows the position of other watches running the app (Needs firmware 2v14.63 or later and Open Street Map installed)", + "icon": "app.png", + "tags": "outdoors,gps", + "supports": ["BANGLEJS2"], + "dependencies" : { "openstmap":"app" }, + "storage": [ + {"name":"shownearby.app.js","url":"app.js"}, + {"name":"shownearby.img","url":"app-icon.js","evaluate":true} + ] +}