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]
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 */
var KalmanFilter = (function () {
@ -173,6 +170,15 @@ var KalmanFilter = (function () {
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
//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 tmrLP; // Timer for delay in switching to low power after screen turns off
var max = {};
max.spd = 0;
max.alt = 0;
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 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.
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.
function nxtWp(inc){
cfg.wp+=inc;
function nxtWp(){
cfg.wp++;
loadWp();
}
@ -252,23 +257,14 @@ function drawScrn(dat) {
buf.setFontVector(35);
buf.drawString(dat.unit,5,164);
if ( dat.max ) drawMax(); // MAX display indicator
if ( dat.wp ) drawWP(); // Waypoint name
//Sats
if ( dat.sat ) {
if ( dat.age > 10 ) {
if ( dat.age > 90 ) dat.age = '>90';
drawSats('Age:'+dat.age);
}
else drawSats('Sats:'+dat.sats);
}
drawMax(dat.max); // MAX display indicator
drawWP(dat.wp); // Waypoint name
drawSats(dat.sats);
g.reset();
g.drawImage(img,0,40);
if ( pwrSav ) LED1.reset();
else LED1.set();
LED1.write(!pwrSav);
}
@ -293,20 +289,12 @@ function drawPosn(dat) {
buf.drawString(dat.ew,x,y+70);
//Sats
if ( dat.sat ) {
if ( dat.age > 10 ) {
if ( dat.age > 90 ) dat.age = '>90';
drawSats('Age:'+dat.age);
}
else drawSats('Sats:'+dat.sats);
}
drawSats(dat.sats);
g.reset();
g.drawImage(img,0,40);
if ( pwrSav ) LED1.reset();
else LED1.set();
LED1.write(!pwrSav);
}
@ -329,19 +317,14 @@ function drawClock() {
g.reset();
g.drawImage(img,0,40);
if ( pwrSav ) LED1.reset();
else LED1.set();
LED1.write(!pwrSav);
}
function drawWP() {
var nm = wp.name;
if ( nm == undefined || nm == 'NONE' || cfg.modeA ==1 ) nm = '';
function drawWP(wp) {
buf.setColor(2);
buf.setFontAlign(0,1); //left, bottom
buf.setFontVector(48);
buf.drawString(nm.substring(0,8),120,140);
buf.drawString(wp,120,140);
}
function drawSats(sats) {
@ -351,16 +334,15 @@ function drawSats(sats) {
buf.drawString(sats,240,160);
}
function drawMax() {
function drawMax(max) {
buf.setFontVector(30);
buf.setColor(2);
buf.setFontAlign(0,1); //centre, bottom
buf.drawString('MAX',120,164);
buf.drawString(max,120,164);
}
function onGPS(fix) {
if ( emulator ) {
if ( emulator ) {
fix.fix = 1;
fix.speed = 10 + (Math.random()*5);
fix.alt = 354 + (Math.random()*50);
@ -382,6 +364,8 @@ function onGPS(fix) {
var ns = '';
var ew = '';
var lon = '---.--';
var sats = '---';
var wpName = ''; // Waypoint name
if (fix.fix) lf = fix;
@ -393,10 +377,9 @@ function onGPS(fix) {
if ( cfg.spdFilt ) lf.speed = spdFilter.filter(lf.speed);
if ( cfg.altFilt ) lf.alt = altFilter.filter(lf.alt);
lf.smoothed = 1;
if ( max.n <= 15 ) max.n++;
if ( maxN <= 15 ) maxN++;
}
// Speed
if ( cfg.spd == 0 ) {
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);
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
al = lf.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
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 = Math.max(0,Math.round(getTime())-(lf.time.getTime()/1000));
@ -432,29 +420,34 @@ function onGPS(fix) {
if ( lf.lon < 0 ) ew = 'W';
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;
}
if ( cfg.modeA == 0 ) {
// Speed
if ( showMax )
drawScrn({
val:max.spd,
val:maxSpd,
unit:cfg.spd_unit,
sats:lf.satellites,
sats:sats,
age:age,
max:true,
wp:false,
sat:true
max:'MAX',
wp:''
}); // Speed maximums
else
drawScrn({
val:sp,
unit:cfg.spd_unit,
sats:lf.satellites,
sats:sats,
age:age,
max:false,
wp:false,
sat:true
max:'',
wp:''
});
}
@ -462,23 +455,21 @@ function onGPS(fix) {
// Alt
if ( showMax )
drawScrn({
val:max.alt,
val:maxAlt,
unit:cfg.alt_unit,
sats:lf.satellites,
sats:sats,
age:age,
max:true,
wp:false,
sat:true
max:'MAX',
wp:''
}); // Alt maximums
else
drawScrn({
val:al,
unit:cfg.alt_unit,
sats:lf.satellites,
sats:sats,
age:age,
max:false,
wp:false,
sat:true
max:'',
wp:''
});
}
@ -487,24 +478,22 @@ function onGPS(fix) {
drawScrn({
val:di,
unit:cfg.dist_unit,
sats:lf.satellites,
sats:sats,
age:age,
max:false,
wp:true,
sat:true
max:'',
wp:wpName
});
}
if ( cfg.modeA == 3 ) {
// Position
drawPosn({
sats:lf.satellites,
drawPosn({
sats:sats,
age:age,
lat:lat,
lon:lon,
ns:ns,
ew:ew,
sat:true
ew:ew
});
}
@ -534,9 +523,9 @@ function nextFunc(dur) {
if ( cfg.modeA == 0 || cfg.modeA == 1 ) {
// Spd+Alt mode - Switch between fix and MAX
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);
}
@ -545,7 +534,7 @@ function updateClock() {
if (!canDraw) return;
if ( cfg.modeA != 4 ) return;
drawClock();
if ( emulator ) {max.spd++;max.alt++;}
if ( emulator ) {maxSpd++;maxAlt++;}
}
function startDraw(){
@ -585,7 +574,6 @@ function setButtons(){
setWatch(function(e){
pwrSav=!pwrSav;
if ( pwrSav ) {
LED1.reset();
var s = require('Storage').readJSON('setting.json',1)||{};
var t = s.timeout||10;
Bangle.setLCDTimeout(t);
@ -593,8 +581,8 @@ function setButtons(){
else {
Bangle.setLCDTimeout(0);
// Bangle.setLCDPower(1);
LED1.set();
}
LED1.write(!pwrSav);
}, BTN2, {repeat:true,edge:"falling"});
// BTN3 - next screen