From 7fe89b9b4190177ec38581ee9404be19081e0ad1 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 20 Jul 2022 16:29:18 +0200 Subject: [PATCH 1/4] Update app.js --- apps/tinyVario/app.js | 287 +++++++++++++++++++----------------------- 1 file changed, 126 insertions(+), 161 deletions(-) diff --git a/apps/tinyVario/app.js b/apps/tinyVario/app.js index 0b92c40f9..d41970619 100644 --- a/apps/tinyVario/app.js +++ b/apps/tinyVario/app.js @@ -8,8 +8,6 @@ To do: 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(); @@ -27,7 +25,6 @@ const unitsRoc=[ {name:"kt", factor:1.9438444924406, precision:1, layoutCode: {type:"txt", font:"12%", halign:0, filly:0, label:"kt"}} ]; - 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"}, @@ -39,28 +36,28 @@ const unitsGs=[ {type:"", height:1,width:"20", bgCol:fg}, {type:"txt", font:"12%", halign:0, filly:0, label:"s"}]}} ]; - const unitsAlt=[ {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"}} ]; - const unitROC={type:"v", halign:1, c: [ {type:"txt", font:"12%", halign:0, filly:0, label:"m"}, {type:"", height:1,width:"20", bgCol:fg}, {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({ rocU: 0, altU: 0, gsU:0, intTime:10, localTime:true, - autoDetect:1 + autoDetect: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 rawP=0, samples=0; var altH = []; @@ -69,12 +66,11 @@ 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 state=ground; +var takeoffTime=0, landingTime=0, 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); @@ -91,9 +87,6 @@ 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; @@ -132,10 +125,6 @@ function initPFD() { ); g.clear(); pfd.render(); - //-------testing------ - //rawP=1000; - //samples=1; - //-------------------- pfdHandle = setInterval(function() { //process pressure readings if (samples) { @@ -152,24 +141,40 @@ function initPFD() { 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(); + altH.push(altFast); + while (altH.length>settings.intTime*4) { rocAvg=(altH[altH.length-1]-altH[0])/settings.intTime; + altH.shift(); } - 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) { + if (settings.autoDetect==true) switch (state) { + case ground: + if ((gs>=5) || (roc>=1) || (roc<=-1)) { + state=maybeFlying; + takeoffTime=Date().getTime(); + } + 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; 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) { + } else if (state==landed) { flyingTime=landingTime-takeoffTime; pfd.flyingtime.label=(flyingTime / 3600000).toFixed(0)+":"+(flyingTime / 60000 % 60).toFixed(0).padStart(2,'0'); pfd.flyingtime.col=green; @@ -182,7 +187,7 @@ function initPFD() { pfd.avg.label=(rocAvg*unitsRoc[settings.rocU].factor).toFixed(unitsRoc[settings.rocU].precision); var gps = Bangle.getGPSFix(); - if (gps) { + if (gps!=undefined) { pfd.gs.label=(gps.speed*unitsGs[settings.gsU].factor).toFixed(unitsGs[settings.gsU].precision); updateText(pfd.gs); gs=gps.speed; @@ -198,25 +203,47 @@ function initPFD() { } 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); clearInterval(pfdHandle); var altMenu = new Layout ({ - type:"h", c: [{ + type:"v", 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:"15%", pad:1, fillx:1, filly:1, label:"-", cb:l=>{qnh--; updateAltMenu();}}, + {type:"btn", font:"15%", pad:1, fillx:1, filly:1, label:"+", cb:l=>{qnh++; updateAltMenu();}} + ]}, + {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:"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: ()=>{ + {type:"h", c: [ + {type:"btn", font:"16%", pad:1, fillx: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: ()=>{ + {type:"btn", font:"16%", pad:1, fillx:1, label:"SAVE", cb: ()=>{ require('Storage').writeJSON("tinyVario.json", settings); initPFD(); }} @@ -224,37 +251,42 @@ function initAltMenu() { ], lazy:true}); g.clear(); altMenu.render(); + updateAltMenu(); } function initAvgMenu() { oldSettings=Object.assign({},settings); clearInterval(pfdHandle); var avgMenu = new Layout ({ - type:"h", c: [{ + type:"v", 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:()=>{ + {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:"v", c: [ - {type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{ + {type:"h", c: [ + {type:"btn", font:"16%", pad:1, fillx:1, label:"BACK", cb: ()=>{ settings=Object.assign({},oldSettings); 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(); }} @@ -264,67 +296,23 @@ function initAvgMenu() { 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:()=>{ + type:"v", c: [ + {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; 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: ()=>{ + {type:"h", c: [ + {type:"btn", font:"16%", pad:1, fillx: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: ()=>{ + {type:"btn", font:"16%", pad:1, fillx:1, label:"SAVE", cb: ()=>{ require('Storage').writeJSON("tinyVario.json", settings); initPFD(); }} @@ -338,43 +326,18 @@ 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:()=>{ + type:"v", c: [ + {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; 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: ()=>{ + {type:"h", c: [ + {type:"btn", font:"16%", pad:1, fillx: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: ()=>{ + {type:"btn", font:"16%", pad:1, fillx:1, label:"SAVE", cb: ()=>{ require('Storage').writeJSON("tinyVario.json", settings); initPFD(); }} @@ -388,49 +351,52 @@ function initFlyingTimeMenu() { oldSettings=Object.assign({},settings); clearInterval(pfdHandle); 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:()=>{ - 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:"h", c: [ + {type:"btn", font:"12%", pad:1, fillx:1, filly:1, label:"Toggle\nAuto", cb:()=>{ + settings.autoDetect=!settings.autoDetect; + ftMenu.manual.label= (settings.autoDetect==true)? + ("AUTO"):((state==flying) ? ("LAND") : ("TAKE\nOFF")); + ftMenu.render(); + }}, + {type:"btn", font:"12%", id:"manual", pad:1, fillx:1, filly:1, label:(settings.autoDetect==true)? + ("AUTO"):((state==flying) ? ("LAND") : ("TAKE\nOFF")), cb:()=>{ + if (settings.autoDetect==false) { + if (state!=flying) { + E.showPrompt("Take off now?").then((v)=> { + if (v) { + state=flying; + takeoffTime=Date().getTime(); + initPFD(); + } + }); + } else { + E.showPrompt("Land now?").then((v)=> { + if (v) { + state=landed; + landingTime=Date().getTime(); + 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)=> { - flying=false; - landed=false; + state=ground; initPFD(); }); }} ]}, - {type:"v", c: [ - {type:"btn", r:3, font:"12%", pad:2, filly:1, label:"BACK", cb: ()=>{ + {type:"h", c: [ + {type:"btn", font:"16%", pad:1, fillx:1, label:"BACK", cb: ()=>{ settings=Object.assign({},oldSettings); 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(); }} @@ -451,4 +417,3 @@ Bangle.on('pressure', function(e) { }); initPFD(); - From a5fe5b3aa47b1e2433ff04acd1fc4a144cc94390 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 20 Jul 2022 16:31:34 +0200 Subject: [PATCH 2/4] Update ChangeLog --- apps/tinyVario/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/tinyVario/ChangeLog b/apps/tinyVario/ChangeLog index 4649a84ef..f3bdc1b9a 100644 --- a/apps/tinyVario/ChangeLog +++ b/apps/tinyVario/ChangeLog @@ -1,2 +1,3 @@ 0.01: Initial Version 0.02: Touch data fields to configure them. +0.03: Changed menu layout, fixed automatic flight time detection. From 4c75ee439190dfeeb1162e675a759f605f5c91e3 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 20 Jul 2022 16:31:53 +0200 Subject: [PATCH 3/4] Update metadata.json --- apps/tinyVario/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/tinyVario/metadata.json b/apps/tinyVario/metadata.json index bf5b62f1f..8cd63926f 100644 --- a/apps/tinyVario/metadata.json +++ b/apps/tinyVario/metadata.json @@ -1,7 +1,7 @@ { "id": "tinyVario", "name": "Tiny Vario", "shortName" : "tinyVario", - "version":"0.02", + "version":"0.03", "icon": "app.png", "readme": "README.md", "description": "A very simple app for gliding / paragliding / hang gliding etc.", From 63a40bd61bc74d942b8f2f73e754740fd9e114df Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 20 Jul 2022 16:38:32 +0200 Subject: [PATCH 4/4] Update app.js --- apps/tinyVario/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/tinyVario/app.js b/apps/tinyVario/app.js index d41970619..33a2d9ac4 100644 --- a/apps/tinyVario/app.js +++ b/apps/tinyVario/app.js @@ -169,7 +169,7 @@ function initPFD() { else if (Date().getTime()-landingTime>60000) state=landed; break; } - if ((state==flying) || (state==maybeLanded)) { + if ((state==flying) || (state==maybeLanded)) { flyingTime=Date().getTime()-takeoffTime; pfd.flyingtime.label=(flyingTime / 3600000).toFixed(0)+":"+(flyingTime / 60000 % 60).toFixed(0).padStart(2,'0'); pfd.flyingtime.col=fg;