From 96a6dee94c72b4a716d70808d362716ad9ef3c3d Mon Sep 17 00:00:00 2001 From: nujw Date: Fri, 29 Oct 2021 16:14:40 +1300 Subject: [PATCH 01/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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/94] 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 7fe88fd02c7b3c3ab383960c59d71140e7e6a7fa Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Thu, 9 Dec 2021 22:26:48 -0500 Subject: [PATCH 30/94] Added temperature and heart rate service advertising --- apps/sensible/sensible.js | 45 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index 45852adab..71e2dabb9 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -7,6 +7,12 @@ // Non-user-configurable constants const APP_ID = 'sensible'; const ESPRUINO_COMPANY_CODE = 0x0590; +const DEFAULT_ADVERTISING_OPTIONS = { + showName: false, + manufacturer: ESPRUINO_COMPANY_CODE, + manufacturerData: JSON.stringify({ name: APP_ID }), + interval: 2000 +}; // Global variables @@ -20,6 +26,12 @@ let isBarEnabled = true; let isGpsEnabled = true; let isHrmEnabled = true; let isMagEnabled = true; +let isNewAccData = false; +let isNewBarData = false; +let isNewGpsData = false; +let isNewHrmData = false; +let isNewMagData = false; + // Menus @@ -104,9 +116,33 @@ function transmitAppName() { } +// Check for new sensor data and update the advertising sequence +function transmitUpdatedSensorData() { + let data = []; + + if(isNewBarData) { + let encT = Math.round(bar.temperature * 100); // TODO: signed int16 + data.push({ 0x2a6e: [ encT & 0xff, (encT >> 8) & 0xff ] }); + isNewBarData = false; + } + + if(isNewHrmData) { + data.push({ 0x2a37: [ 0, hrm.bpm ] }); + isNewHrmData = false; + } + + if(data.length === 0) { + return NRF.setAdvertising({}, DEFAULT_ADVERTISING_OPTIONS); + } + + NRF.setAdvertising(data, { showName: false, interval: 200 }); +} + + // Update acceleration Bangle.on('accel', function(newAcc) { acc = newAcc; + isNewAccData = true; if(isAccMenu) { accMenu.x.value = acc.x.toFixed(2); @@ -119,6 +155,7 @@ Bangle.on('accel', function(newAcc) { // Update barometer Bangle.on('pressure', function(newBar) { bar = newBar; + isNewBarData = true; if(isBarMenu) { barMenu.Altitude.value = bar.altitude.toFixed(1) + 'm'; @@ -131,6 +168,7 @@ Bangle.on('pressure', function(newBar) { // Update GPS Bangle.on('GPS', function(newGps) { gps = newGps; + isNewGpsData = true; if(isGpsMenu) { gpsMenu.Lat.value = gps.lat.toFixed(4); @@ -145,6 +183,7 @@ Bangle.on('GPS', function(newGps) { // Update heart rate monitor Bangle.on('HRM', function(newHrm) { hrm = newHrm; + isNewHrmData = true; if(isHrmMenu) { hrmMenu.BPM.value = hrm.bpm; @@ -156,6 +195,7 @@ Bangle.on('HRM', function(newHrm) { // Update magnetometer Bangle.on('mag', function(newMag) { mag = newMag; + isNewMagData = true; if(isMagMenu) { magMenu.x.value = mag.x; @@ -169,9 +209,10 @@ Bangle.on('mag', function(newMag) { // On start: enable sensors and display main menu g.clear(); -transmitAppName(); +NRF.setAdvertising({}, DEFAULT_ADVERTISING_OPTIONS); Bangle.setBarometerPower(isBarEnabled, APP_ID); Bangle.setGPSPower(isGpsEnabled, APP_ID); Bangle.setHRMPower(isHrmEnabled, APP_ID); Bangle.setCompassPower(isMagEnabled, APP_ID); -E.showMenu(mainMenu); \ No newline at end of file +E.showMenu(mainMenu); +setInterval(transmitUpdatedSensorData, 1000); \ No newline at end of file From 57f6b2a8bb7574541219855a6a575cd635538eb0 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 10 Dec 2021 11:36:32 -0500 Subject: [PATCH 31/94] Removed superfluous function, moved temperature encoding to function --- apps/sensible/sensible.js | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index 71e2dabb9..e604ccf1a 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -103,26 +103,12 @@ let magMenu = { }; -// Transmit the app name under the Espruino company code to facilitate discovery -function transmitAppName() { - let options = { - showName: false, - manufacturer: ESPRUINO_COMPANY_CODE, - manufacturerData: JSON.stringify({ name: APP_ID }), - interval: 2000 - } - - NRF.setAdvertising({}, options); -} - - // Check for new sensor data and update the advertising sequence function transmitUpdatedSensorData() { let data = []; if(isNewBarData) { - let encT = Math.round(bar.temperature * 100); // TODO: signed int16 - data.push({ 0x2a6e: [ encT & 0xff, (encT >> 8) & 0xff ] }); + data.push({ 0x2a6e: encodeTemperature(bar.temperature) }); isNewBarData = false; } @@ -139,6 +125,14 @@ function transmitUpdatedSensorData() { } +// Convert temperature to signed 16-bit integer byte array +// TODO: implement negative temperature as signed int +function encodeTemperature(temperature) { + return [ Math.round(bar.temperature * 100) & 0xff, + (Math.round(bar.temperature * 100) >> 8) & 0xff ]; +} + + // Update acceleration Bangle.on('accel', function(newAcc) { acc = newAcc; From 04af6b9a887865c62cb6d8f4c8f3d8cf03221d69 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 10 Dec 2021 11:55:50 -0500 Subject: [PATCH 32/94] Always advertise app name among data frames --- apps/sensible/sensible.js | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index e604ccf1a..91bbeaa02 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -7,12 +7,9 @@ // Non-user-configurable constants const APP_ID = 'sensible'; const ESPRUINO_COMPANY_CODE = 0x0590; -const DEFAULT_ADVERTISING_OPTIONS = { - showName: false, - manufacturer: ESPRUINO_COMPANY_CODE, - manufacturerData: JSON.stringify({ name: APP_ID }), - interval: 2000 -}; +const APP_ADVERTISING_DATA = [ 0x16, 0xff, 0x90, 0x05, 0x7b, 0x22, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x73, 0x65, 0x6e, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x7d ]; // Global variables @@ -105,7 +102,7 @@ let magMenu = { // Check for new sensor data and update the advertising sequence function transmitUpdatedSensorData() { - let data = []; + let data = [ APP_ADVERTISING_DATA ]; // Always advertise at least app name if(isNewBarData) { data.push({ 0x2a6e: encodeTemperature(bar.temperature) }); @@ -117,10 +114,6 @@ function transmitUpdatedSensorData() { isNewHrmData = false; } - if(data.length === 0) { - return NRF.setAdvertising({}, DEFAULT_ADVERTISING_OPTIONS); - } - NRF.setAdvertising(data, { showName: false, interval: 200 }); } @@ -203,7 +196,6 @@ Bangle.on('mag', function(newMag) { // On start: enable sensors and display main menu g.clear(); -NRF.setAdvertising({}, DEFAULT_ADVERTISING_OPTIONS); Bangle.setBarometerPower(isBarEnabled, APP_ID); Bangle.setGPSPower(isGpsEnabled, APP_ID); Bangle.setHRMPower(isHrmEnabled, APP_ID); From fe78e5045b012706a19479e73d6ea09555adfa6e Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 10 Dec 2021 14:59:26 -0500 Subject: [PATCH 33/94] Removed needless spaces --- apps/sensible/sensible.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index 91bbeaa02..e6d790c14 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -7,9 +7,9 @@ // Non-user-configurable constants const APP_ID = 'sensible'; const ESPRUINO_COMPANY_CODE = 0x0590; -const APP_ADVERTISING_DATA = [ 0x16, 0xff, 0x90, 0x05, 0x7b, 0x22, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x73, 0x65, 0x6e, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x7d ]; +const APP_ADVERTISING_DATA = [ 0x16, 0xff, 0x90, 0x05, 0x7b, 0x6e, 0x61, 0x6d, + 0x65, 0x3a, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x7d ]; // Global variables From 67635f1bdaad7b7b81fe5f7175e4dadb605a2c8a Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Tue, 14 Dec 2021 11:14:42 +0100 Subject: [PATCH 34/94] Update for Bangle 2 --- apps.json | 9 +++++---- apps/rtorch/ChangeLog | 1 + apps/rtorch/app.js | 31 ++++++++++++++++++++++++------- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/apps.json b/apps.json index 699defbcf..2149f15cb 100644 --- a/apps.json +++ b/apps.json @@ -1698,14 +1698,15 @@ "id": "rtorch", "name": "Red Torch", "shortName": "RedTorch", - "version": "0.01", - "description": "Turns screen RED to help you see in the dark without breaking your night vision. Select from the launcher or press BTN3,BTN1,BTN3,BTN1 quickly to start when in any app that shows widgets", + "version": "0.02", + "description": "Turns screen RED to help you see in the dark without breaking your night vision. Select from the launcher or on Bangle 1 press BTN3,BTN1,BTN3,BTN1 quickly to start when in any app that shows widgets", "icon": "app.png", "tags": "tool,torch", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, "storage": [ {"name":"rtorch.app.js","url":"app.js"}, - {"name":"rtorch.wid.js","url":"widget.js"}, + {"name":"rtorch.wid.js","url":"widget.js", "supports": ["BANGLEJS"]}, {"name":"rtorch.img","url":"app-icon.js","evaluate":true} ] }, diff --git a/apps/rtorch/ChangeLog b/apps/rtorch/ChangeLog index 06f10fe08..13cbb6e72 100644 --- a/apps/rtorch/ChangeLog +++ b/apps/rtorch/ChangeLog @@ -1 +1,2 @@ 0.01: Cloning torch and making it red :D +0.02: Modify for setUI and Bangle 2 diff --git a/apps/rtorch/app.js b/apps/rtorch/app.js index 4f6b1d6f7..03a50ee10 100644 --- a/apps/rtorch/app.js +++ b/apps/rtorch/app.js @@ -2,21 +2,38 @@ Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); g.reset(); c = 1; + function setColor(delta){ c+=delta; c = Math.max(c,0); c = Math.min(c,2); if (c<1){ g.setColor(c,0,0); + Bangle.setLCDBrightness(c >= 0.1 ? c : 0.1); }else{ g.setColor(1,c-1,c-1); + Bangle.setLCDBrightness(1); } g.fillRect(0,0,g.getWidth(),g.getHeight()); } -setColor(0) -// BTN1 light up toward white -// BTN3 light down to red -// BTN2 to reset -setWatch(()=>setColor(0.1), BTN1, { repeat:true, edge:"rising", debounce: 50 }); -setWatch(()=>load(), BTN2); -setWatch(()=>setColor(-0.1), BTN3, { repeat:true, edge:"rising", debounce: 50 }); + +function updownHandler(direction){ + if (direction == undefined){ + c=1; + setColor(0); + } else { + setColor(-direction * 0.1); + } +} + +setColor(0); + +// Bangle 1: +// BTN1: light up toward white +// BTN3: light down to red +// BTN2: reset +// Bangle 2: +// Swipe up: light up toward white +// Swipe down: light down to red +// BTN1: reset +Bangle.setUI("updown", updownHandler); From 0fa290be68646223930440b5bbfef71ba581f88c Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Tue, 14 Dec 2021 16:57:59 -0500 Subject: [PATCH 35/94] Encode all barometer service data in a single function --- apps/sensible/sensible.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index e6d790c14..f7644e77a 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -105,7 +105,7 @@ function transmitUpdatedSensorData() { let data = [ APP_ADVERTISING_DATA ]; // Always advertise at least app name if(isNewBarData) { - data.push({ 0x2a6e: encodeTemperature(bar.temperature) }); + data.push(encodeBarServiceData()); isNewBarData = false; } @@ -118,11 +118,12 @@ function transmitUpdatedSensorData() { } -// Convert temperature to signed 16-bit integer byte array -// TODO: implement negative temperature as signed int -function encodeTemperature(temperature) { - return [ Math.round(bar.temperature * 100) & 0xff, - (Math.round(bar.temperature * 100) >> 8) & 0xff ]; +// Encode the bar service data to fit in a Bluetooth PDU +function encodeBarServiceData() { + // TODO: implement negative temperature as signed int + let encodedTemperature = [ Math.round(bar.temperature * 100) & 0xff, + (Math.round(bar.temperature * 100) >> 8) & 0xff ]; + return { 0x2a6e: encodedTemperature }; } From 3f5072b8748833eb4ed553e0f4042257977b59b0 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Tue, 14 Dec 2021 16:58:32 -0500 Subject: [PATCH 36/94] Corrected length of app name advertising packet --- apps/sensible/sensible.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index f7644e77a..fb24828fe 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -7,7 +7,7 @@ // Non-user-configurable constants const APP_ID = 'sensible'; const ESPRUINO_COMPANY_CODE = 0x0590; -const APP_ADVERTISING_DATA = [ 0x16, 0xff, 0x90, 0x05, 0x7b, 0x6e, 0x61, 0x6d, +const APP_ADVERTISING_DATA = [ 0x12, 0xff, 0x90, 0x05, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x73, 0x65, 0x6e, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x7d ]; From c0ac05488a2880d53f1475090efd023a7b28f081 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Tue, 14 Dec 2021 17:59:36 -0500 Subject: [PATCH 37/94] Implemented barometer service data --- apps/sensible/sensible.js | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index fb24828fe..3c0667c4b 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -120,10 +120,28 @@ function transmitUpdatedSensorData() { // Encode the bar service data to fit in a Bluetooth PDU function encodeBarServiceData() { - // TODO: implement negative temperature as signed int - let encodedTemperature = [ Math.round(bar.temperature * 100) & 0xff, - (Math.round(bar.temperature * 100) >> 8) & 0xff ]; - return { 0x2a6e: encodedTemperature }; + let tEncoded = Math.round(bar.temperature * 100); + let pEncoded = Math.round(bar.pressure * 100); + let eEncoded = Math.round(bar.altitude * 100); + + if(bar.temperature < 0) { + tEncoded += 0x10000; + } + if(bar.altitude < 0) { + eEncoded += 0x1000000; + } + + let t = [ tEncoded & 0xff, (tEncoded >> 8) & 0xff ]; + let p = [ pEncoded & 0xff, (pEncoded >> 8) & 0xff, (pEncoded >> 16) & 0xff, + (pEncoded >> 24) & 0xff ]; + let e = [ eEncoded & 0xff, (eEncoded >> 8) & 0xff, (eEncoded >> 16) & 0xff ]; + + return [ + 0x02, 0x01, 0x06, // Flags + 0x05, 0x16, 0x6e, 0x2a, t[0], t[1], // Temperature + 0x07, 0x16, 0x6d, 0x2a, p[0], p[1], p[2], p[3], // Pressure + 0x06, 0x16, 0x6c, 0x2a, e[0], e[1], e[2] // Elevation + ]; } From cf9f724d365d769b7a92b16f4cc82266b1571255 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Tue, 14 Dec 2021 20:41:16 -0500 Subject: [PATCH 38/94] Added location and speed service to transmit GPS data --- apps/sensible/sensible.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index 3c0667c4b..16534ff29 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -109,6 +109,11 @@ function transmitUpdatedSensorData() { isNewBarData = false; } + if(isNewGpsData && gps.lat && gps.lon) { + data.push(encodeGpsServiceData()); + isNewGpsData = false; + } + if(isNewHrmData) { data.push({ 0x2a37: [ 0, hrm.bpm ] }); isNewHrmData = false; @@ -145,6 +150,35 @@ function encodeBarServiceData() { } +// Encode the GPS service data using the Location and Speed characteristic +function encodeGpsServiceData() { + let latEncoded = Math.round(gps.lat * 10000000); + let lonEncoded = Math.round(gps.lon * 10000000); + let hEncoded = Math.round(gps.course * 100); + let sEncoded = Math.round(1000 * gps.speed / 36); + + if(gps.lat < 0) { + latEncoded += 0x100000000; + } + if(gps.lon < 0) { + lonEncoded += 0x100000000; + } + + let s = [ sEncoded & 0xff, (sEncoded >> 8) & 0xff ]; + let lat = [ latEncoded & 0xff, (latEncoded >> 8) & 0xff, + (latEncoded >> 16) & 0xff, (latEncoded >> 24) & 0xff ]; + let lon = [ lonEncoded & 0xff, (lonEncoded >> 8) & 0xff, + (lonEncoded >> 16) & 0xff, (lonEncoded >> 24) & 0xff ]; + let h = [ hEncoded & 0xff, (hEncoded >> 8) & 0xff ]; + + return [ + 0x02, 0x01, 0x06, // Flags + 0x11, 0x16, 0x67, 0x2a, 0x95, 0x02, s[0], s[1], lat[0], lat[1], lat[2], + lat[3], lon[0], lon[1], lon[2], lon[3], h[0], h[1] // Location and Speed + ]; +} + + // Update acceleration Bangle.on('accel', function(newAcc) { acc = newAcc; From c4d282b2f29dad71327c2fb3db8ea625f599074b Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Tue, 14 Dec 2021 21:09:18 -0500 Subject: [PATCH 39/94] Implemented magnetic flux density 3D service --- apps/sensible/sensible.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index 16534ff29..3da39998e 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -119,6 +119,11 @@ function transmitUpdatedSensorData() { isNewHrmData = false; } + if(isNewMagData) { + data.push(encodeMagServiceData()); + isNewMagData = false; + } + NRF.setAdvertising(data, { showName: false, interval: 200 }); } @@ -179,6 +184,33 @@ function encodeGpsServiceData() { } +// Encode the mag service data using the magnetic flux density 3D characteristic +function encodeMagServiceData() { + let xEncoded = mag.x; // TODO: units??? + let yEncoded = mag.y; + let zEncoded = mag.z; + + if(xEncoded < 0) { + xEncoded += 0x10000; + } + if(yEncoded < 0) { + yEncoded += 0x10000; + } + if(yEncoded < 0) { + yEncoded += 0x10000; + } + + let x = [ xEncoded & 0xff, (xEncoded >> 8) & 0xff ]; + let y = [ yEncoded & 0xff, (yEncoded >> 8) & 0xff ]; + let z = [ zEncoded & 0xff, (zEncoded >> 8) & 0xff ]; + + return [ + 0x02, 0x01, 0x06, // Flags + 0x09, 0x16, 0xa1, 0x2a, x[0], x[1], y[0], y[1], z[0], z[1] // Mag 3D + ]; +} + + // Update acceleration Bangle.on('accel', function(newAcc) { acc = newAcc; From 8d5107fe42db5cc2e3efbcf6aafdb39dfdeedc3e Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Tue, 14 Dec 2021 21:16:02 -0500 Subject: [PATCH 40/94] Version bump to 0.04 --- apps.json | 2 +- apps/sensible/ChangeLog | 1 + apps/sensible/README.md | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index c1f51f272..682c399c4 100644 --- a/apps.json +++ b/apps.json @@ -4649,7 +4649,7 @@ "id": "sensible", "name": "SensiBLE", "shortName": "SensiBLE", - "version": "0.03", + "version": "0.04", "description": "Collect, display and advertise real-time sensor data.", "icon": "sensible.png", "screenshots": [ diff --git a/apps/sensible/ChangeLog b/apps/sensible/ChangeLog index baa93f297..c50431f51 100644 --- a/apps/sensible/ChangeLog +++ b/apps/sensible/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App! 0.02: Corrected variable initialisation 0.03: Advertise app name, added screenshots +0.04: Advertise bar, GPS, HRM and mag services diff --git a/apps/sensible/README.md b/apps/sensible/README.md index f79b61aea..fcff3b0f9 100644 --- a/apps/sensible/README.md +++ b/apps/sensible/README.md @@ -17,7 +17,7 @@ Currently implements: - Heart Rate Monitor - Magnetometer -in the menu display but NOT YET in Bluetooth Low Energy advertising (which will be implemented in a subsequent version). +in the menu display, and broadcasts all sensor data readings _except_ acceleration in Bluetooth Low Energy advertising packets as GATT characteristic services. ## Controls From 78502e0be2623677fc98e46d5b8221d8bc6ec643 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 09:55:29 +0100 Subject: [PATCH 41/94] Create README.md --- apps/showimg/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/showimg/README.md diff --git a/apps/showimg/README.md b/apps/showimg/README.md new file mode 100644 index 000000000..cb3392c90 --- /dev/null +++ b/apps/showimg/README.md @@ -0,0 +1,2 @@ +Displays an image. I use this app to show my vaccination certificate. +The image is read from the file "showimage.user.img". Returns to watch face after 60s/button push. From 98ebc14e2d27ef643473d213092c3d4d6ed0f9d4 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 09:56:09 +0100 Subject: [PATCH 42/94] Add files via upload --- apps/showimg/showimg.app.js | 16 ++++++++++++++++ apps/showimg/showimg.img | Bin 0 -> 292 bytes 2 files changed, 16 insertions(+) create mode 100644 apps/showimg/showimg.app.js create mode 100644 apps/showimg/showimg.img diff --git a/apps/showimg/showimg.app.js b/apps/showimg/showimg.app.js new file mode 100644 index 000000000..e00385bd7 --- /dev/null +++ b/apps/showimg/showimg.app.js @@ -0,0 +1,16 @@ +g.reset(); +g.clear(); +g.drawImage(require("Storage").read("showimg.user.img"),0,0); +drawTimeout = setTimeout(function() { + load(); +}, 60000); +setWatch(function() { + load(); +}, BTN, { repeat:false, edge:'falling' }); +var savedOptions=Bangle.getOptions(); +Bangle.setLCDBrightness(1); +var newOptions={ + lockTimeout:60000, + backlightTimeout:60000 +}; +Bangle.setOptions(newOptions); diff --git a/apps/showimg/showimg.img b/apps/showimg/showimg.img new file mode 100644 index 0000000000000000000000000000000000000000..24c9245ca6d4f7b60802318a19fbbf054828462f GIT binary patch literal 292 zcmZwCu?oUK3?L0%Bjo!QsFM@DV(4aP&$CPbkLZ z6en-^NPYsBl;sNkzr=zfB0FWs7Ew(AiPepWFpB2UxsgPNpNgc;SjP_07jWH+Dw Date: Wed, 15 Dec 2021 09:56:54 +0100 Subject: [PATCH 43/94] Update README.md --- apps/showimg/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/showimg/README.md b/apps/showimg/README.md index cb3392c90..9d7c0067a 100644 --- a/apps/showimg/README.md +++ b/apps/showimg/README.md @@ -1,2 +1,3 @@ Displays an image. I use this app to show my vaccination certificate. -The image is read from the file "showimage.user.img". Returns to watch face after 60s/button push. +The image is read from the file "showimage.user.img". +Returns to watch face after 60s/button push. From 84f7d0467f3144e9e47aaa586723c9756b3d343f Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:09:06 +0100 Subject: [PATCH 44/94] Add files via upload --- apps/showimg/app.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 apps/showimg/app.js diff --git a/apps/showimg/app.js b/apps/showimg/app.js new file mode 100644 index 000000000..e00385bd7 --- /dev/null +++ b/apps/showimg/app.js @@ -0,0 +1,16 @@ +g.reset(); +g.clear(); +g.drawImage(require("Storage").read("showimg.user.img"),0,0); +drawTimeout = setTimeout(function() { + load(); +}, 60000); +setWatch(function() { + load(); +}, BTN, { repeat:false, edge:'falling' }); +var savedOptions=Bangle.getOptions(); +Bangle.setLCDBrightness(1); +var newOptions={ + lockTimeout:60000, + backlightTimeout:60000 +}; +Bangle.setOptions(newOptions); From 25e1fc5f28e25e42a0024d92684c793ebdecdbc3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 15 Dec 2021 09:09:27 +0000 Subject: [PATCH 45/94] messages 0.13: Add /*LANG*/ comments for internationalisation + Add 'Delete All' option to message options + Now update correctly when 'require("messages").clearAll()' is called --- apps.json | 2 +- apps/messages/ChangeLog | 4 +++- apps/messages/app.js | 30 +++++++++++++++++++----------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/apps.json b/apps.json index c1f51f272..0d8ddd613 100644 --- a/apps.json +++ b/apps.json @@ -77,7 +77,7 @@ { "id": "messages", "name": "Messages", - "version": "0.12", + "version": "0.13", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 6109daf7a..16d0010cc 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -17,4 +17,6 @@ 0.12: Extra app-specific notification icons New animated notifcationicon (instead of large blinking 'MESSAGES') Added screenshots - +0.13: Add /*LANG*/ comments for internationalisation + Add 'Delete All' option to message options + Now update correctly when 'require("messages").clearAll()' is called diff --git a/apps/messages/app.js b/apps/messages/app.js index 965c50b85..79009e77e 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -52,11 +52,11 @@ var MESSAGES = require("Storage").readJSON("messages.json",1)||[]; if (!Array.isArray(MESSAGES)) MESSAGES=[]; var onMessagesModified = function(msg) { // TODO: if new, show this new one - if (msg.new) { + if (msg && msg.new) { if (WIDGETS["messages"]) WIDGETS["messages"].buzz(); else Bangle.buzz(); } - showMessage(msg.id); + showMessage(msg&&msg.id); }; function saveMessages() { require("Storage").writeJSON("messages.json",MESSAGES) @@ -174,24 +174,33 @@ function showMusicMessage(msg) { } function showMessageSettings(msg) { - E.showMenu({"":{"title":"Message"}, + E.showMenu({"":{"title":/*LANG*/"Message"}, "< Back" : () => showMessage(msg.id), - "Delete" : () => { + /*LANG*/"Delete" : () => { MESSAGES = MESSAGES.filter(m=>m.id!=msg.id); saveMessages(); checkMessages({clockIfNoMsg:0,clockIfAllRead:0,showMsgIfUnread:0}); }, - "Mark Unread" : () => { + /*LANG*/"Mark Unread" : () => { msg.new = true; saveMessages(); checkMessages({clockIfNoMsg:0,clockIfAllRead:0,showMsgIfUnread:0}); }, + /*LANG*/"Delete all messages" : () => { + E.showPrompt(/*LANG*/"Are you sure?", {title:/*LANG*/"Delete All Messages"}).then(isYes => { + if (isYes) { + MESSAGES = []; + saveMessages(); + } + checkMessages({clockIfNoMsg:0,clockIfAllRead:0,showMsgIfUnread:0}); + }); + }, }); } function showMessage(msgid) { var msg = MESSAGES.find(m=>m.id==msgid); - if (!msg) return checkMessages(); // go home if no message found + if (!msg) return checkMessages({clockIfNoMsg:0,clockIfAllRead:0,showMsgIfUnread:0}); // go home if no message found if (msg.src=="Maps") { cancelReloadTimeout(); // don't auto-reload to clock now return showMapMessage(msg); @@ -228,7 +237,6 @@ function showMessage(msgid) { } if (msg.negative) { buttons.push({type:"btn", src:getNegImage(), cb:()=>{ - console.log("Response"); msg.new = false; saveMessages(); cancelReloadTimeout(); // don't auto-reload to clock now Bangle.messageResponse(msg,false); @@ -266,10 +274,10 @@ function checkMessages(options) { options=options||{}; // If no messages, just show 'no messages' and return if (!MESSAGES.length) { - if (!options.clockIfNoMsg) return E.showPrompt("No Messages",{ - title:"Messages", + if (!options.clockIfNoMsg) return E.showPrompt(/*LANG*/"No Messages",{ + title:/*LANG*/"Messages", img:require("heatshrink").decompress(atob("kkk4UBrkc/4AC/tEqtACQkBqtUDg0VqAIGgoZFDYQIIM1sD1QAD4AIBhnqA4WrmAIBhc6BAWs8AIBhXOBAWz0AIC2YIC5wID1gkB1c6BAYFBEQPqBAYXBEQOqBAnDAIQaEnkAngaEEAPDFgo+IKA5iIOhCGIAFb7RqAIGgtUBA0VqobFgNVA")), - buttons : {"Ok":1} + buttons : {/*LANG*/"Ok":1} }).then(() => { load() }); return load(); } @@ -297,7 +305,7 @@ function checkMessages(options) { var x = r.x+2, title = msg.title, body = msg.body; var img = getMessageImage(msg); if (msg.id=="music") { - title = msg.artist || "Music"; + title = msg.artist || /*LANG*/"Music"; body = msg.track; } if (img) { From 4ed73f91e3ccf65fab5dbfc38b1d99ed75a2563a Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:11:51 +0100 Subject: [PATCH 46/94] 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..1c73a2f72 --- /dev/null +++ b/apps/showimg/app-icon.js @@ -0,0 +1 @@ +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 37797f5db52bf3803ded6169707f1337a75d0f0d Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:17:06 +0100 Subject: [PATCH 47/94] Update apps.json --- apps.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps.json b/apps.json index c1f51f272..b2b316b1c 100644 --- a/apps.json +++ b/apps.json @@ -4972,4 +4972,18 @@ {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} ] } + { "id": "showimg", + "name": "simple image viewer", + "shortName":"showImage", + "version":"1", + "description": "Displays the image file in ""showimage.user.img"". Returns to watch face after 60s or button push.", + "icon": "app.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"showimg.app.js","url":"app.js"}, + {"name":"showimg.img","url":"app-icon.js","evaluate":true} + ] +} ] From 5eddc5af13683a10ef15d3503e4336fbea750edb Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:18:20 +0100 Subject: [PATCH 48/94] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b2b316b1c..99fde139d 100644 --- a/apps.json +++ b/apps.json @@ -4971,7 +4971,7 @@ {"name":"coretemp.app.js","url":"coretemp.js"}, {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} ] - } + }, { "id": "showimg", "name": "simple image viewer", "shortName":"showImage", From e2e33100e360adf3cf880f0f3f58edba47939707 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:22:43 +0100 Subject: [PATCH 49/94] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 99fde139d..9d1843937 100644 --- a/apps.json +++ b/apps.json @@ -4976,7 +4976,7 @@ "name": "simple image viewer", "shortName":"showImage", "version":"1", - "description": "Displays the image file in ""showimage.user.img"". Returns to watch face after 60s or button push.", + "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push.", "icon": "app.png", "tags": "", "supports" : ["BANGLEJS2"], From 3fd3575179a5f71078a4dae3b52ecce804e81292 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:24:25 +0100 Subject: [PATCH 50/94] Update apps.json --- apps.json | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/apps.json b/apps.json index 9d1843937..e93c8c057 100644 --- a/apps.json +++ b/apps.json @@ -4972,18 +4972,19 @@ {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} ] }, - { "id": "showimg", - "name": "simple image viewer", - "shortName":"showImage", - "version":"1", - "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push.", - "icon": "app.png", - "tags": "", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"showimg.app.js","url":"app.js"}, - {"name":"showimg.img","url":"app-icon.js","evaluate":true} - ] -} + { + "id": "showimg", + "name": "simple image viewer", + "shortName":"showImage", + "version":"1", + "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push.", + "icon": "app.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"showimg.app.js","url":"app.js"}, + {"name":"showimg.img","url":"app-icon.js","evaluate":true} + ] + } ] From 2809e267da6f57778af3793a8e6efdcf3be4a8d8 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:28:59 +0100 Subject: [PATCH 51/94] Update apps.json --- apps.json | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/apps.json b/apps.json index e93c8c057..c1f51f272 100644 --- a/apps.json +++ b/apps.json @@ -4971,20 +4971,5 @@ {"name":"coretemp.app.js","url":"coretemp.js"}, {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} ] - }, - { - "id": "showimg", - "name": "simple image viewer", - "shortName":"showImage", - "version":"1", - "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push.", - "icon": "app.png", - "tags": "", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"showimg.app.js","url":"app.js"}, - {"name":"showimg.img","url":"app-icon.js","evaluate":true} - ] } ] From ebff58b09ab31118a63fc07b870a8caf7dc6cea9 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:31:19 +0100 Subject: [PATCH 52/94] Update apps.json --- apps.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps.json b/apps.json index 682c399c4..739ab1c9c 100644 --- a/apps.json +++ b/apps.json @@ -4971,5 +4971,20 @@ {"name":"coretemp.app.js","url":"coretemp.js"}, {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} ] + }, + { + "id": "showimg", + "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.", + "icon": "app.png", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"showimg.app.js","url":"app.js"}, + {"name":"showimg.img","url":"app-icon.js","evaluate":true} + ] } ] From c222df0acf9f636c0bff30498d3d3eda10dd1694 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:34:55 +0100 Subject: [PATCH 53/94] Update apps.json --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 739ab1c9c..eafc71c12 100644 --- a/apps.json +++ b/apps.json @@ -4977,9 +4977,9 @@ "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.", + "description": "Displays the image file in ""showimage.user.img"". Returns to watch face after 60s or button push.", "icon": "app.png", - "tags": "", + "tags": "tool", "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ From 653aeccdc116431c1db82cd0ec196b5d7aab58ea Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:40:20 +0100 Subject: [PATCH 54/94] Delete showimg.app.js --- apps/showimg/showimg.app.js | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 apps/showimg/showimg.app.js diff --git a/apps/showimg/showimg.app.js b/apps/showimg/showimg.app.js deleted file mode 100644 index e00385bd7..000000000 --- a/apps/showimg/showimg.app.js +++ /dev/null @@ -1,16 +0,0 @@ -g.reset(); -g.clear(); -g.drawImage(require("Storage").read("showimg.user.img"),0,0); -drawTimeout = setTimeout(function() { - load(); -}, 60000); -setWatch(function() { - load(); -}, BTN, { repeat:false, edge:'falling' }); -var savedOptions=Bangle.getOptions(); -Bangle.setLCDBrightness(1); -var newOptions={ - lockTimeout:60000, - backlightTimeout:60000 -}; -Bangle.setOptions(newOptions); From 7d40d014d74a1f288746ecc3c66fae2a58e0e014 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:40:40 +0100 Subject: [PATCH 55/94] Delete showimg.img --- apps/showimg/showimg.img | Bin 292 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/showimg/showimg.img diff --git a/apps/showimg/showimg.img b/apps/showimg/showimg.img deleted file mode 100644 index 24c9245ca6d4f7b60802318a19fbbf054828462f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmZwCu?oUK3?L0%Bjo!QsFM@DV(4aP&$CPbkLZ z6en-^NPYsBl;sNkzr=zfB0FWs7Ew(AiPepWFpB2UxsgPNpNgc;SjP_07jWH+Dw Date: Wed, 15 Dec 2021 11:55:58 +0200 Subject: [PATCH 56/94] Added Latvian language to "locales.js" Added Latvian diacritics in "charFallbacks" Added "lv_LV" locale Sorted "charFallbacks" alphabetically Also just looking at the ISO map, maybe charFallbacks should be also transformed the same way? I guess for all lowercase diacritics we have to add uppercase ones too, right? --- apps/locale/locales.js | 44 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index 1d659f161..2e3fa8713 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -37,20 +37,30 @@ const codePages = { /* When it's not in the codepage, try and use these conversions */ const charFallbacks = { + "ą":"a", + "ā":"a", "č":"c", - "ř":"r", - "ő":"o", + "ć":"c", "ě":"e", "ę":"e", - "ą":"a", + "ē":"e", + "ģ":"g", + "i":"ī", + "ķ":"k", + "ļ":"l", + "ł":"l", + "ń":"n", + "ņ":"n", + "ő":"o", "ó":"o", + "ř":"r", + "ś":"s", + "š":"s", + "ū":"u", "ż":"z", "ź":"z", - "ń":"n", - "ł":"l", - "ś":"s", - "ć":"c", -}; + "ž":"z", + }; /* timePattern / datePattern: @@ -631,6 +641,24 @@ var locales = { day: "Niedziela,Poniedziałek,Wtorek,Środa,Czwartek,Piątek,Sobota", trans: { yes: "tak", Yes: "Tak", no: "nie", No: "Nie", ok: "ok", on: "on", off: "off", "< Back": "< Wstecz" } }, + "lv_LV": { // Using charfallbacks + lang: "lv_LV", + decimal_point: ",", + thousands_sep: " ", + currency_symbol: "€", + int_curr_symbol: "EUR", + speed: "kmh", + distance: { 0: "m", 1: "km" }, + temperature: "°C", + ampm: { 0: "", 1: "" }, + timePattern: { 0: "%HH:%MM:%SS", 1: "%HH:%MM" }, + datePattern: { 0: "%d. %b %Y", "1": "%d.%m.%Y" }, // 1. Mar 2020 // 01.03.20 + abmonth: "Jan,Feb,Mar,Apr,Mai,Jūn,Jūl,Aug,Sep,Okt,Nov,Dec", + month: "Janvāris,Februāris,Marts,Aprīlis,Maijs,Jūnijs,Jūlijs,Augusts,Septemberis,Oktobris,Novembris,Decembris", + abday: "Pr,Ot,Tr,Ce,Pk,Se,Sv", + day: "Pirmdiena,Otrdiena,Trešdiena,Ceturtdiena,Piektdiena,Sestdiena,Svētdiena", + trans: { yes: "jā", Yes: "Jā", no: "nē", No: "Nē", ok: "labi", on: "Ieslēgt", off: "Izslēgt", "< Back": "< Atpakaļ" } + }, /*, "he_IL": { // This won't work until we get a font - see https://github.com/espruino/BangleApps/issues/399 codePage : "ISO8859-8", From 3fcae7f4617e2b85c83f9649f7adcbbb86ff0ff3 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:58:23 +0100 Subject: [PATCH 57/94] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index eafc71c12..22cf89384 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.", + "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push.", "icon": "app.png", "tags": "tool", "supports" : ["BANGLEJS2"], From dc785b3d6d12909bc9ba5768ea030271ce1ef8d5 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 10:59:44 +0100 Subject: [PATCH 58/94] Add files via upload --- apps/showimg/showimg.png | Bin 0 -> 4579 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/showimg/showimg.png diff --git a/apps/showimg/showimg.png b/apps/showimg/showimg.png new file mode 100644 index 0000000000000000000000000000000000000000..a3bbabfb947a09ac0ba21a2ac1db0fa0bb1fba24 GIT binary patch literal 4579 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 Date: Wed, 15 Dec 2021 11:00:21 +0100 Subject: [PATCH 59/94] Add files via upload --- apps/showimg/app.png | Bin 0 -> 4579 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/showimg/app.png diff --git a/apps/showimg/app.png b/apps/showimg/app.png new file mode 100644 index 0000000000000000000000000000000000000000..a3bbabfb947a09ac0ba21a2ac1db0fa0bb1fba24 GIT binary patch literal 4579 zcmV<95ghJ`P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O1n_cJm+({jXKb63iQx0|w5S9nA9QN?^xMoHUQG zIc?L_k%b;tSAtOc-+w#(2Vc?nNY;hullKe0Y_dsbJc-Nr8o$+I<)?g^`7iu^dY$%v zXuM=@SNb-u&v@P4-Vp43y_{dCuueH~3Y!1e1RB1x#*=wnoPvxVudDetrTM;W56hX~ zWr$eh&dcN9HozFw;YFiKH>1pgpONok_*vCvT?b-VNFA1SH69KQ~>>%GR_+gM$;9+vVn7qu-# zp5ej*QyO`j$0Oj|;dzip!XsjdD?C==&4R~DDk%+XcV$&oS#{Oq_o`N?Xm!&8zqMZB z1AZ-iVC&Q;+`tssm&`tYEu7r%Mz zf_mrBRceX5t)Q3Y0E8OsIsS>O;E?GCP7$>|=nyx{!LbG&bYkX+1?Hs;5yh!nY#H&h z!F6u2w2ahHp-urX5$^4vj56@R;t}4;t0ib1l!6^2{F9-%HdYsSKsl$Yq7L5}P;#wydb|v1fg_ypCcrgF7dXpWhxiFLB8IXv&XRM^yWpZrE_>sxci#Kp8KZJA z!3Gz62qA_Pax~FK7kvyd#uRhX$pFG!@+nY?DW#lo(+trW@6Na)=c0=#wz%R;D6yoH zSA@@MSGW2#tZ_|iuDY6v^sl}Ks9)J>d+4#Jo_DWJ zub#c8?mYL}YifFpJ!a*)aPt~o4q+3a7)~7f3?9=~!Q+8FfPmKQvn48PHG7VIwj_N55Tot!AkxMjXUh z$TnR}2e9FS7PF3-Ytq-h=~n@}pq>NZS0$_&AOZcX(lwag5I6?kJ_DYk4+z4*|E~*- zw(>KC)*|mv8M3IS$Z|_frYRFv?duZOkeYHOS5C)Ls?91jToX!guDFDZw>ett*HmG1 zU~M2%dquf6tB0XPy=B=I?2IX!g0QiXpQ0q{!ltGuNzjsYxz^-c#?sxA5$8o4pLJTBTSDkAx6U?be%TkM za2H;fMI4QVnJ^b-rUyMN#O9GVu?MSourx&Fr8pY$eiuha^?ngYkE{Jo96dAMr{d_D z@jewtuYK{pIC{sm?}(#k##^#r1jO!7Z@*hNt8#roR5wndSPgk#s;jjn=0OTMgiO-4 z+Su~yqRs^%UaePgHL>-EEK`6~*3U@luF0&GBfG7-=)f3>$6{){04+cbFC?2X7P8cB z9joPapi;otCQlAt}#}HVAyM` zt|e2hs6)jpUgs4kSrVwOSt8z?T@ZAws3Yu?N= z!50P+@Lh))V4%`K*hjF4!oP^5o6O%t(v_Ouh@{sme_tfMYs|ky(&zrU7D>Oje2VN0 z7xWY=X8C4N>Pd%`IftV2Ru%+i>B7obB7e7)n%qI#Zk%XSmb@muN9IvN$6Y01c?I}y z(lLx104AVyuL_{UutKgIWDfGFcMVY@zn8^XxjY;1Sf1(+8lQg~%3lzMGhe8(CIVby zr8xyK0$^Nl*#RU>&9<5q7xu6qYja!ItZddAY1*7KprNV(S1s!RVg)>crA-AP2B`w4 zVp8Q(a|Lb*9$X8gDuJGZGq14%MM0|2{r2ihS+QsUOw((Rn#Pg>+))`sbPL6zegG7m zMw!Sh)g<%`A+i9wgr2Eds`y_JPt1Z|qyg3%>;h}~WNc@=1L_r*OF_%v^tzS^#B&yQ z0ph`ep~40?FTv}M#8KjQan#XGP@WkTh*dR0D^XKG(7Us#wWgxxvQe;>g2sUa`l@2+ z(+BA5-aPWeE1D==wtFj3%azV@6V}C4LgjWQhuYKo%da z;)>iWYIbi}sn3K=@<4T2h~-uZHgq${q?m4{^s$nP+mPP4qlF-r%*nY7_T0h33#Ve` zob1Iy`!!iJL^lL4ZjIUox(jk1_AZ8QDuWp?_s5-32syNJZbj--C`HQC3U6_FauqpJ zmSC9(ta&x4u3-L%!cyaVj9)lU9tILv+j|tcZcZ+^vZyr1Oz=s z#CHKfj}h@*K+w|#9TxIuCkpySf=k>thB6b}Z4hVt$Z)$sT$Shv1L7ol2E^6GUfV2( z4E`m7>6pP!{Dl88E_LODu;D|@@0@I<8TA_}8^~l%$Ycl7ZQg)qM_j|Vu}|L?IyrYZ z1kS~u?A*ZDDQ=dih>L z!3khdtBy6dW}n@u=z{*{?5xoswQ#IQwJecPE)hA6IrViP{$?9admnxvG&}v+$j77} zOlKzf0Hkp*z{MK18b&1V)!hUnxYGm#)%-RA*#{tir^%dfD{0qpuSuPXa{IjoG5CZR z&;>Dgi0{9Gkt2q_2*yo52hj*f#LyOyOO}B2t2>0y7LW)c2}tE6AZr{A>q%F7uIy*J z(sky1o;dWR0)L!1be%b$0}`!o0@BfEfarnHE-^xLW17Js!NCx1AhF&@?HHmF%_T=9 zRy1gUg*&zkh_=EV*$`=y+k9VPbM&;#>XyJm{fsnEi>oVF@vs!6XF+AounGKaylu@p z6<4iVpS&0{vhUIl)6DT@5)O1SlHy4T;c$Z$ueXvBCy^D#;<L?tw@hh(3~AObvHEr0Wytx&fEyxpKn?J*jiQ$7-gjrp_{;;W(Fk8<2|*QXtp)3AqUBV+UDj z_7dnIw^kyv1oV$C3$4HJPIo;|-6;eeo71W2>`P}?%91Yn(!0Vy$I5W-cV4tR_kA>U zqM6k@li9O+XEIw-PbM>xI!iShNev>Snff&_UVzpf0Eo7VXiGt&&6pL^E8-tyN#$c> zTaSZqLbNHpC7^V+dyNIio=R*|>Cly~hvEYiBx&uqpqJB*LDW^BHVm*Zr?XNpC{|_^ zR<`!g8LGHYANEDA(CP!QqL*m(0a(!qtt0@T5>mYZFAS3za10)vu4)2K(qne2wE#|Q zHNo(S1aVL~a#c{_`xzkZL%^p~k3E0yviC?lx}hzBM=Wm>8_D5g216K><<5O~ubUV- z+)F#ygz4WZ7+J)>f{~nFZ2KYP0FT=M#WOh4ZGuwF{RG8z1ml~Ol%DbCPpdyY?Y}>) z{`8DDALrulY?jgWZrQ6T$aN1zpHD%SUBlP2+Ns~1Q*J}bF`{Jc>VR^A-l3h~BAv%s z42-9F783RlUga2G(C#q2pf9Eux8cQMHcTFV5V(ZVfLD@@~V! zP>;7s&lxN>;hhNa*f2?BRE8Nk?KWw(!c^Yc1ElH`q)w~cZ}yD69{OOjr;Q>md!}O? z!@H)uzrplajcwD~q>{kCp1U;*LN%w7CGq75nmLtp4Avl0GL^hBOJdV%J4Zr)M|cMq zPGAx|-zx;&*xObiCV8v%g1jy5*+_H?12Nw)@KP^#7EnJWvHyq!|dp` zVKz!QZ8iKf%!bBel3!%ou>-I6LHw&ervoqDk1=vbMGZH zev!$8ItYNJK^;JTJ_aXxwDb+8%f4ZMx3xSsmPeICn*$`L->LCH75aAaa7R4~{XP{L z$x6RZMTTy44SApINbkb(Upms?Gtb*;sjclF4rU~fPFzR;)w!{SR$NHHpdC#}z@Qy+ zR_bBv;9fdiivL17E!&i7L&7d(X>tr(C;Ds@BaGrXD2A5eDWQp8#NLLD@YNAJhOcH# zIbp|Xe#bRM7a$d3}zp^$l9&Ad}qX*pA>PdpklrPbv59hz9wP-t=`r-40|o2G{6f+WvUq+m zb`eKkw)=+m13QTHZ98fn*gecH(q6XpGYK7Rz(olfYlJ|0@waM&)C~-B4E&u=kwMj%lR4C7t(Mt}*AP5Fv|n1&qXBm^au!z&7;8h!*I8Z@i9u zqsz%*Y>@vnQKDD`*zAD3Wt?TtLKEs%gJ@o! Date: Wed, 15 Dec 2021 11:01:43 +0100 Subject: [PATCH 60/94] Delete showimg.png --- apps/showimg/showimg.png | Bin 4579 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/showimg/showimg.png diff --git a/apps/showimg/showimg.png b/apps/showimg/showimg.png deleted file mode 100644 index a3bbabfb947a09ac0ba21a2ac1db0fa0bb1fba24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4579 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 Date: Wed, 15 Dec 2021 11:05:56 +0100 Subject: [PATCH 61/94] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 22cf89384..dec853b12 100644 --- a/apps.json +++ b/apps.json @@ -4972,7 +4972,7 @@ {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} ] }, - { + { "id": "showimg", "name": "simple image viewer", "shortName":"showImage", From b047933c6dfec2529c278546078ff43e03e515bc Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 11:08:47 +0100 Subject: [PATCH 62/94] Update apps.json --- apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps.json b/apps.json index dec853b12..e1651fde2 100644 --- a/apps.json +++ b/apps.json @@ -4977,11 +4977,10 @@ "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.", + "description": "Displays the image file in ""showimage.user.img"". Returns to watch face after 60s or button push. I currently use it to display my vaccination certificate.", "icon": "app.png", "tags": "tool", "supports" : ["BANGLEJS2"], - "readme": "README.md", "storage": [ {"name":"showimg.app.js","url":"app.js"}, {"name":"showimg.img","url":"app-icon.js","evaluate":true} From 26a8755da01c4817733970fd770476cc87f9b403 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 15 Dec 2021 10:11:02 +0000 Subject: [PATCH 63/94] Add translations from #202 --- apps/alarm/alarm.js | 4 ++-- apps/alarm/app.js | 40 ++++++++++++++++++++-------------------- apps/alarm/boot.js | 2 +- lang/de_DE.json | 12 ++++++++++-- lang/en_GB.json | 9 +++++++++ lang/es_ES.json | 21 +++++++++++++++++++++ lang/fi_FI.json | 21 +++++++++++++++++++++ lang/fr_FR.json | 21 +++++++++++++++++++++ lang/hu_HU.json | 21 +++++++++++++++++++++ lang/index.json | 11 ++++++++++- lang/it_IT.json | 21 +++++++++++++++++++++ lang/nl_NL.json | 21 +++++++++++++++++++++ lang/sv_SE.json | 21 +++++++++++++++++++++ lang/tr_TR.json | 21 +++++++++++++++++++++ 14 files changed, 220 insertions(+), 26 deletions(-) create mode 100644 lang/en_GB.json create mode 100644 lang/es_ES.json create mode 100644 lang/fi_FI.json create mode 100644 lang/fr_FR.json create mode 100644 lang/hu_HU.json create mode 100644 lang/it_IT.json create mode 100644 lang/nl_NL.json create mode 100644 lang/sv_SE.json create mode 100644 lang/tr_TR.json diff --git a/apps/alarm/alarm.js b/apps/alarm/alarm.js index bb5722106..a655dad1e 100644 --- a/apps/alarm/alarm.js +++ b/apps/alarm/alarm.js @@ -21,8 +21,8 @@ function showAlarm(alarm) { Bangle.loadWidgets(); Bangle.drawWidgets(); E.showPrompt(msg,{ - title:alarm.timer ? "TIMER!" : "ALARM!", - buttons : {"Sleep":true,"Ok":false} // default is sleep so it'll come back in 10 mins + title:alarm.timer ? /*LANG*/"TIMER!" : /*LANG*/"ALARM!", + buttons : {/*LANG*/"Sleep":true,/*LANG*/"Ok":false} // default is sleep so it'll come back in 10 mins }).then(function(sleep) { buzzCount = 0; if (sleep) { diff --git a/apps/alarm/app.js b/apps/alarm/app.js index 53c7154bc..17062d44a 100644 --- a/apps/alarm/app.js +++ b/apps/alarm/app.js @@ -33,16 +33,16 @@ function getCurrentHr() { function showMainMenu() { const menu = { '': { 'title': 'Alarm/Timer' }, - '< Back' : ()=>{load();}, - 'New Alarm': ()=>editAlarm(-1), - 'New Timer': ()=>editTimer(-1) + /*LANG*/'< Back' : ()=>{load();}, + /*LANG*/'New Alarm': ()=>editAlarm(-1), + /*LANG*/'New Timer': ()=>editTimer(-1) }; alarms.forEach((alarm,idx)=>{ if (alarm.timer) { - txt = "TIMER "+(alarm.on?"on ":"off ")+formatMins(alarm.timer); + txt = /*LANG*/"TIMER "+(alarm.on?/*LANG*/"on ":/*LANG*/"off ")+formatMins(alarm.timer); } else { - txt = "ALARM "+(alarm.on?"on ":"off ")+formatTime(alarm.hr); - if (alarm.rp) txt += " (repeat)"; + txt = /*LANG*/"ALARM "+(alarm.on?/*LANG*/"on ":/*LANG*/"off ")+formatTime(alarm.hr); + if (alarm.rp) txt += /*LANG*/" (repeat)"; } menu[txt] = function() { if (alarm.timer) editTimer(idx); @@ -70,27 +70,27 @@ function editAlarm(alarmIndex) { as = a.as; } const menu = { - '': { 'title': 'Alarm' }, - '< Back' : showMainMenu, - 'Hours': { + '': { 'title': /*LANG*/'Alarm' }, + /*LANG*/'< Back' : showMainMenu, + /*LANG*/'Hours': { value: hrs, onchange: function(v){if (v<0)v=23;if (v>23)v=0;hrs=v;this.value=v;} // no arrow fn -> preserve 'this' }, - 'Minutes': { + /*LANG*/'Minutes': { value: mins, onchange: function(v){if (v<0)v=59;if (v>59)v=0;mins=v;this.value=v;} // no arrow fn -> preserve 'this' }, - 'Enabled': { + /*LANG*/'Enabled': { value: en, format: v=>v?"On":"Off", onchange: v=>en=v }, - 'Repeat': { + /*LANG*/'Repeat': { value: en, format: v=>v?"Yes":"No", onchange: v=>repeat=v }, - 'Auto snooze': { + /*LANG*/'Auto snooze': { value: as, format: v=>v?"Yes":"No", onchange: v=>as=v @@ -108,14 +108,14 @@ function editAlarm(alarmIndex) { last : day, rp : repeat, as: as }; } - menu["> Save"] = function() { + menu[/*LANG*/"> Save"] = function() { if (newAlarm) alarms.push(getAlarm()); else alarms[alarmIndex] = getAlarm(); require("Storage").write("alarm.json",JSON.stringify(alarms)); showMainMenu(); }; if (!newAlarm) { - menu["> Delete"] = function() { + menu[/*LANG*/"> Delete"] = function() { alarms.splice(alarmIndex,1); require("Storage").write("alarm.json",JSON.stringify(alarms)); showMainMenu(); @@ -136,18 +136,18 @@ function editTimer(alarmIndex) { en = a.on; } const menu = { - '': { 'title': 'Timer' }, - 'Hours': { + '': { 'title': /*LANG*/'Timer' }, + /*LANG*/'Hours': { value: hrs, onchange: function(v){if (v<0)v=23;if (v>23)v=0;hrs=v;this.value=v;} // no arrow fn -> preserve 'this' }, - 'Minutes': { + /*LANG*/'Minutes': { value: mins, onchange: function(v){if (v<0)v=59;if (v>59)v=0;mins=v;this.value=v;} // no arrow fn -> preserve 'this' }, - 'Enabled': { + /*LANG*/'Enabled': { value: en, - format: v=>v?"On":"Off", + format: v=>v?/*LANG*/"On":/*LANG*/"Off", onchange: v=>en=v } }; diff --git a/apps/alarm/boot.js b/apps/alarm/boot.js index 47dae5361..dffb3a37f 100644 --- a/apps/alarm/boot.js +++ b/apps/alarm/boot.js @@ -7,7 +7,7 @@ active = active.sort((a,b)=>(a.hr-b.hr)+(a.last-b.last)*24); var hr = time.getHours()+(time.getMinutes()/60)+(time.getSeconds()/3600); if (!require('Storage').read("alarm.js")) { - console.log("No alarm app!"); + console.log(/*LANG*/"No alarm app!"); require('Storage').write('alarm.json',"[]"); } else { var t = 3600000*(active[0].hr-hr); diff --git a/lang/de_DE.json b/lang/de_DE.json index 02dd72189..80d0e74bb 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -6,10 +6,18 @@ "Hours" : "Stunden", "Minutes" : "Minuten", "Enabled" : "Aktiviert", - "Settings" : "Einstellungen" + "Settings" : "Einstellungen", + "Save" : "Speichern", + "Back" : "Zurück", + "Repeat" : "Wiederholen", + "Delete" : "Löschen", + "Sleep" : "Schlummern", + "Alarms" : "Wecker", + "New Alarm" : "Neuer Wecker", + "ALARM!" : "ALARM!" }, "alarm": { "//":"App-specific overrides", - "Alarm" : "Alarm" + "rpt" : "Wdh." } } diff --git a/lang/en_GB.json b/lang/en_GB.json new file mode 100644 index 000000000..e85fe8029 --- /dev/null +++ b/lang/en_GB.json @@ -0,0 +1,9 @@ +{ + "//":"British English language translations - the default strings in apps are all english anyway, so no need to have translations for most things", + "GLOBAL": { + "//":"Translations that apply for all apps", + }, + "alarm": { + "//":"App-specific overrides", + } +} diff --git a/lang/es_ES.json b/lang/es_ES.json new file mode 100644 index 000000000..0671c4ab8 --- /dev/null +++ b/lang/es_ES.json @@ -0,0 +1,21 @@ +{ + "//":"Spanish language translations", + "GLOBAL": { + "//":"Translations that apply for all apps", + "Alarms" : "Alarmas", + "Hours" : "Horas", + "Minutes" : "Minutos", + "Enabled" : "Activados", + "New Alarm" : "Alarma nueva", + "Save" : "Grabar", + "Back" : "Atrás", + "Repeat" : "Repetición", + "Delete" : "Borrar", + "ALARM!" : "ALARM", + "Sleep" : "Dormir" + }, + "alarm": { + "//":"App-specific overrides", + "rpt" : "rep." + } +} diff --git a/lang/fi_FI.json b/lang/fi_FI.json new file mode 100644 index 000000000..eb1d826d8 --- /dev/null +++ b/lang/fi_FI.json @@ -0,0 +1,21 @@ +{ + "//":"Finnish language translations", + "GLOBAL": { + "//":"Translations that apply for all apps", + "Alarms" : "Hälytykset", + "Hours" : "Tunnit", + "Minutes" : "Minuutit", + "Enabled" : "Aktivoitu", + "New Alarm" : "Uusi hälytys", + "Save" : "Tallenna", + "Back" : "Paluu", + "Repeat" : "Toista", + "Delete" : "Poista", + "ALARM!" : "ALARM", + "Sleep" : "Nukkuminen" + }, + "alarm": { + "//":"App-specific overrides", + "rpt" : "toistaa" + } +} diff --git a/lang/fr_FR.json b/lang/fr_FR.json new file mode 100644 index 000000000..209574424 --- /dev/null +++ b/lang/fr_FR.json @@ -0,0 +1,21 @@ +{ + "//":"French language translations", + "GLOBAL": { + "//":"Translations that apply for all apps", + "Alarms" : "Réveils", + "Hours" : "Heures", + "Minutes" : "Minutes", + "Enabled" : "Activé", + "New Alarm" : "Nouveau Réveil", + "Save" : "Sauvegarder", + "Back" : "Retour", + "Repeat" : "Répétition", + "Delete" : "Supprimer", + "ALARM!" : "ALARM!", + "Sleep" : "Sommeil" + }, + "alarm": { + "//":"App-specific overrides", + "rpt" : "rép." + } +} diff --git a/lang/hu_HU.json b/lang/hu_HU.json new file mode 100644 index 000000000..8e5df6ed7 --- /dev/null +++ b/lang/hu_HU.json @@ -0,0 +1,21 @@ +{ + "//":"Spanish language translations", + "GLOBAL": { + "//":"Translations that apply for all apps", + "Alarms" : "Riasztások", + "Hours" : "Óra", + "Minutes" : "Perc", + "Enabled" : "Aktiválva", + "New Alarm" : "Új riasztás", + "Save" : "Mentés", + "Back" : "Vissza", + "Repeat" : "Ismétlés", + "Delete" : "Törlés", + "ALARM!" : "ALARM!", + "Sleep" : "Alvás" + }, + "alarm": { + "//":"App-specific overrides", + "rpt" : "ismétlés" + } +} diff --git a/lang/index.json b/lang/index.json index 7f4bbee37..f17bf5e03 100644 --- a/lang/index.json +++ b/lang/index.json @@ -1,3 +1,12 @@ [ - "de_DE.json" + {"code":"en_GB","name":"British English","url":"en_GB.json"}, + {"code":"de_DE","name":"German","url":"de_DE.json"}, + {"code":"es_ES","name":"Spanish","url":"es_ES.json"}, + {"code":"fi_FI","name":"Finnish","url":"fi_FI.json"}, + {"code":"fr_FR","name":"French","url":"fr_FR.json"}, + {"code":"hu_HU","name":"Hungarian","url":"hu_HU.json"}, + {"code":"it_IT","name":"Italian","url":"it_IT.json"}, + {"code":"nl_NL","name":"Dutch","url":"nl_NL.json"}, + {"code":"sv_SE","name":"Swedish","url":"sv_SE.json"}, + {"code":"tr_TR","name":"Turkish","url":"tr_TR.json"} ] diff --git a/lang/it_IT.json b/lang/it_IT.json new file mode 100644 index 000000000..184c80238 --- /dev/null +++ b/lang/it_IT.json @@ -0,0 +1,21 @@ +{ + "//":"Italian language translations", + "GLOBAL": { + "//":"Translations that apply for all apps", + "Alarms" : "Allarmi", + "Hours" : "Ore", + "Minutes" : "Minuti", + "Enabled" : "Attivato", + "New Alarm" : "Nuovo allarme", + "Save" : "Salvare", + "Back" : "Indietro", + "Repeat" : "Ripetere", + "Delete" : "Cancellare", + "ALARM!" : "ALARM!", + "Sleep" : "Dormire" + }, + "alarm": { + "//":"App-specific overrides", + "rpt" : "ripetere" + } +} diff --git a/lang/nl_NL.json b/lang/nl_NL.json new file mode 100644 index 000000000..a04e46928 --- /dev/null +++ b/lang/nl_NL.json @@ -0,0 +1,21 @@ +{ + "//":"Dutch language translations", + "GLOBAL": { + "//":"Translations that apply for all apps", + "Alarms" : "Alarmen", + "Hours" : "Uren", + "Minutes" : "Minuten", + "Enabled" : "Geactiveerd", + "New Alarm" : "Nieuw alarm", + "Save" : "Opslaan", + "Back" : "Terug", + "Repeat" : "Herhalen", + "Delete" : "Verwijderen", + "ALARM!" : "ALARV.", + "Sleep" : "Stand-by" + }, + "alarm": { + "//":"App-specific overrides", + "rpt" : "herhalen" + } +} diff --git a/lang/sv_SE.json b/lang/sv_SE.json new file mode 100644 index 000000000..3a006c2bf --- /dev/null +++ b/lang/sv_SE.json @@ -0,0 +1,21 @@ +{ + "//":"Swedish language translations", + "GLOBAL": { + "//":"Translations that apply for all apps", + "Alarms" : "Larm", + "Hours" : "Timmar", + "Minutes" : "Minuter", + "Enabled" : "Aktiverad", + "New Alarm" : "Ny alarm", + "Save" : "Spara", + "Back" : "Tillbaka", + "Repeat" : "Upprepning", + "Delete" : "Radera", + "ALARM!" : "ALURH!", + "Sleep" : "Sömn" + }, + "alarm": { + "//":"App-specific overrides", + "rpt" : "uppr." + } +} diff --git a/lang/tr_TR.json b/lang/tr_TR.json new file mode 100644 index 000000000..c59bc7d6b --- /dev/null +++ b/lang/tr_TR.json @@ -0,0 +1,21 @@ +{ + "//":"Turkish language translations", + "GLOBAL": { + "//":"Translations that apply for all apps", + "Alarms" : "Alarmlar", + "Hours" : "Saat", + "Minutes" : "Dakika", + "Enabled" : "Etkinleştirildi", + "New Alarm" : "Yeni alarm", + "Save" : "Sakla", + "Back" : "Geriye", + "Repeat" : "Yineleme", + "Delete" : "Sil", + "ALARM!" : "ALARM!", + "Sleep" : "Uyku" + }, + "alarm": { + "//":"App-specific overrides", + "rpt" : "yineleme" + } +} From 40cb908fe205667752a8bba49cb97e3fce42ae30 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 11:18:32 +0100 Subject: [PATCH 64/94] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e1651fde2..f4d338c84 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 currently use it to display my vaccination certificate.", + "description": "Displays the image file in showimage.user.img. Returns to watch face after 60s or button push. I currently use it to display my vaccination certificate.", "icon": "app.png", "tags": "tool", "supports" : ["BANGLEJS2"], From 3326cee40087e5f38a6193126a4f8bf528809c4c Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 11:33:26 +0100 Subject: [PATCH 65/94] Add files via upload --- apps/showimg/app.png | Bin 4579 -> 4551 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/showimg/app.png b/apps/showimg/app.png index a3bbabfb947a09ac0ba21a2ac1db0fa0bb1fba24..306db9b42bfdb750b29d17aecccdc32af800de41 100644 GIT binary patch delta 4258 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 Eg4E9|WB>pF delta 4286 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 From 5bcf66d6faa01b494511acb986ee1f34346b4c3d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 15 Dec 2021 10:33:48 +0000 Subject: [PATCH 66/94] Add pedometer as dependency for pastel clock --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index ca73a0d10..be3d166c9 100644 --- a/apps.json +++ b/apps.json @@ -4212,7 +4212,7 @@ "version": "0.08", "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"}, + "dependencies": {"mylocation":"app", "widpedom":"app"}, "screenshots": [{"url":"screenshot_pastel.png"}], "type": "clock", "tags": "clock", From 4925155c8a562714c1a11fc2518d80799f9e9d73 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Wed, 15 Dec 2021 11:36:16 +0100 Subject: [PATCH 67/94] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index f4d338c84..354067f70 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 currently use it to display my vaccination certificate.", + "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"], From bbe0d8b44d25122b63ef64fb2f36b86109048a9e Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 15 Dec 2021 10:52:58 +0000 Subject: [PATCH 68/94] fix chars out of 128 range --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 5a6cf40b4..2a8e872ec 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 5a6cf40b4030ba909bf5f88b646ac05e41ce4c03 +Subproject commit 2a8e872ecb143a10e53273b4d3473164e104e1d3 From a12b003d9017c13e5e1fb77f79aea4f02f04212d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 15 Dec 2021 11:15:39 +0000 Subject: [PATCH 69/94] update descriptions --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index be3d166c9..89492ec7d 100644 --- a/apps.json +++ b/apps.json @@ -100,7 +100,7 @@ "name": "Android Integration", "shortName": "Android", "version": "0.05", - "description": "Display notifications/music/etc from Gadgetbridge on Android. This replaces the old Gadgetbridge widget.", + "description": "Display notifications/music/etc sent from the Gadgetbridge app on Android. This replaces the old 'Gadgetbridge' Bangle.js widget.", "icon": "app.png", "tags": "tool,system,messages,notifications", "dependencies": {"messages":"app"}, @@ -304,7 +304,7 @@ "id": "gbridge", "name": "Gadgetbridge", "version": "0.25", - "description": "(NOT RECOMMENDED) Handles Gadgetbridge notifications from Android. This is now replaced by the 'Android' app.", + "description": "(NOT RECOMMENDED) Displays Gadgetbridge notifications from Android. Please use the 'Android' Bangle.js app instead.", "icon": "app.png", "type": "widget", "tags": "tool,system,android,widget", From bb10a5a3dd08edf4e2554aa976ca0ec21cfc9586 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 15 Dec 2021 11:48:03 +0000 Subject: [PATCH 70/94] boot 0.39: Fix passkey support (fix https://github.com/espruino/Espruino/issues/2035 --- apps.json | 4 ++-- apps/boot/ChangeLog | 1 + apps/boot/bootupdate.js | 2 +- apps/setting/ChangeLog | 1 + apps/setting/settings.js | 4 +++- 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index 89492ec7d..941bc0716 100644 --- a/apps.json +++ b/apps.json @@ -16,7 +16,7 @@ { "id": "boot", "name": "Bootloader", - "version": "0.38", + "version": "0.39", "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", "icon": "bootloader.png", "type": "bootloader", @@ -167,7 +167,7 @@ { "id": "setting", "name": "Settings", - "version": "0.36", + "version": "0.37", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", diff --git a/apps/boot/ChangeLog b/apps/boot/ChangeLog index b941a9937..5c929421b 100644 --- a/apps/boot/ChangeLog +++ b/apps/boot/ChangeLog @@ -42,3 +42,4 @@ 0.36: Add comments to .boot0 to make debugging a bit easier 0.37: Remove Quiet Mode settings: now handled by Quiet Mode Schedule app 0.38: Option to log to file if settings.log==2 +0.39: Fix passkey support (fix https://github.com/espruino/Espruino/issues/2035) diff --git a/apps/boot/bootupdate.js b/apps/boot/bootupdate.js index 3001bb5c1..e338d9020 100644 --- a/apps/boot/bootupdate.js +++ b/apps/boot/bootupdate.js @@ -88,7 +88,7 @@ if (global.save) boot += `global.save = function() { throw new Error("You can't // Apply any settings-specific stuff if (s.options) boot+=`Bangle.setOptions(${E.toJS(s.options)});\n`; if (s.brightness && s.brightness!=1) boot+=`Bangle.setLCDBrightness(${s.brightness});\n`; -if (s.passkey!==undefined && s.passkey.length==6) boot+=`NRF.setSecurity({passkey:${s.passkey}, mitm:1, display:1});\n`; +if (s.passkey!==undefined && s.passkey.length==6) boot+=`NRF.setSecurity({passkey:${E.toJS(s.passkey.toString())}, mitm:1, display:1});\n`; if (s.whitelist) boot+=`NRF.on('connect', function(addr) { if (!(require('Storage').readJSON('setting.json',1)||{}).whitelist.includes(addr)) NRF.disconnect(); });\n`; // Pre-2v10 firmwares without a theme/setUI delete g.theme; // deleting stops us getting confused by our own decl. builtins can't be deleted diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index c676e3828..64844dcbc 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -39,3 +39,4 @@ 0.34: Remove Quiet Mode LCD settings: now handled by Quiet Mode Schedule app 0.35: Change App/Widget settings to 'App Settings' so it fits on Bangle screen 0.36: Added 'Utils' menu with helpful utilities for restoring Bangle.js +0.37: Going into passkey menu now saves settings with passkey diff --git a/apps/setting/settings.js b/apps/setting/settings.js index f55f9937f..9cba09d6c 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -276,8 +276,10 @@ function showPasskeyMenu() { showBLEMenu(); } }; - if (!settings.passkey || settings.passkey.length!=6) + if (!settings.passkey || settings.passkey.length!=6) { settings.passkey = "123456"; + updateSettings(); + } for (var i=0;i<6;i++) (function(i){ menu[`Digit ${i+1}`] = { value : 0|settings.passkey[i], From 5a3fd1d9e31468f64728f8c49dde8b1f532e7d00 Mon Sep 17 00:00:00 2001 From: The Dod Date: Wed, 15 Dec 2021 14:10:29 +0200 Subject: [PATCH 71/94] 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 72/94] 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 73/94] 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 74/94] 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 75/94] 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 76/94] 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 77/94] 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 78/94] 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 79/94] 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 zcmd6p`#;kS8^^z!&0$D$SmaP5Rx{Jhol>n4i`(fAIUg1xMhIEDXH#@5hwhu4g{+lC zO>7ABtz?SEa!4$el2gt!<@9*|h3BW|hwJ+MaJ{Zy-q-8(`CK>ubT}=K*o^=HK;FjM z(rH^+|1D|B?f$gxtM9fzqMc4#08jWDlK>zqXJcvZLh+rsJDnp$%Ox4lZFPU_sadFe z1!XFZ`YvJgQ5FZOZ7*jo(>8vsOp9?FHi`BstBPQutHU`OhGhb_(8h5){QOE-KU;cB zJ}8`AYSAhFd18r3{`~G7JE{Zfeekj@?Di@We>{1aKjbXysD(-QP$aorh|!P{nrZ#S zX^J~j+e*I-yT_^3?FXwy`3Ii|`xtv4W`-(f0CbU%;7GCCnY zEf&(uxXXwz2qc_%sgSuFw5G_SbLs`h*^jLrVa>ZAC9^7qKV}?AVn4Nf9Wir0pIe-t zDtJjAYACXwz3q{huUYdjnN<27A#BzConk{5gtk}e8oQFZu!nKWX((T>Tjej>Y@yzb z!e@{51G6d9GXNt}oTEZbr=l(JKbZ0*D_J!$zNsxH z#lk$#wdhP+Gq9E`i2lx9_UI&=T-?MB%JGP)Dv$lY%ta9Z*g= zorr;KhHvPCjPf??L_VTCdBT7t6rUvk;y$)7~x{@vCBcw%qXb05~ z4vX}ojy2anq4hQ3r4cs>MCj&sWv-GA%>Ga7(yVdqNt3TWT)*rrGpcv|xc9Fz6W&!7 zl0p*`hoAMO5L1sbo1**ofp#zc!J2WeFYAA0UFV0TdC))lYhR5il8?W!A#=2|yGmTN zB{ATPzHB!`rc})tl7{<4)t{PGrsR7sY|$W{*H&TEnz?#IzkcL7X*6sFhn>w-id;5MAx8|EA@8oc$6@Mho}K-@=$6A|xD;@1sfp{A;6HLoBz zhoiF8@lg84h!hIEX6Tgoxuo?SbfD35+R#$>;sW=dB|a=Vv8y*GrXfT$9BM zXGnuR7X)$I@3Vii=Z<@Q!di4ZxDDMY!uPy=tekR&0PrTzxGd$JU{=zH+C$q%Qq>$g zp9zIhGUp2p6Cn@{2BXQ&Y44hW-jEGob9}RE_V%(&UnzX2Kit5dQ zuGVJ`Xa9)?C$Uv7Z;@D7D6)H@@ofu@V*;`rJGG7m4JUW&U8JG&<(7{dF>=Ckoe2QW zO%dLT-b+_w2R0UMLutrF@7;#dS-yX0Y@1m}wk6~cqT6pOu&5>6t!ZnjVSh?-(b81S zb64b*mHE$`PWtMdp+JqFtESpkd&7X)lORXhKcDSM%(7DVvSJ$E922pF(Iz8Gdk>{3 zC(JB$173K&gqQwdCj*Y32sxO@JZ*)Eba3s6=I6NQX^`hkIA1?z@P26tftt~M7b;IY zg6q0?E6Yl-exDV~c>Y4IEN!KAtstk>&!IuPfAf4ymy`?P4ypDB8y{B9x6R}~#_3JR z?*iKfDW(3vle^u;O8mV3A3@8xX8-0DckKC+RgFC>^^?Wf+3pAfFJ#QfgxL`=tTUh* zW?pIc)MWYrjSxM0`uV#M)|j{~{qr8O9^IJ9etFAq4vDo45BSR<+tMFOLDG@mCjzxY z6YfkZ0>*VCe`*UB9>#wUGJZKc^(r(@`6fT`24wxlvL<;p_H2k@znf=u?vRvn$6r;4 zCvOHU@Dkj=29l=F#cNTf7Y|S%29g|C0ubSYhvVq4!G6SFR4sp@nFO51hC)}T7UxRV zO~J0+>nkDX-)Iw*B)Q30P|4P^sDJv*0j@Mwbx#<-@`O@{+|YSoa}Gb*vQ+?&^i1lL z<+t$$yXcwu&VU5l6?a5^54j68dF2ZDNzTi)$MYv8>w7T|ayLC4^T|q=Ft91xJttj{ z5xWO(Wow-(ps=mKP^W{^pK^Hf6W`QcOzRb>~VRXN=!^?69)_vvk;EmU@9gU$4Z2 z*iJuyVO|0~G`f$b4-rCfvNrOnj?}zEY1j%{>w-4Ms0YWE?){CUtJhd?ugtxcaODob zNhAB1bZbl;dH?r`SxHsE-`HzT7*9n8mDD{Y<-F3N8J-Uw5GmBt$YKjg1 zhZ`s#+0htFyO_A%Fz&RN{M}#<dC2oVqf^HPnyGXhiDF_?RR&y$<2?^_rky7+)`eL(0R&34v2*$l@2vKY*)jx3l zdYZB|ka9$| z%b(j@>ZFM88CL`p&4_JR3SJH<4GbIlgDE%)x2qH6^*v_(-ig8yhlH(+UVVU&{SeD z>~OS0RfTci_%{@oUUGC0UIj^%O@73YySa}KzXYG 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 80/94] 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 81/94] 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 82/94] 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 83/94] 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 84/94] 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 85/94] 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 86/94] 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 87/94] 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 88/94] 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 89/94] 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 90/94] 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 91/94] 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 92/94] 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("2GwwcCIf4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AF0D/4AHwAVKh4OHgIIB+BB9v4YC4BBzHAQOEj4ZEIOQUDBwcHDIv8IOJ6DBwc/IP5BHcBgAXgImMGowUC/wFBh5BlEwKqKfwhBF+AFHIOp9GZYJBjv5BLfwhBECghQBZYRBi8ALIWwXxIPq8CwJBwgYxBBhI4CQwRB0j///CPFIIwFFgE///wIMI7BIJJNC8BBIHYQFFIMI7DIJB9JX4TLBBYhBqAoZBGg4GBAAf8IEMAEoPAIJALBIPw1CBYJBGC4QAD8BAhGogLIfYRByGoQAGn//+BBIYtJBKHYRBJJoIAFR4gAcO4hBIAAzXCC4JZCh5B6R5AdIAC4jLIJZ9GRIhBgU5BBN/gSDg5B/IMYpGIP6VSC40/IMN/IKwFI+BBh8BBXHYSJBINMf//4IJi/CAAoLDADcDEQIIFIP5BSg5AF/jEfHAJB/HBBBQLgYACID5BbgF/IAXAIMAjIIKQIC+BAgAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AOj///4ROgf+AgU//gMFh4dD//wBA+AIKosGCJBBCF4I1DJoQdDn4EB4AIEg5BXC5omBIK8BFJxBHwBZOg/8vwEBv4yBZYYdBI4P/wK/Bh/4BAosBIKgmDIJcAIIQCCAA44B/BBCBAnAILUDIgUBEwYADIIc/XgJBQFIRBWHwTpCXIP/8BBIBYP/TAzUBLIRBDBAIsEILIjBGoJ3GIJiMBIIyVDILJoDgf+gBBK4AOCAAcBTAJBFBARBZj5BBOQP/RIQAGIIQCBII1/HYRBEBARB0gf/4BBFBAZBZeQMHUIRBC/4gFIJYFCIIoOEIK0/HAMH/gsDAoZBGv/ATAIdEAoUB/4OJIKi/BHAQEBUgN/BAYABaIfgh4DBGQoMCMQQdBBAeBAYSPBIKbCCj6kCGoIQEIIh3BaIpBECIIdBILQA/AH4A/AH4A/AH4A/ABsf/4AB/0A/gXQgYUBIP5B/INQABn4DCIP5B/IIl+AYICBj/wn8fwAIBh/AAYMH8ZBBgfx/5HDDQRBi////BBF/44CBgMAgIDBBAIDBBAIUBRkRBFFgZBD//AIIXgIJF/BwPwIMuAAoJBE8EOAoUH8EP/B6Bg/8I4LRCBwJBk/gFB8BBEBYUfaIQ4BIISJCBAP4j+AIOC5BYoJBIgP4TwJBxBYP8IJP/DQJBov/A/7FFAoKDBXgJBBI4JBBJoRBpF4JBFgYHBPoX//0AAYJBD8BBpGoTFFv/4CgRBCj5BnADhWBIHyPBIP7REAHt+IH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AANJkmSAQOAFctt23bAQQUOHwQCCyAsQuPHjlx4ATOHwYCDN5kEIIuSIB/jx04AQXgCZkGII+wCpY+EAQOT44rMgKACAQlwCpc2II+2ChUJII2SNxsOQAYCEChUNHwwCC7AVJHwqDDNxYQBQY9x4AVJHw4CDChECII6DBNxUECAKDInAVIgZBLsAVHiQ+DkAICyJuLCYUnSQcBQwZBIjY7D2AICIIdsVxItBoAJENxUBKofgBQgUCBAo4GPQpKDwCuIkmQBQsHNxMJS4wADCgMcBI0GIIXYMQyMGVwskJgxuDBIzZDPA8OTYIgGmxBCc44LDIJBsHNwZBJbIpuDQYNwGpB3GaIpBRgbyIIJcAQYOOILUBVxTyJgRBCCpMHQYz7DeA4ABjZBJpArJeQKDFIIWQCpMAQYxBCtgUJgZBGhJBMeQQHEiRBMQYNx4AHDhpBXeBLyDUwhBCVxKDIIIVgCpRBBWAhBNQZRBLQZJBM26DLj/+g6DRgf/4AXBQYs4IJARC//wn/guBBC3CDHAwf8h/HeQwaCIIhWDwP4C4J9DQZIpE8F+NAPwWBBBGJoKDPHAcB/HgIIkDQZApCNYV+n8DEwUOnCDL/7FBgZWCQZzFBIIqDLFIRBBDQJBCQZqbCCgaDNgZBHQZcfIIn8BwSDNTYRQEQZuBYoyDLNYRBCHYaDNIIX/QaEcgJBGQZYpCIIMH8f+QZ7dCgY7DQZrFBC4IODQZYpC//wFgOOQZ8DCgMAHYaDMVoQXBDoiDKCIUfwE/C4aDNAA6DMABCDLABKDJoAVKQZIHEAA3jQZFgCpSDJIJRWGIJ6DJIJdx44GEQcwGEQasBIINIQaMCIIOQCpMHQY0BIINsQaJBNKwxBOQY5BNgeOnAIFIINJKxaDFgBBBySDLuAIFm3btrcJTAKDFIIcgKxSDFIIdAFZE4QYxBD2CYKQZJBIbQ5BNgKYBQZJBJQYPABAsEIIMkTQ5WIgEJbhUOQYIgGgxBB2w2GTBIABIIWQd46DIgKaKCgMcFY5BC7CYIQY8AiSxCKxCDHbgckBIsDCgPgCo8bIIPbTBCDIgRBIQYRWHbgjvHTA5NCIJCDCuAWIYojIEKxLcDYoyDCCpLFIWAWACpEJkgLCQwaDBKxLcCDIagBAoKYJAAMN2wMDhiDECpLzBIIK0BBAbvITQhBDRILyCCpc2IIdsQYYVLgi0DCBYAEhDfDZZAAHgwEDIIYAQIIMkCiJBSAAcDtuwIScBIKTFFIM0SIIOAIM8btoqRIIiXTyVIINDFUgBBBoArTtgUTACsEyQWUIKsBkAVTyArUsBBqAH4AiA==")) 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 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 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 93/94] 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"} ], From fa77a67e31bae8ee4f8c084665fb552b1a30cb64 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Thu, 16 Dec 2021 15:07:06 +0000 Subject: [PATCH 94/94] now recommend 2v11 --- loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loader.js b/loader.js index 680cd0f94..768f5f38f 100644 --- a/loader.js +++ b/loader.js @@ -11,7 +11,7 @@ if (window.location.host=="banglejs.com") { 'This is not the official Bangle.js App Loader - you can try the Official Version here.'; } -var RECOMMENDED_VERSION = "2v10"; +var RECOMMENDED_VERSION = "2v11"; // could check http://www.espruino.com/json/BANGLEJS.json for this // We're only interested in Bangles