1
0
Fork 0

Update app.js

master
nujw 2021-10-29 16:14:40 +13:00 committed by GitHub
parent 294729717d
commit 96a6dee94c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 72 additions and 84 deletions

View File

@ -1,11 +1,8 @@
/* /*
Speed and Altitude [speedalt2] Speed and Altitude [speedalt2]
Mike Bennett mike[at]kereru.com Mike Bennett mike[at]kereru.com
0.01 : Initial
0.06 : Add Posn screen
0.07 : Add swipe to change screens same as BTN3
*/ */
var v = '1.05'; var v = '1.06';
/*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */
var KalmanFilter = (function () { var KalmanFilter = (function () {
@ -173,6 +170,15 @@ var KalmanFilter = (function () {
var buf = Graphics.createArrayBuffer(240,160,2,{msb:true}); var buf = Graphics.createArrayBuffer(240,160,2,{msb:true});
let LED = // LED as minimal and only definition (as instance / singleton)
{ isOn: false // status on / off, not needed if you don't need to ask for it
, set: function(v) { // turn on w/ no arg or truey, else off
g.setColor((this.isOn=(v===undefined||!!v))?1:0,0,0).fillCircle(10,10,10); }
, reset: function() { this.set(false); } // turn off
, write: function(v) { this.set(v); } // turn on w/ no arg or truey, else off
, toggle: function() { this.set( ! this.isOn); } // toggle the LED
}, LED1 = LED; // LED1 as 'synonym' for LED
// Load fonts // Load fonts
//require("Font7x11Numeric7Seg").add(Graphics); //require("Font7x11Numeric7Seg").add(Graphics);
@ -183,17 +189,16 @@ var canDraw = 1;
var time = ''; // Last time string displayed. Re displayed in background colour to remove before drawing new time. var time = ''; // Last time string displayed. Re displayed in background colour to remove before drawing new time.
var tmrLP; // Timer for delay in switching to low power after screen turns off var tmrLP; // Timer for delay in switching to low power after screen turns off
var max = {}; var maxSpd = 0;
max.spd = 0; var maxAlt = 0;
max.alt = 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.
max.n = 0; // counter. Only start comparing for max after a certain number of fixes to allow kalman filter to have smoohed the data.
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.
function nxtWp(inc){ function nxtWp(){
cfg.wp+=inc; cfg.wp++;
loadWp(); loadWp();
} }
@ -252,23 +257,14 @@ function drawScrn(dat) {
buf.setFontVector(35); buf.setFontVector(35);
buf.drawString(dat.unit,5,164); buf.drawString(dat.unit,5,164);
if ( dat.max ) drawMax(); // MAX display indicator drawMax(dat.max); // MAX display indicator
if ( dat.wp ) drawWP(); // Waypoint name drawWP(dat.wp); // Waypoint name
drawSats(dat.sats);
//Sats
if ( dat.sat ) {
if ( dat.age > 10 ) {
if ( dat.age > 90 ) dat.age = '>90';
drawSats('Age:'+dat.age);
}
else drawSats('Sats:'+dat.sats);
}
g.reset(); g.reset();
g.drawImage(img,0,40); g.drawImage(img,0,40);
if ( pwrSav ) LED1.reset(); LED1.write(!pwrSav);
else LED1.set();
} }
@ -293,20 +289,12 @@ function drawPosn(dat) {
buf.drawString(dat.ew,x,y+70); buf.drawString(dat.ew,x,y+70);
//Sats drawSats(dat.sats);
if ( dat.sat ) {
if ( dat.age > 10 ) {
if ( dat.age > 90 ) dat.age = '>90';
drawSats('Age:'+dat.age);
}
else drawSats('Sats:'+dat.sats);
}
g.reset(); g.reset();
g.drawImage(img,0,40); g.drawImage(img,0,40);
if ( pwrSav ) LED1.reset(); LED1.write(!pwrSav);
else LED1.set();
} }
@ -329,19 +317,14 @@ function drawClock() {
g.reset(); g.reset();
g.drawImage(img,0,40); g.drawImage(img,0,40);
if ( pwrSav ) LED1.reset(); LED1.write(!pwrSav);
else LED1.set();
} }
function drawWP() { function drawWP(wp) {
var nm = wp.name;
if ( nm == undefined || nm == 'NONE' || cfg.modeA ==1 ) nm = '';
buf.setColor(2); buf.setColor(2);
buf.setFontAlign(0,1); //left, bottom buf.setFontAlign(0,1); //left, bottom
buf.setFontVector(48); buf.setFontVector(48);
buf.drawString(nm.substring(0,8),120,140); buf.drawString(wp,120,140);
} }
function drawSats(sats) { function drawSats(sats) {
@ -351,16 +334,15 @@ function drawSats(sats) {
buf.drawString(sats,240,160); buf.drawString(sats,240,160);
} }
function drawMax() { function drawMax(max) {
buf.setFontVector(30); buf.setFontVector(30);
buf.setColor(2); buf.setColor(2);
buf.setFontAlign(0,1); //centre, bottom buf.setFontAlign(0,1); //centre, bottom
buf.drawString('MAX',120,164); buf.drawString(max,120,164);
} }
function onGPS(fix) { function onGPS(fix) {
if ( emulator ) {
if ( emulator ) {
fix.fix = 1; fix.fix = 1;
fix.speed = 10 + (Math.random()*5); fix.speed = 10 + (Math.random()*5);
fix.alt = 354 + (Math.random()*50); fix.alt = 354 + (Math.random()*50);
@ -382,10 +364,12 @@ function onGPS(fix) {
var ns = ''; var ns = '';
var ew = ''; var ew = '';
var lon = '---.--'; var lon = '---.--';
var sats = '---';
var wpName = ''; // Waypoint name
if (fix.fix) lf = fix; if (fix.fix) lf = fix;
if (lf.fix) { if (lf.fix) {
// Smooth data // Smooth data
@ -393,10 +377,9 @@ function onGPS(fix) {
if ( cfg.spdFilt ) lf.speed = spdFilter.filter(lf.speed); if ( cfg.spdFilt ) lf.speed = spdFilter.filter(lf.speed);
if ( cfg.altFilt ) lf.alt = altFilter.filter(lf.alt); if ( cfg.altFilt ) lf.alt = altFilter.filter(lf.alt);
lf.smoothed = 1; lf.smoothed = 1;
if ( max.n <= 15 ) max.n++; if ( maxN <= 15 ) maxN++;
} }
// Speed // Speed
if ( cfg.spd == 0 ) { if ( cfg.spd == 0 ) {
m = require("locale").speed(lf.speed).match(/([0-9,\.]+)(.*)/); // regex splits numbers from units m = require("locale").speed(lf.speed).match(/([0-9,\.]+)(.*)/); // regex splits numbers from units
@ -408,17 +391,22 @@ function onGPS(fix) {
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 (parseFloat(sp) > parseFloat(max.spd) && max.n > 15 ) max.spd = sp; if (parseFloat(sp) > parseFloat(maxSpd) && maxN > 15 ) maxSpd = sp;
// Altitude // Altitude
al = lf.alt; al = lf.alt;
al = Math.round(parseFloat(al)/parseFloat(cfg.alt)); al = Math.round(parseFloat(al)/parseFloat(cfg.alt));
if (parseFloat(al) > parseFloat(max.alt) && max.n > 15 ) max.alt = al; if (parseFloat(al) > parseFloat(maxAlt) && maxN > 15 ) maxAlt = al;
// Distance to waypoint // Distance to waypoint
di = distance(lf,wp); di = distance(lf,wp);
if (isNaN(di)) di = 0; if (isNaN(di)) di = '--------';
// Waypoint name
wpName = wp.name;
if ( wpName == undefined || wpName == 'NONE' ) wpName = '';
wpName = wpName.substring(0,8);
// 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));
@ -431,6 +419,13 @@ function onGPS(fix) {
ew = 'E'; ew = 'E';
if ( lf.lon < 0 ) ew = 'W'; if ( lf.lon < 0 ) ew = 'W';
lon = Math.abs(lf.lon.toFixed(2)); lon = Math.abs(lf.lon.toFixed(2));
// Sats
if ( age > 10 ) {
sats = 'Age:'+age;
if ( age > 90 ) sats = 'Age:>90';
}
else sats = 'Sats:'+lf.satellites;
} }
@ -438,23 +433,21 @@ function onGPS(fix) {
// Speed // Speed
if ( showMax ) if ( showMax )
drawScrn({ drawScrn({
val:max.spd, val:maxSpd,
unit:cfg.spd_unit, unit:cfg.spd_unit,
sats:lf.satellites, sats:sats,
age:age, age:age,
max:true, max:'MAX',
wp:false, wp:''
sat:true
}); // Speed maximums }); // Speed maximums
else else
drawScrn({ drawScrn({
val:sp, val:sp,
unit:cfg.spd_unit, unit:cfg.spd_unit,
sats:lf.satellites, sats:sats,
age:age, age:age,
max:false, max:'',
wp:false, wp:''
sat:true
}); });
} }
@ -462,23 +455,21 @@ function onGPS(fix) {
// Alt // Alt
if ( showMax ) if ( showMax )
drawScrn({ drawScrn({
val:max.alt, val:maxAlt,
unit:cfg.alt_unit, unit:cfg.alt_unit,
sats:lf.satellites, sats:sats,
age:age, age:age,
max:true, max:'MAX',
wp:false, wp:''
sat:true
}); // Alt maximums }); // Alt maximums
else else
drawScrn({ drawScrn({
val:al, val:al,
unit:cfg.alt_unit, unit:cfg.alt_unit,
sats:lf.satellites, sats:sats,
age:age, age:age,
max:false, max:'',
wp:false, wp:''
sat:true
}); });
} }
@ -487,24 +478,22 @@ function onGPS(fix) {
drawScrn({ drawScrn({
val:di, val:di,
unit:cfg.dist_unit, unit:cfg.dist_unit,
sats:lf.satellites, sats:sats,
age:age, age:age,
max:false, max:'',
wp:true, wp:wpName
sat:true
}); });
} }
if ( cfg.modeA == 3 ) { if ( cfg.modeA == 3 ) {
// Position // Position
drawPosn({ drawPosn({
sats:lf.satellites, sats:sats,
age:age, age:age,
lat:lat, lat:lat,
lon:lon, lon:lon,
ns:ns, ns:ns,
ew:ew, ew:ew
sat:true
}); });
} }
@ -534,9 +523,9 @@ function nextFunc(dur) {
if ( cfg.modeA == 0 || cfg.modeA == 1 ) { if ( cfg.modeA == 0 || cfg.modeA == 1 ) {
// Spd+Alt mode - Switch between fix and MAX // Spd+Alt mode - Switch between fix and MAX
if ( dur < 2 ) showMax = !showMax; // Short press toggle fix/max display if ( dur < 2 ) showMax = !showMax; // Short press toggle fix/max display
else { max.spd = 0; max.alt = 0; } // Long press resets max values. else { maxSpd = 0; maxAlt = 0; } // Long press resets max values.
} }
else if ( cfg.modeA == 2) nxtWp(1); // Dist mode - Select next waypoint else if ( cfg.modeA == 2) nxtWp(); // Dist mode - Select next waypoint
onGPS(lf); onGPS(lf);
} }
@ -545,7 +534,7 @@ function updateClock() {
if (!canDraw) return; if (!canDraw) return;
if ( cfg.modeA != 4 ) return; if ( cfg.modeA != 4 ) return;
drawClock(); drawClock();
if ( emulator ) {max.spd++;max.alt++;} if ( emulator ) {maxSpd++;maxAlt++;}
} }
function startDraw(){ function startDraw(){
@ -585,7 +574,6 @@ function setButtons(){
setWatch(function(e){ setWatch(function(e){
pwrSav=!pwrSav; pwrSav=!pwrSav;
if ( pwrSav ) { if ( pwrSav ) {
LED1.reset();
var s = require('Storage').readJSON('setting.json',1)||{}; var s = require('Storage').readJSON('setting.json',1)||{};
var t = s.timeout||10; var t = s.timeout||10;
Bangle.setLCDTimeout(t); Bangle.setLCDTimeout(t);
@ -593,8 +581,8 @@ function setButtons(){
else { else {
Bangle.setLCDTimeout(0); Bangle.setLCDTimeout(0);
// Bangle.setLCDPower(1); // Bangle.setLCDPower(1);
LED1.set();
} }
LED1.write(!pwrSav);
}, BTN2, {repeat:true,edge:"falling"}); }, BTN2, {repeat:true,edge:"falling"});
// BTN3 - next screen // BTN3 - next screen