Update app.js

pull/2055/head
xxDUxx 2022-07-20 16:29:18 +02:00 committed by GitHub
parent 8ea766de65
commit 7fe89b9b41
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 126 additions and 161 deletions

View File

@ -8,8 +8,6 @@ To do:
getAltitude = (p,baseP) => (44330 * (1.0 - Math.pow(p/baseP, 0.1903))); 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); 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)); 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 fg=g.getColor();
var bg=g.getBgColor(); var bg=g.getBgColor();
@ -27,7 +25,6 @@ const unitsRoc=[
{name:"kt", factor:1.9438444924406, precision:1, layoutCode: {name:"kt", factor:1.9438444924406, precision:1, layoutCode:
{type:"txt", font:"12%", halign:0, filly:0, label:"kt"}} {type:"txt", font:"12%", halign:0, filly:0, label:"kt"}}
]; ];
const unitsGs=[ const unitsGs=[
{name:"km/h", factor:1, precision:1, layoutCode:{type:"v", halign:1, c: [ {name:"km/h", factor:1, precision:1, layoutCode:{type:"v", halign:1, c: [
{type:"txt", font:"12%", halign:0, filly:0, label:"km"}, {type:"txt", font:"12%", halign:0, filly:0, label:"km"},
@ -39,28 +36,28 @@ const unitsGs=[
{type:"", height:1,width:"20", bgCol:fg}, {type:"", height:1,width:"20", bgCol:fg},
{type:"txt", font:"12%", halign:0, filly:0, label:"s"}]}} {type:"txt", font:"12%", halign:0, filly:0, label:"s"}]}}
]; ];
const unitsAlt=[ const unitsAlt=[
{name:"m", factor:1, precision:0, layoutCode:{type:"txt", font:"12%", halign:0, filly:0, label:"m"}}, {name:"m", factor:1, precision:0, layoutCode:{type:"txt", font:"12%", halign:0, filly:0, label:"m"}},
{name:"ft", factor:3.280839895013123, precision:0, layoutCode:{type:"txt", font:"12%", halign:0, filly:0, label:"ft"}} {name:"ft", factor:3.280839895013123, precision:0, layoutCode:{type:"txt", font:"12%", halign:0, filly:0, label:"ft"}}
]; ];
const unitROC={type:"v", halign:1, c: [ const unitROC={type:"v", halign:1, c: [
{type:"txt", font:"12%", halign:0, filly:0, label:"m"}, {type:"txt", font:"12%", halign:0, filly:0, label:"m"},
{type:"", height:1,width:"20", bgCol:fg}, {type:"", height:1,width:"20", bgCol:fg},
{type:"txt", font:"12%", halign:0, filly:0, label:"s"} {type:"txt", font:"12%", halign:0, filly:0, label:"s"}
]}; ]};
const ground=0, flying=1, landed=2, maybeFlying=3, maybeLanded=4;
var settings = Object.assign({ var settings = Object.assign({
rocU: 0, rocU: 0,
altU: 0, altU: 0,
gsU:0, gsU:0,
intTime:10, intTime:10,
localTime:true, localTime:true,
autoDetect:1 autoDetect:true,
}, require('Storage').readJSON("tinyVario.json", true) || {}); }, require('Storage').readJSON("tinyVario.json", true) || {});
var qnh=Math.floor(Bangle.getOptions().seaLevelPressure); var qnh=Math.floor(Bangle.getOptions().seaLevelPressure) || 1013;
var pfdHandle; var pfdHandle;
var rawP=0, samples=0; var rawP=0, samples=0;
var altH = []; var altH = [];
@ -69,12 +66,11 @@ var fastGain=0.5, slowGain=0.3;
var roc=0,rocAvg=0, gs; var roc=0,rocAvg=0, gs;
var lastPressure = Date.now(); var lastPressure = Date.now();
var pressure = 1000; var pressure = 1000;
var flying=false, landed=false; var state=ground;
var takeoffTime, landingTime, flyingTime; var takeoffTime=0, landingTime=0, flyingTime;
var Layout = require("Layout"); var Layout = require("Layout");
var oldSettings; var oldSettings;
function updateText(t) { function updateText(t) {
g.clearRect(t.x,t.y,t.x+t.w-1,t.y+t.h-1); g.clearRect(t.x,t.y,t.x+t.w-1,t.y+t.h-1);
if (t.col) g.setColor(t.col); if (t.col) g.setColor(t.col);
@ -91,9 +87,6 @@ function initPFD() {
Bangle.setUI(); Bangle.setUI();
var pfd = new Layout( var pfd = new Layout(
{type:"v",c: [ {type:"v",c: [
/*{type:"h",c: [
{type:"", fillx:1, height:"1"}
]},*/
{type:"h",filly:1, c: [ {type:"h",filly:1, c: [
{type:"custom", width:"25", render:()=>{ {type:"custom", width:"25", render:()=>{
var p = pfd.vario; var p = pfd.vario;
@ -132,10 +125,6 @@ function initPFD() {
); );
g.clear(); g.clear();
pfd.render(); pfd.render();
//-------testing------
//rawP=1000;
//samples=1;
//--------------------
pfdHandle = setInterval(function() { pfdHandle = setInterval(function() {
//process pressure readings //process pressure readings
if (samples) { if (samples) {
@ -152,24 +141,40 @@ function initPFD() {
altRaw=getAltitude(pressure,qnh); altRaw=getAltitude(pressure,qnh);
altFast=altFast+(altRaw-altFast)*fastGain; altFast=altFast+(altRaw-altFast)*fastGain;
altSlow=altSlow+(altRaw-altSlow)*slowGain; altSlow=altSlow+(altRaw-altSlow)*slowGain;
altH.push(altRaw); altH.push(altFast);
while (altH.length>settings.intTime*4+1) { while (altH.length>settings.intTime*4) {
altH.shift();
rocAvg=(altH[altH.length-1]-altH[0])/settings.intTime; rocAvg=(altH[altH.length-1]-altH[0])/settings.intTime;
altH.shift();
} }
if (settings.autoDetect) if (settings.autoDetect==true) switch (state) {
if ((!flying) && (!landed) && ((rocAvg>1) || (rocAvg<-1) || (gs>10))) case ground:
takeoff(); if ((gs>=5) || (roc>=1) || (roc<=-1)) {
else if ((flying) && ((rocAvg<1) && (rocAvg>-1) && (gs<10))) state=maybeFlying;
land(); takeoffTime=Date().getTime();
}
if (flying) { break;
case maybeFlying:
if (!(gs>=5)&& (roc<1) && (roc>-1)) state=ground;
else if (Date().getTime()-takeoffTime>60000) state=flying;
break;
case flying:
if (!(gs>=5) && (roc<1) && (roc>-1)) {
state=maybeLanded;
landingTime=Date().getTime();
}
break;
case maybeLanded:
if ((gs>=5) || (roc>=1) || (roc<=-1)) state=flying;
else if (Date().getTime()-landingTime>60000) state=landed;
break;
}
if ((state==flying) || (state==maybeLanded)) {
flyingTime=Date().getTime()-takeoffTime; flyingTime=Date().getTime()-takeoffTime;
pfd.flyingtime.label=(flyingTime / 3600000).toFixed(0)+":"+(flyingTime / 60000 % 60).toFixed(0).padStart(2,'0'); pfd.flyingtime.label=(flyingTime / 3600000).toFixed(0)+":"+(flyingTime / 60000 % 60).toFixed(0).padStart(2,'0');
pfd.flyingtime.col=fg; pfd.flyingtime.col=fg;
updateText(pfd.flyingtime); updateText(pfd.flyingtime);
} else if (landed) { } else if (state==landed) {
flyingTime=landingTime-takeoffTime; flyingTime=landingTime-takeoffTime;
pfd.flyingtime.label=(flyingTime / 3600000).toFixed(0)+":"+(flyingTime / 60000 % 60).toFixed(0).padStart(2,'0'); pfd.flyingtime.label=(flyingTime / 3600000).toFixed(0)+":"+(flyingTime / 60000 % 60).toFixed(0).padStart(2,'0');
pfd.flyingtime.col=green; pfd.flyingtime.col=green;
@ -182,7 +187,7 @@ function initPFD() {
pfd.avg.label=(rocAvg*unitsRoc[settings.rocU].factor).toFixed(unitsRoc[settings.rocU].precision); pfd.avg.label=(rocAvg*unitsRoc[settings.rocU].factor).toFixed(unitsRoc[settings.rocU].precision);
var gps = Bangle.getGPSFix(); var gps = Bangle.getGPSFix();
if (gps) { if (gps!=undefined) {
pfd.gs.label=(gps.speed*unitsGs[settings.gsU].factor).toFixed(unitsGs[settings.gsU].precision); pfd.gs.label=(gps.speed*unitsGs[settings.gsU].factor).toFixed(unitsGs[settings.gsU].precision);
updateText(pfd.gs); updateText(pfd.gs);
gs=gps.speed; gs=gps.speed;
@ -198,86 +203,24 @@ function initPFD() {
} }
function initAltMenu() { function initAltMenu() {
var oldQnh=qnh;
function updateAltMenu() {
altMenu.clear();
altMenu.alt.label=
(getAltitude(pressure,qnh)*unitsAlt[settings.altU].factor).toFixed(unitsAlt[settings.altU].precision)
+unitsAlt[settings.altU].name;
altMenu.qnh.label=qnh;
altMenu.render();
}
oldSettings=Object.assign({},settings); oldSettings=Object.assign({},settings);
clearInterval(pfdHandle); clearInterval(pfdHandle);
var altMenu = new Layout ({ var altMenu = new Layout ({
type:"h", c: [{ type:"v", c: [{
type:"v", width:180, c: [ type:"v", width:180, c: [
{type:"btn", font:"12%", pad:2, fillx:1, filly:1, label:"set QNH", cb:()=>initQNHMenu()}, {type:"h", c: [
{type:"btn", font:"12%", id:"units", pad:2, fillx:1, filly:1, label:"Units: "+unitsAlt[settings.altU].name, cb:()=>{ {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label:"-", cb:l=>{qnh--; updateAltMenu();}},
settings.altU=(settings.altU+1)%unitsAlt.length; {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label:"+", cb:l=>{qnh++; updateAltMenu();}}
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:"v", c: [
{type:"h", c: [ {type:"h", c: [
{type:"txt", font:"13%", fillx:1, filly:1, label:"QNH: "}, {type:"txt", font:"13%", fillx:1, filly:1, label:"QNH: "},
@ -286,45 +229,90 @@ function initQNHMenu() {
{type:"h", c: [ {type:"h", c: [
{type:"txt", font:"13%", fillx:1, filly:1, label:"Alt: "}, {type:"txt", font:"13%", fillx:1, filly:1, label:"Alt: "},
{type:"txt", font:"13%", fillx:1, filly:1, id:"alt", label: " "}, {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", font:"12%", id:"units", pad:2, fillx:1, filly:1, label:"Units: "+unitsAlt[settings.altU].name, cb:()=>{
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{ settings.altU=(settings.altU+1)%unitsAlt.length;
qnh=oldQnh;//=Object.assign({},oldSettings); altMenu.units.label="Units: "+unitsAlt[settings.altU].name;
initAltMenu(); altMenu.render();
}}, }},
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"SAVE", cb: ()=>{ ]},
var o=Bangle.getOptions(); {type:"h", c: [
o.seaLevelPressure=qnh; {type:"btn", font:"16%", pad:1, fillx:1, label:"BACK", cb: ()=>{
Bangle.setOptions(o); settings=Object.assign({},oldSettings);
initAltMenu(); print("old settings restored");
initPFD();
}},
{type:"btn", font:"16%", pad:1, fillx:1, label:"SAVE", cb: ()=>{
require('Storage').writeJSON("tinyVario.json", settings);
initPFD();
}} }}
]} ]}
],lazy:true}); ], lazy:true});
g.clear(); g.clear();
qnhMenu.render(); altMenu.render();
updateQNHMenu(); updateAltMenu();
}
function initAvgMenu() {
oldSettings=Object.assign({},settings);
clearInterval(pfdHandle);
var avgMenu = new Layout ({
type:"v", c: [{
type:"v", width:180, c: [
{type:"h", c: [
{type:"btn", font:"12%", pad:2, fillx:1, filly:1, label:"-", cb:l=>{
settings.intTime=Math.clip(settings.intTime-1,1,60);
avgMenu.clear();
avgMenu.interval.label="Interval: "+settings.intTime+"s";
avgMenu.render();
}},
{type:"btn", font:"12%", pad:1, fillx:1, filly:1, label:"+", cb:l=>{
settings.intTime=Math.clip(settings.intTime+1,1,60);
avgMenu.clear();
avgMenu.interval.label="Interval: "+settings.intTime+"s";
avgMenu.render();
}}
]},
{type:"txt", id:"interval", font:"10%", pad:1, fillx:1, filly:1, label:"Interval: "+settings.intTime+"s"},
{type:"btn", font:"12%", id:"units", pad:1, 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:"h", c: [
{type:"btn", font:"16%", pad:1, fillx:1, label:"BACK", cb: ()=>{
settings=Object.assign({},oldSettings);
initPFD();
}},
{type:"btn", font:"16%", pad:1, fillx:1, label:"SAVE", cb: ()=>{
require('Storage').writeJSON("tinyVario.json", settings);
initPFD();
}}
]}
], lazy:true});
g.clear();
avgMenu.render();
} }
function initGsMenu() { function initGsMenu() {
oldSettings=Object.assign({},settings); oldSettings=Object.assign({},settings);
clearInterval(pfdHandle); clearInterval(pfdHandle);
var gsMenu = new Layout ({ var gsMenu = new Layout ({
type:"h", c: [ type:"v", c: [
{type:"btn", font:"20%", id:"units", pad:2, fillx:1, filly:1, label:"Units:\n"+unitsGs[settings.gsU].name, cb:()=>{ {type:"btn", font:"20%", id:"units", pad:1, fillx:1, filly:1, label:"Units:\n"+unitsGs[settings.gsU].name, cb:()=>{
settings.gsU=(settings.gsU+1)%unitsGs.length; settings.gsU=(settings.gsU+1)%unitsGs.length;
gsMenu.units.label="Units:\n"+unitsGs[settings.gsU].name; gsMenu.units.label="Units:\n"+unitsGs[settings.gsU].name;
gsMenu.render(); gsMenu.render();
}}, }},
{type:"v", c: [ {type:"h", c: [
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{ {type:"btn", font:"16%", pad:1, fillx:1, label:"BACK", cb: ()=>{
settings=Object.assign({},oldSettings); settings=Object.assign({},oldSettings);
print("old settings restored"); print("old settings restored");
initPFD(); initPFD();
}}, }},
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"SAVE", cb: ()=>{ {type:"btn", font:"16%", pad:1, fillx:1, label:"SAVE", cb: ()=>{
require('Storage').writeJSON("tinyVario.json", settings); require('Storage').writeJSON("tinyVario.json", settings);
initPFD(); initPFD();
}} }}
@ -338,43 +326,18 @@ function initTimeMenu() {
oldSettings=Object.assign({},settings); oldSettings=Object.assign({},settings);
clearInterval(pfdHandle); clearInterval(pfdHandle);
var timeMenu = new Layout ({ var timeMenu = new Layout ({
type:"h", c: [ type:"v", c: [
{type:"btn", font:"20%", id:"format", pad:2, fillx:1, filly:1, label:"Time:\n"+((settings.localTime==true) ? ("LCL") : ("UTC")), cb:()=>{ {type:"btn", font:"20%", id:"format", pad:1, fillx:1, filly:1, label:"Time:\n"+((settings.localTime==true) ? ("LCL") : ("UTC")), cb:()=>{
settings.localTime=!settings.localTime; settings.localTime=!settings.localTime;
timeMenu.format.label="Time:\n"+((settings.localTime==true) ? ("LCL") : ("UTC")); timeMenu.format.label="Time:\n"+((settings.localTime==true) ? ("LCL") : ("UTC"));
timeMenu.render(); timeMenu.render();
}}, }},
{type:"v", c: [ {type:"h", c: [
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{ {type:"btn", font:"16%", pad:1, fillx:1, label:"BACK", cb: ()=>{
settings=Object.assign({},oldSettings); settings=Object.assign({},oldSettings);
initPFD(); initPFD();
}}, }},
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"SAVE", cb: ()=>{ {type:"btn", font:"16%", pad:1, fillx: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); require('Storage').writeJSON("tinyVario.json", settings);
initPFD(); initPFD();
}} }}
@ -388,49 +351,52 @@ function initFlyingTimeMenu() {
oldSettings=Object.assign({},settings); oldSettings=Object.assign({},settings);
clearInterval(pfdHandle); clearInterval(pfdHandle);
var ftMenu = new Layout ( var ftMenu = new Layout (
{type:"h", c: [
{type:"v", c: [ {type:"v", c: [
{type:"btn", font:"12%", pad:2, fillx:1, filly:1, label:"Toggle\nAutodetect", cb:()=>{ {type:"v", c: [
settings.autodetect=!settings.autodetect; {type:"h", c: [
ftMenu.manual.label= (settings.autodetect==true)? {type:"btn", font:"12%", pad:1, fillx:1, filly:1, label:"Toggle\nAuto", cb:()=>{
("AUTO"):((flying) ? ("Manual\nLAND") : ("Manual\nTAKE OFF")); settings.autoDetect=!settings.autoDetect;
ftMenu.manual.label= (settings.autoDetect==true)?
("AUTO"):((state==flying) ? ("LAND") : ("TAKE\nOFF"));
ftMenu.render(); ftMenu.render();
}}, }},
{type:"btn", font:"12%", id:"manual", pad:2, fillx:1, filly:1, label:(settings.autodetect==true)? {type:"btn", font:"12%", id:"manual", pad:1, fillx:1, filly:1, label:(settings.autoDetect==true)?
("AUTO"):((flying) ? ("Manual\nLAND") : ("Manual\nTAKE OFF")), cb:()=>{ ("AUTO"):((state==flying) ? ("LAND") : ("TAKE\nOFF")), cb:()=>{
if (settings.autodetect==false) { if (settings.autoDetect==false) {
if (!flying) { if (state!=flying) {
E.showPrompt("Take off now?").then((v)=> { E.showPrompt("Take off now?").then((v)=> {
if (v) { if (v) {
takeoff(); state=flying;
takeoffTime=Date().getTime();
initPFD(); initPFD();
} }
}); });
} else { } else {
E.showPrompt("Land now?").then((v)=> { E.showPrompt("Land now?").then((v)=> {
if (v) { if (v) {
land(); state=landed;
landingTime=Date().getTime();
initPFD(); initPFD();
} }
}); });
} }
} }
} }
}, }
{type:"btn", font:"12%", pad:2, fillx:1, filly:1, label:"Reset", cb:()=>{ ]},
{type:"btn", font:"12%", pad:1, fillx:1, filly:1, label:"Reset", cb:()=>{
E.showPrompt("Reset Flight?").then((v)=> { E.showPrompt("Reset Flight?").then((v)=> {
flying=false; state=ground;
landed=false;
initPFD(); initPFD();
}); });
}} }}
]}, ]},
{type:"v", c: [ {type:"h", c: [
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{ {type:"btn", font:"16%", pad:1, fillx:1, label:"BACK", cb: ()=>{
settings=Object.assign({},oldSettings); settings=Object.assign({},oldSettings);
initPFD(); initPFD();
}}, }},
{type:"btn", r:3, font:"12%", pad:2, filly:1, label:"SAVE", cb: ()=>{ {type:"btn", font:"16%", pad:1, fillx:1, label:"SAVE", cb: ()=>{
require('Storage').writeJSON("tinyVario.json", settings); require('Storage').writeJSON("tinyVario.json", settings);
initPFD(); initPFD();
}} }}
@ -451,4 +417,3 @@ Bangle.on('pressure', function(e) {
}); });
initPFD(); initPFD();