forked from FOSS/BangleApps
Update app.js
parent
294729717d
commit
96a6dee94c
|
@ -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,10 +364,12 @@ function onGPS(fix) {
|
|||
var ns = '';
|
||||
var ew = '';
|
||||
var lon = '---.--';
|
||||
var sats = '---';
|
||||
var wpName = ''; // Waypoint name
|
||||
|
||||
|
||||
if (fix.fix) lf = fix;
|
||||
|
||||
|
||||
if (lf.fix) {
|
||||
|
||||
// Smooth data
|
||||
|
@ -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));
|
||||
|
@ -431,6 +419,13 @@ function onGPS(fix) {
|
|||
ew = 'E';
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
|
@ -438,23 +433,21 @@ function onGPS(fix) {
|
|||
// 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
|
||||
|
|
Loading…
Reference in New Issue