From 85d23d3db91a839408c1c28cf37225e04320bce0 Mon Sep 17 00:00:00 2001 From: jeffmer Date: Sat, 5 Dec 2020 10:41:50 +0000 Subject: [PATCH] update gpsnav to use locale + add en_NAV --- apps.json | 6 +-- apps/gpsnav/ChangeLog | 2 + apps/gpsnav/app.js | 87 +++++++++++++++++++----------------------- apps/gpsnav/app.min.js | 11 ++++++ apps/locale/ChangeLog | 1 + apps/locale/locales.js | 24 +++++++++++- 6 files changed, 79 insertions(+), 52 deletions(-) create mode 100644 apps/gpsnav/app.min.js diff --git a/apps.json b/apps.json index f8f46d4a7..8c00cfec8 100644 --- a/apps.json +++ b/apps.json @@ -65,7 +65,7 @@ { "id": "locale", "name": "Languages", "icon": "locale.png", - "version":"0.07", + "version":"0.08", "description": "Translations for different countries", "tags": "tool,system,locale,translate", "type": "locale", @@ -379,13 +379,13 @@ { "id": "gpsnav", "name": "GPS Navigation", "icon": "icon.png", - "version":"0.04", + "version":"0.05", "description": "Displays GPS Course and Speed, + Directions to waypoint and waypoint recording, now with waypoint editor", "tags": "tool,outdoors,gps", "readme": "README.md", "interface":"waypoints.html", "storage": [ - {"name":"gpsnav.app.js","url":"app.js"}, + {"name":"gpsnav.app.js","url":"app.min.js"}, {"name":"waypoints.json","url":"waypoints.json","evaluate":false}, {"name":"gpsnav.img","url":"app-icon.js","evaluate":true} ] diff --git a/apps/gpsnav/ChangeLog b/apps/gpsnav/ChangeLog index ee8b61d7b..b4eaf5472 100644 --- a/apps/gpsnav/ChangeLog +++ b/apps/gpsnav/ChangeLog @@ -2,3 +2,5 @@ 0.02: Add SCREENACCESS interface 0.03: Add Waypoint Editor 0.04: Fix great circle formula +0.05: Use locale for speed and distance + fix Vector font sizes + diff --git a/apps/gpsnav/app.js b/apps/gpsnav/app.js index 3bbc756b7..99b5cf2c9 100644 --- a/apps/gpsnav/app.js +++ b/apps/gpsnav/app.js @@ -4,18 +4,19 @@ var buf = Graphics.createArrayBuffer(240,50,2,{msb:true}); var candraw = true; function flip(b,y) { - g.drawImage({width:240,height:50,bpp:2,buffer:b.buffer, palette:pal2color},0,y); - b.clear(); + g.drawImage({width:240,height:50,bpp:2,buffer:b.buffer, palette:pal2color},0,y); + b.clear(); } var brg=0; var wpindex=0; const labels = ["N","NE","E","SE","S","SW","W","NW"]; +var loc = require("locale"); function drawCompass(course) { if (!candraw) return; buf.setColor(1); - buf.setFont("Vector",16); + buf.setFont("Vector",24); var start = course-90; if (start<0) start+=360; buf.fillRect(28,45,212,49); @@ -44,27 +45,21 @@ function drawCompass(course) { if (bpos>210) bpos = 226; buf.setColor(2); buf.fillCircle(bpos,40,8); - } + } flip(buf,Yoff); } //displayed heading var heading = 0; -function newHeading(m,h){ - var s = Math.abs(m - h); - var delta = 1; - if (s<2) return h; - if (m > h){ - if (s >= 180) { delta = -1; s = 360 - s;} - } else if (m <= h){ - if (s < 180) delta = -1; - else s = 360 -s; - } - delta = delta * (1 + Math.round(s/15)); - heading+=delta; - if (heading<0) heading += 360; - if (heading>360) heading -= 360; - return heading; +function newHeading(m,h){ + var s = Math.abs(m - h); + var delta = (m>h)?1:-1; + if (s>=180){s=360-s; delta = -delta;} + if (s<2) return h; + var hd = h + delta*(1 + Math.round(s/5)); + if (hd<0) hd+=360; + if (hd>360)hd-= 360; + return hd; } var course =0; @@ -93,27 +88,28 @@ function bearing(a,b){ } function distance(a,b){ - var dsigma = Math.acos(Math.sin(radians(a.lat))*Math.sin(radians(b.lat))+Math.cos(radians(a.lat))*Math.cos(radians(b.lat))*Math.cos(radians(a.lon-b.lon))); - return Math.round(dsigma*6371000); + var x = radians(a.lon-b.lon) * Math.cos(radians((a.lat+b.lat)/2)); + var y = radians(b.lat-a.lat); + return Math.round(Math.sqrt(x*x + y*y) * 6371000); } var selected = false; function drawN(){ + var txt = loc.speed(speed); buf.setColor(1); buf.setFont("6x8",2); buf.drawString("o",100,0); buf.setFont("6x8",1); - buf.drawString("kph",220,40); - buf.setFont("Vector",40); + buf.drawString(txt.substring(txt.length-3),220,40); + buf.setFont("Vector",48); var cs = course.toString(); cs = course<10?"00"+cs : course<100 ?"0"+cs : cs; buf.drawString(cs,10,0); - var txt = (speed<10) ? speed.toFixed(1) : Math.round(speed); - buf.drawString(txt,140,4); + buf.drawString(txt.substring(0,txt.length-3),140,4); flip(buf,Yoff+70); buf.setColor(1); - buf.setFont("Vector",20); + buf.setFont("Vector",24); var bs = brg.toString(); bs = brg<10?"00"+bs : brg<100 ?"0"+bs : bs; buf.setColor(3); @@ -123,10 +119,7 @@ function drawN(){ buf.drawString(wp.name,140,0); buf.setColor(1); buf.drawString(bs,60,0); - if (dist<1000) - buf.drawString(dist.toString()+"m",60,30); - else - buf.drawString((dist/1000).toFixed(2)+"Km",60,30); + buf.drawString(loc.distance(dist),60,30); flip(buf,Yoff+130); g.setFont("6x8",1); g.setColor(0,0,0); @@ -165,7 +158,7 @@ function stopdraw() { function startTimers() { candraw=true; intervalRefSec = setInterval(function() { - newHeading(course,heading); + heading = newHeading(course,heading); if (course!=heading) drawCompass(heading); },200); } @@ -189,20 +182,20 @@ function setButtons(){ setWatch(nextwp.bind(null,-1), BTN1, {repeat:true,edge:"falling"}); setWatch(doselect, BTN2, {repeat:true,edge:"falling"}); setWatch(nextwp.bind(null,1), BTN3, {repeat:true,edge:"falling"}); -} +}; var SCREENACCESS = { - withApp:true, - request:function(){ - this.withApp=false; - stopdraw(); - clearWatch(); - }, - release:function(){ - this.withApp=true; - startdraw(); - setButtons(); - } + withApp:true, + request:function(){ + this.withApp=false; + stopdraw(); + clearWatch(); + }, + release:function(){ + this.withApp=true; + startdraw(); + setButtons(); + } } Bangle.on('lcdPower',function(on) { @@ -227,10 +220,10 @@ function nextwp(inc){ } function doselect(){ - if (selected && waypoints[wpindex].lat===undefined && savedfix.fix) { - waypoints[wpindex] ={name:"@"+wp.name, lat:savedfix.lat, lon:savedfix.lon}; - wp = waypoints[wpindex]; - require("Storage").writeJSON("waypoints.json", waypoints); + if (selected && wpindex!=0 && waypoints[wpindex].lat===undefined && savedfix.fix) { + waypoints[wpindex] ={name:"@"+wp.name, lat:savedfix.lat, lon:savedfix.lon}; + wp = waypoints[wpindex]; + require("Storage").writeJSON("waypoints.json", waypoints); } selected=!selected; drawN(); diff --git a/apps/gpsnav/app.min.js b/apps/gpsnav/app.min.js new file mode 100644 index 000000000..7771e2b98 --- /dev/null +++ b/apps/gpsnav/app.min.js @@ -0,0 +1,11 @@ +var Yoff=40,pal2color=new Uint16Array([0,65535,2047,50712],0,2),buf=Graphics.createArrayBuffer(240,50,2,{msb:!0}),candraw=!0;function flip(a,c){g.drawImage({width:240,height:50,bpp:2,buffer:a.buffer,palette:pal2color},0,c);a.clear()}var brg=0,wpindex=0,labels="N NE E SE S SW W NW".split(" "),loc=require("locale"); +function drawCompass(a){if(candraw){buf.setColor(1);buf.setFont("Vector",24);var c=a-90;0>c&&(c+=360);buf.fillRect(28,45,212,49);var b=30,d=15-c%15;15>d?b+=d:d=0;for(var e=d;e<=180-d;e+=15){var f=c+e;0==f%90?(buf.drawString(labels[Math.floor(f/45)%8],b-8,0),buf.fillRect(b-2,25,b+2,45)):0==f%45?(buf.drawString(labels[Math.floor(f/45)%8],b-12,0),buf.fillRect(b-2,30,b+2,45)):0==f%15&&buf.fillRect(b,35,b+1,45);b+=15}0!=wpindex&&(a=brg-a,180a&&(a+=360),a+=120,30>a&&(a=14),210c?1:-1;180<=b&&(b=360-b,d=-d);if(2>b)return c;b=c+d*(1+Math.round(b/5));0>b&&(b+=360);360course?"00"+c:100>course?"0"+c:c;buf.drawString(c,10,0);buf.drawString(a.substring(0,a.length-3),140,4);flip(buf,Yoff+70);buf.setColor(1);buf.setFont("Vector",24);a=brg.toString();a=10>brg?"00"+a:100>brg?"0"+a:a;buf.setColor(3);buf.drawString("Brg: ",0,0);buf.drawString("Dist: ", +0,30);buf.setColor(selected?1:2);buf.drawString(wp.name,140,0);buf.setColor(1);buf.drawString(a,60,0);buf.drawString(loc.distance(dist),60,30);flip(buf,Yoff+130);g.setFont("6x8",1);g.setColor(0,0,0);g.fillRect(10,230,60,239);g.setColor(1,1,1);g.drawString("Sats "+satellites.toString(),10,230)}var savedfix; +function onGPS(a){savedfix=a;void 0!==a&&(course=isNaN(a.course)?course:Math.round(a.course),speed=isNaN(a.speed)?speed:a.speed,satellites=a.satellites);candraw&&(void 0!==a&&1==a.fix&&(dist=distance(a,wp),isNaN(dist)&&(dist=0),brg=bearing(a,wp),isNaN(brg)&&(brg=0)),drawN())}var intervalRef;function stopdraw(){candraw=!1;intervalRef&&clearInterval(intervalRef)} +function startTimers(){candraw=!0;intervalRefSec=setInterval(function(){heading=newHeading(course,heading);course!=heading&&drawCompass(heading)},200)}function drawAll(){g.setColor(1,.5,.5);g.fillPoly([120,Yoff+50,110,Yoff+70,130,Yoff+70]);g.setColor(1,1,1);drawN();drawCompass(heading)}function startdraw(){g.clear();Bangle.drawWidgets();startTimers();drawAll()} +function setButtons(){setWatch(nextwp.bind(null,-1),BTN1,{repeat:!0,edge:"falling"});setWatch(doselect,BTN2,{repeat:!0,edge:"falling"});setWatch(nextwp.bind(null,1),BTN3,{repeat:!0,edge:"falling"})}var SCREENACCESS={withApp:!0,request:function(){this.withApp=!1;stopdraw();clearWatch()},release:function(){this.withApp=!0;startdraw();setButtons()}};Bangle.on("lcdPower",function(a){SCREENACCESS.withApp&&(a?startdraw():stopdraw())});var waypoints=require("Storage").readJSON("waypoints.json")||[{name:"NONE"}]; +wp=waypoints[0];function nextwp(a){selected&&(wpindex+=a,wpindex>=waypoints.length&&(wpindex=0),0>wpindex&&(wpindex=waypoints.length-1),wp=waypoints[wpindex],drawN())}function doselect(){selected&&0!=wpindex&&void 0===waypoints[wpindex].lat&&savedfix.fix&&(waypoints[wpindex]={name:"@"+wp.name,lat:savedfix.lat,lon:savedfix.lon},wp=waypoints[wpindex],require("Storage").writeJSON("waypoints.json",waypoints));selected=!selected;drawN()}g.clear();Bangle.setLCDBrightness(1);Bangle.loadWidgets();Bangle.drawWidgets(); +Bangle.setGPSPower(1);drawAll();startTimers();Bangle.on("GPS",onGPS);setButtons(); diff --git a/apps/locale/ChangeLog b/apps/locale/ChangeLog index 8338f9f84..c6779bf27 100644 --- a/apps/locale/ChangeLog +++ b/apps/locale/ChangeLog @@ -7,3 +7,4 @@ 0.06: Remove translations if not required Ensure 'on' is always supplied for translations 0.07: Improve handling of non-ASCII characters (fix #469) +0.08: Added Mavigation units and en_NAV diff --git a/apps/locale/locales.js b/apps/locale/locales.js index c29a49937..8d5165711 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -4,13 +4,15 @@ const distanceUnits = { // how many meters per X? "yd": 0.9144, "mi": 1609.34, "km": 1000, - "kmi": 1000 + "kmi": 1000, + "nm": 1852 }; const speedUnits = { // how many kph per X? "kmh": 1, "kph": 1, "km/h": 1, - "mph": 1.60934 + "mph": 1.60934, + "kts": 1.852 }; /* @@ -99,6 +101,24 @@ var locales = { day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday", // No translation for english... }, + "en_NAV": { // navigation units nautical miles and knots + lang: "en_NAV", + decimal_point: ".", + thousands_sep: ",", + currency_symbol: "£", currency_first: true, + int_curr_symbol: "GBP", + speed: 'kts', + distance: { "0": "m", "1": "nm" }, + temperature: '°C', + ampm: { 0: "am", 1: "pm" }, + timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" }, + datePattern: { 0: "%b %d %Y", 1: "%d/%m/%Y" }, // Feb 28 2020" // "01/03/2020"(short) + abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", + month: "January,February,March,April,May,June,July,August,September,October,November,December", + abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat", + day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday", + // No translation for english... + }, "de_DE": { lang: "de_DE", decimal_point: ",",