diff --git a/apps.json b/apps.json index dc4a6fa67..99ca84fab 100644 --- a/apps.json +++ b/apps.json @@ -2088,5 +2088,17 @@ "url": "settings.js" } ] + }, + { "id": "osgridref", + "name": "Ordnance Survey Grid Reference", + "shortName":"OS Grid ref", + "icon": "app.png", + "version":"0.01", + "description": "Displays the UK Ordnance Survey grid reference of your current GPS location. Useful when in the United Kingdom with an Ordnance Survey map", + "tags": "outdoors,gps", + "storage": [ + {"name":"osgridref.app.js","url":"app.js"}, + {"name":"osgridref.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/osgridref/ChangeLog b/apps/osgridref/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/osgridref/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/osgridref/app-icon.js b/apps/osgridref/app-icon.js new file mode 100644 index 000000000..7feae2678 --- /dev/null +++ b/apps/osgridref/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwghC/AH4A/AGmqAAWgBQtc3cQAQIWKDA0F5YXBgEL3gWE0AXFDAlcjYXCAAOwAYUKC4MKC4gLCgO7rYXEJIYnBC4wgBIIO75gXELosKC4geBC4MM3e13dQCwoUCFAIYDMwQNBOQNcC4xECAIYVBHAWghijBUhAVCJAZEBAYfAgFbiEFIwgXECQSWCC4aQBiHMgBKCC4ZGDVwZgCiBHBAQMb4oXELQTbBF4gIBgsRiMQje15cRC4K/DXYhfEhnFqobB2J9BBgQkBJIhNFC4PMqBjB1kbC5o8Bhe1F4Ox5YEBiAQCC45jBa4W72MQJAKQB2CjCC5BsCgsbR4JEBoEA2qJCRQIUCbAgwCgMbU4OwbQJ4CUYYEBVYSUEAATCB5kL3gkCFAQADRwQXF5YYB5YXDXIZGCTIYAEPYQaBOgR3DCwIECFwrDB3e8hewFgQXDRYQXIqpHBgAXCTgJcFIwfLC4ewC4JeBAARZDbwbWD4APC3gXBFwQACOgpFErdQU4UMJ4oYCC4RcG5fBC4OwFwoA/AH4A/AH4AEA")) diff --git a/apps/osgridref/app.js b/apps/osgridref/app.js new file mode 100644 index 000000000..6681fd85b --- /dev/null +++ b/apps/osgridref/app.js @@ -0,0 +1,89 @@ +function getLogo() { + return require("heatshrink").decompress(atob("mUcggHE1QADCY3L3cA5gCBAAoXEDI0M3YVChe8BYmgDAwZE4AYDAAOwAYUKDAMKC4mgBgUL2AYFAgYQBDA4yC3e8MYRhIhQYFAoJ6DhYYHCoQRCDApMC3fA5gwHDAxqBG4R7BGQJ3DDA8KGIY7BAYUMO4pJDDAgXDQQYYBhmw5bgBDBY6EMgMLPYIxBQAPADAimDDYIhDPogYC3hOCLwT5D0ASCDAhIBcobMCCgYRDVwg6ChnLMIPA3cMDAgqEfIgxCCIIzB2BLBToIYMKAW7JYSYC4GwH4YYGJYJfCLoLHFDAIVBMY5hCSowWBgG8BYI/CCoY5EFYcLDAIXBPoYaCAgTNBAQQYEGgfMhYxBOIYwEJoRkDM4vLDAYJBDAj4FJghLBcIRYCCQRhCPogAEMAO8fgIuCDAg2EDAz5BS4YWBCQZgDJIUMB4TDCDAJiBAAT1FZwQLCCAm8DAIgEGIZNFDI27hhTGDIQYCPA28FgIvBGAQ")); +} + +g.clear(1); +g.drawImage(getLogo(),g.getWidth()-50, g.getHeight()-(28+24)); +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +function onGPS(fix) { + var os = {northing:"---", easting:"---"} + var state = ""; + if (fix.fix) { + os = OsGridRef.latLongToOsGrid(fix); + state = "GPS Fix"; + } else { + state = "No Fix "; + } + var y = 30, h=48, d1 = 18, d2 = 80; + g.reset(); + g.setFont("6x8",2).setFontAlign(-1,-1); + g.drawString("Northing", 10,y); + g.drawString("Easting", 10,y+d2); + g.drawString(state,10,g.getHeight()-48,true/*erase bg*/) + g.setFont("6x8",1); + g.drawString(fix.satellites+" Satellites ",10,g.getHeight()-32,true/*erase bg*/) + g.setFont("Vector",h).setFontAlign(1,-1); + g.clearRect(0,y+d1,g.getWidth()-1,y+d1+h); + g.drawString(os.northing, g.getWidth()-1,y+d1); + g.clearRect(0,y+d1+d2,g.getWidth()-1,y+d1+d2+h); + g.drawString(os.easting, g.getWidth()-1,y+d1+d2); +} + +Bangle.setGPSPower(1); +Bangle.on('GPS', onGPS); + +Number.prototype.toRad = function() { return this*Math.PI/180; }; +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +/* Ordnance Survey Grid Reference functions (c) Chris Veness 2005-2014 */ +/* - www.movable-type.co.uk/scripts/gridref.js */ +/* - www.movable-type.co.uk/scripts/latlon-gridref.html */ +/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ +function OsGridRef(easting, northing) { + this.easting = 0|easting; + this.northing = 0|northing; +} +OsGridRef.latLongToOsGrid = function(point) { + var lat = point.lat.toRad(); + var lon = point.lon.toRad(); + + var a = 6377563.396, b = 6356256.909; // Airy 1830 major & minor semi-axes + var F0 = 0.9996012717; // NatGrid scale factor on central meridian + var lat0 = (49).toRad(), lon0 = (-2).toRad(); // NatGrid true origin is 49�N,2�W + var N0 = -100000, E0 = 400000; // northing & easting of true origin, metres + var e2 = 1 - (b*b)/(a*a); // eccentricity squared + var n = (a-b)/(a+b), n2 = n*n, n3 = n*n*n; + + var cosLat = Math.cos(lat), sinLat = Math.sin(lat); + var nu = a*F0/Math.sqrt(1-e2*sinLat*sinLat); // transverse radius of curvature + var rho = a*F0*(1-e2)/Math.pow(1-e2*sinLat*sinLat, 1.5); // meridional radius of curvature + var eta2 = nu/rho-1; + + var Ma = (1 + n + (5/4)*n2 + (5/4)*n3) * (lat-lat0); + var Mb = (3*n + 3*n*n + (21/8)*n3) * Math.sin(lat-lat0) * Math.cos(lat+lat0); + var Mc = ((15/8)*n2 + (15/8)*n3) * Math.sin(2*(lat-lat0)) * Math.cos(2*(lat+lat0)); + var Md = (35/24)*n3 * Math.sin(3*(lat-lat0)) * Math.cos(3*(lat+lat0)); + var M = b * F0 * (Ma - Mb + Mc - Md); // meridional arc + + var cos3lat = cosLat*cosLat*cosLat; + var cos5lat = cos3lat*cosLat*cosLat; + var tan2lat = Math.tan(lat)*Math.tan(lat); + var tan4lat = tan2lat*tan2lat; + + var I = M + N0; + var II = (nu/2)*sinLat*cosLat; + var III = (nu/24)*sinLat*cos3lat*(5-tan2lat+9*eta2); + var IIIA = (nu/720)*sinLat*cos5lat*(61-58*tan2lat+tan4lat); + var IV = nu*cosLat; + var V = (nu/6)*cos3lat*(nu/rho-tan2lat); + var VI = (nu/120) * cos5lat * (5 - 18*tan2lat + tan4lat + 14*eta2 - 58*tan2lat*eta2); + + var dLon = lon-lon0; + var dLon2 = dLon*dLon, dLon3 = dLon2*dLon, dLon4 = dLon3*dLon, dLon5 = dLon4*dLon, dLon6 = dLon5*dLon; + + var N = I + II*dLon2 + III*dLon4 + IIIA*dLon6; + var E = E0 + IV*dLon + V*dLon3 + VI*dLon5; + + return new OsGridRef(E, N); +}; diff --git a/apps/osgridref/app.png b/apps/osgridref/app.png new file mode 100644 index 000000000..2b85ddb09 Binary files /dev/null and b/apps/osgridref/app.png differ