forked from FOSS/BangleApps
commit
ce104eb0c8
|
@ -3233,7 +3233,7 @@
|
||||||
"name": "GPS Adventure Sports II",
|
"name": "GPS Adventure Sports II",
|
||||||
"shortName":"GPS Adv Sport II",
|
"shortName":"GPS Adv Sport II",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"version":"1.12",
|
"version":"1.14",
|
||||||
"description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.",
|
"description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.",
|
||||||
"tags": "tool,outdoors",
|
"tags": "tool,outdoors",
|
||||||
"supports": ["BANGLEJS"],
|
"supports": ["BANGLEJS"],
|
||||||
|
|
|
@ -2,8 +2,9 @@
|
||||||
Speed and Altitude [speedalt2]
|
Speed and Altitude [speedalt2]
|
||||||
Mike Bennett mike[at]kereru.com
|
Mike Bennett mike[at]kereru.com
|
||||||
1.10 : add inverted colours
|
1.10 : add inverted colours
|
||||||
|
1.14 : Add VMG screen
|
||||||
*/
|
*/
|
||||||
var v = '1.10';
|
var v = '1.14';
|
||||||
|
|
||||||
/*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */
|
/*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */
|
||||||
var KalmanFilter = (function () {
|
var KalmanFilter = (function () {
|
||||||
|
@ -194,6 +195,10 @@ var maxSpd = 0;
|
||||||
var maxAlt = 0;
|
var maxAlt = 0;
|
||||||
var maxN = 0; // counter. Only start comparing for max after a certain number of fixes to allow kalman filter to have smoohed the data.
|
var maxN = 0; // counter. Only start comparing for max after a certain number of fixes to allow kalman filter to have smoohed the data.
|
||||||
|
|
||||||
|
// Previous values for calculating VMG.
|
||||||
|
var lastDist = -1;
|
||||||
|
var lastTime = -1;
|
||||||
|
|
||||||
var emulator = (process.env.BOARD=="EMSCRIPTEN")?1:0; // 1 = running in emulator. Supplies test values;
|
var emulator = (process.env.BOARD=="EMSCRIPTEN")?1:0; // 1 = running in emulator. Supplies test values;
|
||||||
|
|
||||||
var wp = {}; // Waypoint to use for distance from cur position.
|
var wp = {}; // Waypoint to use for distance from cur position.
|
||||||
|
@ -201,6 +206,8 @@ var wp = {}; // Waypoint to use for distance from cur position.
|
||||||
function nxtWp(){
|
function nxtWp(){
|
||||||
cfg.wp++;
|
cfg.wp++;
|
||||||
loadWp();
|
loadWp();
|
||||||
|
lastDist = -1; // Reset VMG calcs
|
||||||
|
lastTime = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadWp() {
|
function loadWp() {
|
||||||
|
@ -219,11 +226,11 @@ function distance(a,b){
|
||||||
var x = radians(a.lon-b.lon) * Math.cos(radians((a.lat+b.lat)/2));
|
var x = radians(a.lon-b.lon) * Math.cos(radians((a.lat+b.lat)/2));
|
||||||
var y = radians(b.lat-a.lat);
|
var y = radians(b.lat-a.lat);
|
||||||
|
|
||||||
// Distance in selected units
|
// Distance in metres
|
||||||
var d = Math.sqrt(x*x + y*y) * 6371000;
|
var d = Math.sqrt(x*x + y*y) * 6371000;
|
||||||
d = (d/parseFloat(cfg.dist)).toFixed(2);
|
// d = (d/parseFloat(cfg.dist)).toFixed(2);
|
||||||
if ( d >= 100 ) d = parseFloat(d).toFixed(1);
|
// if ( d >= 100 ) d = parseFloat(d).toFixed(1);
|
||||||
if ( d >= 1000 ) d = parseFloat(d).toFixed(0);
|
// if ( d >= 1000 ) d = parseFloat(d).toFixed(0);
|
||||||
|
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
@ -328,8 +335,8 @@ function drawClock() {
|
||||||
function drawWP(wp) {
|
function drawWP(wp) {
|
||||||
buf.setColor(3);
|
buf.setColor(3);
|
||||||
buf.setFontAlign(0,1); //left, bottom
|
buf.setFontAlign(0,1); //left, bottom
|
||||||
buf.setFontVector(48);
|
buf.setFontVector(40);
|
||||||
buf.drawString(wp,120,140);
|
buf.drawString(wp,120,132);
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawSats(sats) {
|
function drawSats(sats) {
|
||||||
|
@ -370,6 +377,7 @@ if ( emulator ) {
|
||||||
var ew = '';
|
var ew = '';
|
||||||
var lon = '---.--';
|
var lon = '---.--';
|
||||||
var sats = '---';
|
var sats = '---';
|
||||||
|
var vmg = '---';
|
||||||
|
|
||||||
// Waypoint name
|
// Waypoint name
|
||||||
var wpName = wp.name;
|
var wpName = wp.name;
|
||||||
|
@ -389,17 +397,10 @@ if ( emulator ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Speed
|
// Speed
|
||||||
if ( cfg.spd == 0 ) {
|
sp = parseFloat(lf.speed)/parseFloat(cfg.spd); // Calculate for selected units
|
||||||
m = require("locale").speed(lf.speed).match(/([0-9,\.]+)(.*)/); // regex splits numbers from units
|
|
||||||
sp = parseFloat(m[1]);
|
|
||||||
cfg.spd_unit = m[2];
|
|
||||||
}
|
|
||||||
else sp = parseFloat(lf.speed)/parseFloat(cfg.spd); // Calculate for selected units
|
|
||||||
|
|
||||||
if ( sp < 10 ) sp = sp.toFixed(1);
|
if ( sp < 10 ) sp = sp.toFixed(1);
|
||||||
else sp = Math.round(sp);
|
else sp = Math.round(sp);
|
||||||
if (isNaN(sp)) sp = '---';
|
if (isNaN(sp)) sp = '---';
|
||||||
|
|
||||||
if (parseFloat(sp) > parseFloat(maxSpd) && maxN > 15 ) maxSpd = sp;
|
if (parseFloat(sp) > parseFloat(maxSpd) && maxN > 15 ) maxSpd = sp;
|
||||||
|
|
||||||
// Altitude
|
// Altitude
|
||||||
|
@ -408,9 +409,34 @@ if ( emulator ) {
|
||||||
if (parseFloat(al) > parseFloat(maxAlt) && maxN > 15 ) maxAlt = al;
|
if (parseFloat(al) > parseFloat(maxAlt) && maxN > 15 ) maxAlt = al;
|
||||||
if (isNaN(al)) al = '---';
|
if (isNaN(al)) al = '---';
|
||||||
|
|
||||||
// Distance to waypoint
|
// Distance to waypoint and vmg
|
||||||
di = distance(lf,wp);
|
di = distance(lf,wp);
|
||||||
if (isNaN(di)) di = '--------';
|
|
||||||
|
//lastDist = 13640;
|
||||||
|
//lastTime = (getTime()/1000) - 10;
|
||||||
|
|
||||||
|
if ( lastDist != -1 && ! isNaN(lastDist)) {
|
||||||
|
//console.log(' Distance : '+di);
|
||||||
|
//console.log('last.Distance : '+lastDist);
|
||||||
|
//console.log('last.Time : '+lastTime);
|
||||||
|
|
||||||
|
// Have two WP distances and a time. Calc speed
|
||||||
|
vmg = ((lastDist-di)/1000)/((getTime()/1000-lastTime)/3600); // k/h
|
||||||
|
vmg = vmg/parseFloat(cfg.spd); // Calculate for selected units
|
||||||
|
//console.log('VMG : '+vmg);
|
||||||
|
}
|
||||||
|
lastDist = di;
|
||||||
|
lastTime = getTime()/1000; // secs
|
||||||
|
|
||||||
|
di = (di/parseFloat(cfg.dist)).toFixed(2);
|
||||||
|
if ( di >= 100 ) di = parseFloat(di).toFixed(1);
|
||||||
|
if ( di >= 1000 ) di = parseFloat(di).toFixed(0);
|
||||||
|
|
||||||
|
if ( Math.abs(vmg) < 10 ) vmg = vmg.toFixed(1);
|
||||||
|
else vmg = Math.round(vmg);
|
||||||
|
|
||||||
|
if (isNaN(vmg)) vmg = '---';
|
||||||
|
if (isNaN(di)) di = '------';
|
||||||
|
|
||||||
// Age of last fix (secs)
|
// Age of last fix (secs)
|
||||||
age = Math.max(0,Math.round(getTime())-(lf.time.getTime()/1000));
|
age = Math.max(0,Math.round(getTime())-(lf.time.getTime()/1000));
|
||||||
|
@ -490,6 +516,18 @@ if ( emulator ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( cfg.modeA == 3 ) {
|
if ( cfg.modeA == 3 ) {
|
||||||
|
// VMG
|
||||||
|
drawScrn({
|
||||||
|
val:vmg,
|
||||||
|
unit:cfg.spd_unit,
|
||||||
|
sats:sats,
|
||||||
|
age:age,
|
||||||
|
max:'VMG',
|
||||||
|
wp:wpName
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( cfg.modeA == 4 ) {
|
||||||
// Position
|
// Position
|
||||||
drawPosn({
|
drawPosn({
|
||||||
sats:sats,
|
sats:sats,
|
||||||
|
@ -501,7 +539,7 @@ if ( emulator ) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( cfg.modeA == 4 ) {
|
if ( cfg.modeA == 5 ) {
|
||||||
// Large clock
|
// Large clock
|
||||||
drawClock();
|
drawClock();
|
||||||
}
|
}
|
||||||
|
@ -510,14 +548,14 @@ if ( emulator ) {
|
||||||
|
|
||||||
function prevScrn() {
|
function prevScrn() {
|
||||||
cfg.modeA = cfg.modeA-1;
|
cfg.modeA = cfg.modeA-1;
|
||||||
if ( cfg.modeA < 0 ) cfg.modeA = 4;
|
if ( cfg.modeA < 0 ) cfg.modeA = 5;
|
||||||
savSettings();
|
savSettings();
|
||||||
onGPS(lf);
|
onGPS(lf);
|
||||||
}
|
}
|
||||||
|
|
||||||
function nextScrn() {
|
function nextScrn() {
|
||||||
cfg.modeA = cfg.modeA+1;
|
cfg.modeA = cfg.modeA+1;
|
||||||
if ( cfg.modeA > 4 ) cfg.modeA = 0;
|
if ( cfg.modeA > 5 ) cfg.modeA = 0;
|
||||||
savSettings();
|
savSettings();
|
||||||
onGPS(lf);
|
onGPS(lf);
|
||||||
}
|
}
|
||||||
|
@ -529,14 +567,14 @@ function nextFunc(dur) {
|
||||||
if ( dur < 2 ) showMax = !showMax; // Short press toggle fix/max display
|
if ( dur < 2 ) showMax = !showMax; // Short press toggle fix/max display
|
||||||
else { maxSpd = 0; maxAlt = 0; } // Long press resets max values.
|
else { maxSpd = 0; maxAlt = 0; } // Long press resets max values.
|
||||||
}
|
}
|
||||||
else if ( cfg.modeA == 2) nxtWp(); // Dist mode - Select next waypoint
|
else if ( cfg.modeA == 2 || cfg.modeA == 3) nxtWp(); // Dist or VMG mode - Select next waypoint
|
||||||
onGPS(lf);
|
onGPS(lf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function updateClock() {
|
function updateClock() {
|
||||||
if (!canDraw) return;
|
if (!canDraw) return;
|
||||||
if ( cfg.modeA != 4 ) return;
|
if ( cfg.modeA != 5 ) return;
|
||||||
drawClock();
|
drawClock();
|
||||||
if ( emulator ) {maxSpd++;maxAlt++;}
|
if ( emulator ) {maxSpd++;maxAlt++;}
|
||||||
}
|
}
|
||||||
|
@ -646,15 +684,15 @@ console.log('MDL');
|
||||||
// Read settings.
|
// Read settings.
|
||||||
let cfg = require('Storage').readJSON('speedalt2.json',1)||{};
|
let cfg = require('Storage').readJSON('speedalt2.json',1)||{};
|
||||||
|
|
||||||
cfg.spd = cfg.spd||0; // Multiplier for speed unit conversions. 0 = use the locale values for speed
|
cfg.spd = cfg.spd||1; // Multiplier for speed unit conversions. 0 = use the locale values for speed
|
||||||
cfg.spd_unit = cfg.spd_unit||''; // Displayed speed unit
|
cfg.spd_unit = cfg.spd_unit||'kph'; // Displayed speed unit
|
||||||
cfg.alt = cfg.alt||0.3048;// Multiplier for altitude unit conversions.
|
cfg.alt = cfg.alt||0.3048;// Multiplier for altitude unit conversions.
|
||||||
cfg.alt_unit = cfg.alt_unit||'feet'; // Displayed altitude units
|
cfg.alt_unit = cfg.alt_unit||'feet'; // Displayed altitude units
|
||||||
cfg.dist = cfg.dist||1000;// Multiplier for distnce unit conversions.
|
cfg.dist = cfg.dist||1000;// Multiplier for distnce unit conversions.
|
||||||
cfg.dist_unit = cfg.dist_unit||'km'; // Displayed altitude units
|
cfg.dist_unit = cfg.dist_unit||'km'; // Displayed altitude units
|
||||||
cfg.colour = cfg.colour||0; // Colour scheme.
|
cfg.colour = cfg.colour||0; // Colour scheme.
|
||||||
cfg.wp = cfg.wp||0; // Last selected waypoint for dist
|
cfg.wp = cfg.wp||0; // Last selected waypoint for dist
|
||||||
cfg.modeA = cfg.modeA||0; // 0=Speed 1=Alt 2=Dist 3=Position 4=Clock
|
cfg.modeA = cfg.modeA||0; // 0=Speed 1=Alt 2=Dist 3 = vmg 4=Position 5=Clock
|
||||||
cfg.primSpd = cfg.primSpd||0; // 1 = Spd in primary, 0 = Spd in secondary
|
cfg.primSpd = cfg.primSpd||0; // 1 = Spd in primary, 0 = Spd in secondary
|
||||||
|
|
||||||
cfg.spdFilt = cfg.spdFilt==undefined?true:cfg.spdFilt;
|
cfg.spdFilt = cfg.spdFilt==undefined?true:cfg.spdFilt;
|
||||||
|
|
Loading…
Reference in New Issue