mirror of https://github.com/espruino/BangleApps
Update app.js
parent
8468031925
commit
bb1599dff0
|
@ -1,22 +1,28 @@
|
|||
/*
|
||||
To do:
|
||||
-setup page
|
||||
-different units
|
||||
-flight log
|
||||
-statistics page
|
||||
-nav page
|
||||
-navigation
|
||||
*/
|
||||
Bangle.setBarometerPower(true, "tinyVario");
|
||||
Bangle.setGPSPower(true, "tinyVario");
|
||||
|
||||
getAltitude = (p,baseP) => (44330 * (1.0 - Math.pow(p/baseP, 0.1903)));
|
||||
getFL = () => (44330 * (1.0 - Math.pow(pressure/1013.25, 0.1903))).toFixed(0);
|
||||
getTimeString = () => (settings.localTime) ? (require("locale").time(Date(),1)):(Date().toUTCString().slice(Date().toUTCString().length-12,Date().toUTCString().length-7));
|
||||
takeoff = () => {takeoffTime=Date().getTime(); flying=true; landed=false;};
|
||||
land = () => {landingTime=Date().getTime(); flying=false; landed=true;};
|
||||
|
||||
var fg=g.getColor();
|
||||
var bg=g.getBgColor();
|
||||
var red="#F00",green="#0F0";
|
||||
|
||||
const unitsRoc=[
|
||||
{name:"m/s", factor:1, precision:1, layoutCode:{type:"v", halign:1, c: [
|
||||
{type:"txt", font:"12%", halign:0, filly:0, label:"m"},
|
||||
{type:"", height:1,width:"20", bgCol:"#FFF"},
|
||||
{type:"", height:1,width:"20", bgCol:fg},
|
||||
{type:"txt", font:"12%", halign:0, filly:0, label:"s"}]}},
|
||||
{name:"ft/m", factor:196.85039370078738, precision:0, layoutCode:{type:"v", halign:1, c: [
|
||||
{type:"txt", font:"12%", halign:0, filly:0, label:"ft"},
|
||||
{type:"", height:1,width:"30", bgCol:"#FFF"},
|
||||
{type:"", height:1,width:"30", bgCol:fg},
|
||||
{type:"txt", font:"12%", halign:0, filly:0, label:"min"}]}},
|
||||
{name:"kt", factor:1.9438444924406, precision:1, layoutCode:
|
||||
{type:"txt", font:"12%", halign:0, filly:0, label:"kt"}}
|
||||
|
@ -25,12 +31,12 @@ const unitsRoc=[
|
|||
const unitsGs=[
|
||||
{name:"km/h", factor:1, precision:1, layoutCode:{type:"v", halign:1, c: [
|
||||
{type:"txt", font:"12%", halign:0, filly:0, label:"km"},
|
||||
{type:"", height:1,width:"30", bgCol:"#FFF"},
|
||||
{type:"", height:1,width:"30", bgCol:fg},
|
||||
{type:"txt", font:"12%", halign:0, filly:0, label:"h"}]}},
|
||||
{name:"kt", factor:196.85039370078738, precision:0, layoutCode:{type:"txt", font:"12%", halign:0, filly:0, label:"kt"}},
|
||||
{name:"kt", factor:0.5399568, precision:0, layoutCode:{type:"txt", font:"12%", halign:0, filly:0, label:"kt"}},
|
||||
{name:"m/s", factor:0.2777777777777778, precision:1, layoutCode:{type:"v", halign:1, c: [
|
||||
{type:"txt", font:"12%", halign:0, filly:0, label:"m"},
|
||||
{type:"", height:1,width:"20", bgCol:"#FFF"},
|
||||
{type:"", height:1,width:"20", bgCol:fg},
|
||||
{type:"txt", font:"12%", halign:0, filly:0, label:"s"}]}}
|
||||
];
|
||||
|
||||
|
@ -39,165 +45,409 @@ const unitsAlt=[
|
|||
{name:"ft", factor:3.280839895013123, precision:0, layoutCode:{type:"txt", font:"12%", halign:0, filly:0, label:"ft"}}
|
||||
];
|
||||
|
||||
var intTime=10,pressureInterval=100;
|
||||
var altH = [];
|
||||
var altFast=-10000, altSlow=0;
|
||||
var fastGain=0.2, slowGain=0.168;
|
||||
var roc=2,rocAvg=0;
|
||||
var gs;
|
||||
var lastPressure = Date.now();
|
||||
var flying=false;
|
||||
var takeoffTime, flyingTime;
|
||||
var Layout = require("Layout");
|
||||
var speedUnit="km/h", speedFactor=1;
|
||||
var altUnit="m", altFactor=1;
|
||||
var rocUnit=unitsRoc[0];
|
||||
var altUnit=unitsAlt[0];
|
||||
var gsUnit=unitsGs[0];
|
||||
|
||||
function drawVario() {
|
||||
var p = pfd.vario;
|
||||
g.reset();
|
||||
g.clearRect(p.x,p.y,p.x+p.w-1,p.y+p.h-1);
|
||||
if (roc>0.1) g.setColor(0,1,0);
|
||||
if (roc<-1) g.setColor(1,0,0);
|
||||
var y=p.y+p.h/2-roc*(p.h/2)/5;
|
||||
g.fillRect(p.x,p.y+(p.h/2),p.x+p.w-1,Math.clip(y,p.y,p.y+p.h-1));
|
||||
}
|
||||
|
||||
function updateText(t) {
|
||||
if (t.halign==1)
|
||||
g.setFont(t.font).setFontAlign(1,0,0).drawString(t.label, t.x+t.w, t.y+(t.h>>1));
|
||||
else if (t.halign==-1)
|
||||
g.setFont(t.font).setFontAlign(-1,0,0).drawString(t.label, t.x, t.y+(t.h>>1));
|
||||
else
|
||||
g.setFont(t.font).setFontAlign(0,0,0).drawString(t.label, t.x+(t.w>>1), t.y+(t.h>>1));
|
||||
}
|
||||
|
||||
unitROC={type:"v", halign:1, c: [
|
||||
const unitROC={type:"v", halign:1, c: [
|
||||
{type:"txt", font:"12%", halign:0, filly:0, label:"m"},
|
||||
{type:"", height:1,width:"20", bgCol:"#FFF"},
|
||||
{type:"", height:1,width:"20", bgCol:fg},
|
||||
{type:"txt", font:"12%", halign:0, filly:0, label:"s"}
|
||||
]};
|
||||
|
||||
var pfd = new Layout(
|
||||
{type:"v",c: [
|
||||
{type:"h",c: [
|
||||
{type:"", fillx:1, height:"1"}
|
||||
]},
|
||||
{type:"h", c: [
|
||||
/*{type:"v", c:[
|
||||
{type:"", width:"3", height:"3", bgCol:"#FFF"},
|
||||
{type:"", filly:1},
|
||||
{type:"", width:"3", height:"3", bgCol:"#FFF"},
|
||||
{type:"", filly:1},
|
||||
{type:"", width:"3", height:"3", bgCol:"#FFF"},
|
||||
{type:"", filly:1},
|
||||
{type:"", width:"3", height:"3", bgCol:"#FFF"},
|
||||
{type:"", filly:1},
|
||||
{type:"", width:"3", height:"3", bgCol:"#FFF"},
|
||||
{type:"", filly:1},
|
||||
{type:"", width:"3", height:"3", bgCol:"#FFF"},
|
||||
{type:"", filly:1},
|
||||
{type:"", width:"3", height:"3", bgCol:"#FFF"},
|
||||
{type:"", filly:1},
|
||||
{type:"", width:"3", height:"3", bgCol:"#FFF"},
|
||||
{type:"", filly:1},
|
||||
{type:"", width:"3", height:"3", bgCol:"#FFF"},
|
||||
{type:"", filly:1},
|
||||
{type:"", width:"3", height:"3", bgCol:"#FFF"},
|
||||
{type:"", filly:1},
|
||||
{type:"", width:"3", height:"3", bgCol:"#FFF"}
|
||||
]},*/
|
||||
{type:"custom", width:"25", render:drawVario, id:"vario",filly:1 },
|
||||
{type:"", filly:1, width:1, bgCol:"#FFF"},
|
||||
{type:"v",fillx:1, c: [
|
||||
{type:"h", halign:1, c:[
|
||||
{type:"txt",font:"22%", halign:1, filly:1, label:"19999", id:"alt"},
|
||||
altUnit.layoutCode
|
||||
]},
|
||||
{type:"", fillx:1, height:"1", bgCol:"#FFF"},
|
||||
{type:"h", halign:1, c:[
|
||||
{type:"txt", font:"25%", halign:1, filly:1, label:"-99.9", id:"avg" },
|
||||
rocUnit.layoutCode
|
||||
]},
|
||||
{type:"", fillx:1, height:"1", bgCol:"#FFF"},
|
||||
{type:"h", halign:1, c:[
|
||||
{type:"txt", font:"25%", halign:1, filly:1, label:"XXX", id:"gs" },
|
||||
gsUnit.layoutCode
|
||||
var settings = Object.assign({
|
||||
rocU: 0,
|
||||
altU: 0,
|
||||
gsU:0,
|
||||
intTime:10,
|
||||
localTime:true,
|
||||
autoDetect:1
|
||||
}, require('Storage').readJSON("tinyVario.json", true) || {});
|
||||
|
||||
var qnh=Math.floor(Bangle.getOptions().seaLevelPressure);
|
||||
var pfdHandle;
|
||||
var rawP=0, samples=0;
|
||||
var altH = [];
|
||||
var altRaw=-9999, altFast=0, altSlow=0;
|
||||
var fastGain=0.5, slowGain=0.3;
|
||||
var roc=0,rocAvg=0, gs;
|
||||
var lastPressure = Date.now();
|
||||
var pressure = 1000;
|
||||
var flying=false, landed=false;
|
||||
var takeoffTime, landingTime, flyingTime;
|
||||
var Layout = require("Layout");
|
||||
var oldSettings;
|
||||
|
||||
|
||||
function updateText(t) {
|
||||
g.clearRect(t.x,t.y,t.x+t.w-1,t.y+t.h-1);
|
||||
if (t.col) g.setColor(t.col);
|
||||
else g.setColor(fg);
|
||||
if (t.halign==1)
|
||||
g.setFont(t.font).setFontAlign(1,0,0).drawString(t.label, t.x+t.w, t.y+(t.h>>1));
|
||||
else if (t.halign==-1)
|
||||
g.setFont(t.font).setFontAlign(-1,0,0).drawString(t.label, t.x, t.y+(t.h>>1));
|
||||
else
|
||||
g.setFont(t.font).setFontAlign(0,0,0).drawString(t.label, t.x+(t.w>>1), t.y+(t.h>>1));
|
||||
}
|
||||
|
||||
function initPFD() {
|
||||
Bangle.setUI();
|
||||
var pfd = new Layout(
|
||||
{type:"v",c: [
|
||||
/*{type:"h",c: [
|
||||
{type:"", fillx:1, height:"1"}
|
||||
]},*/
|
||||
{type:"h",filly:1, c: [
|
||||
{type:"custom", width:"25", render:()=>{
|
||||
var p = pfd.vario;
|
||||
g.reset();
|
||||
g.clearRect(p.x,p.y,p.x+p.w-1,p.y+p.h-1);
|
||||
if (roc>0.1) g.setColor(0,1,0);
|
||||
if (roc<-1) g.setColor(1,0,0);
|
||||
var y=p.y+p.h/2-roc*(p.h/2)/5;
|
||||
g.fillRect(p.x,p.y+(p.h/2),p.x+p.w-1,Math.clip(y,p.y,p.y+p.h-1));
|
||||
}, id:"vario",filly:1 },
|
||||
{type:"", filly:1, width:1, bgCol:fg},
|
||||
{type:"v",fillx:1, c: [
|
||||
{type:"h", halign:1, c:[
|
||||
{type:"txt", font:"22%", halign:1, filly:1, fillx:1, label:"9999", id:"alt", cb:()=>initAltMenu()},
|
||||
unitsAlt[settings.altU].layoutCode
|
||||
]},
|
||||
{type:"", fillx:1, height:"1", bgCol:fg},
|
||||
{type:"h", halign:1, c:[
|
||||
{type:"txt", font:"25%", halign:1, filly:1, fillx:1, label:"-9.9", id:"avg", cb:()=>initAvgMenu()},
|
||||
unitsRoc[settings.rocU].layoutCode
|
||||
]},
|
||||
{type:"", fillx:1, height:"1", bgCol:fg},
|
||||
{type:"h", halign:1, c:[
|
||||
{type:"txt", font:"25%", halign:1, filly:1, fillx:1, label:"XXX", id:"gs", cb:()=>initGsMenu()},
|
||||
unitsGs[settings.gsU].layoutCode
|
||||
]}
|
||||
]}
|
||||
]},
|
||||
{type:"", fillx:1, height:"1", bgCol:fg},
|
||||
{type:"h",c: [
|
||||
{type:"txt",pad:0, halign:0, font:"15%",fillx:1, label:"99:99", id:"time", cb:()=>initTimeMenu()},
|
||||
{type:"", width:1,height:g.getHeight()*0.15, bgCol:fg},
|
||||
{type:"txt",pad:0, halign:0, font:"15%", fillx:1, label:"--:--", id:"flyingtime", cb:()=>initFlyingTimeMenu() }
|
||||
]}
|
||||
]},
|
||||
{type:"", fillx:1, height:"1", bgCol:"#FFF"},
|
||||
{type:"h",c: [
|
||||
{type:"txt",pad:"1", halign:0, font:"15%",fillx:"1", label:"99:99", id:"time"},
|
||||
{type:"", width:"1", height:g.getHeight()*0.15+2, bgCol:"#FFF"},
|
||||
{type:"txt",pad:"1", halign:0, font:"15%", fillx:"1", label:"99:99", id:"flyingtime" }
|
||||
]}
|
||||
]}//,{lazy:"true"}
|
||||
);
|
||||
pfd.update();
|
||||
]},{lazy:true}
|
||||
);
|
||||
g.clear();
|
||||
pfd.render();
|
||||
//-------testing------
|
||||
//rawP=1000;
|
||||
//samples=1;
|
||||
//--------------------
|
||||
pfdHandle = setInterval(function() {
|
||||
//process pressure readings
|
||||
if (samples) {
|
||||
pressure=rawP/samples;
|
||||
samples=0;
|
||||
rawP=0;
|
||||
if (altRaw==-9999) {//first measurement)
|
||||
altRaw=getAltitude(pressure,qnh);
|
||||
altFast=altRaw;
|
||||
altSlow=altRaw;
|
||||
for (let i = 0; i < settings.intTime*4+1; i++) altH.push(altRaw);
|
||||
}
|
||||
}
|
||||
altRaw=getAltitude(pressure,qnh);
|
||||
altFast=altFast+(altRaw-altFast)*fastGain;
|
||||
altSlow=altSlow+(altRaw-altSlow)*slowGain;
|
||||
altH.push(altRaw);
|
||||
while (altH.length>settings.intTime*4+1) {
|
||||
altH.shift();
|
||||
rocAvg=(altH[altH.length-1]-altH[0])/settings.intTime;
|
||||
}
|
||||
|
||||
if (settings.autoDetect)
|
||||
if ((!flying) && (!landed) && ((rocAvg>1) || (rocAvg<-1) || (gs>10)))
|
||||
takeoff();
|
||||
else if ((flying) && ((rocAvg<1) && (rocAvg>-1) && (gs<10)))
|
||||
land();
|
||||
|
||||
if (flying) {
|
||||
flyingTime=Date().getTime()-takeoffTime;
|
||||
pfd.flyingtime.label=(flyingTime / 3600000).toFixed(0)+":"+(flyingTime / 60000 % 60).toFixed(0).padStart(2,'0');
|
||||
pfd.flyingtime.col=fg;
|
||||
updateText(pfd.flyingtime);
|
||||
} else if (landed) {
|
||||
flyingTime=landingTime-takeoffTime;
|
||||
pfd.flyingtime.label=(flyingTime / 3600000).toFixed(0)+":"+(flyingTime / 60000 % 60).toFixed(0).padStart(2,'0');
|
||||
pfd.flyingtime.col=green;
|
||||
updateText(pfd.flyingtime);
|
||||
}
|
||||
|
||||
roc=(altFast-altSlow)/((0.25/slowGain)-(0.25/fastGain));
|
||||
pfd.alt.label=(altRaw*unitsAlt[settings.altU].factor).toFixed(unitsAlt[settings.altU].precision);
|
||||
pfd.avg.col=(rocAvg<-1) ? (red):((rocAvg>0.1) ? (green):(fg));
|
||||
pfd.avg.label=(rocAvg*unitsRoc[settings.rocU].factor).toFixed(unitsRoc[settings.rocU].precision);
|
||||
|
||||
var gps = Bangle.getGPSFix();
|
||||
if (gps) {
|
||||
pfd.gs.label=(gps.speed*unitsGs[settings.gsU].factor).toFixed(unitsGs[settings.gsU].precision);
|
||||
updateText(pfd.gs);
|
||||
gs=gps.speed;
|
||||
}
|
||||
|
||||
pfd.time.label=getTimeString();
|
||||
updateText(pfd.alt);
|
||||
updateText(pfd.avg);
|
||||
updateText(pfd.time);
|
||||
pfd.vario.render();
|
||||
}, 250);
|
||||
|
||||
}
|
||||
|
||||
function initAltMenu() {
|
||||
oldSettings=Object.assign({},settings);
|
||||
clearInterval(pfdHandle);
|
||||
var altMenu = new Layout ({
|
||||
type:"h", c: [{
|
||||
type:"v", width:180, c: [
|
||||
{type:"btn", font:"12%", pad:2, fillx:1, filly:1, label:"set QNH", cb:()=>initQNHMenu()},
|
||||
{type:"btn", font:"12%", id:"units", pad:2, fillx:1, filly:1, label:"Units: "+unitsAlt[settings.altU].name, cb:()=>{
|
||||
settings.altU=(settings.altU+1)%unitsAlt.length;
|
||||
altMenu.units.label="Units: "+unitsAlt[settings.altU].name;
|
||||
altMenu.render();
|
||||
}},
|
||||
]},
|
||||
{type:"v", c: [
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{
|
||||
settings=Object.assign({},oldSettings);
|
||||
print("old settings restored");
|
||||
initPFD();
|
||||
}},
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"SAVE", cb: ()=>{
|
||||
require('Storage').writeJSON("tinyVario.json", settings);
|
||||
initPFD();
|
||||
}}
|
||||
]}
|
||||
], lazy:true});
|
||||
g.clear();
|
||||
altMenu.render();
|
||||
}
|
||||
|
||||
function initAvgMenu() {
|
||||
oldSettings=Object.assign({},settings);
|
||||
clearInterval(pfdHandle);
|
||||
var avgMenu = new Layout ({
|
||||
type:"h", c: [{
|
||||
type:"v", width:180, c: [
|
||||
{type:"btn", font:"12%", pad:2, fillx:1, filly:1, label:"+", cb:l=>{
|
||||
settings.intTime=Math.clip(settings.intTime+1,1,60);
|
||||
avgMenu.interval.label="Interval: "+settings.intTime+"s";
|
||||
avgMenu.render();
|
||||
}},
|
||||
{type:"btn", id:"interval", font:"10%", pad:2, fillx:1, filly:1, label:"Interval: "+settings.intTime+"s", cb:()=>{}},
|
||||
{type:"btn", font:"12%", pad:2, fillx:1, filly:1, label:"-", cb:l=>{
|
||||
settings.intTime=Math.clip(settings.intTime-1,1,60);
|
||||
avgMenu.interval.label="Interval: "+settings.intTime+"s";
|
||||
avgMenu.render();
|
||||
}},
|
||||
{type:"btn", font:"12%", id:"units", pad:2, fillx:1, filly:1, label:"Units: "+unitsRoc[settings.rocU].name, cb:()=>{
|
||||
settings.rocU=(settings.rocU+1)%unitsRoc.length;
|
||||
avgMenu.units.label="Units: "+unitsRoc[settings.rocU].name;
|
||||
avgMenu.render();
|
||||
}},
|
||||
]},
|
||||
{type:"v", c: [
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{
|
||||
settings=Object.assign({},oldSettings);
|
||||
initPFD();
|
||||
}},
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"SAVE", cb: ()=>{
|
||||
require('Storage').writeJSON("tinyVario.json", settings);
|
||||
initPFD();
|
||||
}}
|
||||
]}
|
||||
], lazy:true});
|
||||
g.clear();
|
||||
avgMenu.render();
|
||||
}
|
||||
|
||||
function initQNHMenu() {
|
||||
var oldQnh=qnh;
|
||||
function updateQNHMenu() {
|
||||
qnhMenu.clear();
|
||||
qnhMenu.alt.label=
|
||||
(getAltitude(pressure,qnh)*unitsAlt[settings.altU].factor).toFixed(unitsAlt[settings.altU].precision)
|
||||
+unitsAlt[settings.altU].name;
|
||||
qnhMenu.qnh.label=qnh;
|
||||
qnhMenu.render();
|
||||
}
|
||||
var qnhMenu = new Layout ( {
|
||||
type:"h", c: [{
|
||||
type:"v", c: [
|
||||
{type:"btn", font:"15%", fillx:1, filly:1, label:"+", cb:l=>{qnh++; updateQNHMenu();} },
|
||||
{type:"v", c: [
|
||||
{type:"h", c: [
|
||||
{type:"txt", font:"13%", fillx:1, filly:1, label:"QNH: "},
|
||||
{type:"txt", font:"13%", fillx:1, filly:1, id:"qnh", label:" "},
|
||||
]},
|
||||
{type:"h", c: [
|
||||
{type:"txt", font:"13%", fillx:1, filly:1, label:"Alt: "},
|
||||
{type:"txt", font:"13%", fillx:1, filly:1, id:"alt", label: " "},
|
||||
]},
|
||||
{type:"btn", font:"15%", fillx:1, filly:1, label:"-", cb:l=>{qnh--; updateQNHMenu();} }
|
||||
]}
|
||||
]},
|
||||
{type:"v", c: [
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{
|
||||
qnh=oldQnh;//=Object.assign({},oldSettings);
|
||||
initAltMenu();
|
||||
}},
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"SAVE", cb: ()=>{
|
||||
var o=Bangle.getOptions();
|
||||
o.seaLevelPressure=qnh;
|
||||
Bangle.setOptions(o);
|
||||
initAltMenu();
|
||||
}}
|
||||
]}
|
||||
],lazy:true});
|
||||
g.clear();
|
||||
qnhMenu.render();
|
||||
updateQNHMenu();
|
||||
}
|
||||
|
||||
function initGsMenu() {
|
||||
oldSettings=Object.assign({},settings);
|
||||
clearInterval(pfdHandle);
|
||||
var gsMenu = new Layout ({
|
||||
type:"h", c: [
|
||||
{type:"btn", font:"20%", id:"units", pad:2, fillx:1, filly:1, label:"Units:\n"+unitsGs[settings.gsU].name, cb:()=>{
|
||||
settings.gsU=(settings.gsU+1)%unitsGs.length;
|
||||
gsMenu.units.label="Units:\n"+unitsGs[settings.gsU].name;
|
||||
gsMenu.render();
|
||||
}},
|
||||
{type:"v", c: [
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{
|
||||
settings=Object.assign({},oldSettings);
|
||||
print("old settings restored");
|
||||
initPFD();
|
||||
}},
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"SAVE", cb: ()=>{
|
||||
require('Storage').writeJSON("tinyVario.json", settings);
|
||||
initPFD();
|
||||
}}
|
||||
]}
|
||||
], lazy:true});
|
||||
g.clear();
|
||||
gsMenu.render();
|
||||
}
|
||||
|
||||
function initTimeMenu() {
|
||||
oldSettings=Object.assign({},settings);
|
||||
clearInterval(pfdHandle);
|
||||
var timeMenu = new Layout ({
|
||||
type:"h", c: [
|
||||
{type:"btn", font:"20%", id:"format", pad:2, fillx:1, filly:1, label:"Time:\n"+((settings.localTime==true) ? ("LCL") : ("UTC")), cb:()=>{
|
||||
settings.localTime=!settings.localTime;
|
||||
timeMenu.format.label="Time:\n"+((settings.localTime==true) ? ("LCL") : ("UTC"));
|
||||
timeMenu.render();
|
||||
}},
|
||||
{type:"v", c: [
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{
|
||||
settings=Object.assign({},oldSettings);
|
||||
initPFD();
|
||||
}},
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"SAVE", cb: ()=>{
|
||||
require('Storage').writeJSON("tinyVario.json", settings);
|
||||
initPFD();
|
||||
}}
|
||||
]}
|
||||
], lazy:true});
|
||||
g.clear();
|
||||
timeMenu.render();
|
||||
}
|
||||
|
||||
function initTimeMenu() {
|
||||
oldSettings=Object.assign({},settings);
|
||||
clearInterval(pfdHandle);
|
||||
var timeMenu = new Layout ({
|
||||
type:"h", c: [
|
||||
{type:"btn", font:"20%", id:"format", pad:2, fillx:1, filly:1, label:"Time:\n"+((settings.localTime==true) ? ("LCL") : ("UTC")), cb:()=>{
|
||||
settings.localTime=!settings.localTime;
|
||||
timeMenu.format.label="Time:\n"+((settings.localTime==true) ? ("LCL") : ("UTC"));
|
||||
timeMenu.render();
|
||||
}},
|
||||
{type:"v", c: [
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{
|
||||
settings=Object.assign({},oldSettings);
|
||||
initPFD();
|
||||
}},
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"SAVE", cb: ()=>{
|
||||
require('Storage').writeJSON("tinyVario.json", settings);
|
||||
initPFD();
|
||||
}}
|
||||
]}
|
||||
], lazy:true});
|
||||
g.clear();
|
||||
timeMenu.render();
|
||||
}
|
||||
|
||||
function initFlyingTimeMenu() {
|
||||
oldSettings=Object.assign({},settings);
|
||||
clearInterval(pfdHandle);
|
||||
var ftMenu = new Layout (
|
||||
{type:"h", c: [
|
||||
{type:"v", c: [
|
||||
{type:"btn", font:"12%", pad:2, fillx:1, filly:1, label:"Toggle\nAutodetect", cb:()=>{
|
||||
settings.autodetect=!settings.autodetect;
|
||||
ftMenu.manual.label= (settings.autodetect==true)?
|
||||
("AUTO"):((flying) ? ("Manual\nLAND") : ("Manual\nTAKE OFF"));
|
||||
ftMenu.render();
|
||||
}},
|
||||
{type:"btn", font:"12%", id:"manual", pad:2, fillx:1, filly:1, label:(settings.autodetect==true)?
|
||||
("AUTO"):((flying) ? ("Manual\nLAND") : ("Manual\nTAKE OFF")), cb:()=>{
|
||||
if (settings.autodetect==false) {
|
||||
if (!flying) {
|
||||
E.showPrompt("Take off now?").then((v)=> {
|
||||
if (v) {
|
||||
takeoff();
|
||||
initPFD();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
E.showPrompt("Land now?").then((v)=> {
|
||||
if (v) {
|
||||
land();
|
||||
initPFD();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{type:"btn", font:"12%", pad:2, fillx:1, filly:1, label:"Reset", cb:()=>{
|
||||
E.showPrompt("Reset Flight?").then((v)=> {
|
||||
flying=false;
|
||||
landed=false;
|
||||
initPFD();
|
||||
});
|
||||
}}
|
||||
]},
|
||||
{type:"v", c: [
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{
|
||||
settings=Object.assign({},oldSettings);
|
||||
initPFD();
|
||||
}},
|
||||
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"SAVE", cb: ()=>{
|
||||
require('Storage').writeJSON("tinyVario.json", settings);
|
||||
initPFD();
|
||||
}}
|
||||
]}
|
||||
], lazy:true});
|
||||
g.clear();
|
||||
ftMenu.render();
|
||||
}
|
||||
|
||||
Bangle.setGPSPower(true, "tinyVario");
|
||||
Bangle.setBarometerPower(true, "tinyVario");
|
||||
|
||||
Bangle.on('pressure', function(e) {
|
||||
if ((altFast)==-10000) {
|
||||
altFast=e.altitude;
|
||||
altSlow=e.altitude;
|
||||
if (samples<10) { //no need to gather more samples when stuck in a menu
|
||||
rawP+=e.pressure;
|
||||
samples++;
|
||||
}
|
||||
altFast=altFast+(e.altitude-altFast)*fastGain;
|
||||
altSlow=altSlow+(e.altitude-altSlow)*0.09093;
|
||||
});
|
||||
|
||||
Bangle.on('GPS', function(fix) {
|
||||
gs=fix.speed;
|
||||
});
|
||||
|
||||
/*setWatch(function() {
|
||||
|
||||
}, BTN1);*/
|
||||
|
||||
setInterval(function () {
|
||||
altH.push(altSlow);
|
||||
if (altH.length>intTime*1000/pressureInterval) {
|
||||
altH.shift();
|
||||
rocAvg=(altH[altH.length-1]-altH[0])/intTime;
|
||||
}
|
||||
}, pressureInterval);
|
||||
|
||||
g.clear();
|
||||
pfd.render();
|
||||
|
||||
setInterval(function() {
|
||||
pfd.clear(pfd.alt);
|
||||
pfd.clear(pfd.avg);
|
||||
pfd.clear(pfd.time);
|
||||
rocAvg=1*rocUnit.factor;
|
||||
if ((!flying) && ((rocAvg>1) || (rocAvg<-1) || (gs>10))) { //take-off detected
|
||||
takeoffTime=Date().getTime();
|
||||
flying=true;
|
||||
}
|
||||
if (flying) {
|
||||
pfd.clear(pfd.flyingtime);
|
||||
flyingTime=Date().getTime()-takeoffTime;
|
||||
pfd.flyingtime.label=(flyingTime / 3600000).toFixed(0)+":"+(flyingTime / 60000 % 60).toFixed(0).padStart(2,'0');
|
||||
}
|
||||
roc=(altFast-altSlow)/(pressureInterval/1000/slowGain)-(pressureInterval/1000/fastGain);
|
||||
pfd.alt.label=(altSlow).toFixed(0);
|
||||
if (rocAvg>0.1) pfd.avg.col="#0f0";
|
||||
else if (rocAvg<-1) pfd.avg.col="#f00";
|
||||
else pfd.avg.col="#fff";
|
||||
pfd.avg.label=(rocAvg*rocUnit.factor).toFixed(rocUnit.precision);
|
||||
if (!isNaN(gs)) {
|
||||
pfd.gs.label=gs.toFixed(0);
|
||||
pfd.clear(pfd.gs);
|
||||
}
|
||||
pfd.time.label=require("locale").time(Date(),1);
|
||||
updateText(pfd.alt);
|
||||
updateText(pfd.avg);
|
||||
updateText(pfd.gs);
|
||||
updateText(pfd.time);
|
||||
updateText(pfd.flyingtime);
|
||||
drawVario();
|
||||
// pfd.debug(pfd.roc);
|
||||
//pfd.render();
|
||||
}, 250);
|
||||
|
||||
initPFD();
|
||||
|
|
Loading…
Reference in New Issue