From 96a6dee94c72b4a716d70808d362716ad9ef3c3d Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:14:40 +1300 Subject: [PATCH 01/52] Update app.js --- apps/speedalt2/app.js | 156 +++++++++++++++++++----------------------- 1 file changed, 72 insertions(+), 84 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 0db9629c7..951c878fb 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -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 From d5c827cd18c12f3c34dc1b754fe3cf0d88ef1d37 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:16:29 +1300 Subject: [PATCH 02/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 0136a744a..689779b31 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"0.07", + "version":"1.06", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 5b00b2599888f3fd062c14b826e9d3565b0fe9a1 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:17:24 +1300 Subject: [PATCH 03/52] Update ChangeLog --- apps/speedalt2/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/speedalt2/ChangeLog b/apps/speedalt2/ChangeLog index 91f01988e..bd338f8b2 100644 --- a/apps/speedalt2/ChangeLog +++ b/apps/speedalt2/ChangeLog @@ -1,2 +1,3 @@ 0.01: Initial import. 0.07: Add swipe to change screens. +1.06: Misc memory and screen optimisations. From 1f207561e6af2f59ce9806138a32e54c4ba757c6 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:31:23 +1300 Subject: [PATCH 04/52] Update app.js --- apps/speedalt2/app.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 951c878fb..b41f3054f 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,7 +2,7 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com */ -var v = '1.06'; +var v = '1.07'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -173,7 +173,7 @@ 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); } + g.setColor((this.isOn=(v===undefined||!!v))?1:0,0,0).fillCircle(20,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 @@ -390,14 +390,15 @@ if ( emulator ) { if ( sp < 10 ) sp = sp.toFixed(1); else sp = Math.round(sp); + if (isNaN(sp)) 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(maxAlt) && maxN > 15 ) maxAlt = al; + if (isNaN(al)) al = '---'; // Distance to waypoint di = distance(lf,wp); @@ -422,7 +423,7 @@ if ( emulator ) { // Sats if ( age > 10 ) { - sats = 'Age:'+age; + sats = 'Age:'+Math.round(age); if ( age > 90 ) sats = 'Age:>90'; } else sats = 'Sats:'+lf.satellites; From e39ba7778879f3eb7f31524ee2f5568f49b9ccf5 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:32:06 +1300 Subject: [PATCH 05/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 689779b31..243a5b814 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.06", + "version":"1.07", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 2d8eb136b31a3bd2602a96df3a6d2e0cf680567d Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:43:54 +1300 Subject: [PATCH 06/52] Update app.js --- apps/speedalt2/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index b41f3054f..6085ee92d 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,7 +2,7 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com */ -var v = '1.07'; +var v = '1.08'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -173,7 +173,7 @@ 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(20,10,10); } + g.setColor((this.isOn=(v===undefined||!!v))?1:0,0,0).fillCircle(40,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 From 13a3127bfca3d924ba994838ed7f80dcd3993de2 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:44:39 +1300 Subject: [PATCH 07/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 243a5b814..39986d936 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.07", + "version":"1.08", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 8be0bd2e34f8a86c917519c009348ae58ca7576b Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 18:51:39 +1300 Subject: [PATCH 08/52] Update app.js --- apps/speedalt2/app.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 6085ee92d..df101e9f1 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,7 +2,7 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com */ -var v = '1.08'; +var v = '1.09'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -365,8 +365,11 @@ if ( emulator ) { var ew = ''; var lon = '---.--'; var sats = '---'; - var wpName = ''; // Waypoint name + // Waypoint name + var wpName = wp.name; + if ( wpName == undefined || wpName == 'NONE' ) wpName = ''; + wpName = wpName.substring(0,8); if (fix.fix) lf = fix; @@ -403,11 +406,6 @@ if ( emulator ) { // Distance to waypoint di = distance(lf,wp); 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)); From ea28ffd65711f680e5fb08374c842d0b0d93fc26 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 18:53:58 +1300 Subject: [PATCH 09/52] Update app.js --- apps/speedalt2/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index df101e9f1..de94db6a3 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -321,7 +321,7 @@ function drawClock() { } function drawWP(wp) { - buf.setColor(2); + buf.setColor(3); buf.setFontAlign(0,1); //left, bottom buf.setFontVector(48); buf.drawString(wp,120,140); From a29af499e769fe9db9d6ec91e0d91040ad71fa0f Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 18:55:06 +1300 Subject: [PATCH 10/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 39986d936..ada4c4509 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.08", + "version":"1.09", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 7c7a0ae2cf5c8ee5bc4227517216326cd1226611 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 21:55:45 +1300 Subject: [PATCH 11/52] Update app.js --- apps/speedalt2/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index de94db6a3..cee725993 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -677,7 +677,7 @@ var img = { }; if ( cfg.colour == 1 ) img.palette = new Uint16Array([0,0xFFFF,0xFFF6,0xDFFF]); -if ( cfg.colour == 2 ) img.palette = new Uint16Array([0,0xFF800,0xFAE0,0xF813]); +if ( cfg.colour == 2 ) img.palette = new Uint16Array([0,0xF800,0xFAE0,0xF813]); var SCREENACCESS = { withApp:true, From 4b66b9ffa8dcae0f1552b147657bcec3c7687d4a Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 22:19:35 +1300 Subject: [PATCH 12/52] Update app.js --- apps/speedalt2/app.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index cee725993..2cf73dfe9 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -1,8 +1,9 @@ /* Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com +1.10 : add inverted colours */ -var v = '1.09'; +var v = '1.10'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -232,7 +233,8 @@ function drawScrn(dat) { if (!canDraw) return; buf.clear(); - + buf.setBgColor(0); + var n; n = dat.val.toString(); @@ -271,6 +273,7 @@ function drawScrn(dat) { function drawPosn(dat) { if (!canDraw) return; buf.clear(); + buf.setBgColor(0); var x, y; x=210; @@ -302,6 +305,8 @@ function drawClock() { if (!canDraw) return; buf.clear(); + buf.setBgColor(0); + var x, y; x=185; y=0; @@ -678,6 +683,7 @@ var img = { if ( cfg.colour == 1 ) img.palette = new Uint16Array([0,0xFFFF,0xFFF6,0xDFFF]); if ( cfg.colour == 2 ) img.palette = new Uint16Array([0,0xF800,0xFAE0,0xF813]); +if ( cfg.colour == 3 ) img.palette = new Uint16Array([0xFFFF,0x007F,0x0054,0x0054]); var SCREENACCESS = { withApp:true, From 7bd799accc7fb7d67784966ee11188d386cdc5a7 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 22:20:30 +1300 Subject: [PATCH 13/52] Update settings.js --- apps/speedalt2/settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/speedalt2/settings.js b/apps/speedalt2/settings.js index 96174a89b..3ec4742ac 100644 --- a/apps/speedalt2/settings.js +++ b/apps/speedalt2/settings.js @@ -66,6 +66,7 @@ 'Default' : function() { setColour(0); }, 'Hi Contrast' : function() { setColour(1); }, 'Night' : function() { setColour(2); } + 'Inverted' : function() { setColour(3); } }; const kalMenu = { From 644db080fe0eb78d2dbc0f6f2d6929e1eb0219f9 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 22:21:13 +1300 Subject: [PATCH 14/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index ada4c4509..5aeb95eb6 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.09", + "version":"1.10", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 684138c36ef4829e31f3ada0193436269aa24e42 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 22:24:02 +1300 Subject: [PATCH 15/52] Update settings.js --- apps/speedalt2/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/speedalt2/settings.js b/apps/speedalt2/settings.js index 3ec4742ac..fe30d88df 100644 --- a/apps/speedalt2/settings.js +++ b/apps/speedalt2/settings.js @@ -65,7 +65,7 @@ '< Back': function() { E.showMenu(appMenu); }, 'Default' : function() { setColour(0); }, 'Hi Contrast' : function() { setColour(1); }, - 'Night' : function() { setColour(2); } + 'Night' : function() { setColour(2); }, 'Inverted' : function() { setColour(3); } }; From 9147108f8a18d91c36d4fa595140de2e7966bf02 Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 22:24:44 +1300 Subject: [PATCH 16/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 5aeb95eb6..5e69ddd05 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.10", + "version":"1.11", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From a5becb249ba93e4fc18fcd9b1b8f43acb8ce931e Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 22:32:56 +1300 Subject: [PATCH 17/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 5e69ddd05..46826cf91 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.11", + "version":"1.12", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From adcdb50cbc15b651c94e7cc57a4cd74dc3e33ddb Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 08:51:40 +1300 Subject: [PATCH 18/52] Update app.js --- apps/speedalt2/app.js | 88 +++++++++++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 25 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 2cf73dfe9..d61eb4386 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,8 +2,9 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com 1.10 : add inverted colours +1.11 : Add VMG screen */ -var v = '1.10'; +var v = '1.11'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -194,6 +195,10 @@ 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. +// Previous values for calculating VMG. +var lastDist = -1; +var lastTime = -1; + 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. @@ -201,6 +206,8 @@ var wp = {}; // Waypoint to use for distance from cur position. function nxtWp(){ cfg.wp++; loadWp(); + lastDist = -1; // Reset VMG calcs + lastTime = -1; } function loadWp() { @@ -219,11 +226,11 @@ function distance(a,b){ var x = radians(a.lon-b.lon) * Math.cos(radians((a.lat+b.lat)/2)); var y = radians(b.lat-a.lat); - // Distance in selected units + // Distance in metres var d = Math.sqrt(x*x + y*y) * 6371000; - d = (d/parseFloat(cfg.dist)).toFixed(2); - if ( d >= 100 ) d = parseFloat(d).toFixed(1); - if ( d >= 1000 ) d = parseFloat(d).toFixed(0); +// d = (d/parseFloat(cfg.dist)).toFixed(2); +// if ( d >= 100 ) d = parseFloat(d).toFixed(1); +// if ( d >= 1000 ) d = parseFloat(d).toFixed(0); return d; } @@ -328,8 +335,8 @@ function drawClock() { function drawWP(wp) { buf.setColor(3); buf.setFontAlign(0,1); //left, bottom - buf.setFontVector(48); - buf.drawString(wp,120,140); + buf.setFontVector(40); + buf.drawString(wp,120,132); } function drawSats(sats) { @@ -370,6 +377,7 @@ if ( emulator ) { var ew = ''; var lon = '---.--'; var sats = '---'; + var vmg = '---'; // Waypoint name var wpName = wp.name; @@ -389,17 +397,10 @@ if ( emulator ) { } // Speed - if ( cfg.spd == 0 ) { - m = require("locale").speed(lf.speed).match(/([0-9,\.]+)(.*)/); // regex splits numbers from units - sp = parseFloat(m[1]); - cfg.spd_unit = m[2]; - } - else sp = parseFloat(lf.speed)/parseFloat(cfg.spd); // Calculate for selected units - + sp = parseFloat(lf.speed)/parseFloat(cfg.spd); // Calculate for selected units if ( sp < 10 ) sp = sp.toFixed(1); else sp = Math.round(sp); if (isNaN(sp)) sp = '---'; - if (parseFloat(sp) > parseFloat(maxSpd) && maxN > 15 ) maxSpd = sp; // Altitude @@ -408,9 +409,34 @@ if ( emulator ) { if (parseFloat(al) > parseFloat(maxAlt) && maxN > 15 ) maxAlt = al; if (isNaN(al)) al = '---'; - // Distance to waypoint + // Distance to waypoint and vmg di = distance(lf,wp); - if (isNaN(di)) di = '--------'; + +//lastDist = 13640; +//lastTime = (getTime()/1000) - 10; + + if ( lastDist != -1 && ! isNaN(lastDist)) { +//console.log(' Distance : '+di); +//console.log('last.Distance : '+lastDist); +//console.log('last.Time : '+lastTime); + + // Have two WP distances and a time. Calc speed + vmg = ((lastDist-di)/1000)/((getTime()/1000-lastTime)/3600); // k/h + vmg = vmg/parseFloat(cfg.spd); // Calculate for selected units +//console.log('VMG : '+vmg); + } + lastDist = di; + lastTime = getTime()/1000; // secs + + di = (di/parseFloat(cfg.dist)).toFixed(2); + if ( di >= 100 ) di = parseFloat(di).toFixed(1); + if ( di >= 1000 ) di = parseFloat(di).toFixed(0); + + if ( Math.abs(vmg) < 10 ) vmg = vmg.toFixed(1); + else vmg = Math.round(vmg); + + if (isNaN(vmg)) vmg = '---'; + if (isNaN(di)) di = '------'; // Age of last fix (secs) age = Math.max(0,Math.round(getTime())-(lf.time.getTime()/1000)); @@ -490,6 +516,18 @@ if ( emulator ) { } if ( cfg.modeA == 3 ) { + // VMG + drawScrn({ + val:vmg, + unit:cfg.spd_unit, + sats:sats, + age:age, + max:'VMG', + wp:wpName + }); + } + + if ( cfg.modeA == 4 ) { // Position drawPosn({ sats:sats, @@ -501,7 +539,7 @@ if ( emulator ) { }); } - if ( cfg.modeA == 4 ) { + if ( cfg.modeA == 5 ) { // Large clock drawClock(); } @@ -510,14 +548,14 @@ if ( emulator ) { function prevScrn() { cfg.modeA = cfg.modeA-1; - if ( cfg.modeA < 0 ) cfg.modeA = 4; + if ( cfg.modeA < 0 ) cfg.modeA = 5; savSettings(); onGPS(lf); } function nextScrn() { cfg.modeA = cfg.modeA+1; - if ( cfg.modeA > 4 ) cfg.modeA = 0; + if ( cfg.modeA > 5 ) cfg.modeA = 0; savSettings(); onGPS(lf); } @@ -529,14 +567,14 @@ function nextFunc(dur) { if ( dur < 2 ) showMax = !showMax; // Short press toggle fix/max display else { maxSpd = 0; maxAlt = 0; } // Long press resets max values. } - else if ( cfg.modeA == 2) nxtWp(); // Dist mode - Select next waypoint + else if ( cfg.modeA == 2 || cfg.modeA == 3) nxtWp(); // Dist or VMG mode - Select next waypoint onGPS(lf); } function updateClock() { if (!canDraw) return; - if ( cfg.modeA != 4 ) return; + if ( cfg.modeA != 5 ) return; drawClock(); if ( emulator ) {maxSpd++;maxAlt++;} } @@ -646,15 +684,15 @@ console.log('MDL'); // Read settings. let cfg = require('Storage').readJSON('speedalt2.json',1)||{}; -cfg.spd = cfg.spd||0; // Multiplier for speed unit conversions. 0 = use the locale values for speed -cfg.spd_unit = cfg.spd_unit||''; // Displayed speed unit +cfg.spd = cfg.spd||1; // Multiplier for speed unit conversions. 0 = use the locale values for speed +cfg.spd_unit = cfg.spd_unit||'kph'; // Displayed speed unit cfg.alt = cfg.alt||0.3048;// Multiplier for altitude unit conversions. cfg.alt_unit = cfg.alt_unit||'feet'; // Displayed altitude units cfg.dist = cfg.dist||1000;// Multiplier for distnce unit conversions. cfg.dist_unit = cfg.dist_unit||'km'; // Displayed altitude units cfg.colour = cfg.colour||0; // Colour scheme. cfg.wp = cfg.wp||0; // Last selected waypoint for dist -cfg.modeA = cfg.modeA||0; // 0=Speed 1=Alt 2=Dist 3=Position 4=Clock +cfg.modeA = cfg.modeA||0; // 0=Speed 1=Alt 2=Dist 3 = vmg 4=Position 5=Clock cfg.primSpd = cfg.primSpd||0; // 1 = Spd in primary, 0 = Spd in secondary cfg.spdFilt = cfg.spdFilt==undefined?true:cfg.spdFilt; From c5a981d39b9639937188db1cd6cfb11df24df1a4 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 08:52:33 +1300 Subject: [PATCH 19/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 46826cf91..2239db796 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.12", + "version":"1.14", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From c329bbe9036a7dda2e12f45648546f3b4c290219 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 08:52:51 +1300 Subject: [PATCH 20/52] Update app.js --- apps/speedalt2/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index d61eb4386..389beda8f 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,9 +2,9 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com 1.10 : add inverted colours -1.11 : Add VMG screen +1.14 : Add VMG screen */ -var v = '1.11'; +var v = '1.14'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { From d009bddf8bd451460e3a4d2f48181bb438c7204d Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 09:24:24 +1300 Subject: [PATCH 21/52] Update app.js --- apps/speedalt2/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 389beda8f..e36c2efc0 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -476,7 +476,7 @@ if ( emulator ) { unit:cfg.spd_unit, sats:sats, age:age, - max:'', + max:'SPD', wp:'' }); } @@ -498,7 +498,7 @@ if ( emulator ) { unit:cfg.alt_unit, sats:sats, age:age, - max:'', + max:'ALT', wp:'' }); } @@ -510,7 +510,7 @@ if ( emulator ) { unit:cfg.dist_unit, sats:sats, age:age, - max:'', + max:'DST', wp:wpName }); } From 134ae6bf73450e2cb40638164bcf0f9317052033 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 09:26:16 +1300 Subject: [PATCH 22/52] Update app.js --- apps/speedalt2/app.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index e36c2efc0..6d89bac81 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -188,7 +188,6 @@ var lf = {fix:0,satellites:0}; var showMax = 0; // 1 = display the max values. 0 = display the cur fix var pwrSav = 1; // 1 = default power saving with watch screen off and GPS to PMOO mode. 0 = screen kept on. 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 maxSpd = 0; From 54442044f248c665f1ca42a226f272806a4c1ae9 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 09:32:17 +1300 Subject: [PATCH 23/52] Update app.js --- apps/speedalt2/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 6d89bac81..34a73012d 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -4,7 +4,7 @@ Mike Bennett mike[at]kereru.com 1.10 : add inverted colours 1.14 : Add VMG screen */ -var v = '1.14'; +var v = '1.15'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { From 0bc35288eb164be14fe099423f8a92602e428241 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 09:33:13 +1300 Subject: [PATCH 24/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 2239db796..42e54a6bd 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.14", + "version":"1.15", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 0c6cf8f0d0313f1322c82251518de3d9ab030506 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 11:39:30 +1300 Subject: [PATCH 25/52] Update app.js --- apps/speedalt2/app.js | 86 ++++++++++++++++++++++++++++--------------- 1 file changed, 56 insertions(+), 30 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 34a73012d..1823b9911 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -4,7 +4,7 @@ Mike Bennett mike[at]kereru.com 1.10 : add inverted colours 1.14 : Add VMG screen */ -var v = '1.15'; +var v = '1.16'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -195,8 +195,11 @@ 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. // Previous values for calculating VMG. -var lastDist = -1; -var lastTime = -1; +var vmgD1 = -1; // Dist start +var vmgD2 = -1; // Dist end +var vmgT1 = -1; // Time start +var vmgT2 = -1; // Time end +var vmgSpd = 0; var emulator = (process.env.BOARD=="EMSCRIPTEN")?1:0; // 1 = running in emulator. Supplies test values; @@ -205,8 +208,9 @@ var wp = {}; // Waypoint to use for distance from cur position. function nxtWp(){ cfg.wp++; loadWp(); - lastDist = -1; // Reset VMG calcs - lastTime = -1; + vmgD1 = -1; // Reset VMG calcs + vmgD2 = -1; + vmgT1 = -1; } function loadWp() { @@ -376,7 +380,6 @@ if ( emulator ) { var ew = ''; var lon = '---.--'; var sats = '---'; - var vmg = '---'; // Waypoint name var wpName = wp.name; @@ -408,33 +411,13 @@ if ( emulator ) { if (parseFloat(al) > parseFloat(maxAlt) && maxN > 15 ) maxAlt = al; if (isNaN(al)) al = '---'; - // Distance to waypoint and vmg + // Distance to waypoint di = distance(lf,wp); - -//lastDist = 13640; -//lastTime = (getTime()/1000) - 10; - - if ( lastDist != -1 && ! isNaN(lastDist)) { -//console.log(' Distance : '+di); -//console.log('last.Distance : '+lastDist); -//console.log('last.Time : '+lastTime); - - // Have two WP distances and a time. Calc speed - vmg = ((lastDist-di)/1000)/((getTime()/1000-lastTime)/3600); // k/h - vmg = vmg/parseFloat(cfg.spd); // Calculate for selected units -//console.log('VMG : '+vmg); - } - lastDist = di; - lastTime = getTime()/1000; // secs - + vmgD2 = di; + vmgT2 = Math.round(lf.time.getTime()/1000); di = (di/parseFloat(cfg.dist)).toFixed(2); if ( di >= 100 ) di = parseFloat(di).toFixed(1); if ( di >= 1000 ) di = parseFloat(di).toFixed(0); - - if ( Math.abs(vmg) < 10 ) vmg = vmg.toFixed(1); - else vmg = Math.round(vmg); - - if (isNaN(vmg)) vmg = '---'; if (isNaN(di)) di = '------'; // Age of last fix (secs) @@ -517,7 +500,7 @@ if ( emulator ) { if ( cfg.modeA == 3 ) { // VMG drawScrn({ - val:vmg, + val:vmgSpd, unit:cfg.spd_unit, sats:sats, age:age, @@ -545,6 +528,48 @@ if ( emulator ) { } +function updateVMG() { +//console.log('----------'); +//console.log('vmgT1 : '+vmgT1); +//console.log('vmgT2 : '+vmgT2); + + if (!canDraw) return; + vmgSpd = '---'; + + if ( ! lf.fix ) return; + if ( vmgT1 == vmgT2 ) return; // No new fix + + +//vmgD1 = 13640; +//vmgT1 = (getTime()/1000) - 10; + + + + + if ( vmgD1 != -1 && ! isNaN(vmgD1)) { +//console.log(' Distance : '+di); +//console.log('last.Distance : '+vmgD1); +//console.log('last.Time : '+vmgT1); + + // Have two WP distances and a time. Calc speed + vmgSpd = ((vmgD1-vmgD2)/1000)/((vmgT2-vmgT1)/3600); // k/h + + vmgSpd = vmgSpd/parseFloat(cfg.spd); // Calculate for selected units +//console.log('VMG : '+vmg); + } + vmgD1 = vmgD2; + vmgT1 = vmgT2; // secs + + + if ( Math.abs(vmgSpd) < 10 ) vmgSpd = vmgSpd.toFixed(1); + else vmgSpd = Math.round(vmgSpd); + + if (isNaN(vmgSpd)) vmgSpd = '---'; + + console.log('vmgSpd : '+vmgSpd); + +} + function prevScrn() { cfg.modeA = cfg.modeA-1; if ( cfg.modeA < 0 ) cfg.modeA = 5; @@ -753,3 +778,4 @@ Bangle.on('GPS', onGPS); setButtons(); setInterval(updateClock, 10000); +setInterval(updateVMG, 10000); From 020a2ea00598568e9a755a78969bcea08c661767 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 11:39:58 +1300 Subject: [PATCH 26/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 42e54a6bd..6e18c3505 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.15", + "version":"1.16", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From a7b5f530c30c28f2c53c80692934135ad898a562 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 11:50:03 +1300 Subject: [PATCH 27/52] Update app.js --- apps/speedalt2/app.js | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 1823b9911..76dbccfc0 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -231,10 +231,6 @@ function distance(a,b){ // Distance in metres var d = Math.sqrt(x*x + y*y) * 6371000; -// d = (d/parseFloat(cfg.dist)).toFixed(2); -// if ( d >= 100 ) d = parseFloat(d).toFixed(1); -// if ( d >= 1000 ) d = parseFloat(d).toFixed(0); - return d; } @@ -529,10 +525,6 @@ if ( emulator ) { } function updateVMG() { -//console.log('----------'); -//console.log('vmgT1 : '+vmgT1); -//console.log('vmgT2 : '+vmgT2); - if (!canDraw) return; vmgSpd = '---'; @@ -542,32 +534,19 @@ function updateVMG() { //vmgD1 = 13640; //vmgT1 = (getTime()/1000) - 10; - - - if ( vmgD1 != -1 && ! isNaN(vmgD1)) { -//console.log(' Distance : '+di); -//console.log('last.Distance : '+vmgD1); -//console.log('last.Time : '+vmgT1); - // Have two WP distances and a time. Calc speed vmgSpd = ((vmgD1-vmgD2)/1000)/((vmgT2-vmgT1)/3600); // k/h - vmgSpd = vmgSpd/parseFloat(cfg.spd); // Calculate for selected units -//console.log('VMG : '+vmg); } vmgD1 = vmgD2; vmgT1 = vmgT2; // secs - if ( Math.abs(vmgSpd) < 10 ) vmgSpd = vmgSpd.toFixed(1); else vmgSpd = Math.round(vmgSpd); if (isNaN(vmgSpd)) vmgSpd = '---'; - - console.log('vmgSpd : '+vmgSpd); - } function prevScrn() { From 0bd6399d833236021f76fdb3aee298a74ae766a8 Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 11:58:16 +1300 Subject: [PATCH 28/52] Update app.js --- apps/speedalt2/app.js | 94 ++++++++++++------------------------------- 1 file changed, 26 insertions(+), 68 deletions(-) diff --git a/apps/speedalt2/app.js b/apps/speedalt2/app.js index 76dbccfc0..fd53cf7c3 100644 --- a/apps/speedalt2/app.js +++ b/apps/speedalt2/app.js @@ -2,9 +2,8 @@ Speed and Altitude [speedalt2] Mike Bennett mike[at]kereru.com 1.10 : add inverted colours -1.14 : Add VMG screen */ -var v = '1.16'; +var v = '1.10'; /*kalmanjs, Wouter Bulten, MIT, https://github.com/wouterbulten/kalmanjs */ var KalmanFilter = (function () { @@ -188,19 +187,13 @@ var lf = {fix:0,satellites:0}; var showMax = 0; // 1 = display the max values. 0 = display the cur fix var pwrSav = 1; // 1 = default power saving with watch screen off and GPS to PMOO mode. 0 = screen kept on. 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 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. -// Previous values for calculating VMG. -var vmgD1 = -1; // Dist start -var vmgD2 = -1; // Dist end -var vmgT1 = -1; // Time start -var vmgT2 = -1; // Time end -var vmgSpd = 0; - 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. @@ -208,9 +201,6 @@ var wp = {}; // Waypoint to use for distance from cur position. function nxtWp(){ cfg.wp++; loadWp(); - vmgD1 = -1; // Reset VMG calcs - vmgD2 = -1; - vmgT1 = -1; } function loadWp() { @@ -229,8 +219,12 @@ function distance(a,b){ var x = radians(a.lon-b.lon) * Math.cos(radians((a.lat+b.lat)/2)); var y = radians(b.lat-a.lat); - // Distance in metres + // Distance in selected units var d = Math.sqrt(x*x + y*y) * 6371000; + d = (d/parseFloat(cfg.dist)).toFixed(2); + if ( d >= 100 ) d = parseFloat(d).toFixed(1); + if ( d >= 1000 ) d = parseFloat(d).toFixed(0); + return d; } @@ -334,8 +328,8 @@ function drawClock() { function drawWP(wp) { buf.setColor(3); buf.setFontAlign(0,1); //left, bottom - buf.setFontVector(40); - buf.drawString(wp,120,132); + buf.setFontVector(48); + buf.drawString(wp,120,140); } function drawSats(sats) { @@ -395,10 +389,17 @@ if ( emulator ) { } // Speed - sp = parseFloat(lf.speed)/parseFloat(cfg.spd); // Calculate for selected units + if ( cfg.spd == 0 ) { + m = require("locale").speed(lf.speed).match(/([0-9,\.]+)(.*)/); // regex splits numbers from units + sp = parseFloat(m[1]); + cfg.spd_unit = m[2]; + } + else sp = parseFloat(lf.speed)/parseFloat(cfg.spd); // Calculate for selected units + if ( sp < 10 ) sp = sp.toFixed(1); else sp = Math.round(sp); if (isNaN(sp)) sp = '---'; + if (parseFloat(sp) > parseFloat(maxSpd) && maxN > 15 ) maxSpd = sp; // Altitude @@ -409,12 +410,7 @@ if ( emulator ) { // Distance to waypoint di = distance(lf,wp); - vmgD2 = di; - vmgT2 = Math.round(lf.time.getTime()/1000); - di = (di/parseFloat(cfg.dist)).toFixed(2); - if ( di >= 100 ) di = parseFloat(di).toFixed(1); - if ( di >= 1000 ) di = parseFloat(di).toFixed(0); - if (isNaN(di)) di = '------'; + if (isNaN(di)) di = '--------'; // Age of last fix (secs) age = Math.max(0,Math.round(getTime())-(lf.time.getTime()/1000)); @@ -494,18 +490,6 @@ if ( emulator ) { } if ( cfg.modeA == 3 ) { - // VMG - drawScrn({ - val:vmgSpd, - unit:cfg.spd_unit, - sats:sats, - age:age, - max:'VMG', - wp:wpName - }); - } - - if ( cfg.modeA == 4 ) { // Position drawPosn({ sats:sats, @@ -517,48 +501,23 @@ if ( emulator ) { }); } - if ( cfg.modeA == 5 ) { + if ( cfg.modeA == 4 ) { // Large clock drawClock(); } } -function updateVMG() { - if (!canDraw) return; - vmgSpd = '---'; - - if ( ! lf.fix ) return; - if ( vmgT1 == vmgT2 ) return; // No new fix - - -//vmgD1 = 13640; -//vmgT1 = (getTime()/1000) - 10; - - if ( vmgD1 != -1 && ! isNaN(vmgD1)) { - // Have two WP distances and a time. Calc speed - vmgSpd = ((vmgD1-vmgD2)/1000)/((vmgT2-vmgT1)/3600); // k/h - vmgSpd = vmgSpd/parseFloat(cfg.spd); // Calculate for selected units - } - vmgD1 = vmgD2; - vmgT1 = vmgT2; // secs - - if ( Math.abs(vmgSpd) < 10 ) vmgSpd = vmgSpd.toFixed(1); - else vmgSpd = Math.round(vmgSpd); - - if (isNaN(vmgSpd)) vmgSpd = '---'; -} - function prevScrn() { cfg.modeA = cfg.modeA-1; - if ( cfg.modeA < 0 ) cfg.modeA = 5; + if ( cfg.modeA < 0 ) cfg.modeA = 4; savSettings(); onGPS(lf); } function nextScrn() { cfg.modeA = cfg.modeA+1; - if ( cfg.modeA > 5 ) cfg.modeA = 0; + if ( cfg.modeA > 4 ) cfg.modeA = 0; savSettings(); onGPS(lf); } @@ -570,14 +529,14 @@ function nextFunc(dur) { if ( dur < 2 ) showMax = !showMax; // Short press toggle fix/max display else { maxSpd = 0; maxAlt = 0; } // Long press resets max values. } - else if ( cfg.modeA == 2 || cfg.modeA == 3) nxtWp(); // Dist or VMG mode - Select next waypoint + else if ( cfg.modeA == 2) nxtWp(); // Dist mode - Select next waypoint onGPS(lf); } function updateClock() { if (!canDraw) return; - if ( cfg.modeA != 5 ) return; + if ( cfg.modeA != 4 ) return; drawClock(); if ( emulator ) {maxSpd++;maxAlt++;} } @@ -687,15 +646,15 @@ console.log('MDL'); // Read settings. let cfg = require('Storage').readJSON('speedalt2.json',1)||{}; -cfg.spd = cfg.spd||1; // Multiplier for speed unit conversions. 0 = use the locale values for speed -cfg.spd_unit = cfg.spd_unit||'kph'; // Displayed speed unit +cfg.spd = cfg.spd||0; // Multiplier for speed unit conversions. 0 = use the locale values for speed +cfg.spd_unit = cfg.spd_unit||''; // Displayed speed unit cfg.alt = cfg.alt||0.3048;// Multiplier for altitude unit conversions. cfg.alt_unit = cfg.alt_unit||'feet'; // Displayed altitude units cfg.dist = cfg.dist||1000;// Multiplier for distnce unit conversions. cfg.dist_unit = cfg.dist_unit||'km'; // Displayed altitude units cfg.colour = cfg.colour||0; // Colour scheme. cfg.wp = cfg.wp||0; // Last selected waypoint for dist -cfg.modeA = cfg.modeA||0; // 0=Speed 1=Alt 2=Dist 3 = vmg 4=Position 5=Clock +cfg.modeA = cfg.modeA||0; // 0=Speed 1=Alt 2=Dist 3=Position 4=Clock cfg.primSpd = cfg.primSpd||0; // 1 = Spd in primary, 0 = Spd in secondary cfg.spdFilt = cfg.spdFilt==undefined?true:cfg.spdFilt; @@ -757,4 +716,3 @@ Bangle.on('GPS', onGPS); setButtons(); setInterval(updateClock, 10000); -setInterval(updateVMG, 10000); From 2981aaf4af2c4c85987f460348f2169499f11e3a Mon Sep 17 00:00:00 2001 From: nujw Date: Mon, 1 Nov 2021 11:58:40 +1300 Subject: [PATCH 29/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 6e18c3505..5aeb95eb6 100644 --- a/apps.json +++ b/apps.json @@ -3233,7 +3233,7 @@ "name": "GPS Adventure Sports II", "shortName":"GPS Adv Sport II", "icon": "app.png", - "version":"1.16", + "version":"1.10", "description": "GPS speed, altitude and distance to waypoint display. Designed for easy viewing and use during outdoor activities such as para-gliding, hang-gliding, sailing, cycling etc.", "tags": "tool,outdoors", "supports": ["BANGLEJS"], From 5a3fd1d9e31468f64728f8c49dde8b1f532e7d00 Mon Sep 17 00:00:00 2001 From: The Dod Date: Wed, 15 Dec 2021 14:10:29 +0200 Subject: [PATCH 30/52] Initial commit of `lapcounter` app --- apps.json | 17 +++++++++++ apps/lapcounter/ChangeLog | 1 + apps/lapcounter/README.md | 19 ++++++++++++ apps/lapcounter/app-icon.js | 1 + apps/lapcounter/app.js | 53 +++++++++++++++++++++++++++++++++ apps/lapcounter/app.png | Bin 0 -> 749 bytes apps/lapcounter/screenshot.png | Bin 0 -> 6557 bytes 7 files changed, 91 insertions(+) create mode 100644 apps/lapcounter/ChangeLog create mode 100644 apps/lapcounter/README.md create mode 100644 apps/lapcounter/app-icon.js create mode 100644 apps/lapcounter/app.js create mode 100644 apps/lapcounter/app.png create mode 100644 apps/lapcounter/screenshot.png diff --git a/apps.json b/apps.json index fd46de1d8..c379a1de4 100644 --- a/apps.json +++ b/apps.json @@ -4986,5 +4986,22 @@ {"name":"showimg.app.js","url":"app.js"}, {"name":"showimg.img","url":"app-icon.js","evaluate":true} ] + }, + { + "id": "lapcounter", + "name": "Lap Counter", + "version": "0.01", + "description": "Click button to count laps. Shows count and total time snapshot (like a stopwatch, but laid back).", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "app", + "tags": "tool,outdoors", + "readme":"README.md", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"lapcounter.app.js","url":"app.js"}, + {"name":"lapcounter.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/lapcounter/ChangeLog b/apps/lapcounter/ChangeLog new file mode 100644 index 000000000..9db0e26c5 --- /dev/null +++ b/apps/lapcounter/ChangeLog @@ -0,0 +1 @@ +0.01: first release diff --git a/apps/lapcounter/README.md b/apps/lapcounter/README.md new file mode 100644 index 000000000..8866955e4 --- /dev/null +++ b/apps/lapcounter/README.md @@ -0,0 +1,19 @@ +# Lap Counter + +Click button to count laps (e.g. in a swimming pool). +Also shows total duration snapshot (like a stopwatch, but laid back). + +![Screenshot](screenshot.png) + +## Usage + +* Click BTN1 to start counting. Counter becomes `0`, duration becomes `00:00.0` +* Each time you click BTN1, counter is incremented, and you see duration between first and last clicks. + +## Features + +Disables LCD timeout (so that you can be _sure_ what BTN1 would do). + +## Creator + +[Nimrod Kerrett](https://zzzen.com) diff --git a/apps/lapcounter/app-icon.js b/apps/lapcounter/app-icon.js new file mode 100644 index 000000000..c5cae2388 --- /dev/null +++ b/apps/lapcounter/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AAkQgEBAREAC6oABdZQXkI6wuKC5iPUFxoXIOpoX/C6QFCC6IsCC6ZEDC/4XcPooXOFgoXQIgwX/C7IUFC5wsIC5ouCC6hcJC5h1DF9YwBChCPOAH4A/AH4Ap")); diff --git a/apps/lapcounter/app.js b/apps/lapcounter/app.js new file mode 100644 index 000000000..215f6140a --- /dev/null +++ b/apps/lapcounter/app.js @@ -0,0 +1,53 @@ +const w = g.getWidth(); +const h = g.getHeight(); +const wid_h = 24; +let tStart; +let tNow; +let counter=-1; + +const icon = require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AAkQgEBAREAC6oABdZQXkI6wuKC5iPUFxoXIOpoX/C6QFCC6IsCC6ZEDC/4XcPooXOFgoXQIgwX/C7IUFC5wsIC5ouCC6hcJC5h1DF9YwBChCPOAH4A/AH4Ap")); + +function timeToText(t) { // Courtesy of stopwatch app + let hrs = Math.floor(t/3600000); + let mins = Math.floor(t/60000)%60; + let secs = Math.floor(t/1000)%60; + let tnth = Math.floor(t/100)%10; + let text; + + if (hrs === 0) + text = ("0"+mins).substr(-2) + ":" + ("0"+secs).substr(-2) + "." + tnth; + else + text = ("0"+hrs) + ":" + ("0"+mins).substr(-2) + ":" + ("0"+secs).substr(-2); + //log_debug(text); + return text; +} + +function doCounter() { + if (counter<0) { + tStart = Date.now(); + tNow = tStart; + } else { + tNow = Date.now(); + } + counter++; + let dT = tNow-tStart; + + g.clearRect(0,wid_h,w,h-wid_h); + g.setFontAlign(0,0); + g.setFont("Vector",72); + g.drawString(counter,w/2,h/2); + g.setFont("Vector",24); + g.drawString(timeToText(dT),w/2,h/2+50); +} + +setWatch(doCounter, BTN1, true); + +g.clear(true); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +Bangle.setLCDTimeout(0); +g.drawImage(icon,w/2-24,h/2-24); +g.setFontAlign(0,0); +require("Font8x12").add(Graphics); +g.setFont("8x12"); +g.drawString("Click button to count.", w/2, h/2+22); diff --git a/apps/lapcounter/app.png b/apps/lapcounter/app.png new file mode 100644 index 0000000000000000000000000000000000000000..7d6ca83174b3247d0f82e74ed8ec0712998038e7 GIT binary patch literal 749 zcmVEX>4Tx04R}tkv&MmKpe$iTcxE`1nnT=kfAzR6cusQDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JWDYS_3;J6>}?mh0_0scmXsb<$WplX(p zP9}tGZdC}rB7!jbFouxCOnpuiQ}7&L_we!cF3z*O&;2=il)T9RpFljzbi*RvAfDc| zbk6(4QC5-^;&b9rgDyz?$aUG}H_kjWYY7*QDULk!Ey()lA#h$5yuo&qkMnX zWrgz=XSGset$XqpM)KOqGS_JiA&EsSL4*JqHIz|-g*dGmDJIgipYZSxI)0H{GP%lN z5bWxZD8-o^;8O94SE4Unl_YXY@@up#K&KuerUo_Hp_EWT>mu4RCM> zj1(z*-Q(S%&ffk#)9UXBT1#@BF?hPm00009a7bBm000XU000XU0RWnu7ytkO2XskI zMF-^!4GkN-0f&@VpiFrSm1{3=hydkQ#fP+wck#v}z|=f*$Ai@q zvxO8u0W8~0QEeGKlx@Dv6ODyj&mCkT1^A-?QQBs%g_hbT8VfD8jVz=9DF#T&HdDoi zw2ilgLKGkJqkc6i$1jj*0~nxi6raQjTw@K8&Aje0_IKa{-0YKeT?5cGP3trM3yRd= f8wMeS5F#SpSZ5h(LPy<<00000NkvXXu0mjfZYxA6 literal 0 HcmV?d00001 diff --git a/apps/lapcounter/screenshot.png b/apps/lapcounter/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f3113d86ee87fe8e0ce067038da76550e3a5117f GIT binary patch literal 6557 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%0Dv%Z*_4v-PN}s>l>@o4!57kd3*>vCJ z4dYh&JLI{zBRt_7^(4;kRGNI%548lX^|@g;g%%NM5-O7Dl>`JYSw~!v*|xle#`#~8 zM>Z~v@Xg!fF~-ZkmI+6qBqh-fjbN*#VrNNirn@@F7Y#}>;cJhv*fx}=sAY(7stMP`L|D)l zzikEZP~b6~NW(5YQ!olRv%OZQEW9JzH*xoOJl?tnC}|r+Q?IWRP>k!|b_{lk8T&up zsg?B5S&6w7ISVcaylAv&ma2+!NdNwuh2K7>ydapaN=EKTNZ7>x82~9em*NFP_fS@s zN8iE0$3PQ;NpwSzkdWhEdeOHp`t9!xjb$(iY}#k@$$arKq@oIr^7$*V`6G>eb|!`M z@Zb+Tc6E`xE*ULzNz@~igU7QH!t|h3C_&HoQZOE4n5P5K-MT6eJ@@AYQ;=Vp?`<9e zWtY^YU)c$$D;_;FSAO2rlC#fpE_<{xYY?-*o(KcX2wY zu$`;Ep2m7Hy_`-!Z}AYwDH;3@fkSsT*$BGC=XKg7OSo%|`#p37CBK5-ZTm%KrYxYC z_172#VrLd(esgxNgVslH&H1QX^bO>onNj2*!p-PdH4mBih$#SJFc|~}1qu!j4ZvtY z0DjrVz994#{~HN|5&nnZ02N-4|APPT@g_W;OP!+aADUgEVX!xmox$cHY{=U-S+aAI z4J;#sZaC+*WNw5H{p!<6sT~g?j|GA2{lVk4GZux@=BCD4GVa2x`+$%q%Q=_I8{$$} zR8F@+N!R7`Tpy6u@-n+0NbB-2r(pQ-PaT@m24%IHFe+sEpBHHRP$k1Y$CCr1;^(hP z>xVlDq=qQi)Mn;U6cFOQ*Q8+Jz>CBGfQE_#93UYB=LT=siouJ@tG`2m_=>4OGZsrn zC?KaFxH}A2hyLG>$NMM@M8xTSYQhk*V{u(*Le5`cUnfXe+9o}(*S$}nFvW)AijOl5 zpwL=kO?oZA5LPD^p>Fk__;agHD|ckEYao@BFJssnC>|HQTNeMKSubN<NHTW?;%;+UiDt)m4 zCc0w;pYEQWle<3nXSyT&{5p{8*}4on!>zxyO;~$9J+8z{v&ywmc863_NDlw320kz<>8EyMn@O9hO)ed+!tAk(EkOfXi-uC literal 0 HcmV?d00001 From 3559247415fa68d44cbd3cd068c5dfc466caeaf8 Mon Sep 17 00:00:00 2001 From: The Dod Date: Wed, 15 Dec 2021 17:14:19 +0200 Subject: [PATCH 31/52] Remove `;` from app-icon (upsets travis-ci) --- apps/lapcounter/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lapcounter/app-icon.js b/apps/lapcounter/app-icon.js index c5cae2388..a443b3a41 100644 --- a/apps/lapcounter/app-icon.js +++ b/apps/lapcounter/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AAkQgEBAREAC6oABdZQXkI6wuKC5iPUFxoXIOpoX/C6QFCC6IsCC6ZEDC/4XcPooXOFgoXQIgwX/C7IUFC5wsIC5ouCC6hcJC5h1DF9YwBChCPOAH4A/AH4Ap")); +require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AAkQgEBAREAC6oABdZQXkI6wuKC5iPUFxoXIOpoX/C6QFCC6IsCC6ZEDC/4XcPooXOFgoXQIgwX/C7IUFC5wsIC5ouCC6hcJC5h1DF9YwBChCPOAH4A/AH4Ap")) From 2378ff304bb13d33e78c764875dcdb971376b3e5 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Wed, 15 Dec 2021 19:11:32 +0000 Subject: [PATCH 32/52] Pastle, Pebble, Rebble: updated dependancies and ChangeLogs --- apps.json | 9 +++++---- apps/pastel/ChangeLog | 1 + apps/pebble/ChangeLog | 1 + apps/rebble/ChangeLog | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/apps.json b/apps.json index c379a1de4..0dd10cce6 100644 --- a/apps.json +++ b/apps.json @@ -4209,7 +4209,7 @@ "id": "pastel", "name": "Pastel Clock", "shortName": "Pastel", - "version": "0.08", + "version": "0.09", "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", "dependencies": {"mylocation":"app", "widpedom":"app"}, @@ -4723,8 +4723,9 @@ "id": "pebble", "name": "Pebble Clock", "shortName": "Pebble", - "version": "0.04", + "version": "0.06", "description": "A pebble style clock to keep the rebellion going", + "dependencies": {"widpedom":"app"}, "readme": "README.md", "icon": "pebble.png", "screenshots": [{"url":"pebble_screenshot.png"}], @@ -4876,11 +4877,11 @@ "id": "rebble", "name": "Rebble Clock", "shortName": "Rebble", - "version": "0.02", + "version": "0.03", "description": "A Pebble style clock, with configurable background, three sidebars including steps, day, date, sunrise, sunset, long live the rebellion", "readme": "README.md", "icon": "rebble.png", - "dependencies": {"mylocation":"app"}, + "dependencies": {"mylocation":"app", "widpedom":"app"}, "screenshots": [{"url":"screenshot_rebble.png"}], "type": "clock", "tags": "clock", diff --git a/apps/pastel/ChangeLog b/apps/pastel/ChangeLog index 2ede0e161..afeb305c5 100644 --- a/apps/pastel/ChangeLog +++ b/apps/pastel/ChangeLog @@ -6,3 +6,4 @@ 0.06: Converted fonts to font modules 0.07: Added info line that cycles on BTN1/BTN3 (or vitual buttons on a bangle 2) 0.08: Added dependancy on MyLocation +0.09: Added dependancy on Pedometer Widget diff --git a/apps/pebble/ChangeLog b/apps/pebble/ChangeLog index b3d37f841..d92be5e9c 100644 --- a/apps/pebble/ChangeLog +++ b/apps/pebble/ChangeLog @@ -3,3 +3,4 @@ 0.03: Changed time+calendar font to LECO1976Regular, changed to slanting boot 0.04: Fix widget hiding code (fix #1046) 0.05: Fix typo in settings - Purple +0.06: Added dependancy on Pedometer Widget diff --git a/apps/rebble/ChangeLog b/apps/rebble/ChangeLog index 3e7094eab..16e65d4f9 100644 --- a/apps/rebble/ChangeLog +++ b/apps/rebble/ChangeLog @@ -1,2 +1,3 @@ 0.01: First release -0.02: Fix dependancies, fix type to Purple +0.02: Fix typo to Purple +0.03: Added dependancy on Pedometer Widget From 0c9eeb4e2369fe3bda41bf56e0edccdba4036162 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Wed, 15 Dec 2021 19:30:05 +0000 Subject: [PATCH 33/52] Updated README for stopwatch touch --- apps/stopwatch/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/stopwatch/README.md b/apps/stopwatch/README.md index 30a9306d1..ceeafaefc 100644 --- a/apps/stopwatch/README.md +++ b/apps/stopwatch/README.md @@ -31,3 +31,6 @@ Which one is which ? ![](A.jpg) ![](B.jpg) + + +Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) From 81bc60796b5001d5990530dcd2d237a7d24ee52b Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Wed, 15 Dec 2021 11:54:23 -0800 Subject: [PATCH 34/52] Update app.js Implement tap-to-decorate feature. --- apps/pooqround/app.js | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/apps/pooqround/app.js b/apps/pooqround/app.js index 29fae6ee6..744828ca7 100644 --- a/apps/pooqround/app.js +++ b/apps/pooqround/app.js @@ -330,6 +330,8 @@ class Round { this.render(new Date()); // Not quite right, I think. } + enhanceUntil(t) {this.enhance = t;} + pie(f, a0, a1, invert) { if (!invert) return this.pie(f, a1, a0 + 1, true); let t0 = Math.tan(a0 * 2 * Math.PI), t1 = Math.tan(a1 * 2 * Math.PI); @@ -369,17 +371,18 @@ class Round { const g = this.g; const b = this.b, bI = this.bI; const c = this.c, cI = this.cI; + const e = d < this.enhance; const state = this.state; const options = this.options; const cal = options.calendric; const res = options.resolution; - const dow = (cal == 1 || cal > 2) && d.getDay(); + const dow = (e || cal == 1 || cal > 2) && d.getDay(); const ts = res < 2 && d.getSeconds(); - const tm = res < 3 && d.getMinutes() + ts / 60; + const tm = (e || res < 3) && d.getMinutes() + ts / 60; const th = d.getHours() + d.getMinutes() / 60; - const dd = cal > 1 && d.getDate(); - const dm = cal > 3 && d.getMonth(); - const dy = cal > 4 && d.getFullYear(); + const dd = (e || cal > 1) && d.getDate(); + const dm = (e || cal > 3) && d.getMonth(); + const dy = (e || cal > 4) && d.getFullYear(); const xc = this.xc, yc = this.yc, r = this.r; const dlr = xc * 3/4, dlw = 8, dlhw = 4; @@ -504,9 +507,15 @@ class Clock { this.options.resolution++; this.rates.clock = this.timescales[this.options.resolution]; this.active(); - } else if (this.yX - this.yN < 20 && Date.now() - this.t0 > 500) { - this.stop(); - this.options.interact(); + } else if (this.yX - this.yN < 20) { + const now = new Date(); + if (now - this.t0 < 250) { + face.enhanceUntil(now + 30000); + face.render(now); + } else if (now - this.t0 > 500) { + this.stop(); + this.options.interact(); + } } this.t0 = null; } From 4ec850bec21e34a4e0c317b72b2616d2df16752d Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Wed, 15 Dec 2021 11:55:40 -0800 Subject: [PATCH 35/52] Update ChangeLog --- apps/pooqround/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/pooqround/ChangeLog b/apps/pooqround/ChangeLog index 12876f71a..bad8933d0 100644 --- a/apps/pooqround/ChangeLog +++ b/apps/pooqround/ChangeLog @@ -1 +1,2 @@ 0.00: Initial check-in. +0.01: Add tap-to-decorate feature. From 556d872f5e2c9de3216f719398fed0e9dc6d3d11 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Wed, 15 Dec 2021 11:56:40 -0800 Subject: [PATCH 36/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c379a1de4..83be006f9 100644 --- a/apps.json +++ b/apps.json @@ -4941,7 +4941,7 @@ { "id": "pooqround", "name": "pooq Round watch face", "shortName":"pooq Round", - "version":"0.00", + "version":"0.01", "description": "A 24 hour analogue watchface with high legibility and a novel style.", "icon": "app.png", "type": "clock", From cff3a993809d50bf1ba79f6116395c2d50f8bf48 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Tue, 14 Dec 2021 10:34:42 +0000 Subject: [PATCH 37/52] ptlaunch: Respect theme colors. Fix: Do not pollute global space with internal variables ans functions in boot.js --- apps.json | 2 +- apps/ptlaunch/ChangeLog | 3 +- apps/ptlaunch/app.js | 14 +- apps/ptlaunch/boot.js | 326 ++++++++++++++++++++-------------------- 4 files changed, 173 insertions(+), 172 deletions(-) diff --git a/apps.json b/apps.json index c379a1de4..0a69096c8 100644 --- a/apps.json +++ b/apps.json @@ -4858,7 +4858,7 @@ "id": "ptlaunch", "name": "Pattern Launcher", "shortName": "Pattern Launcher", - "version": "0.10", + "version": "0.11", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.png"}], diff --git a/apps/ptlaunch/ChangeLog b/apps/ptlaunch/ChangeLog index de38d715a..23031cff3 100644 --- a/apps/ptlaunch/ChangeLog +++ b/apps/ptlaunch/ChangeLog @@ -1,4 +1,5 @@ 0.01: Initial creation of the pattern launch app 0.02: Turn on lcd when launching an app if the lock screen was disabled in the settings 0.03: Make tap to confirm new pattern more reliable. Also allow for easier creation of single circle patterns. -0.10: Improve the management of existing patterns: Draw the linked pattern on the left hand side of the app name within a scroller, similar to the default launcher. Slighlty clean up the code to make it less horrible. \ No newline at end of file +0.10: Improve the management of existing patterns: Draw the linked pattern on the left hand side of the app name within a scroller, similar to the default launcher. Slighlty clean up the code to make it less horrible. +0.11: Respect theme colors. Fix: Do not pollute global space with internal variables ans functions in boot.js \ No newline at end of file diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index b5a3bf610..9cd566e3d 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -119,8 +119,7 @@ var recognizeAndDrawPattern = () => { return new Promise((resolve) => { E.showMenu(); g.clear(); - g.setColor(0, 0, 0); - CIRCLES.forEach((circle) => drawCircle(circle)); + drawCirclesWithPattern([]); var pattern = []; @@ -369,7 +368,6 @@ var drawAppWithPattern = (i, r, storedPatterns) => { offset: { x: 1, y: 3 + r.y }, }); - g.setColor(0, 0, 0); if (!storedPattern.wrappedAppName) { storedPattern.wrappedAppName = g .wrapString(app.name, g.getWidth() - 64) @@ -490,7 +488,10 @@ var drawCircle = (circle, drawBuffer, scale) => { log("drawing circle"); log({ x: x, y: y, r: r }); + drawBuffer.setColor(0); drawBuffer.fillCircle(x, y, r); + drawBuffer.setColor(1); + drawBuffer.drawCircle(x, y, r); }; var cachedCirclesDrawings = {}; @@ -535,17 +536,16 @@ var drawCirclesWithPattern = (pattern, options) => { { msb: true } ); - drawBuffer.setColor(1); CIRCLES.forEach((circle) => drawCircle(circle, drawBuffer, scale)); - drawBuffer.setColor(0); + drawBuffer.setColor(1); drawBuffer.setFontAlign(0, 0); - drawBuffer.setFont("6x8", 4 * scale); + drawBuffer.setFont("Vector", scale === 1 ? 40 : 20); pattern.forEach((circleIndex, patternIndex) => { var circle = CIRCLES[circleIndex]; drawBuffer.drawString( patternIndex + 1, - circle.x * scale, + (circle.x + 5) * scale, circle.y * scale ); }); diff --git a/apps/ptlaunch/boot.js b/apps/ptlaunch/boot.js index a23607768..6fbd3ca41 100644 --- a/apps/ptlaunch/boot.js +++ b/apps/ptlaunch/boot.js @@ -1,167 +1,167 @@ -var DEBUG = true; -var log = (message) => { - if (DEBUG) { - console.log(JSON.stringify(message)); - } -}; - -var storedPatterns; -var positions = []; -var dragHandler = (position) => { - positions.push(position); - - debounce().then(() => { - log(positions.length); - - var CIRCLE_RADIUS = 25; - var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; - - var circles = [ - { x: 25, y: 25, i: 0 }, - { x: 87, y: 25, i: 1 }, - { x: 150, y: 25, i: 2 }, - { x: 25, y: 87, i: 3 }, - { x: 87, y: 87, i: 4 }, - { x: 150, y: 87, i: 5 }, - { x: 25, y: 150, i: 6 }, - { x: 87, y: 150, i: 7 }, - { x: 150, y: 150, i: 8 }, - ]; - var pattern = []; - - var step = Math.floor(positions.length / 100) + 1; - - var p, a, b, circle; - - for (var i = 0; i < positions.length; i += step) { - p = positions[i]; - - circle = circles[0]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(0, 1); - } - } - - circle = circles[1]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(1, 1); - } - } - - circle = circles[2]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(2, 1); - } - } - - circle = circles[3]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(3, 1); - } - } - - circle = circles[4]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(4, 1); - } - } - - circle = circles[5]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(5, 1); - } - } - - circle = circles[6]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(6, 1); - } - } - circle = circles[7]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(7, 1); - } - } - - circle = circles[8]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(8, 1); - } - } - } - positions = []; - - pattern = pattern.join(""); - - if (pattern) { - if (storedPatterns[pattern]) { - var app = storedPatterns[pattern].app; - if (!!app && !!app.src) { - if (storedPatterns.settings) { - if (storedPatterns.settings.lockDisabled) { - Bangle.setLCDPower(true); - } - } - - Bangle.removeListener("drag", dragHandler); - load(app.src); - } - } - } - }); -}; - -var debounceTimeoutId; -var debounce = (delay) => { - if (debounceTimeoutId) { - clearTimeout(debounceTimeoutId); - } - - return new Promise((resolve) => { - debounceTimeoutId = setTimeout(() => { - debounceTimeoutId = undefined; - resolve(); - }, delay || 500); - }); -}; - (function () { + var DEBUG = false; + var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } + }; + + var storedPatterns; + var positions = []; + var dragHandler = (position) => { + positions.push(position); + + debounce().then(() => { + log(positions.length); + + var CIRCLE_RADIUS = 25; + var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; + + var circles = [ + { x: 25, y: 25, i: 0 }, + { x: 87, y: 25, i: 1 }, + { x: 150, y: 25, i: 2 }, + { x: 25, y: 87, i: 3 }, + { x: 87, y: 87, i: 4 }, + { x: 150, y: 87, i: 5 }, + { x: 25, y: 150, i: 6 }, + { x: 87, y: 150, i: 7 }, + { x: 150, y: 150, i: 8 }, + ]; + var pattern = []; + + var step = Math.floor(positions.length / 100) + 1; + + var p, a, b, circle; + + for (var i = 0; i < positions.length; i += step) { + p = positions[i]; + + circle = circles[0]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(0, 1); + } + } + + circle = circles[1]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(1, 1); + } + } + + circle = circles[2]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(2, 1); + } + } + + circle = circles[3]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(3, 1); + } + } + + circle = circles[4]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(4, 1); + } + } + + circle = circles[5]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(5, 1); + } + } + + circle = circles[6]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(6, 1); + } + } + circle = circles[7]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(7, 1); + } + } + + circle = circles[8]; + if (circle) { + a = p.x - circle.x; + b = p.y - circle.y; + if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { + pattern.push(circle.i); + circles.splice(8, 1); + } + } + } + positions = []; + + pattern = pattern.join(""); + + if (pattern) { + if (storedPatterns[pattern]) { + var app = storedPatterns[pattern].app; + if (!!app && !!app.src) { + if (storedPatterns.settings) { + if (storedPatterns.settings.lockDisabled) { + Bangle.setLCDPower(true); + } + } + + Bangle.removeListener("drag", dragHandler); + load(app.src); + } + } + } + }); + }; + + var debounceTimeoutId; + var debounce = (delay) => { + if (debounceTimeoutId) { + clearTimeout(debounceTimeoutId); + } + + return new Promise((resolve) => { + debounceTimeoutId = setTimeout(() => { + debounceTimeoutId = undefined; + resolve(); + }, delay || 500); + }); + }; + var sui = Bangle.setUI; Bangle.setUI = function (mode, cb) { sui(mode, cb); From fd6fa1522a5ddaa5b92661cdc06fb44f8f056d00 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Tue, 14 Dec 2021 20:54:35 +0000 Subject: [PATCH 38/52] ptlaunch: update screenshots --- apps.json | 2 +- apps/ptlaunch/README.md | 17 ++++++++++++----- apps/ptlaunch/add_pattern.png | Bin 2642 -> 0 bytes apps/ptlaunch/add_pattern_dark.png | Bin 0 -> 3185 bytes apps/ptlaunch/add_pattern_light.png | Bin 0 -> 3202 bytes apps/ptlaunch/app.js | 7 ++----- apps/ptlaunch/main_menu_add_dark.png | Bin 0 -> 2872 bytes ...in_menu_add.png => main_menu_add_light.png} | Bin apps/ptlaunch/main_menu_manage_dark.png | Bin 0 -> 2863 bytes ...u_manage.png => main_menu_manage_light.png} | Bin apps/ptlaunch/manage_patterns.png | Bin 2670 -> 0 bytes apps/ptlaunch/manage_patterns_dark.png | Bin 0 -> 3008 bytes apps/ptlaunch/manage_patterns_light.png | Bin 0 -> 3027 bytes apps/ptlaunch/select_app_dark.png | Bin 0 -> 2898 bytes .../{select_app.png => select_app_light.png} | Bin 15 files changed, 15 insertions(+), 11 deletions(-) delete mode 100644 apps/ptlaunch/add_pattern.png create mode 100644 apps/ptlaunch/add_pattern_dark.png create mode 100644 apps/ptlaunch/add_pattern_light.png create mode 100644 apps/ptlaunch/main_menu_add_dark.png rename apps/ptlaunch/{main_menu_add.png => main_menu_add_light.png} (100%) create mode 100644 apps/ptlaunch/main_menu_manage_dark.png rename apps/ptlaunch/{main_menu_manage.png => main_menu_manage_light.png} (100%) delete mode 100644 apps/ptlaunch/manage_patterns.png create mode 100644 apps/ptlaunch/manage_patterns_dark.png create mode 100644 apps/ptlaunch/manage_patterns_light.png create mode 100644 apps/ptlaunch/select_app_dark.png rename apps/ptlaunch/{select_app.png => select_app_light.png} (100%) diff --git a/apps.json b/apps.json index 0a69096c8..c28c6686c 100644 --- a/apps.json +++ b/apps.json @@ -4861,7 +4861,7 @@ "version": "0.11", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", - "screenshots": [{"url":"main_menu_add.png"}, {"url":"add_pattern.png"}, {"url":"select_app.png"}, {"url":"main_menu_manage.png"}, {"url":"manage_patterns.png"}], + "screenshots": [{"url":"manage_patterns_light.png"}], "tags": "tools", "supports": ["BANGLEJS2"], "readme": "README.md", diff --git a/apps/ptlaunch/README.md b/apps/ptlaunch/README.md index 8d61afece..7cc39e3d6 100644 --- a/apps/ptlaunch/README.md +++ b/apps/ptlaunch/README.md @@ -10,14 +10,21 @@ Then launch the linked apps directly from the clock screen by simply drawing the ## Add Pattern Screenshots -![](main_menu_add.png) -![](add_pattern.png) -![](select_app.png) +![](main_menu_add_light.png) +![](add_pattern_light.png) +![](select_app_light.png) + +![](main_menu_add_dark.png) +![](add_pattern_dark.png) +![](select_app_dark.png) ## Manage Pattern Screenshots -![](main_menu_manage.png) -![](manage_patterns.png) +![](main_menu_manage_light.png) +![](manage_patterns_light.png) + +![](main_menu_manage_dark.png) +![](manage_patterns_dark.png) ## Detailed Steps diff --git a/apps/ptlaunch/add_pattern.png b/apps/ptlaunch/add_pattern.png deleted file mode 100644 index c7cc38e82c25b4661bc026ce7dd5901c77fb9f7f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2642 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 literal 0 HcmV?d00001 diff --git a/apps/ptlaunch/add_pattern_light.png b/apps/ptlaunch/add_pattern_light.png new file mode 100644 index 0000000000000000000000000000000000000000..47549b43e718f0929a1b58bb7dd71e3ff71f6b2d GIT binary patch literal 3202 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 l8rwYIwsec%<81V { }, }; - var appList = getAppList(); - appList.forEach((app) => { - selectAppMenu[app.name] = () => { + [].forEach((app) => { + selectAppMenu[app] = () => { log("app selected"); - log(app); - resolve(app); }; }); diff --git a/apps/ptlaunch/main_menu_add_dark.png b/apps/ptlaunch/main_menu_add_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4c1564ecadefd9f7289ecd436e1b166208a8ee39 GIT binary patch literal 2872 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 G{eJ*RlwsQd literal 0 HcmV?d00001 diff --git a/apps/ptlaunch/main_menu_manage.png b/apps/ptlaunch/main_menu_manage_light.png similarity index 100% rename from apps/ptlaunch/main_menu_manage.png rename to apps/ptlaunch/main_menu_manage_light.png diff --git a/apps/ptlaunch/manage_patterns.png b/apps/ptlaunch/manage_patterns.png deleted file mode 100644 index 82b10ad43a60ea3b38c39c2bb1f4491235f0dabc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2670 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 aeV|ihqCHlzjQt}A082A8^66P@^#1^?Kzw)r literal 0 HcmV?d00001 diff --git a/apps/ptlaunch/manage_patterns_light.png b/apps/ptlaunch/manage_patterns_light.png new file mode 100644 index 0000000000000000000000000000000000000000..5e4b27131e5531a7b3191c7664543c5e542d3607 GIT binary patch literal 3027 zcmb`Jc{tSD8^FKwWirOjBqmEt%35lW$Pi-&*|!*L_LynNa)+PGSP~IQu|$nw*b_1#$c%>bkg?Ga5sKqXJt%j$V9%IeA3Qk^X&sw%58bTYEA zGOSP63sqMV%nS2N&&)Dgk{yu}n-`P^>Gs-io_c&I{^Vw6NJeUSiU`EL;tLO`SC08> zxYxODqW&xi{oov$cNT`stV=Qm_RV3w!&YD}% zxIkQEwKNC1+KwDul37lj1goA*yxwU7aKI-*(nz#D?N zN5W!SIJB-r53F{IC-7%vWTHqY5(Q+~jUbppO0K|Y{uaZs-E*BO6%JVrYB!4gLP5hf zUv^#8aBEB3vvUGwtk0yk!(puUZo42C2qZ)MzNrtCH}vbQvQ`xp=sOjT(U8b|u7k&GfXYGQ;28oLW?p%kv@7iiz z=6c#zGjHDB2$=tHyOdw`1T`tK`%*5rq4h;N%Al~!HPxMeQUeKLxOE&0sogsz{OYI` zsbuC=d`Hnsm3yszl zdwrYhyeEZNj~cb>41k7d`s$G!amv{vY?myrA#1t!m@9O-onI;rWTqj+tRs>Afp5lH zZ<%Mt{b-!XM(0+S=|?!_m!DzFoSzuq-q~&9_Ct5P_JKoGsa4^;NzSnG!s*HondR|)+iF*52%C+Spb*cn|S`~wki{a+sdXY zdX1A+jBWcsMbN)J%9$bd8>}U}6IzFE^%?#)m2`!-v1zP~ZzuNgwHpf6Uvi_R)??(? zA9svW=ByAOQhznb@2|*h(Vy7wBu~H!#4kmul+ES1TBZ2pDOANyJz=6~dTrU0Nmjr#&wEl=E~$fA4s5^b1LkE!}tXm1uhOYN%TqlC(-^Koh443C61d!&t(B}>+i zj2BB4U-1iF$6W&J_-eIFn+^iztWm3;*lFQV8*_2UPB7o7+WrceQw^Y3aS*=%g;H78 z{`JXn=!O;{M6Ws!S^X%tP++TOm>pj1SUdKI5`e*v&K#;a#DtVlIL_DI_P^|Uyon?T zyo|jwa^tb{lj_3hIk)mnW=}bVb0iqw@sAp$>>_F>jUbGuxLk5!Fe_f=^_yE0`Bwuf zjMCGk<)1te|?lXZX|FAbqJl&U}Jh;-|2aYs2f= z@$8+hkj#zYLCFZ={ZnUJ_UGxEgm-Ryoug=-XI_3;;>npN35K1WS<6=^7AB@jalKE>uNL`E&_A);dgprfkOQf7?IWWCu!AS-c1HX-jvm9|eGm6X!& zNo~`kw8Jh*u*{atMm^>DiZgRWDbma356D7hA2^PqJx9= zpPAWWrwPZlFL|2=vx-K&cw%^loVKRe6^1K@JsuaryPR;M2R0$m3LNB>2<%HR z4bM{htcQ6#ZOWV33O8nXCRR+`+1CWKZ{x5L6UaF`p1|Ek+@H!Yu|1e(MXax!%zyBM zMZ$g_0=t*1nnl7kH6$*#Kad%)7K7xx^5; zHxQ*>D{6*l6R;X%We!H{gu!Q6h$-SzW=1NZ-m0A2M&yb^5q3rZe&{|)k6Rd99wPSMp+uE2t({1jV9sO7iWBwL^$$twRgN&|?y(p9hP)b%)jmqbpAv}dU0qTJe;zCg*^pVHK#H>yAB#e69j>J>!C_>9Yr;8E)ON#7&R zN9@zVjd>@H5tv{EW2>7R2kQ?hd))FM ucK=Gp7($decD|Hi%xyXDxu5SVW5%~*$4A3zqPMwSI$&;Ujjb{EPW&&J#d#wD literal 0 HcmV?d00001 diff --git a/apps/ptlaunch/select_app_dark.png b/apps/ptlaunch/select_app_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..422f2b5e2ef60255a751c81fd8599eaa70d2fa0b GIT binary patch literal 2898 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 literal 0 HcmV?d00001 diff --git a/apps/ptlaunch/select_app.png b/apps/ptlaunch/select_app_light.png similarity index 100% rename from apps/ptlaunch/select_app.png rename to apps/ptlaunch/select_app_light.png From c52f57f5bad9a50cae8931ec56ebf160eacf4f49 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Tue, 14 Dec 2021 20:59:06 +0000 Subject: [PATCH 39/52] ptlaunch: fix setup for screenshots --- apps/ptlaunch/app.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 06c38e391..d3b4dd1aa 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -323,9 +323,12 @@ var getSelectedApp = () => { }, }; - [].forEach((app) => { - selectAppMenu[app] = () => { + var appList = getAppList(); + appList.forEach((app) => { + selectAppMenu[app.name] = () => { log("app selected"); + log(app); + resolve(app); }; }); @@ -537,12 +540,12 @@ var drawCirclesWithPattern = (pattern, options) => { drawBuffer.setColor(1); drawBuffer.setFontAlign(0, 0); - drawBuffer.setFont("Vector", scale === 1 ? 40 : 20); + drawBuffer.setFont("Vector", 40 * scale); pattern.forEach((circleIndex, patternIndex) => { var circle = CIRCLES[circleIndex]; drawBuffer.drawString( patternIndex + 1, - (circle.x + 5) * scale, + (circle.x + (scale === 1 ? 1 : 5)) * scale, circle.y * scale ); }); From eeed392782d92a6f10c9d0083de8e92d584fa19e Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 15 Dec 2021 20:12:30 +0000 Subject: [PATCH 40/52] ptlaunch: remove now redundant draw call, and also remove all setColor calls since we now only need the fg color which is the default anyways --- apps/ptlaunch/app.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index d3b4dd1aa..062cc3c62 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -488,9 +488,6 @@ var drawCircle = (circle, drawBuffer, scale) => { log("drawing circle"); log({ x: x, y: y, r: r }); - drawBuffer.setColor(0); - drawBuffer.fillCircle(x, y, r); - drawBuffer.setColor(1); drawBuffer.drawCircle(x, y, r); }; @@ -538,7 +535,6 @@ var drawCirclesWithPattern = (pattern, options) => { CIRCLES.forEach((circle) => drawCircle(circle, drawBuffer, scale)); - drawBuffer.setColor(1); drawBuffer.setFontAlign(0, 0); drawBuffer.setFont("Vector", 40 * scale); pattern.forEach((circleIndex, patternIndex) => { From 32af21245475b38f1014c13fe7e55b9d968fc864 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:18:07 -0800 Subject: [PATCH 41/52] Update README.md --- apps/pooqround/README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/pooqround/README.md b/apps/pooqround/README.md index 3c651ed67..d413fd88e 100644 --- a/apps/pooqround/README.md +++ b/apps/pooqround/README.md @@ -10,16 +10,18 @@ Either you'll like that, or you won't. ## Options -Because sometimes I don't want to burn what I'm cooking and others I'm lazy and just want to know if it's afternoon yet, -you can alter the number of ‘hands’ on the display. When the watch is unlocked, slide up to add dots representing the minute and second, -or down to remove the distraction. There's also a setting that displays the second hand, but only if the watch is perfectly face-to-the-sky, -in case you want the ability to check the _exact_ time, hands free, without the impact on battery life this usually entails. - Although we generally obey the system-wide theming, you can long press on the display for a menu of additional options specific to the face. We don't observe the system 12/24 setting, since it the design of the face is equally good in either interpretation. -By default, there is a backlight that comes on when you twist your wrist. This, of course, somewhat increases power draw and could be -annoying in an intentionally dark environment, so there is an option to disable it. +If you like an uncluttered display style, you can still bring up the day, date and minute hand transiently with a tap on the watchface (when unlocked). + +Similarly, because sometimes I don't want to burn what I'm cooking and others I'm lazy and just want to know if it's afternoon yet, +you can quickly alter the number of ‘hands’ on the display. When the watch is unlocked, slide up to add dots representing the minute and second, +or down to remove the distraction. There's also a setting that displays the second hand, but only if the watch is perfectly face-to-the-sky, +in case you want the ability to check the _exact_ time, hands free, without the impact on battery life this usually entails. + +In some versions of the Bangle.js firmware, the backlight doesn't come on automatically when you twist your wrist. There's currently a workaround +for this integrated into the watchface; you can disable it in the menu, if you prefer. ## Limitations From 030eddba5c464eb669a56bb508cf8923fd194757 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:47:45 -0800 Subject: [PATCH 42/52] Update app.js Fix broken variable update. Fix excessive screen clearing. --- apps/pooqround/app.js | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/apps/pooqround/app.js b/apps/pooqround/app.js index 744828ca7..22cf5ff79 100644 --- a/apps/pooqround/app.js +++ b/apps/pooqround/app.js @@ -83,7 +83,6 @@ class Options { Bangle.removeListener('drag', this.reactivator); this.emit('done'); } - g.clear(true); E.showMenu(m); } @@ -309,7 +308,7 @@ class Round { buffer: this.c.buffer, transparent: 0 }; this.options = new RoundOptions(); - this.timescales = [1000, 0, 60000, 900000]; + this.timescales = [1000, [1000, 60000], 60000, 900000]; this.state = {}; // Precomputed polygons for the border areas. this.tl = [0, 0, 58, 0, 0, 58]; @@ -323,7 +322,7 @@ class Round { this.r = this.xc - this.minR; } - reset() {this.state = {}; this.g.clear(true);} + reset(clear) {this.state = {}; clear && this.g.clear(true);} doIcons(which) { this.state[which] = null; @@ -478,7 +477,6 @@ class Clock { this.timescales = face.timescales; this.options = face.options; this.rates = {}; - this.faceUp = null; this.options.on('done', () => this.start()); @@ -488,7 +486,6 @@ class Clock { lock: () => {face.doIcons('locked'); this.active();}, faceUp: up => { this.conservative = !up; - this.faceUp = up; this.active(); }, twist: _ => this.options.autolight && Bangle.setLCDPower(true), @@ -529,7 +526,7 @@ class Clock { redraw(rate) { const now = this.updated = new Date(); - if (this.refresh) this.face.reset(); + if (this.refresh) this.face.reset(true); this.refresh = false; rate = this.face.render(now, rate); if (rate !== this.rates.face) { @@ -544,7 +541,7 @@ class Clock { this.exception && clearTimeout(this.exception); this.interval && clearInterval(this.interval); this.timeout = this.exception = this.interval = this.rate = null; - this.face.reset(); // Cancel any ongoing background rendering + this.face.reset(false); // Cancel any ongoing background rendering return this; } From a72974110ca0f751c3ad9417d8bced4fed89f220 Mon Sep 17 00:00:00 2001 From: stephenPspackman <93166870+stephenPspackman@users.noreply.github.com> Date: Wed, 15 Dec 2021 12:48:13 -0800 Subject: [PATCH 43/52] Update ChangeLog --- apps/pooqround/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/pooqround/ChangeLog b/apps/pooqround/ChangeLog index bad8933d0..8eb91cf97 100644 --- a/apps/pooqround/ChangeLog +++ b/apps/pooqround/ChangeLog @@ -1,2 +1,2 @@ 0.00: Initial check-in. -0.01: Add tap-to-decorate feature. +0.01: Add tap-to-decorate feature. Bugfixes. From 6f32b9cbcd7d6444755a2f65d389a840d1affc5f Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 01:21:15 +0100 Subject: [PATCH 44/52] Delete app-icon.js --- apps/showimg/app-icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/showimg/app-icon.js diff --git a/apps/showimg/app-icon.js b/apps/showimg/app-icon.js deleted file mode 100644 index 1c73a2f72..000000000 --- a/apps/showimg/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -E.toArrayBuffer(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAf////AHP/////AH//////AP/8AAAHAP4AAAAHAOAAMAAHAOAAeAAHAOAA+cAHAOAA/+AHAOAA/+AHAOAf/+AHAOA//+AHgOA///AHgOA///gDgOA/z/gDgOAfz/gDgOA///gDgOA///gDgOA//uADgOAf3+ADgOAP/+ADgOAD/8ADwOAB+4ADwOAA8AABwOAAAABBwOA8DgPxwOB/Dg/xwOB/jh/xwOB3zj5xwOB57nzxwOA4/njhwOA4/vHhwOA8f+PB4OAef+PB4OAef8eB4OAPP58A4OAHv/4A4OAH//wA4OAD//AA4OAA/8fn4PDgP///4P//////4P////9/wD///4AAA")) From 562b44279cad48619a3da4e837edec33ebd0cb7d Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 01:22:11 +0100 Subject: [PATCH 45/52] Create app-icon.js --- apps/showimg/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/showimg/app-icon.js diff --git a/apps/showimg/app-icon.js b/apps/showimg/app-icon.js new file mode 100644 index 000000000..abb1eb434 --- /dev/null +++ b/apps/showimg/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkBIf4Aah//BRQAMDowUNC5AARC4YKKL5gTC+B3TCpAyIC5oNBEA4XNJwS4GC55pHC8TEHC57QHC4wSEC5YpEC6YwEC5oEEC5x3DC6ZHbC7PwcYxfNAYYXPJA4XQDAwKEBYQXJIoReHC5gMFAAojBC5QUIC5Y5JMgYXIUQYJFPggXMAwICCBAYXMCAQJDDwQUCC5QOCUwQdEC5QqFDghNFC5wrEC5gQDPgoTCDYYXFMAgXaCQoXJEwZ4FLQbhFC4imDAAglFC5QAGBgYXKIoYWIC5YYFG4ZkDC4YjCYYwAJC4gASC6THFH5pqGAAY")) From fdb4a8835b6fd16d128b2a04e2dcee3d5f5bf29b Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 01:24:27 +0100 Subject: [PATCH 46/52] Create ChangeLog --- apps/showimg/ChangeLog | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/showimg/ChangeLog diff --git a/apps/showimg/ChangeLog b/apps/showimg/ChangeLog new file mode 100644 index 000000000..296bc78d0 --- /dev/null +++ b/apps/showimg/ChangeLog @@ -0,0 +1,2 @@ +0.1: Initial release +0.2: Fixed launcher image From 108c12d3ec5a3a441b0865596e168918ce8e48b9 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Wed, 15 Dec 2021 19:31:39 -0500 Subject: [PATCH 47/52] widpedom: Save lastUpdated as a unix timestamp Fixes #961 --- apps/widpedom/widget.js | 2 +- core | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/widpedom/widget.js b/apps/widpedom/widget.js index 3c861cf54..0ec0780c9 100644 --- a/apps/widpedom/widget.js +++ b/apps/widpedom/widget.js @@ -53,7 +53,7 @@ E.on('kill', () => { if (!settings) { loadSettings() } let d = { - lastUpdate : lastUpdate.toISOString(), + lastUpdate : lastUpdate.valueOf(), stepsToday : stp_today, settings : settings, }; diff --git a/core b/core index 2a8e872ec..b033af017 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 2a8e872ecb143a10e53273b4d3473164e104e1d3 +Subproject commit b033af017f6789a6a7777e6ef1428d94995a9b8b From 029bfd2bc5f0dde466dc8e0a0294d3f3e2ad98cc Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 01:32:38 +0100 Subject: [PATCH 48/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 354067f70..d1e1947a1 100644 --- a/apps.json +++ b/apps.json @@ -4977,7 +4977,7 @@ "name": "simple image viewer", "shortName":"showImage", "version":"0.1", - "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.", + "description": "Displays the image in \"showimage.user.img\". The file has to be uploaded via the espruino IDE. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.", "icon": "app.png", "tags": "tool", "supports" : ["BANGLEJS2"], From f044f36aaa793a853a22702c9ac93b2aa2771f06 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Thu, 16 Dec 2021 01:49:02 +0100 Subject: [PATCH 49/52] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index d1e1947a1..50019d877 100644 --- a/apps.json +++ b/apps.json @@ -4976,7 +4976,7 @@ "id": "showimg", "name": "simple image viewer", "shortName":"showImage", - "version":"0.1", + "version":"0.2", "description": "Displays the image in \"showimage.user.img\". The file has to be uploaded via the espruino IDE. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.", "icon": "app.png", "tags": "tool", From c9fd252ec96983837970e26a5704af01dff86c17 Mon Sep 17 00:00:00 2001 From: Ben Whittaker Date: Wed, 15 Dec 2021 19:53:39 -0500 Subject: [PATCH 50/52] widpedom: update changelog --- apps.json | 2 +- apps/widpedom/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c379a1de4..ae91d7995 100644 --- a/apps.json +++ b/apps.json @@ -1590,7 +1590,7 @@ { "id": "widpedom", "name": "Pedometer widget", - "version": "0.19", + "version": "0.20", "description": "Daily pedometer widget", "icon": "widget.png", "type": "widget", diff --git a/apps/widpedom/ChangeLog b/apps/widpedom/ChangeLog index 2f36c7647..c033ea505 100644 --- a/apps/widpedom/ChangeLog +++ b/apps/widpedom/ChangeLog @@ -19,3 +19,4 @@ Stop goal drawing outside widget area Fix issue with widget overwrite in large font mode Memory usage enhancements +0.20: Fix issue where step count would randomly reset From 49136a1ca7c4a3290c3e75424f9cb3515a7fd514 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 16 Dec 2021 08:06:53 +0100 Subject: [PATCH 51/52] Initial version of circles clock --- apps.json | 25 +++- apps/circlesclock/Changelog | 1 + apps/circlesclock/README.md | 19 +++ apps/circlesclock/app-icon.js | 1 + apps/circlesclock/app.js | 218 +++++++++++++++++++++++++++++++ apps/circlesclock/app.png | Bin 0 -> 3576 bytes apps/circlesclock/screenshot.png | Bin 0 -> 3576 bytes apps/circlesclock/settings.js | 33 +++++ 8 files changed, 295 insertions(+), 2 deletions(-) create mode 100644 apps/circlesclock/Changelog create mode 100644 apps/circlesclock/README.md create mode 100644 apps/circlesclock/app-icon.js create mode 100644 apps/circlesclock/app.js create mode 100644 apps/circlesclock/app.png create mode 100644 apps/circlesclock/screenshot.png create mode 100644 apps/circlesclock/settings.js diff --git a/apps.json b/apps.json index c379a1de4..e0bab5917 100644 --- a/apps.json +++ b/apps.json @@ -4981,7 +4981,7 @@ "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push. I use it to display my vaccination certificate.", "icon": "app.png", "tags": "tool", - "supports" : ["BANGLEJS2"], + "supports" : ["BANGLEJS2"], "storage": [ {"name":"showimg.app.js","url":"app.js"}, {"name":"showimg.img","url":"app-icon.js","evaluate":true} @@ -5003,5 +5003,26 @@ {"name":"lapcounter.app.js","url":"app.js"}, {"name":"lapcounter.img","url":"app-icon.js","evaluate":true} ] - } + }, + { "id": "circlesclock", + "name": "Circles clock", + "shortName":"Circles clock", + "version":"0.01", + "description": "A clock with circles for different data at the bottom in a probably familiar style", + "icon": "app.png", + "dependencies": {"widpedom":"app"}, + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator":true, + "readme": "README.md", + "storage": [ + {"name":"circlesclock.app.js","url":"app.js"}, + {"name":"circlesclock.img","url":"app-icon.js","evaluate":true}, + {"name":"circlesclock.settings.js","url":"settings.js"} + ], + "data": [ + {"name":"circlesclock.json"} + ] + } ] diff --git a/apps/circlesclock/Changelog b/apps/circlesclock/Changelog new file mode 100644 index 000000000..af119ab59 --- /dev/null +++ b/apps/circlesclock/Changelog @@ -0,0 +1 @@ +0.01: New clock diff --git a/apps/circlesclock/README.md b/apps/circlesclock/README.md new file mode 100644 index 000000000..87edd5981 --- /dev/null +++ b/apps/circlesclock/README.md @@ -0,0 +1,19 @@ +# Circles clock + +A clock with circles for different data at the bottom in a probably familiar style + +It shows besides time, date and day of week the following information: + * Steps (requires [pedometer widget](https://banglejs.com/apps/#pedometer)) + * Heart rate (when screen is on and unlocked) + * Battery + +## Screenshot + +![Screenshot](screenshot.png) + +## TODO +* Show weather information + + +## Creator +Marco ([myxor](https://github.com/myxor)) diff --git a/apps/circlesclock/app-icon.js b/apps/circlesclock/app-icon.js new file mode 100644 index 000000000..ad727251a --- /dev/null +++ b/apps/circlesclock/app-icon.js @@ -0,0 +1 @@ + require("heatshrink").decompress(atob("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")) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js new file mode 100644 index 000000000..8474b7f4e --- /dev/null +++ b/apps/circlesclock/app.js @@ -0,0 +1,218 @@ +const locale = require("locale"); +const heatshrink = require("heatshrink"); + +var shoesIcon = heatshrink.decompress(atob("h0OwYJGgmAAgUBkgECgVJB4cSoAUDyEBkARDpADBhMAyQRBgVAkgmDhIUDAAuQAgY1DAAYA=")); +var heartIcon = heatshrink.decompress(atob("h0OwYOLkmQhMkgACByVJgESpIFBpEEBAIFBCgIFCCgsABwcAgQOCAAMSpAwDyBNM")); +var powerIcon = heatshrink.decompress(atob("h0OwYQNsAED7AEDmwEDtu2AgUbtuABwXbBIUN23AAoYOCgEDFIgODABI")); + +const SETTINGS_FILE = "circlesclock.json"; +let settings; + +function loadSettings() { + settings = require("Storage").readJSON(SETTINGS_FILE, 1) || { + 'maxHR': 200, + 'stepGoal': 10000 + }; +} + +const colorFg = '#fff'; +const colorBg = '#000'; +const colorGrey = '#808080'; + +let hrtValue; + +const h = g.getHeight(); +const w = g.getWidth(); +const hOffset = 30; +const h1 = Math.round(1 * h / 5 - hOffset); +const h2 = Math.round(3 * h / 5 - hOffset); +const h3 = Math.round(8 * h / 8 - hOffset); +const w1 = Math.round(w / 6); +const w2 = Math.round(3 * w / 6); +const w3 = Math.round(5 * w / 6); +const radiusOuter = 22; +const radiusInner = 16; + +function draw() { + g.reset(); + g.setColor(colorBg); + g.fillRect(0, 0, w, h); + + // time + g.setFont("Vector:50"); + g.setFontAlign(-1, -1); + g.setColor(colorFg); + g.drawString(locale.time(new Date(), 1), w / 10, h1 + 8); + + // date & dow + g.setFont("Vector:20"); + g.setFontAlign(-1, 0); + g.drawString(locale.date(new Date()), w / 10, h2); + g.drawString(locale.dow(new Date()), w / 10, h2 + 22); + + // Steps circle + drawSteps(); + + // Heart circle + drawHeartRate(); + + // Battery circle + drawBattery(); +} + + + +function drawSteps() { + const steps = getSteps(); + const blue = '#0000ff'; + g.setColor(colorGrey); + g.fillCircle(w1, h3, radiusOuter); + + const stepGoal = settings.stepGoal; + if (stepGoal > 0) { + let percent = steps / stepGoal; + if (stepGoal < steps) percent = 1; + drawGauge(w1, h3, percent, blue); + } + + g.setColor(colorBg); + g.fillCircle(w1, h3, radiusInner); + + g.fillPoly([w1, h3, w1 - 15, h3 + radiusOuter + 5, w1 + 15, h3 + radiusOuter + 5]); + + g.setFont("Vector:12"); + g.setFontAlign(0, 0); + g.setColor(colorFg); + g.drawString(shortValue(steps), w1 + 2, h3); + + g.drawImage(shoesIcon, w1 - 6, h3 + radiusOuter - 6); +} + +function drawHeartRate() { + const red = '#ff0000'; + g.setColor(colorGrey); + g.fillCircle(w2, h3, radiusOuter); + + if (hrtValue != undefined) { + const percent = hrtValue / settings.maxHR; + drawGauge(w2, h3, percent, red); + } + + g.setColor(colorBg); + g.fillCircle(w2, h3, radiusInner); + + g.fillPoly([w2, h3, w2 - 15, h3 + radiusOuter + 5, w2 + 15, h3 + radiusOuter + 5]); + + g.setFont("Vector:12"); + g.setFontAlign(0, 0); + g.setColor(colorFg); + g.drawString(hrtValue != undefined ? hrtValue : 0, w2, h3); + + g.drawImage(heartIcon, w2 - 6, h3 + radiusOuter - 6); +} + +function drawBattery() { + const battery = E.getBattery(); + const yellow = '#ffff00'; + g.setColor(colorGrey); + g.fillCircle(w3, h3, radiusOuter); + + if (battery > 0) { + const percent = battery / 100; + drawGauge(w3, h3, percent, yellow); + } + + g.setColor(colorBg); + g.fillCircle(w3, h3, radiusInner); + + g.fillPoly([w3, h3, w3 - 15, h3 + radiusOuter + 5, w3 + 15, h3 + radiusOuter + 5]); + + g.setFont("Vector:12"); + g.setFontAlign(0, 0); + g.setColor(colorFg); + g.drawString(battery + '%', w3, h3); + + g.drawImage(powerIcon, w3 - 6, h3 + radiusOuter - 6); +} + +function radians(a) { + return a * Math.PI / 180; +} + + +function drawGauge(cx, cy, percent, color) { + let offset = 30; + let end = 300; + var i = 0; + var r = radiusInner + 3; + + if (percent > 1) percent = 1; + + var startrot = -offset; + var endrot = startrot - ((end - offset) * percent); + + g.setColor(color); + + // draw gauge + for (i = startrot; i > endrot; i -= 4) { + x = cx + r * Math.sin(radians(i)); + y = cy + r * Math.cos(radians(i)); + g.fillCircle(x, y, 4); + } +} + +function shortValue(v) { + if (isNaN(v)) return '-'; + if (v <= 999) return v; + if (v >= 1000 && v < 10000) { + v = Math.floor(v / 100) * 100; + return (v / 1000).toFixed(1).replace(/\.0$/, '') + 'k'; + } + if (v >= 10000) { + v = Math.floor(v / 1000) * 1000; + return (v / 1000).toFixed(1).replace(/\.0$/, '') + 'k'; + } +} + +function getSteps() { + if (WIDGETS.wpedom !== undefined) { + return WIDGETS.wpedom.getSteps(); + } + return 0; +} + +Bangle.on('lock', function(isLocked) { + if (!isLocked) { + Bangle.setHRMPower(1, "watch"); + } else { + Bangle.setHRMPower(0, "watch"); + } + drawHeartRate(); + drawSteps(); +}); + +Bangle.on('HRM', function(hrm) { + //if(hrm.confidence > 90){ + hrtValue = hrm.bpm; + if (Bangle.isLCDOn()) + drawHeartRate(); + //} else { + // hrtValue = undefined; + //} +}); + +g.clear(); +Bangle.loadWidgets(); +/* + * we are not drawing the widgets as we are taking over the whole screen + * so we will blank out the draw() functions of each widget and change the + * area to the top bar doesn't get cleared. + */ +for (let wd of WIDGETS) { + wd.draw = () => {}; + wd.area = ""; +} +loadSettings(); +setInterval(draw, 60000); +draw(); +Bangle.setUI("clock"); diff --git a/apps/circlesclock/app.png b/apps/circlesclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..94ff885faba99f8be0bed9a3dc9c3523e32de816 GIT binary patch literal 3576 zcmai1`8U*!|9#Jxu~$r~&|_)r+sKwI>6v6-vJZ-}W*uZ{?1Pl-lqF&kW62DIv4*Dd z3`u-U*0Ie)Sz}};)yL-#_@3|UoY%eQb{L~x&=hr@K+cM6Jy>ftR2-YD43GO(s!!^ zYbk+50Q5OE_RC@B=foDLmy1LeU`)uxMIZf?D$vD26=kx0NvU#5%`=}EdJ!r7a?oXv z|FZZLNJqZ&agzuD_aA_SfRCG(_&rv(#LTkgzQt<6$}hyg19ui}a)*+B%!zMCxU`oR zwD*7cQ$%~8W{tMc0Ti*KkIhJMVOj!uEF#J`+K81Q$% zaRgRMb8^?8zd;*uCl8q86bIRdnlJi4kIqZBb@hkt6|$NQ$b|ZDt;-2k!Ix`=&L)L_ zP+pSrZ5d>NHX<`gAOjK8NIN*YiMPU=m5M4s)pu`Vp&L+T9tmw1wkyt(!*?3ioO%(i z3A$)9v8=`?f4fZgDvt$tzAlY^I`uC^J~tZ?th>B>u45rNrn&YX%jsvGEo^0cA=9Ty6 zWJ{bAjo&<>Y*%2*Go`7Z=NZ*;X6h8APl;$YeKpqveoIgj&Y?2ulg~F}z8*^OscWRO zv#bR)VU2ywrecvV5TLPuVU8tip@<{@^AW7?kB8Wv)i-9)mYo<*l*OaA#esvy3UOl^l6DhikKA7E`7G znti_*eoN~AG*$3WhY`>AjsDoNZOQ$6S5<{$_+8ypXlH?e#F^#7VBF9RgLCmT+6}QT zo7&Njb;7#8`%XQ*a88pIG6P%(j~A^ecCafoPNIVUGcg$s@7>4t3Vlvf8x&w_zbt1l zqo;y@#|M@-Gk9B|?Lr^wrlLEaUEpf$TPOnxAbIo5lNa88Me;& zkERbXVV~UqZzh`d>Pg#Pj5YLn=6*+q4ro*Np4FjuXHCXBIGE>j<(xasFBdK-xmz+D z8%HXNvO`mxOe2TCGW-Y0KmpnZ^mVw%$Y2-JX7{fy;9VzX?b3-JA#Tf1&63?{ez12G zKKf!KMv6;Go=QKOL{6)Sy&DH_JS;O5$R2cq8ZuBaD2C>LcF!^)DEHl=5O$?g)PWRsX5j4MSDG(j%?gTHzts6QjSpSfSa4KF<+acnW} zRhPH9{lbjPXnCi>K@s;AKoKSq?Pg#zDc(a2Cn%fqRpll~!ES-^W2`oR94}^|v~JBS>BG_^Oh-Mf(>Ol~m<331 zd^s)3&a`ItXPtqw1e)qyRDuePE$I3ybU${(L8b^s5%44P(ueF^aU247!d0bzE3}rLGi&a%vs7;jA=~?ql(q zaVT>O^91|OjCmDD4i2OT&J0LW;#K+BgQcAD2{8eWmXtuWP=V`>wl&*}q>?>|<|Wf( zNaVt!rPZI6zqS#F?R+t_NN=B`z3dxOPHOU-`rcmEk!K5d74j2^)HK14;ujF?)!qwV ziUEZ8GUh&vIdjR?EC}3LSoY?lG44TV%#|*#P4`C|QqrK=&p-azk^28kTwv7C)F1p7 zaT!Gk@lMWfA+eB&HBPeCOshXgPMbfZGdnKsNMdWw!tJ?*M{-NVeMDgiu$Q?1O#4ia z0;TzfRDYtB;k%#fjY*$R1JNI%W2$F=+Q?cqB^_HK)}ZTs$|vOoZ2+O;gX2?<5+10f zl>Zy+6od$7jozHHmH}lx+z*0w-z--uNqusQ;8|ar?80B?+i$b!^tu7eL}BOLf7>&q z#V~SrdFQMC9YvafiOCmM#)g``u+ewC#R&o_1eHE}PhZ`&5XH_uFV`lG#*N(w(XG@! z2b>T_)T-4}(qi6X5?5qAdHO;RL$h=wvS$EHqlOQ0g(~gnprHnev97dsbADX3 z%(~SRew+k0+fP0tXFl7#ke#ViX)+lRn9Yz*8g z{IJe0Ck{#;C*+`}=&S2<2^`*bwc8Qe08=(AbL-8&I{s5&lu=Ly*1K2xrUqGww-F*c zR)O12u_oDUB@Rak48tYo?zC@Q4Ug$XH26o7hjrc-23~RgmF;&mMqOy#TZzVB#rV3( zgI^y&g8~=pjjOWhK^+tzCeiBXBL`Qi-Y*9a@GD#T!G`>t{7moVh7Qaa4HNjzdAq)n zbZ$F5!1QXl!z5Cy<#+dS9!uw&slK@k+&ZzsE`gu0pMg!Lgqx+VIp|tPBm1HgLrOx2^GgKXzwcSppx3{x*^Ap;HsigCX0?U)vJI7R7 z_#Bjn2&kt7zkxzVx6XLh7-nxcx-d73*h(B!0!$0U0uckLq!zdVjv&%j>6*Bwvq9MI z8rH;-7;3XBQKB4eVZO+8FMX3WNBQ7As@}eK@0`=snDGTkSCs1;AbscYuy%8#WB6-o z^Yw;GR|X1hht6oJt$Lt56=-p|t!@(f9@JeFJQqvoPoAzR)vfAvL04~+wfoia`DFM6}411$jVuFs39P!5*Tk3KK^)RM`;;n5_ zl}vtFDDy{&=E^0;f_h0&zA5-1HhIKgRW)lj+yv*CW9?_iKGAho=;$tI=f19P2@L(f z2KpYaV6sshj>f5XbL&~Fc?WK3?B=zB#P=|wahN`aJKhhj)@{K-HmDdurgM`kFaPbt zL45Dz`d3_a(;QUe_2pQH%6G5HV{p#ng+i3{-37ujUIZ^`qLwkhuq*} z-kw~e^$#&M$b{~WczHv*{6C~?nYQk%2qgXEfeA2u!QC=P&f}f2ODj3oMfuVwxs=aT zOAtFGFYXlFotwnF-(Ux;y`NS%V!HB0Yc96>#l?F2_cjQ}1k0SF{no*2m!@;Fay>sC z&)Pm6+@)A>xg)S|x$Ykc>Pb?YBVIw51fqE7`OUoYW?T1aD0{58L9fZ8k_8$`->@|> z)lHFY!jIB!AwbD)L8ve#_8X;1H|HN6U!_K9g8Yv)wNW!cy&re!IFYxB3ZO$9ySezA zwCKZCVAHX@;&tjoR^@(s$YbuXViPM9!KaIcqK24N_%fh+*wi92&|c@E4Zg!2lJWYumOH_M2w|-W-I?ezk_T1RY7teb`+l{o4AT4Z z#d15WBo3drKN=)jEZslwcC7_)>9v+ETa$^^?&POFs2KMbw@6k`aY%YlUfdQJ9`{U@ zG%nVx8f`x>(#6^}Ky}PRx5$HMQ=D?g91hA~#C~4{*)NH-jUkCKZo6dJ@oF!o8}3Wt d08WwZ51V4}M)R57;s5=1fblI0{W>H%@xRtAyzu}4 literal 0 HcmV?d00001 diff --git a/apps/circlesclock/screenshot.png b/apps/circlesclock/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..94ff885faba99f8be0bed9a3dc9c3523e32de816 GIT binary patch literal 3576 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 literal 0 HcmV?d00001 diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js new file mode 100644 index 000000000..2de278b47 --- /dev/null +++ b/apps/circlesclock/settings.js @@ -0,0 +1,33 @@ +(function(back) { + const SETTINGS_FILE = "circlesclock.json"; + const storage = require('Storage'); + let settings = storage.readJSON(SETTINGS_FILE, 1) || {}; + function save(key, value) { + settings[key] = value; + storage.write(SETTINGS_FILE, settings); + } + E.showMenu({ + '': { 'title': 'circlesclock' }, + 'max heartrate': { + value: "maxHR" in settings ? settings.maxHR : 200, + min: 20, + max : 250, + step: 10, + format: x => { + return x; + }, + onchange: x => save('maxHR', x), + }, + 'step goal': { + value: "stepGoal" in settings ? settings.stepGoal : 10000, + min: 2000, + max : 50000, + step: 2000, + format: x => { + return x; + }, + onchange: x => save('stepGoal', x), + }, + '< Back': back, + }); +}); From 8fd06d710b68131363ebeabae61340c6a7f2b694 Mon Sep 17 00:00:00 2001 From: Marco H Date: Thu, 16 Dec 2021 08:46:49 +0100 Subject: [PATCH 52/52] Fix missing app.js defintion of clicompleteclock --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index c379a1de4..3f1b9ac60 100644 --- a/apps.json +++ b/apps.json @@ -4918,6 +4918,7 @@ "supports" : ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", "storage": [ + {"name":"clicompleteclk.app.js","url":"app.js"}, {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true}, {"name":"clicompleteclk.settings.js","url":"settings.js"} ],