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: ",",