1
0
Fork 0

Update app.js

master
nujw 2021-11-01 08:51:40 +13:00 committed by GitHub
parent a5becb249b
commit adcdb50cbc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 63 additions and 25 deletions

View File

@ -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.11 : Add VMG screen
*/ */
var v = '1.10'; var v = '1.11';
/*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;