forked from FOSS/BangleApps
Update app.js
parent
294729717d
commit
96a6dee94c
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue