From 87f0ffcd96ee6c71432523b5d4ec3440fa757d96 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sat, 18 Dec 2021 00:08:04 +0100 Subject: [PATCH 001/122] widhwt: Ported to Bangle.js2 Tactically all that was needed was to state that it works with Bangle.js2. However the swipe gesture interfered with using the menu on Bangle.js2. So it has been deactivated and we recommend using Pattern Launcher instead. --- apps.json | 7 ++++--- apps/widhwt/ChangeLog | 1 + apps/widhwt/app.js | 11 +++++++++++ apps/widhwt/widget.js | 14 ++++++++++---- 4 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 apps/widhwt/app.js diff --git a/apps.json b/apps.json index 8b4e86d52..f69889d50 100644 --- a/apps.json +++ b/apps.json @@ -1889,12 +1889,13 @@ { "id": "widhwt", "name": "Hand Wash Timer", - "version": "0.01", - "description": "Swipe your wrist over the watch face to start your personal Bangle.js hand wash timer for 35 sec. Start washing after the short buzz and stop after the long buzz.", + "version": "0.02-rc6", + "description": "On Bangle.js 1 swipe your wrist over the watch face to start your personal Bangle.js 1 hand wash timer. On Bangle.js2 the Pattern Launcher is recommended to start the timer. Start washing after the short buzz and stop after the long buzz 35sec. later.", "icon": "widget.png", "type": "widget", "tags": "widget,tool", - "supports": ["BANGLEJS"], + "allow_emulator": true, + "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ {"name":"widhwt.wid.js","url":"widget.js"} ] diff --git a/apps/widhwt/ChangeLog b/apps/widhwt/ChangeLog index 4c21f3ace..76c4fcec9 100644 --- a/apps/widhwt/ChangeLog +++ b/apps/widhwt/ChangeLog @@ -1 +1,2 @@ 0.01: New Widget! +0.02: Ported to Bangle.js2 diff --git a/apps/widhwt/app.js b/apps/widhwt/app.js new file mode 100644 index 000000000..68555d21d --- /dev/null +++ b/apps/widhwt/app.js @@ -0,0 +1,11 @@ +// Replace the "Loading..." box +// with our own message +g.clearRect(38, 68, 138, 108); +g.drawRect(38, 68, 138, 108); +g.setFontVector(13).drawString("Wash...", 60, 82); + +Bangle.buzz(); +setTimeout(() => { + Bangle.buzz(1E3, 1); + setTimeout(() => load(), 2E3); +}, 35E3); diff --git a/apps/widhwt/widget.js b/apps/widhwt/widget.js index d178a5b5d..5e1f95a41 100644 --- a/apps/widhwt/widget.js +++ b/apps/widhwt/widget.js @@ -6,9 +6,7 @@ g.reset().setColor(color).drawImage(require("heatshrink").decompress(atob("jEYwIKHgwCBhwCBh4CEggPCkACBmAXDBwVZ+EB+F4gEsjl8EgMP+EChk/gEMh+ehkA+YIBxwxBnF/4HggH/wEAj0AA==")), this.x + 1, 0); } - WIDGETS["widhwt"] = { area: "tr", width: 26, draw: draw }; - - Bangle.on('swipe', function() { + function startTimer() { color = 0x41f; Bangle.buzz(); Bangle.drawWidgets(); @@ -17,6 +15,14 @@ Bangle.buzz(1E3, 1); Bangle.drawWidgets(); }, 35E3); + } - }); + if (process.env.HWVERSION == 1) { + WIDGETS["widhwt"] = { + area: "tr", + width: 26, + draw: draw, + }; + Bangle.on('swipe', startTimer); + } })(); From d51c6679fe342ccb6058184b345ebc4e4816a98c Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sat, 18 Dec 2021 14:57:19 +0100 Subject: [PATCH 002/122] Bumped hwt version number --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index f69889d50..b4acc8f0c 100644 --- a/apps.json +++ b/apps.json @@ -1889,7 +1889,7 @@ { "id": "widhwt", "name": "Hand Wash Timer", - "version": "0.02-rc6", + "version": "0.02-rc7", "description": "On Bangle.js 1 swipe your wrist over the watch face to start your personal Bangle.js 1 hand wash timer. On Bangle.js2 the Pattern Launcher is recommended to start the timer. Start washing after the short buzz and stop after the long buzz 35sec. later.", "icon": "widget.png", "type": "widget", From c5536ee49a6508da2e7a1fac1298bdf9ed00ddba Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sat, 18 Dec 2021 17:37:04 +0100 Subject: [PATCH 003/122] hwt: Center "Wash ..." text properly --- apps.json | 2 +- apps/widhwt/app.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index b4acc8f0c..092584ecf 100644 --- a/apps.json +++ b/apps.json @@ -1889,7 +1889,7 @@ { "id": "widhwt", "name": "Hand Wash Timer", - "version": "0.02-rc7", + "version": "0.02-rc8", "description": "On Bangle.js 1 swipe your wrist over the watch face to start your personal Bangle.js 1 hand wash timer. On Bangle.js2 the Pattern Launcher is recommended to start the timer. Start washing after the short buzz and stop after the long buzz 35sec. later.", "icon": "widget.png", "type": "widget", diff --git a/apps/widhwt/app.js b/apps/widhwt/app.js index 68555d21d..2aaf7f08a 100644 --- a/apps/widhwt/app.js +++ b/apps/widhwt/app.js @@ -2,7 +2,9 @@ // with our own message g.clearRect(38, 68, 138, 108); g.drawRect(38, 68, 138, 108); -g.setFontVector(13).drawString("Wash...", 60, 82); +g.setFontVector(13).setFontAlign(0, 0, 0).drawString("Wash...", + g.getWidth()/2, + g.getHeight()/2); Bangle.buzz(); setTimeout(() => { From 51422c44c0fc89874b96fc893b3d06014de0f771 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sat, 18 Dec 2021 18:46:16 +0100 Subject: [PATCH 004/122] hwt: Reduce line lenght --- apps.json | 2 +- apps/widhwt/app.js | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index 092584ecf..cb991dbed 100644 --- a/apps.json +++ b/apps.json @@ -1889,7 +1889,7 @@ { "id": "widhwt", "name": "Hand Wash Timer", - "version": "0.02-rc8", + "version": "0.02-rc9", "description": "On Bangle.js 1 swipe your wrist over the watch face to start your personal Bangle.js 1 hand wash timer. On Bangle.js2 the Pattern Launcher is recommended to start the timer. Start washing after the short buzz and stop after the long buzz 35sec. later.", "icon": "widget.png", "type": "widget", diff --git a/apps/widhwt/app.js b/apps/widhwt/app.js index 2aaf7f08a..f18e78643 100644 --- a/apps/widhwt/app.js +++ b/apps/widhwt/app.js @@ -2,9 +2,9 @@ // with our own message g.clearRect(38, 68, 138, 108); g.drawRect(38, 68, 138, 108); -g.setFontVector(13).setFontAlign(0, 0, 0).drawString("Wash...", - g.getWidth()/2, - g.getHeight()/2); +g.setFontVector(13); +g.setFontAlign(0, 0, 0); +g.drawString("Wash...", g.getWidth()/2, g.getHeight()/2); Bangle.buzz(); setTimeout(() => { From 505ed38753a1a6611b9f5da7f4aa32789f0f69a0 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sat, 18 Dec 2021 22:14:26 +0100 Subject: [PATCH 005/122] hwt: Add app.js to apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index cb991dbed..d572a9aad 100644 --- a/apps.json +++ b/apps.json @@ -1889,7 +1889,7 @@ { "id": "widhwt", "name": "Hand Wash Timer", - "version": "0.02-rc9", + "version": "0.02-rc10", "description": "On Bangle.js 1 swipe your wrist over the watch face to start your personal Bangle.js 1 hand wash timer. On Bangle.js2 the Pattern Launcher is recommended to start the timer. Start washing after the short buzz and stop after the long buzz 35sec. later.", "icon": "widget.png", "type": "widget", @@ -1897,6 +1897,7 @@ "allow_emulator": true, "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ + {"name":"widhwt.app.js","url":"app.js"}, {"name":"widhwt.wid.js","url":"widget.js"} ] }, From 03a295a4ff40d9c664f155324d139ffb007e76eb Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 12:00:43 +0100 Subject: [PATCH 006/122] wohrm: prepare porting to Bangle.js2 --- apps.json | 4 ++-- apps/wohrm/README.md | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..07c773725 100644 --- a/apps.json +++ b/apps.json @@ -1714,12 +1714,12 @@ { "id": "wohrm", "name": "Workout HRM", - "version": "0.08", + "version": "0.09-rc1", "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", "icon": "app.png", "type": "app", "tags": "hrm,workout", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", "allow_emulator": true, "screenshots": [{"url":"bangle1-workout-HRM-screenshot.png"}], diff --git a/apps/wohrm/README.md b/apps/wohrm/README.md index ad9e82525..87b1a65da 100644 --- a/apps/wohrm/README.md +++ b/apps/wohrm/README.md @@ -8,6 +8,9 @@ and will notify you with a buzz whenever your heart rate falls below or jumps ab [Try it out](https://www.espruino.com/ide/emulator.html?codeurl=https://raw.githubusercontent.com/msdeibel/BangleApps/master/apps/wohrm/app.js&upload) using the [online Espruino emulator](https://www.espruino.com/ide/emulator.html). ## Setting the limits + +Use the settings menu to set the limits. On the Bangle.js1 these can in addition be set with the buttons: + For setting the lower limit press button 4 (left part of the watch's touch screen). Then adjust the value with the buttons 1 (top) and 3 (bottom) of the watch. @@ -22,7 +25,7 @@ the received value: For 85% and above the bars are green, between 84% and 50% th and below 50% they turn red. ## Closing the app -Pressing button 2 (middle) will switch off the HRM of the watch and return you to the launcher. +Pressing middle button will switch off the HRM of the watch and return you to the launcher. # HRM usage The HRM is switched on when the app is started. It stays switch on while the app is running, even From e91324c16bc9b10dde21e14468933a5500979d05 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 12:11:27 +0100 Subject: [PATCH 007/122] wohrm: Prevent crash on BangleJs2 --- apps/wohrm/app.js | 655 +++++++++++++++++++++++----------------------- 1 file changed, 328 insertions(+), 327 deletions(-) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index c9c060e99..01fcca63e 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -1,327 +1,328 @@ -/* eslint-disable no-undef */ -const Setter = { - NONE: "none", - UPPER: 'upper', - LOWER: 'lower' -}; - -const shortBuzzTimeInMs = 80; -const longBuzzTimeInMs = 400; - -let upperLimit = 130; -let upperLimitChanged = true; - -let lowerLimit = 100; -let lowerLimitChanged = true; - -let limitSetter = Setter.NONE; - -let currentHeartRate = 0; -let hrConfidence = -1; -let hrChanged = true; -let confidenceChanged = true; - -let setterHighlightTimeout; - -function renderUpperLimitBackground() { - g.setColor(1,0,0); - g.fillRect(125,40, 210, 70); - g.fillRect(180,70, 210, 200); - - //Round top left corner - g.fillEllipse(115,40,135,70); - - //Round top right corner - g.setColor(0,0,0); - g.fillRect(205,40, 210, 45); - g.setColor(1,0,0); - g.fillEllipse(190,40,210,50); - - //Round inner corner - g.fillRect(174,71, 179, 76); - g.setColor(0,0,0); - g.fillEllipse(160,71,179,82); - - //Round bottom - g.setColor(1,0,0); - g.fillEllipse(180,190, 210, 210); -} - -function renderLowerLimitBackground() { - g.setColor(0,0,1); - g.fillRect(10, 180, 100, 210); - g.fillRect(10, 50, 40, 180); - - //Rounded top - g.setColor(0,0,1); - g.fillEllipse(10,40, 40, 60); - - //Round bottom right corner - g.setColor(0,0,1); - g.fillEllipse(90,180,110,210); - - //Round inner corner - g.setColor(0,0,1); - g.fillRect(40,175,45,180); - g.setColor(0,0,0); - g.fillEllipse(41,170,60,179); - - //Round bottom left corner - g.setColor(0,0,0); - g.fillRect(10,205, 15, 210); - g.setColor(0,0,1); - g.fillEllipse(10,200,30,210); -} - -function drawTrainingHeartRate() { - //Only redraw if the display is on - if (Bangle.isLCDOn()) { - renderUpperLimit(); - - renderCurrentHeartRate(); - - renderLowerLimit(); - - renderConfidenceBars(); - } - - buzz(); -} - -function renderUpperLimit() { - if(!upperLimitChanged) { return; } - - g.setColor(1,0,0); - g.fillRect(125,40, 210, 70); - - if(limitSetter === Setter.UPPER){ - g.setColor(255,255, 0); - } else { - g.setColor(255,255,255); - } - g.setFontVector(13); - g.drawString("Upper: " + upperLimit, 125, 50); - - upperLimitChanged = false; -} - -function renderCurrentHeartRate() { - if(!hrChanged) { return; } - - g.setColor(255,255,255); - g.fillRect(55, 110, 165, 150); - - g.setColor(0,0,0); - g.setFontVector(24); - g.setFontAlign(1, -1, 0); - g.drawString(currentHeartRate, 130, 117); - - //Reset alignment to defaults - g.setFontAlign(-1, -1, 0); - - hrChanged = false; -} - -function renderLowerLimit() { - if(!lowerLimitChanged) { return; } - - g.setColor(0,0,1); - g.fillRect(10, 180, 100, 210); - - if(limitSetter === Setter.LOWER){ - g.setColor(255,255, 0); - } else { - g.setColor(255,255,255); - } - g.setFontVector(13); - g.drawString("Lower: " + lowerLimit, 20,190); - - lowerLimitChanged = false; -} - -function renderConfidenceBars(){ - if(!confidenceChanged) { return; } - - if(hrConfidence >= 85){ - g.setColor(0, 255, 0); - } else if (hrConfidence >= 50) { - g.setColor(255, 255, 0); - } else if(hrConfidence >= 0){ - g.setColor(255, 0, 0); - } else { - g.setColor(255, 255, 255); - } - - g.fillRect(45, 110, 55, 150); - g.fillRect(165, 110, 175, 150); - - confidenceChanged = false; -} - -function renderPlusMinusIcons() { - if (limitSetter === Setter.NONE) { - g.setColor(0, 0, 0); - } else { - g.setColor(1, 1, 1); - } - - g.setFontVector(14); - - //+ for Btn1 - g.drawString("+", 222, 50); - - //- for Btn3 - g.drawString("-", 222,165); - - return; -} - -function renderHomeIcon() { - //Home for Btn2 - g.setColor(1, 1, 1); - g.drawLine(220, 118, 227, 110); - g.drawLine(227, 110, 234, 118); - - g.drawPoly([222,117,222,125,232,125,232,117], false); - g.drawRect(226,120,229,125); -} - -function buzz() { - // Do not buzz if not confident - if(hrConfidence < 85) { return; } - - if(currentHeartRate > upperLimit) - { - Bangle.buzz(shortBuzzTimeInMs); - setTimeout(() => { Bangle.buzz(shortBuzzTimeInMs); }, shortBuzzTimeInMs * 2); - } - - if(currentHeartRate < lowerLimit) - { - Bangle.buzz(longBuzzTimeInMs); - } -} - -function onHrm(hrm){ - if(currentHeartRate !== hrm.bpm){ - currentHeartRate = hrm.bpm; - hrChanged = true; - } - - if(hrConfidence !== hrm.confidence) { - hrConfidence = hrm.confidence; - confidenceChanged = true; - } -} - -function setLimitSetterToLower() { - resetHighlightTimeout(); - - limitSetter = Setter.LOWER; - - upperLimitChanged = true; - lowerLimitChanged = true; - - renderUpperLimit(); - renderLowerLimit(); - renderPlusMinusIcons(); -} - -function setLimitSetterToUpper() { - resetHighlightTimeout(); - - limitSetter = Setter.UPPER; - - upperLimitChanged = true; - lowerLimitChanged = true; - - renderLowerLimit(); - renderUpperLimit(); - renderPlusMinusIcons(); -} - -function setLimitSetterToNone() { - limitSetter = Setter.NONE; - - upperLimitChanged = true; - lowerLimitChanged = true; - - renderLowerLimit(); - renderUpperLimit(); - renderPlusMinusIcons(); -} - -function incrementLimit() { - resetHighlightTimeout(); - - if (limitSetter === Setter.UPPER) { - upperLimit++; - renderUpperLimit(); - upperLimitChanged = true; - } else if(limitSetter === Setter.LOWER) { - lowerLimit++; - renderLowerLimit(); - lowerLimitChanged = true; - } -} - -function decrementLimit(){ - resetHighlightTimeout(); - - if (limitSetter === Setter.UPPER) { - upperLimit--; - renderUpperLimit(); - upperLimitChanged = true; - } else if(limitSetter === Setter.LOWER) { - lowerLimit--; - renderLowerLimit(); - lowerLimitChanged = true; - } -} - -function resetHighlightTimeout() { - if (setterHighlightTimeout) { - clearTimeout(setterHighlightTimeout); - } - - setterHighlightTimeout = setTimeout(setLimitSetterToNone, 2000); -} - -function switchOffApp(){ - Bangle.setHRMPower(0,"wohrm"); - Bangle.showLauncher(); -} - -Bangle.on('lcdPower', (on) => { - g.clear(); - if (on) { - Bangle.drawWidgets(); - - renderHomeIcon(); - renderLowerLimitBackground(); - renderUpperLimitBackground(); - lowerLimitChanged = true; - upperLimitChanged = true; - drawTrainingHeartRate(); - } -}); - -Bangle.setHRMPower(1,"wohrm"); -Bangle.on('HRM', onHrm); - -setWatch(incrementLimit, BTN1, {edge:"rising", debounce:50, repeat:true}); -setWatch(decrementLimit, BTN3, {edge:"rising", debounce:50, repeat:true}); -setWatch(setLimitSetterToLower, BTN4, {edge:"rising", debounce:50, repeat:true}); -setWatch(setLimitSetterToUpper, BTN5, { edge: "rising", debounce: 50, repeat: true }); - -setWatch(switchOffApp, BTN2, {edge:"falling", debounce:50, repeat:true}); - -g.clear(); -Bangle.loadWidgets(); -Bangle.drawWidgets(); - -renderHomeIcon(); -renderLowerLimitBackground(); -renderUpperLimitBackground(); - -setInterval(drawTrainingHeartRate, 1000); +/* eslint-disable no-undef */ +const Setter = { + NONE: "none", + UPPER: 'upper', + LOWER: 'lower' +}; + +const shortBuzzTimeInMs = 80; +const longBuzzTimeInMs = 400; + +let upperLimit = 130; +let upperLimitChanged = true; + +let lowerLimit = 100; +let lowerLimitChanged = true; + +let limitSetter = Setter.NONE; + +let currentHeartRate = 0; +let hrConfidence = -1; +let hrChanged = true; +let confidenceChanged = true; + +let setterHighlightTimeout; + +function renderUpperLimitBackground() { + g.setColor(1,0,0); + g.fillRect(125,40, 210, 70); + g.fillRect(180,70, 210, 200); + + //Round top left corner + g.fillEllipse(115,40,135,70); + + //Round top right corner + g.setColor(0,0,0); + g.fillRect(205,40, 210, 45); + g.setColor(1,0,0); + g.fillEllipse(190,40,210,50); + + //Round inner corner + g.fillRect(174,71, 179, 76); + g.setColor(0,0,0); + g.fillEllipse(160,71,179,82); + + //Round bottom + g.setColor(1,0,0); + g.fillEllipse(180,190, 210, 210); +} + +function renderLowerLimitBackground() { + g.setColor(0,0,1); + g.fillRect(10, 180, 100, 210); + g.fillRect(10, 50, 40, 180); + + //Rounded top + g.setColor(0,0,1); + g.fillEllipse(10,40, 40, 60); + + //Round bottom right corner + g.setColor(0,0,1); + g.fillEllipse(90,180,110,210); + + //Round inner corner + g.setColor(0,0,1); + g.fillRect(40,175,45,180); + g.setColor(0,0,0); + g.fillEllipse(41,170,60,179); + + //Round bottom left corner + g.setColor(0,0,0); + g.fillRect(10,205, 15, 210); + g.setColor(0,0,1); + g.fillEllipse(10,200,30,210); +} + +function drawTrainingHeartRate() { + //Only redraw if the display is on + if (Bangle.isLCDOn()) { + renderUpperLimit(); + + renderCurrentHeartRate(); + + renderLowerLimit(); + + renderConfidenceBars(); + } + + buzz(); +} + +function renderUpperLimit() { + if(!upperLimitChanged) { return; } + + g.setColor(1,0,0); + g.fillRect(125,40, 210, 70); + + if(limitSetter === Setter.UPPER){ + g.setColor(255,255, 0); + } else { + g.setColor(255,255,255); + } + g.setFontVector(13); + g.drawString("Upper: " + upperLimit, 125, 50); + + upperLimitChanged = false; +} + +function renderCurrentHeartRate() { + if(!hrChanged) { return; } + + g.setColor(255,255,255); + g.fillRect(55, 110, 165, 150); + + g.setColor(0,0,0); + g.setFontVector(24); + g.setFontAlign(1, -1, 0); + g.drawString(currentHeartRate, 130, 117); + + //Reset alignment to defaults + g.setFontAlign(-1, -1, 0); + + hrChanged = false; +} + +function renderLowerLimit() { + if(!lowerLimitChanged) { return; } + + g.setColor(0,0,1); + g.fillRect(10, 180, 100, 210); + + if(limitSetter === Setter.LOWER){ + g.setColor(255,255, 0); + } else { + g.setColor(255,255,255); + } + g.setFontVector(13); + g.drawString("Lower: " + lowerLimit, 20,190); + + lowerLimitChanged = false; +} + +function renderConfidenceBars(){ + if(!confidenceChanged) { return; } + + if(hrConfidence >= 85){ + g.setColor(0, 255, 0); + } else if (hrConfidence >= 50) { + g.setColor(255, 255, 0); + } else if(hrConfidence >= 0){ + g.setColor(255, 0, 0); + } else { + g.setColor(255, 255, 255); + } + + g.fillRect(45, 110, 55, 150); + g.fillRect(165, 110, 175, 150); + + confidenceChanged = false; +} + +function renderPlusMinusIcons() { + if (limitSetter === Setter.NONE) { + g.setColor(0, 0, 0); + } else { + g.setColor(1, 1, 1); + } + + g.setFontVector(14); + + //+ for Btn1 + g.drawString("+", 222, 50); + + //- for Btn3 + g.drawString("-", 222,165); + + return; +} + +function renderHomeIcon() { + //Home for Btn2 + g.setColor(1, 1, 1); + g.drawLine(220, 118, 227, 110); + g.drawLine(227, 110, 234, 118); + + g.drawPoly([222,117,222,125,232,125,232,117], false); + g.drawRect(226,120,229,125); +} + +function buzz() { + // Do not buzz if not confident + if(hrConfidence < 85) { return; } + + if(currentHeartRate > upperLimit) + { + Bangle.buzz(shortBuzzTimeInMs); + setTimeout(() => { Bangle.buzz(shortBuzzTimeInMs); }, shortBuzzTimeInMs * 2); + } + + if(currentHeartRate < lowerLimit) + { + Bangle.buzz(longBuzzTimeInMs); + } +} + +function onHrm(hrm){ + if(currentHeartRate !== hrm.bpm){ + currentHeartRate = hrm.bpm; + hrChanged = true; + } + + if(hrConfidence !== hrm.confidence) { + hrConfidence = hrm.confidence; + confidenceChanged = true; + } +} + +function setLimitSetterToLower() { + resetHighlightTimeout(); + + limitSetter = Setter.LOWER; + + upperLimitChanged = true; + lowerLimitChanged = true; + + renderUpperLimit(); + renderLowerLimit(); + renderPlusMinusIcons(); +} + +function setLimitSetterToUpper() { + resetHighlightTimeout(); + + limitSetter = Setter.UPPER; + + upperLimitChanged = true; + lowerLimitChanged = true; + + renderLowerLimit(); + renderUpperLimit(); + renderPlusMinusIcons(); +} + +function setLimitSetterToNone() { + limitSetter = Setter.NONE; + + upperLimitChanged = true; + lowerLimitChanged = true; + + renderLowerLimit(); + renderUpperLimit(); + renderPlusMinusIcons(); +} + +function incrementLimit() { + resetHighlightTimeout(); + + if (limitSetter === Setter.UPPER) { + upperLimit++; + renderUpperLimit(); + upperLimitChanged = true; + } else if(limitSetter === Setter.LOWER) { + lowerLimit++; + renderLowerLimit(); + lowerLimitChanged = true; + } +} + +function decrementLimit(){ + resetHighlightTimeout(); + + if (limitSetter === Setter.UPPER) { + upperLimit--; + renderUpperLimit(); + upperLimitChanged = true; + } else if(limitSetter === Setter.LOWER) { + lowerLimit--; + renderLowerLimit(); + lowerLimitChanged = true; + } +} + +function resetHighlightTimeout() { + if (setterHighlightTimeout) { + clearTimeout(setterHighlightTimeout); + } + + setterHighlightTimeout = setTimeout(setLimitSetterToNone, 2000); +} + +function switchOffApp(){ + Bangle.setHRMPower(0,"wohrm"); + Bangle.showLauncher(); +} + +Bangle.on('lcdPower', (on) => { + g.clear(); + if (on) { + Bangle.drawWidgets(); + + renderHomeIcon(); + renderLowerLimitBackground(); + renderUpperLimitBackground(); + lowerLimitChanged = true; + upperLimitChanged = true; + drawTrainingHeartRate(); + } +}); + +Bangle.setHRMPower(1,"wohrm"); +Bangle.on('HRM', onHrm); + +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +renderLowerLimitBackground(); +renderUpperLimitBackground(); + +if (typeof(BTN5) !== typeof(undefined)) { + renderHomeIcon(); + setWatch(incrementLimit, BTN1, {edge:"rising", debounce:50, repeat:true}); + setWatch(decrementLimit, BTN3, {edge:"rising", debounce:50, repeat:true}); + setWatch(setLimitSetterToLower, BTN4, {edge:"rising", debounce:50, repeat:true}); + setWatch(setLimitSetterToUpper, BTN5, { edge: "rising", debounce: 50, repeat: true }); + + setWatch(switchOffApp, BTN2, {edge:"falling", debounce:50, repeat:true}); +} + +setInterval(drawTrainingHeartRate, 1000); From e98690a8533eefd23d23cd017b65c3b2def73aa1 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 14:10:08 +0100 Subject: [PATCH 008/122] wohrm: parameterized renderUpperLimitBackground() --- apps/wohrm/app.js | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index 01fcca63e..ba037fc7c 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -24,27 +24,45 @@ let confidenceChanged = true; let setterHighlightTimeout; function renderUpperLimitBackground() { - g.setColor(1,0,0); - g.fillRect(125,40, 210, 70); - g.fillRect(180,70, 210, 200); + var minX=125; + var maxX=210; + var minY=40; + var maxY=210; + var rectWidth=30; + var cornerRoundness=5; + var bgColor = 0; + var fgColor = '#f00'; + g.setColor(fgColor); + + g.fillRect(minX,minY, maxX, minY+rectWidth); + g.fillRect(maxX-rectWidth, minY+rectWidth, maxX, maxY-cornerRoundness*2); //Round top left corner - g.fillEllipse(115,40,135,70); + g.fillEllipse(minX-cornerRoundness*2, + minY, + minX+cornerRoundness*2, + minY+rectWidth); //Round top right corner - g.setColor(0,0,0); - g.fillRect(205,40, 210, 45); - g.setColor(1,0,0); - g.fillEllipse(190,40,210,50); + g.setColor(bgColor); + g.fillRect(maxX-cornerRoundness,minY, maxX, minY+cornerRoundness); + g.setColor(fgColor); + g.fillEllipse(maxX-cornerRoundness*4,minY,maxX,minY+cornerRoundness*2); //Round inner corner - g.fillRect(174,71, 179, 76); - g.setColor(0,0,0); - g.fillEllipse(160,71,179,82); + g.fillRect(maxX-rectWidth-cornerRoundness-1, + minY+rectWidth+1, + maxX-rectWidth-1, + minY+rectWidth+cornerRoundness-1); + g.setColor(bgColor); + g.fillEllipse(maxX-rectWidth-cornerRoundness*4, + minY+rectWidth+1, + maxX-rectWidth-1, + minY+rectWidth+cornerRoundness*3-1); //Round bottom - g.setColor(1,0,0); - g.fillEllipse(180,190, 210, 210); + g.setColor(fgColor); + g.fillEllipse(maxX-rectWidth,maxY-cornerRoundness*4, maxX, maxY); } function renderLowerLimitBackground() { From 8c4f37e991fc3ab17ea6c24b7d15d813dc343b53 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 14:30:12 +0100 Subject: [PATCH 009/122] wohrm: renderLshape() from renderUpperLimitBackground() --- apps/wohrm/app.js | 69 ++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index ba037fc7c..e73307773 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -23,46 +23,49 @@ let confidenceChanged = true; let setterHighlightTimeout; -function renderUpperLimitBackground() { - var minX=125; - var maxX=210; - var minY=40; - var maxY=210; - var rectWidth=30; - var cornerRoundness=5; - var bgColor = 0; - var fgColor = '#f00'; - g.setColor(fgColor); +const upperLshape = { + minX: 125, + maxX: 210, + minY: 40, + maxY: 210, + rectWidth: 30, + cornerRoundness: 5, + bgColor: 0, + fgColor: '#f00' +}; - g.fillRect(minX,minY, maxX, minY+rectWidth); - g.fillRect(maxX-rectWidth, minY+rectWidth, maxX, maxY-cornerRoundness*2); +function renderLshape(p) { + g.setColor(p.fgColor); + + g.fillRect(p.minX,p.minY, p.maxX, p.minY+p.rectWidth); + g.fillRect(p.maxX-p.rectWidth, p.minY+p.rectWidth, p.maxX, p.maxY-p.cornerRoundness*2); //Round top left corner - g.fillEllipse(minX-cornerRoundness*2, - minY, - minX+cornerRoundness*2, - minY+rectWidth); + g.fillEllipse(p.minX-p.cornerRoundness*2, + p.minY, + p.minX+p.cornerRoundness*2, + p.minY+p.rectWidth); //Round top right corner - g.setColor(bgColor); - g.fillRect(maxX-cornerRoundness,minY, maxX, minY+cornerRoundness); - g.setColor(fgColor); - g.fillEllipse(maxX-cornerRoundness*4,minY,maxX,minY+cornerRoundness*2); + g.setColor(p.bgColor); + g.fillRect(p.maxX-p.cornerRoundness,p.minY, p.maxX, p.minY+p.cornerRoundness); + g.setColor(p.fgColor); + g.fillEllipse(p.maxX-p.cornerRoundness*4,p.minY,p.maxX,p.minY+p.cornerRoundness*2); //Round inner corner - g.fillRect(maxX-rectWidth-cornerRoundness-1, - minY+rectWidth+1, - maxX-rectWidth-1, - minY+rectWidth+cornerRoundness-1); - g.setColor(bgColor); - g.fillEllipse(maxX-rectWidth-cornerRoundness*4, - minY+rectWidth+1, - maxX-rectWidth-1, - minY+rectWidth+cornerRoundness*3-1); + g.fillRect(p.maxX-p.rectWidth-p.cornerRoundness-1, + p.minY+p.rectWidth+1, + p.maxX-p.rectWidth-1, + p.minY+p.rectWidth+p.cornerRoundness-1); + g.setColor(p.bgColor); + g.fillEllipse(p.maxX-p.rectWidth-p.cornerRoundness*4, + p.minY+p.rectWidth+1, + p.maxX-p.rectWidth-1, + p.minY+p.rectWidth+p.cornerRoundness*3-1); //Round bottom - g.setColor(fgColor); - g.fillEllipse(maxX-rectWidth,maxY-cornerRoundness*4, maxX, maxY); + g.setColor(p.fgColor); + g.fillEllipse(p.maxX-p.rectWidth,p.maxY-p.cornerRoundness*4, p.maxX, p.maxY); } function renderLowerLimitBackground() { @@ -317,7 +320,7 @@ Bangle.on('lcdPower', (on) => { renderHomeIcon(); renderLowerLimitBackground(); - renderUpperLimitBackground(); + renderLshape(upperLshape); lowerLimitChanged = true; upperLimitChanged = true; drawTrainingHeartRate(); @@ -331,7 +334,7 @@ g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); renderLowerLimitBackground(); -renderUpperLimitBackground(); +renderLshape(upperLshape); if (typeof(BTN5) !== typeof(undefined)) { renderHomeIcon(); From f4a7a4f77e78a24cb26490f100e29bdf75e02676 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 15:28:26 +0100 Subject: [PATCH 010/122] wohrt: removed renderLowerLimitBackground() --- apps/wohrm/app.js | 102 ++++++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 48 deletions(-) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index e73307773..638627e17 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -30,68 +30,74 @@ const upperLshape = { maxY: 210, rectWidth: 30, cornerRoundness: 5, + orientation: -1, bgColor: 0, fgColor: '#f00' }; +const lowerLshape = { + maxX: 10, + minX: 100, + minY: 210, + maxY: 40, + rectWidth: 30, + cornerRoundness: 5, + orientation: 1, + bgColor: 0, + fgColor: '#00f' +}; + +function fillEllipse(x, y, x2, y2) { + g.fillEllipse(Math.min(x, x2), + Math.min(y, y2), + Math.max(x, x2), + Math.max(y, y2)); +} + function renderLshape(p) { g.setColor(p.fgColor); - g.fillRect(p.minX,p.minY, p.maxX, p.minY+p.rectWidth); - g.fillRect(p.maxX-p.rectWidth, p.minY+p.rectWidth, p.maxX, p.maxY-p.cornerRoundness*2); + g.fillRect(p.minX, p.minY, p.maxX, p.minY-p.orientation*p.rectWidth); + g.fillRect(p.maxX+p.orientation*p.rectWidth, + p.minY-p.orientation*p.rectWidth, + p.maxX, + p.maxY+p.orientation*p.cornerRoundness*2); - //Round top left corner - g.fillEllipse(p.minX-p.cornerRoundness*2, - p.minY, - p.minX+p.cornerRoundness*2, - p.minY+p.rectWidth); + //Round end of small line + fillEllipse(p.minX+p.orientation*p.cornerRoundness*2, + p.minY, + p.minX-p.orientation*p.cornerRoundness*2, + p.minY-p.orientation*p.rectWidth); - //Round top right corner + //Round outer corner g.setColor(p.bgColor); - g.fillRect(p.maxX-p.cornerRoundness,p.minY, p.maxX, p.minY+p.cornerRoundness); + g.fillRect(p.maxX+p.orientation*p.cornerRoundness, + p.minY, + p.maxX, + p.minY-p.orientation*p.cornerRoundness); g.setColor(p.fgColor); - g.fillEllipse(p.maxX-p.cornerRoundness*4,p.minY,p.maxX,p.minY+p.cornerRoundness*2); + fillEllipse(p.maxX+p.orientation*p.cornerRoundness*4, + p.minY, + p.maxX, + p.minY-p.orientation*p.cornerRoundness*2); //Round inner corner - g.fillRect(p.maxX-p.rectWidth-p.cornerRoundness-1, - p.minY+p.rectWidth+1, - p.maxX-p.rectWidth-1, - p.minY+p.rectWidth+p.cornerRoundness-1); + g.fillRect(p.maxX+p.orientation*(p.rectWidth+p.cornerRoundness+1), + p.minY-p.orientation*(p.rectWidth+1), + p.maxX+p.orientation*(p.rectWidth+1), + p.minY-p.orientation*(p.rectWidth+p.cornerRoundness-1)); g.setColor(p.bgColor); - g.fillEllipse(p.maxX-p.rectWidth-p.cornerRoundness*4, - p.minY+p.rectWidth+1, - p.maxX-p.rectWidth-1, - p.minY+p.rectWidth+p.cornerRoundness*3-1); + fillEllipse(p.maxX+p.orientation*(p.rectWidth+p.cornerRoundness*4), + p.minY-p.orientation*(p.rectWidth+1), + p.maxX+p.orientation*(p.rectWidth+1), + p.minY-p.orientation*(p.rectWidth+p.cornerRoundness*3-1)); - //Round bottom + //Round end of long line g.setColor(p.fgColor); - g.fillEllipse(p.maxX-p.rectWidth,p.maxY-p.cornerRoundness*4, p.maxX, p.maxY); -} - -function renderLowerLimitBackground() { - g.setColor(0,0,1); - g.fillRect(10, 180, 100, 210); - g.fillRect(10, 50, 40, 180); - - //Rounded top - g.setColor(0,0,1); - g.fillEllipse(10,40, 40, 60); - - //Round bottom right corner - g.setColor(0,0,1); - g.fillEllipse(90,180,110,210); - - //Round inner corner - g.setColor(0,0,1); - g.fillRect(40,175,45,180); - g.setColor(0,0,0); - g.fillEllipse(41,170,60,179); - - //Round bottom left corner - g.setColor(0,0,0); - g.fillRect(10,205, 15, 210); - g.setColor(0,0,1); - g.fillEllipse(10,200,30,210); + fillEllipse(p.maxX+p.orientation*p.rectWidth, + p.maxY+p.orientation*p.cornerRoundness*4, + p.maxX, + p.maxY); } function drawTrainingHeartRate() { @@ -319,7 +325,7 @@ Bangle.on('lcdPower', (on) => { Bangle.drawWidgets(); renderHomeIcon(); - renderLowerLimitBackground(); + renderLshape(lowerLshape); renderLshape(upperLshape); lowerLimitChanged = true; upperLimitChanged = true; @@ -333,7 +339,7 @@ Bangle.on('HRM', onHrm); g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); -renderLowerLimitBackground(); +renderLshape(lowerLshape); renderLshape(upperLshape); if (typeof(BTN5) !== typeof(undefined)) { From 3e0e590b86a3a2282fd22ca03c37232410a35d94 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 15:41:06 +0100 Subject: [PATCH 011/122] Add home buttom for Bangle.js2 --- apps/wohrm/app.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index 638627e17..de3db14e2 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -350,6 +350,8 @@ if (typeof(BTN5) !== typeof(undefined)) { setWatch(setLimitSetterToUpper, BTN5, { edge: "rising", debounce: 50, repeat: true }); setWatch(switchOffApp, BTN2, {edge:"falling", debounce:50, repeat:true}); +} else { + setWatch(switchOffApp, BTN1, {edge:"falling", debounce:50, repeat:true}); } setInterval(drawTrainingHeartRate, 1000); From 616f1f784f8780adce5f586ecc51e54b0c8a1a2a Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 15:46:56 +0100 Subject: [PATCH 012/122] wohrm: Don't draw home-icon on Banglejs2 --- apps/wohrm/app.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index de3db14e2..8e041fa98 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -320,11 +320,13 @@ function switchOffApp(){ } Bangle.on('lcdPower', (on) => { - g.clear(); if (on) { + g.clear(); Bangle.drawWidgets(); - renderHomeIcon(); + if (typeof(BTN5) !== typeof(undefined)) { + renderHomeIcon(); + } renderLshape(lowerLshape); renderLshape(upperLshape); lowerLimitChanged = true; From 9f33ded981cb117537350698292509eac4f4e24b Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 15:56:03 +0100 Subject: [PATCH 013/122] wohrm: Fixed rounding of outer corner --- apps/wohrm/app.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index 8e041fa98..0681a3b33 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -118,8 +118,7 @@ function drawTrainingHeartRate() { function renderUpperLimit() { if(!upperLimitChanged) { return; } - g.setColor(1,0,0); - g.fillRect(125,40, 210, 70); + renderLshape(upperLshape); if(limitSetter === Setter.UPPER){ g.setColor(255,255, 0); @@ -152,8 +151,7 @@ function renderCurrentHeartRate() { function renderLowerLimit() { if(!lowerLimitChanged) { return; } - g.setColor(0,0,1); - g.fillRect(10, 180, 100, 210); + renderLshape(lowerLshape); if(limitSetter === Setter.LOWER){ g.setColor(255,255, 0); @@ -341,8 +339,6 @@ Bangle.on('HRM', onHrm); g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); -renderLshape(lowerLshape); -renderLshape(upperLshape); if (typeof(BTN5) !== typeof(undefined)) { renderHomeIcon(); From 0d172f1db04b957f6b9520b61affde4f6952e92c Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 16:23:56 +0100 Subject: [PATCH 014/122] wohrm: place Upper/Lower relative to "L" --- apps/wohrm/app.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index 0681a3b33..f761c421e 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -125,8 +125,10 @@ function renderUpperLimit() { } else { g.setColor(255,255,255); } - g.setFontVector(13); - g.drawString("Upper: " + upperLimit, 125, 50); + g.setFontVector(13).setFontAlign(-1, 0, 0); + g.drawString("Upper: " + upperLimit, + upperLshape.minX, + upperLshape.minY+upperLshape.rectWidth/2); upperLimitChanged = false; } @@ -158,8 +160,10 @@ function renderLowerLimit() { } else { g.setColor(255,255,255); } - g.setFontVector(13); - g.drawString("Lower: " + lowerLimit, 20,190); + g.setFontVector(13).setFontAlign(-1, 0, 0); + g.drawString("Lower: " + lowerLimit, + lowerLshape.maxX + lowerLshape.rectWidth/2, + lowerLshape.minY - lowerLshape.rectWidth/2); lowerLimitChanged = false; } From 09e7330ae0547eaa5270e2a175756167e04ccb2d Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 17:25:05 +0100 Subject: [PATCH 015/122] wohrm: parameterized centerBar --- apps/wohrm/app.js | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index f761c421e..ef4a3013d 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -47,6 +47,14 @@ const lowerLshape = { fgColor: '#00f' }; +const centerBar = { + minY: (upperLshape.minY + upperLshape.maxY - upperLshape.rectWidth)/2, + maxY: (upperLshape.minY + upperLshape.maxY + upperLshape.rectWidth)/2, + confidenceWidth: 10, + minX: 55, + maxX: 165 +}; + function fillEllipse(x, y, x2, y2) { g.fillEllipse(Math.min(x, x2), Math.min(y, y2), @@ -136,13 +144,16 @@ function renderUpperLimit() { function renderCurrentHeartRate() { if(!hrChanged) { return; } - g.setColor(255,255,255); - g.fillRect(55, 110, 165, 150); + g.setColor(1, 1, 1); + g.fillRect(centerBar.minX, centerBar.minY, + centerBar.maxX, centerBar.maxY); g.setColor(0,0,0); g.setFontVector(24); - g.setFontAlign(1, -1, 0); - g.drawString(currentHeartRate, 130, 117); + g.setFontAlign(1, 0, 0); + g.drawString(currentHeartRate, + upperLshape.minX+upperLshape.cornerRoundness, + (centerBar.minY+centerBar.maxY)/2); //Reset alignment to defaults g.setFontAlign(-1, -1, 0); @@ -181,8 +192,8 @@ function renderConfidenceBars(){ g.setColor(255, 255, 255); } - g.fillRect(45, 110, 55, 150); - g.fillRect(165, 110, 175, 150); + g.fillRect(centerBar.minX-centerBar.confidenceWidth, centerBar.minY, centerBar.minX, centerBar.maxY); + g.fillRect(centerBar.maxX, centerBar.minY, centerBar.maxX+centerBar.confidenceWidth, centerBar.maxY); confidenceChanged = false; } From 0456843385231a1e817100386adf24026065204a Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 17:45:38 +0100 Subject: [PATCH 016/122] wohrm: Use theme colors --- apps/wohrm/app.js | 40 +++++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index ef4a3013d..63194f390 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -31,8 +31,7 @@ const upperLshape = { rectWidth: 30, cornerRoundness: 5, orientation: -1, - bgColor: 0, - fgColor: '#f00' + color: '#f00' }; const lowerLshape = { @@ -43,8 +42,7 @@ const lowerLshape = { rectWidth: 30, cornerRoundness: 5, orientation: 1, - bgColor: 0, - fgColor: '#00f' + color: '#00f' }; const centerBar = { @@ -63,7 +61,7 @@ function fillEllipse(x, y, x2, y2) { } function renderLshape(p) { - g.setColor(p.fgColor); + g.setColor(p.color); g.fillRect(p.minX, p.minY, p.maxX, p.minY-p.orientation*p.rectWidth); g.fillRect(p.maxX+p.orientation*p.rectWidth, @@ -78,12 +76,12 @@ function renderLshape(p) { p.minY-p.orientation*p.rectWidth); //Round outer corner - g.setColor(p.bgColor); + g.setColor(g.theme.bg); g.fillRect(p.maxX+p.orientation*p.cornerRoundness, p.minY, p.maxX, p.minY-p.orientation*p.cornerRoundness); - g.setColor(p.fgColor); + g.setColor(p.color); fillEllipse(p.maxX+p.orientation*p.cornerRoundness*4, p.minY, p.maxX, @@ -94,14 +92,14 @@ function renderLshape(p) { p.minY-p.orientation*(p.rectWidth+1), p.maxX+p.orientation*(p.rectWidth+1), p.minY-p.orientation*(p.rectWidth+p.cornerRoundness-1)); - g.setColor(p.bgColor); + g.setColor(g.theme.bg); fillEllipse(p.maxX+p.orientation*(p.rectWidth+p.cornerRoundness*4), p.minY-p.orientation*(p.rectWidth+1), p.maxX+p.orientation*(p.rectWidth+1), p.minY-p.orientation*(p.rectWidth+p.cornerRoundness*3-1)); //Round end of long line - g.setColor(p.fgColor); + g.setColor(p.color); fillEllipse(p.maxX+p.orientation*p.rectWidth, p.maxY+p.orientation*p.cornerRoundness*4, p.maxX, @@ -129,9 +127,9 @@ function renderUpperLimit() { renderLshape(upperLshape); if(limitSetter === Setter.UPPER){ - g.setColor(255,255, 0); + g.setColor(1,1,0); } else { - g.setColor(255,255,255); + g.setColor(g.theme.fg); } g.setFontVector(13).setFontAlign(-1, 0, 0); g.drawString("Upper: " + upperLimit, @@ -144,11 +142,11 @@ function renderUpperLimit() { function renderCurrentHeartRate() { if(!hrChanged) { return; } - g.setColor(1, 1, 1); + g.setColor(g.theme.fg); g.fillRect(centerBar.minX, centerBar.minY, centerBar.maxX, centerBar.maxY); - g.setColor(0,0,0); + g.setColor(g.theme.bg); g.setFontVector(24); g.setFontAlign(1, 0, 0); g.drawString(currentHeartRate, @@ -167,9 +165,9 @@ function renderLowerLimit() { renderLshape(lowerLshape); if(limitSetter === Setter.LOWER){ - g.setColor(255,255, 0); + g.setColor(1,1,0); } else { - g.setColor(255,255,255); + g.setColor(g.theme.fg); } g.setFontVector(13).setFontAlign(-1, 0, 0); g.drawString("Lower: " + lowerLimit, @@ -183,13 +181,13 @@ function renderConfidenceBars(){ if(!confidenceChanged) { return; } if(hrConfidence >= 85){ - g.setColor(0, 255, 0); + g.setColor(0, 1, 0); } else if (hrConfidence >= 50) { - g.setColor(255, 255, 0); + g.setColor(1, 1, 0); } else if(hrConfidence >= 0){ - g.setColor(255, 0, 0); + g.setColor(1, 0, 0); } else { - g.setColor(255, 255, 255); + g.setColor(g.theme.fg); } g.fillRect(centerBar.minX-centerBar.confidenceWidth, centerBar.minY, centerBar.minX, centerBar.maxY); @@ -200,9 +198,9 @@ function renderConfidenceBars(){ function renderPlusMinusIcons() { if (limitSetter === Setter.NONE) { - g.setColor(0, 0, 0); + g.setColor(g.theme.bg); } else { - g.setColor(1, 1, 1); + g.setColor(g.theme.fg); } g.setFontVector(14); From b513772692f129ad676b8f1dac15ecdf1419ce8f Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 17:51:55 +0100 Subject: [PATCH 017/122] wohrm: parameterized font sizes --- apps/wohrm/app.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index 63194f390..bb21b5d59 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -53,6 +53,11 @@ const centerBar = { maxX: 165 }; +const fontSizes = { + limits: 13, + heartRate: 24 +}; + function fillEllipse(x, y, x2, y2) { g.fillEllipse(Math.min(x, x2), Math.min(y, y2), @@ -131,7 +136,7 @@ function renderUpperLimit() { } else { g.setColor(g.theme.fg); } - g.setFontVector(13).setFontAlign(-1, 0, 0); + g.setFontVector(fontSizes.limits).setFontAlign(-1, 0, 0); g.drawString("Upper: " + upperLimit, upperLshape.minX, upperLshape.minY+upperLshape.rectWidth/2); @@ -147,7 +152,7 @@ function renderCurrentHeartRate() { centerBar.maxX, centerBar.maxY); g.setColor(g.theme.bg); - g.setFontVector(24); + g.setFontVector(fontSizes.heartRate); g.setFontAlign(1, 0, 0); g.drawString(currentHeartRate, upperLshape.minX+upperLshape.cornerRoundness, @@ -169,7 +174,7 @@ function renderLowerLimit() { } else { g.setColor(g.theme.fg); } - g.setFontVector(13).setFontAlign(-1, 0, 0); + g.setFontVector(fontSizes.limits).setFontAlign(-1, 0, 0); g.drawString("Lower: " + lowerLimit, lowerLshape.maxX + lowerLshape.rectWidth/2, lowerLshape.minY - lowerLshape.rectWidth/2); From d5e08477e1692a7867f0c715070e58f0b7fddffd Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 17:59:57 +0100 Subject: [PATCH 018/122] wohrm: deduplicate --- apps/wohrm/app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index bb21b5d59..6ebcdabc3 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -37,10 +37,10 @@ const upperLshape = { const lowerLshape = { maxX: 10, minX: 100, - minY: 210, - maxY: 40, - rectWidth: 30, - cornerRoundness: 5, + minY: upperLshape.maxY, + maxY: upperLshape.minY, + rectWidth: upperLshape.rectWidth, + cornerRoundness: upperLshape.cornerRoundness, orientation: 1, color: '#00f' }; From b120f7572f454426ab8bb912830e758f177134dd Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 19:32:19 +0100 Subject: [PATCH 019/122] wohrm: resize on Bangls.js2 --- apps/wohrm/app.js | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index 6ebcdabc3..75d48c7ff 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -23,7 +23,8 @@ let confidenceChanged = true; let setterHighlightTimeout; -const upperLshape = { +const isB1 = process.env.HWVERSION==1; +const upperLshape = isB1 ? { minX: 125, maxX: 210, minY: 40, @@ -32,10 +33,19 @@ const upperLshape = { cornerRoundness: 5, orientation: -1, color: '#f00' +} : { + minX: Bangle.appRect.x2-100, + maxX: Bangle.appRect.x2, + minY: Bangle.appRect.y, + maxY: Bangle.appRect.y2, + rectWidth: 26, + cornerRoundness: 4, + orientation: -1, + color: '#f00' }; const lowerLshape = { - maxX: 10, + maxX: isB1 ? 10 : Bangle.appRect.x, minX: 100, minY: upperLshape.maxY, maxY: upperLshape.minY, @@ -48,14 +58,17 @@ const lowerLshape = { const centerBar = { minY: (upperLshape.minY + upperLshape.maxY - upperLshape.rectWidth)/2, maxY: (upperLshape.minY + upperLshape.maxY + upperLshape.rectWidth)/2, - confidenceWidth: 10, - minX: 55, - maxX: 165 + confidenceWidth: isB1 ? 10 : 8, + minX: isB1 ? 55 : upperLshape.rectWidth + 14, + maxX: isB1 ? 165 : Bangle.appRect.x2 - upperLshape.rectWidth - 14 }; -const fontSizes = { - limits: 13, - heartRate: 24 +const fontSizes = isB1 ? { + limits: 13, + heartRate: 24 +} : { + limits: 12, + heartRate: 20 }; function fillEllipse(x, y, x2, y2) { @@ -155,7 +168,8 @@ function renderCurrentHeartRate() { g.setFontVector(fontSizes.heartRate); g.setFontAlign(1, 0, 0); g.drawString(currentHeartRate, - upperLshape.minX+upperLshape.cornerRoundness, + Math.max(upperLshape.minX+upperLshape.cornerRoundness, + lowerLshape.minX-lowerLshape.cornerRoundness), (centerBar.minY+centerBar.maxY)/2); //Reset alignment to defaults From 3ae35376fcd3db363c33030b01d88e254a0781d5 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 20:45:11 +0100 Subject: [PATCH 020/122] wohrm: fixes after running on Bangle.js2 - set to dark theme as doesn't look good with white in the corners) - leave space for widgets --- apps.json | 2 +- apps/wohrm/app.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 07c773725..2acd3b981 100644 --- a/apps.json +++ b/apps.json @@ -1714,7 +1714,7 @@ { "id": "wohrm", "name": "Workout HRM", - "version": "0.09-rc1", + "version": "0.09-rc2", "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", "icon": "app.png", "type": "app", diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index 75d48c7ff..429b9f565 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -36,7 +36,7 @@ const upperLshape = isB1 ? { } : { minX: Bangle.appRect.x2-100, maxX: Bangle.appRect.x2, - minY: Bangle.appRect.y, + minY: 24, maxY: Bangle.appRect.y2, rectWidth: 26, cornerRoundness: 4, @@ -368,7 +368,7 @@ Bangle.on('lcdPower', (on) => { Bangle.setHRMPower(1,"wohrm"); Bangle.on('HRM', onHrm); -g.clear(); +g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); From 9e1dd8eda39fb1bc76b9c52e1851072158cb4982 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 21:01:47 +0100 Subject: [PATCH 021/122] wohrm: Fix bgcolor --- apps.json | 2 +- apps/wohrm/app.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 2acd3b981..ed616c952 100644 --- a/apps.json +++ b/apps.json @@ -1714,7 +1714,7 @@ { "id": "wohrm", "name": "Workout HRM", - "version": "0.09-rc2", + "version": "0.09-rc3", "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", "icon": "app.png", "type": "app", diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index 429b9f565..115849fa6 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -351,7 +351,6 @@ function switchOffApp(){ Bangle.on('lcdPower', (on) => { if (on) { - g.clear(); Bangle.drawWidgets(); if (typeof(BTN5) !== typeof(undefined)) { @@ -368,7 +367,9 @@ Bangle.on('lcdPower', (on) => { Bangle.setHRMPower(1,"wohrm"); Bangle.on('HRM', onHrm); -g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); +g.setTheme({bg:"#000",fg:"#fff",dark:true}); +g.reset() +g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); From 288a204b9d608d90bb33cf82ec005f8a980df01e Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 21:13:39 +0100 Subject: [PATCH 022/122] wohrm: Add ChangeLog entry --- apps/wohrm/ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/wohrm/ChangeLog b/apps/wohrm/ChangeLog index 084ca6ed5..156d32740 100644 --- a/apps/wohrm/ChangeLog +++ b/apps/wohrm/ChangeLog @@ -5,4 +5,5 @@ 0.05: Improved buzz timing and rendering 0.06: Removed debug outputs, fixed rendering for upper limit, improved rendering for +/- icons, changelog version order fixed 0.07: Home button fixed and README added -0.08: tag HRM power requests to allow this ot work alongside other widgets/apps (fix #799) +0.08: tag HRM power requests to allow this to work alongside other widgets/apps (fix #799) +0.09: Ported to Bangle.js2 From 15df1205060eaf866fb3b2eb0c4db861a0d7bc90 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 21:29:16 +0100 Subject: [PATCH 023/122] wohrm: Home returns to clock, instead of menu --- apps.json | 2 +- apps/wohrm/ChangeLog | 1 + apps/wohrm/app.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index ed616c952..4d98ce731 100644 --- a/apps.json +++ b/apps.json @@ -1714,7 +1714,7 @@ { "id": "wohrm", "name": "Workout HRM", - "version": "0.09-rc3", + "version": "0.09-rc4", "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", "icon": "app.png", "type": "app", diff --git a/apps/wohrm/ChangeLog b/apps/wohrm/ChangeLog index 156d32740..b177c1902 100644 --- a/apps/wohrm/ChangeLog +++ b/apps/wohrm/ChangeLog @@ -7,3 +7,4 @@ 0.07: Home button fixed and README added 0.08: tag HRM power requests to allow this to work alongside other widgets/apps (fix #799) 0.09: Ported to Bangle.js2 + Home returns to clock, instead of menu diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index 115849fa6..646dab58f 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -346,7 +346,7 @@ function resetHighlightTimeout() { function switchOffApp(){ Bangle.setHRMPower(0,"wohrm"); - Bangle.showLauncher(); + load(); } Bangle.on('lcdPower', (on) => { From 0caa10b7052a639ba80d2f35d061b6026cef6bf7 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 19 Dec 2021 22:01:08 +0100 Subject: [PATCH 024/122] wohrm: Add settings --- apps.json | 3 ++- apps/wohrm/ChangeLog | 1 + apps/wohrm/app.js | 26 ++++++++++++++------------ apps/wohrm/settings.js | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 13 deletions(-) create mode 100644 apps/wohrm/settings.js diff --git a/apps.json b/apps.json index 4d98ce731..1d4f98c1e 100644 --- a/apps.json +++ b/apps.json @@ -1714,7 +1714,7 @@ { "id": "wohrm", "name": "Workout HRM", - "version": "0.09-rc4", + "version": "0.09-rc7", "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", "icon": "app.png", "type": "app", @@ -1725,6 +1725,7 @@ "screenshots": [{"url":"bangle1-workout-HRM-screenshot.png"}], "storage": [ {"name":"wohrm.app.js","url":"app.js"}, + {"name":"wohrm.settings.js","url":"settings.js"}, {"name":"wohrm.img","url":"app-icon.js","evaluate":true} ] }, diff --git a/apps/wohrm/ChangeLog b/apps/wohrm/ChangeLog index b177c1902..2ca405365 100644 --- a/apps/wohrm/ChangeLog +++ b/apps/wohrm/ChangeLog @@ -8,3 +8,4 @@ 0.08: tag HRM power requests to allow this to work alongside other widgets/apps (fix #799) 0.09: Ported to Bangle.js2 Home returns to clock, instead of menu + Add settings diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index 646dab58f..26e7b7eae 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -4,14 +4,16 @@ const Setter = { UPPER: 'upper', LOWER: 'lower' }; +const SETTINGS_FILE = "wohrm.setting.json"; +var settings = require('Storage').readJSON(SETTINGS_FILE, 1) || { + upperLimit: 130, + lowerLimit: 100 +}; const shortBuzzTimeInMs = 80; const longBuzzTimeInMs = 400; -let upperLimit = 130; let upperLimitChanged = true; - -let lowerLimit = 100; let lowerLimitChanged = true; let limitSetter = Setter.NONE; @@ -150,7 +152,7 @@ function renderUpperLimit() { g.setColor(g.theme.fg); } g.setFontVector(fontSizes.limits).setFontAlign(-1, 0, 0); - g.drawString("Upper: " + upperLimit, + g.drawString("Upper: " + settings.upperLimit, upperLshape.minX, upperLshape.minY+upperLshape.rectWidth/2); @@ -189,7 +191,7 @@ function renderLowerLimit() { g.setColor(g.theme.fg); } g.setFontVector(fontSizes.limits).setFontAlign(-1, 0, 0); - g.drawString("Lower: " + lowerLimit, + g.drawString("Lower: " + settings.lowerLimit, lowerLshape.maxX + lowerLshape.rectWidth/2, lowerLshape.minY - lowerLshape.rectWidth/2); @@ -247,13 +249,13 @@ function buzz() { // Do not buzz if not confident if(hrConfidence < 85) { return; } - if(currentHeartRate > upperLimit) + if(currentHeartRate > settings.upperLimit) { Bangle.buzz(shortBuzzTimeInMs); setTimeout(() => { Bangle.buzz(shortBuzzTimeInMs); }, shortBuzzTimeInMs * 2); } - if(currentHeartRate < lowerLimit) + if(currentHeartRate < settings.lowerLimit) { Bangle.buzz(longBuzzTimeInMs); } @@ -312,11 +314,11 @@ function incrementLimit() { resetHighlightTimeout(); if (limitSetter === Setter.UPPER) { - upperLimit++; + settings.upperLimit++; renderUpperLimit(); upperLimitChanged = true; } else if(limitSetter === Setter.LOWER) { - lowerLimit++; + settings.lowerLimit++; renderLowerLimit(); lowerLimitChanged = true; } @@ -326,11 +328,11 @@ function decrementLimit(){ resetHighlightTimeout(); if (limitSetter === Setter.UPPER) { - upperLimit--; + settings.upperLimit--; renderUpperLimit(); upperLimitChanged = true; } else if(limitSetter === Setter.LOWER) { - lowerLimit--; + settings.lowerLimit--; renderLowerLimit(); lowerLimitChanged = true; } @@ -368,7 +370,7 @@ Bangle.setHRMPower(1,"wohrm"); Bangle.on('HRM', onHrm); g.setTheme({bg:"#000",fg:"#fff",dark:true}); -g.reset() +g.reset(); g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); diff --git a/apps/wohrm/settings.js b/apps/wohrm/settings.js new file mode 100644 index 000000000..6d31688f4 --- /dev/null +++ b/apps/wohrm/settings.js @@ -0,0 +1,35 @@ +(function menu(back) { + const SETTINGS_FILE = "wohrm.setting.json"; + + // initialize with default settings... + const storage = require('Storage'); + var settings = storage.readJSON(SETTINGS_FILE, 1) || { + upperLimit: 130, + lowerLimit: 100 + }; + + function save() { + storage.write(SETTINGS_FILE, settings); + } + + E.showMenu({ + '': { 'title': 'Workout HRM' }, + '< Back': back, + 'Upper limit': { + value: settings.upperLimit, + min: 100, max: 200, + onchange: v => { + settings.upperLimit = v; + save(); + } + }, + 'Lower limit': { + value: settings.lowerLimit, + min: 50, max: 150, + onchange: v => { + settings.lowerLimit = v; + save(); + } + } + }); +}) From 4f16d6ce35cfc3ea49075a5fa0c4d9cda9c67754 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Mon, 20 Dec 2021 11:08:08 +0100 Subject: [PATCH 025/122] wohrm: Refactor renderLshape() rename variables and document renderLshape() --- apps.json | 2 +- apps/wohrm/app.js | 110 +++++++++++++++++++++++++--------------------- 2 files changed, 61 insertions(+), 51 deletions(-) diff --git a/apps.json b/apps.json index 1d4f98c1e..7898ba786 100644 --- a/apps.json +++ b/apps.json @@ -1714,7 +1714,7 @@ { "id": "wohrm", "name": "Workout HRM", - "version": "0.09-rc7", + "version": "0.09-rc10", "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", "icon": "app.png", "type": "app", diff --git a/apps/wohrm/app.js b/apps/wohrm/app.js index 26e7b7eae..ab579463c 100644 --- a/apps/wohrm/app.js +++ b/apps/wohrm/app.js @@ -27,30 +27,30 @@ let setterHighlightTimeout; const isB1 = process.env.HWVERSION==1; const upperLshape = isB1 ? { - minX: 125, - maxX: 210, - minY: 40, - maxY: 210, + right: 125, + left: 210, + bottom: 40, + top: 210, rectWidth: 30, cornerRoundness: 5, orientation: -1, color: '#f00' } : { - minX: Bangle.appRect.x2-100, - maxX: Bangle.appRect.x2, - minY: 24, - maxY: Bangle.appRect.y2, + right: Bangle.appRect.x2-100, + left: Bangle.appRect.x2, + bottom: 24, + top: Bangle.appRect.y2, rectWidth: 26, cornerRoundness: 4, - orientation: -1, + orientation: -1, // rotated 180° color: '#f00' }; const lowerLshape = { - maxX: isB1 ? 10 : Bangle.appRect.x, - minX: 100, - minY: upperLshape.maxY, - maxY: upperLshape.minY, + left: isB1 ? 10 : Bangle.appRect.x, + right: 100, + bottom: upperLshape.top, + top: upperLshape.bottom, rectWidth: upperLshape.rectWidth, cornerRoundness: upperLshape.cornerRoundness, orientation: 1, @@ -58,8 +58,8 @@ const lowerLshape = { }; const centerBar = { - minY: (upperLshape.minY + upperLshape.maxY - upperLshape.rectWidth)/2, - maxY: (upperLshape.minY + upperLshape.maxY + upperLshape.rectWidth)/2, + minY: (upperLshape.bottom + upperLshape.top - upperLshape.rectWidth)/2, + maxY: (upperLshape.bottom + upperLshape.top + upperLshape.rectWidth)/2, confidenceWidth: isB1 ? 10 : 8, minX: isB1 ? 55 : upperLshape.rectWidth + 14, maxX: isB1 ? 165 : Bangle.appRect.x2 - upperLshape.rectWidth - 14 @@ -80,50 +80,60 @@ function fillEllipse(x, y, x2, y2) { Math.max(y, y2)); } +/** + * @param p.left: the X coordinate of the left side of the L in its orientation + * @param p.right: the X coordinate of the right side of the L in its orientation + * @param p.top: the Y coordinate of the top side of the L in its orientation + * @param p.bottom: the Y coordinate of the bottom side of the L in its orientation + * @param p.strokeWidth: how thick we draw the letter. + * @param p.cornerRoundness: how much the corners should be rounded + * @param p.orientation: 1 == turned 0°; -1 == turned 180° + * @param p.color: the color to draw the shape + */ function renderLshape(p) { g.setColor(p.color); - g.fillRect(p.minX, p.minY, p.maxX, p.minY-p.orientation*p.rectWidth); - g.fillRect(p.maxX+p.orientation*p.rectWidth, - p.minY-p.orientation*p.rectWidth, - p.maxX, - p.maxY+p.orientation*p.cornerRoundness*2); + g.fillRect(p.right, p.bottom, p.left, p.bottom-p.orientation*p.rectWidth); + g.fillRect(p.left+p.orientation*p.rectWidth, + p.bottom-p.orientation*p.rectWidth, + p.left, + p.top+p.orientation*p.cornerRoundness*2); //Round end of small line - fillEllipse(p.minX+p.orientation*p.cornerRoundness*2, - p.minY, - p.minX-p.orientation*p.cornerRoundness*2, - p.minY-p.orientation*p.rectWidth); + fillEllipse(p.right+p.orientation*p.cornerRoundness*2, + p.bottom, + p.right-p.orientation*p.cornerRoundness*2, + p.bottom-p.orientation*p.rectWidth); //Round outer corner g.setColor(g.theme.bg); - g.fillRect(p.maxX+p.orientation*p.cornerRoundness, - p.minY, - p.maxX, - p.minY-p.orientation*p.cornerRoundness); + g.fillRect(p.left+p.orientation*p.cornerRoundness, + p.bottom, + p.left, + p.bottom-p.orientation*p.cornerRoundness); g.setColor(p.color); - fillEllipse(p.maxX+p.orientation*p.cornerRoundness*4, - p.minY, - p.maxX, - p.minY-p.orientation*p.cornerRoundness*2); + fillEllipse(p.left+p.orientation*p.cornerRoundness*4, + p.bottom, + p.left, + p.bottom-p.orientation*p.cornerRoundness*2); //Round inner corner - g.fillRect(p.maxX+p.orientation*(p.rectWidth+p.cornerRoundness+1), - p.minY-p.orientation*(p.rectWidth+1), - p.maxX+p.orientation*(p.rectWidth+1), - p.minY-p.orientation*(p.rectWidth+p.cornerRoundness-1)); + g.fillRect(p.left+p.orientation*(p.rectWidth+p.cornerRoundness+1), + p.bottom-p.orientation*(p.rectWidth+1), + p.left+p.orientation*(p.rectWidth+1), + p.bottom-p.orientation*(p.rectWidth+p.cornerRoundness-1)); g.setColor(g.theme.bg); - fillEllipse(p.maxX+p.orientation*(p.rectWidth+p.cornerRoundness*4), - p.minY-p.orientation*(p.rectWidth+1), - p.maxX+p.orientation*(p.rectWidth+1), - p.minY-p.orientation*(p.rectWidth+p.cornerRoundness*3-1)); + fillEllipse(p.left+p.orientation*(p.rectWidth+p.cornerRoundness*4), + p.bottom-p.orientation*(p.rectWidth+1), + p.left+p.orientation*(p.rectWidth+1), + p.bottom-p.orientation*(p.rectWidth+p.cornerRoundness*3-1)); //Round end of long line g.setColor(p.color); - fillEllipse(p.maxX+p.orientation*p.rectWidth, - p.maxY+p.orientation*p.cornerRoundness*4, - p.maxX, - p.maxY); + fillEllipse(p.left+p.orientation*p.rectWidth, + p.top+p.orientation*p.cornerRoundness*4, + p.left, + p.top); } function drawTrainingHeartRate() { @@ -153,8 +163,8 @@ function renderUpperLimit() { } g.setFontVector(fontSizes.limits).setFontAlign(-1, 0, 0); g.drawString("Upper: " + settings.upperLimit, - upperLshape.minX, - upperLshape.minY+upperLshape.rectWidth/2); + upperLshape.right, + upperLshape.bottom+upperLshape.rectWidth/2); upperLimitChanged = false; } @@ -170,8 +180,8 @@ function renderCurrentHeartRate() { g.setFontVector(fontSizes.heartRate); g.setFontAlign(1, 0, 0); g.drawString(currentHeartRate, - Math.max(upperLshape.minX+upperLshape.cornerRoundness, - lowerLshape.minX-lowerLshape.cornerRoundness), + Math.max(upperLshape.right+upperLshape.cornerRoundness, + lowerLshape.right-lowerLshape.cornerRoundness), (centerBar.minY+centerBar.maxY)/2); //Reset alignment to defaults @@ -192,8 +202,8 @@ function renderLowerLimit() { } g.setFontVector(fontSizes.limits).setFontAlign(-1, 0, 0); g.drawString("Lower: " + settings.lowerLimit, - lowerLshape.maxX + lowerLshape.rectWidth/2, - lowerLshape.minY - lowerLshape.rectWidth/2); + lowerLshape.left + lowerLshape.rectWidth/2, + lowerLshape.bottom - lowerLshape.rectWidth/2); lowerLimitChanged = false; } From ee3a1ced6283778950d3aa748537d76bbe780b86 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Sun, 2 Jan 2022 17:38:24 +0100 Subject: [PATCH 026/122] create app.js create app.js --- mmind/app.js | 198 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 mmind/app.js diff --git a/mmind/app.js b/mmind/app.js new file mode 100644 index 000000000..e7def025d --- /dev/null +++ b/mmind/app.js @@ -0,0 +1,198 @@ +//MMind + +//set vars +const H = g.getWidth(); +const W = g.getHeight(); +var touch_actions = []; +var cols = ["#FF0000","#00FF00","#0000FF", "#FF00FF", "#FFFF00", "#00FFFF", "#000000","#FFFFFF"]; +var turn = 0; +var col_menu = false; +//pinsRow = 6; +//pinsThick = 10; +//pinsRow = 5; +//pinsThick = 10; +var pinsRow = 4; +var pinsThick = 10; +var play = [-1, -1, -1, -1]; + +var pinsCol = 5; +var playx = -1; +var sx = (W - 30 )/pinsRow; +var sy = (H - 20 )/7; +var touch_actions = []; +var secret = []; +var secret_no_dub = true; +var endgame = false; + +g.clear(); +g.setColor("#FFFFFF"); +g.fillRect(0, 0, H, W); +g.setFont("Vector12",45); + +function draw() { + touch_actions = []; + g.clear(); + g.setColor("#FFFFFF"); + g.fillRect(0, 0, H, W); + g.setColor("#000000"); + //draw scores + for (y=0;y= 0) s = Math.round(Math.random()*pinsCol); + secret[i]= s; + } + } + +function score() { + bScore = 0; + wScore = 0; + for (i=0; i touch_actions[i][0][0] && e.x < touch_actions[i][0][2] && + e.y > touch_actions[i][0][1] && e.y < touch_actions[i][0][3]) { + // a action is hit, add acctions here, todo: start, stop, new, etc. + switch (touch_actions[i][1][0]) { + case 1: + //get pins col menu + col_menu = 1; + playx = touch_actions[i][1][1]; + break; + case 2: + //copy choice col to play + play[playx] = touch_actions[i][1][1]; + col_menu = 0; + break; + case 3: + //score play + var sc; + sc = score(); + game.push([play, sc]); + play = [-1,-1,-1,-1]; + turn+=1; + if (turn==6 || sc[0]==pinsRow) { + play = secret; + col_menu = 0; + endgame = true; + } + break; + case 4: + //new game + play = [-1,-1,-1,-1]; + game = []; + endgame=false; + break; + } + } + } + //console.log(touch_actions[i][1][0], touch_actions[i][1][1]); + + draw(); + } +); + + +game = []; +get_secret(); +draw(); +//Bangle.loadWidgets(); +//Bangle.drawWidgets(); + + + + + From c8f914359e8acd92373763f2be76f2ecaa50ce9a Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Sun, 2 Jan 2022 17:57:26 +0100 Subject: [PATCH 027/122] add icon file --- mmind/app.png | Bin 0 -> 1339 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 mmind/app.png diff --git a/mmind/app.png b/mmind/app.png new file mode 100644 index 0000000000000000000000000000000000000000..bb2a27ae5c614707bb35d6400f75e54514db68f5 GIT binary patch literal 1339 zcmWksdsLDK6u&Bc8AzQnW~4PLALTKIS<=?yL>fMGil(EZsY6p+Ddraun#DXU*>}En zENaEf9LG?zAR~69ma$sSLu6rV_&jP4W=qXXQ&eJ~f82Y|@7{Co{oUWW^7yz2DtS2> z0H{%s;XER;=FHuV@EJV|^h9te;zjHPO`Fdf0+4bzyEy=jKT&2g=K;7D#m6S?ayp$u zLqn%dokCI6Xf*cq^+_a>&dyGo%_fyf&1SRRZZ{YV0|Nu448{)`#BooBC)npO zRY}$Av=)nnPL~6W5h(;wS5>KXTAh-rbb`|kc7>EO&SJ@$qpUk4LA|RVtM@ zI(h~`MIud3PWqPk(qy!ek&%!P5r6|ha2ZWj;#+e6{(Y;}%49M}M@Q@H>oE*Ny}T>{ zgM)*B5zWM9D1bo)Dhx1`&2A(}jE&KxGzv~(Fo=>8r{GeW)NC>-C=`NnCqS7%;BYvq z)zyd|0SAzbBut6v^#*tM8h{yBSF=cjD>0>!WORT-kLcCa>cGIj($Z3eLb1uylL?TM zo?cZ|g|HA{0*>Qat(Hm+0bq(m5+*QN2&{3UN4ybqGx+ z^DQY!PEMA|WCDSJ&1QRhdwZc?U;z{bgMpAm1sIl=mX@EN&qmqMNaPvBcnXfwq*9aF zL{U%(Ap~UtgF#kpgWoKv0<#Olbq|;()X=(BD@~W(?6bglT zd3jEo&55EHSCc~tT^0x<`9%N=AIzD{Uj=np#7`zfg>#Z3V}{TDd(Z!B8KWQtuad}i)RH=J% z@$RJI-Q9bg#g`Wqy-BZ&O2nQEL+|*t2~Y3;tajizK zG7#9eo=$~h(#z7qmjUjc0lW9Jv;W&zIPDR-vFM+J$J$bxW?fS<6M_@2Zut6r;2-v> zFW!DH!&nhXH^ot{!kC}er)M@jHSO{1Ij2dsD)RPr?TyRpl@vbUn)!)m(xT+TcJ<@w z^VfylrU%_eh0*PCeH!u^(Tx1#(CbU@!lLON1z+*HPVBHwltsRYzi^}@?9&?b)`m|V zg-Bd~T|fnI;mLzF=#SR7wH57j$f1p;yiYu&{kGrd4FbFvB(X zz$=dwjeogSv*yYR)y@>ocJJGTAI_J~EbQqm9++9Qa>+KywcO|VlV@vF8;*UPoo6dQ zkluVXB=zB2b^$eIa^(2>qg5M*-6EzN|E_CUniw1GI5C}6VDfSDCYov)9tUmLAEod9 zpn2W>QJ2@sFAF6 Date: Sun, 2 Jan 2022 18:03:21 +0100 Subject: [PATCH 028/122] Delete mmind directory --- mmind/app.js | 198 -------------------------------------------------- mmind/app.png | Bin 1339 -> 0 bytes 2 files changed, 198 deletions(-) delete mode 100644 mmind/app.js delete mode 100644 mmind/app.png diff --git a/mmind/app.js b/mmind/app.js deleted file mode 100644 index e7def025d..000000000 --- a/mmind/app.js +++ /dev/null @@ -1,198 +0,0 @@ -//MMind - -//set vars -const H = g.getWidth(); -const W = g.getHeight(); -var touch_actions = []; -var cols = ["#FF0000","#00FF00","#0000FF", "#FF00FF", "#FFFF00", "#00FFFF", "#000000","#FFFFFF"]; -var turn = 0; -var col_menu = false; -//pinsRow = 6; -//pinsThick = 10; -//pinsRow = 5; -//pinsThick = 10; -var pinsRow = 4; -var pinsThick = 10; -var play = [-1, -1, -1, -1]; - -var pinsCol = 5; -var playx = -1; -var sx = (W - 30 )/pinsRow; -var sy = (H - 20 )/7; -var touch_actions = []; -var secret = []; -var secret_no_dub = true; -var endgame = false; - -g.clear(); -g.setColor("#FFFFFF"); -g.fillRect(0, 0, H, W); -g.setFont("Vector12",45); - -function draw() { - touch_actions = []; - g.clear(); - g.setColor("#FFFFFF"); - g.fillRect(0, 0, H, W); - g.setColor("#000000"); - //draw scores - for (y=0;y= 0) s = Math.round(Math.random()*pinsCol); - secret[i]= s; - } - } - -function score() { - bScore = 0; - wScore = 0; - for (i=0; i touch_actions[i][0][0] && e.x < touch_actions[i][0][2] && - e.y > touch_actions[i][0][1] && e.y < touch_actions[i][0][3]) { - // a action is hit, add acctions here, todo: start, stop, new, etc. - switch (touch_actions[i][1][0]) { - case 1: - //get pins col menu - col_menu = 1; - playx = touch_actions[i][1][1]; - break; - case 2: - //copy choice col to play - play[playx] = touch_actions[i][1][1]; - col_menu = 0; - break; - case 3: - //score play - var sc; - sc = score(); - game.push([play, sc]); - play = [-1,-1,-1,-1]; - turn+=1; - if (turn==6 || sc[0]==pinsRow) { - play = secret; - col_menu = 0; - endgame = true; - } - break; - case 4: - //new game - play = [-1,-1,-1,-1]; - game = []; - endgame=false; - break; - } - } - } - //console.log(touch_actions[i][1][0], touch_actions[i][1][1]); - - draw(); - } -); - - -game = []; -get_secret(); -draw(); -//Bangle.loadWidgets(); -//Bangle.drawWidgets(); - - - - - diff --git a/mmind/app.png b/mmind/app.png deleted file mode 100644 index bb2a27ae5c614707bb35d6400f75e54514db68f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1339 zcmWksdsLDK6u&Bc8AzQnW~4PLALTKIS<=?yL>fMGil(EZsY6p+Ddraun#DXU*>}En zENaEf9LG?zAR~69ma$sSLu6rV_&jP4W=qXXQ&eJ~f82Y|@7{Co{oUWW^7yz2DtS2> z0H{%s;XER;=FHuV@EJV|^h9te;zjHPO`Fdf0+4bzyEy=jKT&2g=K;7D#m6S?ayp$u zLqn%dokCI6Xf*cq^+_a>&dyGo%_fyf&1SRRZZ{YV0|Nu448{)`#BooBC)npO zRY}$Av=)nnPL~6W5h(;wS5>KXTAh-rbb`|kc7>EO&SJ@$qpUk4LA|RVtM@ zI(h~`MIud3PWqPk(qy!ek&%!P5r6|ha2ZWj;#+e6{(Y;}%49M}M@Q@H>oE*Ny}T>{ zgM)*B5zWM9D1bo)Dhx1`&2A(}jE&KxGzv~(Fo=>8r{GeW)NC>-C=`NnCqS7%;BYvq z)zyd|0SAzbBut6v^#*tM8h{yBSF=cjD>0>!WORT-kLcCa>cGIj($Z3eLb1uylL?TM zo?cZ|g|HA{0*>Qat(Hm+0bq(m5+*QN2&{3UN4ybqGx+ z^DQY!PEMA|WCDSJ&1QRhdwZc?U;z{bgMpAm1sIl=mX@EN&qmqMNaPvBcnXfwq*9aF zL{U%(Ap~UtgF#kpgWoKv0<#Olbq|;()X=(BD@~W(?6bglT zd3jEo&55EHSCc~tT^0x<`9%N=AIzD{Uj=np#7`zfg>#Z3V}{TDd(Z!B8KWQtuad}i)RH=J% z@$RJI-Q9bg#g`Wqy-BZ&O2nQEL+|*t2~Y3;tajizK zG7#9eo=$~h(#z7qmjUjc0lW9Jv;W&zIPDR-vFM+J$J$bxW?fS<6M_@2Zut6r;2-v> zFW!DH!&nhXH^ot{!kC}er)M@jHSO{1Ij2dsD)RPr?TyRpl@vbUn)!)m(xT+TcJ<@w z^VfylrU%_eh0*PCeH!u^(Tx1#(CbU@!lLON1z+*HPVBHwltsRYzi^}@?9&?b)`m|V zg-Bd~T|fnI;mLzF=#SR7wH57j$f1p;yiYu&{kGrd4FbFvB(X zz$=dwjeogSv*yYR)y@>ocJJGTAI_J~EbQqm9++9Qa>+KywcO|VlV@vF8;*UPoo6dQ zkluVXB=zB2b^$eIa^(2>qg5M*-6EzN|E_CUniw1GI5C}6VDfSDCYov)9tUmLAEod9 zpn2W>QJ2@sFAF6 Date: Sun, 2 Jan 2022 18:04:12 +0100 Subject: [PATCH 029/122] Create app.js --- apps/mmind/app.js | 198 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 apps/mmind/app.js diff --git a/apps/mmind/app.js b/apps/mmind/app.js new file mode 100644 index 000000000..e7def025d --- /dev/null +++ b/apps/mmind/app.js @@ -0,0 +1,198 @@ +//MMind + +//set vars +const H = g.getWidth(); +const W = g.getHeight(); +var touch_actions = []; +var cols = ["#FF0000","#00FF00","#0000FF", "#FF00FF", "#FFFF00", "#00FFFF", "#000000","#FFFFFF"]; +var turn = 0; +var col_menu = false; +//pinsRow = 6; +//pinsThick = 10; +//pinsRow = 5; +//pinsThick = 10; +var pinsRow = 4; +var pinsThick = 10; +var play = [-1, -1, -1, -1]; + +var pinsCol = 5; +var playx = -1; +var sx = (W - 30 )/pinsRow; +var sy = (H - 20 )/7; +var touch_actions = []; +var secret = []; +var secret_no_dub = true; +var endgame = false; + +g.clear(); +g.setColor("#FFFFFF"); +g.fillRect(0, 0, H, W); +g.setFont("Vector12",45); + +function draw() { + touch_actions = []; + g.clear(); + g.setColor("#FFFFFF"); + g.fillRect(0, 0, H, W); + g.setColor("#000000"); + //draw scores + for (y=0;y= 0) s = Math.round(Math.random()*pinsCol); + secret[i]= s; + } + } + +function score() { + bScore = 0; + wScore = 0; + for (i=0; i touch_actions[i][0][0] && e.x < touch_actions[i][0][2] && + e.y > touch_actions[i][0][1] && e.y < touch_actions[i][0][3]) { + // a action is hit, add acctions here, todo: start, stop, new, etc. + switch (touch_actions[i][1][0]) { + case 1: + //get pins col menu + col_menu = 1; + playx = touch_actions[i][1][1]; + break; + case 2: + //copy choice col to play + play[playx] = touch_actions[i][1][1]; + col_menu = 0; + break; + case 3: + //score play + var sc; + sc = score(); + game.push([play, sc]); + play = [-1,-1,-1,-1]; + turn+=1; + if (turn==6 || sc[0]==pinsRow) { + play = secret; + col_menu = 0; + endgame = true; + } + break; + case 4: + //new game + play = [-1,-1,-1,-1]; + game = []; + endgame=false; + break; + } + } + } + //console.log(touch_actions[i][1][0], touch_actions[i][1][1]); + + draw(); + } +); + + +game = []; +get_secret(); +draw(); +//Bangle.loadWidgets(); +//Bangle.drawWidgets(); + + + + + From fd7264a31d97c02bfb64504881fc4cfd22809e2c Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Sun, 2 Jan 2022 18:04:39 +0100 Subject: [PATCH 030/122] Add files via upload --- apps/mmind/app.png | Bin 0 -> 1339 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/mmind/app.png diff --git a/apps/mmind/app.png b/apps/mmind/app.png new file mode 100644 index 0000000000000000000000000000000000000000..bb2a27ae5c614707bb35d6400f75e54514db68f5 GIT binary patch literal 1339 zcmWksdsLDK6u&Bc8AzQnW~4PLALTKIS<=?yL>fMGil(EZsY6p+Ddraun#DXU*>}En zENaEf9LG?zAR~69ma$sSLu6rV_&jP4W=qXXQ&eJ~f82Y|@7{Co{oUWW^7yz2DtS2> z0H{%s;XER;=FHuV@EJV|^h9te;zjHPO`Fdf0+4bzyEy=jKT&2g=K;7D#m6S?ayp$u zLqn%dokCI6Xf*cq^+_a>&dyGo%_fyf&1SRRZZ{YV0|Nu448{)`#BooBC)npO zRY}$Av=)nnPL~6W5h(;wS5>KXTAh-rbb`|kc7>EO&SJ@$qpUk4LA|RVtM@ zI(h~`MIud3PWqPk(qy!ek&%!P5r6|ha2ZWj;#+e6{(Y;}%49M}M@Q@H>oE*Ny}T>{ zgM)*B5zWM9D1bo)Dhx1`&2A(}jE&KxGzv~(Fo=>8r{GeW)NC>-C=`NnCqS7%;BYvq z)zyd|0SAzbBut6v^#*tM8h{yBSF=cjD>0>!WORT-kLcCa>cGIj($Z3eLb1uylL?TM zo?cZ|g|HA{0*>Qat(Hm+0bq(m5+*QN2&{3UN4ybqGx+ z^DQY!PEMA|WCDSJ&1QRhdwZc?U;z{bgMpAm1sIl=mX@EN&qmqMNaPvBcnXfwq*9aF zL{U%(Ap~UtgF#kpgWoKv0<#Olbq|;()X=(BD@~W(?6bglT zd3jEo&55EHSCc~tT^0x<`9%N=AIzD{Uj=np#7`zfg>#Z3V}{TDd(Z!B8KWQtuad}i)RH=J% z@$RJI-Q9bg#g`Wqy-BZ&O2nQEL+|*t2~Y3;tajizK zG7#9eo=$~h(#z7qmjUjc0lW9Jv;W&zIPDR-vFM+J$J$bxW?fS<6M_@2Zut6r;2-v> zFW!DH!&nhXH^ot{!kC}er)M@jHSO{1Ij2dsD)RPr?TyRpl@vbUn)!)m(xT+TcJ<@w z^VfylrU%_eh0*PCeH!u^(Tx1#(CbU@!lLON1z+*HPVBHwltsRYzi^}@?9&?b)`m|V zg-Bd~T|fnI;mLzF=#SR7wH57j$f1p;yiYu&{kGrd4FbFvB(X zz$=dwjeogSv*yYR)y@>ocJJGTAI_J~EbQqm9++9Qa>+KywcO|VlV@vF8;*UPoo6dQ zkluVXB=zB2b^$eIa^(2>qg5M*-6EzN|E_CUniw1GI5C}6VDfSDCYov)9tUmLAEod9 zpn2W>QJ2@sFAF6 Date: Sun, 2 Jan 2022 18:09:55 +0100 Subject: [PATCH 031/122] Create app-icon.js --- apps/mmind/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/mmind/app-icon.js diff --git a/apps/mmind/app-icon.js b/apps/mmind/app-icon.js new file mode 100644 index 000000000..9bcedc5f3 --- /dev/null +++ b/apps/mmind/app-icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("mEwgn/AF/ykYEMmUvAYPzAIX/rnMBIPzu93n4EB1OZBIW73U/+cQ/8Qn/05nM4f/+wXBt//+OZzOv//63e7j/zmI1Bn/1C4f3C4NzCQIXByf/nYXBDgPxKQM/+IvGv4XFF4QXF+ZfGAgQXBAgPyC4JpBC4QJBmEBQoUggQECmAEDBIR3BgURCgNnFQerEoXzp3kAgWIxBCBgMD+cC+JyD+JVD+nu91PBIIXBj/yj8h+MCOQSKCC4OzC4fj/84C4OPC4UiiQvEQogXCof//AvFgMBRQoXBAgVO9yPCL4cfiUziP/mMSQoUyiYECmguBAAMxkYDBkMf/4FCAH4A/AH4A/AH4A/AH4A/AH4Ap5gACAoM/BIXzAhgXE+MDBoXwh4EC+IEDBIYXE+UfBoXyl4ELI4pfXACPdAASrv")) From 3ba5066073c151800c01f7867232e15e435f3831 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Sun, 2 Jan 2022 18:16:01 +0100 Subject: [PATCH 032/122] added mmind app --- apps.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e5e9f8f02..5bbde6af5 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,20 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] - } + }, + + { "id": "mmind", + "name": "Clasic Mind Game", + "shortName":"Master Mind", + "icon": "app.png", + "version":"0.01", + "description": "This is a classic mind game for bangles 2", + "tags": "masterminf, game", + "storage": [ + {"name":"timer.app.js","url":"app.js"}, + {"name":"mmind.img","url":"app-icon.js","evaluate":true} + ] +} +] + ] From 8a75baae96d0c913e93c6e091033d6449e8a81fc Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Sun, 2 Jan 2022 18:17:15 +0100 Subject: [PATCH 033/122] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 5bbde6af5..09c171616 100644 --- a/apps.json +++ b/apps.json @@ -5065,7 +5065,7 @@ }, { "id": "mmind", - "name": "Clasic Mind Game", + "name": "Classic Mind Game", "shortName":"Master Mind", "icon": "app.png", "version":"0.01", From f6e71200c177f17968798cae63100b43cbb7f39a Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Sun, 2 Jan 2022 18:18:23 +0100 Subject: [PATCH 034/122] Update apps.json --- apps.json | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/apps.json b/apps.json index 09c171616..74b5b49b5 100644 --- a/apps.json +++ b/apps.json @@ -5063,7 +5063,6 @@ {"name":"ltherm.img","url":"icon.js","evaluate":true} ] }, - { "id": "mmind", "name": "Classic Mind Game", "shortName":"Master Mind", @@ -5074,8 +5073,7 @@ "storage": [ {"name":"timer.app.js","url":"app.js"}, {"name":"mmind.img","url":"app-icon.js","evaluate":true} - ] -} -] - + ] + } ] + From f93c785d1959ac2e4a19e73dafed443bb2c6bab6 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Sun, 2 Jan 2022 21:23:43 +0100 Subject: [PATCH 035/122] Update apps.json --- apps.json | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/apps.json b/apps.json index 74b5b49b5..28dcf6912 100644 --- a/apps.json +++ b/apps.json @@ -5063,17 +5063,19 @@ {"name":"ltherm.img","url":"icon.js","evaluate":true} ] }, - { "id": "mmind", - "name": "Classic Mind Game", - "shortName":"Master Mind", - "icon": "app.png", - "version":"0.01", - "description": "This is a classic mind game for bangles 2", - "tags": "masterminf, game", - "storage": [ - {"name":"timer.app.js","url":"app.js"}, - {"name":"mmind.img","url":"app-icon.js","evaluate":true} + { + "id": "mmind", + "name": "Classic Mind Game", + "shortName":"Master Mind", + "icon": "app.png", + "version":"0.01", + "description": "This is a classic mind game", + "type": "game", + "tags": "mastermind, game, bangle 2", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"mmind.app.js","url":"app.js"}, + {"name":"mmind.img","url":"app-icon.js","evaluate":true} ] } ] - From ac6140704d5afb068009a4bfbdf49218101a507e Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Mon, 3 Jan 2022 15:13:07 +0100 Subject: [PATCH 036/122] Delete app.js --- apps/mmind/app.js | 198 ---------------------------------------------- 1 file changed, 198 deletions(-) delete mode 100644 apps/mmind/app.js diff --git a/apps/mmind/app.js b/apps/mmind/app.js deleted file mode 100644 index e7def025d..000000000 --- a/apps/mmind/app.js +++ /dev/null @@ -1,198 +0,0 @@ -//MMind - -//set vars -const H = g.getWidth(); -const W = g.getHeight(); -var touch_actions = []; -var cols = ["#FF0000","#00FF00","#0000FF", "#FF00FF", "#FFFF00", "#00FFFF", "#000000","#FFFFFF"]; -var turn = 0; -var col_menu = false; -//pinsRow = 6; -//pinsThick = 10; -//pinsRow = 5; -//pinsThick = 10; -var pinsRow = 4; -var pinsThick = 10; -var play = [-1, -1, -1, -1]; - -var pinsCol = 5; -var playx = -1; -var sx = (W - 30 )/pinsRow; -var sy = (H - 20 )/7; -var touch_actions = []; -var secret = []; -var secret_no_dub = true; -var endgame = false; - -g.clear(); -g.setColor("#FFFFFF"); -g.fillRect(0, 0, H, W); -g.setFont("Vector12",45); - -function draw() { - touch_actions = []; - g.clear(); - g.setColor("#FFFFFF"); - g.fillRect(0, 0, H, W); - g.setColor("#000000"); - //draw scores - for (y=0;y= 0) s = Math.round(Math.random()*pinsCol); - secret[i]= s; - } - } - -function score() { - bScore = 0; - wScore = 0; - for (i=0; i touch_actions[i][0][0] && e.x < touch_actions[i][0][2] && - e.y > touch_actions[i][0][1] && e.y < touch_actions[i][0][3]) { - // a action is hit, add acctions here, todo: start, stop, new, etc. - switch (touch_actions[i][1][0]) { - case 1: - //get pins col menu - col_menu = 1; - playx = touch_actions[i][1][1]; - break; - case 2: - //copy choice col to play - play[playx] = touch_actions[i][1][1]; - col_menu = 0; - break; - case 3: - //score play - var sc; - sc = score(); - game.push([play, sc]); - play = [-1,-1,-1,-1]; - turn+=1; - if (turn==6 || sc[0]==pinsRow) { - play = secret; - col_menu = 0; - endgame = true; - } - break; - case 4: - //new game - play = [-1,-1,-1,-1]; - game = []; - endgame=false; - break; - } - } - } - //console.log(touch_actions[i][1][0], touch_actions[i][1][1]); - - draw(); - } -); - - -game = []; -get_secret(); -draw(); -//Bangle.loadWidgets(); -//Bangle.drawWidgets(); - - - - - From 377099b81af2f457c8fa5d1ca87c737b95f4ca46 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Mon, 3 Jan 2022 15:19:55 +0100 Subject: [PATCH 037/122] Delete app.png --- apps/mmind/app.png | Bin 1339 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/mmind/app.png diff --git a/apps/mmind/app.png b/apps/mmind/app.png deleted file mode 100644 index bb2a27ae5c614707bb35d6400f75e54514db68f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1339 zcmWksdsLDK6u&Bc8AzQnW~4PLALTKIS<=?yL>fMGil(EZsY6p+Ddraun#DXU*>}En zENaEf9LG?zAR~69ma$sSLu6rV_&jP4W=qXXQ&eJ~f82Y|@7{Co{oUWW^7yz2DtS2> z0H{%s;XER;=FHuV@EJV|^h9te;zjHPO`Fdf0+4bzyEy=jKT&2g=K;7D#m6S?ayp$u zLqn%dokCI6Xf*cq^+_a>&dyGo%_fyf&1SRRZZ{YV0|Nu448{)`#BooBC)npO zRY}$Av=)nnPL~6W5h(;wS5>KXTAh-rbb`|kc7>EO&SJ@$qpUk4LA|RVtM@ zI(h~`MIud3PWqPk(qy!ek&%!P5r6|ha2ZWj;#+e6{(Y;}%49M}M@Q@H>oE*Ny}T>{ zgM)*B5zWM9D1bo)Dhx1`&2A(}jE&KxGzv~(Fo=>8r{GeW)NC>-C=`NnCqS7%;BYvq z)zyd|0SAzbBut6v^#*tM8h{yBSF=cjD>0>!WORT-kLcCa>cGIj($Z3eLb1uylL?TM zo?cZ|g|HA{0*>Qat(Hm+0bq(m5+*QN2&{3UN4ybqGx+ z^DQY!PEMA|WCDSJ&1QRhdwZc?U;z{bgMpAm1sIl=mX@EN&qmqMNaPvBcnXfwq*9aF zL{U%(Ap~UtgF#kpgWoKv0<#Olbq|;()X=(BD@~W(?6bglT zd3jEo&55EHSCc~tT^0x<`9%N=AIzD{Uj=np#7`zfg>#Z3V}{TDd(Z!B8KWQtuad}i)RH=J% z@$RJI-Q9bg#g`Wqy-BZ&O2nQEL+|*t2~Y3;tajizK zG7#9eo=$~h(#z7qmjUjc0lW9Jv;W&zIPDR-vFM+J$J$bxW?fS<6M_@2Zut6r;2-v> zFW!DH!&nhXH^ot{!kC}er)M@jHSO{1Ij2dsD)RPr?TyRpl@vbUn)!)m(xT+TcJ<@w z^VfylrU%_eh0*PCeH!u^(Tx1#(CbU@!lLON1z+*HPVBHwltsRYzi^}@?9&?b)`m|V zg-Bd~T|fnI;mLzF=#SR7wH57j$f1p;yiYu&{kGrd4FbFvB(X zz$=dwjeogSv*yYR)y@>ocJJGTAI_J~EbQqm9++9Qa>+KywcO|VlV@vF8;*UPoo6dQ zkluVXB=zB2b^$eIa^(2>qg5M*-6EzN|E_CUniw1GI5C}6VDfSDCYov)9tUmLAEod9 zpn2W>QJ2@sFAF6 Date: Mon, 3 Jan 2022 15:20:30 +0100 Subject: [PATCH 038/122] Add files via upload --- apps/mmind/mmind.app.js | 3395 +++++++++++++++++++++++++++++++++++++++ apps/mmind/mmind.png | Bin 0 -> 1546 bytes 2 files changed, 3395 insertions(+) create mode 100644 apps/mmind/mmind.app.js create mode 100644 apps/mmind/mmind.png diff --git a/apps/mmind/mmind.app.js b/apps/mmind/mmind.app.js new file mode 100644 index 000000000..52a566ca9 --- /dev/null +++ b/apps/mmind/mmind.app.js @@ -0,0 +1,3395 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BangleApps/app.js at master · psbest/BangleApps + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + +
+ + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + psbest  /   + BangleApps  /   + +
+ + + + Type # for issues and pull requests, > for commands, and ? for help + + + Type # for issues, pull requests, and projects, > for commands, and ? for help + + + Type # for issues, pull requests, and projects, / for files, and > for commands + + +
+ +
+
+ We’ve encountered an error and some results aren't available at this time. Type a new search or try again later. +
+
+ + No results matched your search + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + Search for issues and pull requests + + # + + + + Search for issues, pull requests, discussions, and projects + + # + + + + Search for organizations, repositories, and users + + @ + + + + Search for projects + + ! + + + + Search for files + + / + + + + Activate command mode + + > + + + + Search your issues, pull requests, and discussions + + # author:@me + + + + Search your issues, pull requests, and discussions + + # author:@me + + + + Filter to pull requests + + # is:pr + + + + Filter to issues + + # is:issue + + + + Filter to discussions + + # is:discussion + + + + Filter to projects + + # is:project + + + + Filter to open issues, pull requests, and discussions + + # is:open + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + +
+ + + + +
+
+
+ + + + + + + + + + +
+ +
+ +
+

+ + + / + + BangleApps + + + Public +

+ + forked from espruino/BangleApps + + +
+ +
    + +
  • + +
    + + + + + + + Watch + + + 0 + + + +
    +
    +

    Notifications

    + +
    + +
    +
    + + + + + + + + +
    + + +
    + + + + + Get push notifications on iOS or Android. + +
    +
    +
    +
    + + +
    +
    +
    + + + +
  • + + +
  • + + +
  • + +
  • + +
    +
    + +
    +
    + +
    +
    + + + + + +
    + +
    +
    + + + + + + + +
    + +
    +
    +
    +
    +
    +
  • + + +
  • + + +
  • +
+ +
+ +
+
+ + + + +
+ + + +
+
+ + Open in github.dev + Open in a new github.dev tab + + + + + + + +
+ + + + + Permalink + + +
+ +
+
+ + + master + + + + +
+
+
+ Switch branches/tags + +
+ + + +
+ +
+ +
+ + +
+ +
+ + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ +
+ +
+ + + + Go to file + + +
+ + + + +
+
+
+ + + + +
+ +
+
+
 
+
+ +
+
 
+ Cannot retrieve contributors at this time +
+
+ + + + + + + + + + + +
+ +
+ + +
+ + 198 lines (178 sloc) + + 4.59 KB +
+ +
+ + + + +
+ + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +
+ +
+
+ + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
//MMind
+
//set vars
const H = g.getWidth();
const W = g.getHeight();
var touch_actions = [];
var cols = ["#FF0000","#00FF00","#0000FF", "#FF00FF", "#FFFF00", "#00FFFF", "#000000","#FFFFFF"];
var turn = 0;
var col_menu = false;
//pinsRow = 6;
//pinsThick = 10;
//pinsRow = 5;
//pinsThick = 10;
var pinsRow = 4;
var pinsThick = 10;
var play = [-1, -1, -1, -1];
+
var pinsCol = 5;
var playx = -1;
var sx = (W - 30 )/pinsRow;
var sy = (H - 20 )/7;
var touch_actions = [];
var secret = [];
var secret_no_dub = true;
var endgame = false;
+
g.clear();
g.setColor("#FFFFFF");
g.fillRect(0, 0, H, W);
g.setFont("Vector12",45);
+
function draw() {
touch_actions = [];
g.clear();
g.setColor("#FFFFFF");
g.fillRect(0, 0, H, W);
g.setColor("#000000");
//draw scores
for (y=0;y<game.length;y+=1) {
pp = game[y][0];
ps = game[y][1];
g.setColor("#000000");
//g.fillRect(W-30,10, W-30, 15);
g.setColor("#000000");
g.setFont("Vector30",10);
g.drawString(ps[0],W-31,y*sy+8);
g.setColor("#000000");
g.drawString(ps[1],W-15,y*sy+8);
g.setColor("#000000");
for (x=0;x<pinsRow;x+=1) {
xx = sx*x + pinsThick + 5;
yy = sy*y+20;
xc = pp[x];
g.setColor(cols[xc]);
g.fillCircle(xx,yy , pinsThick );
g.setColor("#000000");
g.drawCircle(xx,yy,pinsThick+1);
g.drawCircle(xx,yy,pinsThick);
}
}
//draw play input
for (k=0; k<pinsRow; k+=1){
xx = sx*k + pinsThick + 5;
yy = sy*7;
touch_actions.push([[xx-pinsThick-5, yy-pinsThick-10, xx+pinsThick+5, yy+pinsThick+20],[1,k]]);
if (play[k] < 0) {
//col not choisen, draw small dot
g.setColor("#000000");
g.fillCircle(xx,yy , 3 );
} else {
g.setColor(cols[play[k]]);
g.fillCircle(xx,yy , pinsThick );
+
}
}
// draw action button
// score, men
if (!endgame) {
if (col_menu) {
draw_col_choice();
} else {
// check if all pins are set yet
if (Math.min.apply(null,play) < 0) {
g.setColor("#FF0000");
} else {
g.setColor("#00FF00");
touch_actions.push([[W-30, H-30,192, 190], [3,1]]);
}
g.fillRect(W-30, H-30, W-1, H-10);
}
} else {
g.setColor("#0000FF");
touch_actions.push([[W-30, H-30,192, 190], [4,1]]);
g.fillRect(W-30, H-30, W-1, H-10);
}
}
+
function get_secret() {
//secret=[];
for (i=0; i<pinsRow; i+=1) {
s = Math.round(Math.random()*pinsCol);
if (secret_no_dub)
while(secret.indexOf(s) >= 0) s = Math.round(Math.random()*pinsCol);
secret[i]= s;
}
}
+
function score() {
bScore = 0;
wScore = 0;
for (i=0; i<pinsRow; i+=1) {
if (secret[i] == play[i]) {
bScore +=1;
}
else {
for (s=0; s<pinsRow; s+=1) {
if (secret[i] == play[s]) {
wScore +=1;
break;
}
}
}
}
+
return([bScore, wScore]);
}
+
function draw_col_choice(){
var cc = g.getColor();
var boxw = 30;
var boxh = H/pinsRow-20;
for (i=0; i<=pinsCol; i+=1) {
g.setColor(cols[i]);
g.fillRect(W-boxw, i*boxh, W-1, i*boxh+boxh);
touch_actions.push([[150, i*boxh, 191, i*boxh+boxh], [2,i]]);
g.setColor(cc);
}
+
}
+
Bangle.on('touch', function(zone,e) {
//console.log(e.x, e.y);
// check touch actions array to see what to do
for(i=0; i<touch_actions.length; i+=1) {
if (e.x > touch_actions[i][0][0] && e.x < touch_actions[i][0][2] &&
e.y > touch_actions[i][0][1] && e.y < touch_actions[i][0][3]) {
// a action is hit, add acctions here, todo: start, stop, new, etc.
switch (touch_actions[i][1][0]) {
case 1:
//get pins col menu
col_menu = 1;
playx = touch_actions[i][1][1];
break;
case 2:
//copy choice col to play
play[playx] = touch_actions[i][1][1];
col_menu = 0;
break;
case 3:
//score play
var sc;
sc = score();
game.push([play, sc]);
play = [-1,-1,-1,-1];
turn+=1;
if (turn==6 || sc[0]==pinsRow) {
play = secret;
col_menu = 0;
endgame = true;
}
break;
case 4:
//new game
play = [-1,-1,-1,-1];
game = [];
endgame=false;
break;
}
}
}
//console.log(touch_actions[i][1][0], touch_actions[i][1][1]);
draw();
}
);
+
+
game = [];
get_secret();
draw();
//Bangle.loadWidgets();
//Bangle.drawWidgets();
+
+
+
+
+
+ + + +
+ +
+ + + + +
+ + +
+ + +
+
+ + + + +
+ + + +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/mmind/mmind.png b/apps/mmind/mmind.png new file mode 100644 index 0000000000000000000000000000000000000000..8afcc26974bc8eaa2239927b33b4d566e8df42ba GIT binary patch literal 1546 zcmV+l2KD)gP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1)oVoK~z{r?U-F? z6Im3;PqV{V8ipugkQ7?8+6Es=Ed5|9Qi@bXs_cUgVqsSiDSZ$>=tC$=D3KD;4QZii z_aQWYinyuOH0vSU0pqX{J70#8yOkFCQYcjt?fT08+MKe z0zQWJBjn4MFIDcULX3dyl@}KmSrn((t?0hSQ0pGoMbj5EvIon-q-?~(8)kx$ZXCk?HItTvuF43->3XPinTZhcM)>?_U)RQ8q5r*v%9`hzx>~6b==u?AkS3Dn*NSbW|K2Ej$$og~L)XNMo6db+Di^>}58av8Zvv z9zTBE)YPn+3xsd96bp{B5q(eQe`XU?3NpP$cUGVk8K!~AFsMRQS5$t<@|qcY2^Mr9RAjmkDQ zqNak#pr$6PR#~z_qq12GR~drez<9-F!b;k?bLZIDSZizRsZ*!uV0Jvz#5F2Qt2Biq z%^H=_-YOD_LSMYioYbgHPH(BQmX;PQrhE79(S!mg1Lh$!*{`MZ~vWp^Wbk>AQBNxrmiDL4jeeZoa^iBmoHy_@#4j0uoc;GuF z*ksVWJ5$z`jU(h|e3?}YHTd58<_$IQO@7A?#ihskI>gwB-+&1%k)>AB%62y-B85p9 zody0O#F5{>s3e5%i{zP~Cyk9tS0J)Xrlz?6`%F*sF5jFqAvbZWeKL_#B*i*Xe$8jY z&R@8j)6t>o3dC;beihH3KcAVI;SI*t3DFu#;GrT3$uy*S1BvrbPEj+V=?n3qFr}fP z;o!l8yrBn8NW?>h0D?(f>~tSTMNw1K^et{GT)K3rv$K;obiw(1NnT>16ZD z`CGeWe{nbG!2=?Sn-flYdbt1lY`tV$Wig0dhwErKz|jF6N~$U%0ON|$0#LjgL-&Q? w=1pqU)j@l^;?iSo4*L4It;N`m`91*u1O9JFJ2Em3SpWb407*qoM6N<$g6%QmuK)l5 literal 0 HcmV?d00001 From ff363e10955cb4b82ecd53b10d697f30b8b4c39b Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Mon, 3 Jan 2022 15:27:45 +0100 Subject: [PATCH 039/122] Update apps.json --- apps.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index 28dcf6912..6f435fb82 100644 --- a/apps.json +++ b/apps.json @@ -5067,15 +5067,15 @@ "id": "mmind", "name": "Classic Mind Game", "shortName":"Master Mind", - "icon": "app.png", + "icon": "mmind.png", "version":"0.01", "description": "This is a classic mind game", "type": "game", - "tags": "mastermind, game, bangle 2", + "tags": "master mind, game, classic", "supports": ["BANGLEJS2"], "storage": [ - {"name":"mmind.app.js","url":"app.js"}, - {"name":"mmind.img","url":"app-icon.js","evaluate":true} + {"name":"mmind.app.js","url":"mmind.app.js"}, + {"name":"mmind.img","url":"mmind.icon.js","evaluate":true} ] } ] From 4e40afbc87ef1c616c80e49d6cf0220b63310341 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Mon, 3 Jan 2022 15:44:09 +0100 Subject: [PATCH 040/122] Update apps.json --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 6f435fb82..50b2f3752 100644 --- a/apps.json +++ b/apps.json @@ -5069,9 +5069,9 @@ "shortName":"Master Mind", "icon": "mmind.png", "version":"0.01", - "description": "This is a classic mind game", + "description": "This is the classic game for masterminds", "type": "game", - "tags": "master mind, game, classic", + "tags": "mastermind, game, classic", "supports": ["BANGLEJS2"], "storage": [ {"name":"mmind.app.js","url":"mmind.app.js"}, From a6e7011b0d74fbbeb6b96f4c20dd3f43b60e7248 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Mon, 3 Jan 2022 15:58:29 +0100 Subject: [PATCH 041/122] create changelog --- apps/mmind/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/mmind/ChangeLog diff --git a/apps/mmind/ChangeLog b/apps/mmind/ChangeLog new file mode 100644 index 000000000..939ac3b5d --- /dev/null +++ b/apps/mmind/ChangeLog @@ -0,0 +1 @@ +0.01: First release From d12c58a6c6f07b1c8b47ebda14eadaf690510815 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Mon, 3 Jan 2022 17:07:29 +0100 Subject: [PATCH 042/122] Delete app-icon.js --- apps/mmind/app-icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/mmind/app-icon.js diff --git a/apps/mmind/app-icon.js b/apps/mmind/app-icon.js deleted file mode 100644 index 9bcedc5f3..000000000 --- a/apps/mmind/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -E.toArrayBuffer(atob("mEwgn/AF/ykYEMmUvAYPzAIX/rnMBIPzu93n4EB1OZBIW73U/+cQ/8Qn/05nM4f/+wXBt//+OZzOv//63e7j/zmI1Bn/1C4f3C4NzCQIXByf/nYXBDgPxKQM/+IvGv4XFF4QXF+ZfGAgQXBAgPyC4JpBC4QJBmEBQoUggQECmAEDBIR3BgURCgNnFQerEoXzp3kAgWIxBCBgMD+cC+JyD+JVD+nu91PBIIXBj/yj8h+MCOQSKCC4OzC4fj/84C4OPC4UiiQvEQogXCof//AvFgMBRQoXBAgVO9yPCL4cfiUziP/mMSQoUyiYECmguBAAMxkYDBkMf/4FCAH4A/AH4A/AH4A/AH4A/AH4Ap5gACAoM/BIXzAhgXE+MDBoXwh4EC+IEDBIYXE+UfBoXyl4ELI4pfXACPdAASrv")) From b33d629065fc0a57bbe3787ea2a61c2f29b1d667 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Mon, 3 Jan 2022 17:07:53 +0100 Subject: [PATCH 043/122] Add files via upload --- apps/mmind/mmind.icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/mmind/mmind.icon.js diff --git a/apps/mmind/mmind.icon.js b/apps/mmind/mmind.icon.js new file mode 100644 index 000000000..c6f72ca38 --- /dev/null +++ b/apps/mmind/mmind.icon.js @@ -0,0 +1 @@ +E.toArrayBuffer(atob("2GwxH+64A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A6gAAFEf5I/VtpEcEcZI/Dw4PbCQu0AApnZDIUeAAqLaDQUFAApIc3IAFEabHPa6StJWLKtJWLStJWLKtJWKieFChIPPCYquKWAZmUVxSwDV6quKWAYjUVxSwDVqQUIB56uTWCiuOWCquOWCiuOWByaFV5oPLVyiwSVyCwTVyCwSVyCwNTIqvMB5iv/V/6vQUpQPTVyqwQVySwRVySwQVySwNT6Kv/V/6v/V/6v/V/6v/V/6v/V/6v/V/6v/V/6v/V/6vvWCZBSV0CwUJCSuhV/6v/V/4PPWCBBRWCIjSWCJIUV0CvfWB6KTWB4jUWB5IWVz6viWBYdPEZCuMV6ywLJDCuMV+SxLRKyxMEbKxKJDitXCAQALB6AoTRS4jkJHyvoFRCJZEcxI8V9DyZEdpI/ZaQpTB4W0AApnZDIUFAAqLaDQXSAApIckYAFEaTLPbaatJWLKtJWLStJWLKtJWKaeKDAgPPEgyuKWAZmUVxSwDV6quKWAYjUVxSwDV7AZDB56uSWCiuOWCquOWCiuOWByWJBAoPPVyiwSVyCwTVyCwSVyCwNSpIKLB5qv/V/6vuVySwQVySwRVySwQVySwMV/6v/V/6uRV/6v/V8wNDV/6v/V9SuJV/6v/V8atEV/6v/V9KtLV/6v/V8SuNWCiKPWCYjQWCZISVzavSVopGLV/6v/V8RDPVz6wSEaSwRJCiuaV6KuSWCCKTWB4jUWB5IWVzKvKVAyuTCgauMMyqwLEaokDVxhIWVxgjNT46uKIiytcWJojZWJRIcVqygGAA4OOFhYUUJbIjYJH4bOV7AaIRLIjmJH4bMV7QA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A+goAHEbUeAA5s/ADO0ADitRWLStIWP6v/VxywWVxiw/V/quOWCiuOWH6v7VyCwSVyCw/V/6v/AH6vpVySwQVySw/V/6v/ABMAAAaXeEa6v/V+SKEWDwjYV/6v/V/6v/V/6v/V/6v/V/6v/V/6v/V+SMFVzgjZV/6vzAHaviWCZHQV36v/V/6v/V/awRJCSu/V/6vLWB5JUV36v/V5awNJSyu/V/6vLWJRMaVv6v/V5YA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AkA=")) \ No newline at end of file From 503b64e817b3c98a5dcea565888db4d0e26a99b3 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Mon, 3 Jan 2022 17:10:50 +0100 Subject: [PATCH 044/122] Update mmind.icon.js --- apps/mmind/mmind.icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mmind/mmind.icon.js b/apps/mmind/mmind.icon.js index c6f72ca38..976243b48 100644 --- a/apps/mmind/mmind.icon.js +++ b/apps/mmind/mmind.icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("2GwxH+64A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A6gAAFEf5I/VtpEcEcZI/Dw4PbCQu0AApnZDIUeAAqLaDQUFAApIc3IAFEabHPa6StJWLKtJWLStJWLKtJWKieFChIPPCYquKWAZmUVxSwDV6quKWAYjUVxSwDVqQUIB56uTWCiuOWCquOWCiuOWByaFV5oPLVyiwSVyCwTVyCwSVyCwNTIqvMB5iv/V/6vQUpQPTVyqwQVySwRVySwQVySwNT6Kv/V/6v/V/6v/V/6v/V/6v/V/6v/V/6v/V/6v/V/6vvWCZBSV0CwUJCSuhV/6v/V/4PPWCBBRWCIjSWCJIUV0CvfWB6KTWB4jUWB5IWVz6viWBYdPEZCuMV6ywLJDCuMV+SxLRKyxMEbKxKJDitXCAQALB6AoTRS4jkJHyvoFRCJZEcxI8V9DyZEdpI/ZaQpTB4W0AApnZDIUFAAqLaDQXSAApIckYAFEaTLPbaatJWLKtJWLStJWLKtJWKaeKDAgPPEgyuKWAZmUVxSwDV6quKWAYjUVxSwDV7AZDB56uSWCiuOWCquOWCiuOWByWJBAoPPVyiwSVyCwTVyCwSVyCwNSpIKLB5qv/V/6vuVySwQVySwRVySwQVySwMV/6v/V/6uRV/6v/V8wNDV/6v/V9SuJV/6v/V8atEV/6v/V9KtLV/6v/V8SuNWCiKPWCYjQWCZISVzavSVopGLV/6v/V8RDPVz6wSEaSwRJCiuaV6KuSWCCKTWB4jUWB5IWVzKvKVAyuTCgauMMyqwLEaokDVxhIWVxgjNT46uKIiytcWJojZWJRIcVqygGAA4OOFhYUUJbIjYJH4bOV7AaIRLIjmJH4bMV7QA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A+goAHEbUeAA5s/ADO0ADitRWLStIWP6v/VxywWVxiw/V/quOWCiuOWH6v7VyCwSVyCw/V/6v/AH6vpVySwQVySw/V/6v/ABMAAAaXeEa6v/V+SKEWDwjYV/6v/V/6v/V/6v/V/6v/V/6v/V/6v/V+SMFVzgjZV/6vzAHaviWCZHQV36v/V/6v/V/awRJCSu/V/6vLWB5JUV36v/V5awNJSyu/V/6vLWJRMaVv6v/V5YA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AkA=")) \ No newline at end of file +require("heatshrink").decompress(atob("2GwxH+64A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A6gAAFEf5I/VtpEcEcZI/Dw4PbCQu0AApnZDIUeAAqLaDQUFAApIc3IAFEabHPa6StJWLKtJWLStJWLKtJWKieFChIPPCYquKWAZmUVxSwDV6quKWAYjUVxSwDVqQUIB56uTWCiuOWCquOWCiuOWByaFV5oPLVyiwSVyCwTVyCwSVyCwNTIqvMB5iv/V/6vQUpQPTVyqwQVySwRVySwQVySwNT6Kv/V/6v/V/6v/V/6v/V/6v/V/6v/V/6v/V/6v/V/6vvWCZBSV0CwUJCSuhV/6v/V/4PPWCBBRWCIjSWCJIUV0CvfWB6KTWB4jUWB5IWVz6viWBYdPEZCuMV6ywLJDCuMV+SxLRKyxMEbKxKJDitXCAQALB6AoTRS4jkJHyvoFRCJZEcxI8V9DyZEdpI/ZaQpTB4W0AApnZDIUFAAqLaDQXSAApIckYAFEaTLPbaatJWLKtJWLStJWLKtJWKaeKDAgPPEgyuKWAZmUVxSwDV6quKWAYjUVxSwDV7AZDB56uSWCiuOWCquOWCiuOWByWJBAoPPVyiwSVyCwTVyCwSVyCwNSpIKLB5qv/V/6vuVySwQVySwRVySwQVySwMV/6v/V/6uRV/6v/V8wNDV/6v/V9SuJV/6v/V8atEV/6v/V9KtLV/6v/V8SuNWCiKPWCYjQWCZISVzavSVopGLV/6v/V8RDPVz6wSEaSwRJCiuaV6KuSWCCKTWB4jUWB5IWVzKvKVAyuTCgauMMyqwLEaokDVxhIWVxgjNT46uKIiytcWJojZWJRIcVqygGAA4OOFhYUUJbIjYJH4bOV7AaIRLIjmJH4bMV7QA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A+goAHEbUeAA5s/ADO0ADitRWLStIWP6v/VxywWVxiw/V/quOWCiuOWH6v7VyCwSVyCw/V/6v/AH6vpVySwQVySw/V/6v/ABMAAAaXeEa6v/V+SKEWDwjYV/6v/V/6v/V/6v/V/6v/V/6v/V/6v/V+SMFVzgjZV/6vzAHaviWCZHQV36v/V/6v/V/awRJCSu/V/6vLWB5JUV36v/V5awNJSyu/V/6vLWJRMaVv6v/V5YA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AkA=")) From d0583def6bcfb19282b827ae1deae61e84b9f5c7 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Mon, 3 Jan 2022 17:16:27 +0100 Subject: [PATCH 045/122] Delete mmind.app.js --- apps/mmind/mmind.app.js | 3395 --------------------------------------- 1 file changed, 3395 deletions(-) delete mode 100644 apps/mmind/mmind.app.js diff --git a/apps/mmind/mmind.app.js b/apps/mmind/mmind.app.js deleted file mode 100644 index 52a566ca9..000000000 --- a/apps/mmind/mmind.app.js +++ /dev/null @@ -1,3395 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BangleApps/app.js at master · psbest/BangleApps - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - -
- - - -
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- -
- - - psbest  /   - BangleApps  /   - -
- - - - Type # for issues and pull requests, > for commands, and ? for help - - - Type # for issues, pull requests, and projects, > for commands, and ? for help - - - Type # for issues, pull requests, and projects, / for files, and > for commands - - -
- -
-
- We’ve encountered an error and some results aren't available at this time. Type a new search or try again later. -
-
- - No results matched your search - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - Search for issues and pull requests - - # - - - - Search for issues, pull requests, discussions, and projects - - # - - - - Search for organizations, repositories, and users - - @ - - - - Search for projects - - ! - - - - Search for files - - / - - - - Activate command mode - - > - - - - Search your issues, pull requests, and discussions - - # author:@me - - - - Search your issues, pull requests, and discussions - - # author:@me - - - - Filter to pull requests - - # is:pr - - - - Filter to issues - - # is:issue - - - - Filter to discussions - - # is:discussion - - - - Filter to projects - - # is:project - - - - Filter to open issues, pull requests, and discussions - - # is:open - - - - - - - - - - - - - - - - -
-
-
- -
- - - - - - - - - - -
- - - - -
-
-
- - - - - - - - - - -
- -
- -
-

- - - / - - BangleApps - - - Public -

- - forked from espruino/BangleApps - - -
- -
    - -
  • - -
    - - - - - - - Watch - - - 0 - - - -
    -
    -

    Notifications

    - -
    - -
    -
    - - - - - - - - -
    - - -
    - - - - - Get push notifications on iOS or Android. - -
    -
    -
    -
    - - -
    -
    -
    - - - -
  • - - -
  • - - -
  • - -
  • - -
    -
    - -
    -
    - -
    -
    - - - - - -
    - -
    -
    - - - - - - - -
    - -
    -
    -
    -
    -
    -
  • - - -
  • - - -
  • -
- -
- -
-
- - - - -
- - - -
-
- - Open in github.dev - Open in a new github.dev tab - - - - - - - -
- - - - - Permalink - - -
- -
-
- - - master - - - - -
-
-
- Switch branches/tags - -
- - - -
- -
- -
- - -
- -
- - - - - - - - - - - - - - - - -
- - -
-
-
-
- -
- -
- - - - Go to file - - -
- - - - -
-
-
- - - - -
- -
-
-
 
-
- -
-
 
- Cannot retrieve contributors at this time -
-
- - - - - - - - - - - -
- -
- - -
- - 198 lines (178 sloc) - - 4.59 KB -
- -
- - - - -
- - - - - - - - - - - - - - - -
- -
-
- -
-
- -
- -
-
- - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//MMind
-
//set vars
const H = g.getWidth();
const W = g.getHeight();
var touch_actions = [];
var cols = ["#FF0000","#00FF00","#0000FF", "#FF00FF", "#FFFF00", "#00FFFF", "#000000","#FFFFFF"];
var turn = 0;
var col_menu = false;
//pinsRow = 6;
//pinsThick = 10;
//pinsRow = 5;
//pinsThick = 10;
var pinsRow = 4;
var pinsThick = 10;
var play = [-1, -1, -1, -1];
-
var pinsCol = 5;
var playx = -1;
var sx = (W - 30 )/pinsRow;
var sy = (H - 20 )/7;
var touch_actions = [];
var secret = [];
var secret_no_dub = true;
var endgame = false;
-
g.clear();
g.setColor("#FFFFFF");
g.fillRect(0, 0, H, W);
g.setFont("Vector12",45);
-
function draw() {
touch_actions = [];
g.clear();
g.setColor("#FFFFFF");
g.fillRect(0, 0, H, W);
g.setColor("#000000");
//draw scores
for (y=0;y<game.length;y+=1) {
pp = game[y][0];
ps = game[y][1];
g.setColor("#000000");
//g.fillRect(W-30,10, W-30, 15);
g.setColor("#000000");
g.setFont("Vector30",10);
g.drawString(ps[0],W-31,y*sy+8);
g.setColor("#000000");
g.drawString(ps[1],W-15,y*sy+8);
g.setColor("#000000");
for (x=0;x<pinsRow;x+=1) {
xx = sx*x + pinsThick + 5;
yy = sy*y+20;
xc = pp[x];
g.setColor(cols[xc]);
g.fillCircle(xx,yy , pinsThick );
g.setColor("#000000");
g.drawCircle(xx,yy,pinsThick+1);
g.drawCircle(xx,yy,pinsThick);
}
}
//draw play input
for (k=0; k<pinsRow; k+=1){
xx = sx*k + pinsThick + 5;
yy = sy*7;
touch_actions.push([[xx-pinsThick-5, yy-pinsThick-10, xx+pinsThick+5, yy+pinsThick+20],[1,k]]);
if (play[k] < 0) {
//col not choisen, draw small dot
g.setColor("#000000");
g.fillCircle(xx,yy , 3 );
} else {
g.setColor(cols[play[k]]);
g.fillCircle(xx,yy , pinsThick );
-
}
}
// draw action button
// score, men
if (!endgame) {
if (col_menu) {
draw_col_choice();
} else {
// check if all pins are set yet
if (Math.min.apply(null,play) < 0) {
g.setColor("#FF0000");
} else {
g.setColor("#00FF00");
touch_actions.push([[W-30, H-30,192, 190], [3,1]]);
}
g.fillRect(W-30, H-30, W-1, H-10);
}
} else {
g.setColor("#0000FF");
touch_actions.push([[W-30, H-30,192, 190], [4,1]]);
g.fillRect(W-30, H-30, W-1, H-10);
}
}
-
function get_secret() {
//secret=[];
for (i=0; i<pinsRow; i+=1) {
s = Math.round(Math.random()*pinsCol);
if (secret_no_dub)
while(secret.indexOf(s) >= 0) s = Math.round(Math.random()*pinsCol);
secret[i]= s;
}
}
-
function score() {
bScore = 0;
wScore = 0;
for (i=0; i<pinsRow; i+=1) {
if (secret[i] == play[i]) {
bScore +=1;
}
else {
for (s=0; s<pinsRow; s+=1) {
if (secret[i] == play[s]) {
wScore +=1;
break;
}
}
}
}
-
return([bScore, wScore]);
}
-
function draw_col_choice(){
var cc = g.getColor();
var boxw = 30;
var boxh = H/pinsRow-20;
for (i=0; i<=pinsCol; i+=1) {
g.setColor(cols[i]);
g.fillRect(W-boxw, i*boxh, W-1, i*boxh+boxh);
touch_actions.push([[150, i*boxh, 191, i*boxh+boxh], [2,i]]);
g.setColor(cc);
}
-
}
-
Bangle.on('touch', function(zone,e) {
//console.log(e.x, e.y);
// check touch actions array to see what to do
for(i=0; i<touch_actions.length; i+=1) {
if (e.x > touch_actions[i][0][0] && e.x < touch_actions[i][0][2] &&
e.y > touch_actions[i][0][1] && e.y < touch_actions[i][0][3]) {
// a action is hit, add acctions here, todo: start, stop, new, etc.
switch (touch_actions[i][1][0]) {
case 1:
//get pins col menu
col_menu = 1;
playx = touch_actions[i][1][1];
break;
case 2:
//copy choice col to play
play[playx] = touch_actions[i][1][1];
col_menu = 0;
break;
case 3:
//score play
var sc;
sc = score();
game.push([play, sc]);
play = [-1,-1,-1,-1];
turn+=1;
if (turn==6 || sc[0]==pinsRow) {
play = secret;
col_menu = 0;
endgame = true;
}
break;
case 4:
//new game
play = [-1,-1,-1,-1];
game = [];
endgame=false;
break;
}
}
}
//console.log(touch_actions[i][1][0], touch_actions[i][1][1]);
draw();
}
);
-
-
game = [];
get_secret();
draw();
//Bangle.loadWidgets();
//Bangle.drawWidgets();
-
-
-
-
-
- - - -
- -
- - - - -
- - -
- - -
-
- - - - -
- - - -
-
- -
-
- -
- - - - - - - - - - - - - - - - - - - - - - From ade75a3e7ce323cad8f862213fe1d68ec20aafce Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Mon, 3 Jan 2022 17:18:11 +0100 Subject: [PATCH 046/122] Add files via upload --- apps/mmind/mmind.app.js | 198 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 apps/mmind/mmind.app.js diff --git a/apps/mmind/mmind.app.js b/apps/mmind/mmind.app.js new file mode 100644 index 000000000..e7def025d --- /dev/null +++ b/apps/mmind/mmind.app.js @@ -0,0 +1,198 @@ +//MMind + +//set vars +const H = g.getWidth(); +const W = g.getHeight(); +var touch_actions = []; +var cols = ["#FF0000","#00FF00","#0000FF", "#FF00FF", "#FFFF00", "#00FFFF", "#000000","#FFFFFF"]; +var turn = 0; +var col_menu = false; +//pinsRow = 6; +//pinsThick = 10; +//pinsRow = 5; +//pinsThick = 10; +var pinsRow = 4; +var pinsThick = 10; +var play = [-1, -1, -1, -1]; + +var pinsCol = 5; +var playx = -1; +var sx = (W - 30 )/pinsRow; +var sy = (H - 20 )/7; +var touch_actions = []; +var secret = []; +var secret_no_dub = true; +var endgame = false; + +g.clear(); +g.setColor("#FFFFFF"); +g.fillRect(0, 0, H, W); +g.setFont("Vector12",45); + +function draw() { + touch_actions = []; + g.clear(); + g.setColor("#FFFFFF"); + g.fillRect(0, 0, H, W); + g.setColor("#000000"); + //draw scores + for (y=0;y= 0) s = Math.round(Math.random()*pinsCol); + secret[i]= s; + } + } + +function score() { + bScore = 0; + wScore = 0; + for (i=0; i touch_actions[i][0][0] && e.x < touch_actions[i][0][2] && + e.y > touch_actions[i][0][1] && e.y < touch_actions[i][0][3]) { + // a action is hit, add acctions here, todo: start, stop, new, etc. + switch (touch_actions[i][1][0]) { + case 1: + //get pins col menu + col_menu = 1; + playx = touch_actions[i][1][1]; + break; + case 2: + //copy choice col to play + play[playx] = touch_actions[i][1][1]; + col_menu = 0; + break; + case 3: + //score play + var sc; + sc = score(); + game.push([play, sc]); + play = [-1,-1,-1,-1]; + turn+=1; + if (turn==6 || sc[0]==pinsRow) { + play = secret; + col_menu = 0; + endgame = true; + } + break; + case 4: + //new game + play = [-1,-1,-1,-1]; + game = []; + endgame=false; + break; + } + } + } + //console.log(touch_actions[i][1][0], touch_actions[i][1][1]); + + draw(); + } +); + + +game = []; +get_secret(); +draw(); +//Bangle.loadWidgets(); +//Bangle.drawWidgets(); + + + + + From 383d183fa8fa302b8ac1db20b5f1b80935978806 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Mon, 3 Jan 2022 17:33:12 +0100 Subject: [PATCH 047/122] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 50b2f3752..b195a5ee3 100644 --- a/apps.json +++ b/apps.json @@ -5073,6 +5073,7 @@ "type": "game", "tags": "mastermind, game, classic", "supports": ["BANGLEJS2"], + "allow_emulator": true, "storage": [ {"name":"mmind.app.js","url":"mmind.app.js"}, {"name":"mmind.img","url":"mmind.icon.js","evaluate":true} From 1241dba5e4833d57b72d5fcdec13218213a7cc44 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Mon, 3 Jan 2022 17:51:01 +0100 Subject: [PATCH 048/122] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index b195a5ee3..eaab9e297 100644 --- a/apps.json +++ b/apps.json @@ -5072,6 +5072,7 @@ "description": "This is the classic game for masterminds", "type": "game", "tags": "mastermind, game, classic", + "readme":"README.md", "supports": ["BANGLEJS2"], "allow_emulator": true, "storage": [ From b4809c9cdd81b1f358697e10f9e8d805db10bfc9 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Tue, 4 Jan 2022 21:32:54 +0100 Subject: [PATCH 049/122] Add files via upload --- apps/mmind/mmind.png | Bin 1546 -> 712 bytes apps/mmind/screenshot_mmind.png | Bin 0 -> 2577 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/mmind/screenshot_mmind.png diff --git a/apps/mmind/mmind.png b/apps/mmind/mmind.png index 8afcc26974bc8eaa2239927b33b4d566e8df42ba..14a3ef7c647be749a768209a9dfaea0a09ab960f 100644 GIT binary patch delta 674 zcmeC;Il-#f8Q|y6%O%Cdz`(%k>ERLtq&I*t3p0?6o%u6&qN0MLM1W6->;M1%fkJTn zp8+iJ|9^zugt-&##Os+XJzX3_GVZ;dh9r6B4J?RMuJ;D?~a9lms4|@hr&o{8I0!Jl|U;hi%dQ8^(G6 z_$;&7>u-B@EPwyI`M`|lk3VY6OO0zw?3nst!ViPfqA91Rrhv%aCll(qPrKVk6&yd{ zFLtMR!&ABYk~fOl&$sPpTlkP?&@;u zUFtV}pd@_ctY-3|SNc0^pFOQV$hxe=^!U$((^Y0ITX*KQMW4~*?U}QDia$ww+fl;5 zXZO$%B z(=)p5(zmpO50o%u)+fz~teY_ZWBoy}E05?rl6`A?;LjXy&kYuA%pZ0gxLVd4z!i62 sJ9ho<(AUSms(Eak$?h27=k=E%;69JIf)@8nU>alaboFyt=akR{0Iy3qcK`qY delta 1534 zcmVVGd00o~(L_t(oN9~whXcJi!$4|4vSQ>^XVUQGBv)Tq9N-X_g zDN>45MXKzB4`N|g5h;BTKj=d!ODK^N(G6*#Y4;&Q9}2dLEKyQQLHtPZ#g8bpq7Vz4 zpx8>bwN2aDWMl81JNKrUiPU-Ze_?(zOwK)L?w!NE=bvP52_Xc2BuxDChv6rW$AcdW z3kw4S19$J<-L`F;-EL>GP2%ym&*z(*oWzjTYUSQMb8~b3{r%(P;}|M0FX!Gou~_Wt z)vJ+6WY3;G+qZA$UVv;id;k7@bh2hN8Z9X)kt7Ll$r6b~kKO(+04`n_e<0}hqjQr- zj~-bEt&pK%DJX@)As$eeo}RYZt^uSlEQ+JU!=pT)5DtZdQjh@2KxWW7h(j^|)2B~s zYimnOOVM6kT|IvMxXor885zMQO{lxA?LQ?Oc8&-FK8E%qYRqm=njDYNw7Z(>< z6sfOw0esyIi=zMI$B!(8f46yMFMUG(bXU1?KnzVyO}%~l*6DPjy|lD+>((t?0hSQ0 zp;~i?t#+!LO}%Mko}Lq9$slYByaMp^o zI0$zUa{Kn}nwlES45zcZyZi9r!)S}5NDU05%IrOM$ji(hELPc|)vAaLf|3*t6|3yp zHCrl0i*|HW933q@6$ypIQZPtknT&O?pfc=bHk+}ial#%ye}3H5)UKqWI_M58iyRaHJhPp_;|nafrG^(%cMJN?zrY5UaS+YW-vRMmP z8G_%yc*SMHe@fc9bLZIDSZizRsZ*!uV0Jvz#5F2Qt2Biq%^H=_-YOD_LSMYioYbgH zPH(BQmX;PQrhE79(S!mg1Lh$!9T(^jDjq(3IN8^?kz6NIe(~bPu3fu&dwZWfdlm=;aQV8rx{SXcdKd}mVI-u7 zk&qrne?oc~3F%=Zq=%7^9!5fX7zycNB&3ItkRFBivR8QEJ0;j;(7ZcS)|HJT zR1;2mdbt1lY`tV$Wig0dhwErKz|jF6N~$U%0ON|$0#LjgL-&Q?=1pqU)j@l^;?iSo k4*L4It;N`m`91*u1O9JFJ2Em3SpWb407*qoM6N<$f?a&%7XSbN diff --git a/apps/mmind/screenshot_mmind.png b/apps/mmind/screenshot_mmind.png new file mode 100644 index 0000000000000000000000000000000000000000..5c886e7e82c0a3a78ed1344837f32e33ecd639eb GIT binary patch literal 2577 zcmeHJ`#Td18=f`iPi93)YNl+N>Ez6E$T2ldFO$PqCE*pr*hVq0_hp+y)X2GnksJ!m zhs{2(P?Qg`G-ggEVHsW&msfwl_sjS5`@?hJ*Kc5!Ft)_Nzs zh6Qu>o%dc^tzxUmkj;{-P+aRHnceBu;ARBP66hcO3Gu@PKvSC>1c5gOhn$ub()Q%) zCGvBN&oP_=4mTUgfOxB`SS#Q(zg*EsIlg^@dGrI(ZDwemf-guO2xh_zz73Q;t45!n zajRzQE$wvOLR;5h?7LGy#qyRd5-Z8u8d;9P=&KZE4Wk#uHEqvJ9Y-1q8zRx`LZeUy z^+NjbL#?E($9ybNAWesu8!Xw{V($&eHi1M^FS=(Tj*BI7Ql)D*I2iQwc_8Ovuhz_j z|AUS;>wr>dAiDRR(Eq`UiUUu&Yq-TY)7v%h7e$tgJWc=oWT4ujgK!!j+M?cr?|RTy z?NMF{KPh>EaJZyNVTareswpoXyh~aRi}?26>o>P*`AQU4kr%AaYf6zC$3~*oG=fch z65EkS(M6obqSTQqkR~TF2zJ-Dhh5liSl2ageNz8UZd)#= z$mDK8SvO)^8_BAMo)6r|bRC_1lzwl{`b=?k{hnfbGk%U$x)$ ztRsI2l#v?sM{~+JdF{Lt+Bi$wSX;58@-qa;*?4gv^hPp zY^~2SoQWLT>@;({B&}7N&uj3M5!_zQsN=E5B2Ey6cau$3E8@174RQ0G=zWd3YkpVy z8Q+yRLgE?uBFO5qisa5X>9B}cpj@b#u;Ctb0Z)K?_O$B5$LZ=)eaq+eA`D#sJc8=V zxt^Kd)%u>hGZUCJFtI4omGwJF`?`|Im((@p5=plvbs-SstOtn@xb6{6sA|*pYc8*T zd0041D<8+zr`w3B1snb#(f#%fclM1PCZF^J1dp1~k63)uxni);x$rfDxc(U>I6LnOlcyh`Z~SRxYm`5viE)1x1B`F=~GD$S10%0+T3YaSfVA! zxg5v%+7;B!ZE>krVymgi^B(Y76PT_fA1gr3bc8TO+IxZTcb+xDKHbGM_YL#k&zoS%KL*uPFkYpn{xDdC5; z7Wr`k(mMWxJ}QyB{Ji@_0-`B8&sH_8-`Xa~{7VWs17qO*XM&oa$I0079)2RBlFhxZzLp<#1v=KhJ6N{6O9RU4|MAIZ;B zsUCQ@dQogjA6wa!wZq9SWvzP%!1TD8A|(h^sF;=47M^AHC-gKj1sF7=4I?^=un?r) zlGZWLh&k}T5%qTXs!k=!Fa!x-oQEK<8l|T3Rq9Pr^x-PB)|=OG0fFnR=$|KuL?~~Q zT}`iju{Y`y3IYq+(iO4g^8 T#S9|s{&)Zv2aJ8KT|m;`rbCOu literal 0 HcmV?d00001 From 786b13925cf1a3097706ec11a5c10565431e8fa9 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Tue, 4 Jan 2022 22:32:36 +0100 Subject: [PATCH 050/122] Add files via upload --- apps/mmind/README.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 apps/mmind/README.md diff --git a/apps/mmind/README.md b/apps/mmind/README.md new file mode 100644 index 000000000..508a158dd --- /dev/null +++ b/apps/mmind/README.md @@ -0,0 +1,34 @@ +# Mastermind + +Play the classic mind game mastermind on your Bangles 2. + +![](screenshot_mmind.png) + + +## Game +The game will start when run. +Four colors pins are randomly choosen and kept secret. +You need to find the secret by scoring your choise within 6 turns. +The game makes use of touch features. + + +## Play +Select one of the dots, the color menu will show, select a colour for the pin. +If all pins are choosen with a color the red button will turn green. +Hit the green button and your play will be scored and listed from the top. +The first digit shows the number of pins with the correct color and in the right place. +The second digit gives the number of pins with the correct color but in the wrong place. +There are six turns to get the correct secret. +The blue button will start a new game. + + +## Requests + +This is the first version, things to add: +Add menu to change game options number of colors, 5 pins per row. +Add feature to drag screen up and down to see more scores + + +## Creator + +This game is created by Peter Slendebroek. \ No newline at end of file From 1fdf05958dbd13af0e65ff30d0c044208a8c737f Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Tue, 4 Jan 2022 22:36:51 +0100 Subject: [PATCH 051/122] Update README.md --- apps/mmind/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/mmind/README.md b/apps/mmind/README.md index 508a158dd..e09b5b966 100644 --- a/apps/mmind/README.md +++ b/apps/mmind/README.md @@ -13,6 +13,7 @@ The game makes use of touch features. ## Play +The screen needs to be unlocked. Select one of the dots, the color menu will show, select a colour for the pin. If all pins are choosen with a color the red button will turn green. Hit the green button and your play will be scored and listed from the top. @@ -25,10 +26,11 @@ The blue button will start a new game. ## Requests This is the first version, things to add: -Add menu to change game options number of colors, 5 pins per row. -Add feature to drag screen up and down to see more scores - +... +Add a menu to change game options like the number of colors, allow double colors, 5 pins per row. +Add feature to drag screen up and down to see more scores. +Times and high score ## Creator -This game is created by Peter Slendebroek. \ No newline at end of file +This game is created by Peter Slendebroek. From ed9b7f2e6b148f10a8a2b7f07bd4c12ea8622b02 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Tue, 4 Jan 2022 22:44:04 +0100 Subject: [PATCH 052/122] Update README.md --- apps/mmind/README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/apps/mmind/README.md b/apps/mmind/README.md index e09b5b966..0623459f7 100644 --- a/apps/mmind/README.md +++ b/apps/mmind/README.md @@ -25,11 +25,10 @@ The blue button will start a new game. ## Requests -This is the first version, things to add: -... -Add a menu to change game options like the number of colors, allow double colors, 5 pins per row. -Add feature to drag screen up and down to see more scores. -Times and high score +This is the first version, things to add are:/ +Add a menu to change game options like the number of colors, allow double colors, 5 pins per row./ +Add feature to drag screen up and down to see more scores./ +Timer and high score./ ## Creator From 8931817a2b23ec5740346ab4c571de520153a189 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Tue, 4 Jan 2022 23:00:36 +0100 Subject: [PATCH 053/122] Add files via upload --- apps/mmind/mmind.info | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 apps/mmind/mmind.info diff --git a/apps/mmind/mmind.info b/apps/mmind/mmind.info new file mode 100644 index 000000000..a6dccde65 --- /dev/null +++ b/apps/mmind/mmind.info @@ -0,0 +1,5 @@ +require("Storage").write("mmind.info",{ + "id":"mmind", + "name":"Master Mindr", + "src":"mmind.app.js" +}); \ No newline at end of file From cd71d7937d636d2b3ba77b62b6edec5ecda3f0d7 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Tue, 4 Jan 2022 23:02:47 +0100 Subject: [PATCH 054/122] Update mmind.info --- apps/mmind/mmind.info | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/apps/mmind/mmind.info b/apps/mmind/mmind.info index a6dccde65..2e79822b1 100644 --- a/apps/mmind/mmind.info +++ b/apps/mmind/mmind.info @@ -1,5 +1,17 @@ -require("Storage").write("mmind.info",{ - "id":"mmind", - "name":"Master Mindr", - "src":"mmind.app.js" -}); \ No newline at end of file + { + "id": "mmind", + "name": "Classic Mind Game", + "shortName":"Master Mind", + "icon": "mmind.png", + "version":"0.01", + "description": "This is the classic game for masterminds", + "type": "game", + "tags": "mastermind, game, classic", + "readme":"README.md", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"mmind.app.js","url":"mmind.app.js"}, + {"name":"mmind.img","url":"mmind.icon.js","evaluate":true} + ] + } From 71504a7414dc35d136ae1cd45b991289fab1ec9a Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 12:16:14 +0100 Subject: [PATCH 055/122] Setting to toggle visibility of widgets Setting to set minimal heart rate --- apps/circlesclock/app.js | 45 +++++++++++++++++++++-------------- apps/circlesclock/settings.js | 18 ++++++++++++++ 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 026b47cc6..f123e0c2a 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -8,12 +8,13 @@ const powerIconGreen = heatshrink.decompress(atob("h0OwYQNkAEDpAEDiQEDkmSAgUJkmA const powerIconRed = heatshrink.decompress(atob("h0OwYQNoAEDyAEDkgEDpIFDiVJBweSAgUJkmAAoYZDgQpEBwYAJA")); let settings; - function loadSettings() { settings = require("Storage").readJSON("circlesclock.json", 1) || { + 'minHR': 40, 'maxHR': 200, 'stepGoal': 10000, - 'batteryWarn': 30 + 'batteryWarn': 30, + 'showWidgets': false }; // Load step goal from pedometer widget as fallback if (settings.stepGoal == undefined) { @@ -21,18 +22,21 @@ function loadSettings() { settings.stepGoal = d != undefined && d.settings != undefined ? d.settings.goal : 10000; } } +loadSettings(); +const showWidgets = settings.showWidgets || false; +let hrtValue; + +// layout values: const colorFg = g.theme.dark ? '#fff' : '#000'; const colorBg = g.theme.dark ? '#000' : '#fff'; const colorGrey = '#808080'; const colorRed = '#ff0000'; const colorGreen = '#00ff00'; - -let hrtValue; - -const h = g.getHeight(); +const widgetOffset = showWidgets ? 12 : 0; +const h = g.getHeight() - widgetOffset; const w = g.getWidth(); -const hOffset = 30; +const hOffset = 30 - widgetOffset; const h1 = Math.round(1 * h / 5 - hOffset); const h2 = Math.round(3 * h / 5 - hOffset); const h3 = Math.round(8 * h / 8 - hOffset); @@ -102,7 +106,7 @@ function drawHeartRate() { g.fillCircle(w2, h3, radiusOuter); if (hrtValue != undefined && hrtValue > 0) { - const minHR = 40; + const minHR = settings.minHR || 40; const percent = (hrtValue - minHR) / (settings.maxHR - minHR); drawGauge(w2, h3, percent, colorRed); } @@ -233,19 +237,24 @@ Bangle.on('charging', function(charging) { }); 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. - */ -if (typeof WIDGETS === "object") { - for (let wd of WIDGETS) { - wd.draw = () => {}; - wd.area = ""; +if (!showWidgets) { + /* + * 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. + */ + if (WIDGETS && typeof WIDGETS === "object") { + for (let wd of WIDGETS) { + wd.draw = () => {}; + wd.area = ""; + } } } -loadSettings(); + + setInterval(draw, 60000); draw(); Bangle.setUI("clock"); diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index ffda51538..15596ff18 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -8,6 +8,16 @@ } E.showMenu({ '': { 'title': 'circlesclock' }, + 'min heartrate': { + value: "minHR" in settings ? settings.minHR : 40, + min: 0, + max : 250, + step: 10, + format: x => { + return x; + }, + onchange: x => save('minHR', x), + }, 'max heartrate': { value: "maxHR" in settings ? settings.maxHR : 200, min: 20, @@ -38,6 +48,14 @@ }, onchange: x => save('batteryWarn', x), }, + 'show widgets': { + value: "showWidgets" in settings ? settings.showWidgets : false, + format: () => (settings.showWidgets ? 'Yes' : 'No'), + onchange: () => { + settings.showWidgets = !settings.showWidgets; + save('showWidgets', settings.showWidgets); + }, + }, '< Back': back, }); }); From c41bae14c9e6c5a0dc8d33163415a03787baa632 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 12:16:38 +0100 Subject: [PATCH 056/122] Update README --- apps/circlesclock/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/circlesclock/README.md b/apps/circlesclock/README.md index 66d9afe08..df47c369b 100644 --- a/apps/circlesclock/README.md +++ b/apps/circlesclock/README.md @@ -8,13 +8,11 @@ It shows besides time, date and day of week the following information: * Battery (including charging and battery low) ## Screenshot - ![Screenshot](screenshot.png) ## TODO * Show weather information * Configure which information to show in each circle -* Configure visibility of widgets ## Creator Marco ([myxor](https://github.com/myxor)) From 766d3cc1892874b5a8be3f611c3e4335da236c80 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 13:27:50 +0100 Subject: [PATCH 057/122] Make the types of the circles configurable --- apps/circlesclock/app.js | 163 ++++++++++++++++++++++++---------- apps/circlesclock/settings.js | 29 ++++++ 2 files changed, 144 insertions(+), 48 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index f123e0c2a..58055e96e 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -14,7 +14,10 @@ function loadSettings() { 'maxHR': 200, 'stepGoal': 10000, 'batteryWarn': 30, - 'showWidgets': false + 'showWidgets': false, + 'circle1': 'hr', + 'circle2': 'steps', + 'circle3': 'battery' }; // Load step goal from pedometer widget as fallback if (settings.stepGoal == undefined) { @@ -32,7 +35,9 @@ const colorFg = g.theme.dark ? '#fff' : '#000'; const colorBg = g.theme.dark ? '#000' : '#fff'; const colorGrey = '#808080'; const colorRed = '#ff0000'; -const colorGreen = '#00ff00'; +const colorGreen = '#008000'; +const colorBlue = '#0000ff'; +const colorYellow = '#ffff00'; const widgetOffset = showWidgets ? 12 : 0; const h = g.getHeight() - widgetOffset; const w = g.getWidth(); @@ -63,82 +68,137 @@ function draw() { 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(); + drawCircle(1, "steps"); + drawCircle(2, "hr"); + drawCircle(3, "battery"); } +function drawCircle(index, defaultType) { + const type = settings['circle' + index] || defaultType; + const w = index == 1 ? w1: index == 2 ? w2 : w3; -function drawSteps() { + switch (type) { + case "steps": + drawSteps(w); + break; + case "stepsDist": + drawStepsDistance(w); + break; + case "hr": + drawHeartRate(w); + break; + case "battery": + drawBattery(w); + break; + } +} +function getCirclePosition(type, defaultPos) { + for (let i = 1; i <= 3; i++) { + const setting = settings['circle' + i]; + if (setting == type) return i; + } + return defaultPos; +} + +function isCircleEnabled(type) { + return getCirclePosition(type) != undefined; +} + +function drawSteps(w) { + if (!w) w = getCirclePosition("steps", w1); const steps = getSteps(); - const blue = '#0000ff'; g.setColor(colorGrey); - g.fillCircle(w1, h3, radiusOuter); + g.fillCircle(w, h3, radiusOuter); const stepGoal = settings.stepGoal || 10000; if (stepGoal > 0) { let percent = steps / stepGoal; if (stepGoal < steps) percent = 1; - drawGauge(w1, h3, percent, blue); + drawGauge(w, h3, percent, colorBlue); } g.setColor(colorBg); - g.fillCircle(w1, h3, radiusInner); + g.fillCircle(w, h3, radiusInner); - g.fillPoly([w1, h3, w1 - 15, h3 + radiusOuter + 5, w1 + 15, h3 + radiusOuter + 5]); + g.fillPoly([w, h3, w - 15, h3 + radiusOuter + 5, w + 15, h3 + radiusOuter + 5]); g.setFont("Vector:12"); g.setFontAlign(0, 0); g.setColor(colorFg); - g.drawString(shortValue(steps), w1 + 2, h3); + g.drawString(shortValue(steps), w + 2, h3); - g.drawImage(shoesIcon, w1 - 6, h3 + radiusOuter - 6); + g.drawImage(shoesIcon, w - 6, h3 + radiusOuter - 6); } -function drawHeartRate() { +function drawStepsDistance(w) { + if (!w) w = getCirclePosition("steps", w1); + const steps = getSteps(); + const stepDistance = 0.8; // TODO make configurable + const stepsDistance = steps * stepDistance; + g.setColor(colorGrey); - g.fillCircle(w2, h3, radiusOuter); + g.fillCircle(w, h3, radiusOuter); + + const stepDistanceGoal = settings.stepDistanceGoal || 5; + if (stepDistanceGoal > 0) { + let percent = stepsDistance / stepDistanceGoal; + if (stepDistanceGoal < stepsDistance) percent = 1; + drawGauge(w, h3, percent, colorGreen); + } + + g.setColor(colorBg); + g.fillCircle(w, h3, radiusInner); + + g.fillPoly([w, h3, w - 15, h3 + radiusOuter + 5, w + 15, h3 + radiusOuter + 5]); + + g.setFont("Vector:12"); + g.setFontAlign(0, 0); + g.setColor(colorFg); + g.drawString(shortValue(stepsDistance), w + 2, h3); + + g.drawImage(shoesIcon, w - 6, h3 + radiusOuter - 6); +} + +function drawHeartRate(w) { + if (!w) w = getCirclePosition("hr", w2); + g.setColor(colorGrey); + g.fillCircle(w, h3, radiusOuter); if (hrtValue != undefined && hrtValue > 0) { const minHR = settings.minHR || 40; const percent = (hrtValue - minHR) / (settings.maxHR - minHR); - drawGauge(w2, h3, percent, colorRed); + drawGauge(w, h3, percent, colorRed); } g.setColor(colorBg); - g.fillCircle(w2, h3, radiusInner); + g.fillCircle(w, h3, radiusInner); - g.fillPoly([w2, h3, w2 - 15, h3 + radiusOuter + 5, w2 + 15, h3 + radiusOuter + 5]); + g.fillPoly([w, h3, w - 15, h3 + radiusOuter + 5, w + 15, h3 + radiusOuter + 5]); g.setFont("Vector:12"); g.setFontAlign(0, 0); g.setColor(colorFg); - g.drawString(hrtValue != undefined ? hrtValue : "-", w2, h3); + g.drawString(hrtValue != undefined ? hrtValue : "-", w, h3); - g.drawImage(heartIcon, w2 - 6, h3 + radiusOuter - 6); + g.drawImage(heartIcon, w - 6, h3 + radiusOuter - 6); } -function drawBattery() { +function drawBattery(w) { + if (!w) w = getCirclePosition("battery", w3); const battery = E.getBattery(); - const yellow = '#ffff00'; g.setColor(colorGrey); - g.fillCircle(w3, h3, radiusOuter); + g.fillCircle(w, h3, radiusOuter); if (battery > 0) { const percent = battery / 100; - drawGauge(w3, h3, percent, yellow); + drawGauge(w, h3, percent, colorYellow); } g.setColor(colorBg); - g.fillCircle(w3, h3, radiusInner); + g.fillCircle(w, h3, radiusInner); - g.fillPoly([w3, h3, w3 - 15, h3 + radiusOuter + 5, w3 + 15, h3 + radiusOuter + 5]); + g.fillPoly([w, h3, w - 15, h3 + radiusOuter + 5, w + 15, h3 + radiusOuter + 5]); g.setFont("Vector:12"); g.setFontAlign(0, 0); @@ -156,9 +216,9 @@ function drawBattery() { } } g.setColor(color); - g.drawString(battery + '%', w3, h3); + g.drawString(battery + '%', w, h3); - g.drawImage(icon, w3 - 6, h3 + radiusOuter - 6); + g.drawImage(icon, w - 6, h3 + radiusOuter - 6); } function radians(a) { @@ -210,30 +270,37 @@ function getSteps() { Bangle.on('lock', function(isLocked) { if (!isLocked) { - Bangle.setHRMPower(1, "watch"); - if (hrtValue == undefined) { - hrtValue = '...'; - drawHeartRate(); + if (isCircleEnabled("hr")) { + Bangle.setHRMPower(1, "watch"); + if (hrtValue == undefined) { + hrtValue = '...'; + drawHeartRate(); + } } } else { - Bangle.setHRMPower(0, "watch"); + if (isCircleEnabled("hr")) { + Bangle.setHRMPower(0, "watch"); + } } - drawHeartRate(); - drawSteps(); + if (isCircleEnabled("hr")) drawHeartRate(); + if (isCircleEnabled("steps")) drawSteps(); + if (isCircleEnabled("stepsDistance")) drawStepsDistance(); }); Bangle.on('HRM', function(hrm) { - //if(hrm.confidence > 90){ - hrtValue = hrm.bpm; - if (Bangle.isLCDOn()) - drawHeartRate(); - //} else { - // hrtValue = undefined; - //} + if (isCircleEnabled("hr")) { + //if(hrm.confidence > 90){ + hrtValue = hrm.bpm; + if (Bangle.isLCDOn()) + drawHeartRate(); + //} else { + // hrtValue = undefined; + //} + } }); Bangle.on('charging', function(charging) { - drawBattery(); + if (isCircleEnabled("battery")) drawBattery(); }); g.clear(); diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index 15596ff18..754fa0c69 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -6,6 +6,8 @@ settings[key] = value; storage.write(SETTINGS_FILE, settings); } + var valuesCircleTypes = ["steps", "stepsDist", "hr", "battery"]; + var namesCircleTypes = ["steps", "step distance", "heart", "battery"]; E.showMenu({ '': { 'title': 'circlesclock' }, 'min heartrate': { @@ -56,6 +58,33 @@ save('showWidgets', settings.showWidgets); }, }, + 'Left circle': { + value: Math.max(0,0 | valuesCircleTypes.indexOf(settings.circle1)), + min: 0, max: 3, + format: v => namesCircleTypes[v], + onchange: v => { + settings.circle1 = valuesCircleTypes[v]; + save('circle1', settings.circle1); + } + }, + 'Middle circle': { + value: Math.max(0,0 | valuesCircleTypes.indexOf(settings.circle2)), + min: 0, max: 3, + format: v => namesCircleTypes[v], + onchange: v => { + settings.circle2 = valuesCircleTypes[v]; + save('circle2', settings.circle2); + } + }, + 'Right circle': { + value: Math.max(0,0 | valuesCircleTypes.indexOf(settings.circle3)), + min: 0, max: 3, + format: v => namesCircleTypes[v], + onchange: v => { + settings.circle3 = valuesCircleTypes[v]; + save('circle3', settings.circle3); + } + }, '< Back': back, }); }); From ee252a3a97fc3880c7744ed79966e6f25bb6e8da Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 14:04:04 +0100 Subject: [PATCH 058/122] Fix position, default settings and add green step distance icon --- apps/circlesclock/app.js | 5 +++-- apps/circlesclock/settings.js | 14 +++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 58055e96e..686de735b 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -2,6 +2,7 @@ const locale = require("locale"); const heatshrink = require("heatshrink"); const shoesIcon = heatshrink.decompress(atob("h0OwYJGgmAAgUBkgECgVJB4cSoAUDyEBkARDpADBhMAyQRBgVAkgmDhIUDAAuQAgY1DAAYA=")); +const shoesIconGreen = heatshrink.decompress(atob("h0OwYJGhIEDgVIAgUEyQKDkmACgcggVACIeQAYMSgIRCgmApIbDiQUDAAkBkAFDGoYAD")); const heartIcon = heatshrink.decompress(atob("h0OwYOLkmQhMkgACByVJgESpIFBpEEBAIFBCgIFCCgsABwcAgQOCAAMSpAwDyBNM")); const powerIcon = heatshrink.decompress(atob("h0OwYQNsAED7AEDmwEDtu2AgUbtuABwXbBIUN23AAoYOCgEDFIgODABI")); const powerIconGreen = heatshrink.decompress(atob("h0OwYQNkAEDpAEDiQEDkmSAgUJkmABwVJBIUEyVAAoYOCgEBFIgODABI")); @@ -96,7 +97,7 @@ function drawCircle(index, defaultType) { function getCirclePosition(type, defaultPos) { for (let i = 1; i <= 3; i++) { const setting = settings['circle' + i]; - if (setting == type) return i; + if (setting == type) return i == 1 ? w1: i == 2 ? w2 : w3; } return defaultPos; } @@ -157,7 +158,7 @@ function drawStepsDistance(w) { g.setColor(colorFg); g.drawString(shortValue(stepsDistance), w + 2, h3); - g.drawImage(shoesIcon, w - 6, h3 + radiusOuter - 6); + g.drawImage(shoesIconGreen, w - 6, h3 + radiusOuter - 6); } function drawHeartRate(w) { diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index 754fa0c69..3ddacd29c 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -7,7 +7,7 @@ storage.write(SETTINGS_FILE, settings); } var valuesCircleTypes = ["steps", "stepsDist", "hr", "battery"]; - var namesCircleTypes = ["steps", "step distance", "heart", "battery"]; + var namesCircleTypes = ["steps", "distance", "heart", "battery"]; E.showMenu({ '': { 'title': 'circlesclock' }, 'min heartrate': { @@ -40,7 +40,7 @@ }, onchange: x => save('stepGoal', x), }, - 'battery warn lvl': { + 'battery warn': { value: "batteryWarn" in settings ? settings.batteryWarn : 30, min: 10, max : 100, @@ -58,7 +58,7 @@ save('showWidgets', settings.showWidgets); }, }, - 'Left circle': { + 'left': { value: Math.max(0,0 | valuesCircleTypes.indexOf(settings.circle1)), min: 0, max: 3, format: v => namesCircleTypes[v], @@ -67,8 +67,8 @@ save('circle1', settings.circle1); } }, - 'Middle circle': { - value: Math.max(0,0 | valuesCircleTypes.indexOf(settings.circle2)), + 'middle': { + value: Math.max(0,2 | valuesCircleTypes.indexOf(settings.circle2)), min: 0, max: 3, format: v => namesCircleTypes[v], onchange: v => { @@ -76,8 +76,8 @@ save('circle2', settings.circle2); } }, - 'Right circle': { - value: Math.max(0,0 | valuesCircleTypes.indexOf(settings.circle3)), + 'right': { + value: Math.max(0,3 | valuesCircleTypes.indexOf(settings.circle3)), min: 0, max: 3, format: v => namesCircleTypes[v], onchange: v => { From 3538c6024fe36715a82d0d2018862cab2992f944 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 14:14:47 +0100 Subject: [PATCH 059/122] Configuration of stepDistanceGoal and stepLength --- apps/circlesclock/app.js | 6 ++++-- apps/circlesclock/settings.js | 40 +++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 686de735b..3099b02ea 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -14,6 +14,8 @@ function loadSettings() { 'minHR': 40, 'maxHR': 200, 'stepGoal': 10000, + 'stepDistanceGoal': 8000, + 'stepLength': 0.8, 'batteryWarn': 30, 'showWidgets': false, 'circle1': 'hr', @@ -135,13 +137,13 @@ function drawSteps(w) { function drawStepsDistance(w) { if (!w) w = getCirclePosition("steps", w1); const steps = getSteps(); - const stepDistance = 0.8; // TODO make configurable + const stepDistance = settings.stepLength || 0.8; const stepsDistance = steps * stepDistance; g.setColor(colorGrey); g.fillCircle(w, h3, radiusOuter); - const stepDistanceGoal = settings.stepDistanceGoal || 5; + const stepDistanceGoal = settings.stepDistanceGoal || 8000; if (stepDistanceGoal > 0) { let percent = stepsDistance / stepDistanceGoal; if (stepDistanceGoal < stepsDistance) percent = 1; diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index 3ddacd29c..dc75f54af 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -40,6 +40,26 @@ }, onchange: x => save('stepGoal', x), }, + 'step length': { + value: "stepLength" in settings ? settings.stepLength : 0.8, + min: 0.1, + max : 1.5, + step: 0.01, + format: x => { + return x; + }, + onchange: x => save('stepLength', x), + }, + 'step dist goal': { + value: "stepDistanceGoal" in settings ? settings.stepDistanceGoal : 8000, + min: 2000, + max : 30000, + step: 1000, + format: x => { + return x; + }, + onchange: x => save('stepDistanceGoal', x), + }, 'battery warn': { value: "batteryWarn" in settings ? settings.batteryWarn : 30, min: 10, @@ -53,37 +73,25 @@ 'show widgets': { value: "showWidgets" in settings ? settings.showWidgets : false, format: () => (settings.showWidgets ? 'Yes' : 'No'), - onchange: () => { - settings.showWidgets = !settings.showWidgets; - save('showWidgets', settings.showWidgets); - }, + onchange: x => save('showWidgets', x), }, 'left': { value: Math.max(0,0 | valuesCircleTypes.indexOf(settings.circle1)), min: 0, max: 3, format: v => namesCircleTypes[v], - onchange: v => { - settings.circle1 = valuesCircleTypes[v]; - save('circle1', settings.circle1); - } + onchange: x => save('circle1', x), }, 'middle': { value: Math.max(0,2 | valuesCircleTypes.indexOf(settings.circle2)), min: 0, max: 3, format: v => namesCircleTypes[v], - onchange: v => { - settings.circle2 = valuesCircleTypes[v]; - save('circle2', settings.circle2); - } + onchange: x => save('circle2', x), }, 'right': { value: Math.max(0,3 | valuesCircleTypes.indexOf(settings.circle3)), min: 0, max: 3, format: v => namesCircleTypes[v], - onchange: v => { - settings.circle3 = valuesCircleTypes[v]; - save('circle3', settings.circle3); - } + onchange: x => save('circle3', x), }, '< Back': back, }); From f174cb56fbd586f7e6a357a73129f9d5d6ab244d Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 14:14:56 +0100 Subject: [PATCH 060/122] Update README --- apps/circlesclock/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/circlesclock/README.md b/apps/circlesclock/README.md index df47c369b..86c388440 100644 --- a/apps/circlesclock/README.md +++ b/apps/circlesclock/README.md @@ -2,17 +2,19 @@ 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: +By default the time, date and day of week is shown. + +It can show the following information (this can be configured): * Steps (requires [pedometer widget](https://banglejs.com/apps/#pedometer)) - * Heart rate (when screen is on and unlocked) - * Battery (including charging and battery low) + * Steps distance (depending on steps) + * Heart rate (automatically updates when screen is on and unlocked) + * Battery (including charging status and battery low warning) ## Screenshot ![Screenshot](screenshot.png) ## TODO * Show weather information -* Configure which information to show in each circle ## Creator Marco ([myxor](https://github.com/myxor)) From ad371e9678cb380ea064ed01cbe6b7df385b4d56 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 14:21:01 +0100 Subject: [PATCH 061/122] Update changelog and bump version --- apps.json | 2 +- apps/circlesclock/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index f116049dc..c6600ada0 100644 --- a/apps.json +++ b/apps.json @@ -5071,7 +5071,7 @@ { "id": "circlesclock", "name": "Circles clock", "shortName":"Circles clock", - "version":"0.03", + "version":"0.04", "description": "A clock with circles for different data at the bottom in a probably familiar style", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], diff --git a/apps/circlesclock/ChangeLog b/apps/circlesclock/ChangeLog index c0aa4e2f8..f416929ac 100644 --- a/apps/circlesclock/ChangeLog +++ b/apps/circlesclock/ChangeLog @@ -1,3 +1,4 @@ 0.01: New clock 0.02: Fix icon & add battery warn functionality 0.03: Theming support & minor fixes +0.04: Make configurable what to show in each circle; add step distance circle; allow switching visibility of widgets From 3ba696ed0e29c6916726412d35895c48d74d8560 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 14:30:02 +0100 Subject: [PATCH 062/122] Fix settings --- apps/circlesclock/settings.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index dc75f54af..0c42319f5 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -79,19 +79,19 @@ value: Math.max(0,0 | valuesCircleTypes.indexOf(settings.circle1)), min: 0, max: 3, format: v => namesCircleTypes[v], - onchange: x => save('circle1', x), + onchange: x => save('circle1', valuesCircleTypes[x]), }, 'middle': { value: Math.max(0,2 | valuesCircleTypes.indexOf(settings.circle2)), min: 0, max: 3, format: v => namesCircleTypes[v], - onchange: x => save('circle2', x), + onchange: x => save('circle2', valuesCircleTypes[x]), }, 'right': { value: Math.max(0,3 | valuesCircleTypes.indexOf(settings.circle3)), min: 0, max: 3, format: v => namesCircleTypes[v], - onchange: x => save('circle3', x), + onchange: x => save('circle3', valuesCircleTypes[x]), }, '< Back': back, }); From 639bc1962eee45c31b4cf0d50f5edf782ac94e1c Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 15:28:18 +0100 Subject: [PATCH 063/122] Allow widgets to detect this is a clock --- apps/circlesclock/app.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 3099b02ea..2d6c132bb 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -308,7 +308,7 @@ Bangle.on('charging', function(charging) { g.clear(); - +Bangle.setUI("clock"); Bangle.loadWidgets(); if (!showWidgets) { /* @@ -324,7 +324,5 @@ if (!showWidgets) { } } - -setInterval(draw, 60000); draw(); -Bangle.setUI("clock"); +setInterval(draw, 60000); From 801237b2cfad1caf17a0d4bb496527bd4a217e8a Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 15:35:01 +0100 Subject: [PATCH 064/122] Let's only register HRM and battery events when respective circle is visible --- apps/circlesclock/app.js | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 2d6c132bb..e10d55f17 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -280,31 +280,32 @@ Bangle.on('lock', function(isLocked) { drawHeartRate(); } } + if (isCircleEnabled("steps")) drawSteps(); + if (isCircleEnabled("stepsDistance")) drawStepsDistance(); } else { if (isCircleEnabled("hr")) { Bangle.setHRMPower(0, "watch"); } } - if (isCircleEnabled("hr")) drawHeartRate(); - if (isCircleEnabled("steps")) drawSteps(); - if (isCircleEnabled("stepsDistance")) drawStepsDistance(); }); -Bangle.on('HRM', function(hrm) { - if (isCircleEnabled("hr")) { - //if(hrm.confidence > 90){ - hrtValue = hrm.bpm; - if (Bangle.isLCDOn()) - drawHeartRate(); - //} else { - // hrtValue = undefined; - //} - } -}); +if (isCircleEnabled("hr")) { + Bangle.on('HRM', function(hrm) { + //if(hrm.confidence > 90){ + hrtValue = hrm.bpm; + if (Bangle.isLCDOn()) + drawHeartRate(); + //} else { + // hrtValue = undefined; + //} + }); +} -Bangle.on('charging', function(charging) { - if (isCircleEnabled("battery")) drawBattery(); -}); +if (isCircleEnabled("battery")) { + Bangle.on('charging', function(charging) { + drawBattery(); + }); +} g.clear(); From c87d1d16509ca3943db44bc1606c8757039fb3e5 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 19:28:32 +0100 Subject: [PATCH 065/122] Fix settings default values --- apps/circlesclock/settings.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index 0c42319f5..95ebc17db 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -10,6 +10,7 @@ var namesCircleTypes = ["steps", "distance", "heart", "battery"]; E.showMenu({ '': { 'title': 'circlesclock' }, + '< Back': back, 'min heartrate': { value: "minHR" in settings ? settings.minHR : 40, min: 0, @@ -76,23 +77,22 @@ onchange: x => save('showWidgets', x), }, 'left': { - value: Math.max(0,0 | valuesCircleTypes.indexOf(settings.circle1)), + value: settings.circle1 ? valuesCircleTypes.indexOf(settings.circle1) : 0, min: 0, max: 3, format: v => namesCircleTypes[v], onchange: x => save('circle1', valuesCircleTypes[x]), }, 'middle': { - value: Math.max(0,2 | valuesCircleTypes.indexOf(settings.circle2)), + value: settings.circle2 ? valuesCircleTypes.indexOf(settings.circle2) : 2, min: 0, max: 3, format: v => namesCircleTypes[v], onchange: x => save('circle2', valuesCircleTypes[x]), }, 'right': { - value: Math.max(0,3 | valuesCircleTypes.indexOf(settings.circle3)), + value: settings.circle3 ? valuesCircleTypes.indexOf(settings.circle3) : 3, min: 0, max: 3, format: v => namesCircleTypes[v], onchange: x => save('circle3', valuesCircleTypes[x]), - }, - '< Back': back, + } }); }); From 9a5937a3eb3535636e74f926d83dd41ebdd8c407 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 19:38:18 +0100 Subject: [PATCH 066/122] Improve widget visibility --- apps/circlesclock/app.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index e10d55f17..a256c93ce 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -41,7 +41,7 @@ const colorRed = '#ff0000'; const colorGreen = '#008000'; const colorBlue = '#0000ff'; const colorYellow = '#ffff00'; -const widgetOffset = showWidgets ? 12 : 0; +const widgetOffset = showWidgets ? 14 : 0; const h = g.getHeight() - widgetOffset; const w = g.getWidth(); const hOffset = 30 - widgetOffset; @@ -55,9 +55,9 @@ const radiusOuter = 22; const radiusInner = 16; function draw() { - g.reset(); + g.clear(true); g.setColor(colorBg); - g.fillRect(0, 0, w, h); + g.fillRect(0, widgetOffset, w, h); // time g.setFont("Vector:50"); @@ -265,7 +265,7 @@ function shortValue(v) { } function getSteps() { - if (WIDGETS.wpedom !== undefined) { + if (WIDGETS && WIDGETS.wpedom !== undefined) { return WIDGETS.wpedom.getSteps(); } return 0; @@ -307,8 +307,6 @@ if (isCircleEnabled("battery")) { }); } -g.clear(); - Bangle.setUI("clock"); Bangle.loadWidgets(); if (!showWidgets) { From c15b700ef6fde7bdad924150d25504e51660e358 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Wed, 5 Jan 2022 19:50:07 +0100 Subject: [PATCH 067/122] Fix widget drawing --- apps/circlesclock/app.js | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index a256c93ce..fb4635424 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -56,6 +56,23 @@ const radiusInner = 16; function draw() { g.clear(true); + + if (!showWidgets) { + /* + * 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. + */ + if (WIDGETS && typeof WIDGETS === "object") { + for (let wd of WIDGETS) { + wd.draw = () => {}; + wd.area = ""; + } + } + } else { + Bangle.drawWidgets(); + } + g.setColor(colorBg); g.fillRect(0, widgetOffset, w, h); @@ -280,8 +297,7 @@ Bangle.on('lock', function(isLocked) { drawHeartRate(); } } - if (isCircleEnabled("steps")) drawSteps(); - if (isCircleEnabled("stepsDistance")) drawStepsDistance(); + draw(); } else { if (isCircleEnabled("hr")) { Bangle.setHRMPower(0, "watch"); @@ -309,19 +325,6 @@ if (isCircleEnabled("battery")) { Bangle.setUI("clock"); Bangle.loadWidgets(); -if (!showWidgets) { - /* - * 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. - */ - if (WIDGETS && typeof WIDGETS === "object") { - for (let wd of WIDGETS) { - wd.draw = () => {}; - wd.area = ""; - } - } -} draw(); setInterval(draw, 60000); From aba0d7126b26d1c24435cb89b2bfd24f4b07e581 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 6 Jan 2022 11:08:46 +0100 Subject: [PATCH 068/122] Fix widget height --- apps/circlesclock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index fb4635424..319e99809 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -41,7 +41,7 @@ const colorRed = '#ff0000'; const colorGreen = '#008000'; const colorBlue = '#0000ff'; const colorYellow = '#ffff00'; -const widgetOffset = showWidgets ? 14 : 0; +const widgetOffset = showWidgets ? 24 : 0; const h = g.getHeight() - widgetOffset; const w = g.getWidth(); const hOffset = 30 - widgetOffset; From 66294b3c8a7a0e5ee92c7eeab3ea346e44f314d9 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 6 Jan 2022 11:17:27 +0100 Subject: [PATCH 069/122] Round step distance --- apps/circlesclock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 319e99809..d9a8d8eae 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -175,7 +175,7 @@ function drawStepsDistance(w) { g.setFont("Vector:12"); g.setFontAlign(0, 0); g.setColor(colorFg); - g.drawString(shortValue(stepsDistance), w + 2, h3); + g.drawString(Math.round(shortValue(stepsDistance)), w + 2, h3); g.drawImage(shoesIconGreen, w - 6, h3 + radiusOuter - 6); } From 33deb83a675b744599090325596ee015ea98d6f9 Mon Sep 17 00:00:00 2001 From: Marco H Date: Thu, 6 Jan 2022 13:01:36 +0100 Subject: [PATCH 070/122] Fix rounding of step distance --- apps/circlesclock/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index d9a8d8eae..099217706 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -155,7 +155,7 @@ function drawStepsDistance(w) { if (!w) w = getCirclePosition("steps", w1); const steps = getSteps(); const stepDistance = settings.stepLength || 0.8; - const stepsDistance = steps * stepDistance; + const stepsDistance = Math.round(steps * stepDistance); g.setColor(colorGrey); g.fillCircle(w, h3, radiusOuter); @@ -175,7 +175,7 @@ function drawStepsDistance(w) { g.setFont("Vector:12"); g.setFontAlign(0, 0); g.setColor(colorFg); - g.drawString(Math.round(shortValue(stepsDistance)), w + 2, h3); + g.drawString(shortValue(stepsDistance), w + 2, h3); g.drawImage(shoesIconGreen, w - 6, h3 + radiusOuter - 6); } From 5e7afb28273bdf6f72ad8ffae1a484b8016f63fe Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 6 Jan 2022 15:18:45 +0100 Subject: [PATCH 071/122] Increase size of circles and fonts inside Updated screenshots --- apps.json | 2 +- apps/circlesclock/README.md | 5 +++-- apps/circlesclock/app.js | 19 ++++++++++--------- apps/circlesclock/screenshot-dark.png | Bin 0 -> 3857 bytes apps/circlesclock/screenshot-light.png | Bin 0 -> 3823 bytes apps/circlesclock/screenshot.png | Bin 3576 -> 0 bytes 6 files changed, 14 insertions(+), 12 deletions(-) create mode 100644 apps/circlesclock/screenshot-dark.png create mode 100644 apps/circlesclock/screenshot-light.png delete mode 100644 apps/circlesclock/screenshot.png diff --git a/apps.json b/apps.json index f1609bf4f..a2fd1ec9b 100644 --- a/apps.json +++ b/apps.json @@ -5078,7 +5078,7 @@ "version":"0.04", "description": "A clock with circles for different data at the bottom in a probably familiar style", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [{"url":"screenshot-dark.png"}, {"url":"screenshot-light.png"}], "dependencies": {"widpedom":"app"}, "type": "clock", "tags": "clock", diff --git a/apps/circlesclock/README.md b/apps/circlesclock/README.md index 86c388440..9004161d6 100644 --- a/apps/circlesclock/README.md +++ b/apps/circlesclock/README.md @@ -10,8 +10,9 @@ It can show the following information (this can be configured): * Heart rate (automatically updates when screen is on and unlocked) * Battery (including charging status and battery low warning) -## Screenshot -![Screenshot](screenshot.png) +## Screenshots +![Screenshot dark theme](screenshot-dark.png) +![Screenshot light theme](screenshot-light.png) ## TODO * Show weather information diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 099217706..ac7ae1b3f 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -47,12 +47,13 @@ const w = g.getWidth(); const hOffset = 30 - widgetOffset; 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 h3 = Math.round(8 * h / 8 - hOffset - 3); 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; +const radiusOuter = 25; +const radiusInner = 18; +const circleFont = "Vector:15"; function draw() { g.clear(true); @@ -83,7 +84,7 @@ function draw() { g.drawString(locale.time(new Date(), 1), w / 10, h1 + 8); // date & dow - g.setFont("Vector:20"); + g.setFont("Vector:21"); g.setFontAlign(-1, 0); g.drawString(locale.date(new Date()), w / 10, h2); g.drawString(locale.dow(new Date()), w / 10, h2 + 22); @@ -143,7 +144,7 @@ function drawSteps(w) { g.fillPoly([w, h3, w - 15, h3 + radiusOuter + 5, w + 15, h3 + radiusOuter + 5]); - g.setFont("Vector:12"); + g.setFont(circleFont); g.setFontAlign(0, 0); g.setColor(colorFg); g.drawString(shortValue(steps), w + 2, h3); @@ -172,7 +173,7 @@ function drawStepsDistance(w) { g.fillPoly([w, h3, w - 15, h3 + radiusOuter + 5, w + 15, h3 + radiusOuter + 5]); - g.setFont("Vector:12"); + g.setFont(circleFont); g.setFontAlign(0, 0); g.setColor(colorFg); g.drawString(shortValue(stepsDistance), w + 2, h3); @@ -196,7 +197,7 @@ function drawHeartRate(w) { g.fillPoly([w, h3, w - 15, h3 + radiusOuter + 5, w + 15, h3 + radiusOuter + 5]); - g.setFont("Vector:12"); + g.setFont(circleFont); g.setFontAlign(0, 0); g.setColor(colorFg); g.drawString(hrtValue != undefined ? hrtValue : "-", w, h3); @@ -220,7 +221,7 @@ function drawBattery(w) { g.fillPoly([w, h3, w - 15, h3 + radiusOuter + 5, w + 15, h3 + radiusOuter + 5]); - g.setFont("Vector:12"); + g.setFont(circleFont); g.setFontAlign(0, 0); let icon = powerIcon; @@ -259,7 +260,7 @@ function drawGauge(cx, cy, percent, color) { g.setColor(color); - const size = 4; + const size = radiusOuter - radiusInner - 2; // draw gauge for (i = startrot; i > endrot - size; i -= size) { x = cx + r * Math.sin(radians(i)); diff --git a/apps/circlesclock/screenshot-dark.png b/apps/circlesclock/screenshot-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..00c0e3399cf9a1f4fbd299e259d245e7a9519db7 GIT binary patch literal 3857 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 F{TF;GBE$dy literal 0 HcmV?d00001 diff --git a/apps/circlesclock/screenshot-light.png b/apps/circlesclock/screenshot-light.png new file mode 100644 index 0000000000000000000000000000000000000000..af47b30a40681d7515efcf0658d43784a3e87b8d GIT binary patch literal 3823 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 From ba20a7b51eecc1452c7e5fb62b4964b5d7d875ad Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Thu, 6 Jan 2022 15:37:33 +0100 Subject: [PATCH 072/122] Center clock text & better placement for date texts --- apps/circlesclock/app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index ac7ae1b3f..b5ee61c75 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -79,15 +79,15 @@ function draw() { // time g.setFont("Vector:50"); - g.setFontAlign(-1, -1); + g.setFontAlign(0, -1); g.setColor(colorFg); - g.drawString(locale.time(new Date(), 1), w / 10, h1 + 8); + g.drawString(locale.time(new Date(), 1), w / 2, h1 + 8); // date & dow g.setFont("Vector:21"); g.setFontAlign(-1, 0); - g.drawString(locale.date(new Date()), w / 10, h2); - g.drawString(locale.dow(new Date()), w / 10, h2 + 22); + g.drawString(locale.date(new Date()), w > 180 ? 2 * w / 10 : w / 10, h2); + g.drawString(locale.dow(new Date()), w > 180 ? 2 * w / 10 : w / 10, h2 + 22); drawCircle(1, "steps"); drawCircle(2, "hr"); From 3558049233e1ecc75b477ccc7cfef588fc9b50f8 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Thu, 6 Jan 2022 20:35:28 +0100 Subject: [PATCH 073/122] Update README.md --- apps/mmind/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mmind/README.md b/apps/mmind/README.md index 0623459f7..ea584b7e7 100644 --- a/apps/mmind/README.md +++ b/apps/mmind/README.md @@ -1,6 +1,6 @@ # Mastermind -Play the classic mind game mastermind on your Bangles 2. +Play the classic mind game mastermind on your Bangle 2. ![](screenshot_mmind.png) From 32fb5dc58e272b88810dc58236e003b9eada25d4 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 6 Jan 2022 21:39:23 +0000 Subject: [PATCH 074/122] Limelight: configurable analogue clock --- apps.json | 15 ++ apps/limelight/ChangeLog | 1 + apps/limelight/README.md | 11 ++ apps/limelight/limelight.app.js | 187 ++++++++++++++++++++++++ apps/limelight/limelight.icon.js | 1 + apps/limelight/limelight.png | Bin 0 -> 929 bytes apps/limelight/limelight.settings.js | 67 +++++++++ apps/limelight/screenshot_limelight.png | Bin 0 -> 2180 bytes 8 files changed, 282 insertions(+) create mode 100644 apps/limelight/ChangeLog create mode 100644 apps/limelight/README.md create mode 100644 apps/limelight/limelight.app.js create mode 100644 apps/limelight/limelight.icon.js create mode 100644 apps/limelight/limelight.png create mode 100644 apps/limelight/limelight.settings.js create mode 100644 apps/limelight/screenshot_limelight.png diff --git a/apps.json b/apps.json index 833c3505e..c4d7624be 100644 --- a/apps.json +++ b/apps.json @@ -5448,5 +5448,20 @@ {"name":"flipper.app.js","url":"flipper.app.js"}, {"name":"flipper.img","url":"flipper.icon.js","evaluate":true} ] + }, + { + "id": "limelight", + "name": "Limelight Clock", + "version": "0.01", + "description": " Simple configurable analogue clock based on the work of @Andreas_Rozek (Simple_Clock)", + "icon": "limelight.png", + "screenshots": [{"url":"screenshot_limelight.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"limelight.app.js","url":"app.js"}, + {"name":"limelight.img","url":"icon.js","evaluate":true} + ] } ] diff --git a/apps/limelight/ChangeLog b/apps/limelight/ChangeLog new file mode 100644 index 000000000..9db0e26c5 --- /dev/null +++ b/apps/limelight/ChangeLog @@ -0,0 +1 @@ +0.01: first release diff --git a/apps/limelight/README.md b/apps/limelight/README.md new file mode 100644 index 000000000..7d80ed985 --- /dev/null +++ b/apps/limelight/README.md @@ -0,0 +1,11 @@ +# Limelight + * Simple configurable analogie clock based on the work of @Andreas_Rozek [Simple_Clock](https://github.com/espruino/BangleApps/tree/master/apps/simple_clock)* + +![](screenshot_limelight.jpg) + +* Selection of different fonts +* 100 less lines of code, demonstrating that there is no need for a custom widget draw method + +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/) + diff --git a/apps/limelight/limelight.app.js b/apps/limelight/limelight.app.js new file mode 100644 index 000000000..a1af79466 --- /dev/null +++ b/apps/limelight/limelight.app.js @@ -0,0 +1,187 @@ +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +// fonts.google.com +Graphics.prototype.setFontLimelight = function(scale) { + // Actual height 28 (28 - 1) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAeAAAAAD8AAAAAf4AAAAB/gAAAAH+AAAAAf4AAAAB/gAAAAD8AAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAPwAAAAH8AAAAD+AAAAD+AAAAB/AAAAA/gAAAAfwAAAAD4AAAAAMAAAAAAAAAAAAAAAAAAAAA/gAAAA//wAAAP//wAAB///wAAP///gAA///+AAH///8AAf///4AD////gAP///+AA////4AD////gAMAAAGAAwAAAYADAAABgAMAAAGAAwAAAwABgAADAAHAAAYAAOAADgAAeAA8AAAfh/AAAAf/wAAAAHgAAAAAAAAAAGAAAAAAYAAAAABAAAAAAMAAAAAAwAAAAAD///+AAf///4AB////gAH///+AAf///4AD////gAP///+AA////4AH////gAf///+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgABAAAeAAOAAH4AAwAA/gAGAAP+AAYAB/4ADAAf/gAMAD/+AAwAf/4ADAH//gAMA//+AAwH//4ADB//9gAOP//GAA///wYAD//+BgAH//gGAAf/8AYAA//ABgAB/4AGAAD+AAYAADAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAHAAAwAAGAAHAAAMAAYAAAwADAEABgAMAwAGAAwDAAYADAMABgAMAwAGAAwDAAYAD////gAP///+AA////4AD////gAP///8AAf///wAB/7//AAD/H/4AAP4f/AAAPA/4AAAAA+AAAAAAAAAAAAAAAAAAAGAAAAAB8AAAAAPwAAAADzAAAAAcMAAAAHgwAAAA8DAAAAHAMAAAB4AwAAAOADAAADwAMAAAcAAwAAD///+AA////4AD////gAP///+AA////4AD////gAP///+AA////4AD////gAP///+AAAAAMAAAAAAwAAAAADAAAAAAcAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAHAAAH4AOAAP/gAcAA+GAAwADAwABgAMDAAGAAwMAAYADAwABgAMDAAGAAwMAAYADA///gAMD//+AAwP//4ADA///AAMB//8AAwH//wADAP/+AAIAf/wAAAA/+AAAAB/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAD/8AAAA//8AAAH//4AAB///wAAH///gAA////AAH///8AAf///4AD////gAP///+AAwAAAYADAYABgAMBgAGAAwGAAYADAYABgAMBgAGAAwGAAwABgYADAAHAwAYAAMDgHAAAAHh4AAAAP/AAAAAHgAAAAAAAAAAAAAAAA+AAAAAD4AAAAAMAAAAAAwAAAAADAAAAAAMAA/+AAwB//4ADB///gAM///+AA////4AD////gAP///+AA////4AD////gAP///+AA////4AD//+AAAP/wAAAA/wAAAAD4AAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAA/g/wAAH/GDgAA/+wGAAD//AMAAf/4AwAB//gBgAP//AGAAx/+AYADD/4BgAMH/wGAAwP/AYACA/+BgAMB/8GAAwD/wYADAP/jgAMBf/+AAYH//wABgz//AADHH/4AAH4f/gAAOA/8AAAAB/AAAAAAwAAAAAAAAAAAAAAAAAeAAAAAH/AAAAB8eAAAAGAcBgAAwAwHAAGABgMAAYAGAYADAAIBgAMAAwGAAwADAYADAAYBgAMAAgGAAwAAAYAD////gAP///+AA////wAB////AAH///4AAP///AAA///8AAA///AAAB//4AAAB/+AAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAeAAAD8D8AAAf4f4AAB/h/gAAH+H+AAAf4f4AAB/h/gAAD8D8AAAHgHgAAAAAAAAAAAAAAA="), 46, atob("DQ0aExgZHRkbGBsbDQ=="), 40+(scale<<8)+(1<<16)); +} + +// fonts.google.com +Graphics.prototype.setFontGochiHand = function(scale) { + // Actual height 29 (31 - 3) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAB4AAAAAD4AAAAAB4AAAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAH/gAAAD//gAAD///gAD///+AAH///AAAH//gAAAH/wAAAAHwAAAAAAAAwAAAAAP+AAAAA//gAAAB//wAAAD//4AAAD8P4AAAHwD8AAAHgB8AAAPgA8AAAPAA8AAAPAA8AAAPAA8AAAPgA8AAAPgA8AAAPgB8AAAHwB4AAAH4D4AAAD+PwAAAD//gAAAB//gAAAA/+AAAAAP8AAAAAAAAAAAAAAAAAAAcAAAAAA8AAAAAB8AAAAAD4AAAAAD4AAAAAHwAAAAAHgAAAAAPgAAAAAPgAAAAAf/AAAAAf//wAAAP//wAAAH//wAAAAf/wAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAA8AAAeAB8AAA+AD8AAB+AH8AAB4AP8AAD4AP8AADwAf8AADwB+8AAD4D88AAD4H48AAD//w+AAB//g+AAB//A+AAA/8A+AAAPwA+AAAAAA+AAAAAAcAAAAAAIAAAAAAAAAA8AAAAAB8AAAAAB8AAAAAB4AHgAAD4AHwAAD4AH4AADwPH8AADwfB8AADwfA8AAD4fA+AAD4fA+AAB//A+AAB//A+AAA//A8AAA//x8AAAPP/8AAAAH/4AAAAD/wAAAAB/gAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAH8AAAAAP+AAAAA/+AAAAB/+AAAAD8+AAAAP4+AAAB/weAAAD/weAAAD/8eAAAB///AAAA///AAAAH//8AAAAf//AAAAD//AAAAAf/AAAAAf+AAAAAfAAAAAAMAAAAAAAAAAAAAAAAAAPA/gAAAfh/wAAA/x/4AAA/x/4AAB/4/8AAB74B8AAB58A8AAB58A+AAB5+A+AAB4+A+AAB4+A+AAB4fA+AAB4fg+AAB4Pg8AAB4P58AAB4H/4AAB4D/4AAB4D/wAAAQA/gAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAB/+AAAAD//gAAAH//gAAAPwfwAAAPgf4AAAfAf4AAAeA/8AAAeA98AAAeA88AAAfB48AAAfB48AAAPB48AAAOB48AAAAB98AAAAB/8AAAAA/4AAAAA/wAAAAAfgAAA8AAAAAA8BAAAAA8HgAAAA8HgAAAA8HgAAAA8HgAAAA8HgAAAA+HgAAAA+HgAAAA+HgAAAAfHgAAAAf//+AAAf//+AAAP//+AAAH//8AAAAPwAAAAAHgAAAAAHwAAAAAHwAAAAAHwAAAAADwAAAAADgAAAAAAAAAAAAAAAAAAAB/AAAAP3/wAAAf//wAAA///4AAA//D8AAB9+B8AAB4+A8AAB4+A+AAB4+A+AAB4+A+AAB8+A+AAB8+A+AAA/+A8AAA//A8AAAf/x8AAAP//4AAAH//wAAAAD/gAAAAB/AAAAAAAAAAAAAAAAAAD/AAAAAD/gAAAAH/gAAAAP/wAAAAPHwAAAAPDwAAAAeDwAAAAeDwAAAAeDwAAAAeHwAAAAeHgAAAAePgAAAAefAAAAAf/AAAAAf///gAAf///wAAP///wAAP///gAAH8AAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8BwAAAA8B4AAAA+D4AAAA8B4AAAAcB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="), 46, atob("DQoYERUWFBYVFhcVDQ=="), 42+(scale<<8)+(1<<16)); +} + +// free for commercial use +// https://www.1001fonts.com/search.html?search=Grenadier+NF +Graphics.prototype.setFontGrenadierNF = function(scale) { + // Actual height 39 (39 - 1) + g.setFontCustom(atob("AAAAAAAAAAAAB4AAAAAAPAAAAAAB4AAAAAAAAAAAAAAAAAAAAAAEAAAAAAPgAAAAA/8AAAAB//gAAAD//4AAAP//wAAAf//AAAB//+AAAD//8AAAB//wAAAAP/gAAAAB+AAAAAAMAAAAAAAAAAAAAAAAB4AAAAAD/8AAAAB//4AAAA///wAAAP8D/AAAD8AD8AAA/AAPwAAPgAAfAAD4AAB8AAeAAAHgAHwAAA+AA8AAADwAHgAAAeAB4AAAB4APAAAAPAB4AAAB4APAAAAPAB4AAAB4APAAAAPAB4AAAB4APAAAAPAB4AAAB4APgAAAfAA8AAADwAHwAAA+AAeAAAHgAD4AAB8AAPgAAfAAA+AAHwAAD8AD8AAAP8D/AAAA///wAAAD//8AAAAH/+AAAAAD8AAAAAAAAAAAAAAAAAAABAAAAAAAcAAAAAAHwAAAAAB8AAAAAAfgAAAAAH/////AB/////4AP/////AB/////4AAAAAAAAAAAAAAAAAAAAADAAAAAAA4APAAAAPAB4AAAD4APAAAA/AB4AAAP4APAAAD/AB8AAA/4AHgAAPvAA8AAD54ADwAB+PAAfAAfh4AB8AH4PAAPwD+B4AA///gPAAD//wB4AAH/4APAAAP8AAAAAAAAAAAAAAAAAAAPAAAAHAB4AAAB4APAAAAPAB4PAAB4APB4AAPAB+/gAB4AH/8AAfAAf/wADwAB/fAA+AABD8APgAAAPwH4AAAA//+AAAAD//gAAAAH/4AAAAAP8AAAAAAAAAAAAAAAAAAAAAAYAAAAAAPAAAAAAH4AAAAAD/AAAAAB/4AAAAA//AAAAAf94AAAAH+PAAAAD/B4AAAB/gPAAAA/wB4AAAf8APAAAP////4AH/////AD/////4AAAAAPAAAAAAA4AAAAAAAAAAAAAAAAAAAIAAPAAAPAAB4AAf4AAPAA//gAB4AP/8AAPAB/3gAB4APg8AAfAB4DwADwAPAfAA+AB4B8APgAPAP4H4AB4A//+AAPAB//gAB4AH/4AAAAAP8AAAAAAAAAAAAAB4AAAAAD/4AAAAA//wAAAAf//AAAAP+H8AAAH+AHwAAB/gAfAAA/4AB4AAf+AAPAAP/wAA8AH+eAAHgB/ngAA8APw8AAHgB4HgAA8AMA8AAHgAADwAA8AAAeAAPgAAD4AB4AAAPgAfAAAA+AHwAAAH4D8AAAAf//AAAAB//wAAAAD/8AAAAAH8AAAAAAAAAAAAAAAAAAAAAAAYAAAAAAfAB4AAAP4APAAAH/AB4AAH/gAPAAD/wAB4AD/wAAPAB/4AAB4A/8AAAPA/8AAAB4f+AAAAPP+AAAAB//AAAAAP/gAAAAB/gAAAAAPwAAAAAB4AAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAD/gAAAAB//AAAAAf/+AAAAH//4AAAB+AfgAA+fAB8AAP/wAHwAD/+AAeAA//gAB4APj8AAPAB4PAAB4APB4AAPAB4PAAB4APB4AAPAB8fgAB4AH/8AAPAAf/wADwAB/eAA+AADj4APgAAAPwD8AAAA///AAAAD//wAAAAP/4AAAAAf8AAAAAAAAAAAB4AAAAAB/4AAAAA//wAAAAP//AAAAD+H8AAAA/AHwAAAHgAfAAAB8AB4AAAPAAHgAADwAA8AAAeAAHgBADwAAeA4AeAADwfADwAAeP4AeAAD3+ADwAA9/gAfAAH/wAB4AB/4AAPgAf8AAA+AH+AAAD8B/gAAAP//wAAAA//4AAAAD/8AAAAAD+AAAAAAAAAAAAAAAAAAAAAAAeB4AAAADwPAAAAAeB4AAAAAAAAAAAAAAAA=="), 46, atob("Bg4kChURExEaFBoaBg=="), 45+(scale<<8)+(1<<16)); +} + +// fonts.google.com +Graphics.prototype.setFontMonoton = function(scale) { + // Actual height 38 (37 - 0) + g.setFontCustom(atob("AAAAAAAAAAEkAAAAAbYAAAABtgAAAAG2AAAAAbYAAAABtgAAAAG2AAAAASQAAAAAAAAAAAAAAAAAAAB4AAAAB/gAAAB/gAAAB/h4AAB/h/AAB/h/CAB/h/D4B/h/D/B/j/D/APj/D/AAD/D/AAB/D/AAAPD/AAAAD/AAAAB/AAAAAPAAAAAAAAAAAAAAAAAAAAAD/wAAAB//4AAAfAD4AAHj/x4AA5//5wAHfAB5gAzj/5zAHc//5mAbvDBzcDdz/zmwNu+HzZhs3ADu2G2YAHbYbbAANthtsAA2yG2wABtsbbAAG2xtsAA2yG2wADbYbZgAdthm3ADs2DZv/92wM3P/O7AbvAD3YB3P/87gDvP/HMAHPgD7gAOP/+cAAfH+HgAAfgH4AAAf/+AAAAD+AAAAAAAAAAAAAAAAbYAAAABtgAAAAG2AAAAAbYAAAABt////wG3////AbYAAAABt////wG3////AbYAAAABt////wG3////AbYAAAABt////wEn///+AAAAAAAAAAAAAADQAAAUgdoAAF7BtsAA3sG2wAOewbbAB17BtsAc3sG2wDnewbbAdx7BtsHO3sG2w7newbbPd57Btv3OXsGzc73ewZuPc57A2f3nHsDMc5wewG8POB7Ac/zgHsA4Y8AewB+fABSAB/wAAAAAAAAAAAAAAAAA0AAAAsHbAAAbYbbAANthtsAA22G2wADbYbbJJNthts22W2G2zbZpIbbNtm2xts22bbG2zbZJIbbNttthtv2322Gzfbu7YNuO3HZg3f7P5sDuf2OMwGeHPHmAO/2f8wAccOOOAA/PfvwAA/4f8AAAAAAAAAAAAAAAAABkgAAAA/bAAAAPtsAAAD52wAAA8fbAAAfH9sAAHz42wAB8+fbAAePn9sADjx82wAJ8ePbAAfPj9sADz482wAI+fDbAAfHwNsADx8A2wAM+D/b+APgP9v4D4AA2wAMAD/b+AAAP9v4AAAA2wAAAADSAAAAAAAAAAAAAAAAAAAAMAaf/8AwBt//wJgG2AAA3Abf/8JsBt//w2wG2AABtgbf/822BtgADbYG2NvNtgbY28SSBtjbxtsG2NvG2gbY28SSBtjbzbYG2Nv9tgbY23m2BtjNg2YG2Gz+bAbYZnzcBtgzg5gG2Dn/MASQHHzgAAAPg8AAAAP/gAAAAHwAAAAAAAAAAAAAAAAA//4AAAf//8AAHgAB4AA4//44AGf//5wAzgAB7AGY//52AbP//7MDZwABmwNu//zZhs3//m2G25LTbYbbN7Nthts3sSSG2zexpIbbN7G2xts3sSaG2zezbYbbN7Nthts3v22GbDbezYNsG+HbA3Qbf7sBsB3edgGQDPHuAMAGf9wAQAOOOAAAAfvwAAAAf8AAAAAAAAAAAAAABtgAAAAG2AAAAAbYAAAABtgAAAAG2AAAAAbYAAAMBtgAAPwG2AAP8AbYAf4cBtgf4fwG0f4f4Aaf4f4cAf4f4fwH4f4f4AYf4f4cA/4/w/wHw/w/wAQ/w/wAA/w/wAAHw/wAAAQ/wAAAA/wAAAAHwAAAAAAAAAAAAAAAAAAAA+AfAAAf/P/gADwPwHgA5/OfnAHP+f/OAZwO4HYDM+d/MwNn+3/bBuwZsM2G2e2+bYbb7b9thtskk2yG2zbZtobbNtm2xts22bbG2zbZtsbbNtm2xts22bbG2zbZNsbbNttshtv2322GzfZu7YNuO3HZg3f7v5sBud3OcwHfPvHmAOf3P8wAcAeAOAAf///wAA/4f8AAAAAAAAAAAAAAAAfwAAAAH/wAAAA4DwAIAGfzgAwAz/3AJgGYDsA2AzP2YDsDZz9g2wNszbDNhs3ns22G2zezbYbbN5NthtsTkSSG2xORtMbbE5G2xts3sySG2zezbYbbN7Nths2ABm2Cbf/+3YNmf/nbAzeAB7MBuf/+dgHcP/DuAO///9wAc///OAA8AADwAA///8AAA///AAAAAAAAAAAAAAAAAAAAAAA2xtgAADbG2AAANsbYAAA2xtgAADbG2AAANsbYAAAkhJAAAAAAAAAAAAAAAA"), 46, atob("ChIiERcYGRwfGSAfCw=="), 40+(scale<<8)+(1<<16)); +} + +function loadSettings() { + settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; + settings.secondhand = settings.secondhand||false; + settings.font = settings.font||"Limelight"; + settings.vector = settings.vector||false; + settings.vector_size = settings.vector_size||42; + UPDATE_PERIOD = (settings.secondhand ? 1000 : 60000); +} + +var UPDATE_PERIOD; +var drawTimeout; + +const CenterX = g.getWidth()/2; +const CenterY = (g.getHeight()/2) + (Bangle.appRect.y/2); +const outerRadius = (g.getHeight() - Bangle.appRect.y)/2; + +function debug(o) { + //console.log(o); +} + +debug("limelight.app.js"); +debug("CenterX=" + CenterX); +debug("CenterY=" + CenterY); +debug("outerRadius=" + outerRadius); +debug("y12=" + (CenterY - outerRadius)); +debug("y6=" + (CenterY + outerRadius)); + +const HourHandLength = outerRadius * 0.5; +const HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; +const MinuteHandLength = outerRadius * 0.7; +const MinuteHandWidth = 2*2, halfMinuteHandWidth = MinuteHandWidth/2; +const SecondHandLength = outerRadius * 0.9; +const SecondHandOffset = 6; + +const twoPi = 2*Math.PI; +const Pi = Math.PI; +const halfPi = Math.PI/2; + +let HourHandPolygon = [ + -halfHourHandWidth,halfHourHandWidth, + -halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth, +]; + +let MinuteHandPolygon = [ + -halfMinuteHandWidth,halfMinuteHandWidth, + -halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth, +]; + +let transformedPolygon = new Array(HourHandPolygon.length); + +function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { + let sPhi = Math.sin(Phi), cPhi = Math.cos(Phi), x,y; + + for (let i = 0, l = originalPolygon.length; i < l; i+=2) { + x = originalPolygon[i]; + y = originalPolygon[i+1]; + + transformedPolygon[i] = OriginX + x*cPhi + y*sPhi; + transformedPolygon[i+1] = OriginY + x*sPhi - y*cPhi; + } +} + +function setHandsFont() { + if (settings.vector) { + g.setFont('Vector', settings.vector_size); + return; + } + + if (settings.font == "GochiHand") + g.setFontGochiHand(); + else if (settings.font == "Grenadier") + g.setFontCabinSketch(); + else if (settings.font == "Monoton") + g.setFontMonoton(); + else + g.setFontLimelight(); +} + +function drawNumbers() { + g.setColor(g.theme.fg); + setNumbersFont(); + + g.setFontAlign(0,-1); + g.drawString('12', CenterX, CenterY - outerRadius); + + g.setFontAlign(1,0); + g.drawString('3', CenterX + outerRadius, CenterY); + + g.setFontAlign(0,1); + g.drawString('6', CenterX, CenterY + outerRadius); + + g.setFontAlign(-1,0); + g.drawString('9', CenterX - outerRadius,CenterY); +} + +function drawHands () { + let now = new Date(); + let Hours = now.getHours() % 12; + let Minutes = now.getMinutes(); + let Seconds = now.getSeconds(); + + let HoursAngle = (Hours+(Minutes/60))/12 * twoPi - Pi; + let MinutesAngle = (Minutes/60) * twoPi - Pi; + let SecondsAngle = (Seconds/60) * twoPi - Pi; + + g.setColor(g.theme.fg); + transformPolygon(HourHandPolygon, CenterX,CenterY, HoursAngle); + g.fillPoly(transformedPolygon); + transformPolygon(MinuteHandPolygon, CenterX,CenterY, MinutesAngle); + g.fillPoly(transformedPolygon); + + if (settings.secondhand) { + let sPhi = Math.sin(SecondsAngle), cPhi = Math.cos(SecondsAngle); + g.setColor('#FF0000'); + g.drawLine( + CenterX + SecondHandOffset*sPhi, + CenterY - SecondHandOffset*cPhi, + CenterX - SecondHandLength*sPhi, + CenterY + SecondHandLength*cPhi + ); + } +} + +function draw() { + g.setColor(g.theme.bg); + g.fillRect(Bangle.appRect); + + drawHands(); + drawNumbers(); + queueDraw(); +} + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, UPDATE_PERIOD - (Date.now() % UPDATE_PERIOD)); +} + +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +loadSettings(); +Bangle.setUI('clock'); +draw(); diff --git a/apps/limelight/limelight.icon.js b/apps/limelight/limelight.icon.js new file mode 100644 index 000000000..06f93e2ef --- /dev/null +++ b/apps/limelight/limelight.icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwIdah/wAof//4ECgYFB4AFBg4FB8AFBj/wh/4AoM/wEB/gFBvwCEBAU/AQP4gfAj8AgPwAoMPwED8AFBg/AAYIBDA4ngg4TB4EBApkPKgJSBJQIFTMgIFCJIIFDKoIFEvgFBGoMAnw7DP4IFEh+BAoItBg+DNIQwBMIaeCKoKxCPoIzCEgKVHUIqtFXIrFFaIrdFdIwAV")) diff --git a/apps/limelight/limelight.png b/apps/limelight/limelight.png new file mode 100644 index 0000000000000000000000000000000000000000..cf057046be6eca51564a213bc3e7307271464009 GIT binary patch literal 929 zcmV;S177@zP)hL^4Q9~j~`7LX9JB(!Q` zf!g{&{RcFW&Q~mny+EQd5wRkG(GU|*v#i00#krWf=gz{s+-Te{nPTqF`ObG{=bo84 z7wV|v|Hht3JPkk}FaUG|9Y7m!Ao=|p@Bx?yW`SwoCGazne{UQEt^-TJmSbB2t^w^e zR}HiRcY*JgVs~m~;0|!8R^p4mY6RiBtpaENr0^Uv>(vCT0r!Cspcg0r`;t~jo{azx zfb|`CCKF##(F8oL;_xjnl#FrV8%ADg6Xz30z8#UnEWQMc5jI;nU_9Z{{Eq{QD8L7t!&STXpy9ZFm@kj^1Fem7{l-O!eBYr8>b)d^b3W}9W~#A6U*g95Oi>^=c4 z)~Zv`8K;EXvhfK3pp)!7am&FTkR7(HNX8sFd;lS+^%_N}!U1DH{Ly|K9>B#6_hueBM`PvzgXPMrIx>vGBiU)6Z4 zEpn3sb9fkCLB-z-YcKpmwJ#|r9RWl zC5~dFfRx^~zcZo4lLpcS%$dU%U1Vo|3%C)3JcraOHF*iC9^?bK^S~v{rNu|U-T>|j zG$FN0?PUAC7)9=|wrEE3yiS#A@zILA+sGlcN|VDaIFIb+1>`8+h@2|>kwB-& z?yx%JM4NdN29eBAO@MFvNQ4*G7A;7*Pj7ZUZ3CJ0gS8T$MjKKwTeK9b&o&dl(GUSK zKeKitb( font_options[v], + onchange: v => { + s.font = font_options[v]; + save(); + }, + }, + 'Vector Font': { + value: s.vector, + format: () => (s.vector ? 'Yes' : 'No'), + onchange: () => { + s.vector = !s.vector; + save(); + }, + }, + 'Vector Size': { + value: settings.vector_size, + min: 24, + max: 56, + step: 6, + onchange: v => { + settings.vector_size = v; + save(); + } + }, + 'Second Hand': { + value: s.secondhand, + format: () => (s.secondhand ? 'Yes' : 'No'), + onchange: () => { + s.secondhand = !s.secondhand; + save(); + }, + } + }); +}) diff --git a/apps/limelight/screenshot_limelight.png b/apps/limelight/screenshot_limelight.png new file mode 100644 index 0000000000000000000000000000000000000000..9affc3d1cbb9be291270cb57cd1474e03b685ea3 GIT binary patch literal 2180 zcmeHJ`!m~#7LSNFq7QG4TD79mCYD=m?;?bf2t`|^K}kwI(xOFMA!V(vUOPogqtPx) zwBp$kY0?!DtKZ#A>(yv(SCxupNUsVNgnHLaXZH8|2i$vR&iR}<^O^a~oSE~PlXvO_ zX(z%Q0f9hv`uY$~YmoOf;oCH|S*W0DK?8cLOw|IFED~c|;Q4-U9~) zer&36Ls`wW^pT=>0|PeRk*>q{zySHX*^Cw=)L&!OKwFX}`itSpWNT98-xPg%uxZ<5 zs4MIF3-B+3s;8nnb6!6g&&Cpa+netS1h0@1+9x^o^0CFRvPq};>_>>_ZU z^1+0+VpY!T_nuaB-G<4tc0hj`xNIi=Nb0$X6B|dI`!*XiiH{KIX!W3AIF)I_YHC0? zbzFaCdNd5rTTD0tqjs>*4Q6j_N5VJGd`Wap>^nK$QqHQy7kg+re6g|DC0~!VyRF}$ zs~d`J@2uK8Z5(?}GCJSdq&tTthCA$jc@WOi#vUksati`=@H!c#qXi?MvWZ4&!Kgp6 z|3E!L|0sk!f72+0wg`jAzle+B=E23oV;>ea@8C&%B^1r0nM8 zj{NDAH%t<8(mwMdaQM{Y0)|fDd%PJ!m6*RfW70f=EWgz*_4EDvM7(22ZUfb9eyW$U z2A9r5)rc5$JIRf7+o#yyL0S+xWI+-2!RS5HBLL3q0QT~c1e>I5oBgs!cZ)U+tc$FNDaHL27xA$IjEyF>+Y?g%2qrelFW z)-KN!oDW9fX!kErM5lo?mQdZY$Crc0_b!XFyvOaOZC7HUMSr{mgLPl&o*d*@qtD*h zp|&SeM6aQwR~T{j`9lKXSbx={^{M`XH>fh9-&5}BK>!ts>t6RQ(hr-b#gvLZH$LNz z^1%@1@?ITwspu=E7(^|23ma#+j#sJZ_R$xT8^kK&-M~u%3G#-?Xy%yPt0R-FC6w=o6mQcEU8hw(~o#iq-) zJkx57KP%jg`l*f|i5M$sOGL3tkeoy^VTuV2W8b>0M{SpgGTak# zL6mh`f#X`vq!PUZKg5%iBebwuu$J-KpUWW7$9cuH{n;RS)Hq1v-A4l#8e#fx^M5%X zuQ4p!#XN#^;Ro4;+U8O|1uO zZL`7nDn*!vVe);~pBkGBV7dNZ?0;vCD`qy|{M+>()y}q>w*ulzJVD@kM&|qnB+=s~ literal 0 HcmV?d00001 From e5dad4094be9e05a723850bafdad2c19548b1623 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 6 Jan 2022 21:58:44 +0000 Subject: [PATCH 075/122] fixed apps.json for limelight --- apps.json | 4 ++-- apps/limelight/README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index c4d7624be..98ce3e5d5 100644 --- a/apps.json +++ b/apps.json @@ -5460,8 +5460,8 @@ "tags": "clock", "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ - {"name":"limelight.app.js","url":"app.js"}, - {"name":"limelight.img","url":"icon.js","evaluate":true} + {"name":"limelight.app.js","url":"limelight.app.js"}, + {"name":"limelight.img","url":"limelight.icon.js","evaluate":true} ] } ] diff --git a/apps/limelight/README.md b/apps/limelight/README.md index 7d80ed985..aa0c359b9 100644 --- a/apps/limelight/README.md +++ b/apps/limelight/README.md @@ -1,5 +1,5 @@ # Limelight - * Simple configurable analogie clock based on the work of @Andreas_Rozek [Simple_Clock](https://github.com/espruino/BangleApps/tree/master/apps/simple_clock)* + * Simple configurable analogue clock based on the work of @Andreas_Rozek [Simple_Clock](https://github.com/espruino/BangleApps/tree/master/apps/simple_clock)* ![](screenshot_limelight.jpg) From 59c7cb49d6d33cb87a95d85440105faf64532698 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 6 Jan 2022 22:10:56 +0000 Subject: [PATCH 076/122] limelight fixed apps.json, added settings file --- apps.json | 1 + apps/limelight/limelight.app.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/apps.json b/apps.json index 98ce3e5d5..64b5c358e 100644 --- a/apps.json +++ b/apps.json @@ -5461,6 +5461,7 @@ "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ {"name":"limelight.app.js","url":"limelight.app.js"}, + {"name":"limelight.settings.js","url":"limelight.settings.js"}, {"name":"limelight.img","url":"limelight.icon.js","evaluate":true} ] } diff --git a/apps/limelight/limelight.app.js b/apps/limelight/limelight.app.js index a1af79466..f17114f2d 100644 --- a/apps/limelight/limelight.app.js +++ b/apps/limelight/limelight.app.js @@ -27,6 +27,8 @@ Graphics.prototype.setFontMonoton = function(scale) { g.setFontCustom(atob("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"), 46, atob("ChIiERcYGRwfGSAfCw=="), 40+(scale<<8)+(1<<16)); } +const SETTINGS_FILE = "limelight.json"; + function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; settings.secondhand = settings.secondhand||false; From cc7cbd24e1a7de0115fb87bb9250cc449865109c Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 6 Jan 2022 22:18:46 +0000 Subject: [PATCH 077/122] limelight fixes --- apps/limelight/limelight.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/limelight/limelight.app.js b/apps/limelight/limelight.app.js index f17114f2d..c4a599c96 100644 --- a/apps/limelight/limelight.app.js +++ b/apps/limelight/limelight.app.js @@ -95,7 +95,7 @@ function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { } } -function setHandsFont() { +function setNumbersFont() { if (settings.vector) { g.setFont('Vector', settings.vector_size); return; From bce36e9afc5e8e68ac508c11436bfe7c160020dd Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 6 Jan 2022 23:29:38 +0000 Subject: [PATCH 078/122] limelight fixes --- apps.json | 2 +- apps/limelight/limelight.app.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 64b5c358e..3e63507c7 100644 --- a/apps.json +++ b/apps.json @@ -5453,7 +5453,7 @@ "id": "limelight", "name": "Limelight Clock", "version": "0.01", - "description": " Simple configurable analogue clock based on the work of @Andreas_Rozek (Simple_Clock)", + "description": "Simple configurable analogue clock based on the work of @Andreas_Rozek (Simple_Clock)", "icon": "limelight.png", "screenshots": [{"url":"screenshot_limelight.png"}], "type": "clock", diff --git a/apps/limelight/limelight.app.js b/apps/limelight/limelight.app.js index c4a599c96..af4a99a38 100644 --- a/apps/limelight/limelight.app.js +++ b/apps/limelight/limelight.app.js @@ -46,7 +46,7 @@ const CenterY = (g.getHeight()/2) + (Bangle.appRect.y/2); const outerRadius = (g.getHeight() - Bangle.appRect.y)/2; function debug(o) { - //console.log(o); + console.log(o); } debug("limelight.app.js"); @@ -55,6 +55,7 @@ debug("CenterY=" + CenterY); debug("outerRadius=" + outerRadius); debug("y12=" + (CenterY - outerRadius)); debug("y6=" + (CenterY + outerRadius)); +debug("appRect=" + Bangle.appRect); const HourHandLength = outerRadius * 0.5; const HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; From a31b22d3fbad98d3b325fc7f46e4a1c8bfd5f292 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 7 Jan 2022 00:38:15 +0000 Subject: [PATCH 079/122] limelight sorted icon and png --- apps/limelight/limelight.app.js | 42 +++++++++++++++++---------- apps/limelight/limelight.icon.js | 2 +- apps/limelight/limelight.png | Bin 929 -> 318 bytes apps/limelight/limelight.settings.js | 6 ++-- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/apps/limelight/limelight.app.js b/apps/limelight/limelight.app.js index af4a99a38..f41b050d1 100644 --- a/apps/limelight/limelight.app.js +++ b/apps/limelight/limelight.app.js @@ -41,6 +41,16 @@ function loadSettings() { var UPDATE_PERIOD; var drawTimeout; + +/* + * This calculation assumes that there will never be widgets on the + * bottom but it could just as easily be adjusted. If only 1 widget + * is loaded at the top Bangle.appRect changes to report as if + * widgets were loaded at the bottom as well. The other option would + * be for Bangle.appRect to adjust for different combinations EG: no + * widgets, wigets on top, widgets on bottom and widgets on top and + * bottom areas. + */ const CenterX = g.getWidth()/2; const CenterY = (g.getHeight()/2) + (Bangle.appRect.y/2); const outerRadius = (g.getHeight() - Bangle.appRect.y)/2; @@ -96,22 +106,6 @@ function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { } } -function setNumbersFont() { - if (settings.vector) { - g.setFont('Vector', settings.vector_size); - return; - } - - if (settings.font == "GochiHand") - g.setFontGochiHand(); - else if (settings.font == "Grenadier") - g.setFontCabinSketch(); - else if (settings.font == "Monoton") - g.setFontMonoton(); - else - g.setFontLimelight(); -} - function drawNumbers() { g.setColor(g.theme.fg); setNumbersFont(); @@ -157,6 +151,22 @@ function drawHands () { } } +function setNumbersFont() { + if (settings.vector) { + g.setFont('Vector', settings.vector_size); + return; + } + + if (settings.font == "GochiHand") + g.setFontGochiHand(); + else if (settings.font == "Grenadier") + g.setFontGrenadierNF(); + else if (settings.font == "Monoton") + g.setFontMonoton(); + else + g.setFontLimelight(); +} + function draw() { g.setColor(g.theme.bg); g.fillRect(Bangle.appRect); diff --git a/apps/limelight/limelight.icon.js b/apps/limelight/limelight.icon.js index 06f93e2ef..9e886bbf8 100644 --- a/apps/limelight/limelight.icon.js +++ b/apps/limelight/limelight.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwIdah/wAof//4ECgYFB4AFBg4FB8AFBj/wh/4AoM/wEB/gFBvwCEBAU/AQP4gfAj8AgPwAoMPwED8AFBg/AAYIBDA4ngg4TB4EBApkPKgJSBJQIFTMgIFCJIIFDKoIFEvgFBGoMAnw7DP4IFEh+BAoItBg+DNIQwBMIaeCKoKxCPoIzCEgKVHUIqtFXIrFFaIrdFdIwAV")) +require("heatshrink").decompress(atob("lksgIqngf/wAFC//+AgUch/4AgMBwAQEh/8Dgf/4AKOEAQKCAYUB//gAoU/DQkPBQYVBGx5SDBQIbDBR0GEAlgFYcHGwh4B+CDHRwL04")); diff --git a/apps/limelight/limelight.png b/apps/limelight/limelight.png index cf057046be6eca51564a213bc3e7307271464009..b1744b28eab888dc537519f74401e020471b0b7e 100644 GIT binary patch literal 318 zcmV-E0m1%>P)Px#_(?=TR9Hvtn9&M=APhz4|9`Y$B#4yV%`Fpd&#{ij>(r8nWZCFR1P-1p8V(jL zG`x-Bobm3MQkhuWGaU&HXpd+Cp8{@SpFWNZNCWNyJo@0TfRPj;z@-jqdCD+>0RuGL zOF}Y?=J(8c^zrfySOe=0{06st<7ffCfOR)~x5!5W(Z*ppa2=oqeEFi&LKE21hc%Xe zV;DUE5txza445KOHv^=9qB|f`%e--H3yiF6#4u{tY`DhChL^4Q9~j~`7LX9JB(!Q` zf!g{&{RcFW&Q~mny+EQd5wRkG(GU|*v#i00#krWf=gz{s+-Te{nPTqF`ObG{=bo84 z7wV|v|Hht3JPkk}FaUG|9Y7m!Ao=|p@Bx?yW`SwoCGazne{UQEt^-TJmSbB2t^w^e zR}HiRcY*JgVs~m~;0|!8R^p4mY6RiBtpaENr0^Uv>(vCT0r!Cspcg0r`;t~jo{azx zfb|`CCKF##(F8oL;_xjnl#FrV8%ADg6Xz30z8#UnEWQMc5jI;nU_9Z{{Eq{QD8L7t!&STXpy9ZFm@kj^1Fem7{l-O!eBYr8>b)d^b3W}9W~#A6U*g95Oi>^=c4 z)~Zv`8K;EXvhfK3pp)!7am&FTkR7(HNX8sFd;lS+^%_N}!U1DH{Ly|K9>B#6_hueBM`PvzgXPMrIx>vGBiU)6Z4 zEpn3sb9fkCLB-z-YcKpmwJ#|r9RWl zC5~dFfRx^~zcZo4lLpcS%$dU%U1Vo|3%C)3JcraOHF*iC9^?bK^S~v{rNu|U-T>|j zG$FN0?PUAC7)9=|wrEE3yiS#A@zILA+sGlcN|VDaIFIb+1>`8+h@2|>kwB-& z?yx%JM4NdN29eBAO@MFvNQ4*G7A;7*Pj7ZUZ3CJ0gS8T$MjKKwTeK9b&o&dl(GUSK zKeKitb( { - settings.vector_size = v; + s.vector_size = v; save(); } }, From 32a1d048770859131aadb4b34fb58ed37ff61b89 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 7 Jan 2022 01:00:22 +0000 Subject: [PATCH 080/122] Limelight - screenshots --- apps/limelight/README.md | 11 +++++++++-- apps/limelight/screenshot_gochihand.png | Bin 0 -> 2332 bytes apps/limelight/screenshot_grenadier.png | Bin 0 -> 2376 bytes apps/limelight/screenshot_limelight.png | Bin 2180 -> 2425 bytes apps/limelight/screenshot_monoton.png | Bin 0 -> 3032 bytes 5 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 apps/limelight/screenshot_gochihand.png create mode 100644 apps/limelight/screenshot_grenadier.png create mode 100644 apps/limelight/screenshot_monoton.png diff --git a/apps/limelight/README.md b/apps/limelight/README.md index aa0c359b9..f1cc52092 100644 --- a/apps/limelight/README.md +++ b/apps/limelight/README.md @@ -1,11 +1,18 @@ # Limelight * Simple configurable analogue clock based on the work of @Andreas_Rozek [Simple_Clock](https://github.com/espruino/BangleApps/tree/master/apps/simple_clock)* -![](screenshot_limelight.jpg) +![](screenshot_limelight.png) * Selection of different fonts +* Settings menu where you can select font, or switch to Vector font and try a range of sizes * 100 less lines of code, demonstrating that there is no need for a custom widget draw method -Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS +![](screenshot_gochihand.png) +![](screenshot_monoton.png) +![](screenshot_grenadier.png) + +Many thanks for @Andreas_Rozek for his pioneering work on building a toolkit for the Bangle 2. + +Limelight 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/) diff --git a/apps/limelight/screenshot_gochihand.png b/apps/limelight/screenshot_gochihand.png new file mode 100644 index 0000000000000000000000000000000000000000..af405c0f8406505893cedcbac16da25ea1e27804 GIT binary patch literal 2332 zcmb_e`9IWa8y?@jX~raGq-GOI2g!9Am-1q0Yug`V;bYIVt?CeOCmQs>}!C=xP zJ8M^Qt^Rf3lH$9H^U+6KBqCjjCt;O5m01`J&L>%)ICI5kzHsz1>)=jU{?^vaS9NI} zGHj0Od1!E0%_CKE$obvz`1trD%eWI1XFvwrUmuyhp^?B%lC>B7U9l#;vFLtjV+#pc zjS@}3Zs-A`0#J1z&n0_L2LPUr(b0Akz5DT46p&B;4X07arO7od8~7ZB$bXZo*>l+< zQPW+517sDC)*9D!e>Tt^l+JmQsI3DjZ8%%(Fq9A144(zba-+?;hC`lZDgFM4>;;cw z<;j}iBsjQQPuUz1yJ}7DZ(1%PT~)VRx({XWaqUOfj&%-3tG9NjeX~dmX7F2k2lMcA ziD-hrxd2OdfI*&ev^Hk|u5u?UfQ?WKr+=u}YY&60E@oDkNq`p|3RX^vQEkV}Cz=Ud zc5}xZD-afIv z!+VN04}ymEjo8Y7{^mY)`NGhfU*A~?kdCe~m;isE=jO)M<>&1Rc*)X?y-=vg#@ZN? z(Pmy~<*jxVGujUxs!ho>)Jj)puK`j4Ot}0JOjZPo#(J@*qxb}0`OYv@>zm3jNnq~Y*%SiB;vC4w zm7_1Nv_$@N96J&LRu;34>kPW}ha?jy%A8l)B~|;hfYG;!HYSXDZPW6=zB#P;kvoYQVZ;9 ze8lTmK8rEmNf0QcmFb`Im9Ol%F^FspUDX$Yy?92fceWLxwQV;sr^$^qMV;`~oL3cA zzOH)%kR^s-r&*I^o<~Vl{b8aCW?f#hdikd5Gje2_$vxpQ27TrEfohxT{;Bl8YU_XY z)G|N$Ww`lSigp2E_c(apI_{nat89)G)nl}o={+ob?$IE#&UQ|oe;t$S_i$_o@ch`M z+a0UHyxK~)pS+MxH@>SM^(0C0q(D#SoS9KwFV4Z2z5IAP^Hkmbz8-93InrJ4xALjA z&qfz*&*jG=U34|Amag`UO#w_P=cz`tFcX)TS0*(kvNqN7F4Ox$UHZ}_6nO+-%s%@r zx$BHRii}3ay-DJ0O$H^^^XHY6zMp!(v~V6@6o^2LXgFIhGNY>eiUWDoj62jbFG~Yw zR$!3R(c;i9y}qf%AM&{?NQm6L6~B<-ZV(>i8{KfNB1TKMGr-dRz|y)_s!?_S=gH!t zTW|X{hylwOvn(zXfve??@>2qRtZfBV<(fI%Jo?o=&{-2zySUG@v1Z>Zyu9STF90b4 zKECI!I{DLCrWKy5<@+2nPAfoqm)67cYg(R`SBG%2;bYQ_wnQPehFTn)mUHPgLjS=> zJT-KrIm-P$d1m6)<=wB;&cyl0x~9-P6S>k#arIpqCg}AdiS{COqjWvbW#<;BV3*TE zGirYKJJQ#Ct#qMmBj=eAVbWvDv{z9#lEXu-_i3!GP#xw{@S=AvqTtkrs4}dsUX%{J zpxUBtTrgxkc1keM$$qrqr#L&0#w;r^{uOVeEN_t}1&aVJbb z9i_WbGbsFZKbA_}h5!R714QSLf*V0Ucc?(hJ$s+141UkW0z}0jo&NDsV;~xB6!F%a zoXXA6jOvXVHrNhCXIFL)MCW(Iy*i6|M}$~0hsoxPqTjlzg&W++{8-3P!i1w=2Q!VA zOl<{upRhd^Q{pBdbI6c(C>hn*V2oJmum6)ExOx4FZqTiuR4zM&)XbYfW5Qi)&N0nI zOaSuC%Zy{A#P(XbWl=FKl9(f{NNLMx*bP6H;M``f^1Il>$XwFn@VZ#~g!LD1Dqk$r z)~9fOBNdJLMgRh}%|^vSICo=;v`2|CAfxTX%*5HHa&tliTUa-sg`C2DTHv{ro+J?6 zCg0{l23ap#^k1m{ohFgaHCAcgd_dAM0CM3kjuXYn-owJKkIx%FSB7mA0?;;h+pVql z37HqN0H}~{>!U@W;Q@1rhVQg^9=dcFkwS|_jUZkrrg0q;;9tR+okWTj;W0N;OP=R? zL5%Vmd=b4ehYG^CPr~&RE=48T4h*;+Q#C~W*i?a5dN;*U^nXeF?GsLJMXKgc+dEPC zgsGe^w^3kLnnFk(EFlQ~%MU(41^!APiu2Px;0!c(cRCr$Po$Y#~It&Ke`@iU(Cp}9yO9AWSmB29lTT8Y_gW?de0}f( zfk_E`BJiY@W7*#X5Ev1p1irrNUeG^3U%LMLgTT`Akqm)xU}^%3z+2riy0N32bl@me z;x-Aq%Vz1u7STfj?@ex*@U^qim1xaxf$)8p-#8!PSU&*-UWtgn{SszotQ2@z*L$=2 zb%d~X&b^Me7H&Pxn}0Mu1DjYq0R;YY8)gw7f%TGAW;|Ws_2xz$bs4`F%_`m~|L6$8 z*|$8m99&-)jks-m_$8Gj-sR5D1(p!Tn=T7kJ$X z*T}7JnyeRsHUAzM>w505&NFwo`z%CO7zBQ%P~E%cVV-W{%qJy)z*3wf>n4D}-Nczs zN&tbSI7!w`0D-%SGoO?I0!wj{teXG=cN1qmDFFnQ;v`u&0R&DGfB(Q|@7pKVPaBg< zd1N>OC(6#l_z8HTPy`Nw-1?~9+JWiFLFgM{2pnK(eNM#tWEKx5`HO+TPG(0^S_B+P zZOP$W@~wv>u%oMPOseNAkYXM7pQtENxukBZncdqwFJzBLcssM`A}2 zRznfk$?hfF`ulxLim1R_5@&Kbw>0%|1WuH1bRXE8TAj~3|BT}iI8imVaO!-CtxXe( zz==|+g;VECY;BrQ1WuGnEu1=EVr$ccB5G)Q%jT8dgIBkwP5;!C8_a{uBuhQ@{B7ndn zLI=O!6F4g`0^5s%z;;%@Mj~(mo+uQ7MIcFY4gmx{hdZ;12q3TsBx%kefWYT)XI2pb z1QvlL%{c@RxQYAgjs^F2^{^3G&vY~6-o0U@&J_TGbNtNF2y8~>8i>FyT=BsO9A|eF ziNG~nho9Ol12{tD3V^^lex_);uL)CV5CVs=`GOGG$ICMsfjzW>V-YwA&Jc#c21wZ< z2%IIjACJIwY=1H%a2;d>u49Y94Qvs(0Wux94l)AQvHi|`^z|a{0q5Z(aGv2|2D)!8 z;1YpHUut|(=Rx3!1RjaI-pUh1ewx7D`;~NHuek3b-(BMFg4XuCarW*re_G&-ybF#y zON_w(O0TYUO5jLwA~ECZ{<PE5)naTt{(^=AirjrBhXBiNKkc{;G|gE$`8% za2Z}#*q3(=l{G$H;H^U6rNDIH|5d+~z!i(B$m#7872}^SaL4}L9k@caikuZfdUJLZ z(7UG2@yho~vNv%RvQ^~lEY#jy2)uuTOLa`70~eXjEwtlDNnh9%61xSiIF#S913$g{ zzW0U7iy48NJFueb6fLy1;krzT5-ezZTSQ>_P&ojuGn3l(!Ja1Qp%JG5w{7 zD(fy2*n22fZsLm7Lg3@7s9t%)0`I*{TF!WPEbjXaqi?8Rp=YG7crE_3CQE&-n@~uc z68Pw>x7Cp=-;G+Kb&UI^?u}%=oxmfBt->h5Sm&%7_v=F4`nR!@O0BHZB|7jTLFOe> z38hL(PhJy?wbYXct*q6h1kQ-8gyIpcYHZ|;zjb1Mo$v1ab4h{Ufp0BPvFMqK`o3T9 zg?e|X6)vRT#Cc>=EZ8&O9mlSvp1Dgad}tH+?)QDqx>#oI(kdTL6WIH5dX^wF&O1Yw zR&?L*TeZ<|C3_01y4pN*GWIWlt95Cm52pxB_dWmeI;%@7II))`g^XRx=TlH zEm}yIcVN|7$Fdp5XbD86HhqwD<~K5|nCQM%QuB-(9X&ebEk8ogediG~y3)vlOUm~^ zWk(3)jVdvBT=x@)WdhG#23D^muypB)PYn@RSt)Y06F}g0g}fWS(cx^EBXWfnTHm^a;540MnVfrY&3 zzCxJBR0wPYWf?~IwNTQIL0}P2x~~YNGYtYef$a^a`-(t1(;%=D*w%356+jH8K;R&_ zC2a5LfYeE_#&85Sg0dbREa{YgAJ;P9oyQ<>qPo_@1;LICVbfcBUVWz>X4D z$X1clv8CyUBCw-`6|z<2bZlw*p$P0KVTEiJIUQS?ekcMvN?0LVMNY?-rXPyH&JwDH zQ|EJTXZqm?>@1;DIAt#9Hf}QG#Mh=oE>qhrX4uX-|DJ!(A8WnOdY*T^@3Yn)>seQic(^DNvj*%*nhjq1C&H``*pRf4-$V z>Xt-Cyw_{9JXa!op7p%0+DbGYVzF4eS<(WefDnU~6l6V_%)kJm0-qq2zFKlxSsvub zWLShh_N0FpWa!ww!`)TJ4H87(+ebz^KUEMIiSv_wMPYa2OmK4o1ABuVSx|#Tz??ObMFyS{OhtopT$m zRuk4a07soCI(tnau2f_h7lBp{#}nE2=`~F8#>sTU>7_7|=rBcvGQA^U#SYh{GadVgM59ZqfHv%VT4`b)fKZlA%MYGyAlM53==Db zf$A6Saw;fS++jC}K|_BF3OHNpxsZJ>#kI0S`tZR%FqnyG+UI$x5zDe>6 zUT;$P0Towf-3L|6u9-v( znAqdYjU0Je8qH`o=cQ``jc{^-5p=KLHjL*-=fscef|y^KMjT$FCD$}eep^>y|GXBM zwybul&sdsj7oEvHb}*qIZw~T-=<=aUi{+RSNpSf<*{Mq3C+vY2fFVAv&Nk8lK@=iv zhw*x|gZg1e5sP{NPxSswPwg)2DSxm@fn7X3xu>)!cYE>!fgp_!z$WIE87lJJhsMxQ6FhjANe{jW5f?$3{X zjhcOYCjC$3hPQ$eGG4TH?nBK_K&Xo#IgP16xDL^X`Z1z=uRN*(6-5B{@dP~ZE;g0C zCA;9ti2@w+n7p<~=Z<1D9~8%{oqMpYmwrHeLV+ao!Fhfd?dVgPa@jf6+*_}93d$V+ zav_s2@H5VYw^qDjD2JqhTI!Ihutu|w00~^z4A)TsT<@;r!6yJgvHJh5q+SSlr|wnPqUWEw~yg0FgIdvH*Wx@v0p_-KD=amx23huxf)_! zIBm;dN+*>ox)ifrd9ZSTw3+ARa*a+vlGS)@b!{dmI?KjwmNvWNqx~I1J>(gQIv&x_ z%+kHZU&Kf*VL<6^^Hy7)|CwK%zfBb*>4WsKg!!>6axcS<(E~TvGQ!sgaJ3qbX9$wy z$qNL*rNU}ylA++25U_02xUZ3EGn&WZ<(_I@gQT^4@fOqB4o`ET>5}-lhJe~u1LxLC z*Izb0|3n8122oJ|^*gam$?MNPy>#A&a7Nho4*=X z%jFR`?H(pR5oKkJ*j~z&ADVUHuG|5vP+uZjngA=(`U3y&vq#S@wUj*&b2ZskCyW!X zx^1c!?3F$gEO1xm`aZc2S-jBL8vWrGUgCJOS}l14)Np-F);*`#T!I9i*4=u>nFM!5 zemnq58Z^GlDvCi&c{V+x9L(W=mOE{;McL!oZEdmA@_fX#*MkFxv4VX&l+K^_U7-yh zlF;II{J3Eg`uTU+;XQ>{;$lM2#uv_C?0R8ke2z_nNgFGqQ@1gju}83}+lR@2j5Ovt zJlfu$=k+T2PSX1^;EAmoOe@BP_&uOQK4v#lhkkhBTjTH8MDkMpOcZz2>KZyL+ZtP^ z+Boe9%hxO!c|^Tv5vqajj~<-Ys2>q+?N+;5^6-G2n4}x?5D1<)O$bh zcwGEw-JWGu7zplSjwhGQw}IT`mpfZM%Ugkz7)J9vzRnMnC-zkDr(-t2`M;Enj~mUj z0S2jX^hOu+2DHF!&5klN5`zJ`{5Xv)Wj`==xvc0`2gU-}v=lYA>~HMGqRW{9Q!m85 znsCl=&vc?*A`y{&o5?(-mq0{PPxP!b>8&ab>~=|w?musZM_s;Zp8Cq%i$_B=$D3Xb z?!lub0?n?g%tc?YDK#(HeyUIl%dxS&{zd%z7OX@#5I*`{?FA$F5I$ zKw!#5-`4ME02>EvX#JMIOW6mPgyHNFRr3kLHm=q3q<^T_`)n-Q{K|P*$zko1Dug(` zk9%I#u;RP>Xl&bo#2iXCKrhy;ZpbU{v>MQHkLQo_tP}{0Ocex*b&~`aLAF~2W+WK* zYk3k_Rldsy6YAuI48nwZpP4eO?30(b>5rnb#&YYq`f1X9tbk(YhVyLgG5W7paLM?f zpJE4T=)m|N(r_(c*Gnxfev8Fc?o zgfH)C_eRhWQn&lLC5S9ih4Y&94`bQ)3ReA1xT{Jy9Qz)p{pBj#-x|qvTKLaw%xd*3 zy-F5fP9Fou*6}bMH;D17puZwdu9BR zCDbv7sU~2Wj#Bm!5ehHt5gSB3$~{an{~t}CcAu*lcCe;u$FKfU;NU(F=W-`@;y-su BY>NN@ literal 2180 zcmeHJ`!m~#7LSNFq7QG4TD79mCYD=m?;?bf2t`|^K}kwI(xOFMA!V(vUOPogqtPx) zwBp$kY0?!DtKZ#A>(yv(SCxupNUsVNgnHLaXZH8|2i$vR&iR}<^O^a~oSE~PlXvO_ zX(z%Q0f9hv`uY$~YmoOf;oCH|S*W0DK?8cLOw|IFED~c|;Q4-U9~) zer&36Ls`wW^pT=>0|PeRk*>q{zySHX*^Cw=)L&!OKwFX}`itSpWNT98-xPg%uxZ<5 zs4MIF3-B+3s;8nnb6!6g&&Cpa+netS1h0@1+9x^o^0CFRvPq};>_>>_ZU z^1+0+VpY!T_nuaB-G<4tc0hj`xNIi=Nb0$X6B|dI`!*XiiH{KIX!W3AIF)I_YHC0? zbzFaCdNd5rTTD0tqjs>*4Q6j_N5VJGd`Wap>^nK$QqHQy7kg+re6g|DC0~!VyRF}$ zs~d`J@2uK8Z5(?}GCJSdq&tTthCA$jc@WOi#vUksati`=@H!c#qXi?MvWZ4&!Kgp6 z|3E!L|0sk!f72+0wg`jAzle+B=E23oV;>ea@8C&%B^1r0nM8 zj{NDAH%t<8(mwMdaQM{Y0)|fDd%PJ!m6*RfW70f=EWgz*_4EDvM7(22ZUfb9eyW$U z2A9r5)rc5$JIRf7+o#yyL0S+xWI+-2!RS5HBLL3q0QT~c1e>I5oBgs!cZ)U+tc$FNDaHL27xA$IjEyF>+Y?g%2qrelFW z)-KN!oDW9fX!kErM5lo?mQdZY$Crc0_b!XFyvOaOZC7HUMSr{mgLPl&o*d*@qtD*h zp|&SeM6aQwR~T{j`9lKXSbx={^{M`XH>fh9-&5}BK>!ts>t6RQ(hr-b#gvLZH$LNz z^1%@1@?ITwspu=E7(^|23ma#+j#sJZ_R$xT8^kK&-M~u%3G#-?Xy%yPt0R-FC6w=o6mQcEU8hw(~o#iq-) zJkx57KP%jg`l*f|i5M$sOGL3tkeoy^VTuV2W8b>0M{SpgGTak# zL6mh`f#X`vq!PUZKg5%iBebwuu$J-KpUWW7$9cuH{n;RS)Hq1v-A4l#8e#fx^M5%X zuQ4p!#XN#^;Ro4;+U8O|1uO zZL`7nDn*!vVe);~pBkGBV7dNZ?0;vCD`qy|{M+>()y}q>w*ulzJVD@kM&|qnB+=s~ diff --git a/apps/limelight/screenshot_monoton.png b/apps/limelight/screenshot_monoton.png new file mode 100644 index 0000000000000000000000000000000000000000..d17d9bd26e9795c28c427f37ca8407db63b3f5b8 GIT binary patch literal 3032 zcmcJR`8U*y8^=GNkHMHxjJ+Dfbdhzs8d2E>Nw$!6G>v3WQ3@0Jj4n|cuRMxQ# z#pt8UO^d9PU4s-MDT9mZ>weGq{t4e7p67kev%JoE&Uwyxp2U-OmOC)JF#rJUusUw; zxUH;z4K1|os~bO1w*|cHXh{aD-s0x~0DITU-1Jlgbun-B>Vlf6dGoJd#g{V-mCVrO z5-fX%ixD!H(at?Avk`Gd}BrEcAa6w8o%K#c##rUfSuvJrQbUf;+GC&xS!^Njf= z&Kp?i-36)$C{~()O|DuT#+|5I=$i9PQx!xyf1Gs8BplSVW!glTm&zwTiZTDAE_-Rk z^4tPl5FH|*47Msf?@ZDKwdc!ja|>jk%3Q~eAV$z)#ZS^^!VvymH30sch~LkXEEA>BF zJHx=kS5|(m8YXbHOYZj)braZW=0RP#^j^eO6gd(D;h4!%XNY^H+F#eSu@4*tW(|8O&{k7TRF_+shqJ@><)?w=3eJv8$kWKHRe{{InfFup;N~Gz6 zUm9ep_R7d_SM75tPr<>Y_o#^6y^swI3g!oqVaAxhb0394dREa&zl3I0r8cQ<)>(XP zN-$#&qFMQPs3Pc~G_Thd`{mc?mrBUfV{-tZ((Fm9!|F|j&xL?(Kz$J6PN#7P*K|87 zT20QbJJ)3$R}Z6!B^fQ5MAWq8`l((YZq&{YBGPN(*1hHnKNYk0A}|#l;lUk<`jhJV zT|hHjKTu#5vRaHuRdV|nZfa>=p6jRA5rffEHMGFGn*9|lC^ zvczd7#ySWm)Q~p323d*QpoxWfvNVKb8;jXanTR2sbvuy(W0j~ZPPGgur1lN)T>1n# ziQ1y8HN`-o*>Aubj41jZjSPc0L!b^4c&_p<(_D_Xw%Ky1yI@{wFOujH6a9YItBO{i z$b}n`xXgsW_s%;)RNDW@lnw2lG-On&fBjAJl7x|6_DcYKdrI#6CG^ND4=}Id!gwyLc7TOfN%tDVDqfxZX7V z!te}*jAq&Da7VBqOOuMvD_(U)(@rbjvrs{Nd}B2~!O}y2KMc&cuA3c6E1N#vmNHr?_5-qu^}-6d_%5I;NU)-x8OL474{g z4f{Xs|$#rh%Ry`6Son2A8ZV<$RKYi-X%Mc(szg%YKo) z?^U7mjK=YRyXrNT!mt z65s1#a725nx9CO{4T}nIKakV!7&jXGXZmyiV64=1M3MrvC`1g353Rt}5w+u}u^hyO- zjeTP>W>f8p!-qzUaz&$KIN8^-i!B1|8gAr$6DcTNH>v9Q`R z(uWJ$!Cbv8-Qy8YUv;-om#57YS#O3{N_5)_a{Ttgxskfnm$yj@(R~3W7kHKwEqAEj zo(VbfgE!qifcc$vP8g)OIW+jet+xxn~Z*$>c+53Np$zg$BGyI|}<4wo0 z4h1!Yulc#=;DynfxTro~Qf)!R=|KIoQuu1WSC~Uabi6Itgu(|Xxm_Wh&;P#Wk4?>< zKLwLgN~Fx~3EftUMjFfY;@P}XKH~pM`C9ZWzW!P~|1s9gnfO4F6O!F)CzD0uAgrOcg?M=#RRGavKgJjP`Qk@i3fowI0a zeQa%X2>SglGJNOoiLdW?%Ccd>T*C~;^NXI}`aYtDvL<>*J8&US1iYj?52zwSh7J*_ zCvtw|IGD*6eqL#c><+Ns{(UpD;?|Fg-5Ak8 zKTz&TLK=I#YAarmxMFz^Ms}C))A0Gstnw_YFgGpdh@@IYE%ZrpQ9|@M@#1S9 z2~hM!OVdEYK4WHyw(%dp5y!F7fRvFNRO2zbm)-pacfT5L2OHAZuT$g`*p>>x9D~fp zE+T}tAwi0@l5Om^Of Date: Fri, 7 Jan 2022 01:02:43 +0000 Subject: [PATCH 081/122] Limelight - screenshots --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 3e63507c7..00a2b9860 100644 --- a/apps.json +++ b/apps.json @@ -5455,6 +5455,7 @@ "version": "0.01", "description": "Simple configurable analogue clock based on the work of @Andreas_Rozek (Simple_Clock)", "icon": "limelight.png", + "readme":"README.md", "screenshots": [{"url":"screenshot_limelight.png"}], "type": "clock", "tags": "clock", From 0dec5b608a9bb374a5be61b503e7032599cafbf2 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 7 Jan 2022 01:07:20 +0000 Subject: [PATCH 082/122] Limelight - apps.json update --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 00a2b9860..91ef1450a 100644 --- a/apps.json +++ b/apps.json @@ -5451,9 +5451,9 @@ }, { "id": "limelight", - "name": "Limelight Clock", + "name": "Limelight", "version": "0.01", - "description": "Simple configurable analogue clock based on the work of @Andreas_Rozek (Simple_Clock)", + "description": "Simple analogue clock (with configurable fonts) based on the work of @Andreas_Rozek (Simple_Clock)", "icon": "limelight.png", "readme":"README.md", "screenshots": [{"url":"screenshot_limelight.png"}], From fe66e54b4fdfc7b9f34bb8874c57bf537287cf45 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 7 Jan 2022 01:48:39 +0000 Subject: [PATCH 083/122] Limelight fix icon --- apps/limelight/limelight.icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/limelight/limelight.icon.js b/apps/limelight/limelight.icon.js index 9e886bbf8..f7e74db90 100644 --- a/apps/limelight/limelight.icon.js +++ b/apps/limelight/limelight.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("lksgIqngf/wAFC//+AgUch/4AgMBwAQEh/8Dgf/4AKOEAQKCAYUB//gAoU/DQkPBQYVBGx5SDBQIbDBR0GEAlgFYcHGwh4B+CDHRwL04")); +require("heatshrink").decompress(atob("lksgIqngf/wAFC//+AgUch/4AgMBwAQEh/8Dgf/4AKOEAQKCAYUB//gAoU/DQkPBQYVBGx5SDBQIbDBR0GEAlgFYcHGwh4B+CDHRwL04")) \ No newline at end of file From aa47b7fa99cceb520f7684a8e05bd995fd828de1 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 7 Jan 2022 09:53:40 +0100 Subject: [PATCH 084/122] Hopefully fix bug where no HRM data is received --- apps/circlesclock/app.js | 67 +++++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 32 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index b5ee61c75..392fa4287 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -9,6 +9,7 @@ const powerIconGreen = heatshrink.decompress(atob("h0OwYQNkAEDpAEDiQEDkmSAgUJkmA const powerIconRed = heatshrink.decompress(atob("h0OwYQNoAEDyAEDkgEDpIFDiVJBweSAgUJkmAAoYZDgQpEBwYAJA")); let settings; + function loadSettings() { settings = require("Storage").readJSON("circlesclock.json", 1) || { 'minHR': 40, @@ -60,10 +61,10 @@ function draw() { if (!showWidgets) { /* - * 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. - */ + * 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. + */ if (WIDGETS && typeof WIDGETS === "object") { for (let wd of WIDGETS) { wd.draw = () => {}; @@ -97,7 +98,7 @@ function draw() { function drawCircle(index, defaultType) { const type = settings['circle' + index] || defaultType; - const w = index == 1 ? w1: index == 2 ? w2 : w3; + const w = index == 1 ? w1 : index == 2 ? w2 : w3; switch (type) { case "steps": @@ -114,12 +115,13 @@ function drawCircle(index, defaultType) { break; } } + function getCirclePosition(type, defaultPos) { for (let i = 1; i <= 3; i++) { const setting = settings['circle' + i]; - if (setting == type) return i == 1 ? w1: i == 2 ? w2 : w3; + if (setting == type) return i == 1 ? w1 : i == 2 ? w2 : w3; } - return defaultPos; + return defaultPos || undefined; } function isCircleEnabled(type) { @@ -229,8 +231,7 @@ function drawBattery(w) { if (Bangle.isCharging()) { color = colorGreen; icon = powerIconGreen; - } - else { + } else { if (settings.batteryWarn != undefined && battery <= settings.batteryWarn) { color = colorRed; icon = powerIconRed; @@ -289,39 +290,41 @@ function getSteps() { return 0; } +function enableHRMSensor() { + Bangle.setHRMPower(1, "circleclock"); + if (hrtValue == undefined) { + hrtValue = '...'; + drawHeartRate(); + } +} + Bangle.on('lock', function(isLocked) { if (!isLocked) { if (isCircleEnabled("hr")) { - Bangle.setHRMPower(1, "watch"); - if (hrtValue == undefined) { - hrtValue = '...'; - drawHeartRate(); - } + enableHRMSensor(); } draw(); } else { - if (isCircleEnabled("hr")) { - Bangle.setHRMPower(0, "watch"); - } + Bangle.setHRMPower(0, "circleclock"); } }); -if (isCircleEnabled("hr")) { - Bangle.on('HRM', function(hrm) { - //if(hrm.confidence > 90){ - hrtValue = hrm.bpm; - if (Bangle.isLCDOn()) - drawHeartRate(); - //} else { - // hrtValue = undefined; - //} - }); -} -if (isCircleEnabled("battery")) { - Bangle.on('charging', function(charging) { - drawBattery(); - }); +Bangle.on('HRM', function(hrm) { + if (isCircleEnabled("hr")) { + hrtValue = hrm.bpm; + if (Bangle.isLCDOn()) + drawHeartRate(); + } +}); + + +Bangle.on('charging', function(charging) { + if (isCircleEnabled("battery")) drawBattery(); +}); + +if (isCircleEnabled("hr")) { + enableHRMSensor(); } Bangle.setUI("clock"); From 2f16365e6cf6b4ad9717770e4103b6d52a4f6fe2 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 7 Jan 2022 10:26:45 +0100 Subject: [PATCH 085/122] Redraw background rectangle before drawing circles (fixes graphical glitch) --- apps/circlesclock/app.js | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 392fa4287..4f2fea4ab 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -131,6 +131,11 @@ function isCircleEnabled(type) { function drawSteps(w) { if (!w) w = getCirclePosition("steps", w1); const steps = getSteps(); + + // Draw rectangle background: + g.setColor(colorBg); + g.fillRect(w - radiusOuter - 3, h3 - radiusOuter - 3, w + radiusOuter + 3, h3 + radiusOuter + 3); + g.setColor(colorGrey); g.fillCircle(w, h3, radiusOuter); @@ -160,6 +165,10 @@ function drawStepsDistance(w) { const stepDistance = settings.stepLength || 0.8; const stepsDistance = Math.round(steps * stepDistance); + // Draw rectangle background: + g.setColor(colorBg); + g.fillRect(w - radiusOuter - 3, h3 - radiusOuter - 3, w + radiusOuter + 3, h3 + radiusOuter + 3); + g.setColor(colorGrey); g.fillCircle(w, h3, radiusOuter); @@ -185,6 +194,11 @@ function drawStepsDistance(w) { function drawHeartRate(w) { if (!w) w = getCirclePosition("hr", w2); + + // Draw rectangle background: + g.setColor(colorBg); + g.fillRect(w - radiusOuter - 3, h3 - radiusOuter - 3, w + radiusOuter + 3, h3 + radiusOuter + 3); + g.setColor(colorGrey); g.fillCircle(w, h3, radiusOuter); @@ -210,6 +224,11 @@ function drawHeartRate(w) { function drawBattery(w) { if (!w) w = getCirclePosition("battery", w3); const battery = E.getBattery(); + + // Draw rectangle background: + g.setColor(colorBg); + g.fillRect(w - radiusOuter - 3, h3 - radiusOuter - 3, w + radiusOuter + 3, h3 + radiusOuter + 3); + g.setColor(colorGrey); g.fillCircle(w, h3, radiusOuter); @@ -319,6 +338,12 @@ Bangle.on('HRM', function(hrm) { }); +Bangle.setUI("clock"); +Bangle.loadWidgets(); + +draw(); +setInterval(draw, 60000); + Bangle.on('charging', function(charging) { if (isCircleEnabled("battery")) drawBattery(); }); @@ -326,9 +351,3 @@ Bangle.on('charging', function(charging) { if (isCircleEnabled("hr")) { enableHRMSensor(); } - -Bangle.setUI("clock"); -Bangle.loadWidgets(); - -draw(); -setInterval(draw, 60000); From 96802b0bd48e50ba721b157590d23e3fad8963dd Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 7 Jan 2022 10:32:39 +0100 Subject: [PATCH 086/122] Make min- & maxHR settings more granular --- apps/circlesclock/settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index 95ebc17db..a16bb99a8 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -15,7 +15,7 @@ value: "minHR" in settings ? settings.minHR : 40, min: 0, max : 250, - step: 10, + step: 5, format: x => { return x; }, @@ -25,7 +25,7 @@ value: "maxHR" in settings ? settings.maxHR : 200, min: 20, max : 250, - step: 10, + step: 5, format: x => { return x; }, From c47cabe156e3e03756492be8ed34b8bc31854d98 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 7 Jan 2022 10:43:06 +0100 Subject: [PATCH 087/122] Update ChangeLog --- apps/circlesclock/ChangeLog | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/circlesclock/ChangeLog b/apps/circlesclock/ChangeLog index f416929ac..4230c1468 100644 --- a/apps/circlesclock/ChangeLog +++ b/apps/circlesclock/ChangeLog @@ -1,4 +1,7 @@ 0.01: New clock 0.02: Fix icon & add battery warn functionality 0.03: Theming support & minor fixes -0.04: Make configurable what to show in each circle; add step distance circle; allow switching visibility of widgets +0.04: Make configurable what to show in each circle + Add step distance circle + Allow switching visibility of widgets + Make circles and text slightly bigger From b0238957b6be2c3ec4b41bcd214c1b25919ff39c Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Fri, 7 Jan 2022 12:56:53 +0100 Subject: [PATCH 088/122] fix update mmind.icon,js from 176px to 48px --- apps/mmind/mmind.icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/mmind/mmind.icon.js b/apps/mmind/mmind.icon.js index 976243b48..17c28ba0f 100644 --- a/apps/mmind/mmind.icon.js +++ b/apps/mmind/mmind.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("2GwxH+64A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A6gAAFEf5I/VtpEcEcZI/Dw4PbCQu0AApnZDIUeAAqLaDQUFAApIc3IAFEabHPa6StJWLKtJWLStJWLKtJWKieFChIPPCYquKWAZmUVxSwDV6quKWAYjUVxSwDVqQUIB56uTWCiuOWCquOWCiuOWByaFV5oPLVyiwSVyCwTVyCwSVyCwNTIqvMB5iv/V/6vQUpQPTVyqwQVySwRVySwQVySwNT6Kv/V/6v/V/6v/V/6v/V/6v/V/6v/V/6v/V/6v/V/6vvWCZBSV0CwUJCSuhV/6v/V/4PPWCBBRWCIjSWCJIUV0CvfWB6KTWB4jUWB5IWVz6viWBYdPEZCuMV6ywLJDCuMV+SxLRKyxMEbKxKJDitXCAQALB6AoTRS4jkJHyvoFRCJZEcxI8V9DyZEdpI/ZaQpTB4W0AApnZDIUFAAqLaDQXSAApIckYAFEaTLPbaatJWLKtJWLStJWLKtJWKaeKDAgPPEgyuKWAZmUVxSwDV6quKWAYjUVxSwDV7AZDB56uSWCiuOWCquOWCiuOWByWJBAoPPVyiwSVyCwTVyCwSVyCwNSpIKLB5qv/V/6vuVySwQVySwRVySwQVySwMV/6v/V/6uRV/6v/V8wNDV/6v/V9SuJV/6v/V8atEV/6v/V9KtLV/6v/V8SuNWCiKPWCYjQWCZISVzavSVopGLV/6v/V8RDPVz6wSEaSwRJCiuaV6KuSWCCKTWB4jUWB5IWVzKvKVAyuTCgauMMyqwLEaokDVxhIWVxgjNT46uKIiytcWJojZWJRIcVqygGAA4OOFhYUUJbIjYJH4bOV7AaIRLIjmJH4bMV7QA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A+goAHEbUeAA5s/ADO0ADitRWLStIWP6v/VxywWVxiw/V/quOWCiuOWH6v7VyCwSVyCw/V/6v/AH6vpVySwQVySw/V/6v/ABMAAAaXeEa6v/V+SKEWDwjYV/6v/V/6v/V/6v/V/6v/V/6v/V/6v/V+SMFVzgjZV/6vzAHaviWCZHQV36v/V/6v/V/awRJCSu/V/6vLWB5JUV36v/V5awNJSyu/V/6vLWJRMaVv6v/V5YA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AkA=")) +require("heatshrink").decompress(atob("mEwxH+64A/AEOBq2sBAusqwJHCaQFDAYlP2m0yGBCIkSj0eiWHBIkDgsFgYTE01v3O5t4mC1krgAEBq0ACYQuCAANsHIcxFwIwCEocsFwIwCBIYuCAANQF4QwBOgQABAgNIF4ZgELwQvCHIcCF4cEKwYvEt45DF4QwCL5YvFL5ITDF6OstheCvTjEjAuBjDJFX4UEq4TEyguBygTEF4dWBIeskkkqwQDDgUGgwaEBIUBgITHkslCYeBd4MrqwDBAgIuBcwRVGNIVs0oJEv3S6V+CYmIisjkcVZAYpBgDyBAAJFBFwTlGZIolDqouBGAQJDFwQABmRfCFAICCGwXXhgvDMAheCfI1UF4eoKwYvEiovHSoJfLF4pfJCYYvN1gwBAYMSLwVcbQmQFwOQZIq/C1GACYkcFwMcCYQoCLYNWF4KPBDgNWmIkEBIVPp5TDBIdWqoTHmUyCYlWRQTwCD4wA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AHmy2QJH6PRBI/Q6AkOCAIAFBINDjwABGInR3+53O/GIu72gABGJnQCAQAE69oFwQABCYfFFwIwCBIfCDIe7FIus1gvXLwQACLw4aCAAkAgAvcL4gvLq1WF5uyFwdoCYfLF4fLDpHCX6owBtFoxoUF6PF4ruFDwPC4XJFxbSCAAwVNAH4ARA")) From 2fe1ea524d2d6c0882edcd04ed96c39772aa30df Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Fri, 7 Jan 2022 13:15:54 +0100 Subject: [PATCH 089/122] correct some typo's --- apps/mmind/README.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/apps/mmind/README.md b/apps/mmind/README.md index ea584b7e7..8060b95f6 100644 --- a/apps/mmind/README.md +++ b/apps/mmind/README.md @@ -7,15 +7,14 @@ Play the classic mind game mastermind on your Bangle 2. ## Game The game will start when run. -Four colors pins are randomly choosen and kept secret. -You need to find the secret by scoring your choise within 6 turns. +Four colors pins are randomly chosen and kept secret. +You need to find the secret by scoring your choice within 6 turns. The game makes use of touch features. ## Play -The screen needs to be unlocked. Select one of the dots, the color menu will show, select a colour for the pin. -If all pins are choosen with a color the red button will turn green. +If all pins are chosen with a color the red button will turn green. Hit the green button and your play will be scored and listed from the top. The first digit shows the number of pins with the correct color and in the right place. The second digit gives the number of pins with the correct color but in the wrong place. @@ -24,12 +23,9 @@ The blue button will start a new game. ## Requests - -This is the first version, things to add are:/ -Add a menu to change game options like the number of colors, allow double colors, 5 pins per row./ -Add feature to drag screen up and down to see more scores./ -Timer and high score./ +This is the first version, things to add are: +Add a menu to change game options like the number of colors, allow double colors, 5 pins per row. Add feature to drag screen up and down to see more scores. Timer and high score. +Any other fearures or remarks, let me know @psbest. ## Creator - This game is created by Peter Slendebroek. From 2397f5957acc41e9eb91c4da6e65d50901debcca Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 7 Jan 2022 13:30:09 +0100 Subject: [PATCH 090/122] Add weather functionality Improve circle position finding --- apps/circlesclock/ChangeLog | 2 +- apps/circlesclock/README.md | 4 +- apps/circlesclock/app.js | 138 +++++++++++++++++++++++++++++----- apps/circlesclock/settings.js | 10 +-- 4 files changed, 126 insertions(+), 28 deletions(-) diff --git a/apps/circlesclock/ChangeLog b/apps/circlesclock/ChangeLog index 4230c1468..ca1da6e21 100644 --- a/apps/circlesclock/ChangeLog +++ b/apps/circlesclock/ChangeLog @@ -2,6 +2,6 @@ 0.02: Fix icon & add battery warn functionality 0.03: Theming support & minor fixes 0.04: Make configurable what to show in each circle - Add step distance circle + Add step distance and weather Allow switching visibility of widgets Make circles and text slightly bigger diff --git a/apps/circlesclock/README.md b/apps/circlesclock/README.md index 9004161d6..a071efcf5 100644 --- a/apps/circlesclock/README.md +++ b/apps/circlesclock/README.md @@ -9,14 +9,12 @@ It can show the following information (this can be configured): * Steps distance (depending on steps) * Heart rate (automatically updates when screen is on and unlocked) * Battery (including charging status and battery low warning) + * Weather (requires [weather app](https://banglejs.com/apps/#weather)) ## Screenshots ![Screenshot dark theme](screenshot-dark.png) ![Screenshot light theme](screenshot-light.png) -## TODO -* Show weather information - ## Creator Marco ([myxor](https://github.com/myxor)) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 4f2fea4ab..23be307b9 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -1,5 +1,6 @@ const locale = require("locale"); const heatshrink = require("heatshrink"); +const storage = require("Storage"); const shoesIcon = heatshrink.decompress(atob("h0OwYJGgmAAgUBkgECgVJB4cSoAUDyEBkARDpADBhMAyQRBgVAkgmDhIUDAAuQAgY1DAAYA=")); const shoesIconGreen = heatshrink.decompress(atob("h0OwYJGhIEDgVIAgUEyQKDkmACgcggVACIeQAYMSgIRCgmApIbDiQUDAAkBkAFDGoYAD")); @@ -8,10 +9,19 @@ const powerIcon = heatshrink.decompress(atob("h0OwYQNsAED7AEDmwEDtu2AgUbtuABwXbB const powerIconGreen = heatshrink.decompress(atob("h0OwYQNkAEDpAEDiQEDkmSAgUJkmABwVJBIUEyVAAoYOCgEBFIgODABI")); const powerIconRed = heatshrink.decompress(atob("h0OwYQNoAEDyAEDkgEDpIFDiVJBweSAgUJkmAAoYZDgQpEBwYAJA")); +const weatherCloudy = heatshrink.decompress(atob("h0OwYPMgfwAgU//4FCv///+Ag4DB//gh4EC//jAgYAK+IED8EBAgXAHpQA==")); +const weatherSunny = heatshrink.decompress(atob("h0OwYKHhuAAYM2AQkA7AOD2wFCgdt20AgOA7dtwHAC4PbsAUGgFt2ApIAAgIIA==")); +const weatherPartlyCloudy = heatshrink.decompress(atob("h0OwYOLg4FEn/8AgV+g/gAgMcgE48EB48f/wJBgP/gfwgEDBAIRBC4UH/kB4AmC8F+C4X4gf/AAIaBAAgA==")); +const weatherRainy = heatshrink.decompress(atob("h0OwYKHh/AAgX8AoUB/EAuEAj/wgEDwEHCIX/wIXD8ARB/kAnED+P/8f+BgNwnARCjkOAgUH/+AAoU/IQ4A=")); +const weatherPartlyRainy = heatshrink.decompress(atob("h0OwYJGjkAnAFCj+AAgU//4FCuEA8EAg8ch/4gEB4////AAoIIBCIMD/wgCg4bBg/8BwMD+AgBh4ZBDQf/FIIABh4IBgAA==")); +const weatherSnowy = heatshrink.decompress(atob("h0OwYKHh/AAgUD+AKD/gIDn4LC/4ABBYX8DQYODgYPCAoIOCEAgpGDQRCHA=")); +const weatherFoggy = heatshrink.decompress(atob("h0OwYPMj/+AgU4gFwgED+ACBwEH8AMB/kB4AEBBAYAHg////H/+ABQl+n4LB/A9K")); +const weatherStormy = heatshrink.decompress(atob("h0OwYKHh/AAgX8AoUB/EAuEAj/wgEDwEHCIX/wIRBBwPgAQMcgE4gfwn8D/wpGCgQAQA")); + let settings; function loadSettings() { - settings = require("Storage").readJSON("circlesclock.json", 1) || { + settings = storage.readJSON("circlesclock.json", 1) || { 'minHR': 40, 'maxHR': 200, 'stepGoal': 10000, @@ -48,13 +58,12 @@ const w = g.getWidth(); const hOffset = 30 - widgetOffset; const h1 = Math.round(1 * h / 5 - hOffset); const h2 = Math.round(3 * h / 5 - hOffset); -const h3 = Math.round(8 * h / 8 - hOffset - 3); -const w1 = Math.round(w / 6); -const w2 = Math.round(3 * w / 6); -const w3 = Math.round(5 * w / 6); +const h3 = Math.round(8 * h / 8 - hOffset - 3); // circle y position +const circlePosX = [Math.round(w / 6), Math.round(3 * w / 6), Math.round(5 * w / 6)]; // cirle x positions const radiusOuter = 25; const radiusInner = 18; const circleFont = "Vector:15"; +const circleFontSmall = "Vector:13"; function draw() { g.clear(true); @@ -90,16 +99,17 @@ function draw() { g.drawString(locale.date(new Date()), w > 180 ? 2 * w / 10 : w / 10, h2); g.drawString(locale.dow(new Date()), w > 180 ? 2 * w / 10 : w / 10, h2 + 22); - drawCircle(1, "steps"); - drawCircle(2, "hr"); - drawCircle(3, "battery"); + drawCircle(1); + drawCircle(2); + drawCircle(3); } +const defaultCircleTypes = ["steps", "hr", "battery"]; -function drawCircle(index, defaultType) { - const type = settings['circle' + index] || defaultType; - const w = index == 1 ? w1 : index == 2 ? w2 : w3; - +function drawCircle(index) { + let type = settings['circle' + index]; + if (!type) type = defaultCircleTypes[index - 1]; + const w = getCirclePosition(type); switch (type) { case "steps": drawSteps(w); @@ -113,15 +123,21 @@ function drawCircle(index, defaultType) { case "battery": drawBattery(w); break; + case "weather": + drawWeather(w); + break; } } -function getCirclePosition(type, defaultPos) { +function getCirclePosition(type) { for (let i = 1; i <= 3; i++) { const setting = settings['circle' + i]; - if (setting == type) return i == 1 ? w1 : i == 2 ? w2 : w3; + if (setting == type) return circlePosX[i - 1]; } - return defaultPos || undefined; + for (let i = 0; i < defaultCircleTypes.length; i++) { + if (type == defaultCircleTypes[i]) return circlePosX[i]; + } + return undefined; } function isCircleEnabled(type) { @@ -129,7 +145,7 @@ function isCircleEnabled(type) { } function drawSteps(w) { - if (!w) w = getCirclePosition("steps", w1); + if (!w) w = getCirclePosition("steps"); const steps = getSteps(); // Draw rectangle background: @@ -160,7 +176,7 @@ function drawSteps(w) { } function drawStepsDistance(w) { - if (!w) w = getCirclePosition("steps", w1); + if (!w) w = getCirclePosition("steps"); const steps = getSteps(); const stepDistance = settings.stepLength || 0.8; const stepsDistance = Math.round(steps * stepDistance); @@ -193,7 +209,7 @@ function drawStepsDistance(w) { } function drawHeartRate(w) { - if (!w) w = getCirclePosition("hr", w2); + if (!w) w = getCirclePosition("hr"); // Draw rectangle background: g.setColor(colorBg); @@ -222,7 +238,7 @@ function drawHeartRate(w) { } function drawBattery(w) { - if (!w) w = getCirclePosition("battery", w3); + if (!w) w = getCirclePosition("battery"); const battery = E.getBattery(); // Draw rectangle background: @@ -262,6 +278,85 @@ function drawBattery(w) { g.drawImage(icon, w - 6, h3 + radiusOuter - 6); } +function drawWeather(w) { + if (!w) w = getCirclePosition("weather"); + const weather = getWeather(); + const tempString = weather ? locale.temp(weather.temp - 273.15) : undefined; + const code = weather ? weather.code : -1; + + // Draw rectangle background: + g.setColor(colorBg); + g.fillRect(w - radiusOuter - 3, h3 - radiusOuter - 3, w + radiusOuter + 3, h3 + radiusOuter + 3); + + g.setColor(colorGrey); + g.fillCircle(w, h3, radiusOuter); + + g.setColor(colorBg); + g.fillCircle(w, h3, radiusInner); + + g.fillPoly([w, h3, w - 15, h3 + radiusOuter + 5, w + 15, h3 + radiusOuter + 5]); + + const content = tempString ? tempString : "?"; + g.setFont(content.length < 4 ? circleFont : circleFontSmall); + g.setFontAlign(0, 0); + g.setColor(colorFg); + g.drawString(content, w, h3); + + if (code > 0) { + const icon = getWeatherIconByCode(code); + if (icon) g.drawImage(icon, w - 6, h3 + radiusOuter - 6); + } +} + +/* + * Choose weather icon to display based on weather conditition code + * https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 + */ +function getWeatherIconByCode(code) { + const codeGroup = Math.round(code / 100); + switch (codeGroup) { + case 2: + return weatherStormy; + case 3: + return weatherCloudy; + case 5: + switch (code) { + case 511: + return weatherSnowy; + case 520: + return weatherPartlyRainy; + case 521: + return weatherPartlyRainy; + case 522: + return weatherPartlyRainy; + case 531: + return weatherPartlyRainy; + default: + return weatherRainy; + } + break; + case 6: + return weatherSnowy; + case 7: + return weatherFoggy; + case 8: + switch (code) { + case 800: + return weatherSunny; + case 801: + return weatherPartlyCloudy; + case 802: + return weatherPartlyCloudy; + default: + return weatherCloudy; + } + break; + default: + return undefined; + } + return undefined; +} + function radians(a) { return a * Math.PI / 180; } @@ -309,6 +404,11 @@ function getSteps() { return 0; } +function getWeather() { + const jsonWeather = storage.readJSON('weather.json'); + return jsonWeather && jsonWeather.weather ? jsonWeather.weather : undefined; +} + function enableHRMSensor() { Bangle.setHRMPower(1, "circleclock"); if (hrtValue == undefined) { diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index a16bb99a8..ac4215a8a 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -6,8 +6,8 @@ settings[key] = value; storage.write(SETTINGS_FILE, settings); } - var valuesCircleTypes = ["steps", "stepsDist", "hr", "battery"]; - var namesCircleTypes = ["steps", "distance", "heart", "battery"]; + var valuesCircleTypes = ["steps", "stepsDist", "hr", "battery", "weather"]; + var namesCircleTypes = ["steps", "distance", "heart", "battery", "weather"]; E.showMenu({ '': { 'title': 'circlesclock' }, '< Back': back, @@ -78,19 +78,19 @@ }, 'left': { value: settings.circle1 ? valuesCircleTypes.indexOf(settings.circle1) : 0, - min: 0, max: 3, + min: 0, max: 4, format: v => namesCircleTypes[v], onchange: x => save('circle1', valuesCircleTypes[x]), }, 'middle': { value: settings.circle2 ? valuesCircleTypes.indexOf(settings.circle2) : 2, - min: 0, max: 3, + min: 0, max: 4, format: v => namesCircleTypes[v], onchange: x => save('circle2', valuesCircleTypes[x]), }, 'right': { value: settings.circle3 ? valuesCircleTypes.indexOf(settings.circle3) : 3, - min: 0, max: 3, + min: 0, max: 4, format: v => namesCircleTypes[v], onchange: x => save('circle3', valuesCircleTypes[x]), } From 209d05e6d68c5748f80b98298aaba1cacc68292a Mon Sep 17 00:00:00 2001 From: Qucchia <45072410+qucchia@users.noreply.github.com> Date: Fri, 7 Jan 2022 16:24:36 +0100 Subject: [PATCH 091/122] Fix alarm not activating --- apps/qalarm/qalarm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/qalarm/qalarm.js b/apps/qalarm/qalarm.js index 6b31ba645..8e82be186 100644 --- a/apps/qalarm/qalarm.js +++ b/apps/qalarm/qalarm.js @@ -143,7 +143,7 @@ let alarms = require("Storage").readJSON("qalarm.json", 1) || []; let active = alarms.filter( (alarm) => alarm.on && - alarm.t < t && + alarm.t <= t && alarm.last != time.getDate() && (alarm.timer || alarm.daysOfWeek[time.getDay()]) ); From 426ba76ad4012f14072d1694d36510977346665d Mon Sep 17 00:00:00 2001 From: Qucchia <45072410+qucchia@users.noreply.github.com> Date: Fri, 7 Jan 2022 16:25:15 +0100 Subject: [PATCH 092/122] Update ChangeLog --- apps/qalarm/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/qalarm/ChangeLog b/apps/qalarm/ChangeLog index fb6c751bb..b9be6039d 100644 --- a/apps/qalarm/ChangeLog +++ b/apps/qalarm/ChangeLog @@ -3,3 +3,4 @@ 0.03: Fix unfreed memory, and clearInterval that disabled all clocks at midnight Fix app icon Change menu order so 'back' is at the top +0.04: Fix alarm not activating sometimes. From ab00b477fd39f0304c12cdf407fcbd2d9fa42c16 Mon Sep 17 00:00:00 2001 From: Qucchia <45072410+qucchia@users.noreply.github.com> Date: Fri, 7 Jan 2022 16:25:55 +0100 Subject: [PATCH 093/122] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 3fc0616da..e0c85c2f3 100644 --- a/apps.json +++ b/apps.json @@ -4422,7 +4422,7 @@ "name": "Q Alarm and Timer", "shortName": "Q Alarm", "icon": "app.png", - "version": "0.03", + "version": "0.04", "description": "Alarm and timer app with days of week and 'hard' option.", "tags": "tool,alarm,widget", "supports": ["BANGLEJS", "BANGLEJS2"], From ea71f6a0ead902813e91d065363bcf6b288b7b70 Mon Sep 17 00:00:00 2001 From: Didgeridoohan Date: Fri, 7 Jan 2022 16:39:45 +0100 Subject: [PATCH 094/122] Swedish localisation with English text (en_SE) --- apps/locale/locales.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index cf511c54f..fea217efe 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -283,6 +283,24 @@ var locales = { day: "söndag,måndag,tisdag,onsdag,torsdag,fredag,lördag", trans: { yes: "ja", Yes: "Ja", no: "nej", No: "Nej", ok: "ok", on: "on", off: "off" } }, + "en_SE": { // Swedish localisation with English text + lang: "en_SE", + decimal_point: ",", + thousands_sep: ".", + currency_symbol: "kr", + int_curr_symbol: "SKR", + speed: 'kmh', + distance: { "0": "m", "1": "km" }, + temperature: '°C', + ampm: { 0: "", 1: "" }, + timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" }, + datePattern: { 0: "%A %B %d %Y", "1": "%Y-%m-%d" }, // Sunday 1 March 2020 // 2020-03-01 + abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", + month: "January,February,March,April,May,June,July,August,September,October,November,December", + abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat", + day: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday", + // No translation for english... + }, "en_NZ": { lang: "en_NZ", decimal_point: ".", From efc8845c13434357cb7b1afd0d3d1058e572ebce Mon Sep 17 00:00:00 2001 From: Didgeridoohan Date: Fri, 7 Jan 2022 16:42:29 +0100 Subject: [PATCH 095/122] Update ChangeLog --- apps/locale/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/locale/ChangeLog b/apps/locale/ChangeLog index 448f8119a..1b6f82671 100644 --- a/apps/locale/ChangeLog +++ b/apps/locale/ChangeLog @@ -14,3 +14,4 @@ 0.12: Fixed nl_NL formatting, because the full months won't fit on the Bangle.js2's screen 0.13: Now use shorter de_DE date format to more closely match other languages for size 0.14: Added some first translations for Messages in nl_NL +0.15: Added Swedish localisation with English text From 0a4f2dd5b928528d97194bdcee601c380b881b87 Mon Sep 17 00:00:00 2001 From: Didgeridoohan Date: Fri, 7 Jan 2022 16:43:12 +0100 Subject: [PATCH 096/122] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 3fc0616da..f5a17c37d 100644 --- a/apps.json +++ b/apps.json @@ -218,7 +218,7 @@ { "id": "locale", "name": "Languages", - "version": "0.14", + "version": "0.15", "description": "Translations for different countries", "icon": "locale.png", "type": "locale", From 9e0bef98ae313ccabc7117545f56d302953f7ec9 Mon Sep 17 00:00:00 2001 From: 7kasper <7kasper@users.noreply.github.com> Date: Fri, 7 Jan 2022 16:44:54 +0100 Subject: [PATCH 097/122] Add combination HID to bootupdate. --- apps/boot/bootupdate.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/boot/bootupdate.js b/apps/boot/bootupdate.js index 664d64ee7..1b826de5a 100644 --- a/apps/boot/bootupdate.js +++ b/apps/boot/bootupdate.js @@ -18,6 +18,7 @@ boot += `var bleServices = {}, bleServiceOptions = { uart : true};\n`; if (s.ble!==false) { if (s.HID) { // Human interface device if (s.HID=="joy") boot += `Bangle.HID = E.toUint8Array(atob("BQEJBKEBCQGhAAUJGQEpBRUAJQGVBXUBgQKVA3UBgQMFAQkwCTEVgSV/dQiVAoECwMA="));`; + else if (s.HID=="com") boot += `Bangle.HID = E.toUint8Array(atob("BQEJAqEBhQEJAaEABQkZASkFFQAlAZUFdQGBApUBdQOBAwUBCTAJMQk4FYElf3UIlQOBBgUMCjgCFYElf3UIlQGBBsDABQEJBqEBhQIFBxngKecVACUBdQGVCIECdQiVAYEBGQApcxUAJXOVBXUIgQDA"));` else if (s.HID=="kb") boot += `Bangle.HID = E.toUint8Array(atob("BQEJBqEBBQcZ4CnnFQAlAXUBlQiBApUBdQiBAZUFdQEFCBkBKQWRApUBdQORAZUGdQgVACVzBQcZAClzgQAJBRUAJv8AdQiVArECwA=="));` else /*kbmedia*/boot += `Bangle.HID = E.toUint8Array(atob("BQEJBqEBhQIFBxngKecVACUBdQGVCIEClQF1CIEBlQV1AQUIGQEpBZEClQF1A5EBlQZ1CBUAJXMFBxkAKXOBAAkFFQAm/wB1CJUCsQLABQwJAaEBhQEVACUBdQGVAQm1gQIJtoECCbeBAgm4gQIJzYECCeKBAgnpgQIJ6oECwA=="));`; boot += `bleServiceOptions.hid=Bangle.HID;\n`; From 47da82a547e82e29228c3d0a86c2992e71fafb90 Mon Sep 17 00:00:00 2001 From: 7kasper <7kasper@users.noreply.github.com> Date: Fri, 7 Jan 2022 16:48:15 +0100 Subject: [PATCH 098/122] Add HID option to settings. --- apps/setting/settings.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 4bdf7f304..27ce24e50 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -154,8 +154,8 @@ function showAlertsMenu() { function showBLEMenu() { - var hidV = [false, "kbmedia", "kb", "joy"]; - var hidN = ["Off", "Kbrd & Media", "Kbrd","Joystick"]; + var hidV = [false, "kbmedia", "kb", "com", "joy"]; + var hidN = ["Off", "Kbrd & Media", "Kbrd", "Kbrd & Mouse" ,"Joystick"]; E.showMenu({ '': { 'title': 'Bluetooth' }, '< Back': ()=>showMainMenu(), From 83debe93ee54ef1d01f78e572dc2c1a2d7dee66e Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 7 Jan 2022 18:21:36 +0100 Subject: [PATCH 099/122] Bigger weather icons & a bit thinner circles --- apps/circlesclock/app.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 23be307b9..f93a283f2 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -9,14 +9,14 @@ const powerIcon = heatshrink.decompress(atob("h0OwYQNsAED7AEDmwEDtu2AgUbtuABwXbB const powerIconGreen = heatshrink.decompress(atob("h0OwYQNkAEDpAEDiQEDkmSAgUJkmABwVJBIUEyVAAoYOCgEBFIgODABI")); const powerIconRed = heatshrink.decompress(atob("h0OwYQNoAEDyAEDkgEDpIFDiVJBweSAgUJkmAAoYZDgQpEBwYAJA")); -const weatherCloudy = heatshrink.decompress(atob("h0OwYPMgfwAgU//4FCv///+Ag4DB//gh4EC//jAgYAK+IED8EBAgXAHpQA==")); -const weatherSunny = heatshrink.decompress(atob("h0OwYKHhuAAYM2AQkA7AOD2wFCgdt20AgOA7dtwHAC4PbsAUGgFt2ApIAAgIIA==")); -const weatherPartlyCloudy = heatshrink.decompress(atob("h0OwYOLg4FEn/8AgV+g/gAgMcgE48EB48f/wJBgP/gfwgEDBAIRBC4UH/kB4AmC8F+C4X4gf/AAIaBAAgA==")); -const weatherRainy = heatshrink.decompress(atob("h0OwYKHh/AAgX8AoUB/EAuEAj/wgEDwEHCIX/wIXD8ARB/kAnED+P/8f+BgNwnARCjkOAgUH/+AAoU/IQ4A=")); +const weatherCloudy = heatshrink.decompress(atob("iEQwYWTgP//+AAoMPAoPwAoN/AocfAgP//0AAgQAB/AFEABgdDAAMDDohMRA")); +const weatherSunny = heatshrink.decompress(atob("iEQwYLIg3AAgVgAQMMAo8Am3YAgUB23bAoUNAoIUBjYFCsOwBYoFDDpFgHYI1JI4gFGAAYA=")); +const weatherPartlyCloudy = heatshrink.decompress(atob("iEQwYQNv0AjgGDn4EDh///gFChwREC4MfxwIBv0//+AC4X4j4FCv/AgfwgED/wIBuAaBBwgFDgP4gf/AAXABwIEBDQQAEA==")); +const weatherRainy = heatshrink.decompress(atob("iEQwYLIg/gAgUB///wAFBh/AgfwgED/wIBuEAj4OCv0AjgaCh/4AocAnAFBFIU4EAM//gRBEAIOBhw1C/AmDAosAC4JNIAAg")); const weatherPartlyRainy = heatshrink.decompress(atob("h0OwYJGjkAnAFCj+AAgU//4FCuEA8EAg8ch/4gEB4////AAoIIBCIMD/wgCg4bBg/8BwMD+AgBh4ZBDQf/FIIABh4IBgAA==")); -const weatherSnowy = heatshrink.decompress(atob("h0OwYKHh/AAgUD+AKD/gIDn4LC/4ABBYX8DQYODgYPCAoIOCEAgpGDQRCHA=")); -const weatherFoggy = heatshrink.decompress(atob("h0OwYPMj/+AgU4gFwgED+ACBwEH8AMB/kB4AEBBAYAHg////H/+ABQl+n4LB/A9K")); -const weatherStormy = heatshrink.decompress(atob("h0OwYKHh/AAgX8AoUB/EAuEAj/wgEDwEHCIX/wIRBBwPgAQMcgE4gfwn8D/wpGCgQAQA")); +const weatherSnowy = heatshrink.decompress(atob("iEQwYROn/8AocH8AECuAFBh0Agf+CIN/4EDx/4j/x4EAgIIBwAXBAogRFDoopFGoxBGABIA=")); +const weatherFoggy = heatshrink.decompress(atob("iEQwYROn/8AgUB/EfwAFBh/AgfwgED/wIBuEABwd/4EcDQgFDgE4Fosf///8f//A/Lj/xCQIRNA=")); +const weatherStormy = heatshrink.decompress(atob("iEQwYLIg/gAgUB///wAFBh/AgfwgED/wIBuEAj4OCv0AjgaCh/4AoX8gE4AoQpBnAdBF4IRBDQMH/kOHgY7DAo4AOA==")); let settings; @@ -61,7 +61,7 @@ const h2 = Math.round(3 * h / 5 - hOffset); const h3 = Math.round(8 * h / 8 - hOffset - 3); // circle y position const circlePosX = [Math.round(w / 6), Math.round(3 * w / 6), Math.round(5 * w / 6)]; // cirle x positions const radiusOuter = 25; -const radiusInner = 18; +const radiusInner = 20; const circleFont = "Vector:15"; const circleFontSmall = "Vector:13"; @@ -292,9 +292,9 @@ function drawWeather(w) { g.fillCircle(w, h3, radiusOuter); g.setColor(colorBg); - g.fillCircle(w, h3, radiusInner); + g.fillCircle(w, h3, radiusInner + 1); // the weather circle is thinner - g.fillPoly([w, h3, w - 15, h3 + radiusOuter + 5, w + 15, h3 + radiusOuter + 5]); + g.fillPoly([w, h3, w - 25, h3 + radiusOuter + 5, w + 25, h3 + radiusOuter + 5]); const content = tempString ? tempString : "?"; g.setFont(content.length < 4 ? circleFont : circleFontSmall); @@ -304,7 +304,7 @@ function drawWeather(w) { if (code > 0) { const icon = getWeatherIconByCode(code); - if (icon) g.drawImage(icon, w - 6, h3 + radiusOuter - 6); + if (icon) g.drawImage(icon, w - 6, h3 + radiusOuter - 10); } } @@ -375,7 +375,7 @@ function drawGauge(cx, cy, percent, color) { g.setColor(color); - const size = radiusOuter - radiusInner - 2; + const size = radiusOuter - radiusInner - 3; // draw gauge for (i = startrot; i > endrot - size; i -= size) { x = cx + r * Math.sin(radians(i)); From 8bbe2a43b40a2a2f6bc48b17f934ac2c413a3a86 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 7 Jan 2022 18:33:09 +0100 Subject: [PATCH 100/122] Same size for every circle --- apps/circlesclock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index f93a283f2..6d408fd59 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -292,7 +292,7 @@ function drawWeather(w) { g.fillCircle(w, h3, radiusOuter); g.setColor(colorBg); - g.fillCircle(w, h3, radiusInner + 1); // the weather circle is thinner + g.fillCircle(w, h3, radiusInner); g.fillPoly([w, h3, w - 25, h3 + radiusOuter + 5, w + 25, h3 + radiusOuter + 5]); From 6a72aafc1919f4440051a20424c13dd12953e635 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Fri, 7 Jan 2022 20:18:17 +0100 Subject: [PATCH 101/122] layout: use 'col' for btn label/image --- modules/Layout.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/Layout.js b/modules/Layout.js index 65e9a8dc8..cb64183ea 100644 --- a/modules/Layout.js +++ b/modules/Layout.js @@ -34,7 +34,7 @@ layoutObject has: optional `scale` specifies if image should be scaled up or not * `"custom"` - a custom block where `render(layoutObj)` is called to render * `"h"` - Horizontal layout, `c` is an array of more `layoutObject` - * `"v"` - Veritical layout, `c` is an array of more `layoutObject` + * `"v"` - Vertical layout, `c` is an array of more `layoutObject` * A `id` field. If specified the object is added with this name to the returned `layout` object, so can be referenced as `layout.foo` * A `font` field, eg `6x8` or `30%` to use a percentage of screen height @@ -261,6 +261,7 @@ Layout.prototype.render = function (l) { x,y+4 ], bg = l.selected?g.theme.bgH:g.theme.bg2; g.setColor(bg).fillPoly(poly).setColor(l.selected ? g.theme.fgH : g.theme.fg2).drawPoly(poly); + if (l.col) g.setColor(l.col); if (l.src) g.setBgColor(bg).drawImage("function"==typeof l.src?l.src():l.src, l.x + 10 + (0|l.pad), l.y + 8 + (0|l.pad)); else g.setFont("6x8",2).setFontAlign(0,0,l.r).drawString(l.label,l.x+l.w/2,l.y+l.h/2); }, "img":function(l){ From a3d1494318039c39d464204cc654e76cf321dc53 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Fri, 7 Jan 2022 20:34:23 +0100 Subject: [PATCH 102/122] update tags mmind , remove spaces. --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 663cb1ae3..5dd4331f9 100644 --- a/apps.json +++ b/apps.json @@ -5134,7 +5134,7 @@ "version":"0.01", "description": "This is the classic game for masterminds", "type": "game", - "tags": "mastermind, game, classic", + "tags": "game,app", "readme":"README.md", "supports": ["BANGLEJS2"], "allow_emulator": true, From 0ee13c2fffc9902cb9d9351004491fe7da7ee768 Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Fri, 7 Jan 2022 21:05:46 +0100 Subject: [PATCH 103/122] added screenshot to mmind app --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 5dd4331f9..3321f822f 100644 --- a/apps.json +++ b/apps.json @@ -5133,6 +5133,7 @@ "icon": "mmind.png", "version":"0.01", "description": "This is the classic game for masterminds", + "screenshots": [{"url":"screenshot_mmind.png"}], "type": "game", "tags": "game,app", "readme":"README.md", From c8ea4c55b3e743ceee9350a091fcd80d63023826 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 7 Jan 2022 22:43:49 +0000 Subject: [PATCH 104/122] Limelight, switched to bolted hands, redid screenshots --- apps/limelight/README.md | 1 + apps/limelight/limelight.app.js | 98 +++++++++++++++++------- apps/limelight/screenshot_gochihand.png | Bin 2332 -> 2452 bytes apps/limelight/screenshot_grenadier.png | Bin 2376 -> 2646 bytes apps/limelight/screenshot_limelight.png | Bin 2425 -> 2573 bytes apps/limelight/screenshot_monoton.png | Bin 3032 -> 2993 bytes 6 files changed, 71 insertions(+), 28 deletions(-) diff --git a/apps/limelight/README.md b/apps/limelight/README.md index f1cc52092..e84714403 100644 --- a/apps/limelight/README.md +++ b/apps/limelight/README.md @@ -6,6 +6,7 @@ * Selection of different fonts * Settings menu where you can select font, or switch to Vector font and try a range of sizes * 100 less lines of code, demonstrating that there is no need for a custom widget draw method +* Full screen options (widgets loaded but not displayed) ![](screenshot_gochihand.png) ![](screenshot_monoton.png) diff --git a/apps/limelight/limelight.app.js b/apps/limelight/limelight.app.js index 2d4ce5a43..20d79deeb 100644 --- a/apps/limelight/limelight.app.js +++ b/apps/limelight/limelight.app.js @@ -1,3 +1,14 @@ +/* + * Limelight analoguce clock with bolted hands + * Based on the work of @Andreas_Rozek + * [Simple_Clock](https://github.com/espruino/BangleApps/tree/master/apps/simple_clock) + * + * . Demonstrates simpler approach to establishing the available size of the appRect in relation + * to widgets, avoids having to take on the responsibility for managing the widget draw. + * . Demonstrates a settings menu and various configuration options + * . Demonstrates fullscreen verses, widgets and app area. + * + */ g.clear(); @@ -78,7 +89,7 @@ if (settings.fullscreen) { } function debug(o) { - console.log(o); + //console.log(o); } debug("limelight.app.js"); @@ -88,35 +99,54 @@ debug("outerRadius=" + outerRadius); debug("y12=" + (CenterY - outerRadius)); debug("y6=" + (CenterY + outerRadius)); -const HourHandLength = outerRadius * 0.5; -const HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; -const MinuteHandLength = outerRadius * 0.7; -const MinuteHandWidth = 2*2, halfMinuteHandWidth = MinuteHandWidth/2; -const SecondHandLength = outerRadius * 0.9; -const SecondHandOffset = 6; +let HourHandLength = outerRadius * 0.5; +let HourHandWidth = 2*5, halfHourHandWidth = HourHandWidth/2; -const twoPi = 2*Math.PI; -const Pi = Math.PI; -const halfPi = Math.PI/2; +let MinuteHandLength = outerRadius * 0.7; +let MinuteHandWidth = 2*3, halfMinuteHandWidth = MinuteHandWidth/2; -let HourHandPolygon = [ - -halfHourHandWidth,halfHourHandWidth, - -halfHourHandWidth,halfHourHandWidth-HourHandLength, - halfHourHandWidth,halfHourHandWidth-HourHandLength, - halfHourHandWidth,halfHourHandWidth, +let SecondHandLength = outerRadius * 0.9; +let SecondHandOffset = halfHourHandWidth + 10; + +let outerBoltRadius = halfHourHandWidth + 2, innerBoltRadius = outerBoltRadius - 4; +let HandOffset = outerBoltRadius + 4; + +let twoPi = 2*Math.PI, deg2rad = Math.PI/180; +let Pi = Math.PI; +let halfPi = Math.PI/2; + +let sin = Math.sin, cos = Math.cos; + +let sine = [0, sin(30*deg2rad), sin(60*deg2rad), 1]; + +let HandPolygon = [ + -sine[3],-sine[0], -sine[2],-sine[1], -sine[1],-sine[2], -sine[0],-sine[3], + sine[0],-sine[3], sine[1],-sine[2], sine[2],-sine[1], sine[3],-sine[0], + sine[3], sine[0], sine[2], sine[1], sine[1], sine[2], sine[0], sine[3], + -sine[0], sine[3], -sine[1], sine[2], -sine[2], sine[1], -sine[3], sine[0], ]; -let MinuteHandPolygon = [ - -halfMinuteHandWidth,halfMinuteHandWidth, - -halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, - halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, - halfMinuteHandWidth,halfMinuteHandWidth, -]; +let HourHandPolygon = new Array(HandPolygon.length); +for (let i = 0, l = HandPolygon.length; i < l; i+=2) { + HourHandPolygon[i] = halfHourHandWidth*HandPolygon[i]; + HourHandPolygon[i+1] = halfHourHandWidth*HandPolygon[i+1]; + if (i < l/2) { HourHandPolygon[i+1] -= HourHandLength; } + if (i > l/2) { HourHandPolygon[i+1] += HandOffset; } +} +let MinuteHandPolygon = new Array(HandPolygon.length); +for (let i = 0, l = HandPolygon.length; i < l; i+=2) { + MinuteHandPolygon[i] = halfMinuteHandWidth*HandPolygon[i]; + MinuteHandPolygon[i+1] = halfMinuteHandWidth*HandPolygon[i+1]; + if (i < l/2) { MinuteHandPolygon[i+1] -= MinuteHandLength; } + if (i > l/2) { MinuteHandPolygon[i+1] += HandOffset; } +} -let transformedPolygon = new Array(HourHandPolygon.length); +/**** transforme polygon ****/ + +let transformedPolygon = new Array(HandPolygon.length); function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { - let sPhi = Math.sin(Phi), cPhi = Math.cos(Phi), x,y; + let sPhi = sin(Phi), cPhi = cos(Phi), x,y; for (let i = 0, l = originalPolygon.length; i < l; i+=2) { x = originalPolygon[i]; @@ -127,8 +157,11 @@ function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { } } -function drawHands () { +/**** draw clock hands ****/ + +function drawClockHands () { let now = new Date(); + let Hours = now.getHours() % 12; let Minutes = now.getMinutes(); let Seconds = now.getSeconds(); @@ -138,14 +171,17 @@ function drawHands () { let SecondsAngle = (Seconds/60) * twoPi - Pi; g.setColor(g.theme.fg); + transformPolygon(HourHandPolygon, CenterX,CenterY, HoursAngle); g.fillPoly(transformedPolygon); + transformPolygon(MinuteHandPolygon, CenterX,CenterY, MinutesAngle); g.fillPoly(transformedPolygon); + let sPhi = Math.sin(SecondsAngle), cPhi = Math.cos(SecondsAngle); + if (settings.secondhand) { - let sPhi = Math.sin(SecondsAngle), cPhi = Math.cos(SecondsAngle); - g.setColor('#FF0000'); + g.setColor(g.theme.fg2); g.drawLine( CenterX + SecondHandOffset*sPhi, CenterY - SecondHandOffset*cPhi, @@ -153,6 +189,13 @@ function drawHands () { CenterY + SecondHandLength*cPhi ); } + + g.setColor(g.theme.fg); + g.fillCircle(CenterX,CenterY, outerBoltRadius); + + g.setColor(g.theme.bg); + g.drawCircle(CenterX,CenterY, outerBoltRadius); + g.fillCircle(CenterX,CenterY, innerBoltRadius); } function setNumbersFont() { @@ -192,7 +235,7 @@ function draw() { g.setColor(g.theme.bg); g.fillRect(Bangle.appRect); - drawHands(); + drawClockHands(); drawNumbers(); queueDraw(); } @@ -216,6 +259,5 @@ Bangle.on('lcdPower',on=>{ } }); -loadSettings(); Bangle.setUI('clock'); draw(); diff --git a/apps/limelight/screenshot_gochihand.png b/apps/limelight/screenshot_gochihand.png index af405c0f8406505893cedcbac16da25ea1e27804..244b008dc2f56804bcb252a7f89dd49339c6e0f7 100644 GIT binary patch literal 2452 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 O2pnu&PtdK18UF>*lD-=N delta 2353 zcmV-13C{M`6vz^gFnS&_6$4y8iovz|!)O41sZAY66SE zTir6cv7?-H;3!q%HVM4TX6eQj(L)07O>UX+wX@NcXw7ed@PB=n-#8!PSU&*-UWtgn z{SszotQ2@z*L$=2b%d~X&b^Me7H&Pxn}0Mu1DjYq0R;YY8)gw7f%TGAW;|Ws_2xz$ zbs4`F%_`m~|L6$8*|$8;%{ zfWT6mB`|Pf7rRr8r5}O#p$ri8G&+00K*Kl7Fn500MUtXFe$b1eW3?SvLU$ zP7;6rz-RBBvFo8(|0>U}=3$#QS6x z4<`AGfxu2?M^ah@97%1-;au{qha<3~ylVNZo!qg+#|=ebW64MIzS2axr{yedT;d~# zA+V$DBY%k_0>7q5Vn-2HLlM}??j_s$`+ZA_sK8qiXL32WH1%)U@cMc_oK)PKUM^Ch-6O(+5oM0)N-B z{my*!^&;*8=iwu8p5b8zx^FGu5`jlwYJ5`XLEwo59*Mi&$`eF>n!w%rm2_aQxbGt0 zUE=P7*7mz`_Ui+%jqin$gE@U55Qz{{=9m>Zhuuq5-ApScZs{tgONIR#3)?ZTW6>PE5)naTt{(^ z=AirjrBhXBiNKkc{;G|gE$`8%a2Z}#*q3(=l{G$H;H^U6rNDIH|5d+~z!i(B$m#78 z72}^SaL4}L9k@caikuZfdUJLZ(7UG2@yho~vNv%RvQ^~lEY#jy2)uuTOMi7tqyrb3 z&Mma#M@e7U6%xAzt~iw6u>(K7`@Z*u%8MC+n>(l7`yJZ;5AeY(JR?7rLs-oF;q zZ|p(>tBw)s&6Kwg#{?DK#xeb+hbrqX6WDtwS8n2p)k5Ios;FLh!vgQUOj^!(cP#Gv z4Wn&6N|OflL)P>)ujZ^h^&O-5v^)$k=wb5@SdkU+%+B|bI_Ah~}b!nv!rwB~< zJ^%7Lt4k~8ZRx=31)pE~d#<3mOGj=kT1c07VAWa2vKhu`2}GqfeUNkJH!`f4=)P7` z^NbrEJv!wrKSI!b=YJ71y3)vlOUm~^Wk(3)jVdvBT=x@)WdhG#23D^muypB)PYn@R zSt)Y06F}g0g}fWS(cApgk##9Jw1Z5dU_q9;cjzM4%Pr9!Nq%#cy zJAv&Dr~8UPI)Bq3uoKwUaO4$045mQfAh;!L@92QkNwCIn1U7=Q9vv*{lz$)BGT)uY zAaJ6(*1tx+H3bqUz`uneaDrn-;AL7wP86W)|HS2%c+KdMylXML|8n^?sp(fm2M#ig z-uJEgcT>S_Odp28ff7dL9o@MIEamYb2<%iKD=!i|fqxH%Be0XF^8T(emvbAp8IHit zQmUm>=W}jn`r!!dETLLBbw1~IrXP;LjuKYLR*}=OrRj$vu%m<(vQ^}CY-#$T2<#|f zg=`f$9b1}yC;~f5SRq?QPREv}ABw=v5~_t$=W}jn`r!!dETK|3WiID7ZZjN#ouyPt zr_ANt#(!;wBXFRU3h`7QNe7mHs}KYZlrt+|Ha@WA+lC-;u(XlKA|o-ur%Ayu#_EBKbt9hESwTizPZazWcA|y6(U3>$#r$_xw;yT$f_Vdt`5I$qe`UlrtPw zYAR#n{A(qjYg^?=DBQztMAtrTvAr=-cwAfNxR>{;R=!+9R9PZCrut07hqn$m7F$`O zxrp>7Pg87EO#dG$aG?d2eo|nvOHS0Wnp~S z(Hy)9ja~bTaUS>2pDp(;k^jJ7M0eRqwTYZWf0Z1S_hn>WO{7-Nc3uspvBoF#XPmqdke^51z3 zgL`v1CO(umb1dtjL6>Mb0Y>>b(t!W_pN$BX3W9A|Iv7{zSx zUm7g*LQ(8<1+CT_%Aweh(Bu@WD%(uk84OZ&}xzD zNQT86VuC)M3#g)h9j!^nqze^V4xXLPlrE8n{|*blfW zmGMWKGmk0iRG!|Yz%^m!EGwb|@cnl7KP+3V`Jk1P-K7>zI04maZ{uCXWzo&Hh{sX$ zy!V||_jlkt);#2gUQXVv7|{9ZiqDP3p6B~>_Vw?|KcdF*Bb2N1se0A&EM})uLhXcI znQgVet#`9;{&Z%q1WH@a=yZ3|XSeLKe`0ZV(u380RYe;$Yp!@9QDO6pT4cKS1VWAH zUhroJ)`o@f_!rh|GJvaR?rW%%DkK>4U}5(=pL-K{6hGbnY#?T_L`+dOA*MN=kmybB)hCbz-!?n9`$-4p{J`!&UArJ@uXXmU3j@_?tG>QMJJ2?X%Jb z-$+<@w&!E^_3Cq9#lHl*61sJ>{acDz{Y!mNO6zj?DbQDVw&Bu1>6$hgxyzKN`hdSB z*S6sFW)`V<*n83kt&b{8m+>>4_WzsOaAGFRjM7xSu*6!*KKnKmX;2lv$B7PfGFd3`tUX}A?XxY_N zmgP>0DRijszMfvG6BJAkHfnv$3_8l7Oa`+?bKf>!+E^XpUpwF)GRCX=c+j15)^ZzK z-R6$EPqjycRxjjQcTUut+IC}y?(89w>$R2NuxY1ZB154`_v@=XPy1TM2*3Ddw);e@ zq)0bh*OC>@#nakb>VG|G)xR_T+B7F&vUr{7nEW}l;_r((N>PMF&p;5}efpW@-DBUG zQ{iI6SUDwu+3@+`$y<fSr6>h@V zXShM~PN3mwgBqwN(r0ecVfuI-s%hmGrTKf#Q6eUL2REqw(!L0&#DmLP#IsfFd2l7h zEz0JO(;f+q>uR7l(^oPmzU}xX$!k(KL8uj3utZt;JGtUDX>5ZYP>+4UdEm~`bhSwK zA2LB$+fMV&;>iuiy#I$65XjX^vXsFr(fZakuTT3%-?upVs`CYR<^K>6E$f8M5OLvl z-V@*3rq7oMAX0$f&~$I!2KERduAIt8B*c{$HD@$Y?xWp*O~v+`u2!+$!mt_8aPu{C zPh7KJIOe5(UVesPvA80}`#s8F{N0V>&my(8%Ro0-1Rhc0m0=~>R`3Tsjwu4{#N3ex zj;aw+I_8(M+Wh;&i^^O94LsBFL~E4`DdGd3`2YhS;xjB)v7t43v(6R=<-H0! zVpsnI%ZIyz5)n9@uj3^}1}yesz>qo~8f@*FWEdhIX>A!>FZ8GntjgZT$-3N%6Z0?n Ce0p>M literal 2425 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 BY>NN@ diff --git a/apps/limelight/screenshot_monoton.png b/apps/limelight/screenshot_monoton.png index d17d9bd26e9795c28c427f37ca8407db63b3f5b8..e75b11f5daaceca3fc7ee629ee942e822dca01bb 100644 GIT binary patch delta 2974 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 Date: Fri, 7 Jan 2022 23:46:24 +0100 Subject: [PATCH 105/122] menuwheel: override Bangle.setUI to clear up touch handler Because apps/libraries expect setUI to clean up touch handlers. --- apps.json | 2 +- apps/menuwheel/ChangeLog | 1 + apps/menuwheel/boot.js | 10 ++++++---- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/apps.json b/apps.json index 3fc0616da..56691d2d4 100644 --- a/apps.json +++ b/apps.json @@ -4805,7 +4805,7 @@ { "id": "menuwheel", "name": "Wheel Menus", - "version": "0.01", + "version": "0.02", "description": "Replace Bangle.js 2's menus with a version that contains variable-size text and a back button", "readme": "README.md", "icon": "icon.png", diff --git a/apps/menuwheel/ChangeLog b/apps/menuwheel/ChangeLog index defdb5049..050cf2049 100644 --- a/apps/menuwheel/ChangeLog +++ b/apps/menuwheel/ChangeLog @@ -1 +1,2 @@ 0.01: New menu! +0.02: Clean up touch handler in setUI diff --git a/apps/menuwheel/boot.js b/apps/menuwheel/boot.js index 3e708e9a8..deb15264d 100644 --- a/apps/menuwheel/boot.js +++ b/apps/menuwheel/boot.js @@ -1,8 +1,5 @@ E.showMenu = function(items) { g.clearRect(Bangle.appRect); // clear screen if no menu supplied - // clean up back button listener - if (Bangle.backHandler) Bangle.removeListener('touch', Bangle.backHandler) - delete Bangle.backHandler; if (!items) { Bangle.setUI(); return; @@ -206,8 +203,13 @@ E.showMenu = function(items) { if (b===1) back(); } } - // note: backHandler is cleaned up at the top of this file Bangle.on('touch', Bangle.backHandler); } return l; }; +// setUI now also needs to clear up our back button touch handler +Bangle.setUI = (old => function() { + if (Bangle.backHandler) Bangle.removeListener("touch", Bangle.backHandler); + delete Bangle.backHandler; + return old.apply(this, arguments); +})(Bangle.setUI); \ No newline at end of file From ebfedfd18b1220b00cc6cf7ec64663e56d440377 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 7 Jan 2022 22:55:43 +0000 Subject: [PATCH 106/122] fixed apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 1ddacceca..7d0789953 100644 --- a/apps.json +++ b/apps.json @@ -5483,4 +5483,4 @@ {"name":"limelight.img","url":"limelight.icon.js","evaluate":true} ] } -} +] From 2a2c26393fafe60c5509f15157fed98d575023e5 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 7 Jan 2022 23:11:14 +0000 Subject: [PATCH 107/122] limelight README tweak --- apps/limelight/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/limelight/README.md b/apps/limelight/README.md index e84714403..e7c13a139 100644 --- a/apps/limelight/README.md +++ b/apps/limelight/README.md @@ -5,14 +5,14 @@ * Selection of different fonts * Settings menu where you can select font, or switch to Vector font and try a range of sizes -* 100 less lines of code, demonstrating that there is no need for a custom widget draw method -* Full screen options (widgets loaded but not displayed) +* Reduction by 100 lines of code, demonstrating that there is no need for a custom widget draw method +* Full screen option (widgets are loaded but not displayed) ![](screenshot_gochihand.png) ![](screenshot_monoton.png) ![](screenshot_grenadier.png) -Many thanks for @Andreas_Rozek for his pioneering work on building a toolkit for the Bangle 2. +Many thanks for @Andreas_Rozek for his pioneering work on building an analogue clock toolkit for the Bangle 2. Limelight 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 597efeab00c8f9a9caf106e6c366e2c66dfefbf4 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 7 Jan 2022 23:14:15 +0000 Subject: [PATCH 108/122] limelight README tweak --- apps/limelight/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/limelight/README.md b/apps/limelight/README.md index e7c13a139..49b858127 100644 --- a/apps/limelight/README.md +++ b/apps/limelight/README.md @@ -1,5 +1,5 @@ # Limelight - * Simple configurable analogue clock based on the work of @Andreas_Rozek [Simple_Clock](https://github.com/espruino/BangleApps/tree/master/apps/simple_clock)* + *Simple configurable analogue clock based on the work of @Andreas_Rozek [Simple_Clock](https://github.com/espruino/BangleApps/tree/master/apps/simple_clock)* ![](screenshot_limelight.png) From 049555a08dd3083b956c8df0e44575f9148e5add Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sat, 8 Jan 2022 00:25:43 +0000 Subject: [PATCH 109/122] Simplest, switched to queueDraw() method, update once per minute --- apps.json | 2 +- apps/simplest/ChangeLog | 1 + apps/simplest/app.js | 66 ++++++++++++++++++++++++++++++----------- 3 files changed, 51 insertions(+), 18 deletions(-) diff --git a/apps.json b/apps.json index 7d0789953..1f4e983e6 100644 --- a/apps.json +++ b/apps.json @@ -3794,7 +3794,7 @@ { "id": "simplest", "name": "Simplest Clock", - "version": "0.03", + "version": "0.04", "description": "The simplest working clock, acts as a tutorial piece", "icon": "simplest.png", "screenshots": [{"url":"screenshot_simplest.png"}], diff --git a/apps/simplest/ChangeLog b/apps/simplest/ChangeLog index f37015d6a..c5ceb7a44 100644 --- a/apps/simplest/ChangeLog +++ b/apps/simplest/ChangeLog @@ -1,3 +1,4 @@ 0.01: Modified for use with new bootloader and firmware 0.02: Use Bangle.setUI for button/launcher handling 0.03: Fix display for Bangle 2 +0.04: Use queueDraw(), update every minute, respect theme, use Lato font diff --git a/apps/simplest/app.js b/apps/simplest/app.js index 68564ff33..85ccc1509 100644 --- a/apps/simplest/app.js +++ b/apps/simplest/app.js @@ -1,28 +1,60 @@ - const h = g.getHeight(); const w = g.getWidth(); -function draw() { - var d = new Date(); - var da = d.toString().split(" "); - var time = da[4].substr(0,5); - - g.reset(); - g.clearRect(0, 30, w, 99); - g.setFontAlign(0, -1); - g.setFont("Vector", w/3); - g.drawString(time, w/2, 40); +// from fonts.google.com +Graphics.prototype.setFontLato = function(scale) { + // Actual height 50 (53 - 4) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAP4AAAAAAAAD/gAAAAAAAAf8AAAAAAAAD/gAAAAAAAAP4AAAAAAAAB/AAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAfAAAAAAAAAf4AAAAAAAAP/AAAAAAAAP/wAAAAAAAH/4AAAAAAAH/8AAAAAAAH/8AAAAAAAD/+AAAAAAAD/+AAAAAAAB//AAAAAAAB//AAAAAAAA//gAAAAAAA//gAAAAAAAf/gAAAAAAAf/wAAAAAAAP/wAAAAAAAP/4AAAAAAAH/4AAAAAAAB/8AAAAAAAAf8AAAAAAAAD+AAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//gAAAAAAf///gAAAAAf////gAAAAH/////AAAAD/////8AAAA//////wAAAP/4AB//AAAD/wAAA/8AAA/wAAAA/wAAH8AAAAD+AAB/AAAAAP4AAPwAAAAA/AAB8AAAAAD4AAPgAAAAAfAAD8AAAAAD8AAfgAAAAAfgAD8AAAAAD8AAfgAAAAAfgAD8AAAAAD8AAPgAAAAAfAAB+AAAAAH4AAPwAAAAA/AAA/AAAAAPwAAH+AAAAH+AAAf8AAAB/gAAD/4AAB/8AAAP//gf//AAAA//////wAAAB/////4AAAAH////+AAAAAP////AAAAAAP///AAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAADgAAAAAAAAA+AAAAAAAAAPwAAAD4AAAD+AAAAfAAAA/gAAAD4AAAP4AAAAfAAAD+AAAAD4AAA/wAAAAfAAAH8AAAAD4AAB/AAAAAfAAAfwAAAAD4AAH8AAAAAfAAB///////4AAP///////AAB///////4AAP///////AAB///////4AAP///////AAAAAAAAAD4AAAAAAAAAfAAAAAAAAAD4AAAAAAAAAfAAAAAAAAAD4AAAAAAAAAfAAAAAAAAAD4AAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAHAAAAD4AAAH4AAAA/AAAB/AAAAP4AAA/4AAAD/AAAP/AAAA/4AAD/4AAAP/AAAf4AAAD/4AAH8AAAA//AAA/AAAAP74AAPwAAAD+fAAB+AAAA/n4AAPgAAAP4/AAD8AAAD+H4AAfgAAA/g/AAD8AAAP4H4AAfgAAD+A/AAD8AAA/gH4AAfgAAP4A/AAB8AAH+AH4AAPwAB/gA/AAB/AA/4AH4AAH8Af+AA/AAA////gAH4AAD///wAA/AAAP//8AAH4AAA///AAA/AAAD//gAAH4AAAH/wAAA/AAAAHwAAAD4AAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAA8AAAAAPAAAP4AAAAP4AAB/gAAAD/AAAP/AAAA/4AAB/4AAAP/AAAD/gAAD/wAAAH+AAA/wAAAAfwAAH8AAAAB/AAB/AAAAAH4AAPwAAAAAfAAB8AAAAAD8AAPgADwAAfgAD8AAeAAD8AAfgADwAAfgAD8AAfAAD8AAfgAH4AAfgAD8AA/AAD8AAPgAH4AAfAAB+AB/gAH4AAPwAP8AA/AAB/AD/wAPwAAH+B+/AH+AAA///3+D/gAAD//8f//8AAAP//D///AAAA//wP//wAAAB/8A//8AAAAD8AB/+AAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAH4AAAAAAAAD/AAAAAAAAA/4AAAAAAAAP/AAAAAAAAH/4AAAAAAAB//AAAAAAAAf74AAAAAAAP+fAAAAAAAD/D4AAAAAAA/wfAAAAAAAf8D4AAAAAAH+AfAAAAAAD/gD4AAAAAA/4AfAAAAAAP8AD4AAAAAH/AAfAAAAAB/gAD4AAAAAf4AAfAAAAAP+AAD4AAAAD/AAAfAAAAA/wAAD4AAAAP///////AAB///////4AAP///////AAB///////4AAP///////AAB///////4AAAAAAAfAAAAAAAAAD4AAAAAAAAAfAAAAAAAAAD4AAAAAAAAAfAAAAAAAAAD4AAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAA4AAAAAAAAAPgAAAAB/AAD8AAAAH/4AAfwAAA///AAB+AAB///4AAP4AAP///AAA/AAB///4AAH4AAP/gfAAAfAAB+AHwAAD8AAPwA+AAAfgAB+AHwAAD8AAPwA+AAAfgAB+AHwAAD8AAPwA+AAAfgAB+AH4AAD4AAPwA/AAAfAAB+AH4AAH4AAPwAfgAB/AAB+AD8AAfwAAPwAf4AH+AAB+AB/gD/gAAPwAP///4AAB+AA///+AAAPgAD///gAAB8AAP//4AAAPAAAf/8AAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAB//gAAAAAAA///AAAAAAAf//8AAAAAAH///4AAAAAD////AAAAAA//gf8AAAAAP/wAfwAAAAH/8AB+AAAAB//AAH4AAAA//wAA/AAAAP+8AAD4AAAD/ngAAfgAAB/58AAD8AAAf8PgAAfgAAH/B8AAD8AAD/wPgAAfgAA/8B8AAD8AAP+APgAAfAAB/gB8AAD4AAP4APwAA/AAB8AB+AAH4AAPAAH4AB+AABwAA/wA/wAAIAAD/gf8AAAAAAf///AAAAAAB///wAAAAAAH//8AAAAAAAf//AAAAAAAA//gAAAAAAAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAPgAAAAAAAAB+AAAAAAAAAPwAAAAAAAAB+AAAAAAAAAPwAAAAADAAB+AAAAAB4AAPwAAAAA/AAB+AAAAAf4AAPwAAAAP/AAB+AAAAH/4AAPwAAAD/+AAB+AAAB//AAAPwAAA//gAAB+AAAf/wAAAPwAAP/4AAAB+AAH/8AAAAPwAD/+AAAAB+AB//AAAAAPwA//gAAAAB+Af/gAAAAAPwP/wAAAAAB+H/4AAAAAAPz/8AAAAAAB//+AAAAAAAP//AAAAAAAB//gAAAAAAAP/wAAAAAAAB/4AAAAAAAAP8AAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAHgAP/4AAAAH/gD//gAAAD//A///AAAA//8P//4AAAP//z///gAAD//+fwP+AAA/4f/4AfwAAH4A/+AB/AAB+AB/gAH4AAPgAH8AAfAAB8AA/AAD4AAfgAH4AAfgAD4AAfAAB8AAfAAD4AAPgAD4AAfAAB8AAfAAD4AAPgAD4AAfAAD8AAPgAH4AAfAAB8AA/gAD4AAPwAP8AA/AAA/AD/wAH4AAH8B//AB+AAAf//78A/wAAD//+f//8AAAP//h///gAAA//4P//4AAAB/+A//+AAAAD/AD//gAAAAAAAH/wAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAf/gAAAAAAAP/+AAAAAAAD//8AAAAAAA///wAAAAAAP///AAAAAAD///4AADAAA/wB/gAA4AAH8AD8AAPAAB/AAPwAH4AAPwAB+AB/AAB8AAHwAf4AAPgAA+AP/AAD8AAHwD/wAAfgAA+A/8AAD8AAHwf+AAAfgAA+H/gAAD8AAHx/wAAAPgAA8/8AAAB8AAPv/AAAAPwAB//gAAAB/AAf/4AAAAH8AH/8AAAAA/wD//AAAAAD////gAAAAAP///4AAAAAA///8AAAAAAD//+AAAAAAAH//AAAAAAAAP/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAHwAAAAB+AAB/AAAAAf4AAP4AAAAD/AAD/gAAAAf4AAf8AAAAD/AAB/AAAAAPwAAP4AAAAA8AAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="), 46, atob("DRclJSUlJSUlJSUlEA=="), 63+(scale<<8)+(1<<16)); + return this; } -// handle switch display on by pressing BTN1 -Bangle.on('lcdPower', function(on) { - if (on) draw(); +function draw() { + var date = new Date(); + var timeStr = require("locale").time(date,1); + var dateStr = require("locale").date(date).toUpperCase(); + + g.reset(); + g.setColor(g.theme.bg); + g.fillRect(Bangle.appRect); + + g.setFontLato(); + g.setFontAlign(0, -1); + g.setColor(g.theme.fg); + g.drawString(timeStr, w/2, h/3); + + g.setFont("6x8",2); + g.setFontAlign(0,0) + g.drawString(dateStr, w/2, h - 24 - 24); + + queueDraw(); +} + +// timeout used to update every minute +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } }); g.clear(); +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets Bangle.loadWidgets(); Bangle.drawWidgets(); -setInterval(draw, 15000); // refresh every 15s draw(); -// Show launcher when button pressed -Bangle.setUI("clock"); From 968e7b5840fdf95f1b3b5300a964b77ab788ab8a Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Sat, 8 Jan 2022 10:25:24 +0100 Subject: [PATCH 110/122] Make text size in heart rate circle slightly bigger as it does not have any units --- apps/circlesclock/app.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 6d408fd59..3843d5dda 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -63,6 +63,7 @@ const circlePosX = [Math.round(w / 6), Math.round(3 * w / 6), Math.round(5 * w / const radiusOuter = 25; const radiusInner = 20; const circleFont = "Vector:15"; +const circleFontBig = "Vector:16"; const circleFontSmall = "Vector:13"; function draw() { @@ -229,7 +230,7 @@ function drawHeartRate(w) { g.fillPoly([w, h3, w - 15, h3 + radiusOuter + 5, w + 15, h3 + radiusOuter + 5]); - g.setFont(circleFont); + g.setFont(circleFontBig); g.setFontAlign(0, 0); g.setColor(colorFg); g.drawString(hrtValue != undefined ? hrtValue : "-", w, h3); From 04129c82818dbd956ed4f7b13d103b7754a02a1e Mon Sep 17 00:00:00 2001 From: Peter Slendebroek Date: Sat, 8 Jan 2022 13:58:47 +0100 Subject: [PATCH 111/122] changed type to app of mmind app --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 3321f822f..5153e3deb 100644 --- a/apps.json +++ b/apps.json @@ -5134,8 +5134,8 @@ "version":"0.01", "description": "This is the classic game for masterminds", "screenshots": [{"url":"screenshot_mmind.png"}], - "type": "game", - "tags": "game,app", + "type": "app", + "tags": "game", "readme":"README.md", "supports": ["BANGLEJS2"], "allow_emulator": true, From a1ebca296cf3f09ab8974610c23307ffb5cf76f9 Mon Sep 17 00:00:00 2001 From: Marcus Olsson Date: Sat, 8 Jan 2022 21:15:32 +0100 Subject: [PATCH 112/122] Fixed sv_SE formatting Long date does not work well for Bangle.js2 This aligns with default locale en_GB. --- apps.json | 2 +- apps/locale/ChangeLog | 1 + apps/locale/locales.js | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 3fc0616da..f5a17c37d 100644 --- a/apps.json +++ b/apps.json @@ -218,7 +218,7 @@ { "id": "locale", "name": "Languages", - "version": "0.14", + "version": "0.15", "description": "Translations for different countries", "icon": "locale.png", "type": "locale", diff --git a/apps/locale/ChangeLog b/apps/locale/ChangeLog index 448f8119a..198322fb2 100644 --- a/apps/locale/ChangeLog +++ b/apps/locale/ChangeLog @@ -14,3 +14,4 @@ 0.12: Fixed nl_NL formatting, because the full months won't fit on the Bangle.js2's screen 0.13: Now use shorter de_DE date format to more closely match other languages for size 0.14: Added some first translations for Messages in nl_NL +0.15: Fixed sv_SE formatting, long date does not work well for Bangle.js2 diff --git a/apps/locale/locales.js b/apps/locale/locales.js index cf511c54f..1626b744f 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -276,7 +276,7 @@ var locales = { temperature: "°C", ampm: { 0: "fm", 1: "em" }, timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" }, - datePattern: { 0: "%A %B %d %Y", "1": "%Y-%m-%d" }, // söndag 1 mars 2020 // 2020-03-01 + datePattern: { 0: "%b %d %Y", "1": "%Y-%m-%d" }, // feb 1 2020 // 2020-03-01 abmonth: "jan,feb,mars,apr,maj,juni,juli,aug,sep,okt,nov,dec", month: "januari,februari,mars,april,maj,juni,juli,augusti,september,oktober,november,december", abday: "sön,mån,tis,ons,tors,fre,lör", From 4341efb46a358612bce0c11ca259abd0109f374d Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sat, 8 Jan 2022 20:43:06 +0000 Subject: [PATCH 113/122] Updated simplest to make it simpler, tweak to Pastel to make it cycle better --- apps.json | 4 ++-- apps/pastel/ChangeLog | 1 + apps/pastel/pastel.app.js | 2 +- apps/simplest/ChangeLog | 2 ++ apps/simplest/app.js | 27 +++++++++++---------------- 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/apps.json b/apps.json index 1f4e983e6..2d87b2f73 100644 --- a/apps.json +++ b/apps.json @@ -3794,7 +3794,7 @@ { "id": "simplest", "name": "Simplest Clock", - "version": "0.04", + "version": "0.05", "description": "The simplest working clock, acts as a tutorial piece", "icon": "simplest.png", "screenshots": [{"url":"screenshot_simplest.png"}], @@ -4215,7 +4215,7 @@ "id": "pastel", "name": "Pastel Clock", "shortName": "Pastel", - "version": "0.10", + "version": "0.11", "description": "A Configurable clock with custom fonts, background and weather display. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", "dependencies": {"mylocation":"app", "widpedom":"app","weather":"app"}, diff --git a/apps/pastel/ChangeLog b/apps/pastel/ChangeLog index 627531f03..00090fcd1 100644 --- a/apps/pastel/ChangeLog +++ b/apps/pastel/ChangeLog @@ -8,3 +8,4 @@ 0.08: Added dependancy on MyLocation 0.09: Added dependancy on Pedometer Widget 0.10: Added Weather line, fixed issues on a Bangle 1, update every minute +0.11: Changed cycle on minute to prevInfo to avoid the 2nd one being the blank line diff --git a/apps/pastel/pastel.app.js b/apps/pastel/pastel.app.js index db60a2738..3e64cdd9c 100644 --- a/apps/pastel/pastel.app.js +++ b/apps/pastel/pastel.app.js @@ -255,7 +255,7 @@ function queueDraw() { if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { drawTimeout = undefined; - nextInfo(); + prevInfo(); draw(); }, 60000 - (Date.now() % 60000)); } diff --git a/apps/simplest/ChangeLog b/apps/simplest/ChangeLog index c5ceb7a44..e7ab5f2c3 100644 --- a/apps/simplest/ChangeLog +++ b/apps/simplest/ChangeLog @@ -2,3 +2,5 @@ 0.02: Use Bangle.setUI for button/launcher handling 0.03: Fix display for Bangle 2 0.04: Use queueDraw(), update every minute, respect theme, use Lato font +0.05: Decided against custom font as it inceases the code size + minimalism is useful when narrowing down issues diff --git a/apps/simplest/app.js b/apps/simplest/app.js index 85ccc1509..582c4c2d5 100644 --- a/apps/simplest/app.js +++ b/apps/simplest/app.js @@ -1,31 +1,19 @@ const h = g.getHeight(); const w = g.getWidth(); -// from fonts.google.com -Graphics.prototype.setFontLato = function(scale) { - // Actual height 50 (53 - 4) - this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAP4AAAAAAAAD/gAAAAAAAAf8AAAAAAAAD/gAAAAAAAAP4AAAAAAAAB/AAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAfAAAAAAAAAf4AAAAAAAAP/AAAAAAAAP/wAAAAAAAH/4AAAAAAAH/8AAAAAAAH/8AAAAAAAD/+AAAAAAAD/+AAAAAAAB//AAAAAAAB//AAAAAAAA//gAAAAAAA//gAAAAAAAf/gAAAAAAAf/wAAAAAAAP/wAAAAAAAP/4AAAAAAAH/4AAAAAAAB/8AAAAAAAAf8AAAAAAAAD+AAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//gAAAAAAf///gAAAAAf////gAAAAH/////AAAAD/////8AAAA//////wAAAP/4AB//AAAD/wAAA/8AAA/wAAAA/wAAH8AAAAD+AAB/AAAAAP4AAPwAAAAA/AAB8AAAAAD4AAPgAAAAAfAAD8AAAAAD8AAfgAAAAAfgAD8AAAAAD8AAfgAAAAAfgAD8AAAAAD8AAPgAAAAAfAAB+AAAAAH4AAPwAAAAA/AAA/AAAAAPwAAH+AAAAH+AAAf8AAAB/gAAD/4AAB/8AAAP//gf//AAAA//////wAAAB/////4AAAAH////+AAAAAP////AAAAAAP///AAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAADgAAAAAAAAA+AAAAAAAAAPwAAAD4AAAD+AAAAfAAAA/gAAAD4AAAP4AAAAfAAAD+AAAAD4AAA/wAAAAfAAAH8AAAAD4AAB/AAAAAfAAAfwAAAAD4AAH8AAAAAfAAB///////4AAP///////AAB///////4AAP///////AAB///////4AAP///////AAAAAAAAAD4AAAAAAAAAfAAAAAAAAAD4AAAAAAAAAfAAAAAAAAAD4AAAAAAAAAfAAAAAAAAAD4AAAAAAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAHAAAAD4AAAH4AAAA/AAAB/AAAAP4AAA/4AAAD/AAAP/AAAA/4AAD/4AAAP/AAAf4AAAD/4AAH8AAAA//AAA/AAAAP74AAPwAAAD+fAAB+AAAA/n4AAPgAAAP4/AAD8AAAD+H4AAfgAAA/g/AAD8AAAP4H4AAfgAAD+A/AAD8AAA/gH4AAfgAAP4A/AAB8AAH+AH4AAPwAB/gA/AAB/AA/4AH4AAH8Af+AA/AAA////gAH4AAD///wAA/AAAP//8AAH4AAA///AAA/AAAD//gAAH4AAAH/wAAA/AAAAHwAAAD4AAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAA8AAAAAPAAAP4AAAAP4AAB/gAAAD/AAAP/AAAA/4AAB/4AAAP/AAAD/gAAD/wAAAH+AAA/wAAAAfwAAH8AAAAB/AAB/AAAAAH4AAPwAAAAAfAAB8AAAAAD8AAPgADwAAfgAD8AAeAAD8AAfgADwAAfgAD8AAfAAD8AAfgAH4AAfgAD8AA/AAD8AAPgAH4AAfAAB+AB/gAH4AAPwAP8AA/AAB/AD/wAPwAAH+B+/AH+AAA///3+D/gAAD//8f//8AAAP//D///AAAA//wP//wAAAB/8A//8AAAAD8AB/+AAAAAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAH4AAAAAAAAD/AAAAAAAAA/4AAAAAAAAP/AAAAAAAAH/4AAAAAAAB//AAAAAAAAf74AAAAAAAP+fAAAAAAAD/D4AAAAAAA/wfAAAAAAAf8D4AAAAAAH+AfAAAAAAD/gD4AAAAAA/4AfAAAAAAP8AD4AAAAAH/AAfAAAAAB/gAD4AAAAAf4AAfAAAAAP+AAD4AAAAD/AAAfAAAAA/wAAD4AAAAP///////AAB///////4AAP///////AAB///////4AAP///////AAB///////4AAAAAAAfAAAAAAAAAD4AAAAAAAAAfAAAAAAAAAD4AAAAAAAAAfAAAAAAAAAD4AAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAA4AAAAAAAAAPgAAAAB/AAD8AAAAH/4AAfwAAA///AAB+AAB///4AAP4AAP///AAA/AAB///4AAH4AAP/gfAAAfAAB+AHwAAD8AAPwA+AAAfgAB+AHwAAD8AAPwA+AAAfgAB+AHwAAD8AAPwA+AAAfgAB+AH4AAD4AAPwA/AAAfAAB+AH4AAH4AAPwAfgAB/AAB+AD8AAfwAAPwAf4AH+AAB+AB/gD/gAAPwAP///4AAB+AA///+AAAPgAD///gAAB8AAP//4AAAPAAAf/8AAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAB//gAAAAAAA///AAAAAAAf//8AAAAAAH///4AAAAAD////AAAAAA//gf8AAAAAP/wAfwAAAAH/8AB+AAAAB//AAH4AAAA//wAA/AAAAP+8AAD4AAAD/ngAAfgAAB/58AAD8AAAf8PgAAfgAAH/B8AAD8AAD/wPgAAfgAA/8B8AAD8AAP+APgAAfAAB/gB8AAD4AAP4APwAA/AAB8AB+AAH4AAPAAH4AB+AABwAA/wA/wAAIAAD/gf8AAAAAAf///AAAAAAB///wAAAAAAH//8AAAAAAAf//AAAAAAAA//gAAAAAAAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAAAAPgAAAAAAAAB+AAAAAAAAAPwAAAAAAAAB+AAAAAAAAAPwAAAAADAAB+AAAAAB4AAPwAAAAA/AAB+AAAAAf4AAPwAAAAP/AAB+AAAAH/4AAPwAAAD/+AAB+AAAB//AAAPwAAA//gAAB+AAAf/wAAAPwAAP/4AAAB+AAH/8AAAAPwAD/+AAAAB+AB//AAAAAPwA//gAAAAB+Af/gAAAAAPwP/wAAAAAB+H/4AAAAAAPz/8AAAAAAB//+AAAAAAAP//AAAAAAAB//gAAAAAAAP/wAAAAAAAB/4AAAAAAAAP8AAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAHgAP/4AAAAH/gD//gAAAD//A///AAAA//8P//4AAAP//z///gAAD//+fwP+AAA/4f/4AfwAAH4A/+AB/AAB+AB/gAH4AAPgAH8AAfAAB8AA/AAD4AAfgAH4AAfgAD4AAfAAB8AAfAAD4AAPgAD4AAfAAB8AAfAAD4AAPgAD4AAfAAD8AAPgAH4AAfAAB8AA/gAD4AAPwAP8AA/AAA/AD/wAH4AAH8B//AB+AAAf//78A/wAAD//+f//8AAAP//h///gAAA//4P//4AAAB/+A//+AAAAD/AD//gAAAAAAAH/wAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAf/gAAAAAAAP/+AAAAAAAD//8AAAAAAA///wAAAAAAP///AAAAAAD///4AADAAA/wB/gAA4AAH8AD8AAPAAB/AAPwAH4AAPwAB+AB/AAB8AAHwAf4AAPgAA+AP/AAD8AAHwD/wAAfgAA+A/8AAD8AAHwf+AAAfgAA+H/gAAD8AAHx/wAAAPgAA8/8AAAB8AAPv/AAAAPwAB//gAAAB/AAf/4AAAAH8AH/8AAAAA/wD//AAAAAD////gAAAAAP///4AAAAAA///8AAAAAAD//+AAAAAAAH//AAAAAAAAP/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAHwAAAAB+AAB/AAAAAf4AAP4AAAAD/AAD/gAAAAf4AAf8AAAAD/AAB/AAAAAPwAAP4AAAAA8AAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="), 46, atob("DRclJSUlJSUlJSUlEA=="), 63+(scale<<8)+(1<<16)); - return this; -} - function draw() { var date = new Date(); var timeStr = require("locale").time(date,1); - var dateStr = require("locale").date(date).toUpperCase(); g.reset(); g.setColor(g.theme.bg); g.fillRect(Bangle.appRect); - g.setFontLato(); - g.setFontAlign(0, -1); + g.setFont('Vector', w/3); + g.setFontAlign(0, 0); g.setColor(g.theme.fg); - g.drawString(timeStr, w/2, h/3); + g.drawString(timeStr, w/2, h/2); - g.setFont("6x8",2); - g.setFontAlign(0,0) - g.drawString(dateStr, w/2, h - 24 - 24); - queueDraw(); } @@ -52,8 +40,15 @@ Bangle.on('lcdPower',on=>{ }); g.clear(); + // Show launcher when middle button pressed -Bangle.setUI("clock"); +//Bangle.setUI("clock"); +// use clockupdown as it tests for issue #1249 +Bangle.setUI("clockupdown", btn=> { + draw(); +}); + + // Load widgets Bangle.loadWidgets(); Bangle.drawWidgets(); From 72eb12827255b12926d82cd825871349cdcea5b7 Mon Sep 17 00:00:00 2001 From: Didgeridoohan Date: Sun, 9 Jan 2022 07:32:57 +0100 Subject: [PATCH 114/122] Tweak long date --- apps/locale/locales.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index fea217efe..fce2b8c2a 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -294,7 +294,7 @@ var locales = { temperature: '°C', ampm: { 0: "", 1: "" }, timePattern: { 0: "%HH:%MM:%SS ", 1: "%HH:%MM" }, - datePattern: { 0: "%A %B %d %Y", "1": "%Y-%m-%d" }, // Sunday 1 March 2020 // 2020-03-01 + datePattern: { 0: "%B %d %Y", "1": "%Y-%m-%d" }, // March 1 2020 // 2020-03-01 abmonth: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec", month: "January,February,March,April,May,June,July,August,September,October,November,December", abday: "Sun,Mon,Tue,Wed,Thu,Fri,Sat", From 7ad707793f884a28d59fd37007b06f5357770829 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Sun, 9 Jan 2022 13:42:01 +0100 Subject: [PATCH 115/122] Fix drawing of full circle --- apps/circlesclock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 3843d5dda..1f6cc75ab 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -372,7 +372,7 @@ function drawGauge(cx, cy, percent, color) { if (percent > 1) percent = 1; var startrot = -offset; - var endrot = startrot - ((end - offset) * percent) - 15; + var endrot = startrot - ((end - offset) * percent) - 35; g.setColor(color); From 05f0d3003a32df7e1e95bfd72d679d9edc333097 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Sun, 9 Jan 2022 13:45:50 +0100 Subject: [PATCH 116/122] Fix minor glitch in circle drawing --- apps/circlesclock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 1f6cc75ab..91d4937c4 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -376,7 +376,7 @@ function drawGauge(cx, cy, percent, color) { g.setColor(color); - const size = radiusOuter - radiusInner - 3; + const size = radiusOuter - radiusInner - 2; // draw gauge for (i = startrot; i > endrot - size; i -= size) { x = cx + r * Math.sin(radians(i)); From 6f1b1093621a20aba705cbe483222013c416f1b4 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Sun, 9 Jan 2022 13:46:12 +0100 Subject: [PATCH 117/122] Add TODOs to README --- apps/circlesclock/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/circlesclock/README.md b/apps/circlesclock/README.md index a071efcf5..9aaa4bc8e 100644 --- a/apps/circlesclock/README.md +++ b/apps/circlesclock/README.md @@ -15,6 +15,10 @@ It can show the following information (this can be configured): ![Screenshot dark theme](screenshot-dark.png) ![Screenshot light theme](screenshot-light.png) +# TODO +* Add sunrise and sunset +* Display moon instead of sun during night on weather circle + ## Creator Marco ([myxor](https://github.com/myxor)) From 992b1e6564777d5d4e3bb012594ee5c030953393 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 9 Jan 2022 18:55:33 +0100 Subject: [PATCH 118/122] Bumped wohrm version number --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index ebe193f3a..c155f9262 100644 --- a/apps.json +++ b/apps.json @@ -1717,7 +1717,7 @@ { "id": "wohrm", "name": "Workout HRM", - "version": "0.09-rc10", + "version": "0.09", "description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.", "icon": "app.png", "type": "app", From 707118ffbbc92dc8869b5643fce60847521ef530 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 9 Jan 2022 19:04:00 +0100 Subject: [PATCH 119/122] Bumped Hand Wash Timer version number --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 6fbc82e8b..b73cfe0e6 100644 --- a/apps.json +++ b/apps.json @@ -1893,7 +1893,7 @@ { "id": "widhwt", "name": "Hand Wash Timer", - "version": "0.02-rc10", + "version": "0.02", "description": "On Bangle.js 1 swipe your wrist over the watch face to start your personal Bangle.js 1 hand wash timer. On Bangle.js2 the Pattern Launcher is recommended to start the timer. Start washing after the short buzz and stop after the long buzz 35sec. later.", "icon": "widget.png", "type": "widget", From 20406ca29cadef7492c6cdc3e6a06ca134252259 Mon Sep 17 00:00:00 2001 From: Danny <31635744+DDDanny@users.noreply.github.com> Date: Mon, 10 Jan 2022 00:11:24 +0100 Subject: [PATCH 120/122] Clock can optionally show ISO-8601 calendar weeknumber --- apps.json | 2 +- apps/antonclk/ChangeLog | 3 +++ apps/antonclk/README.md | 3 +-- apps/antonclk/app.js | 38 +++++++++++++++++++++++++++++--------- apps/antonclk/settings.js | 8 ++++++++ 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/apps.json b/apps.json index 3fc0616da..c2180b91d 100644 --- a/apps.json +++ b/apps.json @@ -4242,7 +4242,7 @@ { "id": "antonclk", "name": "Anton Clock", - "version": "0.04", + "version": "0.05", "description": "A clock using the bold Anton font, optionally showing seconds and date in ISO-8601 format.", "readme":"README.md", "icon": "app.png", diff --git a/apps/antonclk/ChangeLog b/apps/antonclk/ChangeLog index 668047d7a..fdf20c175 100644 --- a/apps/antonclk/ChangeLog +++ b/apps/antonclk/ChangeLog @@ -2,3 +2,6 @@ 0.02: Load widgets after setUI so widclk knows when to hide 0.03: Clock now shows day of week under date. 0.04: Clock can optionally show seconds, date optionally in ISO-8601 format, weekdays and uppercase configurable, too. +0.05: Clock can optionally show ISO-8601 calendar weeknumber (default: Off) + when weekday name "Off": week #: + when weekday name "On": weekday name is cut at 6th position and .# is added \ No newline at end of file diff --git a/apps/antonclk/README.md b/apps/antonclk/README.md index 41d3e4559..fa4cc4919 100644 --- a/apps/antonclk/README.md +++ b/apps/antonclk/README.md @@ -40,8 +40,7 @@ The main menu contains several settings covering Anton clock in general. * **Show Weekday** - Weekday is shown in the time presentation without seconds. Weekday name depends on the current locale. If seconds are shown, the weekday is never shown as there is not enough space on the watch face. -* **Uppercase** - Weekday name and month name in the long format are converted to upper case letters. -This can improve readability. +**Show Weeknumber** - Weeknumber (ISO-8601) is shown. * **Vector font** - Use the built-in vector font for dates and weekday. This can improve readability. Otherwise, a scaled version of the built-in 6x8 pixels font is used. diff --git a/apps/antonclk/app.js b/apps/antonclk/app.js index 1f3e49792..be6c23789 100644 --- a/apps/antonclk/app.js +++ b/apps/antonclk/app.js @@ -19,6 +19,7 @@ var secondsWithColon; var dateOnMain; var dateOnSecs; var weekDay; +var calWeek; var upperCase; var vectorFont; @@ -29,22 +30,25 @@ var secondsScreen = true; var isBangle1 = (g.getWidth() == 240); -/* For development purposes +//For development purposes +/* require('Storage').writeJSON(SETTINGSFILE, { - secondsMode: "Always", // "Never", "Unlocked", "Always" + secondsMode: "Unlocked", // "Never", "Unlocked", "Always" secondsColoured: true, secondsWithColon: true, dateOnMain: "Long", // "Short", "Long", "ISO8601" dateOnSecs: "Year", // "No", "Year", "Weekday", LEGACY: true/false weekDay: true, + calWeek: true, upperCase: true, vectorFont: true, }); -/* */ +*/ -/* OR (also for development purposes) +// OR (also for development purposes) +/* require('Storage').erase(SETTINGSFILE); -/* */ +*/ // Helper method for loading the settings function def(value, def) { @@ -60,6 +64,7 @@ function loadSettings() { dateOnMain = def(settings.dateOnMain, "Long"); dateOnSecs = def(settings.dateOnSecs, "Year"); weekDay = def(settings.weekDay, true); + calWeek = def(settings.calWeek, false); upperCase = def(settings.upperCase, true); vectorFont = def(settings.vectorFont, false); @@ -99,6 +104,18 @@ function isoStr(date) { return date.getFullYear() + "-" + ("0" + (date.getMonth() + 1)).substr(-2) + "-" + ("0" + date.getDate()).substr(-2); } +function ISO8601calWeek(date) { //copied from: https://gist.github.com/IamSilviu/5899269#gistcomment-3035480 + var tdt = new Date(date.valueOf()); + var dayn = (date.getDay() + 6) % 7; + tdt.setDate(tdt.getDate() - dayn + 3); + var firstThursday = tdt.valueOf(); + tdt.setMonth(0, 1); + if (tdt.getDay() !== 4) { + tdt.setMonth(0, 1 + ((4 - tdt.getDay()) + 7) % 7); + } + return 1 + Math.ceil((firstThursday - tdt) / 604800000); +} + function doColor() { return !isBangle1 && !Bangle.isLocked() && secondsColoured; } @@ -169,11 +186,14 @@ function draw() { else g.setFont("6x8", 2); g.drawString(dateStr, x, y); - if (weekDay) { - var dowStr = require("locale").dow(date); + if (weekDay || calWeek) { + var dowwumStr = require("locale").dow(date); + dowwumStr = "thursday"; + if (calWeek) + dowwumStr = (weekDay ? dowwumStr.substr(0,Math.min(dowwumStr.length,6)) + (dowwumStr.length>=6 ? "." : "") : "week ") + "#" + ISO8601calWeek(date); if (upperCase) - dowStr = dowStr.toUpperCase(); - g.drawString(dowStr, x, y + (vectorFont ? 26 : 16)); + dowwumStr = dowwumStr.toUpperCase(); + g.drawString(dowwumStr, x, y + (vectorFont ? 26 : 16)); } } diff --git a/apps/antonclk/settings.js b/apps/antonclk/settings.js index 08fde512e..293aa0438 100644 --- a/apps/antonclk/settings.js +++ b/apps/antonclk/settings.js @@ -47,6 +47,14 @@ writeSettings(); } }, + "Show Weeknumber": { + value: (settings.weekNum !== undefined ? settings.weekNum : true), + format: v => v ? "On" : "Off", + onchange: v => { + settings.weekNum = v; + writeSettings(); + } + }, "Uppercase": { value: (settings.upperCase !== undefined ? settings.upperCase : false), format: v => v ? "On" : "Off", From d06283137995b78bb126e1861a6a2a81f0d80c1a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 10 Jan 2022 08:47:52 +0000 Subject: [PATCH 121/122] Changelog for #1240 0.41: Add Keyboard and Mouse Bluetooth HID option --- apps.json | 2 +- apps/boot/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 2493ac6cb..2a51fc0ae 100644 --- a/apps.json +++ b/apps.json @@ -16,7 +16,7 @@ { "id": "boot", "name": "Bootloader", - "version": "0.40", + "version": "0.41", "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", "icon": "bootloader.png", "type": "bootloader", diff --git a/apps/boot/ChangeLog b/apps/boot/ChangeLog index d6619822b..702a8091e 100644 --- a/apps/boot/ChangeLog +++ b/apps/boot/ChangeLog @@ -44,3 +44,4 @@ 0.38: Option to log to file if settings.log==2 0.39: Fix passkey support (fix https://github.com/espruino/Espruino/issues/2035) 0.40: Bootloader now rebuilds for new firmware versions +0.41: Add Keyboard and Mouse Bluetooth HID option From eaaddae9465af1c1bcc3c409b874f4806343c498 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 10 Jan 2022 14:06:50 +0000 Subject: [PATCH 122/122] fix broken instagram icon --- apps/messages/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messages/app.js b/apps/messages/app.js index e36bb699e..6e51c2b33 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -83,7 +83,7 @@ function getMessageImage(msg) { if (s=="calendar") return atob("GBiBAAAAAAAAAAAAAA//8B//+BgAGBgAGBgAGB//+B//+B//+B9m2B//+B//+Btm2B//+B//+Btm+B//+B//+A//8AAAAAAAAAAAAA=="); if (s=="facebook") return getFBIcon(); if (s=="hangouts") return atob("FBaBAAH4AH/gD/8B//g//8P//H5n58Y+fGPnxj5+d+fmfj//4//8H//B//gH/4A/8AA+AAHAABgAAAA="); - if (s=="instagram") return atob("GBiBAf////////////////wAP/n/n/P/z/f/b/eB7/c87/d+7/d+7/d+7/d+7/c87/eB7/f/7/P/z/n/n/wAP////////////////w=="); + if (s=="instagram") return atob("GBiBAAAAAAAAAAAAAAAAAAP/wAYAYAwAMAgAkAh+EAjDEAiBEAiBEAiBEAiBEAjDEAh+EAgAEAwAMAYAYAP/wAAAAAAAAAAAAAAAAA=="); if (s=="gmail") return getNotificationImage(); if (s=="google home") return atob("GBiCAAAAAAAAAAAAAAAAAAAAAoAAAAAACqAAAAAAKqwAAAAAqroAAAACquqAAAAKq+qgAAAqr/qoAACqv/6qAAKq//+qgA6r///qsAqr///6sAqv///6sAqv///6sAqv///6sA6v///6sA6v///qsA6qqqqqsA6qqqqqsA6qqqqqsAP7///vwAAAAAAAAAAAAAAAAA=="); if (s=="mail") return getNotificationImage();