From adcdb50cbc15b651c94e7cc57a4cd74dc3e33ddb Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 08:51:40 +1300 Subject: [PATCH 1/3] Update app.js --- apps/speedalt2/app.js | 88 +++++++++++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 25 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 2cf73dfe9..d61eb4386 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,8 +2,9 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com 1.10 : add inverted colours +1.11 : Add VMG screen */ -var v = '1.10'; +var v = '1.11'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -194,6 +195,10 @@ var maxSpd = 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. +// 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 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(){ cfg.wp++; loadWp(); + lastDist = -1; // Reset VMG calcs + lastTime = -1; } 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 y = radians(b.lat-a.lat); - // Distance in selected units + // Distance in metres var d = Math.sqrt(x*x + y*y) * 6371000; - d = (d/parseFloat(cfg.dist)).toFixed(2); - if ( d >= 100 ) d = parseFloat(d).toFixed(1); - if ( d >= 1000 ) d = parseFloat(d).toFixed(0); +// d = (d/parseFloat(cfg.dist)).toFixed(2); +// if ( d >= 100 ) d = parseFloat(d).toFixed(1); +// if ( d >= 1000 ) d = parseFloat(d).toFixed(0); return d; } @@ -328,8 +335,8 @@ function drawClock() { function drawWP(wp) { buf.setColor(3); buf.setFontAlign(0,1); //left, bottom - buf.setFontVector(48); - buf.drawString(wp,120,140); + buf.setFontVector(40); + buf.drawString(wp,120,132); } function drawSats(sats) { @@ -370,6 +377,7 @@ if ( emulator ) { var ew = ''; var lon = '---.--'; var sats = '---'; + var vmg = '---'; // Waypoint name var wpName = wp.name; @@ -389,17 +397,10 @@ if ( emulator ) { } // Speed - if ( cfg.spd == 0 ) { - 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 - + sp = parseFloat(lf.speed)/parseFloat(cfg.spd); // Calculate for selected units if ( sp < 10 ) sp = sp.toFixed(1); else sp = Math.round(sp); if (isNaN(sp)) sp = '---'; - if (parseFloat(sp) > parseFloat(maxSpd) && maxN > 15 ) maxSpd = sp; // Altitude @@ -408,9 +409,34 @@ if ( emulator ) { if (parseFloat(al) > parseFloat(maxAlt) && maxN > 15 ) maxAlt = al; if (isNaN(al)) al = '---'; - // Distance to waypoint + // Distance to waypoint and vmg 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 = Math.max(0,Math.round(getTime())-(lf.time.getTime()/1000)); @@ -490,6 +516,18 @@ if ( emulator ) { } 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 drawPosn({ sats:sats, @@ -501,7 +539,7 @@ if ( emulator ) { }); } - if ( cfg.modeA == 4 ) { + if ( cfg.modeA == 5 ) { // Large clock drawClock(); } @@ -510,14 +548,14 @@ if ( emulator ) { function prevScrn() { cfg.modeA = cfg.modeA-1; - if ( cfg.modeA < 0 ) cfg.modeA = 4; + if ( cfg.modeA < 0 ) cfg.modeA = 5; savSettings(); onGPS(lf); } function nextScrn() { cfg.modeA = cfg.modeA+1; - if ( cfg.modeA > 4 ) cfg.modeA = 0; + if ( cfg.modeA > 5 ) cfg.modeA = 0; savSettings(); onGPS(lf); } @@ -529,14 +567,14 @@ function nextFunc(dur) { if ( dur < 2 ) showMax = !showMax; // Short press toggle fix/max display 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); } function updateClock() { if (!canDraw) return; - if ( cfg.modeA != 4 ) return; + if ( cfg.modeA != 5 ) return; drawClock(); if ( emulator ) {maxSpd++;maxAlt++;} } @@ -646,15 +684,15 @@ console.log('MDL'); // Read settings. 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_unit = cfg.spd_unit||''; // Displayed speed unit +cfg.spd = cfg.spd||1; // Multiplier for speed unit conversions. 0 = use the locale values for speed +cfg.spd_unit = cfg.spd_unit||'kph'; // Displayed speed unit cfg.alt = cfg.alt||0.3048;// Multiplier for altitude unit conversions. cfg.alt_unit = cfg.alt_unit||'feet'; // Displayed altitude units cfg.dist = cfg.dist||1000;// Multiplier for distnce unit conversions. cfg.dist_unit = cfg.dist_unit||'km'; // Displayed altitude units cfg.colour = cfg.colour||0; // Colour scheme. 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.spdFilt = cfg.spdFilt==undefined?true:cfg.spdFilt; From c5a981d39b9639937188db1cd6cfb11df24df1a4 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 08:52:33 +1300 Subject: [PATCH 2/3] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 46826cf91..2239db796 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "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.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From c329bbe9036a7dda2e12f45648546f3b4c290219 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 08:52:51 +1300 Subject: [PATCH 3/3] Update app.js --- apps/speedalt2/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index d61eb4386..389beda8f 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,9 +2,9 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com 1.10 : add inverted colours -1.11 : Add VMG screen +1.14 : Add VMG screen */ -var v = '1.11'; +var v = '1.14'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () {