diff --git a/apps/seachart/ChangeLog b/apps/seachart/ChangeLog new file mode 100644 index 000000000..6cb9d061e --- /dev/null +++ b/apps/seachart/ChangeLog @@ -0,0 +1,12 @@ +0.01: New App! +0.02: Fix marker position, color, and map scaling +0.03: Show widgets (mainly so we can use the GPS recorder widget) +0.04: Move map rendering to a module (fix #396) +0.05: Show currently active gpsrec GPS trace (fix #395) +0.06: Add support for scrolling, option for 3 bit maps +0.07: Move to 96px tiles - less files (64 -> 25) and speed up rendering +0.08: Update for drag event refactor +0.09: Use current theme cols when drawing GPS info +0.10: Improve scale factor calculation to fix scaling issues (#984) +0.11: Add slight offset to OSM data to align it properly (fix #984) + Fix alignment of satellite info text diff --git a/apps/seachart/app-48.png b/apps/seachart/app-48.png new file mode 100644 index 000000000..b3e3c1047 Binary files /dev/null and b/apps/seachart/app-48.png differ diff --git a/apps/seachart/app-icon.js b/apps/seachart/app-icon.js new file mode 100644 index 000000000..be06afe32 --- /dev/null +++ b/apps/seachart/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AAOxAAIFCABmrwwRP/2yBJAvCAAYZJ2Wr1eHAAYSLAAQwP1YYHF4xEGCQovT2IYGFwIwDCIWAq1cwIABrtWwAaETZIuFCgIVDA4QvEBoNcq2s6/X2ezCQIDBwIKB2QBBF5ulAYQvI2IvBEQQAD1gACGQVXwKQPLwQwERwmrwFXLAJTDGAoACxFWF55VCGYSqCXYKOBrqHCAAXXAIQyExABBrjAOFQKSDMYQIBw9W2a7CFYiUGw4wBwTwPSQhmCGAJ7BAB4wDqwvIcwTnFYggFBrrjDRonX2ZnCSImHAQMrF5IAFLQQ3DrgtCRoYvDAQLJDF4ZgJOpAvBFgLtBXoIvHLgQCBF4QuCMAeIF5otCLwIuCw2B1mzEwQBB2etAAouEFoJgBSAwtE2IBCRYQvCwGIE4wACGQI0DGAwvGLopaBMIQvDwztBFQopBMQRkEF47AFRoy8Ga4KOBGAgpCSBoABF5mxRous1eBR4jmCSpAvHR4qJBAAYtCAYIvCAgWBEYZDDF4+yFwuyF4gmBGA4zD1gvCrovHE4JeFF4gNCLwgwBLQYvFAoOsw+rwQvDDwQwHBQ2y69dF4wnCGIelAga+B1bwBSAYkGLQQHF2fX2a+FSAoEB0oDCDwQvDlbxCKo4AGFwPXq4uFeAwuCF4RNBR4OswUslYvPFoPXxAuHF4ruEbAgvBq8rlgvN6wuB1iNGSAwrBMAitCcQOIq0rGBgtC2YTB1gvIQQLpDd4esAoIfCFwUrAYOBRZWzrtdVAIvISA+lFwIEBwGk1YuCF4IABEQIvG2eBq2I1eHF5RfCAAeIMIOxrgqBGIMrmNWrlcwAhBrmBAAdWwAWBxAMB1ZfLFoWsxBkCFwQABv9/qweBwAwDagQABAwIACwIgBLxLkCAAKSDFwiMCwWr2SACLYQ2BHIQACHIKRBF5CiBVIguIldcxGsJwIPCLAYsCwwABF4OswIvJc4QuLq2BfIIwDCYaRBRwiaCqwvILoIWB2IDBFxGAWoOIZgIUDa4YtEMQQuJCoYdBqwuIcoWrxJgBCwaVCFgQBCAALuJPQYuLAARDBSIJdBaoYuDAAdcF5QYB1guJLgOlFwKKCGAaUCXwxeJL4ZdJwLhCLoQAD1jDBF4ZeFF5mHFxGHRghdCGAg3C1YuGF5SbCFw1cFwexwFWCYJnBGAgvCFgmGXpIAD0mrFworB1YsDAAr4CGAQDBJoIsNAAfP1QuCg8AlcGC51cHxIAN1Wjg4wBDSoAUldVF1gA/AH4A5A")) diff --git a/apps/seachart/app.js b/apps/seachart/app.js new file mode 100644 index 000000000..62597ca20 --- /dev/null +++ b/apps/seachart/app.js @@ -0,0 +1,71 @@ +var m = require("openstmap"); +var HASWIDGETS = true; +var y1,y2; +var fix = {}; + +function redraw() { + g.setClipRect(0,y1,g.getWidth()-1,y2); + m.draw(); + drawMarker(); + 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() { + if (!fix.fix) return; + var p = m.latLonToXY(fix.lat, fix.lon); + g.setColor(1,0,0); + g.fillRect(p.x-2, p.y-2, p.x+2, p.y+2); +} + +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); + drawMarker(); +}); +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(); + } +}); diff --git a/apps/seachart/app.png b/apps/seachart/app.png new file mode 100644 index 000000000..9047fce33 Binary files /dev/null and b/apps/seachart/app.png differ diff --git a/apps/seachart/custom.html b/apps/seachart/custom.html new file mode 100644 index 000000000..aba93542b --- /dev/null +++ b/apps/seachart/custom.html @@ -0,0 +1,244 @@ + + + + + + + + + +
+
+
+

3 bit
+
+ + +
+ + + + + + + + + + + diff --git a/apps/seachart/metadata.json b/apps/seachart/metadata.json new file mode 100644 index 000000000..130f33e31 --- /dev/null +++ b/apps/seachart/metadata.json @@ -0,0 +1,18 @@ +{ + "id": "openseachart", + "name": "OpenSeaChart", + "shortName": "Openseachart", + "version": "0.11", + "description": "Loads map tiles from OpenStreetMap onto your Bangle.js and displays a map of where you are. Once installed this also adds map functionality to `GPS Recorder` and `Recorder` apps", + "icon": "app.png", + "tags": "outdoors,gps,osm", + "supports": ["BANGLEJS","BANGLEJS2"], + "screenshots": [{"url":"screenshot.png"}], + "custom": "custom.html", + "customConnect": true, + "storage": [ + {"name":"openseachart","url":"openseachart.js"}, + {"name":"openseachart.app.js","url":"app.js"}, + {"name":"openseachart.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/seachart/openseachart.js b/apps/seachart/openseachart.js new file mode 100644 index 000000000..db1f3524b --- /dev/null +++ b/apps/seachart/openseachart.js @@ -0,0 +1,71 @@ +/* OpenStreetMap plotting module. + +Usage: + +var m = require("openseachart"); +// m.lat/lon are now the center of the loaded map +m.draw(); // draw centered on the middle of the loaded map + +// plot gps position on map +Bangle.on('GPS',function(f) { + if (!f.fix) return; + var p = m.latLonToXY(fix.lat, fix.lon); + g.fillRect(p.x-2, p.y-2, p.x+2, p.y+2); +}); + +// recenter and redraw map! +function center() { + m.lat = fix.lat; + m.lon = fix.lon; + m.draw(); +} + +*/ + +var map = require("Storage").readJSON("openseachart.json"); +map.center = Bangle.project({lat:map.lat,lon:map.lon}); +exports.map = map; +exports.lat = map.lat; // actual position of middle of screen +exports.lon = map.lon; // actual position of middle of screen +var m = exports; + +exports.draw = function() { + var s = require("Storage"); + var cx = g.getWidth()/2; + var cy = g.getHeight()/2; + var p = Bangle.project({lat:m.lat,lon:m.lon}); + var ix = (p.x-map.center.x)/map.scale + (map.imgx/2) - cx; + var iy = (map.center.y-p.y)/map.scale + (map.imgy/2) - cy; + //console.log(ix,iy); + var tx = 0|(ix/map.tilesize); + var ty = 0|(iy/map.tilesize); + var ox = (tx*map.tilesize)-ix; + var oy = (ty*map.tilesize)-iy; + for (var x=ox,ttx=tx;x