From 13525cd11dca59b47c815ae909637c4720bd003b Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 15 Dec 2021 22:11:18 +0000 Subject: [PATCH 001/476] Change to skin temp characteristic. Add logging --- apps/coretemp/boot.js | 64 +++++++++++++++++++++++++----------- apps/coretemp/coretemp.js | 24 +++++++++----- apps/recorder/interface.html | 6 ++++ apps/recorder/widget.js | 28 ++++++++++++++++ 4 files changed, 93 insertions(+), 29 deletions(-) diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 59e227dad..a73c67b47 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -1,23 +1,47 @@ (function() { - var gatt; - - //Would it be better to scan by uuid rather than name? - NRF.requestDevice({ timeout: 20000, filters: [{ name: 'CORE [a]' }] }).then(function(device) { - return device.gatt.connect(); - }).then(function(g) { - gatt = g; - return gatt.getPrimaryService("1809"); - }).then(function(service) { - return service.getCharacteristic("2A1C"); - }).then(function(characteristic) { - characteristic.on('characteristicvaluechanged', function(event) { - var dv = event.target.value; - var core = (dv.buffer[2]*256+dv.buffer[1])/100; - Bangle.emit('Core',{ - temp:core - }); - }); - return characteristic.startNotifications(); - }).then(function() { + +var state = {gatt : null, primary : null, temp : null, data : null}; +// Would it be better to scan by uuid rather than name? +NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) + // NRF.requestDevice({timeout : 20000, filters : [ {services : + // '1809','2100'} ]}) + .then(function(device) { + return device.gatt.connect(); + }) + .then(function(g) { + state.gatt = g; + return state.gatt + .getPrimaryService('00002100-5b1e-4347-b07c-97b514dae121') + .then(function(service) { + state.primary = service; + return state.primary.getCharacteristic( + '00002101-5b1e-4347-b07c-97b514dae121'); + }) + .then(function(c) { + state.data = c; + state.data.on('characteristicvaluechanged', function(event) { + var dv = event.target.value; + var flags = dv.buffer[0]; + var unit, core = -1, skin = -1; + + if (flags & 8) { + unit = "F"; + } else { + unit = "C"; + } + + if (flags & 1) + skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; + if (flags & 2) + core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + + Bangle.emit('CoreTemp', {core : core, skin : skin, unit : unit}); + }); + return c.startNotifications(); + }) + .catch(function(e) { + E.showMessage(e.toString(), "ERROR"); + console.log(e); + }); }); })(); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 226508c83..1856057a4 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -1,19 +1,25 @@ + + Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); -var btm = g.getHeight()-1; +var btm = g.getHeight() - 1; function onCore(c) { - var px = g.getWidth()/2; - g.setFontAlign(0,0); - g.clearRect(0,24,g.getWidth(),80); - var str = c.temp + "C"; - g.setFontVector(40).drawString(str,px,45); + var px = g.getWidth() / 2; + g.setFontAlign(0, 0); + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + + var core = "Core: " + c.core + c.unit; + var skin = "Skin: " + c.skin + c.unit; + + g.setFontVector(24).drawString(core, px, 45); + g.setFontVector(24).drawString(skin, px, 65); } -Bangle.on('Core', onCore); +Bangle.on('CoreTemp', onCore); g.clear(); Bangle.loadWidgets(); Bangle.drawWidgets(); -g.reset().setFont("6x8",2).setFontAlign(0,0); -g.drawString("Please wait...",g.getWidth()/2,g.getHeight()/2 - 16); +g.reset().setFont("6x8", 2).setFontAlign(0, 0); +g.drawString("Please wait...", g.getWidth() / 2, g.getHeight() / 2 - 16); diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index ad0de4887..81ce71e5d 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -19,6 +19,9 @@ ${track[0].Heartrate!==undefined ? ` Step Count`:``} +${track[0].Core!==undefined ? ` + Core Temp + `:``} @@ -37,6 +40,9 @@ ${track.map(pt=>` ${0|pt.Heartrate}\n`).join("") ${track[0].Steps!==undefined ? ` ${track.map(pt=>` ${0|pt.Steps}\n`).join("")} `:``} +${track[0].Core!==undefined ? ` +${track.map(pt=>` ${0|pt.Core}\n`).join("")} + `:``} diff --git a/apps/recorder/widget.js b/apps/recorder/widget.js index 09893bbb7..144164f4c 100644 --- a/apps/recorder/widget.js +++ b/apps/recorder/widget.js @@ -82,6 +82,34 @@ draw : (x,y) => g.setColor(hasBPM?"#f00":"#888").drawImage(atob("DAyBAAAAAD/H/n/n/j/D/B+AYAAAAA=="),x,y) }; }, + + temp:function() { + var temp = 0; + var hasCore = false; + function onCore(c) { + temp=c.core; + hasCore = true; + } + return { + name : "Core", + fields : ["Core"], + getValues : () => { + var r = temp; + return r; + }, + start : () => { + hasCore = false; + Bangle.on('CoreTemp', onCore); +// Bangle.setHRMPower(1,"recorder"); + }, + stop : () => { + hasCore = false; + Bangle.removeListener('CoreTemp', onCore); +// Bangle.setHRMPower(0,"recorder"); + }, + draw : (x,y) => g.reset().drawImage(atob("DAyBAAADDHnnnnnnnnnnjDmDnDnAAA=="),x,y) + }; + }, steps:function() { var lastSteps = 0; return { From 6d9c95045aa7c6c7a08aa3b3f81c5ec8be5acc23 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 15 Dec 2021 22:19:58 +0000 Subject: [PATCH 002/476] Increase versions --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index c379a1de4..595603578 100644 --- a/apps.json +++ b/apps.json @@ -768,7 +768,7 @@ "id": "recorder", "name": "Recorder (BETA)", "shortName": "Recorder", - "version": "0.04", + "version": "0.05", "description": "Record GPS position, heart rate and more in the background, then download to your PC.", "icon": "app.png", "tags": "tool,outdoors,gps,widget", @@ -4960,7 +4960,7 @@ { "id": "coretemp", "name": "Core Temp Display", - "version": "0.01", + "version": "0.02", "description": "Display CoreTemp device sensor data", "icon": "coretemp.png", "type": "app", From b1e4b82ecc844902e33ca94731c5b7f1e4667782 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Thu, 16 Dec 2021 21:34:06 +0000 Subject: [PATCH 003/476] fix temp --- apps/recorder/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/recorder/widget.js b/apps/recorder/widget.js index 144164f4c..0c86ff09a 100644 --- a/apps/recorder/widget.js +++ b/apps/recorder/widget.js @@ -94,7 +94,7 @@ name : "Core", fields : ["Core"], getValues : () => { - var r = temp; + var r = [temp]; return r; }, start : () => { From c31997936604994268fddee981c2f9add4482c17 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 16 Dec 2021 17:05:12 -0800 Subject: [PATCH 004/476] Update README.md --- apps/dtlaunch/README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/dtlaunch/README.md b/apps/dtlaunch/README.md index ba2301d91..d9119c50c 100644 --- a/apps/dtlaunch/README.md +++ b/apps/dtlaunch/README.md @@ -1,7 +1,14 @@ # Desktop style App Launcher +Bangle 1: ![](screenshot.jpg) +Bangle 2: +![shot1](https://user-images.githubusercontent.com/89286474/146471756-ec6d16de-6916-4fde-b991-ba88c2c8fa1a.png) +![shot2](https://user-images.githubusercontent.com/89286474/146471758-3a9fce80-e047-4c7a-829a-e780c764b921.png) +![shot3](https://user-images.githubusercontent.com/89286474/146471760-5497fd1b-8e82-4fd5-a4e3-4734701a7dbd.png) + + In the picture above, the Settings app is selected. ## Controls- Bangle @@ -21,4 +28,4 @@ In the picture above, the Settings app is selected. **Swipe Left** - move to next page of app icons -**Swipe Right** - move to previous page of app icons \ No newline at end of file +**Swipe Right** - move to previous page of app icons From 21e77411cabe79ee57f5a157b626d7943471babd Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 16 Dec 2021 17:05:27 -0800 Subject: [PATCH 005/476] Update README.md --- apps/dtlaunch/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/dtlaunch/README.md b/apps/dtlaunch/README.md index d9119c50c..7ecb58e11 100644 --- a/apps/dtlaunch/README.md +++ b/apps/dtlaunch/README.md @@ -1,9 +1,11 @@ # Desktop style App Launcher Bangle 1: + ![](screenshot.jpg) Bangle 2: + ![shot1](https://user-images.githubusercontent.com/89286474/146471756-ec6d16de-6916-4fde-b991-ba88c2c8fa1a.png) ![shot2](https://user-images.githubusercontent.com/89286474/146471758-3a9fce80-e047-4c7a-829a-e780c764b921.png) ![shot3](https://user-images.githubusercontent.com/89286474/146471760-5497fd1b-8e82-4fd5-a4e3-4734701a7dbd.png) From 163c0e3abdabb6edb2c6bd73b34486799ebdb24f Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Thu, 16 Dec 2021 17:05:53 -0800 Subject: [PATCH 006/476] Update README.md --- apps/dtlaunch/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/dtlaunch/README.md b/apps/dtlaunch/README.md index 7ecb58e11..bea20ef65 100644 --- a/apps/dtlaunch/README.md +++ b/apps/dtlaunch/README.md @@ -4,6 +4,8 @@ Bangle 1: ![](screenshot.jpg) +In the picture above, the Settings app is selected. + Bangle 2: ![shot1](https://user-images.githubusercontent.com/89286474/146471756-ec6d16de-6916-4fde-b991-ba88c2c8fa1a.png) @@ -11,7 +13,6 @@ Bangle 2: ![shot3](https://user-images.githubusercontent.com/89286474/146471760-5497fd1b-8e82-4fd5-a4e3-4734701a7dbd.png) -In the picture above, the Settings app is selected. ## Controls- Bangle **BTN1** - move backward through app icons on a page From 48601f2dde8a1d30751e887ef2ad9276b3548770 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Fri, 17 Dec 2021 14:08:42 +0100 Subject: [PATCH 007/476] Create app.js --- apps/miniclock/app.js | 55 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 apps/miniclock/app.js diff --git a/apps/miniclock/app.js b/apps/miniclock/app.js new file mode 100644 index 000000000..9fdbab985 --- /dev/null +++ b/apps/miniclock/app.js @@ -0,0 +1,55 @@ +const digits = [ +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVqlVVVVVVVVVVVVVaqqqqpVVVVVVVVVVWqqqqqqqVVVVVVVVVWqqqAKqqpVVVVVVVVaqgAAAACqpVVVVVVVaqAAAAAACqlVVVVVVaoAAAAAAACqVVVVVVaoAAAAAAAAKpVVVVVaoAAAAAAAAAqlVVVVaoAAAAAAAAACqVVVVWoAAAAAAAAAAKlVVVWoAAAAAAAAAAAqVVVWqAAAAAAAAAAAKpVVVqAAAAACgAAAAAqVVVagAAAAKqgAAAAKlVVagAAAAqqqgAAAAqVVWoAAAAKpaoAAAAKlVVqAAAAKlVagAAAAqVVqAAAACpVWoAAAAKlVagAAACpVVagAAACpVWoAAAAqVVWoAAAAqVVqAAAAqVVVagAAAKlVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVagAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVWoAAACpVqAAAAKlVVVqAAAAqVagAAAKlVVVagAAAKlWoAAACpVVVWoAAACpVqAAAAqVVVVqAAAAqVagAAAKlVVVagAAAKlWoAAACpVVVWoAAACpVqAAAAqVVVVqAAAAqVagAAACpVVVagAAAKlWoAAAAqVVVWoAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVagAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlVqAAAAqVVVagAAACpVagAAACpVVWoAAACpVWoAAAAqVVWoAAAAqVVqAAAAKlVVqAAAAKlVagAAAAqVVqAAAAKlVVqAAAAKpVqgAAACpVVagAAAAqqqgAAAAqVVVqAAAACqqgAAAAKlVVagAAAACqAAAAAKlVVWoAAAAAAAAAAACpVVVagAAAAAAAAAACpVVVWqAAAAAAAAAACqVVVVagAAAAAAAAAAqVVVVVqAAAAAAAAAAqVVVVVaoAAAAAAAAAqlVVVVVqgAAAAAAAAqlVVVVVWqgAAAAAAAqlVVVVVVaqAAAAAACqlVVVVVVVaqgAAAAqqlVVVVVVVVqqqqqqqqVVVVVVVVVVqqqqqqpVVVVVVVVVVVaqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVaqqqVVVVVVVVVVVVVqqqqqVVVVVVVVVVVWqqqqqpVVVVVVVVVVaqgAAAqVVVVVVVVVVaqAAAACpVVVVVVVVVqoAAAAAqVVVVVVVVVqoAAAAAKlVVVVVVVWqgAAAAACpVVVVVVVaqgAAAAAAqVVVVVVVaqAAAAAAAKlVVVVVVaoAAAAAAACpVVVVVVqoAAAAAAAAqVVVVVVaoAAAAAAAAKlVVVVVagAAAAAAAACpVVVVVWoAAAAAAAAAqVVVVVVqAAAAAAAAAKlVVVVVagAAAAAAAACpVVVVVWoAAAAAAAAAqVVVVVVqAAAAAAAAAKlVVVVVagAAAgAAAACpVVVVVWoAACogAAAAqVVVVVVagAKqoAAAAKlVVVVVWqqqqagAAACpVVVVVVaqqpWoAAAAqVVVVVVVaqlVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVaqqqAAAAAqqqpVVVWqqqqgAAAAKqqqpVVWqqqqAAAAAAKqqqlVVqgAAAAAAAAAAACpVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVWoAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWqAAAAAAAAAAAACqVVaqqqqqqqqqqqqqqVVVqqqqqqqqqqqqqqVVVWqqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVWqVVVVVVVVVVVVVaqqqqqlVVVVVVVVVaqqqqqqqqVVVVVVVVqqqqoAqqqqVVVVVVWqqgAAAAAKqpVVVVVaqgAAAAAAAAqpVVVVaqAAAAAAAAACqlVVVWoAAAAAAAAAACpVVVWoAAAAAAAAAAAKlVVVqAAAAAAAAAAACqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAAqVVWoAAAKqqAAAAAAKlVVagACqqqqAAAAACpVVWqqqqqqqqAAAAAqVVVaqqqlVVqgAAAAKlVVVaqpVVVVqAAAACpVVVVVVVVVVagAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVqAAAACpVVVVVVVVVVagAAAAqVVVVVVVVVVagAAAAqVVVVVVVVVVaoAAAAKlVVVVVVVVVaoAAAACpVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACqVVVVVVVVVWoAAAAAqVVVVVVVVVWqAAAAAqVVVVVVVVVWqAAAAAqlVVVVVVVVWqAAAAAKlVVVVVVVVWqAAAAAKlVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAqpVVVVVVVVWqAAAAACpVVVVVVVVWqAAAAAKlVVVVVVVVVqAAAAAACqqqqpVVVVqAAAAAAKqqqqqpVVVqgAAAAAAKqqqqqpVVagAAAAAAAAAAACqVVWoAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVWoAAAAAAAAAAAACpVVqAAAAAAAAAAAAAqVVaoAAAAAAAAAAAAqVVVqqqqqqqqqqqqqqlVVWqqqqqqqqqqqqqlVVVaqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVapVVVVVVVVVVVVVaqqqqqlVVVVVVVVVaqqqqqqqqVVVVVVVWqqqqgCqqqpVVVVVVaqqgAAAAAKqpVVVVVaqgAAAAAAACqpVVVVaoAAAAAAAAACqlVVVaoAAAAAAAAAACqVVVWoAAAAAAAAAAAKlVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAAqVVVqAAAKqqgAAAAAKlVVaoAKqqqqgAAAACpVVVqqqqqqqqAAAAAqVVVWqqqlVVaoAAAAKlVVVaqlVVVVqAAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVaoAAAAqVVVVVVVVaqqqAAAAKlVVVVVVaqqqoAAAAKlVVVVVVaqqqgAAAAKpVVVVVVaqgAAAAAAKpVVVVVVaoAAAAAAAKpVVVVVVWoAAAAAAACpVVVVVVVqAAAAAAACpVVVVVVVagAAAAAAAqVVVVVVVWoAAAAAAACpVVVVVVVqAAAAAAAAqpVVVVVVagAAAAAAACqlVVVVVWoAAAAAAAACqVVVVVVaoAAAAAAAAKpVVVVVWqqqqgAAAAAqVVVVVVWqqqqgAAAACpVVVVVVaqqqqgAAAAqVVVVVVVVVVaqAAAAKlVVVVVVVVVVagAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVlVVVVVVqAAAAKlVVaqqVVVVVqAAAACpVVaqqqpVVWqgAAAAqVVaqKqqqqqqgAAAAKlVaoAAqqqqqAAAAACpVaoAAACqqoAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAAKpVVqAAAAAAAAAAAACpVVagAAAAAAAAAAAKpVVVqAAAAAAAAAAAKqVVVaqAAAAAAAAAAKpVVVVqqAAAAAAAACqpVVVVVqqoAAAAACqqpVVVVVWqqqqqqqqqqlVVVVVVVqqqqqqqqpVVVVVVVVVWqqqqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVaqqlVVVVVVVVVVVVVqqqqlVVVVVVVVVVVVqqqqqVVVVVVVVVVVVqgAAKpVVVVVVVVVVVqgAAAqVVVVVVVVVVVqgAAACpVVVVVVVVVVqgAAAAqVVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVaoAAAAAqVVVVVVVVVWoAAAAAKlVVVVVVVVWoAAAAACpVVVVVVVVWqAAAAAAqVVVVVVVVVqAAAAAAKlVVVVVVVVqAAAAAACpVVVVVVVVqgAAAAAAqVVVVVVVVagAAAAAAKlVVVVVVVagAAAAAACpVVVVVVVaoAAAAAAAqVVVVVVVaoAAAAAAAKlVVVVVVWoAAAAAAACpVVVVVVWoAAAAAAAAqVVVVVVWqAAAAAAAAKlVVVVVVqAAAAAAAACpVVVVVVqAAAAAAAAAqVVVVVVqgAAAAAAAAKlVVVVVagAAAgAAAACpVVVVVagAACogAAAAqVVVVVaoAACqoAAAAKlVVVVWoAAAqagAAACpVVVVWoAAAqWoAAAAqVVVVWqAAAqlqAAAAKlVVVVqAAAKlagAAACpVVVVqAAAKlWoAAAAqVVVVqgAAKpVqAAAAKlVVVagAACpVagAAACpVVVagAACpVWoAAAAqVVVaoAAAqVVqAAAAKlVVWoAAACqqqAAAAAqpVVqAAAAqqqgAAAAKqpVqAAAAAqqAAAAAAKqpagAAAAAAAAAAAAACqWoAAAAAAAAAAAAAACpqAAAAAAAAAAAAAAAqagAAAAAAAAAAAAAAKmoAAAAAAAAAAAAAACpqAAAAAAAAAAAAAAAqagAAAAAAAAAAAAAAKlqAAAAAAAAAAAAAACpaqAAAAAAAAAAAAACpVqqqqqqqgAAAAACqqVVqqqqqqqgAAAAKqqVVVqqqqqqoAAAACqpVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVVqAAACpVVVVVVVVVVVagAAAqVVVVVVVVVVVVqgACqVVVVVVVVVVVVaqqqqlVVVVVVVVVVVVaqqqVVVVVVVVVVVVVVqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVaqqqqqqqqpVVVVVVaqqqqqqqqqqqlVVVVaqqqqqqqqqqqqVVVVaqgAAAAAAAACqpVVVaoAAAAAAAAAAAqlVVWoAAAAAAAAAAACpVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAACpVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAKqVVVWoAAAACqqqqqqqlVVVqAAAAKqqqqqqqVVVVagAAACqqqqqqlVVVVWoAAACpVVVVVVVVVVVqAAAAqVVVVVVVVVVVagAAAKlVVVVVVVVVVWoAAACpVVVVVVVVVVVqAAAAqVVVVVVVVVVVagAAACqqqqqVVVVVVWoAAAAqqqqqqlVVVVVqAAAAAqqqqqqlVVVVagAAAAAAAAAqqVVVVWoAAAAAAAAAAKpVVVVqAAAAAAAAAAAqlVVVagAAAAAAAAAACqVVVWoAAAAAAAAAAAKpVVVqAAAAAAAAAAAAqlVVagAAAAAAAAAAACpVVWoAAAAAAAAAAAAKlVVqAAAAAAAAAAAACpVVagAAAACoAAAAAAKlVWoAAACqqqAAAAACpVVqAAAKqqqqAAAAAqVVWqgqqqpWqoAAAAKlVVqqqqpVVVqAAAACpVVWqqqlVVVWoAAAAqVVVVaVVVVVVqAAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAAKlVVWqpVVVVVagAAACpVVaqqqVVVVaoAAAAqVVaqqqqlVVqoAAAAKlVWoACqqqqqoAAAACpVWoAAAqqqqgAAAAAqVVqAAAAKqqAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAACpVVqAAAAAAAAAAAACpVVagAAAAAAAAAAACqVVVqAAAAAAAAAAACqVVVaoAAAAAAAAAAKqVVVVqgAAAAAAAAAKqVVVVWqoAAAAAAAAqpVVVVVaqqgAAAAAqqpVVVVVVaqqqqqqqqqlVVVVVVVWqqqqqqqqVVVVVVVVVVaqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVqVVVVVVVVVVVVVVqqqqqpVVVVVVVVVVqqqqqqqqVVVVVVVVWqqqqAqqqqlVVVVVVWqqAAAAACqqlVVVVVaqAAAAAAAAqpVVVVVaqAAAAAAAAAKlVVVVaoAAAAAAAAACqVVVVqoAAAAAAAAAAKlVVVaoAAAAAAAAAACpVVVagAAAAAAAAAAAqVVVaoAAAAAAAAAAAKlVVaoAAAAAAAAAAACpVVWoAAAAAAAAAAAAqVVWoAAAAACqqqAAAqVVVqAAAAAKqqqqoAqlVVqAAAAAqqqqqqqqlVVagAAAAqpVVVqqqlVVagAAAAqlVVVVWqVVVWoAAAAqlVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAAKlVVVVVVVVVVagAAACpVaqqqVVVVVWoAAAAqVqqqqqVVVVVqAAAAqWqqqqqqVVVVagAAAImqgAAAqpVVVWoAAAAoqAAAAAqlVVVqAAAAIqAAAAACqlVVqAAAAAIAAAAAAKpVVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAACqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAAqVWoAAAAAAAAAAAAAKlVqAAAAAACqgAAAACpVagAAAAAKqqgAAAAKlWoAAAAAKqqqAAAACpVagAAAACpVaoAAAAqVWoAAAACpVVqAAAAKlVqAAAAAqVVWoAAACpVagAAAAqVVVqAAAAKlWoAAAAKlVVagAAACpVqAAAACpVVWoAAAAqVagAAAAqVVVqAAAAKlVqAAAAKlVVagAAAKlVagAAACpVVWoAAACpVWoAAAAKlVVqAAAAqVVagAAACpVVqAAAAKlVWoAAAAKlVqgAAACpVVqAAAACqqqgAAAAqVVWoAAAAKqqgAAAAqVVVqAAAAAKqAAAAAKlVVWoAAAAAAAAAAAKlVVVqgAAAAAAAAAACpVVVWoAAAAAAAAAACpVVVVagAAAAAAAAACqVVVVWqAAAAAAAAACqVVVVVaqAAAAAAAACqVVVVVVqoAAAAAAACqVVVVVVVqoAAAAAAKqVVVVVVVWqqAAAACqqVVVVVVVVWqqqqqqqpVVVVVVVVVWqqqqqqlVVVVVVVVVVVqqqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqlVVVVqqqqqqqqqqqqqqVVVqqqqqqqqqqqqqqpVVqqAAAAAAAAAAAKqlVqgAAAAAAAAAAAACqVagAAAAAAAAAAAAAKlWoAAAAAAAAAAAAAAqVqAAAAAAAAAAAAAAKlagAAAAAAAAAAAAACpWoAAAAAAAAAAAAAAqVqAAAAAAAAAAAAAAKlagAAAAAAAAAAAAACpWqAAAAAAAAAAAAAAqVaqgAAAAAAAAAAAAqVVqqqqqqqqAAAAAAKlVWqqqqqqqqAAAAACpVVVaqqqqqqAAAAACpVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqgAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAACqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVagAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAAKpVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVWqAAAAAqVVVVVVVVVVqAAAAAqlVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVWoAAAAKpVVVVVVVVVVqAAAACpVVVVVVVVVVqAAAACpVVVVVVVVVVWoAAACqVVVVVVVVVVVqAAACqVVVVVVVVVVVaoAACqVVVVVVVVVVVVqqqqqVVVVVVVVVVVVWqqqqVVVVVVVVVVVVVWqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVqVVVVVVVVVVVVVWqqqqqpVVVVVVVVVVqqqqqqqqlVVVVVVVWqqqqAqqqqlVVVVVVaqoAAAAACqqVVVVVVaqAAAAAAAAKqVVVVVaoAAAAAAAAAqpVVVVaoAAAAAAAAAAqlVVVaoAAAAAAAAAACqVVVaoAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVWoAAAAAAAAAAAAKlVVqAAAAAAAAAAAAAqVVagAAAACqqAAAAAKlVagAAAAKqqqAAAACpVWoAAAAKqqqoAAAAqVVqAAAAKpVVqAAAAKlVagAAACpVVWoAAAAqVWoAAACpVVVqAAAAKlVqAAAAqVVVagAAAKlVagAAAKlVVWoAAACpVWoAAACpVVVqAAAAqVVagAAAKlVVagAAAKlVWoAAACqVVagAAACpVVqAAAAKqqqoAAACpVVWoAAAAqqqoAAAAqVVVqgAAAAqqgAAAAqVVVWqAAAAAAAAAAAqlVVVaoAAAAAAAAAAqlVVVVqAAAAAAAAAAqlVVVVWoAAAAAAAAAKlVVVVVqAAAAAAAAAKlVVVVVqAAAAAAAAAAKlVVVVqgAAAAAAAAAKqVVVWqgAAAAAAAAAAKpVVVqgAAAAAAAAAAAqlVVqAAAAAAAAAAAACqVVqgAAAAKqqAAAAAKlVagAAAAqqqqAAAAAqVWoAAAAqqqqqAAAAKlWoAAAAqlVVqoAAACpVqAAAAKlVVVqAAAAKlagAAAKlVVVWoAAACpWoAAACpVVVVqAAAAqVqAAACpVVVVagAAAKlqAAAAKlVVVWoAAACpagAAACpVVVVqAAAAqVqAAAAKlVVVqAAAAKlagAAACqVVWqgAAACpWoAAAAKqqqqgAAAAqVqAAAAAqqqqAAAAAKlagAAAAAqqoAAAAAKlVqAAAAAAAAAAAAACpVagAAAAAAAAAAAACpVVqAAAAAAAAAAAAAqVVaoAAAAAAAAAAAAqVVVqgAAAAAAAAAAAqlVVWqAAAAAAAAAACqlVVVaqAAAAAAAAACqlVVVVqqAAAAAAAAKqVVVVVVqqoAAAAAKqqVVVVVVVqqqqqqqqqpVVVVVVVVqqqqqqqqlVVVVVVVVVWqqqqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVValVVVVVVVVVVVVVWqqqqqVVVVVVVVVVVqqqqqqqVVVVVVVVVWqqqgKqqqVVVVVVVVWqoAAAAAqqVVVVVVVaqAAAAAAAqpVVVVVVaqAAAAAAAAqpVVVVVaoAAAAAAAACqVVVVVWoAAAAAAAAACpVVVVWoAAAAAAAAAAqlVVVWqAAAAAAAAAACqVVVVqAAAAAAAAAAAKpVVVqAAAAAAAAAAAAqVVVagAAAAKqgAAAACpVVagAAAAqqqgAAAAqVVWoAAAAKqqoAAAACpVVqAAAAKlVagAAAAqVVqAAAAKpVWqAAAAKlVagAAACpVVagAAACpVWoAAACpVVVqAAAAKlVqAAAAqVVVagAAACpVagAAAKlVVWoAAAAqVWoAAACpVVVqAAAACpVqAAAAqVVVagAAAAqVagAAACpVVagAAAAKlWoAAAAqVVWoAAAACpVqAAAACpVWoAAAAAqVagAAAAqlWqAAAAAKlVqAAAACqqqAAAAACpVagAAAAKqqAAAAAAqVWoAAAAAKoAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVagAAAAAAAAAAAAKlVWqAAAAAAAAAAAACpVVagAAAAAACAAAAAqVVVqAAAAAAKiAAAAKlVVaqAAAAAKigAAACpVVVqoAAAAKpiAAAAqVVVVqoAAAqpagAAAKlVVVWqqqqqpagAAACpVVVVWqqqqlWoAAACpVVVVVWqqqVVqAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVqgAAACpVVVVVVVVVVqgAAACpVVVaqlVVVVqgAAAAqVVVqqqqVVWqgAAAAKlVVqqqqqqqqgAAAAKlVVagAKqqqqAAAAACpVVagAAAqqoAAAAACpVVWoAAAAAAAAAAACqVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAqVVVWoAAAAAAAAAAAqlVVVqAAAAAAAAAAAqlVVVagAAAAAAAAAAqlVVVWoAAAAAAAAACqlVVVVagAAAAAAAACqlVVVVWqoAAAAAAAqqVVVVVVaqqAAAAAKqqVVVVVVVaqqqqqqqqpVVVVVVVVWqqqqqqqVVVVVVVVVVVqqqqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 25 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqlVVVVWqqqlVVVWqqqqlVVWqgAKqVVWqAAAKlVWqAAAAqVVqAAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAACpVWqAAAAqVVagAAAqlVVqgAAqlVVaqqqqlVVVaqqqlVVVVaqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqVVVVVqqqqVVVWqqqqpVVVqgAAqlVVqAAACqVVqgAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAqVVagAAAKlVWqAAAKlVVaqACqpVVVqqqqpVVVWqqqlVVVVVqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV "))} +]; + +var drawTimeout, savedOptions; + +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +function draw() { + var x = g.getWidth()/2; + var y = g.getHeight()/2-31; + //print(y); + g.reset(); + var date = new Date(); + var timeStr = require("locale").time(date,1); + // draw time + g.clearRect(0,y,g.getWidth()-1,y+73+24+18); + //use custom font spacing for overlapping digits + g.drawImage(digits[parseInt(date.getHours()/10)],0,y); + g.drawImage(digits[parseInt(date.getHours()%10)],37,y); + g.drawImage(digits[10],74,y); + g.drawImage(digits[parseInt(date.getMinutes()/10)],86,y); + g.drawImage(digits[parseInt(date.getMinutes()%10)],123,y); + // Draw day of the week + y += 73; + g.setFontAlign(0,-1).setFont("Teletext10x18Ascii"); + g.drawString(require("locale").dow(date).toUpperCase(),x,y); + // Draw Date + y += 24; + g.drawString(require('locale').date(new Date(),1),x,y); + queueDraw(); +} + +require("FontTeletext10x18Ascii").add(Graphics); +Bangle.setUI("clock"); +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +draw(); From 806f4280365842879f0480357d8cd46520bcaa55 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Fri, 17 Dec 2021 14:55:34 +0100 Subject: [PATCH 008/476] Update apps.json --- apps.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 109324fb6..f01d55004 100644 --- a/apps.json +++ b/apps.json @@ -5026,5 +5026,16 @@ "data": [ {"name":"circlesclock.json"} ] - } + }, + { "id": "miniclock", + "name": "Minimalist Clock", + "shortName" : "Minimalist Clock", + "icon": "app.png", + "description": "A Minimalist clockface with large Digits.", + "tags": "clock", + "storage": [ + {"name":"myappid.app.js","url":"app.js"}, + {"name":"myappid.img","url":"app-icon.js","evaluate":true} + ], +} ] From 8dd11ff68f8f9e36c4be65dc372cc2e39cfc5f2a Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Fri, 17 Dec 2021 14:58:17 +0100 Subject: [PATCH 009/476] Create app-icon.js --- apps/miniclock/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/miniclock/app-icon.js diff --git a/apps/miniclock/app-icon.js b/apps/miniclock/app-icon.js new file mode 100644 index 000000000..debedb27e --- /dev/null +++ b/apps/miniclock/app-icon.js @@ -0,0 +1 @@ +var img = require("heatshrink").decompress(atob("2GwgI74HIUB/4AC8AWNwAVTgNAAQIYBAANgCZUcuEAkAVRkWYgMQCqWokEICqMe1ERFaUC5EIK6RtBgqDGvyZMgSvCCqLbDFc2AK6mAQanwV6mIgDbTxEBFaUiFYJXSj3wgKDC/4AC8CvMQoIVUAH4A/AH4A/AH4A/AH4A/AD0eAokDwAECvgRF//ggEP//8BIn+AYMfBQsD//4BwIAB4AJBg4FDAYIVEh/AvkHBAMPGAImB4EH+EDEQN/Coc/gEcBwIGBBoMAnwCB/kHBQMPLosOBwUAvwCBvAYCh5SCGwUB+AVBBwQ+BBIYnBEAQHDDIUGAwRqBwEBEYUH3gKCEgRFCgwOCVYStDgYgDnhsDCoJsCG4KABCoQ9DPoLKECoxoCAoI2DhwCBDgQVEgHgBgQbCYIaGEK4gVBHARdCPAYGBDgQVFuAVIAgIXBCoVwCok4EgPggZDB/4VHvEP/4jBmAVBj/wHgQKBLgMGCoc8///JAMwmDvBvAVBg+D4AVGj/8SIUwI4M4ngOBg6GCCosPBAIVEOAIOBAIIMCCogDCsDkBDANwhizBAIIVCNogVEv4VBsEOCotgCoNUCosB/IVDhkAAIIVBuEDwP8CorkBCoUGCo/n9gVDQYK6BMoYTBIIcwZQOMCof/MAQVDK4q5BvweBCoLbCCoanBCYMGV4QVBJAQVBj4JBEYYVBYoUDCpE8AwIVI4+ACo94AwYVDI4MD/4LBCozsBCpEA/wVIbIJBGga6CAAM4CpJ7CCoRUBCrEYCpEPCogECFZJtCg7xCCoXgCpq8BCocA+AVDYpMB+AVEXIQVInwKC/4VED4MBqAVHh4SCn4VEjxgBLQIVGg//J4M4CoPgD4WAh+wCo4AB/CkBCokH+F+UwJ8CCoqMBjg5BsA1D/gTBCpDOBCosGn/gFYLUCCo8MBoUOfAIKBDoQVJEgI5BCozgCCoUCCoaGCuALBAIMBOoQVEj4GBnDbBMYM4jkAvxvB4AXCj/8O4X+TIMD4ClBnDZB//gj+ACoSJBCoP4v4+Bg+ATgMf/EB84hCgIXBXwIABCQLxBg6yCj/wGIN/CAMDFoYbBLoSICKgIABGIIEEC4IVCDISSCCogDCAgQVEEAaqEXQgICgYFCCoigBCpEeGQgVGBQYVET4IrEK4ppDCol4CpaVBNoz6BCob3DB4UHAwUPPgYHBQYbuBAYUPAIIGCj4vDAYI2DgF8AYU/wEeAwU9F4UfFALXEA4f/8E8j41C/gDBvwRC/4ADHYMf+P9/EP8EH+F/wEHJ4d/CwgABwF/+EDAoPAh4DBHoYAEj4tCPwV//xJCAYIA/AH4A/AHMP/n/gfw/kA4AABCsMMCAfDCssP4H/CQXDmEzNpoVUIIgVB+AHBCs3DhgABCso+B/gVlAFg6EdxgVWdwPAmEMgfwgYCBn4CBOBAVUgY5BCoM8SoMDAQPD5kMngVchnAgYWB5gGBHYMM5nAAQIVcCQLwCNoQCC5j3BQZIVVmBCBH4SdBgAWBZ4oVYh/8CoX/54FBBAM/AQLRBCracDJAgOICrgA/AH4A/AH4A/AH4A/AH4AJA")) From 670608ea2487d361748787225228d27ec1876bf2 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Fri, 17 Dec 2021 14:58:51 +0100 Subject: [PATCH 010/476] Update app-icon.js --- apps/miniclock/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/miniclock/app-icon.js b/apps/miniclock/app-icon.js index debedb27e..38b19c29a 100644 --- a/apps/miniclock/app-icon.js +++ b/apps/miniclock/app-icon.js @@ -1 +1 @@ -var img = require("heatshrink").decompress(atob("2GwgI74HIUB/4AC8AWNwAVTgNAAQIYBAANgCZUcuEAkAVRkWYgMQCqWokEICqMe1ERFaUC5EIK6RtBgqDGvyZMgSvCCqLbDFc2AK6mAQanwV6mIgDbTxEBFaUiFYJXSj3wgKDC/4AC8CvMQoIVUAH4A/AH4A/AH4A/AH4A/AD0eAokDwAECvgRF//ggEP//8BIn+AYMfBQsD//4BwIAB4AJBg4FDAYIVEh/AvkHBAMPGAImB4EH+EDEQN/Coc/gEcBwIGBBoMAnwCB/kHBQMPLosOBwUAvwCBvAYCh5SCGwUB+AVBBwQ+BBIYnBEAQHDDIUGAwRqBwEBEYUH3gKCEgRFCgwOCVYStDgYgDnhsDCoJsCG4KABCoQ9DPoLKECoxoCAoI2DhwCBDgQVEgHgBgQbCYIaGEK4gVBHARdCPAYGBDgQVFuAVIAgIXBCoVwCok4EgPggZDB/4VHvEP/4jBmAVBj/wHgQKBLgMGCoc8///JAMwmDvBvAVBg+D4AVGj/8SIUwI4M4ngOBg6GCCosPBAIVEOAIOBAIIMCCogDCsDkBDANwhizBAIIVCNogVEv4VBsEOCotgCoNUCosB/IVDhkAAIIVBuEDwP8CorkBCoUGCo/n9gVDQYK6BMoYTBIIcwZQOMCof/MAQVDK4q5BvweBCoLbCCoanBCYMGV4QVBJAQVBj4JBEYYVBYoUDCpE8AwIVI4+ACo94AwYVDI4MD/4LBCozsBCpEA/wVIbIJBGga6CAAM4CpJ7CCoRUBCrEYCpEPCogECFZJtCg7xCCoXgCpq8BCocA+AVDYpMB+AVEXIQVInwKC/4VED4MBqAVHh4SCn4VEjxgBLQIVGg//J4M4CoPgD4WAh+wCo4AB/CkBCokH+F+UwJ8CCoqMBjg5BsA1D/gTBCpDOBCosGn/gFYLUCCo8MBoUOfAIKBDoQVJEgI5BCozgCCoUCCoaGCuALBAIMBOoQVEj4GBnDbBMYM4jkAvxvB4AXCj/8O4X+TIMD4ClBnDZB//gj+ACoSJBCoP4v4+Bg+ATgMf/EB84hCgIXBXwIABCQLxBg6yCj/wGIN/CAMDFoYbBLoSICKgIABGIIEEC4IVCDISSCCogDCAgQVEEAaqEXQgICgYFCCoigBCpEeGQgVGBQYVET4IrEK4ppDCol4CpaVBNoz6BCob3DB4UHAwUPPgYHBQYbuBAYUPAIIGCj4vDAYI2DgF8AYU/wEeAwU9F4UfFALXEA4f/8E8j41C/gDBvwRC/4ADHYMf+P9/EP8EH+F/wEHJ4d/CwgABwF/+EDAoPAh4DBHoYAEj4tCPwV//xJCAYIA/AH4A/AHMP/n/gfw/kA4AABCsMMCAfDCssP4H/CQXDmEzNpoVUIIgVB+AHBCs3DhgABCso+B/gVlAFg6EdxgVWdwPAmEMgfwgYCBn4CBOBAVUgY5BCoM8SoMDAQPD5kMngVchnAgYWB5gGBHYMM5nAAQIVcCQLwCNoQCC5j3BQZIVVmBCBH4SdBgAWBZ4oVYh/8CoX/54FBBAM/AQLRBCracDJAgOICrgA/AH4A/AH4A/AH4A/AH4AJA")) +require("heatshrink").decompress(atob("2GwgI74HIUB/4AC8AWNwAVTgNAAQIYBAANgCZUcuEAkAVRkWYgMQCqWokEICqMe1ERFaUC5EIK6RtBgqDGvyZMgSvCCqLbDFc2AK6mAQanwV6mIgDbTxEBFaUiFYJXSj3wgKDC/4AC8CvMQoIVUAH4A/AH4A/AH4A/AH4A/AD0eAokDwAECvgRF//ggEP//8BIn+AYMfBQsD//4BwIAB4AJBg4FDAYIVEh/AvkHBAMPGAImB4EH+EDEQN/Coc/gEcBwIGBBoMAnwCB/kHBQMPLosOBwUAvwCBvAYCh5SCGwUB+AVBBwQ+BBIYnBEAQHDDIUGAwRqBwEBEYUH3gKCEgRFCgwOCVYStDgYgDnhsDCoJsCG4KABCoQ9DPoLKECoxoCAoI2DhwCBDgQVEgHgBgQbCYIaGEK4gVBHARdCPAYGBDgQVFuAVIAgIXBCoVwCok4EgPggZDB/4VHvEP/4jBmAVBj/wHgQKBLgMGCoc8///JAMwmDvBvAVBg+D4AVGj/8SIUwI4M4ngOBg6GCCosPBAIVEOAIOBAIIMCCogDCsDkBDANwhizBAIIVCNogVEv4VBsEOCotgCoNUCosB/IVDhkAAIIVBuEDwP8CorkBCoUGCo/n9gVDQYK6BMoYTBIIcwZQOMCof/MAQVDK4q5BvweBCoLbCCoanBCYMGV4QVBJAQVBj4JBEYYVBYoUDCpE8AwIVI4+ACo94AwYVDI4MD/4LBCozsBCpEA/wVIbIJBGga6CAAM4CpJ7CCoRUBCrEYCpEPCogECFZJtCg7xCCoXgCpq8BCocA+AVDYpMB+AVEXIQVInwKC/4VED4MBqAVHh4SCn4VEjxgBLQIVGg//J4M4CoPgD4WAh+wCo4AB/CkBCokH+F+UwJ8CCoqMBjg5BsA1D/gTBCpDOBCosGn/gFYLUCCo8MBoUOfAIKBDoQVJEgI5BCozgCCoUCCoaGCuALBAIMBOoQVEj4GBnDbBMYM4jkAvxvB4AXCj/8O4X+TIMD4ClBnDZB//gj+ACoSJBCoP4v4+Bg+ATgMf/EB84hCgIXBXwIABCQLxBg6yCj/wGIN/CAMDFoYbBLoSICKgIABGIIEEC4IVCDISSCCogDCAgQVEEAaqEXQgICgYFCCoigBCpEeGQgVGBQYVET4IrEK4ppDCol4CpaVBNoz6BCob3DB4UHAwUPPgYHBQYbuBAYUPAIIGCj4vDAYI2DgF8AYU/wEeAwU9F4UfFALXEA4f/8E8j41C/gDBvwRC/4ADHYMf+P9/EP8EH+F/wEHJ4d/CwgABwF/+EDAoPAh4DBHoYAEj4tCPwV//xJCAYIA/AH4A/AHMP/n/gfw/kA4AABCsMMCAfDCssP4H/CQXDmEzNpoVUIIgVB+AHBCs3DhgABCso+B/gVlAFg6EdxgVWdwPAmEMgfwgYCBn4CBOBAVUgY5BCoM8SoMDAQPD5kMngVchnAgYWB5gGBHYMM5nAAQIVcCQLwCNoQCC5j3BQZIVVmBCBH4SdBgAWBZ4oVYh/8CoX/54FBBAM/AQLRBCracDJAgOICrgA/AH4A/AH4A/AH4A/AH4AJA")) From 425501f7a7cd4ef7f3f3608a1c426089c4a347ee Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Fri, 17 Dec 2021 15:01:18 +0100 Subject: [PATCH 011/476] Update apps.json --- apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps.json b/apps.json index f01d55004..9bd426bd3 100644 --- a/apps.json +++ b/apps.json @@ -5036,6 +5036,5 @@ "storage": [ {"name":"myappid.app.js","url":"app.js"}, {"name":"myappid.img","url":"app-icon.js","evaluate":true} - ], -} + ]} ] From c93bbe4fb8362617541e1300558caf209c44e271 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 15:40:22 -0500 Subject: [PATCH 012/476] Corrected magnetic field Z negative encoding --- apps/sensible/sensible.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index 3da39998e..e7e07a71b 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -196,8 +196,8 @@ function encodeMagServiceData() { if(yEncoded < 0) { yEncoded += 0x10000; } - if(yEncoded < 0) { - yEncoded += 0x10000; + if(zEncoded < 0) { + zEncoded += 0x10000; } let x = [ xEncoded & 0xff, (xEncoded >> 8) & 0xff ]; From 43f2252bbf74500d95a0cee8a4bf25fea3166a56 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Fri, 17 Dec 2021 21:54:02 +0100 Subject: [PATCH 013/476] messages: don't buzz during Quiet Mode --- apps.json | 2 +- apps/messages/ChangeLog | 1 + apps/messages/app.js | 2 +- apps/messages/lib.js | 5 +++-- apps/messages/widget.js | 1 + 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..e37bfd908 100644 --- a/apps.json +++ b/apps.json @@ -77,7 +77,7 @@ { "id": "messages", "name": "Messages", - "version": "0.14", + "version": "0.15", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 94848a26c..76407cb45 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -21,3 +21,4 @@ Add 'Delete All' option to message options Now update correctly when 'require("messages").clearAll()' is called 0.14: Hide widget when all unread notifications are dismissed from phone +0.15: Don't buzz when Quiet Mode is active diff --git a/apps/messages/app.js b/apps/messages/app.js index 79009e77e..eb066acb9 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -52,7 +52,7 @@ var MESSAGES = require("Storage").readJSON("messages.json",1)||[]; if (!Array.isArray(MESSAGES)) MESSAGES=[]; var onMessagesModified = function(msg) { // TODO: if new, show this new one - if (msg && msg.new) { + if (msg && msg.new && !((require('Storage').readJSON('setting.json', 1) || {}).quiet)) { if (WIDGETS["messages"]) WIDGETS["messages"].buzz(); else Bangle.buzz(); } diff --git a/apps/messages/lib.js b/apps/messages/lib.js index b3cb7d9d4..32dff78ba 100644 --- a/apps/messages/lib.js +++ b/apps/messages/lib.js @@ -43,7 +43,8 @@ exports.pushMessage = function(event) { // otherwise load messages/show widget var loadMessages = Bangle.CLOCK || event.important; // first, buzz - if (loadMessages && global.WIDGETS && WIDGETS.messages) + var quiet = (require('Storage').readJSON('setting.json',1)||{}).quiet; + if (!quiet && loadMessages && global.WIDGETS && WIDGETS.messages) WIDGETS.messages.buzz(); // after a delay load the app, to ensure we have all the messages if (exports.messageTimeout) clearTimeout(exports.messageTimeout); @@ -51,7 +52,7 @@ exports.pushMessage = function(event) { exports.messageTimeout = undefined; // if we're in a clock or it's important, go straight to messages app if (loadMessages) return load("messages.app.js"); - if (!global.WIDGETS || !WIDGETS.messages) return Bangle.buzz(); // no widgets - just buzz to let someone know + if (!quiet && (!global.WIDGETS || !WIDGETS.messages)) return Bangle.buzz(); // no widgets - just buzz to let someone know WIDGETS.messages.show(); }, 500); } diff --git a/apps/messages/widget.js b/apps/messages/widget.js index f01d22ec7..e831e5b68 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -26,6 +26,7 @@ WIDGETS["messages"]={area:"tl",width:0,draw:function() { WIDGETS["messages"].width=0; Bangle.drawWidgets(); },buzz:function() { + if ((require('Storage').readJSON('setting.json',1)||{}).quiet) return; // never buzz during Quiet Mode let v = (require('Storage').readJSON("messages.settings.json", true) || {}).vibrate || "."; function b() { var c = v[0]; From 00116b760ce493afd50c1fa474e778ce89a9756f Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 16:28:30 -0500 Subject: [PATCH 014/476] Refactored byte array conversions for efficiency and readability --- apps/sensible/sensible.js | 76 ++++++++++++++------------------------- 1 file changed, 26 insertions(+), 50 deletions(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index e7e07a71b..e3a9df847 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -130,21 +130,9 @@ function transmitUpdatedSensorData() { // Encode the bar service data to fit in a Bluetooth PDU function encodeBarServiceData() { - let tEncoded = Math.round(bar.temperature * 100); - let pEncoded = Math.round(bar.pressure * 100); - let eEncoded = Math.round(bar.altitude * 100); - - if(bar.temperature < 0) { - tEncoded += 0x10000; - } - if(bar.altitude < 0) { - eEncoded += 0x1000000; - } - - let t = [ tEncoded & 0xff, (tEncoded >> 8) & 0xff ]; - let p = [ pEncoded & 0xff, (pEncoded >> 8) & 0xff, (pEncoded >> 16) & 0xff, - (pEncoded >> 24) & 0xff ]; - let e = [ eEncoded & 0xff, (eEncoded >> 8) & 0xff, (eEncoded >> 16) & 0xff ]; + let t = toByteArray(Math.round(bar.temperature * 100), 2, true); + let p = toByteArray(Math.round(bar.pressure * 100), 4, false); + let e = toByteArray(Math.round(bar.altitude * 100), 3, true); return [ 0x02, 0x01, 0x06, // Flags @@ -157,24 +145,10 @@ function encodeBarServiceData() { // Encode the GPS service data using the Location and Speed characteristic function encodeGpsServiceData() { - let latEncoded = Math.round(gps.lat * 10000000); - let lonEncoded = Math.round(gps.lon * 10000000); - let hEncoded = Math.round(gps.course * 100); - let sEncoded = Math.round(1000 * gps.speed / 36); - - if(gps.lat < 0) { - latEncoded += 0x100000000; - } - if(gps.lon < 0) { - lonEncoded += 0x100000000; - } - - let s = [ sEncoded & 0xff, (sEncoded >> 8) & 0xff ]; - let lat = [ latEncoded & 0xff, (latEncoded >> 8) & 0xff, - (latEncoded >> 16) & 0xff, (latEncoded >> 24) & 0xff ]; - let lon = [ lonEncoded & 0xff, (lonEncoded >> 8) & 0xff, - (lonEncoded >> 16) & 0xff, (lonEncoded >> 24) & 0xff ]; - let h = [ hEncoded & 0xff, (hEncoded >> 8) & 0xff ]; + let s = toByteArray(Math.round(1000 * gps.speed / 36), 2, false); + let lat = toByteArray(Math.round(gps.lat * 10000000), 4, true); + let lon = toByteArray(Math.round(gps.lon * 10000000), 4, true); + let h = toByteArray(Math.round(gps.course * 100), 2, false); return [ 0x02, 0x01, 0x06, // Flags @@ -186,23 +160,9 @@ function encodeGpsServiceData() { // Encode the mag service data using the magnetic flux density 3D characteristic function encodeMagServiceData() { - let xEncoded = mag.x; // TODO: units??? - let yEncoded = mag.y; - let zEncoded = mag.z; - - if(xEncoded < 0) { - xEncoded += 0x10000; - } - if(yEncoded < 0) { - yEncoded += 0x10000; - } - if(zEncoded < 0) { - zEncoded += 0x10000; - } - - let x = [ xEncoded & 0xff, (xEncoded >> 8) & 0xff ]; - let y = [ yEncoded & 0xff, (yEncoded >> 8) & 0xff ]; - let z = [ zEncoded & 0xff, (zEncoded >> 8) & 0xff ]; + let x = toByteArray(mag.x, 2, true); + let y = toByteArray(mag.y, 2, true); + let z = toByteArray(mag.z, 2, true); return [ 0x02, 0x01, 0x06, // Flags @@ -211,6 +171,22 @@ function encodeMagServiceData() { } +// Convert the given value to a little endian byte array +function toByteArray(value, numberOfBytes, isSigned) { + let byteArray = new Array(numberOfBytes); + + if(isSigned && (value < 0)) { + value += 1 << (numberOfBytes * 8); + } + + for(let index = 0; index < numberOfBytes; index++) { + byteArray[index] = (value >> (index * 8)) & 0xff; + } + + return byteArray; +} + + // Update acceleration Bangle.on('accel', function(newAcc) { acc = newAcc; From 37504ec5533e2d04081b0dd42355f779cc81e2f2 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Fri, 17 Dec 2021 22:36:34 +0100 Subject: [PATCH 015/476] Circles clock v0.03 --- apps.json | 3 ++- apps/circlesclock/ChangeLog | 1 + apps/circlesclock/app.js | 28 +++++++++++++++++----------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..8bdc54276 100644 --- a/apps.json +++ b/apps.json @@ -5029,9 +5029,10 @@ { "id": "circlesclock", "name": "Circles clock", "shortName":"Circles clock", - "version":"0.02", + "version":"0.03", "description": "A clock with circles for different data at the bottom in a probably familiar style", "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], "dependencies": {"widpedom":"app"}, "type": "clock", "tags": "clock", diff --git a/apps/circlesclock/ChangeLog b/apps/circlesclock/ChangeLog index fa2139fff..c0aa4e2f8 100644 --- a/apps/circlesclock/ChangeLog +++ b/apps/circlesclock/ChangeLog @@ -1,2 +1,3 @@ 0.01: New clock 0.02: Fix icon & add battery warn functionality +0.03: Theming support & minor fixes diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 7607fa71f..57b46bb8d 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -18,8 +18,8 @@ function loadSettings() { }; } -const colorFg = '#fff'; -const colorBg = '#000'; +const colorFg = g.theme.dark ? '#fff' : '#000'; +const colorBg = g.theme.dark ? '#000' : '#fff'; const colorGrey = '#808080'; const colorRed = '#ff0000'; const colorGreen = '#00ff00'; @@ -73,7 +73,7 @@ function drawSteps() { g.setColor(colorGrey); g.fillCircle(w1, h3, radiusOuter); - const stepGoal = settings.stepGoal; + const stepGoal = settings.stepGoal || 10000; if (stepGoal > 0) { let percent = steps / stepGoal; if (stepGoal < steps) percent = 1; @@ -97,7 +97,7 @@ function drawHeartRate() { g.setColor(colorGrey); g.fillCircle(w2, h3, radiusOuter); - if (hrtValue != undefined) { + if (hrtValue != undefined && hrtValue > 0) { const percent = hrtValue / settings.maxHR; drawGauge(w2, h3, percent, colorRed); } @@ -156,7 +156,6 @@ function radians(a) { return a * Math.PI / 180; } - function drawGauge(cx, cy, percent, color) { let offset = 30; let end = 300; @@ -166,15 +165,16 @@ function drawGauge(cx, cy, percent, color) { if (percent > 1) percent = 1; var startrot = -offset; - var endrot = startrot - ((end - offset) * percent); + var endrot = startrot - ((end - offset) * percent) - 15; g.setColor(color); + const size = 4; // draw gauge - for (i = startrot; i > endrot; i -= 4) { + for (i = startrot; i > endrot - size; i -= size) { x = cx + r * Math.sin(radians(i)); y = cy + r * Math.cos(radians(i)); - g.fillCircle(x, y, 4); + g.fillCircle(x, y, size); } } @@ -201,6 +201,10 @@ function getSteps() { Bangle.on('lock', function(isLocked) { if (!isLocked) { Bangle.setHRMPower(1, "watch"); + if (hrtValue == undefined) { + hrtValue = '...'; + drawHeartRate(); + } } else { Bangle.setHRMPower(0, "watch"); } @@ -225,9 +229,11 @@ Bangle.loadWidgets(); * so we will blank out the draw() functions of each widget and change the * area to the top bar doesn't get cleared. */ -for (let wd of WIDGETS) { - wd.draw = () => {}; - wd.area = ""; +if (typeof WIDGETS === "object") { + for (let wd of WIDGETS) { + wd.draw = () => {}; + wd.area = ""; + } } loadSettings(); setInterval(draw, 60000); From 904e3e39f0351df81be63bbd1da9eb6cb2ac06f3 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 16:43:33 -0500 Subject: [PATCH 016/476] Added GPS elevation (altitude) to location and speed service --- apps/sensible/sensible.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index e3a9df847..0529bf30b 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -148,12 +148,14 @@ function encodeGpsServiceData() { let s = toByteArray(Math.round(1000 * gps.speed / 36), 2, false); let lat = toByteArray(Math.round(gps.lat * 10000000), 4, true); let lon = toByteArray(Math.round(gps.lon * 10000000), 4, true); + let e = toByteArray(Math.round(gps.alt * 100), 3, true); let h = toByteArray(Math.round(gps.course * 100), 2, false); return [ - 0x02, 0x01, 0x06, // Flags - 0x11, 0x16, 0x67, 0x2a, 0x95, 0x02, s[0], s[1], lat[0], lat[1], lat[2], - lat[3], lon[0], lon[1], lon[2], lon[3], h[0], h[1] // Location and Speed + 0x02, 0x01, 0x06, // Flags + 0x14, 0x16, 0x67, 0x2a, 0x9d, 0x02, s[0], s[1], lat[0], lat[1], lat[2], + lat[3], lon[0], lon[1], lon[2], lon[3], e[0], e[1], e[2], h[0], h[1] + // Location and Speed ]; } From 6a1c14088364b3a2f7f522f41eb2359f4bbb388d Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 16:47:53 -0500 Subject: [PATCH 017/476] Use dynamic advertising interval based on number of distinct packets --- apps/sensible/sensible.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index 0529bf30b..ec972e368 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -124,7 +124,8 @@ function transmitUpdatedSensorData() { isNewMagData = false; } - NRF.setAdvertising(data, { showName: false, interval: 200 }); + let interval = 1000 / data.length; + NRF.setAdvertising(data, { showName: false, interval: interval }); } From 4aaccb87d54c1ac024d859ea7c3ed863e6a942cf Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 16:50:23 -0500 Subject: [PATCH 018/476] Corrected pressure resolution --- apps/sensible/sensible.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index ec972e368..d5cfd033b 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -132,7 +132,7 @@ function transmitUpdatedSensorData() { // Encode the bar service data to fit in a Bluetooth PDU function encodeBarServiceData() { let t = toByteArray(Math.round(bar.temperature * 100), 2, true); - let p = toByteArray(Math.round(bar.pressure * 100), 4, false); + let p = toByteArray(Math.round(bar.pressure * 10), 4, false); let e = toByteArray(Math.round(bar.altitude * 100), 3, true); return [ From 8f6823694785694b029f1d20ea16b418ff4f5272 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 16:53:45 -0500 Subject: [PATCH 019/476] Corrected pressure resolution for real this time! --- apps/sensible/sensible.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index d5cfd033b..73c348556 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -132,7 +132,7 @@ function transmitUpdatedSensorData() { // Encode the bar service data to fit in a Bluetooth PDU function encodeBarServiceData() { let t = toByteArray(Math.round(bar.temperature * 100), 2, true); - let p = toByteArray(Math.round(bar.pressure * 10), 4, false); + let p = toByteArray(Math.round(bar.pressure * 1000), 4, false); let e = toByteArray(Math.round(bar.altitude * 100), 3, true); return [ From 0dce0afbbe25e87f3e8a7ca5524ffade99d7455e Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Fri, 17 Dec 2021 16:56:20 -0500 Subject: [PATCH 020/476] Version bump --- apps.json | 2 +- apps/sensible/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e5e9f8f02..f5be04136 100644 --- a/apps.json +++ b/apps.json @@ -4652,7 +4652,7 @@ "id": "sensible", "name": "SensiBLE", "shortName": "SensiBLE", - "version": "0.04", + "version": "0.05", "description": "Collect, display and advertise real-time sensor data.", "icon": "sensible.png", "screenshots": [ diff --git a/apps/sensible/ChangeLog b/apps/sensible/ChangeLog index c50431f51..33e44b70c 100644 --- a/apps/sensible/ChangeLog +++ b/apps/sensible/ChangeLog @@ -2,3 +2,4 @@ 0.02: Corrected variable initialisation 0.03: Advertise app name, added screenshots 0.04: Advertise bar, GPS, HRM and mag services +0.05: Refactored for efficiency, corrected sensor value inaccuracies \ No newline at end of file From 86c90c81ca15c9a186fa1ca861a89adf51f8badd Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 17 Dec 2021 21:57:26 +0000 Subject: [PATCH 021/476] 93dub: fix issue with light theme so that this dark does not end up with a white strip at the top --- apps.json | 2 +- apps/93dub/ChangeLog | 1 + apps/93dub/app.js | 8 +++++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 4a333cdbd..2179e766b 100644 --- a/apps.json +++ b/apps.json @@ -4620,7 +4620,7 @@ "shortName":"93 Dub", "icon": "93dub.png", "screenshots": [{"url":"screenshot.png"}], - "version":"0.05", + "version":"0.06", "description": "Fan recreation of orviwan's 91 Dub app for the Pebble smartwatch. Uses assets from his 91-Dub-v2.0 repo", "tags": "clock", "type": "clock", diff --git a/apps/93dub/ChangeLog b/apps/93dub/ChangeLog index c1b2588bb..1c18ca59b 100644 --- a/apps/93dub/ChangeLog +++ b/apps/93dub/ChangeLog @@ -3,3 +3,4 @@ 0.03: Code style cleanup 0.04: Set 00:00 to 12:00 for 12 hour time 0.05: Display time, even on Thursday +0.06: Fix light theme issue, where widgets would end up on a light strip diff --git a/apps/93dub/app.js b/apps/93dub/app.js index 1b0f69a94..f970eec5d 100644 --- a/apps/93dub/app.js +++ b/apps/93dub/app.js @@ -122,7 +122,13 @@ function draw(){ queueDraw(); } - +/** + * This watch is mostly dark, it does not make sense to respect the + * light theme as you end up with a white strip at the top for the + * widgets and black watch. So set the colours to the dark theme. + * + */ +g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); draw(); //the following section is also from waveclk From 7ad29b48b4bbf224bfa96e8d3f7625089b2398c3 Mon Sep 17 00:00:00 2001 From: Kristoffer Sall-Storgaard Date: Fri, 17 Dec 2021 23:11:41 +0100 Subject: [PATCH 022/476] Disable screen turn on on bluetooth status change --- apps/widbt/widget.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index 88be3d5c9..c7ef8c0ad 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -7,7 +7,6 @@ WIDGETS["bluetooth"]={area:"tr",width:15,draw:function() { g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="),2+this.x,2+this.y); },changed:function() { WIDGETS["bluetooth"].draw(); - Bangle.setLCDPower(1); // turn screen on }}; NRF.on('connect',WIDGETS["bluetooth"].changed); NRF.on('disconnect',WIDGETS["bluetooth"].changed); From b0dbe1d7d56052a870131342d0e17ad1f132f90e Mon Sep 17 00:00:00 2001 From: Kristoffer Sall-Storgaard Date: Fri, 17 Dec 2021 23:13:34 +0100 Subject: [PATCH 023/476] Disable screen turn on on bluetooth status change --- apps/widbt/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/widbt/ChangeLog b/apps/widbt/ChangeLog index 7aa96ce5c..4c2132122 100644 --- a/apps/widbt/ChangeLog +++ b/apps/widbt/ChangeLog @@ -4,3 +4,4 @@ 0.05: Make Bluetooth widget thinner, and when on a bright theme use light grey for disabled color 0.06: Tweaking colors for dark/light themes and low bpp screens 0.07: Memory usage improvements +0.08: Disable LCD on, on bluetooth status change From d75940b9e617595c0a20d89474876a7e5cb2abdb Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Fri, 17 Dec 2021 22:57:09 +0100 Subject: [PATCH 024/476] Ported cprassist to Banglejs2 --- apps.json | 4 ++-- apps/cprassist/ChangeLog | 1 + apps/cprassist/cprassist.js | 17 +++++++++-------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/apps.json b/apps.json index 8b4e86d52..4f966bbdd 100644 --- a/apps.json +++ b/apps.json @@ -2970,11 +2970,11 @@ { "id": "cprassist", "name": "CPR Assist", - "version": "0.01", + "version": "0.02", "description": "Provides assistance while performing a CPR", "icon": "cprassist-icon.png", "tags": "tool,firstaid", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", "allow_emulator": true, "screenshots": [{"url":"bangle1-CPR-assist-screenshot.png"}], diff --git a/apps/cprassist/ChangeLog b/apps/cprassist/ChangeLog index 5560f00bc..529010aa8 100644 --- a/apps/cprassist/ChangeLog +++ b/apps/cprassist/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Ported to Banglejs2 diff --git a/apps/cprassist/cprassist.js b/apps/cprassist/cprassist.js index 862ae54d6..3e34ea171 100644 --- a/apps/cprassist/cprassist.js +++ b/apps/cprassist/cprassist.js @@ -35,23 +35,24 @@ function provideFeedback() { } function drawHeart() { - g.fillCircle(40, 92, 12); - g.fillCircle(60, 92, 12); - g.fillPoly([29, 98, 50, 120, 71, 98]); + var lowestPoint = g.getHeight()*3/5; + g.fillCircle(40, lowestPoint-29, 12); + g.fillCircle(60, lowestPoint-29, 12); + g.fillPoly([29, lowestPoint-22, 50, lowestPoint, 71, lowestPoint-22]); } function updateScreen() { const colors = [0xFFFF, 0x9492]; - g.reset().clearRect(0, 50, 250, 150); + g.reset().clearRect(0, 0, 250, g.getHeight()*5/6); if (counter > 0) { g.setFont("Vector", 40).setFontAlign(0, 0); g.setColor(colors[counter%2]); drawHeart(); - g.drawString(counter + "", g.getWidth()/2, 100); + g.drawString(counter, 120, g.getHeight()*3/5-20); } else { g.setFont("Vector", 20).setFontAlign(0, 0); - g.drawString("RESCUE", g.getWidth()/2, 70); - g.drawString("BREATHS", g.getWidth()/2, 120); + g.drawString("RESCUE", g.getWidth()/2, g.getHeight()/3); + g.drawString("BREATHS", g.getWidth()/2, g.getHeight()*3/5); } } @@ -73,7 +74,7 @@ function tick() { interval = setInterval(tick, 60000/setting('compression_rpm')); g.clear(1).setFont("6x8"); -g.drawString(setting('compression_count') + ' / ' + setting('breath_count'), 30, 200); +g.drawString(setting('compression_count') + ' / ' + setting('breath_count'), 30, g.getHeight()*5/6); Bangle.loadWidgets(); Bangle.drawWidgets(); From d241cebeb04178e08edd993d7208f04166471a04 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Fri, 17 Dec 2021 23:23:13 +0100 Subject: [PATCH 025/476] cpassist: work with different bgcolors --- apps/cprassist/cprassist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cprassist/cprassist.js b/apps/cprassist/cprassist.js index 3e34ea171..ee5b06131 100644 --- a/apps/cprassist/cprassist.js +++ b/apps/cprassist/cprassist.js @@ -42,7 +42,7 @@ function drawHeart() { } function updateScreen() { - const colors = [0xFFFF, 0x9492]; + const colors = [0xFFFF-g.getBgColor(), 0x9492]; g.reset().clearRect(0, 0, 250, g.getHeight()*5/6); if (counter > 0) { g.setFont("Vector", 40).setFontAlign(0, 0); From c5303ef657c7b788da37cd952230573406794d7a Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sat, 18 Dec 2021 01:00:22 +0100 Subject: [PATCH 026/476] Don't blank widgets --- apps.json | 2 +- apps/cprassist/cprassist.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 4f966bbdd..64abacef2 100644 --- a/apps.json +++ b/apps.json @@ -2970,7 +2970,7 @@ { "id": "cprassist", "name": "CPR Assist", - "version": "0.02", + "version": "0.02-rc1", "description": "Provides assistance while performing a CPR", "icon": "cprassist-icon.png", "tags": "tool,firstaid", diff --git a/apps/cprassist/cprassist.js b/apps/cprassist/cprassist.js index ee5b06131..128ae7407 100644 --- a/apps/cprassist/cprassist.js +++ b/apps/cprassist/cprassist.js @@ -43,7 +43,7 @@ function drawHeart() { function updateScreen() { const colors = [0xFFFF-g.getBgColor(), 0x9492]; - g.reset().clearRect(0, 0, 250, g.getHeight()*5/6); + g.reset().clearRect(0, 24, g.getWidth(), g.getHeight()*5/6); if (counter > 0) { g.setFont("Vector", 40).setFontAlign(0, 0); g.setColor(colors[counter%2]); From 8a2fbc47bd8486a4aadf5f96ca1b1abbeca0044c Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 09:56:14 +0100 Subject: [PATCH 027/476] Update apps.json --- apps.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps.json b/apps.json index 9bd426bd3..60de1672f 100644 --- a/apps.json +++ b/apps.json @@ -5027,14 +5027,14 @@ {"name":"circlesclock.json"} ] }, - { "id": "miniclock", - "name": "Minimalist Clock", - "shortName" : "Minimalist Clock", + { "id": "contourclock", + "name": "Contour Clock", + "shortName" : "Contour Clock", "icon": "app.png", - "description": "A Minimalist clockface with large Digits.", + "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", "tags": "clock", "storage": [ - {"name":"myappid.app.js","url":"app.js"}, - {"name":"myappid.img","url":"app-icon.js","evaluate":true} + {"name":"contourclock.app.js","url":"app.js"}, + {"name":"contourclock.img","url":"app-icon.js","evaluate":true} ]} ] From 79e5a6e0a06edb390db9c7145aca12b34b4b6379 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 09:57:17 +0100 Subject: [PATCH 028/476] Create app-icon.js --- apps/contourclock/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/contourclock/app-icon.js diff --git a/apps/contourclock/app-icon.js b/apps/contourclock/app-icon.js new file mode 100644 index 000000000..38b19c29a --- /dev/null +++ b/apps/contourclock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("2GwgI74HIUB/4AC8AWNwAVTgNAAQIYBAANgCZUcuEAkAVRkWYgMQCqWokEICqMe1ERFaUC5EIK6RtBgqDGvyZMgSvCCqLbDFc2AK6mAQanwV6mIgDbTxEBFaUiFYJXSj3wgKDC/4AC8CvMQoIVUAH4A/AH4A/AH4A/AH4A/AD0eAokDwAECvgRF//ggEP//8BIn+AYMfBQsD//4BwIAB4AJBg4FDAYIVEh/AvkHBAMPGAImB4EH+EDEQN/Coc/gEcBwIGBBoMAnwCB/kHBQMPLosOBwUAvwCBvAYCh5SCGwUB+AVBBwQ+BBIYnBEAQHDDIUGAwRqBwEBEYUH3gKCEgRFCgwOCVYStDgYgDnhsDCoJsCG4KABCoQ9DPoLKECoxoCAoI2DhwCBDgQVEgHgBgQbCYIaGEK4gVBHARdCPAYGBDgQVFuAVIAgIXBCoVwCok4EgPggZDB/4VHvEP/4jBmAVBj/wHgQKBLgMGCoc8///JAMwmDvBvAVBg+D4AVGj/8SIUwI4M4ngOBg6GCCosPBAIVEOAIOBAIIMCCogDCsDkBDANwhizBAIIVCNogVEv4VBsEOCotgCoNUCosB/IVDhkAAIIVBuEDwP8CorkBCoUGCo/n9gVDQYK6BMoYTBIIcwZQOMCof/MAQVDK4q5BvweBCoLbCCoanBCYMGV4QVBJAQVBj4JBEYYVBYoUDCpE8AwIVI4+ACo94AwYVDI4MD/4LBCozsBCpEA/wVIbIJBGga6CAAM4CpJ7CCoRUBCrEYCpEPCogECFZJtCg7xCCoXgCpq8BCocA+AVDYpMB+AVEXIQVInwKC/4VED4MBqAVHh4SCn4VEjxgBLQIVGg//J4M4CoPgD4WAh+wCo4AB/CkBCokH+F+UwJ8CCoqMBjg5BsA1D/gTBCpDOBCosGn/gFYLUCCo8MBoUOfAIKBDoQVJEgI5BCozgCCoUCCoaGCuALBAIMBOoQVEj4GBnDbBMYM4jkAvxvB4AXCj/8O4X+TIMD4ClBnDZB//gj+ACoSJBCoP4v4+Bg+ATgMf/EB84hCgIXBXwIABCQLxBg6yCj/wGIN/CAMDFoYbBLoSICKgIABGIIEEC4IVCDISSCCogDCAgQVEEAaqEXQgICgYFCCoigBCpEeGQgVGBQYVET4IrEK4ppDCol4CpaVBNoz6BCob3DB4UHAwUPPgYHBQYbuBAYUPAIIGCj4vDAYI2DgF8AYU/wEeAwU9F4UfFALXEA4f/8E8j41C/gDBvwRC/4ADHYMf+P9/EP8EH+F/wEHJ4d/CwgABwF/+EDAoPAh4DBHoYAEj4tCPwV//xJCAYIA/AH4A/AHMP/n/gfw/kA4AABCsMMCAfDCssP4H/CQXDmEzNpoVUIIgVB+AHBCs3DhgABCso+B/gVlAFg6EdxgVWdwPAmEMgfwgYCBn4CBOBAVUgY5BCoM8SoMDAQPD5kMngVchnAgYWB5gGBHYMM5nAAQIVcCQLwCNoQCC5j3BQZIVVmBCBH4SdBgAWBZ4oVYh/8CoX/54FBBAM/AQLRBCracDJAgOICrgA/AH4A/AH4A/AH4A/AH4AJA")) From f408e7d3b5b68ba3668c37effe046a59cb8be3f4 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 09:57:56 +0100 Subject: [PATCH 029/476] Create app.js --- apps/contourclock/app.js | 55 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 apps/contourclock/app.js diff --git a/apps/contourclock/app.js b/apps/contourclock/app.js new file mode 100644 index 000000000..9fdbab985 --- /dev/null +++ b/apps/contourclock/app.js @@ -0,0 +1,55 @@ +const digits = [ +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVqlVVVVVVVVVVVVVaqqqqpVVVVVVVVVVWqqqqqqqVVVVVVVVVWqqqAKqqpVVVVVVVVaqgAAAACqpVVVVVVVaqAAAAAACqlVVVVVVaoAAAAAAACqVVVVVVaoAAAAAAAAKpVVVVVaoAAAAAAAAAqlVVVVaoAAAAAAAAACqVVVVWoAAAAAAAAAAKlVVVWoAAAAAAAAAAAqVVVWqAAAAAAAAAAAKpVVVqAAAAACgAAAAAqVVVagAAAAKqgAAAAKlVVagAAAAqqqgAAAAqVVWoAAAAKpaoAAAAKlVVqAAAAKlVagAAAAqVVqAAAACpVWoAAAAKlVagAAACpVVagAAACpVWoAAAAqVVWoAAAAqVVqAAAAqVVVagAAAKlVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVagAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVWoAAACpVqAAAAKlVVVqAAAAqVagAAAKlVVVagAAAKlWoAAACpVVVWoAAACpVqAAAAqVVVVqAAAAqVagAAAKlVVVagAAAKlWoAAACpVVVWoAAACpVqAAAAqVVVVqAAAAqVagAAACpVVVagAAAKlWoAAAAqVVVWoAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVagAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlVqAAAAqVVVagAAACpVagAAACpVVWoAAACpVWoAAAAqVVWoAAAAqVVqAAAAKlVVqAAAAKlVagAAAAqVVqAAAAKlVVqAAAAKpVqgAAACpVVagAAAAqqqgAAAAqVVVqAAAACqqgAAAAKlVVagAAAACqAAAAAKlVVWoAAAAAAAAAAACpVVVagAAAAAAAAAACpVVVWqAAAAAAAAAACqVVVVagAAAAAAAAAAqVVVVVqAAAAAAAAAAqVVVVVaoAAAAAAAAAqlVVVVVqgAAAAAAAAqlVVVVVWqgAAAAAAAqlVVVVVVaqAAAAAACqlVVVVVVVaqgAAAAqqlVVVVVVVVqqqqqqqqVVVVVVVVVVqqqqqqpVVVVVVVVVVVaqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVaqqqVVVVVVVVVVVVVqqqqqVVVVVVVVVVVWqqqqqpVVVVVVVVVVaqgAAAqVVVVVVVVVVaqAAAACpVVVVVVVVVqoAAAAAqVVVVVVVVVqoAAAAAKlVVVVVVVWqgAAAAACpVVVVVVVaqgAAAAAAqVVVVVVVaqAAAAAAAKlVVVVVVaoAAAAAAACpVVVVVVqoAAAAAAAAqVVVVVVaoAAAAAAAAKlVVVVVagAAAAAAAACpVVVVVWoAAAAAAAAAqVVVVVVqAAAAAAAAAKlVVVVVagAAAAAAAACpVVVVVWoAAAAAAAAAqVVVVVVqAAAAAAAAAKlVVVVVagAAAgAAAACpVVVVVWoAACogAAAAqVVVVVVagAKqoAAAAKlVVVVVWqqqqagAAACpVVVVVVaqqpWoAAAAqVVVVVVVaqlVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVaqqqAAAAAqqqpVVVWqqqqgAAAAKqqqpVVWqqqqAAAAAAKqqqlVVqgAAAAAAAAAAACpVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVWoAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWqAAAAAAAAAAAACqVVaqqqqqqqqqqqqqqVVVqqqqqqqqqqqqqqVVVWqqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVWqVVVVVVVVVVVVVaqqqqqlVVVVVVVVVaqqqqqqqqVVVVVVVVqqqqoAqqqqVVVVVVWqqgAAAAAKqpVVVVVaqgAAAAAAAAqpVVVVaqAAAAAAAAACqlVVVWoAAAAAAAAAACpVVVWoAAAAAAAAAAAKlVVVqAAAAAAAAAAACqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAAqVVWoAAAKqqAAAAAAKlVVagACqqqqAAAAACpVVWqqqqqqqqAAAAAqVVVaqqqlVVqgAAAAKlVVVaqpVVVVqAAAACpVVVVVVVVVVagAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVqAAAACpVVVVVVVVVVagAAAAqVVVVVVVVVVagAAAAqVVVVVVVVVVaoAAAAKlVVVVVVVVVaoAAAACpVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACqVVVVVVVVVWoAAAAAqVVVVVVVVVWqAAAAAqVVVVVVVVVWqAAAAAqlVVVVVVVVWqAAAAAKlVVVVVVVVWqAAAAAKlVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAqpVVVVVVVVWqAAAAACpVVVVVVVVWqAAAAAKlVVVVVVVVVqAAAAAACqqqqpVVVVqAAAAAAKqqqqqpVVVqgAAAAAAKqqqqqpVVagAAAAAAAAAAACqVVWoAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVWoAAAAAAAAAAAACpVVqAAAAAAAAAAAAAqVVaoAAAAAAAAAAAAqVVVqqqqqqqqqqqqqqlVVWqqqqqqqqqqqqqlVVVaqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVapVVVVVVVVVVVVVaqqqqqlVVVVVVVVVaqqqqqqqqVVVVVVVWqqqqgCqqqpVVVVVVaqqgAAAAAKqpVVVVVaqgAAAAAAACqpVVVVaoAAAAAAAAACqlVVVaoAAAAAAAAAACqVVVWoAAAAAAAAAAAKlVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAAqVVVqAAAKqqgAAAAAKlVVaoAKqqqqgAAAACpVVVqqqqqqqqAAAAAqVVVWqqqlVVaoAAAAKlVVVaqlVVVVqAAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVaoAAAAqVVVVVVVVaqqqAAAAKlVVVVVVaqqqoAAAAKlVVVVVVaqqqgAAAAKpVVVVVVaqgAAAAAAKpVVVVVVaoAAAAAAAKpVVVVVVWoAAAAAAACpVVVVVVVqAAAAAAACpVVVVVVVagAAAAAAAqVVVVVVVWoAAAAAAACpVVVVVVVqAAAAAAAAqpVVVVVVagAAAAAAACqlVVVVVWoAAAAAAAACqVVVVVVaoAAAAAAAAKpVVVVVWqqqqgAAAAAqVVVVVVWqqqqgAAAACpVVVVVVaqqqqgAAAAqVVVVVVVVVVaqAAAAKlVVVVVVVVVVagAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVlVVVVVVqAAAAKlVVaqqVVVVVqAAAACpVVaqqqpVVWqgAAAAqVVaqKqqqqqqgAAAAKlVaoAAqqqqqAAAAACpVaoAAACqqoAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAAKpVVqAAAAAAAAAAAACpVVagAAAAAAAAAAAKpVVVqAAAAAAAAAAAKqVVVaqAAAAAAAAAAKpVVVVqqAAAAAAAACqpVVVVVqqoAAAAACqqpVVVVVWqqqqqqqqqqlVVVVVVVqqqqqqqqpVVVVVVVVVWqqqqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVaqqlVVVVVVVVVVVVVqqqqlVVVVVVVVVVVVqqqqqVVVVVVVVVVVVqgAAKpVVVVVVVVVVVqgAAAqVVVVVVVVVVVqgAAACpVVVVVVVVVVqgAAAAqVVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVaoAAAAAqVVVVVVVVVWoAAAAAKlVVVVVVVVWoAAAAACpVVVVVVVVWqAAAAAAqVVVVVVVVVqAAAAAAKlVVVVVVVVqAAAAAACpVVVVVVVVqgAAAAAAqVVVVVVVVagAAAAAAKlVVVVVVVagAAAAAACpVVVVVVVaoAAAAAAAqVVVVVVVaoAAAAAAAKlVVVVVVWoAAAAAAACpVVVVVVWoAAAAAAAAqVVVVVVWqAAAAAAAAKlVVVVVVqAAAAAAAACpVVVVVVqAAAAAAAAAqVVVVVVqgAAAAAAAAKlVVVVVagAAAgAAAACpVVVVVagAACogAAAAqVVVVVaoAACqoAAAAKlVVVVWoAAAqagAAACpVVVVWoAAAqWoAAAAqVVVVWqAAAqlqAAAAKlVVVVqAAAKlagAAACpVVVVqAAAKlWoAAAAqVVVVqgAAKpVqAAAAKlVVVagAACpVagAAACpVVVagAACpVWoAAAAqVVVaoAAAqVVqAAAAKlVVWoAAACqqqAAAAAqpVVqAAAAqqqgAAAAKqpVqAAAAAqqAAAAAAKqpagAAAAAAAAAAAAACqWoAAAAAAAAAAAAAACpqAAAAAAAAAAAAAAAqagAAAAAAAAAAAAAAKmoAAAAAAAAAAAAAACpqAAAAAAAAAAAAAAAqagAAAAAAAAAAAAAAKlqAAAAAAAAAAAAAACpaqAAAAAAAAAAAAACpVqqqqqqqgAAAAACqqVVqqqqqqqgAAAAKqqVVVqqqqqqoAAAACqpVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVVqAAACpVVVVVVVVVVVagAAAqVVVVVVVVVVVVqgACqVVVVVVVVVVVVaqqqqlVVVVVVVVVVVVaqqqVVVVVVVVVVVVVVqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVaqqqqqqqqpVVVVVVaqqqqqqqqqqqlVVVVaqqqqqqqqqqqqVVVVaqgAAAAAAAACqpVVVaoAAAAAAAAAAAqlVVWoAAAAAAAAAAACpVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAACpVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAKqVVVWoAAAACqqqqqqqlVVVqAAAAKqqqqqqqVVVVagAAACqqqqqqlVVVVWoAAACpVVVVVVVVVVVqAAAAqVVVVVVVVVVVagAAAKlVVVVVVVVVVWoAAACpVVVVVVVVVVVqAAAAqVVVVVVVVVVVagAAACqqqqqVVVVVVWoAAAAqqqqqqlVVVVVqAAAAAqqqqqqlVVVVagAAAAAAAAAqqVVVVWoAAAAAAAAAAKpVVVVqAAAAAAAAAAAqlVVVagAAAAAAAAAACqVVVWoAAAAAAAAAAAKpVVVqAAAAAAAAAAAAqlVVagAAAAAAAAAAACpVVWoAAAAAAAAAAAAKlVVqAAAAAAAAAAAACpVVagAAAACoAAAAAAKlVWoAAACqqqAAAAACpVVqAAAKqqqqAAAAAqVVWqgqqqpWqoAAAAKlVVqqqqpVVVqAAAACpVVWqqqlVVVWoAAAAqVVVVaVVVVVVqAAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAAKlVVWqpVVVVVagAAACpVVaqqqVVVVaoAAAAqVVaqqqqlVVqoAAAAKlVWoACqqqqqoAAAACpVWoAAAqqqqgAAAAAqVVqAAAAKqqAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAACpVVqAAAAAAAAAAAACpVVagAAAAAAAAAAACqVVVqAAAAAAAAAAACqVVVaoAAAAAAAAAAKqVVVVqgAAAAAAAAAKqVVVVWqoAAAAAAAAqpVVVVVaqqgAAAAAqqpVVVVVVaqqqqqqqqqlVVVVVVVWqqqqqqqqVVVVVVVVVVaqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVqVVVVVVVVVVVVVVqqqqqpVVVVVVVVVVqqqqqqqqVVVVVVVVWqqqqAqqqqlVVVVVVWqqAAAAACqqlVVVVVaqAAAAAAAAqpVVVVVaqAAAAAAAAAKlVVVVaoAAAAAAAAACqVVVVqoAAAAAAAAAAKlVVVaoAAAAAAAAAACpVVVagAAAAAAAAAAAqVVVaoAAAAAAAAAAAKlVVaoAAAAAAAAAAACpVVWoAAAAAAAAAAAAqVVWoAAAAACqqqAAAqVVVqAAAAAKqqqqoAqlVVqAAAAAqqqqqqqqlVVagAAAAqpVVVqqqlVVagAAAAqlVVVVWqVVVWoAAAAqlVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAAKlVVVVVVVVVVagAAACpVaqqqVVVVVWoAAAAqVqqqqqVVVVVqAAAAqWqqqqqqVVVVagAAAImqgAAAqpVVVWoAAAAoqAAAAAqlVVVqAAAAIqAAAAACqlVVqAAAAAIAAAAAAKpVVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAACqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAAqVWoAAAAAAAAAAAAAKlVqAAAAAACqgAAAACpVagAAAAAKqqgAAAAKlWoAAAAAKqqqAAAACpVagAAAACpVaoAAAAqVWoAAAACpVVqAAAAKlVqAAAAAqVVWoAAACpVagAAAAqVVVqAAAAKlWoAAAAKlVVagAAACpVqAAAACpVVWoAAAAqVagAAAAqVVVqAAAAKlVqAAAAKlVVagAAAKlVagAAACpVVWoAAACpVWoAAAAKlVVqAAAAqVVagAAACpVVqAAAAKlVWoAAAAKlVqgAAACpVVqAAAACqqqgAAAAqVVWoAAAAKqqgAAAAqVVVqAAAAAKqAAAAAKlVVWoAAAAAAAAAAAKlVVVqgAAAAAAAAAACpVVVWoAAAAAAAAAACpVVVVagAAAAAAAAACqVVVVWqAAAAAAAAACqVVVVVaqAAAAAAAACqVVVVVVqoAAAAAAACqVVVVVVVqoAAAAAAKqVVVVVVVWqqAAAACqqVVVVVVVVWqqqqqqqpVVVVVVVVVWqqqqqqlVVVVVVVVVVVqqqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqlVVVVqqqqqqqqqqqqqqVVVqqqqqqqqqqqqqqpVVqqAAAAAAAAAAAKqlVqgAAAAAAAAAAAACqVagAAAAAAAAAAAAAKlWoAAAAAAAAAAAAAAqVqAAAAAAAAAAAAAAKlagAAAAAAAAAAAAACpWoAAAAAAAAAAAAAAqVqAAAAAAAAAAAAAAKlagAAAAAAAAAAAAACpWqAAAAAAAAAAAAAAqVaqgAAAAAAAAAAAAqVVqqqqqqqqAAAAAAKlVWqqqqqqqqAAAAACpVVVaqqqqqqAAAAACpVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqgAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAACqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVagAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAAKpVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVWqAAAAAqVVVVVVVVVVqAAAAAqlVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVWoAAAAKpVVVVVVVVVVqAAAACpVVVVVVVVVVqAAAACpVVVVVVVVVVWoAAACqVVVVVVVVVVVqAAACqVVVVVVVVVVVaoAACqVVVVVVVVVVVVqqqqqVVVVVVVVVVVVWqqqqVVVVVVVVVVVVVWqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVqVVVVVVVVVVVVVWqqqqqpVVVVVVVVVVqqqqqqqqlVVVVVVVWqqqqAqqqqlVVVVVVaqoAAAAACqqVVVVVVaqAAAAAAAAKqVVVVVaoAAAAAAAAAqpVVVVaoAAAAAAAAAAqlVVVaoAAAAAAAAAACqVVVaoAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVWoAAAAAAAAAAAAKlVVqAAAAAAAAAAAAAqVVagAAAACqqAAAAAKlVagAAAAKqqqAAAACpVWoAAAAKqqqoAAAAqVVqAAAAKpVVqAAAAKlVagAAACpVVWoAAAAqVWoAAACpVVVqAAAAKlVqAAAAqVVVagAAAKlVagAAAKlVVWoAAACpVWoAAACpVVVqAAAAqVVagAAAKlVVagAAAKlVWoAAACqVVagAAACpVVqAAAAKqqqoAAACpVVWoAAAAqqqoAAAAqVVVqgAAAAqqgAAAAqVVVWqAAAAAAAAAAAqlVVVaoAAAAAAAAAAqlVVVVqAAAAAAAAAAqlVVVVWoAAAAAAAAAKlVVVVVqAAAAAAAAAKlVVVVVqAAAAAAAAAAKlVVVVqgAAAAAAAAAKqVVVWqgAAAAAAAAAAKpVVVqgAAAAAAAAAAAqlVVqAAAAAAAAAAAACqVVqgAAAAKqqAAAAAKlVagAAAAqqqqAAAAAqVWoAAAAqqqqqAAAAKlWoAAAAqlVVqoAAACpVqAAAAKlVVVqAAAAKlagAAAKlVVVWoAAACpWoAAACpVVVVqAAAAqVqAAACpVVVVagAAAKlqAAAAKlVVVWoAAACpagAAACpVVVVqAAAAqVqAAAAKlVVVqAAAAKlagAAACqVVWqgAAACpWoAAAAKqqqqgAAAAqVqAAAAAqqqqAAAAAKlagAAAAAqqoAAAAAKlVqAAAAAAAAAAAAACpVagAAAAAAAAAAAACpVVqAAAAAAAAAAAAAqVVaoAAAAAAAAAAAAqVVVqgAAAAAAAAAAAqlVVWqAAAAAAAAAACqlVVVaqAAAAAAAAACqlVVVVqqAAAAAAAAKqVVVVVVqqoAAAAAKqqVVVVVVVqqqqqqqqqpVVVVVVVVqqqqqqqqlVVVVVVVVVWqqqqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVValVVVVVVVVVVVVVWqqqqqVVVVVVVVVVVqqqqqqqVVVVVVVVVWqqqgKqqqVVVVVVVVWqoAAAAAqqVVVVVVVaqAAAAAAAqpVVVVVVaqAAAAAAAAqpVVVVVaoAAAAAAAACqVVVVVWoAAAAAAAAACpVVVVWoAAAAAAAAAAqlVVVWqAAAAAAAAAACqVVVVqAAAAAAAAAAAKpVVVqAAAAAAAAAAAAqVVVagAAAAKqgAAAACpVVagAAAAqqqgAAAAqVVWoAAAAKqqoAAAACpVVqAAAAKlVagAAAAqVVqAAAAKpVWqAAAAKlVagAAACpVVagAAACpVWoAAACpVVVqAAAAKlVqAAAAqVVVagAAACpVagAAAKlVVWoAAAAqVWoAAACpVVVqAAAACpVqAAAAqVVVagAAAAqVagAAACpVVagAAAAKlWoAAAAqVVWoAAAACpVqAAAACpVWoAAAAAqVagAAAAqlWqAAAAAKlVqAAAACqqqAAAAACpVagAAAAKqqAAAAAAqVWoAAAAAKoAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVagAAAAAAAAAAAAKlVWqAAAAAAAAAAAACpVVagAAAAAACAAAAAqVVVqAAAAAAKiAAAAKlVVaqAAAAAKigAAACpVVVqoAAAAKpiAAAAqVVVVqoAAAqpagAAAKlVVVWqqqqqpagAAACpVVVVWqqqqlWoAAACpVVVVVWqqqVVqAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVqgAAACpVVVVVVVVVVqgAAACpVVVaqlVVVVqgAAAAqVVVqqqqVVWqgAAAAKlVVqqqqqqqqgAAAAKlVVagAKqqqqAAAAACpVVagAAAqqoAAAAACpVVWoAAAAAAAAAAACqVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAqVVVWoAAAAAAAAAAAqlVVVqAAAAAAAAAAAqlVVVagAAAAAAAAAAqlVVVWoAAAAAAAAACqlVVVVagAAAAAAAACqlVVVVWqoAAAAAAAqqVVVVVVaqqAAAAAKqqVVVVVVVaqqqqqqqqpVVVVVVVVWqqqqqqqVVVVVVVVVVVqqqqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, +{width : 25 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqlVVVVWqqqlVVVWqqqqlVVWqgAKqVVWqAAAKlVWqAAAAqVVqAAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAACpVWqAAAAqVVagAAAqlVVqgAAqlVVaqqqqlVVVaqqqlVVVVaqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqVVVVVqqqqVVVWqqqqpVVVqgAAqlVVqAAACqVVqgAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAqVVagAAAKlVWqAAAKlVVaqACqpVVVqqqqpVVVWqqqlVVVVVqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV "))} +]; + +var drawTimeout, savedOptions; + +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + +function draw() { + var x = g.getWidth()/2; + var y = g.getHeight()/2-31; + //print(y); + g.reset(); + var date = new Date(); + var timeStr = require("locale").time(date,1); + // draw time + g.clearRect(0,y,g.getWidth()-1,y+73+24+18); + //use custom font spacing for overlapping digits + g.drawImage(digits[parseInt(date.getHours()/10)],0,y); + g.drawImage(digits[parseInt(date.getHours()%10)],37,y); + g.drawImage(digits[10],74,y); + g.drawImage(digits[parseInt(date.getMinutes()/10)],86,y); + g.drawImage(digits[parseInt(date.getMinutes()%10)],123,y); + // Draw day of the week + y += 73; + g.setFontAlign(0,-1).setFont("Teletext10x18Ascii"); + g.drawString(require("locale").dow(date).toUpperCase(),x,y); + // Draw Date + y += 24; + g.drawString(require('locale').date(new Date(),1),x,y); + queueDraw(); +} + +require("FontTeletext10x18Ascii").add(Graphics); +Bangle.setUI("clock"); +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +draw(); From f30ec77662ff9d80f4470c1608529a6729d6d4ec Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 09:58:14 +0100 Subject: [PATCH 030/476] Delete apps/miniclock directory --- apps/miniclock/app-icon.js | 1 - apps/miniclock/app.js | 55 -------------------------------------- 2 files changed, 56 deletions(-) delete mode 100644 apps/miniclock/app-icon.js delete mode 100644 apps/miniclock/app.js diff --git a/apps/miniclock/app-icon.js b/apps/miniclock/app-icon.js deleted file mode 100644 index 38b19c29a..000000000 --- a/apps/miniclock/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("2GwgI74HIUB/4AC8AWNwAVTgNAAQIYBAANgCZUcuEAkAVRkWYgMQCqWokEICqMe1ERFaUC5EIK6RtBgqDGvyZMgSvCCqLbDFc2AK6mAQanwV6mIgDbTxEBFaUiFYJXSj3wgKDC/4AC8CvMQoIVUAH4A/AH4A/AH4A/AH4A/AD0eAokDwAECvgRF//ggEP//8BIn+AYMfBQsD//4BwIAB4AJBg4FDAYIVEh/AvkHBAMPGAImB4EH+EDEQN/Coc/gEcBwIGBBoMAnwCB/kHBQMPLosOBwUAvwCBvAYCh5SCGwUB+AVBBwQ+BBIYnBEAQHDDIUGAwRqBwEBEYUH3gKCEgRFCgwOCVYStDgYgDnhsDCoJsCG4KABCoQ9DPoLKECoxoCAoI2DhwCBDgQVEgHgBgQbCYIaGEK4gVBHARdCPAYGBDgQVFuAVIAgIXBCoVwCok4EgPggZDB/4VHvEP/4jBmAVBj/wHgQKBLgMGCoc8///JAMwmDvBvAVBg+D4AVGj/8SIUwI4M4ngOBg6GCCosPBAIVEOAIOBAIIMCCogDCsDkBDANwhizBAIIVCNogVEv4VBsEOCotgCoNUCosB/IVDhkAAIIVBuEDwP8CorkBCoUGCo/n9gVDQYK6BMoYTBIIcwZQOMCof/MAQVDK4q5BvweBCoLbCCoanBCYMGV4QVBJAQVBj4JBEYYVBYoUDCpE8AwIVI4+ACo94AwYVDI4MD/4LBCozsBCpEA/wVIbIJBGga6CAAM4CpJ7CCoRUBCrEYCpEPCogECFZJtCg7xCCoXgCpq8BCocA+AVDYpMB+AVEXIQVInwKC/4VED4MBqAVHh4SCn4VEjxgBLQIVGg//J4M4CoPgD4WAh+wCo4AB/CkBCokH+F+UwJ8CCoqMBjg5BsA1D/gTBCpDOBCosGn/gFYLUCCo8MBoUOfAIKBDoQVJEgI5BCozgCCoUCCoaGCuALBAIMBOoQVEj4GBnDbBMYM4jkAvxvB4AXCj/8O4X+TIMD4ClBnDZB//gj+ACoSJBCoP4v4+Bg+ATgMf/EB84hCgIXBXwIABCQLxBg6yCj/wGIN/CAMDFoYbBLoSICKgIABGIIEEC4IVCDISSCCogDCAgQVEEAaqEXQgICgYFCCoigBCpEeGQgVGBQYVET4IrEK4ppDCol4CpaVBNoz6BCob3DB4UHAwUPPgYHBQYbuBAYUPAIIGCj4vDAYI2DgF8AYU/wEeAwU9F4UfFALXEA4f/8E8j41C/gDBvwRC/4ADHYMf+P9/EP8EH+F/wEHJ4d/CwgABwF/+EDAoPAh4DBHoYAEj4tCPwV//xJCAYIA/AH4A/AHMP/n/gfw/kA4AABCsMMCAfDCssP4H/CQXDmEzNpoVUIIgVB+AHBCs3DhgABCso+B/gVlAFg6EdxgVWdwPAmEMgfwgYCBn4CBOBAVUgY5BCoM8SoMDAQPD5kMngVchnAgYWB5gGBHYMM5nAAQIVcCQLwCNoQCC5j3BQZIVVmBCBH4SdBgAWBZ4oVYh/8CoX/54FBBAM/AQLRBCracDJAgOICrgA/AH4A/AH4A/AH4A/AH4AJA")) diff --git a/apps/miniclock/app.js b/apps/miniclock/app.js deleted file mode 100644 index 9fdbab985..000000000 --- a/apps/miniclock/app.js +++ /dev/null @@ -1,55 +0,0 @@ -const digits = [ -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVqlVVVVVVVVVVVVVaqqqqpVVVVVVVVVVWqqqqqqqVVVVVVVVVWqqqAKqqpVVVVVVVVaqgAAAACqpVVVVVVVaqAAAAAACqlVVVVVVaoAAAAAAACqVVVVVVaoAAAAAAAAKpVVVVVaoAAAAAAAAAqlVVVVaoAAAAAAAAACqVVVVWoAAAAAAAAAAKlVVVWoAAAAAAAAAAAqVVVWqAAAAAAAAAAAKpVVVqAAAAACgAAAAAqVVVagAAAAKqgAAAAKlVVagAAAAqqqgAAAAqVVWoAAAAKpaoAAAAKlVVqAAAAKlVagAAAAqVVqAAAACpVWoAAAAKlVagAAACpVVagAAACpVWoAAAAqVVWoAAAAqVVqAAAAqVVVagAAAKlVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVagAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVWoAAACpVqAAAAKlVVVqAAAAqVagAAAKlVVVagAAAKlWoAAACpVVVWoAAACpVqAAAAqVVVVqAAAAqVagAAAKlVVVagAAAKlWoAAACpVVVWoAAACpVqAAAAqVVVVqAAAAqVagAAACpVVVagAAAKlWoAAAAqVVVWoAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlWoAAAAqVVVagAAACpVqAAAAKlVVWoAAAAqVagAAACpVVVqAAAAKlVqAAAAqVVVagAAACpVagAAACpVVWoAAACpVWoAAAAqVVWoAAAAqVVqAAAAKlVVqAAAAKlVagAAAAqVVqAAAAKlVVqAAAAKpVqgAAACpVVagAAAAqqqgAAAAqVVVqAAAACqqgAAAAKlVVagAAAACqAAAAAKlVVWoAAAAAAAAAAACpVVVagAAAAAAAAAACpVVVWqAAAAAAAAAACqVVVVagAAAAAAAAAAqVVVVVqAAAAAAAAAAqVVVVVaoAAAAAAAAAqlVVVVVqgAAAAAAAAqlVVVVVWqgAAAAAAAqlVVVVVVaqAAAAAACqlVVVVVVVaqgAAAAqqlVVVVVVVVqqqqqqqqVVVVVVVVVVqqqqqqpVVVVVVVVVVVaqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVaqqqVVVVVVVVVVVVVqqqqqVVVVVVVVVVVWqqqqqpVVVVVVVVVVaqgAAAqVVVVVVVVVVaqAAAACpVVVVVVVVVqoAAAAAqVVVVVVVVVqoAAAAAKlVVVVVVVWqgAAAAACpVVVVVVVaqgAAAAAAqVVVVVVVaqAAAAAAAKlVVVVVVaoAAAAAAACpVVVVVVqoAAAAAAAAqVVVVVVaoAAAAAAAAKlVVVVVagAAAAAAAACpVVVVVWoAAAAAAAAAqVVVVVVqAAAAAAAAAKlVVVVVagAAAAAAAACpVVVVVWoAAAAAAAAAqVVVVVVqAAAAAAAAAKlVVVVVagAAAgAAAACpVVVVVWoAACogAAAAqVVVVVVagAKqoAAAAKlVVVVVWqqqqagAAACpVVVVVVaqqpWoAAAAqVVVVVVVaqlVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVaqqqAAAAAqqqpVVVWqqqqgAAAAKqqqpVVWqqqqAAAAAAKqqqlVVqgAAAAAAAAAAACpVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVWoAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWqAAAAAAAAAAAACqVVaqqqqqqqqqqqqqqVVVqqqqqqqqqqqqqqVVVWqqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVWqVVVVVVVVVVVVVaqqqqqlVVVVVVVVVaqqqqqqqqVVVVVVVVqqqqoAqqqqVVVVVVWqqgAAAAAKqpVVVVVaqgAAAAAAAAqpVVVVaqAAAAAAAAACqlVVVWoAAAAAAAAAACpVVVWoAAAAAAAAAAAKlVVVqAAAAAAAAAAACqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAAqVVWoAAAKqqAAAAAAKlVVagACqqqqAAAAACpVVWqqqqqqqqAAAAAqVVVaqqqlVVqgAAAAKlVVVaqpVVVVqAAAACpVVVVVVVVVVagAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVqAAAACpVVVVVVVVVVagAAAAqVVVVVVVVVVagAAAAqVVVVVVVVVVaoAAAAKlVVVVVVVVVaoAAAACpVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACqVVVVVVVVVWoAAAAAqVVVVVVVVVWqAAAAAqVVVVVVVVVWqAAAAAqlVVVVVVVVWqAAAAAKlVVVVVVVVWqAAAAAKlVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAKpVVVVVVVVWqAAAAAqpVVVVVVVVWqAAAAACpVVVVVVVVWqAAAAAKlVVVVVVVVVqAAAAAACqqqqpVVVVqAAAAAAKqqqqqpVVVqgAAAAAAKqqqqqpVVagAAAAAAAAAAACqVVWoAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVWoAAAAAAAAAAAACpVVqAAAAAAAAAAAAAqVVaoAAAAAAAAAAAAqVVVqqqqqqqqqqqqqqlVVWqqqqqqqqqqqqqlVVVaqqqqqqqqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVapVVVVVVVVVVVVVaqqqqqlVVVVVVVVVaqqqqqqqqVVVVVVVWqqqqgCqqqpVVVVVVaqqgAAAAAKqpVVVVVaqgAAAAAAACqpVVVVaoAAAAAAAAACqlVVVaoAAAAAAAAAACqVVVWoAAAAAAAAAAAKlVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAAqVVVqAAAKqqgAAAAAKlVVaoAKqqqqgAAAACpVVVqqqqqqqqAAAAAqVVVWqqqlVVaoAAAAKlVVVaqlVVVVqAAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVaoAAAAqVVVVVVVVaqqqAAAAKlVVVVVVaqqqoAAAAKlVVVVVVaqqqgAAAAKpVVVVVVaqgAAAAAAKpVVVVVVaoAAAAAAAKpVVVVVVWoAAAAAAACpVVVVVVVqAAAAAAACpVVVVVVVagAAAAAAAqVVVVVVVWoAAAAAAACpVVVVVVVqAAAAAAAAqpVVVVVVagAAAAAAACqlVVVVVWoAAAAAAAACqVVVVVVaoAAAAAAAAKpVVVVVWqqqqgAAAAAqVVVVVVWqqqqgAAAACpVVVVVVaqqqqgAAAAqVVVVVVVVVVaqAAAAKlVVVVVVVVVVagAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVlVVVVVVqAAAAKlVVaqqVVVVVqAAAACpVVaqqqpVVWqgAAAAqVVaqKqqqqqqgAAAAKlVaoAAqqqqqAAAAACpVaoAAACqqoAAAAACpVWoAAAAAAAAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAAKpVVqAAAAAAAAAAAACpVVagAAAAAAAAAAAKpVVVqAAAAAAAAAAAKqVVVaqAAAAAAAAAAKpVVVVqqAAAAAAAACqpVVVVVqqoAAAAACqqpVVVVVWqqqqqqqqqqlVVVVVVVqqqqqqqqpVVVVVVVVVWqqqqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVaqqlVVVVVVVVVVVVVqqqqlVVVVVVVVVVVVqqqqqVVVVVVVVVVVVqgAAKpVVVVVVVVVVVqgAAAqVVVVVVVVVVVqgAAACpVVVVVVVVVVqgAAAAqVVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVaoAAAAAqVVVVVVVVVWoAAAAAKlVVVVVVVVWoAAAAACpVVVVVVVVWqAAAAAAqVVVVVVVVVqAAAAAAKlVVVVVVVVqAAAAAACpVVVVVVVVqgAAAAAAqVVVVVVVVagAAAAAAKlVVVVVVVagAAAAAACpVVVVVVVaoAAAAAAAqVVVVVVVaoAAAAAAAKlVVVVVVWoAAAAAAACpVVVVVVWoAAAAAAAAqVVVVVVWqAAAAAAAAKlVVVVVVqAAAAAAAACpVVVVVVqAAAAAAAAAqVVVVVVqgAAAAAAAAKlVVVVVagAAAgAAAACpVVVVVagAACogAAAAqVVVVVaoAACqoAAAAKlVVVVWoAAAqagAAACpVVVVWoAAAqWoAAAAqVVVVWqAAAqlqAAAAKlVVVVqAAAKlagAAACpVVVVqAAAKlWoAAAAqVVVVqgAAKpVqAAAAKlVVVagAACpVagAAACpVVVagAACpVWoAAAAqVVVaoAAAqVVqAAAAKlVVWoAAACqqqAAAAAqpVVqAAAAqqqgAAAAKqpVqAAAAAqqAAAAAAKqpagAAAAAAAAAAAAACqWoAAAAAAAAAAAAAACpqAAAAAAAAAAAAAAAqagAAAAAAAAAAAAAAKmoAAAAAAAAAAAAAACpqAAAAAAAAAAAAAAAqagAAAAAAAAAAAAAAKlqAAAAAAAAAAAAAACpaqAAAAAAAAAAAAACpVqqqqqqqgAAAAACqqVVqqqqqqqgAAAAKqqVVVqqqqqqoAAAACqpVVVVVVVVVagAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAACpVVVVVVVVVVVqAAACpVVVVVVVVVVVagAAAqVVVVVVVVVVVVqgACqVVVVVVVVVVVVaqqqqlVVVVVVVVVVVVaqqqVVVVVVVVVVVVVVqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVaqqqqqqqqpVVVVVVaqqqqqqqqqqqlVVVVaqqqqqqqqqqqqVVVVaqgAAAAAAAACqpVVVaoAAAAAAAAAAAqlVVWoAAAAAAAAAAACpVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVVqAAAAAAAAAAAAKlVVagAAAAAAAAAAAKlVVWoAAAAAAAAAAACpVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAKqVVVWoAAAACqqqqqqqlVVVqAAAAKqqqqqqqVVVVagAAACqqqqqqlVVVVWoAAACpVVVVVVVVVVVqAAAAqVVVVVVVVVVVagAAAKlVVVVVVVVVVWoAAACpVVVVVVVVVVVqAAAAqVVVVVVVVVVVagAAACqqqqqVVVVVVWoAAAAqqqqqqlVVVVVqAAAAAqqqqqqlVVVVagAAAAAAAAAqqVVVVWoAAAAAAAAAAKpVVVVqAAAAAAAAAAAqlVVVagAAAAAAAAAACqVVVWoAAAAAAAAAAAKpVVVqAAAAAAAAAAAAqlVVagAAAAAAAAAAACpVVWoAAAAAAAAAAAAKlVVqAAAAAAAAAAAACpVVagAAAACoAAAAAAKlVWoAAACqqqAAAAACpVVqAAAKqqqqAAAAAqVVWqgqqqpWqoAAAAKlVVqqqqpVVVqAAAACpVVWqqqlVVVWoAAAAqVVVVaVVVVVVqAAAACpVVVVVVVVVVWoAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAAKlVVWqpVVVVVagAAACpVVaqqqVVVVaoAAAAqVVaqqqqlVVqoAAAAKlVWoACqqqqqoAAAACpVWoAAAqqqqgAAAAAqVVqAAAAKqqAAAAAAqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAACpVVqAAAAAAAAAAAACpVVagAAAAAAAAAAACqVVVqAAAAAAAAAAACqVVVaoAAAAAAAAAAKqVVVVqgAAAAAAAAAKqVVVVWqoAAAAAAAAqpVVVVVaqqgAAAAAqqpVVVVVVaqqqqqqqqqlVVVVVVVWqqqqqqqqVVVVVVVVVVaqqqqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVqVVVVVVVVVVVVVVqqqqqpVVVVVVVVVVqqqqqqqqVVVVVVVVWqqqqAqqqqlVVVVVVWqqAAAAACqqlVVVVVaqAAAAAAAAqpVVVVVaqAAAAAAAAAKlVVVVaoAAAAAAAAACqVVVVqoAAAAAAAAAAKlVVVaoAAAAAAAAAACpVVVagAAAAAAAAAAAqVVVaoAAAAAAAAAAAKlVVaoAAAAAAAAAAACpVVWoAAAAAAAAAAAAqVVWoAAAAACqqqAAAqVVVqAAAAAKqqqqoAqlVVqAAAAAqqqqqqqqlVVagAAAAqpVVVqqqlVVagAAAAqlVVVVWqVVVWoAAAAqlVVVVVVVVVVqAAAAKlVVVVVVVVVVagAAAKlVVVVVVVVVVagAAACpVaqqqVVVVVWoAAAAqVqqqqqVVVVVqAAAAqWqqqqqqVVVVagAAAImqgAAAqpVVVWoAAAAoqAAAAAqlVVVqAAAAIqAAAAACqlVVqAAAAAIAAAAAAKpVVagAAAAAAAAAAAAKlVWoAAAAAAAAAAAACqVVqAAAAAAAAAAAAAKlVagAAAAAAAAAAAAAqVWoAAAAAAAAAAAAAKlVqAAAAAACqgAAAACpVagAAAAAKqqgAAAAKlWoAAAAAKqqqAAAACpVagAAAACpVaoAAAAqVWoAAAACpVVqAAAAKlVqAAAAAqVVWoAAACpVagAAAAqVVVqAAAAKlWoAAAAKlVVagAAACpVqAAAACpVVWoAAAAqVagAAAAqVVVqAAAAKlVqAAAAKlVVagAAAKlVagAAACpVVWoAAACpVWoAAAAKlVVqAAAAqVVagAAACpVVqAAAAKlVWoAAAAKlVqgAAACpVVqAAAACqqqgAAAAqVVWoAAAAKqqgAAAAqVVVqAAAAAKqAAAAAKlVVWoAAAAAAAAAAAKlVVVqgAAAAAAAAAACpVVVWoAAAAAAAAAACpVVVVagAAAAAAAAACqVVVVWqAAAAAAAAACqVVVVVaqAAAAAAAACqVVVVVVqoAAAAAAACqVVVVVVVqoAAAAAAKqVVVVVVVWqqAAAACqqVVVVVVVVWqqqqqqqpVVVVVVVVVWqqqqqqlVVVVVVVVVVVqqqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVqqqqqqqqqqqlVVVVqqqqqqqqqqqqqqVVVqqqqqqqqqqqqqqpVVqqAAAAAAAAAAAKqlVqgAAAAAAAAAAAACqVagAAAAAAAAAAAAAKlWoAAAAAAAAAAAAAAqVqAAAAAAAAAAAAAAKlagAAAAAAAAAAAAACpWoAAAAAAAAAAAAAAqVqAAAAAAAAAAAAAAKlagAAAAAAAAAAAAACpWqAAAAAAAAAAAAAAqVaqgAAAAAAAAAAAAqVVqqqqqqqqAAAAAAKlVWqqqqqqqqAAAAACpVVVaqqqqqqAAAAACpVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqgAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAACqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVagAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAAKpVVVVVVVVVaoAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVWqAAAAAqVVVVVVVVVVqAAAAAqlVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVagAAAACpVVVVVVVVVWoAAAACpVVVVVVVVVWoAAAAAqVVVVVVVVVVqAAAAAqVVVVVVVVVVqAAAAAKlVVVVVVVVVagAAAAKlVVVVVVVVVWoAAAAKpVVVVVVVVVVqAAAACpVVVVVVVVVVqAAAACpVVVVVVVVVVWoAAACqVVVVVVVVVVVqAAACqVVVVVVVVVVVaoAACqVVVVVVVVVVVVqqqqqVVVVVVVVVVVVWqqqqVVVVVVVVVVVVVWqqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVqVVVVVVVVVVVVVWqqqqqpVVVVVVVVVVqqqqqqqqlVVVVVVVWqqqqAqqqqlVVVVVVaqoAAAAACqqVVVVVVaqAAAAAAAAKqVVVVVaoAAAAAAAAAqpVVVVaoAAAAAAAAAAqlVVVaoAAAAAAAAAACqVVVaoAAAAAAAAAAAKlVVWoAAAAAAAAAAAAqVVWoAAAAAAAAAAAAKlVVqAAAAAAAAAAAAAqVVagAAAACqqAAAAAKlVagAAAAKqqqAAAACpVWoAAAAKqqqoAAAAqVVqAAAAKpVVqAAAAKlVagAAACpVVWoAAAAqVWoAAACpVVVqAAAAKlVqAAAAqVVVagAAAKlVagAAAKlVVWoAAACpVWoAAACpVVVqAAAAqVVagAAAKlVVagAAAKlVWoAAACqVVagAAACpVVqAAAAKqqqoAAACpVVWoAAAAqqqoAAAAqVVVqgAAAAqqgAAAAqVVVWqAAAAAAAAAAAqlVVVaoAAAAAAAAAAqlVVVVqAAAAAAAAAAqlVVVVWoAAAAAAAAAKlVVVVVqAAAAAAAAAKlVVVVVqAAAAAAAAAAKlVVVVqgAAAAAAAAAKqVVVWqgAAAAAAAAAAKpVVVqgAAAAAAAAAAAqlVVqAAAAAAAAAAAACqVVqgAAAAKqqAAAAAKlVagAAAAqqqqAAAAAqVWoAAAAqqqqqAAAAKlWoAAAAqlVVqoAAACpVqAAAAKlVVVqAAAAKlagAAAKlVVVWoAAACpWoAAACpVVVVqAAAAqVqAAACpVVVVagAAAKlqAAAAKlVVVWoAAACpagAAACpVVVVqAAAAqVqAAAAKlVVVqAAAAKlagAAACqVVWqgAAACpWoAAAAKqqqqgAAAAqVqAAAAAqqqqAAAAAKlagAAAAAqqoAAAAAKlVqAAAAAAAAAAAAACpVagAAAAAAAAAAAACpVVqAAAAAAAAAAAAAqVVaoAAAAAAAAAAAAqVVVqgAAAAAAAAAAAqlVVWqAAAAAAAAAACqlVVVaqAAAAAAAAACqlVVVVqqAAAAAAAAKqVVVVVVqqoAAAAAKqqVVVVVVVqqqqqqqqqpVVVVVVVVqqqqqqqqlVVVVVVVVVWqqqqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 52 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVValVVVVVVVVVVVVVWqqqqqVVVVVVVVVVVqqqqqqqVVVVVVVVVWqqqgKqqqVVVVVVVVWqoAAAAAqqVVVVVVVaqAAAAAAAqpVVVVVVaqAAAAAAAAqpVVVVVaoAAAAAAAACqVVVVVWoAAAAAAAAACpVVVVWoAAAAAAAAAAqlVVVWqAAAAAAAAAACqVVVVqAAAAAAAAAAAKpVVVqAAAAAAAAAAAAqVVVagAAAAKqgAAAACpVVagAAAAqqqgAAAAqVVWoAAAAKqqoAAAACpVVqAAAAKlVagAAAAqVVqAAAAKpVWqAAAAKlVagAAACpVVagAAACpVWoAAACpVVVqAAAAKlVqAAAAqVVVagAAACpVagAAAKlVVWoAAAAqVWoAAACpVVVqAAAACpVqAAAAqVVVagAAAAqVagAAACpVVagAAAAKlWoAAAAqVVWoAAAACpVqAAAACpVWoAAAAAqVagAAAAqlWqAAAAAKlVqAAAACqqqAAAAACpVagAAAAKqqAAAAAAqVWoAAAAAKoAAAAAAKlVagAAAAAAAAAAAACpVWoAAAAAAAAAAAAAqVVagAAAAAAAAAAAAKlVWqAAAAAAAAAAAACpVVagAAAAAACAAAAAqVVVqAAAAAAKiAAAAKlVVaqAAAAAKigAAACpVVVqoAAAAKpiAAAAqVVVVqoAAAqpagAAAKlVVVWqqqqqpagAAACpVVVVWqqqqlWoAAACpVVVVVWqqqVVqAAAAqVVVVVVVVVVVqAAAAKlVVVVVVVVVVqgAAACpVVVVVVVVVVqgAAACpVVVaqlVVVVqgAAAAqVVVqqqqVVWqgAAAAKlVVqqqqqqqqgAAAAKlVVagAKqqqqAAAAACpVVagAAAqqoAAAAACpVVWoAAAAAAAAAAACqVVVqAAAAAAAAAAAAqVVVagAAAAAAAAAAAqVVVWoAAAAAAAAAAAqlVVVqAAAAAAAAAAAqlVVVagAAAAAAAAAAqlVVVWoAAAAAAAAACqlVVVVagAAAAAAAACqlVVVVWqoAAAAAAAqqVVVVVVaqqAAAAAKqqVVVVVVVaqqqqqqqqpVVVVVVVVWqqqqqqqVVVVVVVVVVVqqqqqlVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVU= "))}, -{width : 25 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqlVVVVWqqqlVVVWqqqqlVVWqgAKqVVWqAAAKlVWqAAAAqVVqAAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAACpVWqAAAAqVVagAAAqlVVqgAAqlVVaqqqqlVVVaqqqlVVVVaqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqVVVVVqqqqVVVWqqqqpVVVqgAAqlVVqAAACqVVqgAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAqVVagAAAKlVWqAAAKlVVaqACqpVVVqqqqpVVVWqqqlVVVVVqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV "))} -]; - -var drawTimeout, savedOptions; - -function queueDraw() { - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = setTimeout(function() { - drawTimeout = undefined; - draw(); - }, 60000 - (Date.now() % 60000)); -} - -function draw() { - var x = g.getWidth()/2; - var y = g.getHeight()/2-31; - //print(y); - g.reset(); - var date = new Date(); - var timeStr = require("locale").time(date,1); - // draw time - g.clearRect(0,y,g.getWidth()-1,y+73+24+18); - //use custom font spacing for overlapping digits - g.drawImage(digits[parseInt(date.getHours()/10)],0,y); - g.drawImage(digits[parseInt(date.getHours()%10)],37,y); - g.drawImage(digits[10],74,y); - g.drawImage(digits[parseInt(date.getMinutes()/10)],86,y); - g.drawImage(digits[parseInt(date.getMinutes()%10)],123,y); - // Draw day of the week - y += 73; - g.setFontAlign(0,-1).setFont("Teletext10x18Ascii"); - g.drawString(require("locale").dow(date).toUpperCase(),x,y); - // Draw Date - y += 24; - g.drawString(require('locale').date(new Date(),1),x,y); - queueDraw(); -} - -require("FontTeletext10x18Ascii").add(Graphics); -Bangle.setUI("clock"); -g.clear(); -Bangle.loadWidgets(); -Bangle.drawWidgets(); -draw(); From bccac2e2bb9d0ce2b9fd6a8319832c9e2713492c Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:10:37 +0100 Subject: [PATCH 031/476] Update app-icon.js --- apps/contourclock/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contourclock/app-icon.js b/apps/contourclock/app-icon.js index 38b19c29a..d7c3d5255 100644 --- a/apps/contourclock/app-icon.js +++ b/apps/contourclock/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("2GwgI74HIUB/4AC8AWNwAVTgNAAQIYBAANgCZUcuEAkAVRkWYgMQCqWokEICqMe1ERFaUC5EIK6RtBgqDGvyZMgSvCCqLbDFc2AK6mAQanwV6mIgDbTxEBFaUiFYJXSj3wgKDC/4AC8CvMQoIVUAH4A/AH4A/AH4A/AH4A/AD0eAokDwAECvgRF//ggEP//8BIn+AYMfBQsD//4BwIAB4AJBg4FDAYIVEh/AvkHBAMPGAImB4EH+EDEQN/Coc/gEcBwIGBBoMAnwCB/kHBQMPLosOBwUAvwCBvAYCh5SCGwUB+AVBBwQ+BBIYnBEAQHDDIUGAwRqBwEBEYUH3gKCEgRFCgwOCVYStDgYgDnhsDCoJsCG4KABCoQ9DPoLKECoxoCAoI2DhwCBDgQVEgHgBgQbCYIaGEK4gVBHARdCPAYGBDgQVFuAVIAgIXBCoVwCok4EgPggZDB/4VHvEP/4jBmAVBj/wHgQKBLgMGCoc8///JAMwmDvBvAVBg+D4AVGj/8SIUwI4M4ngOBg6GCCosPBAIVEOAIOBAIIMCCogDCsDkBDANwhizBAIIVCNogVEv4VBsEOCotgCoNUCosB/IVDhkAAIIVBuEDwP8CorkBCoUGCo/n9gVDQYK6BMoYTBIIcwZQOMCof/MAQVDK4q5BvweBCoLbCCoanBCYMGV4QVBJAQVBj4JBEYYVBYoUDCpE8AwIVI4+ACo94AwYVDI4MD/4LBCozsBCpEA/wVIbIJBGga6CAAM4CpJ7CCoRUBCrEYCpEPCogECFZJtCg7xCCoXgCpq8BCocA+AVDYpMB+AVEXIQVInwKC/4VED4MBqAVHh4SCn4VEjxgBLQIVGg//J4M4CoPgD4WAh+wCo4AB/CkBCokH+F+UwJ8CCoqMBjg5BsA1D/gTBCpDOBCosGn/gFYLUCCo8MBoUOfAIKBDoQVJEgI5BCozgCCoUCCoaGCuALBAIMBOoQVEj4GBnDbBMYM4jkAvxvB4AXCj/8O4X+TIMD4ClBnDZB//gj+ACoSJBCoP4v4+Bg+ATgMf/EB84hCgIXBXwIABCQLxBg6yCj/wGIN/CAMDFoYbBLoSICKgIABGIIEEC4IVCDISSCCogDCAgQVEEAaqEXQgICgYFCCoigBCpEeGQgVGBQYVET4IrEK4ppDCol4CpaVBNoz6BCob3DB4UHAwUPPgYHBQYbuBAYUPAIIGCj4vDAYI2DgF8AYU/wEeAwU9F4UfFALXEA4f/8E8j41C/gDBvwRC/4ADHYMf+P9/EP8EH+F/wEHJ4d/CwgABwF/+EDAoPAh4DBHoYAEj4tCPwV//xJCAYIA/AH4A/AHMP/n/gfw/kA4AABCsMMCAfDCssP4H/CQXDmEzNpoVUIIgVB+AHBCs3DhgABCso+B/gVlAFg6EdxgVWdwPAmEMgfwgYCBn4CBOBAVUgY5BCoM8SoMDAQPD5kMngVchnAgYWB5gGBHYMM5nAAQIVcCQLwCNoQCC5j3BQZIVVmBCBH4SdBgAWBZ4oVYh/8CoX/54FBBAM/AQLRBCracDJAgOICrgA/AH4A/AH4A/AH4A/AH4AJA")) +var img = require("heatshrink").decompress(atob("mEwghC/AH4A/AH4A5jHs51wlfs7ncqEAg/N5nc7cwvgLB7uACwME7tgg/B9cwgEJ9EA1wOChfs6wEBg3bAYOuyADB5ugG4VeqHTHwe9iAECjughYMD7pCB1UwhPA6sEqpMB40AnQLBgnQhhBBAAP5gEuxfAgHUz3e3ZMBA4ObvYDBC4NwxQ4B+oLBgXAhPt9EhgFtgHDgGZggXCg/t5sggH2gF8g3An1Qr1ggGcgG6gF+52QKYJEBhgXB/RoB71wzcAhVwgvmgFfQ4SDBEIIXDO4MAIQN9BINwrypB5oqCgFsCYIXD5nBAwMBju13siOwML/1AC4U82AXE4HNwWe6kD32yjoOB3vlgGt5uwgYFBC4kH5m28cA3dycwML65GB6MB6EA1MArWuC4Pb7eFxuwhfa7wuBhurfQI5B8C3Bg/qu4yB11Y3e3QYMgxoJBg94FYOd5obB48LSwenAYUA1cADYIAC7IEDg3ghQXDzswAYMp90QDIIACp2hAgWOZIPs5gAB5/8zOc9lb9fv7gLC53u3OZ3vWEIYA/AH4A/AH4A/AH4AsA=")) From 588e55a3f5d1575415f4e50b8f9af9d0c06ca0a3 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:10:57 +0100 Subject: [PATCH 032/476] Add files via upload --- apps/contourclock/contour_apploader.png | Bin 0 -> 15659 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/contourclock/contour_apploader.png diff --git a/apps/contourclock/contour_apploader.png b/apps/contourclock/contour_apploader.png new file mode 100644 index 0000000000000000000000000000000000000000..9e263152c7f43a0c8fb1e1b476ad2f5496c5a9b3 GIT binary patch literal 15659 zcmZ{LV{j!*u=Y90iEZ27Y;4|t+8Z0c@l1^~Ek?qq8unsmg9{_BWr16eiTOE+x{(EG)bHHvCfmGzcRb^fGdIUMZ) z?b|~Mc7F8zd)gNGeuzU>d1Xvny((XM`bFq5Ji)Q!_x<6Gz`wQkXYc(TuU9Wgd1*v;7JskKuG$3LZ2k1g{Pd{3`|7{ao+sYFuUx*aglT+z346b9 zM%O;fzAqelzvDix8h>H^d)ez~z%H}zLD%c1A)njR%S(LrlT7+o^tI!G(s$;S_jq>Z z*X?@y(bh-5`+DcA#Us$?o9o+!KD$ ztr;vwPQy^FTAv+5rzo!7^*7w3QOI{K1%}x6B-!{Es_ykg$+41HA9i(_Pfp*yG=n^z z>nGQ9??;&KpOB1{QQx<5A4NppJbt~u&iOiiL-+dqqPwM=v~EYxlJ|R}g-6|8%f!_A z^>O6;i1#na5Dk;Qbvg$s+t-J&LHg}LXW}~BUGHJzuYyIeYcFFz>cd7z77PsB8?G`8 z+Z(1aT!72qqK4Gg=g%N&Xz}zVx!@9L`L>>`119o9?CT=N?rBQV@ z-1m~>SeTgzcL&GX=iaMQgjB*M+liGN7U9 z^1}AHaWvQ8`H2#$yWDQ0Squ$rj}$cx9iJFBj@zau#;)7e4??e8_eGLV1-_Xa-_Z;X zUEPaQo!>n-e|T=a-!^5K`W`Q>>-ru}-Ku=FUfR^*`ZRCrYA}1NDWgoi^gayPe785- zWIzK_2{ZMY)4(VWEkIaoW5ylH8THhJnXhPIp=dQ`WVBNteJI2eLPPicj;jFuYnrPQ z#XlL>C_ghUs--Uu`ZJSGrm3&p-+l%yEDS~DEb)bk)|X4*>+S3bk@MWy?-Zu^ltx#aChvmVb7B-e|lYL5c1OJjDvUPdav`J!X__kE9&-`IHFG zf1AHPzPxz2L2|IbX%+mc*^`{<3q;!oa9tbWmyqN8r8bQqU#6S><^F{A#C0F>sq4&` zt1-4rS+X)dbJp7k%G-d(odcFB_d@#ChS=Xu!J&S z7p>Ug+u<{9j+ix`@^x?Sr{{8w6BCj)k`GC5uJNu*?MCC3pip{O9;9e23W<8jTEX;jHn+l($K3{(fQo5XGA{(P36)MCUph-mFP5ap4M+_Xjd|%bROAm*x zKhL0w26SCp=UqovF19rt#RM>-hI#iMi(Q$S<}a{1H(2sGVM^zM_Y)_ZkS%w*WD>S& zkPh`a(|KX(;-!D#!C#p$KL7(yD?ozcTuS1pn^b5qESLAx!LE|5RVy9O@9Y-Ue6LR)T3#$nT5NnV8Fxs5bU7iAHj& z_ul(mcPDLfqtwMZUT%eV`y!qC=dqh=#cZm4mU%YIrj&2?;ePFd} zv>d9tIh?9t=J)G>RqT?4yB6;igziVPJ|L#(3ZXx^Oe>hu2=0BhT`l*swvD2bJUvYH zb^K_9ISx)zef!t}?;s z=0-L8r3nHoK-xo+1Cg)t{eDhi%Ad^`AgM>;qz{E_W?;0J$7e=r{&;oIJL5srj1el#w$zp>BkcJz0=;_ZD6s{^3C3 zvz9B3v7f{DBaPbuY|(|=xUz);6L?SY{X{Yfi^w(~QT#W6ORHJ`5zVF#R>s5-+&Y$^ z@$rG4tqaXwgXz;>QY8IwJ05u+{!PC}SJ=5N{k4geR-%OwNMOikFM!XU>R{ayu-5-u*&VH;R{`8`>1n+-FvH!) z*nvN{eW8Iw-GI0uQnzDHg4T{aw7=(oBnS$GSUQC9hqUL&A4f2BdW^?hpW$$x%_v1a z6l_%rg?C3QL>AsnJ|77u<@J%SdpIKIb;!#Y1Z5POGfpp!+1o+~2H!NmP2QpRgIpbn z-Y(eVPm^F5v;4+JLvz~kP>%@o>9S|y40~E%e5Cg%Xi)MSn`dvvd`xze73sux*Nw@^ z@6>GYYpC6@h@!v)D4I)0q+gv z8RUAhAg5i~i{XgSqb?N&LRuIo3oVTXn(};XyRE8Lx+_-B)AFhzriAky!u@zQF;RXF zykuRQc=&bz;v?@;%I2Xe$ZaBxk zS(I3FjI`XS;}rV@LWk7tr5qUG;`p>QaoliViy>B)sW!nl)Eb;@Df}ajWxALkHP*_y z=xK@w@qT^JYjIgsK_fh!+wdSbDr9Wp!RGOhD7C(OTJt;~X8N(On4mY5;ubm39%nV! zQKYI#6&r_Fz4~x~mM}&b(Tmd(XX;0ySg<(qNbC!NH2I`YJiHJw7rnI<6s9DBwC{mgy>4;CQA4bfZ`c9-AdL{)U{G=Ahz z(RyE^15zE~!?c#TK(xZc2#g*_I5~^Igw8FdV1Ci1cOUlB4`V8 z22vGd@zfEsB?q6wE?^I7F<`m#Tnmi|U`pNjT^uHfaYpM1yN3ncCP!IIyBCTZs_Nsz zu7ZfKD?--7M8I^^IZL1*_W%fEB@y3=X;@QEyuhn1sK4mJu<74iFonwChj{U7Ym9dbTm`LrJa?vsyyJ$!HCB&S6FEI*Imd6D;?A`)YfD4>IzXQp{ zM#y=iOu-Q!FuoyiCzkSSdsDBpitqy@jY8IKVynZ^9-!O;;Mp9mIAaWj^N6XRDr&U| zHPDu7Q)GeguKNWhU=ZZ`e7aDuag!%hnL)=iiJl9h`_RtN;+&Xtd8<@z;CbU5)RzZ3 zssX;r@j~vgM@bK@AGaAep(x^{yDnO3}dwLjFMVio6> zo~ZKgO5gaZE8!Bg={U{mEZ!LMVIzrHHAzVb1Ku;#ufn;S!iY5zD7Jb?$6T3Ui$AsU z(~1%4ah2iDgh_J`Oc@f{j}&nh^DH5y%p^?#;sf`7$ly z&O91ptnJ9yNdH8HN_$k%4uC&stR9GErPB59#Jl1dL*VW0&M#s0@Y9x6(MpXl)O-Tk zyRS7(`#I#&Iql({v>z$enoxu?)Wl1kqyp|EUz`EBxs^ur9{p7ojsE`pWkIQ*9K;no z$EP32Rr2~=mCN>8kHkRVFr_$6c6b*%(V;-TTy-%+(hD~W5(iB?Yv&Gu`G1ub3lFyd zy8YBQ?0}zEnaRSefL7^YNt!oij)~281?a*JYsWwwMzqpOtP0KEEtm{MEi$G+TsE?y zadPkZ(U1ht2{~_?j>sp4X=7?x(EZ@z1WF5fGUcF+)YMR*(nfmvegAz|fycPmXwGvn zgwuY$avmXXX#Ek=5zQQ0aZ)zSKeGqJxb3ZEav&6GH--h=FfwM?`}-IK#cXlYfkj)v z+B+&oyHN^WtI7c@f`my8-#QYL$kZb_3_rR%6syr)N!XQz?qOazX^xnN2R}8|?n(h$ zL^CwsxCR{vZ;y*yZTU%;A$mrE`EFaPey6dkr~)@m&R^6Dc0?1Q_AZjLp2z9 zQ5>3bJ8B$-nJh)MQW7{V@(NWH@!k!KflU1iB4A;p7d^)HwEJl4z0mTES4cq=IdoR4 zd19@y>tM^%oISas9m%PIpasKx5;5VcB(;MKVNa-RI|MpLqmc#JA5uU+?`O&x*k>2V zDw12dKcc;=Kz@+Dj=jT`Ejxid|%pqHkH*w=f8WyV=pUAO;I3pz-*oA9PT?UB9SeHL=js$$X-d{3KM9mjbeIb7B30yuLm}9Js?Xyt9(<`nFNEL3;X&tT>PHxk z6uS2owvvpR>GzaZIx#h)WWTgukLG#>*?AxBg9MOc9J0a8X67|EYtg5trq72>Fdfqegi>mLQ_5eCJcN%E)3 z6c&Yait6tEfo5qlpiTLY`X8^$sYiX(*evg`YhBl7gmPD{%$qsC}xQe&^(oRC&V1;Jq?&R+)ql z;dq}{k&V}a>=)VP?|3(4KJPl;0;O6ihz8IicqC_BRk~IRe)~LaSGLc@5(qoK=Cu{V zaseGSTv)U*d>;71eJA=TSWRZ9cUcDnKYNDqnt?<_4UCx5Tes9{XIB98>Nw;X!1D$i ztp-u9ttXmR$7rXrzcbVr%Uo#Qc6AY&v}h8^MR zVzakB6D?}ExShBV3etd&N+Aw%$O^YX0tZMYw!sO@Gcc0o?fH=t&6DUVavp{smMx%* zCU{@~q9859y`2G~X_^Xz?>2wkv}Vx`5`IMrL<#6&S{m9w&SIcZ3^Yx=UhVwv*spT& zSgU(-sf4e!Bxz((J8&;4$Lf7&IMBji%2SE*6s_8_IIlsWvIw0>i8Ovhix?NeL4OKQ z;^;yIuj$4L1{<{9ggS!W8z7RM{_#X}@eG3iLv2{ZuX){}ddcCh9Zi`xv>H`i1^v&E zr|r!HvnU_L?hA?w#|N(o?yqHfpejseJ&-$9Mz3lL!#GEc z#z6?{(h>P0*^m$v`F_t!g!?e5?x!~l^>D#)(5iTC<^3_ z@;^{8)gzN6dPrrZOJRu!(%i8Joh zU0=i=hWm^}G6jJ6bQScHrh^n$$HGvXmj;(VS|f;NI#|sh%9Fa@H~>NQHNe39~7 z7~_y)VDR5X+N2pdUexk+c~-LtYRK#U+&J3PBZL@w!ldXA#7iL63uP4~sx2whgPuT> zK+}5*jqFdsg_94B{njPS0cq$Y;Zh9=K(bw7(^+}yO4~cZMa3;+Fq#BR><@u}wFJb* z%zTxc7ploL#0Ib<5G9#I9Q)~PQzddR!$BmShFYyV&G%h6E-J|*EGt=Ee^e}`r)!w| z(E@^rkh(qA4*(7?x{J5ke%|7+@G``?eAvIxQcO9qiK;FW3a<#YLL(A4c*+)iSi)sW zn|vK@Z3x6JmeN1_9ajsZX0(E3nIy9WD|2>|ZlCkN@KT07t@vOnv~)%1M2u$gy_D;2 z1nsu@z^%e~+;^Y_xccR)EGs-b3h*O%i-%d9_kg}~~Wts=*6Y@0z0nyW>nHl!{vEk^sOn)9Ko2ZQ6^s_?^)Im9A{yOY&nK~kx~ zOcCoyd}+PB#-(!4gt1VNiJ=EB*e#QfbRaW01K^+{c;T8L5CouEliuZ}Jkb|Pm~1k| z1c&#}6U*XseJP0JGT}xHA+w;d127l`x1S$a@KDrFlrgAoj8xyr+3I6Vo_kjMYfTUc zB~B>DW|Go6eqJ#n*BbGCTVVqgg|MO3N86cGezlKUB6uvb$2 zq*(QG*12=(YjekvW9+-Z3J~|l@f4DLCeN8jM^a(6)fiOAT$YQrLm!CYh0BJn805N)1JBX*kH{i{{_dF& z*1_BrvBw1+oZEv>-kQcdgV-#mg5Eb^HU!XYX^_x^{RL&C_F%Et%0XDH04@*gfD}_B z;cY|M6fS%&j5>`5r4N$rU?W}Bw#xr-WnDe#pPVqNOtt#VO54!h z_~apjGvyY$kGE2`+r|9Xk_PNrs1sVDrSR=FH?ifgmFXd>3j$Jp7SjqW${`ZImDNuu zHxOzXnt>&cJJHt2Joo1zS*O9NbzkuejXLedAZ_^Fb}=VWbSW zq&RlaT-bir;x-9q$!F^ySboYoU4ro~fcJ-&IUH04{Em!w{#G@D-0^AZD2L-W&HfXf zQ!r&L#sbbZ92%;5$GG8^j@r>z{tN!DRjYM8smJxTOh8svlr4kpwb*L;qS9@ERf><7 z{p}6b(qDl9>d_q?oTn5G)O}43uoX5rSPH*K;2P8qH z66Wkbb`h!h6h`dW;*BBj{5OI$f+)qMRA^3*P$Wc!80=F?ZL_RDi|cT$|GB6Mv<6xg zA;GAnMwSD{^E!LBHBc18wg(!qD8%9(#bK?Wd!ZT=(dyfuGk%@d=6_$RTSyw%u81K? zfuGVhM^*At>FbU5!{-PxK-MwFE$j93)>x+&<-+hJQl4i&s*|B?Y%s!VyoUHcoG;n4(h)MKdeK!s?KW` zu`{br2AUdtsjZzgGvvW%>q-=qV0^h}95{Z%9}uFc`4r5}i#8fj@o3E0wHPi%7N_(& zM7sSHwO(JRt*T*eu9?M)%_p^kPDk*|21$bj@FsgVuT0+JETOGd5>~iFrgZ!!%wh?v z!IHDpI%p^%ELFrgA|JoCN*mG%x@)0% z8*AFF`c+jPMUIEIs-j85DBmS~=#-Qh&HVSkc!+yk&TiKh$2D0>=aj!4(AC{Sg-;bz zRrn^Lt%TN7=&i(Es^Us}*TvNfME<+BQU%74TY7s;=8aq2{lw20!fX1a>35FeHll2) z92gA^u`dKUO*9{jNhiLU%-a9LN~2X=i7Ob2arXsnF9$wE2&RoeamdzX2&U@`GJK4` z2Veb@Eg1#6t$m~>hrU-q3XUo+t3X^{G2`-|Qe!z(GNjJb8}ppqw7=M#Rx8gM5g&`+ z&VMMdR+lPRW-F!O0>v~8>YoJMIo`7v|u(f4Vu|{v$Cv&ZCDqutmjf;{}O!PC! zcD`JM?BC0NeD#*%8Fa#4GmS7O*kHbi&7m0D`l;jsB>&nhCxmZR?4p>lgem;5?Nu{! zqo8e4FUDeh&uxwcZOI#r#>_3jY+Ts-!c6*TMVc7QDl}7;z?~cr(!Ov0({UL!9{~2c zDq^%|mM*W373%#N4$G?l$6vFD?&4@@aMINJq9|_;)iaxLEW4@KTcNd@aM=V$+j`%a z6%vv0+aYnNEeIY1TyqQ1K_H@hl0@lFRyO27O42%Vep#yH`RW-Xl-JEe%`2H1c#GqC^e56g{Tf|Lua>k>*RZ_g?plXfCP#-Sbq=a?-U@&pbN!hms z$FJT9Olu-A7FHrp7p{d&xy^tJ;Vi{YMd(G+>aDQ_Iwm^sK)&jq;j#;lz0visQ%$)> zB$;nw+cQ@HYv>T^M!6E3L?g_IQ4Glf+(mWga;s8^D%xhtRqTbm-R?JgrMA_%b9PZi z*OSn4_~L0kas*N3Nttz@hd;P%#u^17#1yWwl`D49e31L#Y!X7Jiphg8SQxPOzkdog zp;S2*xrSDT%kyIi8q55EUq6}9bawGgC|7Hqa=L_q*2LOm-dr{m`w5gQ8#%C)prj6ofi1g4>>0?hQR6?|NRwbgGROx1-Nt?zb zaUJEVdnrh|7xO zWMj)a7`4BlMApzyKscg8SS|LHeSepQqH$Y5akjF~Vwj`KO|c6#3rnZ)T@|5~PkwoQ zm+^#pMdjO${5jBM(<~}f+5xgSSpj^Fqt8oCeerUvotKCDWqn5t|`P+ zL6TM)LAvoMuUP`|yOk)K30H9h!K|3*pa*#4SLZ4AE%+iE9wME_q)lOWQ4Da^__j|8 zOIq_Q@UMxd8wvAIb%&SLtu`I=Z)5_zVlqu=_$}RF!lP7@*neK)Lk9C-OJ@sm0O+8S ze=Z{J$!qpo~+p=GL zRFC%dk9{s%>mMytSGOSKG{s%s3@S~M$tD}SVfBLXWwVwcV8Wf;R`|gpra$>Lp@=c2 zIpH3z3YA^%vD6^-w+V04hh6gM8s2W*3jj-~Ki`r1T8=IeQn=`GMP2iR=-5V{4m-z=il@j_`qV`)BmxH)(LYQ-!I3D7nVv z`&Fdk8XF=#ng>7j%1zf>wEJ^v)Ed+;;p5mAt%MPV#)6FA8%Xlw6mXLYPj{Pj#6Fn( z&4S%A(K*yo;g0 z8@}b-d&3n?3iLo8RZE@>9g)93-9CP{T~>^R#-?2(&U~l)6nz9)F%^sD!ff+ON9%*D zsOY>e#|NP1HnVk~v>+P|Y_5OdxYXrYy59M2^WSHvz42eBTY^Wk*Oz}yV6YWdU1;5! zyOI(mZM@O^6CsHBX?q{4pQtL6jIB)b_Zaf!oN~ispWCQHdB3%72$zFmZ?C4{;|6JV ziE_{C#F*)LF_xRpK~#h)xJ;B;KYsw`1fxy~)-KMhsUvuv8FQc|(Ckwc?H!)h(iTAo zqaX%Dl}}~(4}-Crf-N3uO46cxrrz7O_`KOsp%0%GBSDEaKQY!76lNC!>Eji<@29m;^gOGM!8nQz){#~aU45}ybQ`c~E!QE;kd)1he>ctq53#oo zLfi9VBYD5|4;o@^hOstJ47pZ^mBA-P48LR}I{Uw(9jLD-WdD5pF)@Urn;IWBN;bGj=Acpo#^(a6k#*y&p@bRSvwmY($Vs| z^L+hAa=SeTC=gfVk~gc6COV-0lw*hE27Lo*O3#5W=8sj{)UpY&pu>T21jcFuu5r7_ z{tm(|;Q+S)95NX>ykK1n+6Ft6wYqM1;D@e^n5L}GG9(2~6`g0HrY#L;N2{{f&5PU* z^&IDXu{s6dx{XfFs2vceuE94E^D|U6%s6PNn?|BF%iA=0O7sU>>%?!y+U_RzWT>)+CfFd|+5bW-zo z?>ha#F>*MA%H>+?pwsYv{L1;8A0)6m=DrzUPMeOKybq(Tra~-@rIw^UFT5r}fLxi` zDnI>tRGSmlk=aM9 zq(?O@gy#uzttU@zfQ_85>Dq@8NiX+7FW(Bh z@qVQEYwC6)V@2P0^(<}*loLCzy(#JuDv-$+DK_TzV)Nx^an#S18;Z=PoL}!|wO(90 z@hjzieyd-0$_jO?_Tfp0QVdAjVunwxenEK@G2XEi$p-o<9G&QO|W*&&kaDG(4?I?x=<6~jp1 zoLk^9Ph@CyU{)i*$U@3c-vZj=-}*&VoM#Np6lI65wF4_l{Z+;%`_@nK_*$* zLzXEGPM;OI{E^%QS)9obE4+yig3sm4It2FI&#M+3RMZzgF}7z-EA$$1wTZCHmMe6E z`uTVCO>TbEp*VTu-t3Gib10#6py{m+GF)FK4q>IkZ+=k%WQ3nou{q_ zuleMF;v~6n$d!_A`6D6LMClc*kVJ=+Vlu+~F}&qJLO!b7)YiFJ*>RWg2I{ukm&j`+ z3<9*O4s?~KmQNfW!R2DAD9}9Z!Eb(wiOiLyuf>)WoNJ&UofRa_>JC=_v}IPIuDZUDV0Zl zxrw)!0*kw@wp5hXM5d?tsQjW)#S5Aii2}FipUc;J zQp+Lgj3YX%R<^N`Fr~T0))N0AicOPXFUhy+pao<|Zg-~hV(>uSkB3mio%pHB9WurE=|+f3Kp+ZBvQkb6rteX^@m?HZP%ZA4xsOhU>JkY7D+qPmnT0 zR(c)PA$EN9I&oW;D2gLo7pC)LFse)uK1fa_S%k=h(fm866bMEtYDnFG+5A~oWQIao zNH*NG!u-XyY%}~f9uAB+&9M6TwbB^u52wVnwI5ze3tuHIZu|&73P)Yao0^}E*jHk0 zj_|g~%w(gC9JFjsjmz21c0ysIJX(N9xN_mOQ1h<2LK41L)%nA+=Zdd|V~4nU)^D|Q z&|J`rliy~$&n-@Tt*O^oynk(^MYjX1Y#`XoU~v@-o%8+51(A9OtW@YRP;1jzP#?&e zF5jMM^ohTEd@Q0)Uvrj6!6~Pwt%i{KJUEMqhseX*BDca^>v0!8OUgas=rH{wP<%y* z>`?6%0t-Ut%Dfn=_k}pIKBojscoF{^ll-aX{hRw0O?5?H!}jY0Z0b)3uUw@bhIqKN zqHp5nLSnuarO+uY`Q7epg<*y>Cz5xIg^k9NNM>XWcZqo5{;oGG97d1$t38rS>B_9X z1;GseOrWD`-QI0$hUAKaeO^{h4=4worRL8Jl*H9-P06>Al1KUMVJU*~qlHM=(M5du z@34M*8H>3;IB{e*Z^fzT*$B&_dsak5_766Q1b~iOFpfo0$Pin$HZ*t`PMnTo z#QDY_hGQei3zKOhkbi59Dfnu)_HctbDaGDA7L^F}v-b0i(^irjyB8qaN*)I{wEGMG zupOj8CQuw=xKJxf2o)+Q9Y|%*{E=U0yx~>i)_Q_M=3}M9S_@tBE_2nlYFZuTVtc9; zLU|6E48x^oNM%1plY*5cQ(`{^P^k~dc=7kR4)u51o7$o=8CB_pajirUuHIL;*TuSJ z>YHCT7w}1PX9B_0cU$%TZ9aSt&cog3kyMYe*fv^U>hS9L$iaBa$)bUCzYm^6IE=r9 zvNObY?05KD7V3OJjO;Yq$(RF=KH5Q(LkI;ltlyhIW-AuOdoANu7OpjeoS1SB1y_Z9 zEo-aDSuMy1^m3aof>rgVJZ8XTtC4cr2oT366*p<*sii0CilmSgw8Ne)ucW|B3?A~1 zX8a{>U*&F#>i!u>sLO4>c1Jf?! zg8)X)ImbF6@CciE{+Kp0kLv3_qA_ocdcUW;+lw!vLd8INPM=54IS?Wv4P zwSzi9+hXrRoXVZgEibupUM(`|?2F)5?DRF>+`0jLPvo8I{s14i*NB1GY$e1FYXH0X z_HotLUi-_c#d8rFdaHKeEHT5XuEfXRBWBK@w4k=yB<0VciW-7@!70DRs%qoaDq1)D zV_}tsKrHxvDc^|Be>l2e?xEzySib!}p(%_vG@pES2BW=hhsDmFy<4iyeO&0cQ^ zI$wl`mpOh)kAeVo=nR-H%vJ}E%eK(!{0_gJOtr=gu2N>7TFgxUR-i(HN3(2L6_^dC z?#)vnc+w9{%5I65ab_%zZB`jGFNAAGp|qyrrW{C@PeH1Ol#_jj*E9E;{(XSKwop;~ zV$BWcxq6<4#J|f~>z&JM^YILJRb5>DZ@r&6=#MW_eOytSro#VJs#;RV zmjl#}E}`vtvvbKc346evhq@%Tk-y)l>w+=Fi8I@LV?n68$SSzhFP7z)Z;psfPKGCF zH8QP;gj0O>Kc7zo?G@MXaKz zl3Cs}3htk>ws{EgjmK#cRjfCZac7^5+Cb=1Lsu2>L3wYkTs)vyMwOB`2c=ig!oY|t z1OC}jIevxx`X``QZmH1ydixI`WiH0L0z%pU?{gB2y`+{C0KiE0KLT_w5pey_2<0p# zCkAx_j|u}qdaz51rjU&UsF%((Liv?GNI@@NIYwO5HVd)%Vl{zdWYnFy2{Arkb76VI? zYRa`}lu3EE{S^%mjyGHL`sdlx`tSSmb9)7y801n@$Bm+bf_%u|{@}>;kU)Y&41|6_ zq45V1g8;&S|5c&{-LL;+4jZn4MLv{ipojafD*&-5Xk0D;82}CR|4%7_6_W~vBN1bu z7=^-w8fvDVKtd#zwd9F(tD^@?Mu@rv-|u?erI~hYKT_Lh;yvt=f&Ph9X?LDIbzFJo z*wpr1KXwXR0!jFh>Dpg*;ZExG>(ZJvyrjaa>)TC05&@0O5OT*c`NmePmdNHrY`M zs#H@YdlEQwQgj&PK);W53cxDh@yoaEktpJ_1r`SfIySf9fiT1XlvH^cbi# z>Vv#0cB&2+giIh(*h^_s-&c7RGh3Sdbf~1H{$#1<+bPj0d5wLF&5#JG(R4vrV*d4b z=_rv>TmAWZw|Dg5&Yx#pfzdNI_Fs`V^L&O41D0}Hqi6*J6W%7XG!NX@&(Fha`-Svy z4z-NLx-!x{EeDfcwWzILPBR)7H77TC;3WXo;jZ|)vCC|#JNR8(en#W2Q5Uhgzw&yi z*y@3mYS0X$nn`*xaP;JT#>!(^*PB@wdZRF3OJ8}>OX)mqeWZLev_1huvOXhZryGV4 zp(oY(YZ4;XN;Mosn50fH+wue+s%xy@2v*`jW95%3iAjtW!=6iZf!gi!@*ATJ_VGHg zZEStIPd(I3wRIpI`I6EI)XN*>q3tzSp5Y|z zZm5x)M~aTu)MuZ2FdiGY{Y+%Dp6(+B`MSz}87kO@q(zqi0_p5Y#?~#PrLkKp zN^WV1ecP0jl2=44TCtt)bu(2P-AFPcoLe}Nx+&q@1D^PtPI(UW@2Y$|VXCp*-@ugY zb8e5LMrDpHA-W9%L!n?*PHrfxw9$1XEft=3?nBSS-kS=`_U0|ky`sz|l_ksT4=17X zk&@lac3MS2Y{C&sNhl?1qMk4@7)$pfWDGYbN&bc7l_0XJRmhCP+)@SfBOPYr@~_*YvIU{F0bj$3WICkAdTPX4(*uu zY~K@r^fm@={#MepVUxx%G!6`3R2?svV|Qn1lDA({yD`_C@FHTZ4cyT( zdz`Ee4+}z>HsiKo?W&rSoHlBDd6yowI>ZeWPmMz5$SnqEe82HAr|xM&k2)79Jnzx% z)Vpi~Kh(qDd*<8OsmTc^IU8su(+GWg;S{J1?L};=8T%~J&!I0T z!#7C4zDSuKhCrW?ghpQDZ@nA8?t08w70fl93RMbc8OzQzLc!4ruJCMjr==54ybaHKn}Z=WQBPujKHA5Tnf_T}N?9xOo{$ znpE6Sr#`Nu?sRz7!FLQ6`*I~9KHPpDW6I#%%y24wgJCQTNa+;33I3z(%|)aNXGihl z(MQnHQa#`tbKUJu!S2}H0@T4QM53ka=&_42ODDY=AQ(Y?IrX+R{dLXqnu>hfTGtxY z18u#$Y!s97T0c05;NIXa^m$J$@jZ82tvIGA+>HbeLwn%*_&4xqs zGGYJB{?5^4x=<>q(x5KExM)z~Uke_}1PHV8Anvz67Hf!SENWtNp@Y5ghwMMHTWxX? zGG<><3@=mE@QuygP$Qs&oy(E5@6O0QTzc^R%anwL1qzZ}d(fIfZL1u{>K~#|gY20? zsG|_AHZNWkm8n7h1>zsxZ%tVDpf*N75C-7Sv4DHv+p$w<6aP!chbm=`ex4vX<95y- zEDY#5A)(e`!g{3{yIM0xnxbtV#EM+3>i%CJ4X7md;W;K6;=@Ag#v}uExj89ouUHrB zzlc;wtmIQ>ch;=+xdzluh!^Cmy2urw1?eW|r%miz6qC;4Eudh5tf6ms$%|e5d_`$4 z&&Rbb+YignVjYaT%pxTIb`ZB#gJJ(?(*A!Hf5rzQ5!+eoBwZl*|Fn@3lNYTOHVFKG DyUl?1 literal 0 HcmV?d00001 From 0b6b6a60ac343d9352b1269198281d47f164abb5 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:13:31 +0100 Subject: [PATCH 033/476] Delete contour_apploader.png --- apps/contourclock/contour_apploader.png | Bin 15659 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/contourclock/contour_apploader.png diff --git a/apps/contourclock/contour_apploader.png b/apps/contourclock/contour_apploader.png deleted file mode 100644 index 9e263152c7f43a0c8fb1e1b476ad2f5496c5a9b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15659 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 DyUl?1 From 269e3e4831b1d57897f9aa4e3813be55f0ef02cf Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:13:52 +0100 Subject: [PATCH 034/476] Add files via upload --- apps/contourclock/app.png | Bin 0 -> 10662 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/contourclock/app.png diff --git a/apps/contourclock/app.png b/apps/contourclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..4c31cc007a190e93fb4ed970dc0176c2ef56ad4a GIT binary patch literal 10662 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 M07*qoM6N<$f@jW2LjV8( literal 0 HcmV?d00001 From 3b469d305459a8c29950e3b92413f264e642cde4 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:16:40 +0100 Subject: [PATCH 035/476] Update apps.json --- apps.json | 60 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/apps.json b/apps.json index 60de1672f..47022306c 100644 --- a/apps.json +++ b/apps.json @@ -5007,34 +5007,36 @@ ] }, { "id": "circlesclock", - "name": "Circles clock", - "shortName":"Circles clock", - "version":"0.01", - "description": "A clock with circles for different data at the bottom in a probably familiar style", - "icon": "app.png", - "dependencies": {"widpedom":"app"}, - "type": "clock", - "tags": "clock", - "supports" : ["BANGLEJS2"], - "allow_emulator":true, - "readme": "README.md", - "storage": [ - {"name":"circlesclock.app.js","url":"app.js"}, - {"name":"circlesclock.img","url":"app-icon.js","evaluate":true}, - {"name":"circlesclock.settings.js","url":"settings.js"} - ], - "data": [ - {"name":"circlesclock.json"} - ] - }, + "name": "Circles clock", + "shortName":"Circles clock", + "version":"0.01", + "description": "A clock with circles for different data at the bottom in a probably familiar style", + "icon": "app.png", + "dependencies": {"widpedom":"app"}, + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator":true, + "readme": "README.md", + "storage": [ + {"name":"circlesclock.app.js","url":"app.js"}, + {"name":"circlesclock.img","url":"app-icon.js","evaluate":true}, + {"name":"circlesclock.settings.js","url":"settings.js"} + ], + "data": [ + {"name":"circlesclock.json"} + ] + }, { "id": "contourclock", - "name": "Contour Clock", - "shortName" : "Contour Clock", - "icon": "app.png", - "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", - "tags": "clock", - "storage": [ - {"name":"contourclock.app.js","url":"app.js"}, - {"name":"contourclock.img","url":"app-icon.js","evaluate":true} - ]} + "name": "Contour Clock", + "shortName" : "Contour Clock", + "icon": "app.png", + "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", + "screenshots" : [ { url:"screenshot.png" } ] + "tags": "clock", + "storage": [ + {"name":"contourclock.app.js","url":"app.js"}, + {"name":"contourclock.img","url":"app-icon.js","evaluate":true} + ] + } ] From 808a5f58faf63a97e4d14845346c8227a37f01df Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:17:59 +0100 Subject: [PATCH 036/476] Add files via upload --- apps/contourclock/screenshot.png | Bin 0 -> 15659 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/contourclock/screenshot.png diff --git a/apps/contourclock/screenshot.png b/apps/contourclock/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..9e263152c7f43a0c8fb1e1b476ad2f5496c5a9b3 GIT binary patch literal 15659 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 DyUl?1 literal 0 HcmV?d00001 From 680e24f92f6230c309c5a30b2f9ae2aa7def766c Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:19:43 +0100 Subject: [PATCH 037/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 47022306c..27dee60ca 100644 --- a/apps.json +++ b/apps.json @@ -5032,7 +5032,7 @@ "shortName" : "Contour Clock", "icon": "app.png", "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", - "screenshots" : [ { url:"screenshot.png" } ] + "screenshots" : [{"url":"screenshot.png"}] "tags": "clock", "storage": [ {"name":"contourclock.app.js","url":"app.js"}, From 36898e33fcf03e492210ac0cb488510ff0c17ee0 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:30:48 +0100 Subject: [PATCH 038/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 27dee60ca..59403a294 100644 --- a/apps.json +++ b/apps.json @@ -5032,7 +5032,7 @@ "shortName" : "Contour Clock", "icon": "app.png", "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", - "screenshots" : [{"url":"screenshot.png"}] + "screenshots" : [{"url":"screenshot.png"}], "tags": "clock", "storage": [ {"name":"contourclock.app.js","url":"app.js"}, From 212508b34cd684b98e34b1ab87509d627094097a Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:39:31 +0100 Subject: [PATCH 039/476] Update apps.json --- apps.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps.json b/apps.json index 59403a294..c1e7fc7a0 100644 --- a/apps.json +++ b/apps.json @@ -5030,10 +5030,14 @@ { "id": "contourclock", "name": "Contour Clock", "shortName" : "Contour Clock", + "version":"0.01", "icon": "app.png", "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", "screenshots" : [{"url":"screenshot.png"}], "tags": "clock", + "allow_emulator":true, + "supports" : ["BANGLEJS2"], + "type": "clock", "storage": [ {"name":"contourclock.app.js","url":"app.js"}, {"name":"contourclock.img","url":"app-icon.js","evaluate":true} From 65da3f1233ffb8144e57ee121c15e5a4ae07a844 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:53:38 +0100 Subject: [PATCH 040/476] Update app-icon.js --- apps/contourclock/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contourclock/app-icon.js b/apps/contourclock/app-icon.js index d7c3d5255..3cf7105bd 100644 --- a/apps/contourclock/app-icon.js +++ b/apps/contourclock/app-icon.js @@ -1 +1 @@ -var img = require("heatshrink").decompress(atob("mEwghC/AH4A/AH4A5jHs51wlfs7ncqEAg/N5nc7cwvgLB7uACwME7tgg/B9cwgEJ9EA1wOChfs6wEBg3bAYOuyADB5ugG4VeqHTHwe9iAECjughYMD7pCB1UwhPA6sEqpMB40AnQLBgnQhhBBAAP5gEuxfAgHUz3e3ZMBA4ObvYDBC4NwxQ4B+oLBgXAhPt9EhgFtgHDgGZggXCg/t5sggH2gF8g3An1Qr1ggGcgG6gF+52QKYJEBhgXB/RoB71wzcAhVwgvmgFfQ4SDBEIIXDO4MAIQN9BINwrypB5oqCgFsCYIXD5nBAwMBju13siOwML/1AC4U82AXE4HNwWe6kD32yjoOB3vlgGt5uwgYFBC4kH5m28cA3dycwML65GB6MB6EA1MArWuC4Pb7eFxuwhfa7wuBhurfQI5B8C3Bg/qu4yB11Y3e3QYMgxoJBg94FYOd5obB48LSwenAYUA1cADYIAC7IEDg3ghQXDzswAYMp90QDIIACp2hAgWOZIPs5gAB5/8zOc9lb9fv7gLC53u3OZ3vWEIYA/AH4A/AH4A/AH4AsA=")) +require("heatshrink").decompress(atob("mEwghC/AH4A/AH4A5jHs51wlfs7ncqEAg/N5nc7cwvgLB7uACwME7tgg/B9cwgEJ9EA1wOChfs6wEBg3bAYOuyADB5ugG4VeqHTHwe9iAECjughYMD7pCB1UwhPA6sEqpMB40AnQLBgnQhhBBAAP5gEuxfAgHUz3e3ZMBA4ObvYDBC4NwxQ4B+oLBgXAhPt9EhgFtgHDgGZggXCg/t5sggH2gF8g3An1Qr1ggGcgG6gF+52QKYJEBhgXB/RoB71wzcAhVwgvmgFfQ4SDBEIIXDO4MAIQN9BINwrypB5oqCgFsCYIXD5nBAwMBju13siOwML/1AC4U82AXE4HNwWe6kD32yjoOB3vlgGt5uwgYFBC4kH5m28cA3dycwML65GB6MB6EA1MArWuC4Pb7eFxuwhfa7wuBhurfQI5B8C3Bg/qu4yB11Y3e3QYMgxoJBg94FYOd5obB48LSwenAYUA1cADYIAC7IEDg3ghQXDzswAYMp90QDIIACp2hAgWOZIPs5gAB5/8zOc9lb9fv7gLC53u3OZ3vWEIYA/AH4A/AH4A/AH4AsA=")) From 3c343304d88d86cc5acdcf463adffea45ff5c526 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 10:56:09 +0100 Subject: [PATCH 041/476] Update app.js --- apps/contourclock/app.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/contourclock/app.js b/apps/contourclock/app.js index 9fdbab985..3ce28f94f 100644 --- a/apps/contourclock/app.js +++ b/apps/contourclock/app.js @@ -12,7 +12,7 @@ const digits = [ {width : 25 , height : 86 , bpp : 2, transparent : 1, buffer : E.toArrayBuffer(atob(" VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVaqlVVVVWqqqlVVVWqqqqlVVWqgAKqVVWqAAAKlVWqAAAAqVVqAAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAACpVWqAAAAqVVagAAAqlVVqgAAqlVVaqqqqlVVVaqqqlVVVVaqqVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVqqqVVVVVqqqqVVVWqqqqpVVVqgAAqlVVqAAACqVVqgAAAKlVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAKlVqAAAACpVagAAAAqVWoAAAAqVVagAAAKlVWqAAAKlVVaqACqpVVVqqqqpVVVWqqqlVVVVVqpVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV "))} ]; -var drawTimeout, savedOptions; +var drawTimeout; function queueDraw() { if (drawTimeout) clearTimeout(drawTimeout); @@ -25,7 +25,6 @@ function queueDraw() { function draw() { var x = g.getWidth()/2; var y = g.getHeight()/2-31; - //print(y); g.reset(); var date = new Date(); var timeStr = require("locale").time(date,1); From 95ad90e11b46ef112b3ce1ba6525dca53a9f7822 Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Sat, 18 Dec 2021 11:15:40 +0100 Subject: [PATCH 042/476] Update app-icon.js --- apps/contourclock/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contourclock/app-icon.js b/apps/contourclock/app-icon.js index 3cf7105bd..01f3ef69f 100644 --- a/apps/contourclock/app-icon.js +++ b/apps/contourclock/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwghC/AH4A/AH4A5jHs51wlfs7ncqEAg/N5nc7cwvgLB7uACwME7tgg/B9cwgEJ9EA1wOChfs6wEBg3bAYOuyADB5ugG4VeqHTHwe9iAECjughYMD7pCB1UwhPA6sEqpMB40AnQLBgnQhhBBAAP5gEuxfAgHUz3e3ZMBA4ObvYDBC4NwxQ4B+oLBgXAhPt9EhgFtgHDgGZggXCg/t5sggH2gF8g3An1Qr1ggGcgG6gF+52QKYJEBhgXB/RoB71wzcAhVwgvmgFfQ4SDBEIIXDO4MAIQN9BINwrypB5oqCgFsCYIXD5nBAwMBju13siOwML/1AC4U82AXE4HNwWe6kD32yjoOB3vlgGt5uwgYFBC4kH5m28cA3dycwML65GB6MB6EA1MArWuC4Pb7eFxuwhfa7wuBhurfQI5B8C3Bg/qu4yB11Y3e3QYMgxoJBg94FYOd5obB48LSwenAYUA1cADYIAC7IEDg3ghQXDzswAYMp90QDIIACp2hAgWOZIPs5gAB5/8zOc9lb9fv7gLC53u3OZ3vWEIYA/AH4A/AH4A/AH4AsA=")) +require("heatshrink").decompress(atob("mEwgJC/ABsH4/wv/H/EMlkMsF4hkYmEEwEwg0gmHCwEh4VAmPi/0j8Vkkcj4MjkU8kckocx4UEmPMoUQgkEEYNGnAFBnEGxFwg0Ek/jzFh8UEkEjkOikUcnFH8MiFIM3wnA8PisEwhnAkECAoMc4EYgk///3//n/Cl/AFYA=")) From fa66b678167007d24aa4e56f4b4051733cbf7ba4 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Sat, 18 Dec 2021 21:54:49 +0000 Subject: [PATCH 043/476] Add settings and cleanup --- apps.json | 1 + apps/coretemp/boot.js | 135 ++++++++++++++++++++++++++------------ apps/coretemp/coretemp.js | 3 +- apps/coretemp/settings.js | 40 +++++++++++ 4 files changed, 137 insertions(+), 42 deletions(-) create mode 100644 apps/coretemp/settings.js diff --git a/apps.json b/apps.json index 595603578..9200ade1e 100644 --- a/apps.json +++ b/apps.json @@ -4970,6 +4970,7 @@ "storage": [ {"name":"coretemp.boot.js","url":"boot.js"}, {"name":"coretemp.app.js","url":"coretemp.js"}, + {"name":"coretemp.settings.js","url":"settings.js"}, {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} ] }, diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index a73c67b47..61eefd6c8 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -1,47 +1,100 @@ (function() { -var state = {gatt : null, primary : null, temp : null, data : null}; -// Would it be better to scan by uuid rather than name? -NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) - // NRF.requestDevice({timeout : 20000, filters : [ {services : - // '1809','2100'} ]}) - .then(function(device) { - return device.gatt.connect(); - }) - .then(function(g) { - state.gatt = g; - return state.gatt - .getPrimaryService('00002100-5b1e-4347-b07c-97b514dae121') - .then(function(service) { - state.primary = service; - return state.primary.getCharacteristic( - '00002101-5b1e-4347-b07c-97b514dae121'); - }) - .then(function(c) { - state.data = c; - state.data.on('characteristicvaluechanged', function(event) { - var dv = event.target.value; - var flags = dv.buffer[0]; - var unit, core = -1, skin = -1; +var device; +var gatt; +var service; +var characteristic; - if (flags & 8) { - unit = "F"; - } else { - unit = "C"; - } +class CoreSensor { + constructor() { + this.unit = ""; + this.core = -1; + this.skin = -1; + this.battery = 0; + } - if (flags & 1) - skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; - if (flags & 2) - core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + updateSensor(event) { + if (event.target.uuid == "00002101-5b1e-4347-b07c-97b514dae121") { + var dv = event.target.value; + var flags = dv.buffer[0]; - Bangle.emit('CoreTemp', {core : core, skin : skin, unit : unit}); - }); - return c.startNotifications(); - }) - .catch(function(e) { - E.showMessage(e.toString(), "ERROR"); - console.log(e); - }); - }); + if (flags & 8) { + this.unit = "F"; + } else { + this.unit = "C"; + } + + if (flags & 1) this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; + if (flags & 2) this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + + Bangle.emit('CoreTemp', + {core : this.core, skin : this.skin, unit : this.unit}); + } + } + + updateBatteryLevel(event) { + if (event.target.uuid == "0x2a19") + this.battery = event.target.value.getUint8(0); + } +} + +var mySensor = new CoreSensor(); + +function getSensorBatteryLevel(gatt) { + gatt.getPrimaryService("180f") + .then(function(s) { return s.getCharacteristic("2a19"); }) + .then(function(c) { + c.on('characteristicvaluechanged', + (event) => mySensor.updateBatteryLevel(event)); + return c.startNotifications(); + }); +} + +function connection_setup() { + E.showMessage("Scanning for CoreTemp sensor..."); + NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) + .then(function(d) { + device = d; + E.showMessage("Found device"); + return device.gatt.connect(); + }) + .then(function(g) { + gatt = g; + return gatt.getPrimaryService('00002100-5b1e-4347-b07c-97b514dae121'); + }) + .then(function(s) { + service = s; + return service.getCharacteristic( + '00002101-5b1e-4347-b07c-97b514dae121'); + }) + .then(function(c) { + characteristic = c; + characteristic.on('characteristicvaluechanged', + (event) => mySensor.updateSensor(event)); + return characteristic.startNotifications(); + }) + .then(function() { + console.log("Done!"); +// getSensorBatteryLevel(gatt); + g.reset().clearRect(Bangle.appRect).flip(); + }) + .catch(function(e) { + E.showMessage(e.toString(), "ERROR"); + console.log(e); + }); +} + +function connection_end() { + if (gatt != undefined) gatt.disconnect(); +} + +connection_setup(); + +E.on('kill', () => { connection_end(); }); + +// move into setup +NRF.on('disconnect', connection_setup); // restart if disconnected + +// Bangle.loadWidgets(); +// Bangle.drawWidgets(); })(); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 1856057a4..086614ed9 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -1,4 +1,4 @@ - +// Simply listen for core events and show Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); @@ -23,3 +23,4 @@ Bangle.drawWidgets(); g.reset().setFont("6x8", 2).setFontAlign(0, 0); g.drawString("Please wait...", g.getWidth() / 2, g.getHeight() / 2 - 16); + diff --git a/apps/coretemp/settings.js b/apps/coretemp/settings.js new file mode 100644 index 000000000..2c541f72c --- /dev/null +++ b/apps/coretemp/settings.js @@ -0,0 +1,40 @@ +// This file should contain exactly one function, which shows the app's settings +/** + * @param {function} back Use back() to return to settings menu + */ +(function(back) { + const SETTINGS_FILE = 'coretemp.json' + // initialize with default settings... + let s = { + 'enabled': true, + } + // ...and overwrite them with any saved values + // This way saved values are preserved if a new version adds more settings + const storage = require('Storage') + const saved = storage.readJSON(SETTINGS_FILE, 1) || {} + for (const key in saved) { + s[key] = saved[key]; + } + // creates a function to safe a specific setting, e.g. save('color')(1) + function save(key) { + return function (value) { + s[key] = value; + storage.write(SETTINGS_FILE, s); + } + } + +const menu = { + '' : {'title' : 'CoreTemp sensor'}, + '< Back' : back, + 'Enabled' : { + value : !!settings.enabled, + format : v => v ? "Yes" : "No", + onchange : v => { + settings.enabled = v; + updateSettings(); + } + } +} + + E.showMenu(menu); +}) From 3286d6cb2d4a7144f887a4e77c4eeac95fe12a72 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Sat, 18 Dec 2021 22:10:59 +0000 Subject: [PATCH 044/476] Switch to widget --- apps.json | 7 +- apps/coretemp/app-settings.json | 3 + apps/coretemp/widget.js | 132 ++++++++++++++++++++++++++++++++ 3 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 apps/coretemp/app-settings.json create mode 100644 apps/coretemp/widget.js diff --git a/apps.json b/apps.json index 9200ade1e..ad54b1d43 100644 --- a/apps.json +++ b/apps.json @@ -4960,7 +4960,7 @@ { "id": "coretemp", "name": "Core Temp Display", - "version": "0.02", + "version": "0.03", "description": "Display CoreTemp device sensor data", "icon": "coretemp.png", "type": "app", @@ -4968,11 +4968,12 @@ "readme": "README.md", "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ - {"name":"coretemp.boot.js","url":"boot.js"}, + {"name":"coretemp.wid.js","url":"widget.js"}, {"name":"coretemp.app.js","url":"coretemp.js"}, {"name":"coretemp.settings.js","url":"settings.js"}, {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} - ] + ], + "data": [{"name":"coretemp.json","url":"app-settings.json"}] }, { "id": "showimg", diff --git a/apps/coretemp/app-settings.json b/apps/coretemp/app-settings.json new file mode 100644 index 000000000..05e922f9d --- /dev/null +++ b/apps/coretemp/app-settings.json @@ -0,0 +1,3 @@ +{ + "enabled":false +} diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js new file mode 100644 index 000000000..3eabf85d6 --- /dev/null +++ b/apps/coretemp/widget.js @@ -0,0 +1,132 @@ +// Widget to run sensors +// BT HRM / coretemp / csc +(() => { + var settings = {}; + +var device; +var gatt; +var service; +var characteristic; + +class CoreSensor { + constructor() { + this.unit = ""; + this.core = -1; + this.skin = -1; + this.battery = 0; + } + + updateSensor(event) { + if (event.target.uuid == "00002101-5b1e-4347-b07c-97b514dae121") { + var dv = event.target.value; + var flags = dv.buffer[0]; + + if (flags & 8) { + this.unit = "F"; + } else { + this.unit = "C"; + } + + if (flags & 1) this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; + if (flags & 2) this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + + Bangle.emit('CoreTemp', + {core : this.core, skin : this.skin, unit : this.unit}); + } + } + + updateBatteryLevel(event) { + if (event.target.uuid == "0x2a19") + this.battery = event.target.value.getUint8(0); + } +} + +var mySensor = new CoreSensor(); + +function getSensorBatteryLevel(gatt) { + gatt.getPrimaryService("180f") + .then(function(s) { return s.getCharacteristic("2a19"); }) + .then(function(c) { + c.on('characteristicvaluechanged', + (event) => mySensor.updateBatteryLevel(event)); + return c.startNotifications(); + }); +} + +function connection_setup() { + E.showMessage("Scanning for CoreTemp sensor..."); + NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) + .then(function(d) { + device = d; + E.showMessage("Found device"); + return device.gatt.connect(); + }) + .then(function(g) { + gatt = g; + return gatt.getPrimaryService('00002100-5b1e-4347-b07c-97b514dae121'); + }) + .then(function(s) { + service = s; + return service.getCharacteristic( + '00002101-5b1e-4347-b07c-97b514dae121'); + }) + .then(function(c) { + characteristic = c; + characteristic.on('characteristicvaluechanged', + (event) => mySensor.updateSensor(event)); + return characteristic.startNotifications(); + }) + .then(function() { + console.log("Done!"); +// getSensorBatteryLevel(gatt); + g.reset().clearRect(Bangle.appRect).flip(); + }) + .catch(function(e) { + E.showMessage(e.toString(), "ERROR"); + console.log(e); + }); +} +function connection_end() { + if (gatt != undefined) gatt.disconnect(); +} + + // draw your widget + function draw() { +// if (!) return; + g.reset(); + g.setFontAlign(0,0); + g.clearRect(this.x,this.y,this.x+23,this.y+23); + g.setColor(settings.enabled?"#00ff00":"#80ff00"); + g.fillCircle(this.x+6,this.y+6,4); + g.fillCircle(this.x+16,this.y+16,4); + g.setColor(-1); // change color back to be nice to other apps + } + +// function onHRM(hrm) { +// WIDGETS["sensors"].draw(); +// } + + // Called by sensor app to enable listeners + function reload() { + settings = require("Storage").readJSON("coretemp.json",1)||{}; +// settings.fileNbr |= 0; + +// Bangle.removeListener('HRM',onHRM); + + if (settings.coreOn) { + WIDGETS["sensors"].width = 24; + connection_setup(); + } else { + WIDGETS["sensors"].width = 0; + connection_end(); + } + + } + // add the widget + WIDGETS["sensors"]={area:"tl",width:24,draw:draw,reload:function() { + reload(); + Bangle.drawWidgets(); // relayout all widgets + }}; + // load settings, set correct widget width + reload(); +})() From 85ee6a1f73675944bc618042f5ca523634a0b006 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Sun, 19 Dec 2021 00:10:22 +0100 Subject: [PATCH 045/476] Load step goal from pedometer widget (as fallback) --- apps/circlesclock/app.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 57b46bb8d..c409c1e32 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -7,15 +7,19 @@ const powerIcon = heatshrink.decompress(atob("h0OwYQNsAED7AEDmwEDtu2AgUbtuABwXbB const powerIconGreen = heatshrink.decompress(atob("h0OwYQNkAEDpAEDiQEDkmSAgUJkmABwVJBIUEyVAAoYOCgEBFIgODABI")); const powerIconRed = heatshrink.decompress(atob("h0OwYQNoAEDyAEDkgEDpIFDiVJBweSAgUJkmAAoYZDgQpEBwYAJA")); -const SETTINGS_FILE = "circlesclock.json"; let settings; function loadSettings() { - settings = require("Storage").readJSON(SETTINGS_FILE, 1) || { + settings = require("Storage").readJSON("circlesclock.json", 1) || { 'maxHR': 200, 'stepGoal': 10000, 'batteryWarn': 30 }; + // Load step goal from pedometer widget as fallback + if (settings.stepGoal == undefined) { + const d = require('Storage').readJSON("wpedom.json", 1) || {}; + settings.stepGoal = d != undefined && d.settings != undefined ? d.settings.goal : 10000; + } } const colorFg = g.theme.dark ? '#fff' : '#000'; From 9faaca321476bd283ee841ce162f65b37b249a4c Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 11:38:27 +0100 Subject: [PATCH 046/476] Performance improvements: Render left side + lines. Also new designed colors. --- apps/lcars/bg_large.png | Bin 11003 -> 0 bytes apps/lcars/bg_left.png | Bin 0 -> 795 bytes apps/lcars/bg_small.png | Bin 8753 -> 0 bytes apps/lcars/lcars.app.js | 121 +++++++++++++++++++++++++++++----------- 4 files changed, 89 insertions(+), 32 deletions(-) delete mode 100644 apps/lcars/bg_large.png create mode 100644 apps/lcars/bg_left.png delete mode 100644 apps/lcars/bg_small.png diff --git a/apps/lcars/bg_large.png b/apps/lcars/bg_large.png deleted file mode 100644 index 56590e87891ec7908e31984aebc50db7ce8b3e4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11003 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 SvI(%(E+8wZBvCGA;Qt@rL=Hy) diff --git a/apps/lcars/bg_left.png b/apps/lcars/bg_left.png new file mode 100644 index 0000000000000000000000000000000000000000..91c2bb6f7b7f83376ff41b83632819f239358246 GIT binary patch literal 795 zcmV+$1LXXPP)Lu@Z};XF?e>1+Kn$_>ce=9Pi+wv|?prf!_UgoA*PqAR;0Q5z%b*wr#QIW|?7DXB`WO z%tr&|L5E%C#LQ2Gh*GsW#jLp5NE($b9rB=*a#ddue-I}cpM(`96HM6pf*hi&({4!# zMnqIzE`A7dh_+UHE+@9(jS&b)WnUrf;lz`gzuxi#RaLe{Ro#&k>|I5LbwO22-LBT& z%>Wz1-c(obJ#qa0$E^Y@ldu~lk?60fImZnV#jPx=>v@_Mp5#Unu#tv_i~{G~Z(NOI zG5vxo9PUoQUio}kCq3`sdd!7sTDWhhu5Onh=IrWPhzwpU;R25w4SpG{tjt-f_GcQ3>bghM!iN9H z!jV;@SAT8oA$M`hSV}M=qNuKCYg%|ZCD?KX{QiPtC83d&V9R;k*r;0O<}SKjtq-?~ Z{RF94z^`^=I%EI<002ovPDHLkV1n^vZ1eyC literal 0 HcmV?d00001 diff --git a/apps/lcars/bg_small.png b/apps/lcars/bg_small.png deleted file mode 100644 index ea3a756888509f49fdb11944cf1318fadb0d30a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8753 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 diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 859e999a5..1f6448bb4 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -17,15 +17,29 @@ for (const key in saved_settings) { } let hrmValue = 0; +/* + * Colors to use + */ +let cBlue = "#0094FF"; +let cOrange = "#FF9900"; +let cPurple = "#FF00DC"; +let cWhite = "#FFFFFF"; + /* * Requirements and globals */ const locale = require('locale'); -var backgroundImage = { - width : 176, height : 151, bpp : 3, - transparent : 2, - buffer : require("heatshrink").decompress(atob("AAdx48cATsAg4daIAX3799ATv2wEFDrUAgNHQDyDghaAeQcJKG86D4gRKGgAA4jxKFuBB5iaDF6BB5ZwyD6QAYCC4CD/Qf6Dzg/gQf8H/iD/n//wCD9gP///wQfpBKQf6D4h5BB/yD8jl/IIIABjiD5n4/DAAWAQe8B//8QYfHj//PAaDzHwICCAAP4gYCBQep6DIIYFBRgKD1j/+gB9BQYYKBn/gQen/+BBFQAUH/iDzGoZBHJoOAQeRBDj5BHj6PB0WKlACDJQIAofYZBFBAZBBAGMHPQZB8QYZAEIIcDIOiDI/hB3QZBBFjlx44CDuBBpg4DCIJEfIIPnz15AQeAQeH8gIDBGoJBCnnz54CDZ1UHPQMHIIUAIIKD3II6MBQYQCCQeI1B+BBC/BKCBASGCQeK5B/xBC4BKEn/gAoKDyj//45BFj/xZYSDzgF/IAP+JQrLCQecAgKDBF4cHQYKJDQecAn6EBAAiJEQeZBB/jICAAMcvwMDQevgQwR0CIIiDzgP/BA1/4CD3nAHGhyD3ABqD0ABiD/Qf4ADjiD/gEnQYuQQf6D7gaDFzxB5gFzQYnz4BB5hyDFATfkEoIdagEBQYoCcgEHDrReBhKDhwEBQbYABjiD/AH4A/AH4AGiFx48cATsAg4daIIWSpMkATuQEbkAgJfbQckJQDyDhZxQA1gRKFpBA4gEQQYtwIPMSQYtAIPKADQfqADAQRA5Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4A/AH4A/AH4A/AFkcuPHAQdAIPOSpMkAQaD/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4A/AH4A/AH4A/AGUcuPHAQdwIPOSpMkAQaD/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf6D/Qf4AciSDFoCD/QfcCQYtIIPMAQYoC6gEJQYgC6gEBQf7HCQf4ABiiD9")) +var backgroundImage = { + width : 27, height : 176, bpp : 3, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AAUM2XLlgCCwAJBBAuy4EAmQIF5cggAIGlmwgYIG2XIF42wF4ImGF4ImHJoQmGJoQdJhZNHNY47CgRNGBIJZHHgRiGBIRQ/KH5QCAFCh/eX5Q/KAwdCAGVbtu27YCCoAJBkuWrNlAQRGCiwRDAQPQBIMJCIYCBsAJBgomEtu0WoQmEy1YBIMBHYttIwQ7FyxQ/KHFlFAQ7F2weCHYplKChRTCCg5TCHw5TMAD0GzVp0wCCBBGaBIMaBAtpwECBA2mwEJBAugDgMmCIwJBF5EABAtoeQQvGCYQdPJoI7LMQzTCLJKAGzAJBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A==")) +} + +var logo = { + width : 56, height : 56, bpp : 1, + transparent : 0, + buffer : require("heatshrink").decompress(atob("AAUEAwsOAwseAwsfAws/AwtzwAGEuIGF8PgAocH8H4AwcP4H+FAnAv4cDveAufAAwXzwFxEYUB4cAmFwAwMDw8AnE4F4UGgEYjBmCM4McjgGEhhxCBQUMC4IYBAwMOg4GBnAfBgwGCmAtBg8DAwxUBuEwIIIGDJIMDwYGCsAGBwIGBsAGBgIGDMoMB4IGIuB6C4YGBuIGJ8YGBmOAgPgsYJBAwMH+AGCneAh84u4GBjeAPAIGCcgM4hk+YQQ5BhwGE8EHninCgPAgYGCgxzBge4AwSPBgLnCVwQGEU4MH/gGCn+An98AwV///+AwUMuP/+AwChngJwIGCh52CjxaCPIIfBAxICBJIIXEAAb+CACA")) } var iconEarth = { @@ -91,10 +105,10 @@ Graphics.prototype.setFontAntonioSmall = function(scale) { } Graphics.prototype.setFontAntonioLarge = function(scale) { - // Actual height 34 (34 - 1) - g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAADwAAAAAeAAAAADwAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAD+AAAAH/wAAAP/+AAAf/+AAA//8AAB//4AAD//wAAD//gAAAf/AAAAD+AAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAB////gA/////AP////8D/////wfAAAA+DwAAADweAAAAeDwAAADwf////+D/////wP////8Af///+AAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAOAAAAADwAAAAAeAAAAAHgAAAAB/////wf////+D/////wf////+D/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/AAPwH/4AP+B//AH/wf/4D/+D4AB/9weAAf4ODwAP8BweAP/AOD///gBwP//wAOA//4ABwB/4AAOAAAAAAAAAAAAAAAAAAAAB8AA/gA/gAH/AP8AA/8D/gAH/wfAHAA+DwA4ADweAHgAeDwB8ADwf7/+H+D/////gP/9//8A//H/+AA/AH/AAAAAAAAAAAAAAAAAABwAAAAD+AAAAD/wAAAH/+AAAH/5wAAH/wOAAP/gBwAP/gAOAD/////wf////+D/////wf////+AAAABwAAAAAOAAAAABwAAAAAAAAAAAAAAAAAAeAD//4D/Af//Af8D//4D/wf//Af+DwPAADweB4AAeDwPAADweB///+DwP///weA///8DwD//+AAAA/8AAAAAAAAAAAAAAAAAAAAAA////AA/////AP////8D/////wfgPAB+DwB4ADweAOAAeDwBwADwf+PAA+D/x///wP+H//8A/wf//AAAA//gAAAAAAAAAAAAADgAAAAAeAAAAADwAAAAAeAAAD+DwAAP/weAA//+DwA///weB///8Dx//8AAf//wAAD//gAAAf/AAAAD/AAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAD/wf/wB//v//AP////8D/////weAPwAeDwA8ADwcAHAAeDwB8ADwf////+D/////wP/9//8A//H//AA/AD/AAAAAAAAAAAAAAAAAAAAAD//gfAA///D/AP//8f8D///j/weAA8A+DwADgDweAAcAeDwAHgDwf////+B/////gP////8Af///+AAP//4AAAAAAAAAAAAAAAAAAAAAAD4AfAAAfAD4AAD4AfAAAfAD4AAD4AfAAAAAAAAAAAAAA=="), 46, atob("Cg4QEBAQEBAQEBAQCQ=="), 39+(scale<<8)+(1<<16)); -} + // Actual height 39 (39 - 1) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAPgAAAAAB8AAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAD8AAAAAH/gAAAAP/8AAAAf//gAAA///AAAB//+AAAD//8AAAH//4AAAP//wAAAB//gAAAAP/AAAAAB+AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAf////8AP/////4B//////Af/////8D8AAAAfgeAAAAA8DwAAAAHgeAAAAA8D//////gf/////8B//////AP/////wAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAHgAAAAAA8AAAAAAPgAAAAAB4AAAAAAf/////gP/////8B//////gP/////8B//////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/+AAP8A//wAP/gP/+AH/8D//wD//gfgAA//8DwAAf+HgeAAP/A8DwAH/gHgfgP/wA8D///4AHgP//+AA8A///AAHgB//AAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AA/gAD/AAH/gA/4AA/+AP/AAH/4D/4AA//gfgA4AB8DwAPAAHgeAB4AA8DwAPgAHgfAD+AB8D//////gP/////4B//5//+AD/+H//gAH/AH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAP/AAAAAP/4AAAAP//AAAAP/x4AAAf/wPAAAf/gB4AAf/AAPAAP/AAB4AB//////gP/////8B//////gP/////8AAAAAPAAAAAAB4AAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//wD/AB///Af+AP//4D/4B///Af/gP//4B/8B4D4AAPgPAeAAA8B4DwAAHgPAfAAB8B4D////gPAf///4B4B////APAD///gAAAD//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAP////4AH/////wB//////Af/////8D8APAA/geADwAB8DwAeAAHgeADwAA8D4AeAAPgf/j+AH8B/8f///gP/h///4Af8H//+AAPgP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAPAAAAAAB4AAAABgPAAAA/8B4AAB//gPAAD//8B4AH///gPAH///8B4P//+AAPH//wAAB///gAAAP//AAAAB/+AAAAAP+AAAAAB+AAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4A/+AAf/w//+AP//v//4B//////Af/////8D4AfwAPgeAB8AA8DwAHAAHgeAB8AA8D4Af4APgf/////8B//////AP//v//4A//4//8AA/4A/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAD//+D/gB///4f+AP///j/4D///8f/gfAAHgB8DwAA8AHgeAAHgA8DwAA8AHgfgAHgB8D//////gP/////4A/////+AD/////gAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAfgAAB+AD8AAAPwAfgAAB+AD8AAAPwAfgAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DBATExMTExMTExMTCw=="), 45+(scale<<8)+(1<<16)); +} /* * Draw watch face */ @@ -135,6 +149,25 @@ function printData(key, y){ } } +function drawHoriztonatlBgLine(color, x1, x2, y, h){ + g.setColor(color); + + for(var i=0; i{ // Show launcher when middle button pressed Bangle.setUI("clock"); -// Load widgets - needed by draw Bangle.loadWidgets(); +/* + * we are not drawing the widgets as we are taking over the whole screen + * so we will blank out the draw() functions of each widget and change the + * area to the top bar doesn't get cleared. + */ +for (let wd of WIDGETS) {wd.draw=()=>{};wd.area="";} // Clear the screen once, at startup and draw clock g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); draw(); // After drawing the watch face, we can draw the widgets -Bangle.drawWidgets(); \ No newline at end of file +// Bangle.drawWidgets(); \ No newline at end of file From a6d87a561c1aa9d05f453490d5845b9094ef5309 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 12:06:20 +0100 Subject: [PATCH 047/476] Minor improvements --- apps/lcars/lcars.app.js | 154 +++++++++++++++++++--------------------- 1 file changed, 75 insertions(+), 79 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 1f6448bb4..4bf73057b 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -43,48 +43,41 @@ var logo = { } var iconEarth = { - text: "EARTH", width : 50, height : 50, bpp : 3, buffer : require("heatshrink").decompress(atob("AFtx48ECBsDwU5k/yhARLjgjBjlzAQMQEZcIkOP/fn31IEZgCBnlz58cEpM4geugEgwU/8+WNZJHDuHHvgmBCQ8goEOnVgJoMnyV58mACItHI4X8uAFBuVHnnz4BuGxk4////Egz3IkmWvPgNw8f/prB//BghTC+AjE7848eMjNnzySBwUJkmf/BuGuPDAQIjBiPHhhTCSQnjMo0ITANJn44Dg8MuFBggCCiFBcAJ0Bv5xEh+ITo2OhHkyf/OIQdBWwVHhgjBNwUE+fP/5EEgePMoYLBhMgyVJk/+BQQdC688I4XxOIc8v//NAvr+QEBj/5NwKVBy1/QYUciPBhk1EAJrC+KeC489QYaMBgU/8BNB9+ChEjz1Jkn/QYMBDQIgCcYTCCiP/nlzJQmenMAgV4//uy/9wRaB/1J8iVCcAfHjt9TYYICnhKCgRKBw159/v//r927OIeeoASBDQccvv3791KYVDBYPLJQeCnPnz//AAP6ocEjEkXgMgJQtz79fLAP8KYkccAcJ8Gf/f/xu/cAMQ4eP5MlyQRCMolx40YsOGBAPfnnzU4KVDpKMBvz8Dh0/8me7IICgkxJQXPIgZTD58sEgcJk+eNoONnFBhk4/5uB/pcDg5KD+4mEv4CBXISVDhEn31/8/+mH7x//JQK5CAAMB4JBCnnxJQf/+fJEgkAa4L+CAQOOjMn/1bXIRxDJQXx58f//Hhlz/88EgsChMgz/Zs/+nfkyV/8huDOI6SD498NwoACi1Z8+S/Plz17/+QCI7jC+ZxBmfPnojIAAMDcYWSp//2wRJEwq2GABECjMgNYwAmA=")) } var iconSaturn = { - text: "SATURN", width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("AH4A/AEkQuPHCJ0ChEAwARNjAjBjgjOhs06Q2OEYVx4ARMhEggUMkANIDoIgBoEEgEBNxJEC6ZrBAAMwNxAjDNYcHNxIjB7dtEwIHBwRoKj158+cuPEjlwCRAjC23bpu0wRNDAAsHEYWeEwaSJ6YjCAQUNSRQjEzxQBWZMNEYlsmg2JWAIjCz95SoJuJggjDtuw6dMG5JKCz998wFBJRVNEYW0yaVBJRNhJQN9+4pCzhKJmBKC4YpB/fINxIgCzFxSoQ3J4ENm3CAQPb98wbpEcAQMYWwKYBNxMDXgc2/fv3g2IEAOAgAjBjy5CEhEMfYICBgfPnjdLjj+CgMHiC3JknDhhoINw4jCAB0IJQIANR4QjPAH4A/AFA")) } var iconMoon = { - text: "MOON", width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("AH4AQjlx44CCCZsg8eOkHDwAQKEYgmPhEgEQM48AOIgMHEYoCB4ATI8UAmH/x04JoRuJsImHuBKLn37EwZuIgEQOI8cEpXj/yYBhE8+YNGgkYoJxITBUPnAaC///nC+FjBuIOJZEB8YeCh/8AoYACoMEEAnEjhQDPQJKJ/DCDAoi5DoLdHAoMQgLjFWYPOnngh02IwXzwDjEgPGEYS8BI4MBYoSVG4fP/nghkAgZrDkngJQqSG4gvBg4sBQgkImHihEAWwP8ZBMBEYl5/+cSoVAGQIUFh04weJn///0gj/OEw5KEz45BzhuCTYQAEgePB4IACAoJuBnAQEa4XHjxKB//xFgWHJQsCRgMDEonipwjENwUBDQNx8+evvn/hTDLw3igE+EgZxB8UOXIvEJQUfEYOfv53DEQkgga5BJQvzx84cAj+CDoNh8/eEYJKDuCSEcocnEon+/7xEgFBIIcfB4Mf/IICXI2DgDdBAAn758gCIq5Dv4zBvJuIOIfjEgvP/ARHgwdCB4P3AoTdFAAk4EYk8SQgAFTALaDSQwAGh08//vnDmBABYmEEZYAzA==")) } var iconMars = { - text: "MARS", width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("AH4ATjlwCJ+Dh0wwAQMg0cuPHjFhCZkDps0yVJkmQCBMEjFx42atOmzQmLhMkEYQCCCREQoOGEYmmzB0IEY4CBkARGoJKBEYQCEzgSGkGSpAjDyYCCphuGiFhJQgCD8ASFgRHGAQKbB6BuHJRGeOIsINxEk6dNmARDgMEjQjHAQPnVQojIyZKB6YSDNwK5FAQt54BuDXJIjBEwK5EgxKKXgq5BJRdgXIojJAQJKMcAM0EwM2JUApDoCVFExa7FkGCgAmIkAREEwUEjAmHCIgABhEggQmFpACBCIojBEwRQCzVhwkQU4YADgQmBwQCCI4IFBCAojFAQojGJQQjDAQgRGEZICBEo4gFyUIkilFJQUYEAZrBAQMYNw5KDSQSbCNwwABgOGEwgCBsPACQ5xGwdNnARJcAVh48evvnCJK8Chs+/fv33gCRcB48cuPHCBYA/ADAA==")) } var iconSatellite = { - text: "GPS ON", width : 50, height : 50, bpp : 3, transparent : 2, buffer : require("heatshrink").decompress(atob("pMkyQC/ATGXhIRPyNl0gmPjlwCJ9ly1aCJ1c+fHJR1Hy1ZJR1I+fPnlx6QRLpe+/JKBr5KMuYjBJQMdCJce/fvJQW0CJUlEYQCBSpvvJQbXJjl0NwnzNxGQwEOnHhgF78+WqQyIrFx48cAQXz4ShJgAABh0+8cP//9LJEhg4jDuP3//0LhGQgYlBgeAn///5cIy8MuAmDCIP/9I4HkmCEYMOgHfCQWkCI0cuBuDgF/CIP+CI1Ny1IkeAgHANwIAB/QRFrj7BhkxEwQRC/4RFpbXDgSVBg4RCSorXDI4MJAQMfCIP8cwImDn37fwN58+kwHgLgSVFub7CI4NyBAJKDLgkuEYX78+evKtCLg0jEYRKC58JMoRcFkwjDJQTFDl65EkojEAQMdcwn/+gFC3YjEJQLXEpYRDWwQmEdI6SHAQO0CJUkx4jDF4gCIJQgRMXIjCEARIjCCJ2XEYPKCJqJBJQIROcAUpCJ0kybaDARtdCKAC2kAA=")) } var iconAlarm = { - text: "TIMER", width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("kmSpICEp//BAwCJn/+CJ8k//5CKAABCJs8uPH//x48EI5YjCAARNKEYUcv//jgFBExEnEYoAC+QmHIgIgC/gpCuPBCI2fIgU4AQXjA4P8CIuTEYZKBAolwHApXBEAWP//jxwpBAALaFDoYCIiQmDDIP4EAT+CEwnJEwYjLAQLaFEYomDKALmDNwoCIOIZuD8AkFgCYDHAQjMAQTdDNwOAEg0Dx0/cYeREZtxQYOTHgJuHOIvkXJy8DNwIACJQ8Ah4NDAAfxEZARHOIIkHg4jQAQb1CQ4KVJgEOnDIBSoIjNAQPBcAaVJcAKVBcDGOcD7OBMQM48BuH8f//JKCnhKNggRBkmfTQJxBEwhuD/gRCyVHJRlyCIVJXgYmB8ZQBAoIKBXIQmCOIt/NxAUCOIImCIgIpCBAJuDAQZEE/huIAQWTDgImBTYQGC8gRFcYpKFCI8kDwQAFCJBfBEAX/+IjBiQRIEw4jJAQc8v//NYwCIOgJrIJpA1OcwbaFAQWQA=")) } var iconCharging = { - text: "CHARGE", width : 50, height : 50, bpp : 3, transparent : 5, buffer : require("heatshrink").decompress(atob("23btugAwUBtoICARG0h048eODQYCJ6P/AAUCCJfbo4SDxYRLtEcuPHjlwgoRJ7RnIloUHoYjDAQfAExEAwUIkACEkSAIEYwCBhZKH6EIJI0CJRFHEY0BJRWBSgf//0AJRYSE4BKLj4SE8BKLv4RD/hK/JS2AXY0gXwRKG4cMmACCJQMAg8csEFJQsBAwfasEAm379u0gFbcBfHzgFBz1xMQZKBjY/D0E2+BOChu26yVEEYdww+cgAFCg+cgIfB6RKF4HbgEIkGChEAthfCJQ0eEAIjBBAMxk6GCJQtgtyVBwRKBAQMbHAJKGXIIFCgACBhl54qVG2E+EAJKBJoWAm0WJQ6SCXgdxFgMLJQvYjeAEAUwFIUitEtJQ14NwUHgEwKYZKGwOwNYX7XgWCg3CJQ5rB4MevPnAoPDJRJrCgEG/ECAoNsJRUwoEesIIBiJKI3CVDti/CJRKVDiJHBSo0YsOGjED8AjBcAcIgdhcAXAPIUAcAYIBcA4dBAQUG8BrBgBuCgOwcBEeXIK2BBAIFBgRqBGoYAChq8CcYUE4FbUYOACQsHzgjDgwFBCIImBAQsDtwYD7cAloRI22B86YBw5QBgoRJ7dAgYEDCJaeBJoMcsARMAQNoJIIRE6A")) @@ -100,15 +93,15 @@ var iconNoBattery = { // Font to use: // Graphics.prototype.setFontAntonioSmall = function(scale) { - // Actual height 18 (17 - 0) - g.setFontCustom(atob("AAAAAAAAAAAAAAAf4Mf/sYAMAAAAAAfgAfAAAAAfgAeAAAAAAiAAj8H/4fyEAv8f/gfiAAgAAAAD54H98eOPHn8Hz8AhwAAAP8Af+AYGAYCAf+AP8MAB8AHwA+AD4AfAAcf4A/8AwMAwMA/8Af4AAAAAwGD8f/8f8MY/cfz4PD8AHMAAAfAAeAAAAAAAAP/+f//YADAAAQABYADf//P/+AAAAAANAAPAAfwAfgAPAANAAAAAAEAAEAA/AA/AAEAAEAAAAAAZAAfAAYAAAAIAAIAAIAAIAAAAAAAAAMAAMAAAAAAAAEAB8Af4H+AfwAcAAAAAP/4f/8YAMf/8f/8H/wAAAAAAEAAMAAf/8f/8f/8AAAAAAAAAHgcfh8cH8YPMf8MPwEAAAAAAOB4eB8YYMY4Mf/8Pn4AAAAAgAHwA/wPwwf/8f/8AAwAAgAAAf54f58ZwMZwMY/8Qf4AAAAAAP/4f/8YYMYYMff8HP4AAAQAAYAAYD8Y/8f/AfgAcAAAAAAAAPv4f/8YYMY8Mf/8Pn4AAAAAAP94f98YGMcMMf/8H/wAAAAAABgwBgwAAAAAABgABg/Bg8AAAAEAAOAAbAA7gAxgBwwASAAbAAbAAbAAbAASAAAAAxwA5gAbAAPAAOAAAAPAAfHcYPcf8Af4AHgAAAAAAAB/gH/wOA4Y/MZ/sbAsbBkb/MZ/sOBsH/AAAAAAMAP8f/4fwwf4wH/8AH8AAMAAAf/8f/8YYMYYMf/8P/4ADgAAAP/4f/8YAMYAMfj8Pj4AAAAAAf/8f/8YAMYAMf/8P/4B/AAAAf/8f/8YMMYMMYIMAAAAAAf/8f/8YYAYYAYYAAAAAAAP/4f/8YAMYIMfP8Pv8AAAAAAf/8f/8AMAAMAf/8f/8f/8AAAAAAf/8f/8AAAAAAAD4AB8AAMf/8f/4f/gAAAAAAf/8f/8A+AD/gfj4eA8QAEAAAf/8f/8AAMAAMAAMAAAf/8f/8f8AB/wAB8AP8P/Af/8f/8AAAAAAf/8f/8HwAA+AAPwf/8f/8AAAAAAP/4f/8YAMYAMf/8P/4AAAAAAf/8f/8YGAYGAf8AP8ABAAAAAf/w//4wAYwAc//+f/yAAAAAAf/8f/8YMAYMAf/8f/8DA8CAAPj4fz8Y4MeeMfP8HD4YAAYAAf/8f/8YAAQAAAAAf/4f/8AAMAAMf/8f/4AAAYAAf4AP/4AP8AP8f/4fwAQAAYAAf8AP/8AD8D/8f8Af8AD/8AD8f/8f8AAAAQAEeB8P/4B/AP/4fA8QAEYAAfAAP4AB/8H/8fwAcAAAAMYD8Y/8f/MfwMcAMAAAf/+f//YADYADAAAAAAfAAf8AB/wAH8AAMQACYADf//f//AAAAA"), 32, atob("BAUHCAcTCAQFBQgGBAYFBggICAgICAgICAgEBQYGBggNCAgICAcHCAkECAgGCwkICAgIBwYICAwHBwYGBgY="), 18+(scale<<8)+(1<<16)); + // Actual height 20 (19 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAA//mP/5gAAAAAAAAAAAAA/gAMAAAAAA/gAPAAAEIIBP+H/8D+IYBP+H/8D+IABCAAwIAfnwP8+PHh448eP3+B4fAAAAAAAH/AD/4AwGAMBgD/4Af8GAAPgAPgAfgAfAAfAA+AAOP/AH/4BgGAYBgH/4A/8AAAAAAAAAQAA/B+f4/+GMPhjv/4/h8Dg/gAcYwAAPwADgAAAAAAAAB//8///sAAaAACAAAMAAb//+f//AAAAAAAbAAGwAA4AA/wADgABsAAbAAAAAAAgAAMAAPwAD8AAMAADAAAAAAAAAAHAAB/AAOAAAAAAAAMAADAAAwAAMAACAAAAAAAAAABgAAYAAAAAAAAA4AD+AP+A/4A/gAOAAAAAAAAAH//j//8wADMAAz//8f/+AAAAAAAMAADAABgAA//+P//gAAAAAAAAAAAAAfgfP4fzAfswfDP/gx/gMAAAHgPj4D8wMDMHAz//8f3+AAEAAAAADwAH8APzA/AwP//j//4AAwAAAD/Hw/x+MwBjOAYz/+Mf/AAAAAAAH//j//8wYDMGAz9/8fP+AAcDAAAwAAMAfjB/4z/wP+AD4AAwAAAAOB/f4///MHAzBwM///H9/gAAAAAAH/Pj/78wGDMBgz//8f/+AAAAAAADhwA4cAAAAAAAAAAAAAADh/A4fgAAAAOAAHwABsAA7gAccAGDAAAAANgADYAA2AANgADYAA2AAAAAAAABgwAccADuAAbAAHwAA4AAAAHwAD8c4/POMHAD/wAfwAAAAAAAAD/wD//B4B4Y/HMf8zMBMyATMwczP+M4BzHwcgf+AA+AAAAAAD4A/+P/8D+DA/4wH/+AB/4AAeAAAAAAA//+P//jBgYwYGP//j//4PH4AAAAAAAf/+P//zgAcwADP4fz+P4Ph8AAAAAAA//+P//jAAYwAGPADj//4P/4AAAAAAA//+P//jBgYwYGMGBgAAAAAAP//j//4wYAMGADBgAAAAAAAA//w///PAHzAQM4MHP7/x+/8AAAAAAD//4//+AGAABgAAYAP//j//4AAAAAAAAAA//+P//gAAAAAAAAAAAHwAB+AABgAAY//+P//AAAAAAAAAAD//4//+APgAf+Afj8PgPjAAYAAAAAAD//4//+AABgAAYAAGAAAAAAA//+P//j/gAD/wAB/gAP4B/4P/AD//4//+AAAAAAAAAAP//j//4P4AAfwAA/g//+P//gAAAAAAAAAA//g//+PAHjAAY4AOP//h//wAAAAAAD//4//+MDADAwA4cAP/AB/gAAAAAAAA//g//+PAHjAAc4APv//5//yAAAAAAD//4//+MGADBgA48AP//h+f4AAAAAAB+Pw/z+MOBjBwY/P+Hx/AAHgwAAMAAD//4//+MAADAAAAAAP//D//4AAOAABgAA4//+P//AAAAwAAP8AD//AA/+AAfgP/4//gPwAAAAA+AAP/4Af/4AD+A//j/wA/wAD/+AA/4B/+P/+D+AAAAAMADj8P4P/4A/4B//w+A+MABgAAA4AAPwAB/gAB/+A//j/gA+AAMAAAAAYwB+MH/jf+Y/8GPwBjAAAAAAP//7//+wABsAAYAAAAAAPAAD/gAH/gAD/gAD4AACAAADAAGwABv//7//+AAAA=="), 32, atob("BQUHCAgVCQQFBQkHBQcFBwgICAgICAgICAgFBQcHBwgPCQkJCQcHCQoFCQkHDQoJCQkJCAYJCQ0ICAcGBwY="), 20+(scale<<8)+(1<<16)); } Graphics.prototype.setFontAntonioLarge = function(scale) { // Actual height 39 (39 - 1) g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAPgAAAAAB8AAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAD8AAAAAH/gAAAAP/8AAAAf//gAAA///AAAB//+AAAD//8AAAH//4AAAP//wAAAB//gAAAAP/AAAAAB+AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAf////8AP/////4B//////Af/////8D8AAAAfgeAAAAA8DwAAAAHgeAAAAA8D//////gf/////8B//////AP/////wAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAHgAAAAAA8AAAAAAPgAAAAAB4AAAAAAf/////gP/////8B//////gP/////8B//////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/+AAP8A//wAP/gP/+AH/8D//wD//gfgAA//8DwAAf+HgeAAP/A8DwAH/gHgfgP/wA8D///4AHgP//+AA8A///AAHgB//AAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AA/gAD/AAH/gA/4AA/+AP/AAH/4D/4AA//gfgA4AB8DwAPAAHgeAB4AA8DwAPgAHgfAD+AB8D//////gP/////4B//5//+AD/+H//gAH/AH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAP/AAAAAP/4AAAAP//AAAAP/x4AAAf/wPAAAf/gB4AAf/AAPAAP/AAB4AB//////gP/////8B//////gP/////8AAAAAPAAAAAAB4AAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//wD/AB///Af+AP//4D/4B///Af/gP//4B/8B4D4AAPgPAeAAA8B4DwAAHgPAfAAB8B4D////gPAf///4B4B////APAD///gAAAD//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAP////4AH/////wB//////Af/////8D8APAA/geADwAB8DwAeAAHgeADwAA8D4AeAAPgf/j+AH8B/8f///gP/h///4Af8H//+AAPgP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAPAAAAAAB4AAAABgPAAAA/8B4AAB//gPAAD//8B4AH///gPAH///8B4P//+AAPH//wAAB///gAAAP//AAAAB/+AAAAAP+AAAAAB+AAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4A/+AAf/w//+AP//v//4B//////Af/////8D4AfwAPgeAB8AA8DwAHAAHgeAB8AA8D4Af4APgf/////8B//////AP//v//4A//4//8AA/4A/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAD//+D/gB///4f+AP///j/4D///8f/gfAAHgB8DwAA8AHgeAAHgA8DwAA8AHgfgAHgB8D//////gP/////4A/////+AD/////gAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAfgAAB+AD8AAAPwAfgAAB+AD8AAAPwAfgAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DBATExMTExMTExMTCw=="), 45+(scale<<8)+(1<<16)); - } + /* * Draw watch face */ @@ -128,21 +121,21 @@ function printData(key, y){ if(key == "Battery"){ var bat = E.getBattery(); g.drawString("BAT:", 30, y); - g.drawString(bat+ "%", 68, y); + g.drawString(bat+ "%", 70, y); } else if(key == "Steps"){ var steps = getSteps(); g.drawString("STEP:", 30, y); - g.drawString(steps, 68, y); + g.drawString(steps, 70, y); } else if(key == "Temp."){ var temperature = Math.floor(E.getTemperature()); g.drawString("TEMP:", 30, y); - g.drawString(temperature + "C", 69, y); + g.drawString(temperature + "C", 70, y); } else if(key == "HRM"){ g.drawString("HRM:", 30, y); - g.drawString(hrmValue, 69, y); + g.drawString(hrmValue, 70, y); } else { g.drawString("NOT FOUND", 30, y); @@ -158,15 +151,41 @@ function drawHoriztonatlBgLine(color, x1, x2, y, h){ } -Bangle.on('lock', function(isLocked) { +function drawLogo(){ if(Bangle.isLocked()){ - g.setColor(cPurple); + g.setColor(cWhite); } else { g.setColor(cBlue); } g.drawImage(logo, 120, 10); -}); +} +function drawState(){ + g.setColor(cOrange); + var bat = E.getBattery(); + var timeInMinutes = getCurrentTimeInMinutes(); + + var iconImg = + isAlarmEnabled() ? iconAlarm : + Bangle.isCharging() ? iconCharging : + bat < 30 ? iconNoBattery : + Bangle.isGPSOn() ? iconSatellite : + timeInMinutes % 4 == 0 ? iconSaturn : + timeInMinutes % 4 == 1 ? iconMars : + timeInMinutes % 4 == 2 ? iconMoon : + iconEarth; + g.drawImage(iconImg, 120, 120); + + // Alarm within symbol + g.setFontAlign(-1, -1, 0); + g.setFontAntonioSmall(); + g.drawString("STATUS", 123, 97); + if(isAlarmEnabled() > 0){ + g.setFontAlign(0, 0, 0); + g.setColor(cWhite); + g.drawString(getAlarmMinutes(), 120+25, 120+25+1); + } +} function draw(){ @@ -181,28 +200,22 @@ function draw(){ g.drawImage(backgroundImage, 0, 0); drawHoriztonatlBgLine(cBlue, 35, 120, 0, 4); drawHoriztonatlBgLine(cBlue, 130, 176, 0, 4); - drawHoriztonatlBgLine(cPurple, 35, 120, 81, 3); - drawHoriztonatlBgLine(cPurple, 130, 176, 81, 3); - drawHoriztonatlBgLine(cOrange, 35, 120, 87, 3); - drawHoriztonatlBgLine(cOrange, 130, 176, 87, 3); - drawHoriztonatlBgLine(cOrange, 35, 176, 173, 3); + drawHoriztonatlBgLine(cPurple, 35, 110, 81, 3); + drawHoriztonatlBgLine(cPurple, 120, 176, 81, 3); + drawHoriztonatlBgLine(cOrange, 35, 110, 87, 3); + drawHoriztonatlBgLine(cOrange, 120, 176, 87, 3); + drawHoriztonatlBgLine(cOrange, 20, 176, 172, 4); // Draw logo - if(Bangle.isLocked()){ - g.setColor(cPurple); - } else { - g.setColor(cBlue); - } - g.drawImage(logo, 120, 10); - + drawLogo(); // Write time - g.setColor(cBlue); + g.setColor(cWhite); g.setFontAlign(-1,-1, 0); var currentDate = new Date(); var timeStr = locale.time(currentDate,1); g.setFontAntonioLarge(); - g.drawString(timeStr, 25, 12); + g.drawString(timeStr, 28, 12); // Write date g.setColor(cPurple); @@ -210,43 +223,22 @@ function draw(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 30, 60); - g.setColor("#FFFFFF"); + g.drawString(dayStr, 35, 60); // Draw data - g.setColor(cOrange); - printData(settings.dataRow1, 98); - printData(settings.dataRow2, 121); - printData(settings.dataRow3, 144); + g.setColor(cWhite); + printData(settings.dataRow1, 97); + printData(settings.dataRow2, 122); + printData(settings.dataRow3, 147); - // Draw symbol - g.setColor(cOrange); - var bat = E.getBattery(); - var timeInMinutes = getCurrentTimeInMinutes(); - - var iconImg = - isAlarmEnabled() ? iconAlarm : - Bangle.isCharging() ? iconCharging : - bat < 30 ? iconNoBattery : - Bangle.isGPSOn() ? iconSatellite : - timeInMinutes % 4 == 0 ? iconSaturn : - timeInMinutes % 4 == 1 ? iconMars : - timeInMinutes % 4 == 2 ? iconMoon : - iconEarth; - g.drawImage(iconImg, 115, 115); - - // Alarm within symbol - g.setFontAlign(0,0,0); - g.setFontAntonioSmall(); - g.drawString(iconImg.text, 115+25, 105); - if(isAlarmEnabled() > 0){ - g.drawString(getAlarmMinutes(), 115+25, 115+25); - } + // Draw state + drawState(); // Queue draw in one minute queueDraw(); } + /* * Step counter via widget */ @@ -265,12 +257,6 @@ function stepsWidget() { return undefined; } -/* - * HRM Listener - */ -Bangle.on('HRM', function (hrm) { - hrmValue = hrm.bpm; -}); /* * Handle alarm @@ -314,8 +300,29 @@ function handleAlarm(){ /* - * Swipe to set an alarm + * Listeners */ +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +Bangle.on('lock', function(isLocked) { + drawLogo(); +}); + +Bangle.on('charging',function(charging) { + drawState(); +}); + +Bangle.on('HRM', function (hrm) { + hrmValue = hrm.bpm; +}); + Bangle.on('swipe',function(dir) { // Increase alarm if(dir == -1){ @@ -342,22 +349,11 @@ Bangle.on('swipe',function(dir) { Storage.writeJSON(SETTINGS_FILE, settings); }); - /* - * Stop updates when LCD is off, restart when on + * Lets start widgets, listen for btn etc. */ -Bangle.on('lcdPower',on=>{ - if (on) { - draw(); // draw immediately, queue redraw - } else { // stop draw timer - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - } -}); - // Show launcher when middle button pressed Bangle.setUI("clock"); - Bangle.loadWidgets(); /* * we are not drawing the widgets as we are taking over the whole screen From a2afacfca0fd070b4c06f47458e1414fc094e1ba Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 12:22:36 +0100 Subject: [PATCH 048/476] Minor performance improvements (no logo) --- apps/lcars/lcars.app.js | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 4bf73057b..025220798 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -36,12 +36,6 @@ var backgroundImage = { buffer : require("heatshrink").decompress(atob("AAUM2XLlgCCwAJBBAuy4EAmQIF5cggAIGlmwgYIG2XIF42wF4ImGF4ImHJoQmGJoQdJhZNHNY47CgRNGBIJZHHgRiGBIRQ/KH5QCAFCh/eX5Q/KAwdCAGVbtu27YCCoAJBkuWrNlAQRGCiwRDAQPQBIMJCIYCBsAJBgomEtu0WoQmEy1YBIMBHYttIwQ7FyxQ/KHFlFAQ7F2weCHYplKChRTCCg5TCHw5TMAD0GzVp0wCCBBGaBIMaBAtpwECBA2mwEJBAugDgMmCIwJBF5EABAtoeQQvGCYQdPJoI7LMQzTCLJKAGzAJBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A==")) } -var logo = { - width : 56, height : 56, bpp : 1, - transparent : 0, - buffer : require("heatshrink").decompress(atob("AAUEAwsOAwseAwsfAws/AwtzwAGEuIGF8PgAocH8H4AwcP4H+FAnAv4cDveAufAAwXzwFxEYUB4cAmFwAwMDw8AnE4F4UGgEYjBmCM4McjgGEhhxCBQUMC4IYBAwMOg4GBnAfBgwGCmAtBg8DAwxUBuEwIIIGDJIMDwYGCsAGBwIGBsAGBgIGDMoMB4IGIuB6C4YGBuIGJ8YGBmOAgPgsYJBAwMH+AGCneAh84u4GBjeAPAIGCcgM4hk+YQQ5BhwGE8EHninCgPAgYGCgxzBge4AwSPBgLnCVwQGEU4MH/gGCn+An98AwV///+AwUMuP/+AwChngJwIGCh52CjxaCPIIfBAxICBJIIXEAAb+CACA")) -} - var iconEarth = { width : 50, height : 50, bpp : 3, buffer : require("heatshrink").decompress(atob("AFtx48ECBsDwU5k/yhARLjgjBjlzAQMQEZcIkOP/fn31IEZgCBnlz58cEpM4geugEgwU/8+WNZJHDuHHvgmBCQ8goEOnVgJoMnyV58mACItHI4X8uAFBuVHnnz4BuGxk4////Egz3IkmWvPgNw8f/prB//BghTC+AjE7848eMjNnzySBwUJkmf/BuGuPDAQIjBiPHhhTCSQnjMo0ITANJn44Dg8MuFBggCCiFBcAJ0Bv5xEh+ITo2OhHkyf/OIQdBWwVHhgjBNwUE+fP/5EEgePMoYLBhMgyVJk/+BQQdC688I4XxOIc8v//NAvr+QEBj/5NwKVBy1/QYUciPBhk1EAJrC+KeC489QYaMBgU/8BNB9+ChEjz1Jkn/QYMBDQIgCcYTCCiP/nlzJQmenMAgV4//uy/9wRaB/1J8iVCcAfHjt9TYYICnhKCgRKBw159/v//r927OIeeoASBDQccvv3791KYVDBYPLJQeCnPnz//AAP6ocEjEkXgMgJQtz79fLAP8KYkccAcJ8Gf/f/xu/cAMQ4eP5MlyQRCMolx40YsOGBAPfnnzU4KVDpKMBvz8Dh0/8me7IICgkxJQXPIgZTD58sEgcJk+eNoONnFBhk4/5uB/pcDg5KD+4mEv4CBXISVDhEn31/8/+mH7x//JQK5CAAMB4JBCnnxJQf/+fJEgkAa4L+CAQOOjMn/1bXIRxDJQXx58f//Hhlz/88EgsChMgz/Zs/+nfkyV/8huDOI6SD498NwoACi1Z8+S/Plz17/+QCI7jC+ZxBmfPnojIAAMDcYWSp//2wRJEwq2GABECjMgNYwAmA=")) @@ -151,17 +145,18 @@ function drawHoriztonatlBgLine(color, x1, x2, y, h){ } -function drawLogo(){ +function drawLock(){ + g.setFontAntonioSmall(); + g.setColor(cWhite); if(Bangle.isLocked()){ - g.setColor(cWhite); - } else { - g.setColor(cBlue); + g.setColor(cOrange); } - g.drawImage(logo, 120, 10); + g.drawString("LCARS", 130, 15); + g.drawString("BJS-2", 130, 35); } function drawState(){ - g.setColor(cOrange); + g.setColor(cWhite); var bat = E.getBattery(); var timeInMinutes = getCurrentTimeInMinutes(); @@ -207,7 +202,7 @@ function draw(){ drawHoriztonatlBgLine(cOrange, 20, 176, 172, 4); // Draw logo - drawLogo(); + drawLock(); // Write time g.setColor(cWhite); @@ -218,7 +213,7 @@ function draw(){ g.drawString(timeStr, 28, 12); // Write date - g.setColor(cPurple); + g.setColor(cWhite); g.setFontAntonioSmall(); var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); @@ -312,7 +307,7 @@ Bangle.on('lcdPower',on=>{ }); Bangle.on('lock', function(isLocked) { - drawLogo(); + drawLock(); }); Bangle.on('charging',function(charging) { From 3dd4351567f14f5ed787b77ed5795c9d5965dde9 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 12:54:13 +0100 Subject: [PATCH 049/476] Minor changes --- apps/lcars/lcars.app.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 025220798..84d12953e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -114,25 +114,25 @@ function printData(key, y){ if(key == "Battery"){ var bat = E.getBattery(); - g.drawString("BAT:", 30, y); + g.drawString("BAT:", 28, y); g.drawString(bat+ "%", 70, y); } else if(key == "Steps"){ var steps = getSteps(); - g.drawString("STEP:", 30, y); + g.drawString("STEP:", 28, y); g.drawString(steps, 70, y); } else if(key == "Temp."){ var temperature = Math.floor(E.getTemperature()); - g.drawString("TEMP:", 30, y); + g.drawString("TMP:", 28, y); g.drawString(temperature + "C", 70, y); } else if(key == "HRM"){ - g.drawString("HRM:", 30, y); + g.drawString("HRM:", 28, y); g.drawString(hrmValue, 70, y); } else { - g.drawString("NOT FOUND", 30, y); + g.drawString("NOT FOUND", 28, y); } } @@ -147,12 +147,13 @@ function drawHoriztonatlBgLine(color, x1, x2, y, h){ function drawLock(){ g.setFontAntonioSmall(); - g.setColor(cWhite); - if(Bangle.isLocked()){ - g.setColor(cOrange); - } + g.setColor(cOrange); + g.clearRect(120, 10, g.getWidth(), 80); g.drawString("LCARS", 130, 15); - g.drawString("BJS-2", 130, 35); + g.drawString("B-JS2", 130, 35); + if(Bangle.isLocked()){ + g.drawString("LOCK", 130, 55); + } } function drawState(){ @@ -206,11 +207,10 @@ function draw(){ // Write time g.setColor(cWhite); - g.setFontAlign(-1,-1, 0); var currentDate = new Date(); var timeStr = locale.time(currentDate,1); g.setFontAntonioLarge(); - g.drawString(timeStr, 28, 12); + g.drawString(timeStr, 25, 12); // Write date g.setColor(cWhite); @@ -218,7 +218,7 @@ function draw(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 35, 60); + g.drawString(dayStr, 28, 60); // Draw data g.setColor(cWhite); From 1b92b2bbc4f7bf9cdb2a51e9f99e47d40626ab37 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 13:01:58 +0100 Subject: [PATCH 050/476] New version --- apps.json | 2 +- apps/lcars/ChangeLog | 3 ++- apps/lcars/README.md | 7 ++++--- apps/lcars/lcars.app.js | 8 ++++---- apps/lcars/lcars.png | Bin 1823 -> 1840 bytes apps/lcars/screenshot.png | Bin 2921 -> 5139 bytes 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..028127859 100644 --- a/apps.json +++ b/apps.json @@ -4487,7 +4487,7 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.07", + "version":"0.08", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index c5f8187b7..f30ae4707 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -4,4 +4,5 @@ 0.04: Inluded LCARS Logo. 0.05: Additional icons for (1) charging and (2) bat < 30%. 0.06: Fix - Alarm disabled, if clock was closed. -0.07: Added settings to adjust data that is shown for each row. \ No newline at end of file +0.07: Added settings to adjust data that is shown for each row. +0.08: Smaller background for faster rendering. Full screen mode. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 15009e838..31cb81341 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -1,14 +1,15 @@ # LCARS clock A simple LCARS inspired clock. -Note: To display the steps, its necessary to install +Note: To display the steps, its necessary (but still optional) to install the [Pedometer widget](https://banglejs.com/apps/#pedometer%20widget). ## Features * LCARS Style watch face - * Shows satate (charging, out of battery etc.) - * SHows data that can be configured (steps, HRM, temperature etc.) + * Shows different states (charging, out of battery, GPS on etc.) + * Shows customizable data (steps, HRM, battery, temperature etc.) * Swipe left/right to activate an alarm + * Full-screen mode ## Icons diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 84d12953e..8ac1dfe14 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -170,7 +170,7 @@ function drawState(){ timeInMinutes % 4 == 1 ? iconMars : timeInMinutes % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 120, 120); + g.drawImage(iconImg, 120, 118); // Alarm within symbol g.setFontAlign(-1, -1, 0); @@ -179,7 +179,7 @@ function drawState(){ if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); - g.drawString(getAlarmMinutes(), 120+25, 120+25+1); + g.drawString(getAlarmMinutes(), 120+25, 118+25+1); } } @@ -200,7 +200,7 @@ function draw(){ drawHoriztonatlBgLine(cPurple, 120, 176, 81, 3); drawHoriztonatlBgLine(cOrange, 35, 110, 87, 3); drawHoriztonatlBgLine(cOrange, 120, 176, 87, 3); - drawHoriztonatlBgLine(cOrange, 20, 176, 172, 4); + drawHoriztonatlBgLine(cOrange, 20, 176, 171, 5); // Draw logo drawLock(); @@ -218,7 +218,7 @@ function draw(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 28, 60); + g.drawString(dayStr, 28, 58); // Draw data g.setColor(cWhite); diff --git a/apps/lcars/lcars.png b/apps/lcars/lcars.png index 167352ef4bd6db8c6de6bc845396944af7bcc040..9264f93f21be2ea0c39faabab767f88da6d4ad43 100644 GIT binary patch delta 1809 zcmV+s2k!Wv4zLc8G=JwwL_t(&fz6p~P!v}d$A8l^vk(+Z1hmT4RktMSSVk#jVI}c{ zNUHW>_#jn2Qc)ZbU0mG3#qiLq#R_PG5s0QrkO-~`WJ@#;E%QO*qeKiME4mViPzx)T zf@FP-ykwZ!4`y1L>6vMUp4$Cab$@{J%RXZ3ADGj%l0)lH?uY6V^!m+UP78=0hV~4D6+kL`7&jt7gdR?S_w^k z{})bcUk=l!Pp7r5YSeL6nSs51AC5>oKwDcIdv+fib!=5;U~=xyxp(j0h{sKuG>MMR zOQVYI(F}apzmKRdmN6!6Ec{X9k$8a4&Q3xX#FCL-;(yV27{LsDI{q_COG`O-?wrF* zN-Y=+2IAx6+4|=g#bewiaK!&_?Ao=9mX?-L3sj1LfB=$`lE}_k@7C630*lKdsi~=P zI#>_{ugwO)lqpjvC@5e>>;mT+gpZ7j#8w1NTYn%UFq5XHCZ0WerjmSE zv}h51AN7-wk-?ZTVQq~KdAZG2gyf2jj&`se z&E@a!FY&)(#R>I?c>VJ?uvjc2xnaWw@+rF7!N2>^tlYkhEVFsq)fb{XKW z9a%2>M+;Z8yL|a_@&5Mh+W-iyt*s)taDU-Kw*f9(xZt@u1?cYXcG@>@-aH3R=;`SZ z8~*DIY7>)#G%-(MXa9S)peFc`!} zU0t0^$8sygNa5$_$IzH^sIRY=3b3r6P?=j_xH>4L*EnO;o$%Xxx3>fFNr;S_BeHX^XAQw>IPu$ z+_^kIFhJqlk3_C$VKEC9IR8u@{vdz%)o&Rb92DDY*Se3|>*5lUv*L2^oZig*ouIZrx%-U4H^8DJhcE zzO=M7iJitqi`aXltQw=yDA^|J^?EjM-i%(aCoeD0t)OYsrqP!9Z?|^C;gkF`oKzkeUI+02tCPq138=yW=CIvs(5flQn@k;#)MJN-cp#V=<> z)7sjK4cDuh&SmdU7=Qj5yK?192k`(YTi;URP7!i)a#*v*@i=EV6qV4UM~}q&(9lpm z|GV>}KDDrV&98`xisE=>gG)O_Ghkopf`Wqh$F)o@f!^L;GBY#X8~zWVXchW@#(x2Ym$Z{xh~>!u015yANkvXXu0mjfanhH5 delta 1791 zcmVXOMeaKpD>tb0K0#?jIy#a zTr1jOuownQAmwQdN=s+nd__eCp7k9wNF0MCP~~iaq@*MYmzVrbaXKGwYIk6Y1a`><8huqR#ukA{?yb|PUCT!z(;99OiycG zm6b{*e!a1tvwxVJB~Yk(j{5p~R<;ixKEzvg*__1XEP-?9&go=-^5jWQ;&PHe-e{-V zA6Fe@G8q(;XBQlslLRhYxS-cKkw~=Q*gSm(T~TzQq@)Co9zDXy$cWy-dwYA4ohN{= zuP@%VKcklqBesXRGAkt{5()0yxkKBexB{Qg$KJhrVShZ$ey`A)!0#60NK8ybTU*D5|wSx(QFxb}s04FCWh(scE%C@W5z(igh@5b^Y zUonbbxpF0hLLnYJcmQ*AbI!yH1Ok|vno_vV&Q1gb1fZ@lMC~|Q0`YZs5D^i9v9U1< zzhT1$On+YkniKy)v|9|Co0~B_Jj{`NVBNZP7|R_;baXTg*umRL8+iBbT@GZ=K`xggb0~vs7k>ucfLJW1Ow+o$Iuzg9LK#OU@aEPY z85xP|UlcM1%N)wUqOrm^0Dyar^ddMm{$;7skfMWc$>qx#g7rfb#NklJM~GK*p9#je)qH zK7X@NDwRkdOr!DJ#{F^V&>^xdm&?)fJQ@H%oT#N{9UmXBHPEY9uNEj(J#OB-$;hXy z7g45CQBe^9fSAA5J2*HX$asgw00~Xp9D~(C)7SO$^CO>IT3P@A#FHmaNOJAkwORw* zyLV52bu6IiaJYK)Y8pq3j*gOz#fukf4S(?X@nijz>42k^k&L{ptu2istgWrdMsIJg zR_BJC|Fckc{_5%Jp>YJC&nFvIRaF`tGp!K1!ra^(^J6lhy1JT?zkmNe`OM?ZTxEz& zn>LZ8LZLvC><8MwSxBW)U9?hQVq${BhYw>UdlZe||Be0o_p7xXA0KDr=kF6hNOZD?rFRW|@&)v8sPxH5?!H(n&U^ba$zW)1ypGmAH0HaZwRn4bdnkSx!vWiaT5Y4= ziH4`ACyj4vYQnxhLJ<)WL8oi?v;pXOs zR-t~E|Ks&>lv5@}q>&NA!^7dSj9!1DT`9Ys20)lF0uK)lodmeLy6P?d#9znN-tcT} zY><{IWLHiei_+we8*y2%DS9uF#&O7GH(r>7@&1y*XbVO1Ml^R7fM0ZOHk zwRn4bdxVCDLUeu_mX?+PfcExwt>g5njRJtNu`xDp-i*4sIt&a9=zl!k)YKFLfdJm# z-dOIGLg|Z&ib7mm9Qyh+%$?U@m4LN<4vkAlNPvZD47P2Z<5WZny1Tm}m&@_;e4IXg8hAT*(#tutm~5QAc=3XK76=4*-;>*-78ClO?SPMu51f|Y&}hf% z3(PEaGe27Ju0I#9jwSp)DMP1Bvkj{+Ff=p-f*=qV)z5(}Zow)6g+hUt82X(5KY-N~ h`q-yLyU~Aye*r)QY$kz4$b$d?002ovPDHLkV1n#zTzmik diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index d74635f64c385138e0b08b685db984ef3387f0a9..768c4a172e33f1cc478bc14a13400688af7bbbb2 100644 GIT binary patch literal 5139 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 BpU(gQ literal 2921 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 Date: Sun, 19 Dec 2021 13:10:49 +0100 Subject: [PATCH 051/476] Create app.js --- apps/andark/app.js | 110 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 apps/andark/app.js diff --git a/apps/andark/app.js b/apps/andark/app.js new file mode 100644 index 000000000..92d2bb7e3 --- /dev/null +++ b/apps/andark/app.js @@ -0,0 +1,110 @@ +const c={"x":g.getWidth()/2,"y":g.getHeight()/2}; +let zahlpos=[]; + +function zeiger(len,dia,tim){ + const x =c.x+ Math.cos(tim)*len/2, + y =c.y + Math.sin(tim)*len/2, + d={"d":3,"x":dia/2*Math.cos(tim+Math.PI/2),"y":dia/2*Math.sin(tim+Math.PI/2)}, + pol=[c.x-d.x,c.y-d.y,c.x+d.x,c.y+d.y,x+d.x,y+d.y,x-d.x,y-d.y]; + return pol; + +} + +function draw(){ + const d=new Date(); + let m=d.getMinutes(), h=d.getHours(), s=d.getSeconds(); + //draw black rectangle in the middle to clear screen from scale and hands + g.setColor(0,0,0); + g.fillRect(10,10,2*c.x-10,2*c.x-10); + g.setColor(1,1,1); + + if(h>12){ + h=h-12; + } + //calculates the position of the minute, second and hour hand + h=2*Math.PI/12*(h+m/60)-Math.PI/2; + //more accurate + //m=2*Math.PI/60*(m+s/60)-Math.PI/2; + m=2*Math.PI/60*(m)-Math.PI/2; + + s=2*Math.PI/60*s-Math.PI/2; + g.setFontAlign(0,0); + g.setFont("Vector",10); + let dateStr = " "+require("locale").date(d)+" "; + g.drawString(dateStr, c.x, c.y+20, true); + // g.drawString(d.getDate(),1.4*c.x,c.y,true); + g.drawString(Math.round(E.getBattery()/5)*5+"%",c.x,c.y+40,true); + drawlet(); + g.setColor(1,0,0); + const hz = zeiger(100,5,h); + g.fillPoly(hz,true); + g.setColor(1,1,1); + const minz = zeiger(150,5,m); + g.fillPoly(minz,true); + const sekz = zeiger(150,2,s); + g.fillPoly(sekz,true); + g.fillCircle(c.x,c.y,4); + + +} +//draws the scale once the app is startet +function drawScale(){ + for(let i=-14;i<47;i++){ + const win=i*2*Math.PI/60; + let d=2; + if(i%5==0){d=5;} + g.fillPoly(zeiger(300,d,win),true); + g.setColor(0,0,0); + g.fillRect(10,10,2*c.x-10,2*c.x-10); + g.setColor(1,1,1); + } +} + +//draws the numbers on the screen + +function drawlet(){ + g.setFont("Vector",20); + for(let i = 0;i<12;i++){ + g.drawString(zahlpos[i][0],zahlpos[i][1],zahlpos[i][2]); + } +} +//calcultes the Position of the numbers when app starts and saves them in an array +function setlet(){ + let sk=1; + for(let i=-10;i<50;i+=5){ + let win=i*2*Math.PI/60; + let xsk =c.x+2+Math.cos(win)*(c.x-10), + ysk =c.y+2+Math.sin(win)*(c.x-10); + if(sk==3){xsk-=10;} + if(sk==6){ysk-=10;} + if(sk==9){xsk+=10;} + if(sk==12){ysk+=10;} + if(sk==10){xsk+=3;} + zahlpos.push([sk,xsk,ysk]); + sk+=1; + } +} +setlet(); +// Clear the screen once, at startup +g.setBgColor(0,0,0); +g.clear(); +drawScale(); +draw(); +let secondInteraval= setInterval(draw, 1000); +// Stop updates when LCD is off, restart when on + +Bangle.on('lcdPower',on=>{ + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (on) { + secondInterval = setInterval(draw, 1000); + draw(); // draw immediately + }else{ + } +}); + +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +//Bangle.loadWidgets(); +//Bangle.drawWidgets(); From 27f68461c97a4b44540fd6835aaabe42b404f609 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:14:04 +0100 Subject: [PATCH 052/476] Add files via upload --- apps/andark/app_icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/andark/app_icon.js diff --git a/apps/andark/app_icon.js b/apps/andark/app_icon.js new file mode 100644 index 000000000..b213fe5c8 --- /dev/null +++ b/apps/andark/app_icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgIEBoUAiAKCgUCBQUEColEAYUQhAmKCwgeCAAcCgEDjwEBkEAg8TBocNgYFDh8GAYMDxkPjEA8EAwkHJgIcBAoPfAoYWCBYYFIgfvAoX4FYRJEAp9gAomYNAOAArPwAogAC4AFiRoIFJLgIFJuADCg//Q4U//4FDj4FEAAV4Aoi0CSxBsCA==")) \ No newline at end of file From ae1a0008c948dca1443cea5a91b8cf477f57fb68 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:15:14 +0100 Subject: [PATCH 053/476] Update app.js --- apps/andark/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/andark/app.js b/apps/andark/app.js index 92d2bb7e3..cf248d462 100644 --- a/apps/andark/app.js +++ b/apps/andark/app.js @@ -35,10 +35,10 @@ function draw(){ // g.drawString(d.getDate(),1.4*c.x,c.y,true); g.drawString(Math.round(E.getBattery()/5)*5+"%",c.x,c.y+40,true); drawlet(); - g.setColor(1,0,0); + //g.setColor(1,0,0); const hz = zeiger(100,5,h); g.fillPoly(hz,true); - g.setColor(1,1,1); + // g.setColor(1,1,1); const minz = zeiger(150,5,m); g.fillPoly(minz,true); const sekz = zeiger(150,2,s); From 47ea22a5fdc6985f7f79b86bc203b1a070092132 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:19:19 +0100 Subject: [PATCH 054/476] Create README.md --- apps/andark/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 apps/andark/README.md diff --git a/apps/andark/README.md b/apps/andark/README.md new file mode 100644 index 000000000..00c80ea54 --- /dev/null +++ b/apps/andark/README.md @@ -0,0 +1,11 @@ +# Analog Clock + +## Features + +* second hand +* date +* battery percantage + +no widgets + +![image](image url "/andark_screen.png") From 0de8d137b3dda1a4cd9320714399e62b2da0746e Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:19:30 +0100 Subject: [PATCH 055/476] Add files via upload --- apps/andark/andark_screen.png | Bin 0 -> 3660 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/andark/andark_screen.png diff --git a/apps/andark/andark_screen.png b/apps/andark/andark_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac54c1cd160a6f314f9d7b2bae433fdd36672b0 GIT binary patch literal 3660 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 e%?Zc0r|v)X{}o=3H&nR*0000 Date: Sun, 19 Dec 2021 13:22:17 +0100 Subject: [PATCH 056/476] Update README.md --- apps/andark/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/andark/README.md b/apps/andark/README.md index 00c80ea54..ff46c9bde 100644 --- a/apps/andark/README.md +++ b/apps/andark/README.md @@ -8,4 +8,4 @@ no widgets -![image](image url "/andark_screen.png") +![logo](https://github.com/HeiLaut/BangleApps/edit/master/apps/andark/andark_screen.png) From e29c3efb004eace481c82acbb80bb8aad19452fc Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:22:56 +0100 Subject: [PATCH 057/476] Update README.md --- apps/andark/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/andark/README.md b/apps/andark/README.md index ff46c9bde..3770c1017 100644 --- a/apps/andark/README.md +++ b/apps/andark/README.md @@ -5,7 +5,6 @@ * second hand * date * battery percantage +* no widgets -no widgets - -![logo](https://github.com/HeiLaut/BangleApps/edit/master/apps/andark/andark_screen.png) +![logo](andark_screen.png) From 80c420bd7682b814be94fee11b45cd7d2d98b674 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:25:31 +0100 Subject: [PATCH 058/476] Create add_to_apps.json --- apps/andark/add_to_apps.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 apps/andark/add_to_apps.json diff --git a/apps/andark/add_to_apps.json b/apps/andark/add_to_apps.json new file mode 100644 index 000000000..71b1fb747 --- /dev/null +++ b/apps/andark/add_to_apps.json @@ -0,0 +1,13 @@ +{ "id": "andark", + "name": "Analog Dark", + "shortName":"AnDark", + "version":"0.01", + "description": "analog clock face without disturbing widgets", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"anrark.app.js","url":"app.js"}, + {"name":"andark.img","url":"app_icon.js ","evaluate":true} + ] +} From e990575bc1171c9c7d287f883711f68173614c80 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:26:18 +0100 Subject: [PATCH 059/476] Update apps.json --- apps.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e5e9f8f02..473f80142 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,18 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] - } + }, + { "id": "andark", + "name": "Analog Dark", + "shortName":"AnDark", + "version":"0.01", + "description": "analog clock face without disturbing widgets", + "tags": "", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"anrark.app.js","url":"app.js"}, + {"name":"andark.img","url":"app_icon.js ","evaluate":true} + ] +} ] From 1f525aed368e7a44e420eafd0c0caeaf6a2844f7 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:32:29 +0100 Subject: [PATCH 060/476] Update apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 473f80142..03991e87e 100644 --- a/apps.json +++ b/apps.json @@ -5068,7 +5068,8 @@ "shortName":"AnDark", "version":"0.01", "description": "analog clock face without disturbing widgets", - "tags": "", + "type": "clock", + "tags": "cloc", "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ From d063566213d39b25d17eb3cfe09716b6ef88514d Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:33:40 +0100 Subject: [PATCH 061/476] Add files via upload --- apps/andark/andark_icon.png | Bin 0 -> 4002 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/andark/andark_icon.png diff --git a/apps/andark/andark_icon.png b/apps/andark/andark_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cded02071d3610f442f0ce327f01943a2c915753 GIT binary patch literal 4002 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 Date: Sun, 19 Dec 2021 13:34:32 +0100 Subject: [PATCH 062/476] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 03991e87e..a80bb9791 100644 --- a/apps.json +++ b/apps.json @@ -5068,6 +5068,7 @@ "shortName":"AnDark", "version":"0.01", "description": "analog clock face without disturbing widgets", + "icon" "andark_icon.png", "type": "clock", "tags": "cloc", "supports" : ["BANGLEJS2"], From dd423ac511a858ce414bfb300f0b0c6850478ad0 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:36:18 +0100 Subject: [PATCH 063/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index a80bb9791..d0cf99977 100644 --- a/apps.json +++ b/apps.json @@ -5068,7 +5068,7 @@ "shortName":"AnDark", "version":"0.01", "description": "analog clock face without disturbing widgets", - "icon" "andark_icon.png", + "icon": "andark_icon.png", "type": "clock", "tags": "cloc", "supports" : ["BANGLEJS2"], From 605674b0357859a441a62b69c0b8c8fca0f23a61 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:36:45 +0100 Subject: [PATCH 064/476] Update apps.json --- apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps.json b/apps.json index d0cf99977..75f54f912 100644 --- a/apps.json +++ b/apps.json @@ -5068,9 +5068,8 @@ "shortName":"AnDark", "version":"0.01", "description": "analog clock face without disturbing widgets", - "icon": "andark_icon.png", "type": "clock", - "tags": "cloc", + "tags": "clock", "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ From 93f4064e4c16f6c82a384dddb7999c099057470b Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:38:19 +0100 Subject: [PATCH 065/476] Update apps.json --- apps.json | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/apps.json b/apps.json index 75f54f912..e5e9f8f02 100644 --- a/apps.json +++ b/apps.json @@ -5062,19 +5062,5 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] - }, - { "id": "andark", - "name": "Analog Dark", - "shortName":"AnDark", - "version":"0.01", - "description": "analog clock face without disturbing widgets", - "type": "clock", - "tags": "clock", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"anrark.app.js","url":"app.js"}, - {"name":"andark.img","url":"app_icon.js ","evaluate":true} - ] -} + } ] From 44f12b7e1d0a0bc3ee200a7da243d51d8cc2b4ac Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:42:50 +0100 Subject: [PATCH 067/476] Update add_to_apps.json --- apps/andark/add_to_apps.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/andark/add_to_apps.json b/apps/andark/add_to_apps.json index 71b1fb747..57613f9d2 100644 --- a/apps/andark/add_to_apps.json +++ b/apps/andark/add_to_apps.json @@ -3,7 +3,9 @@ "shortName":"AnDark", "version":"0.01", "description": "analog clock face without disturbing widgets", - "tags": "", + "icon": "andark_icon.png", + "type": "clock", + "tags": "clock", "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ From 67f362d2a56a91cfc0d7e50bf40a6c90da2dfd54 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:43:30 +0100 Subject: [PATCH 068/476] Update apps.json --- apps.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..842e559b5 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": "andark", + "name": "Analog Dark", + "shortName":"AnDark", + "version":"0.01", + "description": "analog clock face without disturbing widgets", + "icon": "andark_icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"anrark.app.js","url":"app.js"}, + {"name":"andark.img","url":"app_icon.js ","evaluate":true} + ] } ] From 028e9d0f6915acd78f9b388936f96373880f9080 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:45:54 +0100 Subject: [PATCH 069/476] Update apps.json --- apps.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 842e559b5..7374b63e9 100644 --- a/apps.json +++ b/apps.json @@ -5069,9 +5069,8 @@ "version":"0.01", "description": "analog clock face without disturbing widgets", "icon": "andark_icon.png", - "type": "clock", "tags": "clock", - "supports" : ["BANGLEJS2"], + "supports" : ["BANGLEJS","BANGLEJS2"], "readme": "README.md", "storage": [ {"name":"anrark.app.js","url":"app.js"}, From f24dbc5c02365977566ed93f01254831b4b32bd5 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:52:31 +0100 Subject: [PATCH 070/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 7374b63e9..40b4ce0f9 100644 --- a/apps.json +++ b/apps.json @@ -5073,7 +5073,7 @@ "supports" : ["BANGLEJS","BANGLEJS2"], "readme": "README.md", "storage": [ - {"name":"anrark.app.js","url":"app.js"}, + {"name":"andark.app.js","url":"app.js"}, {"name":"andark.img","url":"app_icon.js ","evaluate":true} ] } From 3547fee48b88433c708336467dfe7fed0f8a26b3 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:57:34 +0100 Subject: [PATCH 071/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 40b4ce0f9..1ae374fd7 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id": "andark", "name": "Analog Dark", "shortName":"AnDark", - "version":"0.01", + "version":"0.02", "description": "analog clock face without disturbing widgets", "icon": "andark_icon.png", "tags": "clock", From 4e347b591237587566539c106dae286d11d055a5 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 13:58:42 +0100 Subject: [PATCH 072/476] Create ChangeLog --- apps/andark/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/andark/ChangeLog diff --git a/apps/andark/ChangeLog b/apps/andark/ChangeLog new file mode 100644 index 000000000..872a4b407 --- /dev/null +++ b/apps/andark/ChangeLog @@ -0,0 +1 @@ +0.02: Rename app From 6f07a83bdd5caa25b2e71a11d67838cc2d764bd3 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 14:01:28 +0100 Subject: [PATCH 073/476] Update ChangeLog --- apps/andark/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/andark/ChangeLog b/apps/andark/ChangeLog index 872a4b407..5aecb0ff9 100644 --- a/apps/andark/ChangeLog +++ b/apps/andark/ChangeLog @@ -1 +1,2 @@ +0.01: Release 0.02: Rename app From 58f663aed9b8e221586bbc46e9f6c35154c2b95a Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 14:03:14 +0100 Subject: [PATCH 074/476] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 1ae374fd7..28b3c2b1f 100644 --- a/apps.json +++ b/apps.json @@ -5069,6 +5069,7 @@ "version":"0.02", "description": "analog clock face without disturbing widgets", "icon": "andark_icon.png", + "type": "clock", "tags": "clock", "supports" : ["BANGLEJS","BANGLEJS2"], "readme": "README.md", From 485e4a9aae2b0c6ab443f1d49140881add04fd71 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 14:06:20 +0100 Subject: [PATCH 075/476] Update ChangeLog --- apps/andark/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/andark/ChangeLog b/apps/andark/ChangeLog index 5aecb0ff9..91bbd190f 100644 --- a/apps/andark/ChangeLog +++ b/apps/andark/ChangeLog @@ -1,2 +1,3 @@ 0.01: Release 0.02: Rename app +0.03: Add type "clock" From 3111e30040b552da0f2717eaa79a3f3ffe8ad2bc Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Sun, 19 Dec 2021 14:06:41 +0100 Subject: [PATCH 076/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 28b3c2b1f..5675c30d5 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id": "andark", "name": "Analog Dark", "shortName":"AnDark", - "version":"0.02", + "version":"0.03", "description": "analog clock face without disturbing widgets", "icon": "andark_icon.png", "type": "clock", From 52de03cad83f6ecf51c30b1c23fcce082f212361 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Sun, 19 Dec 2021 17:09:43 +0000 Subject: [PATCH 078/476] Reorganise again. --- apps.json | 3 +- apps/coretemp/boot.js | 23 +++++--- apps/coretemp/coretemp.js | 2 +- apps/coretemp/settings.js | 9 ++- apps/coretemp/widget.js | 113 +++++--------------------------------- 5 files changed, 40 insertions(+), 110 deletions(-) diff --git a/apps.json b/apps.json index ad54b1d43..26c17a503 100644 --- a/apps.json +++ b/apps.json @@ -4971,7 +4971,8 @@ {"name":"coretemp.wid.js","url":"widget.js"}, {"name":"coretemp.app.js","url":"coretemp.js"}, {"name":"coretemp.settings.js","url":"settings.js"}, - {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} + {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true}, + {"name":"coretemp.boot.js","url":"boot.js"} ], "data": [{"name":"coretemp.json","url":"app-settings.json"}] }, diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 61eefd6c8..3ae9b41ac 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -1,5 +1,8 @@ +//If enabled run in the background continuously. + (function() { +var settings = {}; var device; var gatt; var service; @@ -51,11 +54,11 @@ function getSensorBatteryLevel(gatt) { } function connection_setup() { - E.showMessage("Scanning for CoreTemp sensor..."); + console.log("Scanning for CoreTemp sensor..."); NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) .then(function(d) { device = d; - E.showMessage("Found device"); + console.log("Found device"); return device.gatt.connect(); }) .then(function(g) { @@ -76,10 +79,10 @@ function connection_setup() { .then(function() { console.log("Done!"); // getSensorBatteryLevel(gatt); - g.reset().clearRect(Bangle.appRect).flip(); +// g.reset().clearRect(Bangle.appRect).flip(); }) .catch(function(e) { - E.showMessage(e.toString(), "ERROR"); + console.log(e.toString(), "ERROR"); console.log(e); }); } @@ -88,13 +91,17 @@ function connection_end() { if (gatt != undefined) gatt.disconnect(); } -connection_setup(); +settings = require("Storage").readJSON("coretemp.json",1)||{}; +console.log("Settings:"); +console.log(settings); + +if (settings.enabled) { + connection_setup(); + NRF.on('disconnect', connection_setup); +} E.on('kill', () => { connection_end(); }); -// move into setup -NRF.on('disconnect', connection_setup); // restart if disconnected - // Bangle.loadWidgets(); // Bangle.drawWidgets(); })(); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 086614ed9..1ad380855 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -1,4 +1,4 @@ -// Simply listen for core events and show +// Simply listen for core events and show data Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); diff --git a/apps/coretemp/settings.js b/apps/coretemp/settings.js index 2c541f72c..5cd98ae09 100644 --- a/apps/coretemp/settings.js +++ b/apps/coretemp/settings.js @@ -22,7 +22,14 @@ storage.write(SETTINGS_FILE, s); } } - + + function updateSettings() { + require("Storage").write("coretemp.json", settings); + if (WIDGETS["sensors"]) + WIDGETS["sensors"].reload(); + return; +} + const menu = { '' : {'title' : 'CoreTemp sensor'}, '< Back' : back, diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js index 3eabf85d6..4fe76ea38 100644 --- a/apps/coretemp/widget.js +++ b/apps/coretemp/widget.js @@ -1,124 +1,38 @@ -// Widget to run sensors -// BT HRM / coretemp / csc +// Widget to show sensor status (() => { var settings = {}; - -var device; -var gatt; -var service; -var characteristic; - -class CoreSensor { - constructor() { - this.unit = ""; - this.core = -1; - this.skin = -1; - this.battery = 0; - } - - updateSensor(event) { - if (event.target.uuid == "00002101-5b1e-4347-b07c-97b514dae121") { - var dv = event.target.value; - var flags = dv.buffer[0]; - - if (flags & 8) { - this.unit = "F"; - } else { - this.unit = "C"; - } - - if (flags & 1) this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; - if (flags & 2) this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; - - Bangle.emit('CoreTemp', - {core : this.core, skin : this.skin, unit : this.unit}); - } - } - - updateBatteryLevel(event) { - if (event.target.uuid == "0x2a19") - this.battery = event.target.value.getUint8(0); - } -} - -var mySensor = new CoreSensor(); - -function getSensorBatteryLevel(gatt) { - gatt.getPrimaryService("180f") - .then(function(s) { return s.getCharacteristic("2a19"); }) - .then(function(c) { - c.on('characteristicvaluechanged', - (event) => mySensor.updateBatteryLevel(event)); - return c.startNotifications(); - }); -} - -function connection_setup() { - E.showMessage("Scanning for CoreTemp sensor..."); - NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) - .then(function(d) { - device = d; - E.showMessage("Found device"); - return device.gatt.connect(); - }) - .then(function(g) { - gatt = g; - return gatt.getPrimaryService('00002100-5b1e-4347-b07c-97b514dae121'); - }) - .then(function(s) { - service = s; - return service.getCharacteristic( - '00002101-5b1e-4347-b07c-97b514dae121'); - }) - .then(function(c) { - characteristic = c; - characteristic.on('characteristicvaluechanged', - (event) => mySensor.updateSensor(event)); - return characteristic.startNotifications(); - }) - .then(function() { - console.log("Done!"); -// getSensorBatteryLevel(gatt); - g.reset().clearRect(Bangle.appRect).flip(); - }) - .catch(function(e) { - E.showMessage(e.toString(), "ERROR"); - console.log(e); - }); -} -function connection_end() { - if (gatt != undefined) gatt.disconnect(); -} + var count=0; // draw your widget function draw() { -// if (!) return; + if (!settings.enabled) return; g.reset(); g.setFontAlign(0,0); g.clearRect(this.x,this.y,this.x+23,this.y+23); - g.setColor(settings.enabled?"#00ff00":"#80ff00"); + g.setColor((count&1)?"#00ff00":"#80ff00"); g.fillCircle(this.x+6,this.y+6,4); g.fillCircle(this.x+16,this.y+16,4); g.setColor(-1); // change color back to be nice to other apps } -// function onHRM(hrm) { -// WIDGETS["sensors"].draw(); -// } +// Set a listener to 'twinkle' + function onTemp(temp) { + count=count+1; + WIDGETS["sensors"].draw(); + } - // Called by sensor app to enable listeners + // Called by sensor app to update status function reload() { settings = require("Storage").readJSON("coretemp.json",1)||{}; // settings.fileNbr |= 0; -// Bangle.removeListener('HRM',onHRM); + Bangle.removeListener('CoreTemp',onTemp); - if (settings.coreOn) { + if (settings.enabled) { WIDGETS["sensors"].width = 24; - connection_setup(); + Bangle.on('CoreTemp', onTemp); } else { WIDGETS["sensors"].width = 0; - connection_end(); } } @@ -129,4 +43,5 @@ function connection_end() { }}; // load settings, set correct widget width reload(); + })() From f0cbe07d1dceab32de7b7be8e5174ccd6e92cfb3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 19:52:05 +0100 Subject: [PATCH 079/476] Two screens --- apps/lcars/bg_right.png | Bin 0 -> 791 bytes apps/lcars/lcars.app.js | 185 ++++++++++++++++++++++++++++++------ apps/lcars/screenshot.png | Bin 5139 -> 4813 bytes apps/lcars/screenshot_2.png | Bin 0 -> 2671 bytes 4 files changed, 155 insertions(+), 30 deletions(-) create mode 100644 apps/lcars/bg_right.png create mode 100644 apps/lcars/screenshot_2.png diff --git a/apps/lcars/bg_right.png b/apps/lcars/bg_right.png new file mode 100644 index 0000000000000000000000000000000000000000..6e23a5d6ebc0687268a27c368507b63ed435d2b1 GIT binary patch literal 791 zcmV+y1L*vTP)u=77?@_KC=}5|wjz5wZD`KUTKmqT@jSO- z-kr~UXW!lZ&hG38gr$UnEH1q+^tPY>YBwfF1q1-z;&TavrJU^?Epi-7rrce>jIfk% z@4qZ$}v#kR_%l%g*pk2wJWfKa{RR1o0sbG8+742wST<^BmN#~wcL6$zAz#zwJe zwO;f;mWML|KF(pKyFDn@PMq5hF&77_q&I<)#~8 z8Z8%)laqEF^M597uOAPETpL0t`Ei^l7Q~1VBSwrEvE5)XO;h$~j@VT2X39=C9tycC zDtpIOVTCIz&nzpOZff#WRQ9f`f{f|bsuR)ZcSkQi0RYp~>ioJs0qo+$B9j<1cYHN^ z-}~gUW0+}bo*KPx+pTq!PyOksV3`O)_;r29J$#f@X2b%wez;su&vbPqfc})@egR7% V)8R{}8ms^S002ovPDHLkV1jhMZOi}w literal 0 HcmV?d00001 diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 8ac1dfe14..96fe186c2 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -16,6 +16,9 @@ for (const key in saved_settings) { settings[key] = saved_settings[key] } let hrmValue = 0; +var stepsData = new Array(24).fill(0); +var hrmData = new Array(24).fill(0); + /* * Colors to use @@ -25,17 +28,29 @@ let cOrange = "#FF9900"; let cPurple = "#FF00DC"; let cWhite = "#FFFFFF"; +/* + * Position in lcars + */ +let lcarsViewPos = 0; +let drag; + /* * Requirements and globals */ const locale = require('locale'); -var backgroundImage = { +var bgLeft = { width : 27, height : 176, bpp : 3, transparent : 0, buffer : require("heatshrink").decompress(atob("AAUM2XLlgCCwAJBBAuy4EAmQIF5cggAIGlmwgYIG2XIF42wF4ImGF4ImHJoQmGJoQdJhZNHNY47CgRNGBIJZHHgRiGBIRQ/KH5QCAFCh/eX5Q/KAwdCAGVbtu27YCCoAJBkuWrNlAQRGCiwRDAQPQBIMJCIYCBsAJBgomEtu0WoQmEy1YBIMBHYttIwQ7FyxQ/KHFlFAQ7F2weCHYplKChRTCCg5TCHw5TMAD0GzVp0wCCBBGaBIMaBAtpwECBA2mwEJBAugDgMmCIwJBF5EABAtoeQQvGCYQdPJoI7LMQzTCLJKAGzAJBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A==")) } +var bgRight = { + width : 27, height : 176, bpp : 3, + transparent : 0, + buffer : require("heatshrink").decompress(atob("lmy5YCDBIUyBAmy5AJBhYUG2EAhgIFAQMAgQIGCgQABCg4ABEAwUNFI2AKZHAKZEgGRZTGOIUDQxJxGKH5Q/agwAnUP7y/KH4yGeVYAJrdt23bAQVABIMly1ZsoCCMgUWCIYCB6AJBhIRDAQNgBIMFEwlt2i1CEwmWrAJBgI7FtpGCHYuWKH5QxEwpQDlo7F0A7IqBZBEwo7BCIwCBJo53CJoxiCJpIAdgOmzVpAQR/CgAIEAQJ2CBAoCBBIMmCg1oD4QLGFQUCCjQ+CKYw+CKY4JCKYwoCGRMaGREJDoroCgwdFzBlLKH5QvAHih/eX5Q/KE4A8UP7y/KH5QGDpg7HJoxZCCIx3CJowmCF4yACJox/CgAA=")) +} + var iconEarth = { width : 50, height : 50, bpp : 3, buffer : require("heatshrink").decompress(atob("AFtx48ECBsDwU5k/yhARLjgjBjlzAQMQEZcIkOP/fn31IEZgCBnlz58cEpM4geugEgwU/8+WNZJHDuHHvgmBCQ8goEOnVgJoMnyV58mACItHI4X8uAFBuVHnnz4BuGxk4////Egz3IkmWvPgNw8f/prB//BghTC+AjE7848eMjNnzySBwUJkmf/BuGuPDAQIjBiPHhhTCSQnjMo0ITANJn44Dg8MuFBggCCiFBcAJ0Bv5xEh+ITo2OhHkyf/OIQdBWwVHhgjBNwUE+fP/5EEgePMoYLBhMgyVJk/+BQQdC688I4XxOIc8v//NAvr+QEBj/5NwKVBy1/QYUciPBhk1EAJrC+KeC489QYaMBgU/8BNB9+ChEjz1Jkn/QYMBDQIgCcYTCCiP/nlzJQmenMAgV4//uy/9wRaB/1J8iVCcAfHjt9TYYICnhKCgRKBw159/v//r927OIeeoASBDQccvv3791KYVDBYPLJQeCnPnz//AAP6ocEjEkXgMgJQtz79fLAP8KYkccAcJ8Gf/f/xu/cAMQ4eP5MlyQRCMolx40YsOGBAPfnnzU4KVDpKMBvz8Dh0/8me7IICgkxJQXPIgZTD58sEgcJk+eNoONnFBhk4/5uB/pcDg5KD+4mEv4CBXISVDhEn31/8/+mH7x//JQK5CAAMB4JBCnnxJQf/+fJEgkAa4L+CAQOOjMn/1bXIRxDJQXx58f//Hhlz/88EgsChMgz/Zs/+nfkyV/8huDOI6SD498NwoACi1Z8+S/Plz17/+QCI7jC+ZxBmfPnojIAAMDcYWSp//2wRJEwq2GABECjMgNYwAmA=")) @@ -86,7 +101,7 @@ var iconNoBattery = { // Font to use: // -Graphics.prototype.setFontAntonioSmall = function(scale) { +Graphics.prototype.setFontAntonioMedium = function(scale) { // Actual height 20 (19 - 0) g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAA//mP/5gAAAAAAAAAAAAA/gAMAAAAAA/gAPAAAEIIBP+H/8D+IYBP+H/8D+IABCAAwIAfnwP8+PHh448eP3+B4fAAAAAAAH/AD/4AwGAMBgD/4Af8GAAPgAPgAfgAfAAfAA+AAOP/AH/4BgGAYBgH/4A/8AAAAAAAAAQAA/B+f4/+GMPhjv/4/h8Dg/gAcYwAAPwADgAAAAAAAAB//8///sAAaAACAAAMAAb//+f//AAAAAAAbAAGwAA4AA/wADgABsAAbAAAAAAAgAAMAAPwAD8AAMAADAAAAAAAAAAHAAB/AAOAAAAAAAAMAADAAAwAAMAACAAAAAAAAAABgAAYAAAAAAAAA4AD+AP+A/4A/gAOAAAAAAAAAH//j//8wADMAAz//8f/+AAAAAAAMAADAABgAA//+P//gAAAAAAAAAAAAAfgfP4fzAfswfDP/gx/gMAAAHgPj4D8wMDMHAz//8f3+AAEAAAAADwAH8APzA/AwP//j//4AAwAAAD/Hw/x+MwBjOAYz/+Mf/AAAAAAAH//j//8wYDMGAz9/8fP+AAcDAAAwAAMAfjB/4z/wP+AD4AAwAAAAOB/f4///MHAzBwM///H9/gAAAAAAH/Pj/78wGDMBgz//8f/+AAAAAAADhwA4cAAAAAAAAAAAAAADh/A4fgAAAAOAAHwABsAA7gAccAGDAAAAANgADYAA2AANgADYAA2AAAAAAAABgwAccADuAAbAAHwAA4AAAAHwAD8c4/POMHAD/wAfwAAAAAAAAD/wD//B4B4Y/HMf8zMBMyATMwczP+M4BzHwcgf+AA+AAAAAAD4A/+P/8D+DA/4wH/+AB/4AAeAAAAAAA//+P//jBgYwYGP//j//4PH4AAAAAAAf/+P//zgAcwADP4fz+P4Ph8AAAAAAA//+P//jAAYwAGPADj//4P/4AAAAAAA//+P//jBgYwYGMGBgAAAAAAP//j//4wYAMGADBgAAAAAAAA//w///PAHzAQM4MHP7/x+/8AAAAAAD//4//+AGAABgAAYAP//j//4AAAAAAAAAA//+P//gAAAAAAAAAAAHwAB+AABgAAY//+P//AAAAAAAAAAD//4//+APgAf+Afj8PgPjAAYAAAAAAD//4//+AABgAAYAAGAAAAAAA//+P//j/gAD/wAB/gAP4B/4P/AD//4//+AAAAAAAAAAP//j//4P4AAfwAA/g//+P//gAAAAAAAAAA//g//+PAHjAAY4AOP//h//wAAAAAAD//4//+MDADAwA4cAP/AB/gAAAAAAAA//g//+PAHjAAc4APv//5//yAAAAAAD//4//+MGADBgA48AP//h+f4AAAAAAB+Pw/z+MOBjBwY/P+Hx/AAHgwAAMAAD//4//+MAADAAAAAAP//D//4AAOAABgAA4//+P//AAAAwAAP8AD//AA/+AAfgP/4//gPwAAAAA+AAP/4Af/4AD+A//j/wA/wAD/+AA/4B/+P/+D+AAAAAMADj8P4P/4A/4B//w+A+MABgAAA4AAPwAB/gAB/+A//j/gA+AAMAAAAAYwB+MH/jf+Y/8GPwBjAAAAAAP//7//+wABsAAYAAAAAAPAAD/gAH/gAD/gAD4AACAAADAAGwABv//7//+AAAA=="), 32, atob("BQUHCAgVCQQFBQkHBQcFBwgICAgICAgICAgFBQcHBwgPCQkJCQcHCQoFCQkHDQoJCQkJCAYJCQ0ICAcGBwY="), 20+(scale<<8)+(1<<16)); } @@ -146,9 +161,9 @@ function drawHoriztonatlBgLine(color, x1, x2, y, h){ function drawLock(){ - g.setFontAntonioSmall(); + g.setFontAntonioMedium(); g.setColor(cOrange); - g.clearRect(120, 10, g.getWidth(), 80); + g.clearRect(120, 10, g.getWidth(), 75); g.drawString("LCARS", 130, 15); g.drawString("B-JS2", 130, 35); if(Bangle.isLocked()){ @@ -174,7 +189,7 @@ function drawState(){ // Alarm within symbol g.setFontAlign(-1, -1, 0); - g.setFontAntonioSmall(); + g.setFontAntonioMedium(); g.drawString("STATUS", 123, 97); if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); @@ -183,23 +198,16 @@ function drawState(){ } } -function draw(){ - - // First handle alarm to show this correctly afterwards - handleAlarm(); - - // Next draw the watch face - g.reset(); - g.clearRect(0, 0, g.getWidth(), g.getHeight()); +function drawPosition0(){ // Draw background image - g.drawImage(backgroundImage, 0, 0); - drawHoriztonatlBgLine(cBlue, 35, 120, 0, 4); + g.drawImage(bgLeft, 0, 0); + drawHoriztonatlBgLine(cBlue, 25, 120, 0, 4); drawHoriztonatlBgLine(cBlue, 130, 176, 0, 4); - drawHoriztonatlBgLine(cPurple, 35, 110, 81, 3); - drawHoriztonatlBgLine(cPurple, 120, 176, 81, 3); - drawHoriztonatlBgLine(cOrange, 35, 110, 87, 3); - drawHoriztonatlBgLine(cOrange, 120, 176, 87, 3); + drawHoriztonatlBgLine(cPurple, 20, 70, 80, 4); + drawHoriztonatlBgLine(cPurple, 80, 176, 80, 4); + drawHoriztonatlBgLine(cOrange, 35, 110, 87, 4); + drawHoriztonatlBgLine(cOrange, 120, 176, 87, 4); drawHoriztonatlBgLine(cOrange, 20, 176, 171, 5); // Draw logo @@ -214,7 +222,7 @@ function draw(){ // Write date g.setColor(cWhite); - g.setFontAntonioSmall(); + g.setFontAntonioMedium(); var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); @@ -228,6 +236,65 @@ function draw(){ // Draw state drawState(); +} + +function drawPosition1(){ + // Draw background image + g.drawImage(bgRight, 149, 0); + drawHoriztonatlBgLine(cBlue, 0, 140, 0, 4); + drawHoriztonatlBgLine(cPurple, 0, 80, 80, 4); + drawHoriztonatlBgLine(cPurple, 90, 150, 80, 4); + drawHoriztonatlBgLine(cOrange, 0, 50, 87, 4); + drawHoriztonatlBgLine(cOrange, 60, 140, 87, 4); + drawHoriztonatlBgLine(cOrange, 0, 150, 171, 5); + + // Draw steps bars + g.setColor(cWhite); + + // HRM + require("graph").drawBar(g, hrmData, { + axes : true, + gridx : 4, + gridy : 50, + width : 140, + height : 50, + x: 5, + y: 25 + }); + + // Steps + require("graph").drawBar(g, stepsData, { + axes : true, + gridx : 4, + gridy : 2500, + width : 140, + height : 50, + x: 5, + y: 115 + }); + + g.setFontAntonioMedium(); + g.drawString("HRM", 123, 7); + g.drawString("STEPS", 116, 94); +} + +function draw(){ + // First handle alarm to show this correctly afterwards + handleAlarm(); + + // Handle steps for graph data + handleSteps(); + + // Next draw the watch face + g.reset(); + g.clearRect(0, 0, g.getWidth(), g.getHeight()); + + // Draw current lcars position + if(lcarsViewPos == 0){ + drawPosition0(); + } else if (lcarsViewPos == 1) { + drawPosition1(); + } // Queue draw in one minute queueDraw(); @@ -240,7 +307,7 @@ function draw(){ function getSteps() { if (stepsWidget() !== undefined) return stepsWidget().getSteps(); - return "???"; + return 0; } function stepsWidget() { @@ -252,6 +319,15 @@ function stepsWidget() { return undefined; } +function handleSteps(){ + var current_h = (new Date()).getHours(); + if(current_h == 0){ + stepsData[current_h] = getSteps(); + } else { + stepsData[current_h] = getSteps() - stepsData[current_h-1]; + } +} + /* * Handle alarm @@ -315,19 +391,68 @@ Bangle.on('charging',function(charging) { }); Bangle.on('HRM', function (hrm) { + var current_h = (new Date()).getHours(); + hrmValue = hrm.bpm; + hrmData[current_h] = (hrmData[current_h] + hrmValue) / 2 }); -Bangle.on('swipe',function(dir) { - // Increase alarm - if(dir == -1){ - if(isAlarmEnabled()){ - settings.alarm += 5; - } else { - settings.alarm = getCurrentTimeInMinutes() + 5; - } + +function increaseAlarm(){ + if(isAlarmEnabled()){ + settings.alarm += 5; + } else { + settings.alarm = getCurrentTimeInMinutes() + 5; } + Storage.writeJSON(SETTINGS_FILE, settings); +} + + +function decreaseAlarm(){ + if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ + settings.alarm -= 5; + } else { + settings.alarm = -1; + } + + Storage.writeJSON(SETTINGS_FILE, settings); +} + + +// Thanks to the app "gbmusic" for this code to detect swipes in all 4 directions. +Bangle.on("drag", e => { + if (!drag) { // start dragging + drag = {x: e.x, y: e.y}; + } else if (!e.b) { // released + const dx = e.x-drag.x, dy = e.y-drag.y; + drag = null; + + // Horizontal swipe + if (Math.abs(dx)>Math.abs(dy)+10) { + if(dx > 0){ + lcarsViewPos = 0; + } else { + lcarsViewPos = 1; + } + + // Vertical swipe + } else if (Math.abs(dy)>Math.abs(dx)+10) { + if(dy > 0){ + decreaseAlarm(); + } else { + increaseAlarm(); + } + } + + draw(); + } +}); + + +/*Bangle.on('swipe',function(dir) { + + // Decrease alarm if(dir == +1){ if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ @@ -342,7 +467,7 @@ Bangle.on('swipe',function(dir) { // Update alarm state Storage.writeJSON(SETTINGS_FILE, settings); -}); +});*/ /* * Lets start widgets, listen for btn etc. diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 768c4a172e33f1cc478bc14a13400688af7bbbb2..98bf50546ab06532dbee2dcb58524a138c9ed9f2 100644 GIT binary patch delta 4809 zcmV;)5;pCVD9t61FnH$Bd_d_vu;yz)$0y)tgj4fGM+x5f=FS_jo+wR_)2WBb<2WI{*GX=@(iE0CC{dxOc|V zkiI7a4>5aI8fAfG;3!LGIYTUv3_Qf_S!t97l7XWvndJ*gUIhXsnrGA->NS(n)_MFUHqqB6qE!0#%*w0AOa<*6e85LxD> z0Q_EnX@43x8JIBQlMPz{f#yNeS?p9lk17)>2T9{;yOvhdng|1Xq7;Y*)}jylqWlV{ z(OR5@=0VeWKoC_XQVx>F({>fW4hCiyfmMD~BTFGSDL<`uXcVF}ro~BUp6GOux*BO4 zk|qqm4h?KYG0-SQIm&B=?v{%KqmGSEw={qQ8Gra?r`M(i7p1VY^iFPNl_zXwBm=)K zg#ujyu*8Di9XOia)2?17_GsV=S9`Tc^uPmZ3UY2|@ANn@ubqAm;#i?B)Una&ya0Zt zm->RV4N21r+>ey|WlYM18gnA?TW*k8`LylnWZ;7tcq#xpG_bZaN8hp3HZ2O1*YRYD z$$z=11b;J6)Q|?tX<->OPjtE#29`jKv<*oEn%PW-oQ04WSUcmOfs@n9NXV{qCIM`^ z^)~?rsv4vy=#X?snuad0Sv(q8Vqj@onZ|vQg&nfcO8_@`9|09j!|C9bax_WO(3P(& z+$k`Gad!|gM=@I#cD~bS$n~ndmND`pj(?;@pn1@Ao-QI~o|(qeb}g;8lV*WRk{{Lr zjnlxjtkB}b+hCq`Cyvvitt{690E=N~1h8cX>!6O6|A^<)Mj=`kQ%6q0wS!g!@DTv) zEpsUbMvY;`n9*|7=@>Z183po)_Rdr9r@iq(QcQ zk#hFM^;^(#r_qobfR;WF%mJx~SrIVpjsY|~TAnos(Q-V%lG0k+#ojus?PU$bbPz}{ zcuuW>E$5?b=}CvCMS*Aa0WHT1E_T8DW=wC0%eqU=x+6`yJk*jgOYOuZ1Aq6y7>Pn4 zn-HIwN`Awmjy6b4Y=QS##_brm=k=cDB?Qr|=&S9bBvCXl5+XzDza0Zd?7|__x+M+J z!GP4&$Ge~02m@<%wH%#9?vK!}Ctr$zw<)C(R7W{q+PW@vd+N2)TF;}vTjVeI`VVqL zj+P&}$WOXs&AMBEDF#NI8GpgR(n3zF-y>bDenjdr9Lcoq zJVQQHpnY@W5^p897(4TaqZX08krjXnwSxGXoQC`z;xm)8byaayA27ZAKlwT7SAF7`W)u7G|1-ffK;| z&>PCY(!$6Cs(PW50A7t>?fwj5V7lU_+HzI^OJTxi|BywTmOmNzLJVA*Vui5~UCMRK zT5MTh@PbX#!;-wQW(&zSTtvp^sdZBfV_*%$9tN)2t(Ft0%e1;^8R)=3A|x7sHSi{Y zzr8Y414o3>j(-3!l{nskkpM>Nqd(mc29~C1Et-JDNWDNq+02^m5$%e~5{rG&Hupng zjuI}#z^wqb7KNHCymG~Is|0p0fHk?|8BkVxXMer~178Keo`sjCy%WIL(7H4OQ${Yo zbJHj?^>QYOWZ(oa2D->pLm60F<<~&4(j0M|5}od8+kcSAg6AxRetwu8+6j3Y&pi+($7fNyHZ(082CyCuvo4h`wGD1J|TL~yyJJzyK!fCIO|)> z0{d(Ak$)__>9%}Bc`c+|v^QV(LcBm6$HY-@JC7;{nMq#nR;S%Y;pXRJlV~Qs=)i@V zh0G#pFUXXKB@%DuNoGOd`{LeY;BhmMd9~D?83uvyo$YfNtvU)e0qiI%lcohuw?G2; zbdzU=krqe*M_Mz>I^6;=fTe5SJrN}Bo492uHw?z|OO zjjnI?!C=|*4x}K5(GD277Gp@CV7fcgO8vL&c}oU95=0hbBm?_4LM?mVj)5b=ix~HG z#h(=}XMyT4Puzx5f_FKbT((2+B%X%mqrdr?y;GhLtGH;^oYzzEtuVVzAphQ;1 zXMcAv>s#9buXo~-f!Fr(!o3^9z}DNl#oow8A=Ed>+rx-IwYw>v`MHnH)PLvtz&)qw zqS~+ZQF=St@=L2fkjrCUF>CqLYf^uPFtBAP#QA6$2w1r^2!O3NSkLQv&${bDYm?Pp z4PZ#QE%!ZJ19~U}YoE+QN90+KuiJxO3xDgm;peP=AZ?P`f-t0)ZBbiZl7SPzFSncp zUStqz?YSm^2Sgzx7N8n2(qOGpLet|Gn_16C>fe?-+9Lg7*#;fdLpAVG42*W(18QVy zY;lS$g+%XJ*U&PwSS0; z?1wiZ!nLi(ALuM>^?4`*)5b}w)Y^E+C%LRnd!I}7TL49$7cg1rz3rCLYxa~haNRbq zKTwjf+Qs!}XcQs={EB<_uEbk_-2=j&yq50wf_NwcYZ@43qa*Y#1%yw%DH2#b*InTWoI6Mw~{oj3`aLTxSpLrYT-+2U=6@6dM(1?$l&n;*wT+^d7l1R
Dt*ApQ z5T6g=3&nv8NHilL0QNZ4N~?j$ViBoqbo#v-fF*5@>RswzWX)qsh=CfII#^raaLge6 z%>t$8c{G5L@+7->+HDOUtqycxdf8T!AkwUR>C`J@JQ=t-Q5;Q0C$@(3m9pE1n@}fXWiWvNC0=6 zFbf!IfdueK>u25F78tS<*WKzYAT98=z>u>LY5lZ7lm&({uoOSlc4W9`(gh>MKu9ng zF{X961UdA>wP}Vp^0SRkJGTCd*ta#!5C-;w^x3&$K-y6Yz$I_1fqzQARsgs5wYR-T z<=<~1lR#bW=zctX_PR14ibS|R4Pjtps}kL3rvS6wbZ&KQFMzpo9*7-U+Z&Oum2s_n z5pCONvn!nkMo%^MybarGygLF|vz2roB+Wy?+-iR*-?9w+>~IvrSvpmFuC*bmebJyW zWkRPWj+7NcHL&OXFn9y5n?zFwW z0Q>#@i>)11et#P6K-+mK2EHnQC22y#Yuw_J11gnI*4x;qGh5SDSbSmXWX4Sf2CwOF zW#AqFOYA!v1Aj#wYUTtOxbEu@^Md)M!FekNZe=KmF)hhK9XH}89<9&f=K))H+9-3E z-z`R`ns^{49JNOLBDBds}USv?HAAIz!1Teg>f z;>?uM4Q-5=GXacP>4s^3K+R11n_0Ls4kZvl-hb%WBQD?>3dHOQV8lu{Nz=l_KMYK5 z#cVrEXCGS5L<|8ix?^RvagG)`-6a?CmgYEZTI!Mf9=E zWqpou*MGc1HE8#lTd%)zaoj0G?6y z4szz8&F3v-UrXwHCTRH{+3+>vJqCU!?te%CBfz$%`&9ufYF+Ex?$?W)W%=~}w=gbc z;vzvDw_AFK#ZnqrTHH})Y-M20uxObc=bVvNym?32WN2;|38~RjZWf_jP6M+IV!pde z({apQ(s0_ib!z7pERvCD1TbadVnaC^QC%wqYTnu}Xq3Y3GzwPEn0L~^5}4}g9|j!V)CfHPOWUv%16vFY zJK&x0?f|y5YwL5bAGGw#GO%<2$74KhBZEdt=xTk&MI2(2FD53MmLA~wl7A7MQ3k7R zLm1d<)Rmrdp}8xy@65JbfpLE&#N(;F-y0*H|MuLpeWoL_u5~Ps47`pnZ`qR}8u*r$ z&Q2d@uvjw?a?ry0rqok3E~O8mredYm>CJ; zC`Qk6VrIrw?f7#qM1nX@PC~5;nk)5-z1So{oFKjuNVNcidNWT{bYd1`WIN}REAZ7) j3Fi5n8xb14`k?*~5mv6K=tf)E00000NkvXXu0mjfVF)RR delta 5138 zcmV+t6z%KHC6g$SFn<%xNklJn;uIc@aUni0pJPBw3_Zp1G1iktltkmV0Ow;?L7`Q8lG=C=WW_$;?=Mmu7^!^kE z?h4-bGzS!^`Q!0DG>~cF>q5AKH-H)_8>4|8zyaPd+Kyh_HSqfP_xI-)MF;b`TPPY7 zHSpT1Oxl(Gg=$0fk!d$ zJE6k;dA-)pkbm4={=wMYx?6^UOXFDqCmBB}*4id#5TviNuGF`sJ+Cp$09%hfmto)* z0FMTMr9WiySljCb;%)tUA4+2utMonJHzKIgbw$;jT30xFdDDYBXFUys~=Gw_Yih_K1A%7soqsDJx;Jj`R0C=^Dwu6>y1vA3HiBWSV z%|VJXaL&wSzuLd^aSmtT-T4E*Wx|kIbdqxcZm;`phgu5(WigPXJqFu#}acgSLZ~!(hsnvM?|i8)QB- znx#lbd9~EtBlEzhVG#yK+u8$_>y|Z|HOUQ+wts_`YX-0*1Lpx9m8HN0@%R7l#hz!Z>dS5)swcTAJ4!m1DJA05CHdJUy2FO?#_P3fy*9n+rQ;@GnJ~- z@_)WkK&Lz{r7b!>-%*g&1aWBFXgSUY)-+)`3(3G6<{ZWqN`)_kpQ%x*DiB z_d^TNINw`4Q*i{ycixGUz}I{E)fmWD zo`f~4&uVpsp9iKCfEpWB-U^0C$E20hzN0#MYPm-;@CrspW$<)GT0x3l8$$ch0)IQp z-ML4eg&4u+sIkg&2!N3?Xx5`v&T}A1|3*fwuPbd@ln+W$dExTSK1z;9G4KkmgOnO8 zeemS~{7DHQ`B!AZ)NC75S&60Y#PwuN6cC8=TgxD_AZ2DSuy$<-)lJQ|@jhO9+xpQA zyb}AOpj!^W!N7Ii5^BhvX)}uqT7TemTL3f6Cp~t8dv$bLEh2UrQg74~)D3B%Lcxay%jr>|tO_8%SBNGANr{fW-p1xDqd2_d)v8wwDoR z*Y3tWA`5|lMN_z?4Wz7BnV|qqDS&jui+JOVIuoJ2rKY`+hFlcozu%uoO? zl7&e2(%gqF_PG0LGz2IJfGuT^KD{y(Ljl~Fg+TJRT%cG!VuFBo2XHX31-n~WE$e{* z{9qa7ioT^S^FWFUD7ad(7=OqMKe>CMt?7?sV9AhPM=CiGbA4Ox#A!hE8bjF+3NEV; zjpTu)3!|bvpUA)?0AK;I^=*g|6Oig-6$VD#hsXNBBLFP95@r7yV|q;nZQR;-?b?t> zedNfdmc7X3@biHierC4C&$Adm4O|11W~ltT)W5YK&$cXMIQ;Q#R)1cPR05BV9^D~# z*-8+jKSMytvBa(98f8bF=W4*R5(I#si-VsSSpfJa%>3Lz27sSyTl2`In-9r7)~@+z zXC;tB?iRrVz!q&iysQ@eYrd)WJ)Z<#*Op#?`vne{Kd**Ngo^;tNRtL61}+cQPzP8&eeX8cm5w^^i6# zWl)(k9UN)2;w;3;URjEb10S-JmroMpw3#OR6b44m67&XeE{FD{>06N+V5D(rW2Poe zG9D+JCXZ(P@;k!7$hNTL9^@dm?6`4bnZm#&>uLYajhl={fq#!<(~F_N12kn{8epVx zw2blHZ_8#63S`L#uDK#FxfySeYd$w3_f!Vv0D`y&9stgPVP$(txg!9~$&46VD>IUT zsV7`D`Ka$d$-tB^zB+(4nQM%HU761BF;G6RROco1Z%CTA9k|_WN z^1v1!__0|CiK#e-K_dLrZVk{p^1#x>v;bHF@0}Q!%761l9{586IUtbTD{eXEmhzUo zE0W@qT!?7^1{m0~EvzwcN=US1BbLfSNWs`h1}?#_`K#KBLa`U=ED60M>#+Nh#hwum((RcMq8?NEs^-b{)#siL}#ZmIFVxK8^NN z09yhtX@BBSnHh@ZdoeKeJ8}7PZ~0#HTgjHmw=@HnjGP-*n*^v5JQ?`z07i8tu4oDA z#KV9d?U!v#^?@(K6agAFU}*`iSz3Dlm|{jG3xUdymg@nS)!LlGz@^VhEty&t00ADN zY;7q&1q@1lnUa}WMYuMl`XgKjL|?0wnZm%UDSv^IrzSP00Z?mGtA7W*jh4}sf!{Yf z;#$#Y6aIF8o2&h|9nSRm69D$nW3+;4AOo=5E7x(g6VrW^a?rqWt=^M`x4|mZ~ zLes$MU5FjTeoS26cDCGF)&!65p@E$!ca$A}yqWlvGE!K%XWvgWH?qn-U8n5JJUgm= z8Gl)0;NB~M_jqQvr|C0UaJHO1`&XZq@|?jMV|e!UM8+-0r0H`9uwRC0MV+buUQy_f zDKwBY5C9G=+*$(x;9Hw7gogpl9cH$~dD>k|?gv0RX7+l<7d4)X+fYn2%F=4s$_oHD>W&jitPiw1T8I|XdvHnf-`>eguB zwOz+>Izfp<#Wg}kozMWMf&ETgFmNE`rW%;S!07E;m9?17S)Hffj5LU4vHmF5LjX}LuKRf0of zJ8OB(nCN#6#9GiL)z|8xlLU3Are+}|V5|UOG!sIl{ixqGMgeVKep<$qd0*iu)^ zx@eQ@HdzSG*qS10j9S*AmQBttr4+B#*T&d$btxyO^qYKCps59V*7nfJbp`N3K5z~W z&A1~0j4&d{99-m%EVVrVjOevRHl!{xA<(f;^?{|03`Egf3JM*(#?n?9ELj7@&|c%9 z*v+DQ1aOFNi~RDcwz+i+27l(3UJ4)x5Hz4_0i4FbR-kEYt@T$k9u8oV>qCJ_id!s% zqLBmY3opsQ5`aq(&jv86Xo&?iaG?=70&EUAi2KI1U*qrk0eC?lSOO&iV8oDG8HAan zKuBsI4S=l7u8m1@1rPvpd3qGUsSiZAC^1ZBU~V}=4a_ZBh#`?O8h=aF^e=&uTX}jg zu;dCLjTKn(@aJfI&=(?9@tn5v_r9vTP$_t0vz zIZOiq;9;tcj(TWdN`D@>$3UXZ-_*dAJn(O-I!4_?1Jf9o%dbj#Rq9*oP7bP6ZF5CS zzL#60mh&E{jJ?XeWlab4YyR#f*Sp;*3~UAICg|&Rc_$+M|NCzV5Usme+`hbJ6XVVR z&H;G5LdJnQ{rv0aH#`#fdx3Zg10!3N(t#f2G9h{xL{hB8_<#ANL5@En^7J^o(*m4U z=H=?Q$W+#y%D|H0TLDY~%&NFt21Fk8pbobptOj6lax*^*U)Cu>Y_)+_{;>>fWk^j? zEdbWeQ6yO!@ zX_HC&K9zybRj>Kch%PL0jw+kG8RbusLQMQ|Lt5pX z!oVdcC|0TkFr^TWWtn40&A+`9fLXVpGXuBy#M2m91Aj5%b5cvZ#D*=i9i32;+oMea zkBQbYMoZn&ElT6Q27p&LFPy;UF18aUblJDk%J5;{W4?*#ES3InggA|7&-e(uVCEHYjSWT$KalYRKs z`}FeK_vg4jTo%KcjhNyCBZ`bN<1~HN|S%r?=1endZxN9?hsdH&d{-AKIZ(5s;NcEU(!X?jq$vf|R9LS$| z7Xs1J50trVBNrf~0xec8ub1fmda5%3?5WM0w$;MG$HAO5c4B*&-Pz+9+TczEfNu)A z-eO-sO$2V64AdEil!$oWB+o#4WNg4Q6o1GV1Hg!uexytd6JHqk5@mf4{AgK+nlll@ z0nD8bDBpdMUhmd+=iWNBM8X-QW~wQXr{dgSd|HZe9kkA9(j z6o9=zjLMrEfjX!|eXj*XuX+{+J|9Xaj!NckgqqFxUKGvq&&W8Z<$WKwFiJ#J36WRqBJ9(+=hN)8pZ5UT=XqR&iGM9)eGCJW z5h{8j1k@NcIjrst*wwINR_0@G7@H)%x)-MES>YwK5M_!A0ZFL& z!rl0+kQUeTLR2eeA-nEw)V0KBC9)kf^vpvUsCoOm zR{+05xa5*F{%vtNr66uq0CQ(BPzLT9VAetRT8ldR*xWX;snOi#r-9{t;M}j&K+i6Z z4Lfrj=vrKg)fo8eE&w}lEb?~tLm1Z@I7(n&)(57R?pgr1%=TXbFn^_|+`WMH$ZRwB z@cox%V8o{!5yVOUv$RVmO~6$dxCAKT8(SFHlX;Jo`EOAlcr^fDf(Pbz>vC{v8yzsC zEl}{p#Dz~=W*1JNHXO{U8Rj$wt`T-d9Sww1j=E&wyD+a5OU!263z5uX;2B_yKA)$7 zVBqK3^ruENEer8eT7QngcGEyQTYNd*S+lv(vL)DUgwgP$HLwGCi#BXWC%N(g;z#3U zxxpRh+5*JO*(L-6G;lhY=?P*lMvr!UR>r65@$xQ2fY{HSdMapE8W;JnNq{&&yb?&I zgo5}o&lcS^9Px^@RCr$Po$GqzC=f*L_kU>ZhrMJ70ZBkLH=X?0*_l{PQ+-rwp^M+I*Kxd# z*X#9uz4#LyZgKGW(Am!+V(DrehwX73w~_{OcJd#Sy8!Drv|63)FmD`~BTw;>x0?gU zwfVc_;J_SND%`TO1OKYg@3H+s;i9ME*C72{^M%BX-9yuiO&Z-Or?YV;p#v z%5Rd#6acddu?bBBreV=SIOh%H(gP1D>{EuU1^8?kEd7(@L_UmW-;xasFP1;DIA z=nMOlh*JQJ13v{f{XC}t7zfrD_9+pq01kU(zjT%w>!ULc{1n{u^Xvg|ydE5`FMnsm z-DvvCJ|yB40OP<9p>5k~4szhnDpa`T;tpE;O zEgc(9p#Tm%MHxtf0suTg5lEq40RXPo zjx8rp0Dvbb0x8rh0KoOyvE>8`0PqAwcv=dF`-%b44*-jVB+PvUzWBQTdi?7D1mOF+ z^GT5cIIu`a!i-S>2Ogt4qly&3fki?RW{d(j@EF}0Ripq8EE1A1V-&!F$LP+eA_Z_@ zk&uKLqW}&(Mt4RPDbU4%{g*S*<#!}{+I`V}r+?{!b zpGoDW)S)yV|M@Nse3e|-R;XaJh#B^iisI#fZH*nrZH*U$>}q7C?-eWY@27BJ3o$HW z{_OR_6S&+tLTMrY6gJ3F}x%GK2l9Ip^qIHfA*vy*Y9zNH{f z;lNf)Jyvm5pvB9J@!v~}86F|xowqgTRBo*?Yv=c?r5W`^h9Y@lJX?Wp`%wP`M*Jj4 z(GwZZmY&%w6wvm+@1I>kksC2k;8X!+@9Uh{;fn(UT^9wE&g&BXqWgNizpq%+_9ah? z_m%SeN9{h!KGLpUpHp&a&+DD{=Y;ooxtF!_)1rWPgR>ZF2WrW8&SF#@c_Irz_ELVAmv_q5(1fW)|4aX#>u`zL*&5DegPPO ze-t=-7sVamQ!i&p?GVa!VgLr<{s7~^8&W5n(j6zf!V%|=9#!z$P?yq1@RfcVH#KN8pC=u?$^0lg%Fl{-%w{T)dHMSEA`fX z|GCsV*l^%|nUl{f2XSo+5hs{?N#Oa;g9FP8y;HzmCvmZ6cgFP#5Xu{S=z({lH@G5J za?v5Rs&KUmaTnmfeKHQb8FJd`!n3f&yo3yu3e9Xaj%&9B6T?E@`@ws=JA zbT0%e5TLe#0!6n|rp{bfm?Sywt3Vdulmo}D#lEsIvsDy0T?h7)h}VTznH+iUuK*6b ze~q`EVQ~-4lG@fhEH^nEc)60DCw%8h*yt$_TL$}nX#f$h#8~|Sf zH2M=u0Q><=b5lD#@Mz-1<1YcQ2wt}n0I(RK(czW=7zZAW$-Lt)0Wc0cFF>O+TLNGl zcr+&Sj=u!JIPkmxjm~TdfN|i_n9Mu=5&&B}aO$a69`2kM+Ay;v0Je7E+*8S1$e17E zB>?W>z~R%VssEq9l+Vm?34pB~I9GZcc>bMY34nV!aQsvT00Xc>fo^xB<$7VoB#2?7 z01o`WuA$rVNRbU}7EzY~cw`Uk#^$LE3-mNGmjKwh2mb6J!Pkbe3Za3kN0cQ1wszq7 zWQ`W02YQ+@mH-$B))afkC`$lr?ZB)9uZ#8)0OP>x0%o205&&B}Fg>s}W_Iyc09ZMD z-V32rbAng^d{P81B~L);MG626!1GgjQKRtJyI*wTvHGQP{hK@vi~}!?GynrI02?dN z$(E{lHv_6Oc40#1a7axDtm04*Y`Or%Mi~~nK+BJVT+ibo&GrF z52RYeY{~TuV5?k9_gC|E;IsRIOOxgE&rqP`rlBrZ;!+O$j8ZU5YX!_5`0fNO4oQB; zDcPg%wq%tJNZvn^K26x~DIQX})5s_*;s?WV{ecK`dg1{iGt-9I&mi zQ$Xdw?|0#seGi*418<{%3SRd$_3n}SqQ~mD zQIUxZQ9upvXPNOhUdIo{9%uf1xvM Date: Sun, 19 Dec 2021 19:54:40 +0100 Subject: [PATCH 080/476] Minor fixes --- apps/lcars/lcars.app.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 96fe186c2..7afa05b7f 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -161,6 +161,10 @@ function drawHoriztonatlBgLine(color, x1, x2, y, h){ function drawLock(){ + if(lcarsViewPos != 0){ + return; + } + g.setFontAntonioMedium(); g.setColor(cOrange); g.clearRect(120, 10, g.getWidth(), 75); @@ -172,6 +176,10 @@ function drawLock(){ } function drawState(){ + if(lcarsViewPos != 0){ + return; + } + g.setColor(cWhite); var bat = E.getBattery(); var timeInMinutes = getCurrentTimeInMinutes(); @@ -438,6 +446,10 @@ Bangle.on("drag", e => { // Vertical swipe } else if (Math.abs(dy)>Math.abs(dx)+10) { + if(lcarsViewPos != 0){ + return; + } + if(dy > 0){ decreaseAlarm(); } else { From 75948ee04ade00344c7fe5a743ae5a559102ed14 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 19:56:34 +0100 Subject: [PATCH 081/476] Updated readme --- apps/lcars/README.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 31cb81341..d84ada29b 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -8,8 +8,18 @@ the [Pedometer widget](https://banglejs.com/apps/#pedometer%20widget). * LCARS Style watch face * Shows different states (charging, out of battery, GPS on etc.) * Shows customizable data (steps, HRM, battery, temperature etc.) - * Swipe left/right to activate an alarm - * Full-screen mode + * Change between multiple screens via swipe left/right. + * Display 24h graphs for steps + hrm. + * Swipe up/down to activate an alarm. + * Full-screen mode. + +## Screenshot of multiple screens +Access via swipe left/ right + +![](screenshot.png) +![](screenshot_2.png) + + ## Icons
Icons made by Smashicons, Freepik from www.flaticon.com
From bb05677ded21def2936304b601a95358dd3bf95b Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 19:57:55 +0100 Subject: [PATCH 082/476] Updated changelog --- apps/lcars/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index f30ae4707..c171ec3d4 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -5,4 +5,4 @@ 0.05: Additional icons for (1) charging and (2) bat < 30%. 0.06: Fix - Alarm disabled, if clock was closed. 0.07: Added settings to adjust data that is shown for each row. -0.08: Smaller background for faster rendering. Full screen mode. \ No newline at end of file +0.08: Support for multiple screens. 24h graph for steps + HRM. Fullscreen Mode. \ No newline at end of file From c2f3a4614501a3521fa9d954642092a275c0a58f Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 20:00:52 +0100 Subject: [PATCH 083/476] Minor change for HRM --- apps/lcars/lcars.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 7afa05b7f..6fa42f0c3 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -263,7 +263,7 @@ function drawPosition1(){ require("graph").drawBar(g, hrmData, { axes : true, gridx : 4, - gridy : 50, + gridy : 100, width : 140, height : 50, x: 5, From e1b8d8c6693825e7d8fe24df1fbe2d809ea0a0dd Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 20:07:28 +0100 Subject: [PATCH 084/476] Set data to zero at 00:00 --- apps/lcars/lcars.app.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 6fa42f0c3..123a8448e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -293,6 +293,13 @@ function draw(){ // Handle steps for graph data handleSteps(); + // Clear data + var current = new Date(); + if(current.getHours() == 0 && current.getMinutes() == 0){ + stepsData = new Array(24).fill(0); + hrmData = new Array(24).fill(0); + } + // Next draw the watch face g.reset(); g.clearRect(0, 0, g.getWidth(), g.getHeight()); From 6203407e1392e3e7b74e10200c4ea07eba59825b Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 20:09:49 +0100 Subject: [PATCH 085/476] Removed comments. --- apps/lcars/lcars.app.js | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 123a8448e..7815ff025 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -469,25 +469,6 @@ Bangle.on("drag", e => { }); -/*Bangle.on('swipe',function(dir) { - - - // Decrease alarm - if(dir == +1){ - if(isAlarmEnabled() && (settings.alarm-5 > getCurrentTimeInMinutes())){ - settings.alarm -= 5; - } else { - settings.alarm = -1; - } - } - - // Update UI - draw(); - - // Update alarm state - Storage.writeJSON(SETTINGS_FILE, settings); -});*/ - /* * Lets start widgets, listen for btn etc. */ From d34cdfbe136429d45e16f0ffbd3fce077b7a2994 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 20:56:52 +0100 Subject: [PATCH 086/476] Compute HRM hour average --- apps/lcars/lcars.app.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 7815ff025..8e6da3f88 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -15,10 +15,12 @@ let saved_settings = storage.readJSON(SETTINGS_FILE, 1) || settings; for (const key in saved_settings) { settings[key] = saved_settings[key] } -let hrmValue = 0; + var stepsData = new Array(24).fill(0); var hrmData = new Array(24).fill(0); - +let hrmValue = 0; +var hrmValueAvg = 0; +var hrmValueCount = 0; /* * Colors to use @@ -406,10 +408,17 @@ Bangle.on('charging',function(charging) { }); Bangle.on('HRM', function (hrm) { - var current_h = (new Date()).getHours(); + var current = new Date(); hrmValue = hrm.bpm; - hrmData[current_h] = (hrmData[current_h] + hrmValue) / 2 + hrmValueAvg += hrmValue; + hrmValueCount += 1; + hrmData[current_h.getHours()] = hrmValueAvg / hrmValueCount; + + if(current.getMinutes() == 0){ + hrmValueAvg = 0; + hrmValueCount = 0; + } }); From 2bc8c672e01645a6834cdd5e0e39e230723bb94f Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 21:09:26 +0100 Subject: [PATCH 087/476] Dynamically select y range of graphs --- apps/lcars/lcars.app.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 8e6da3f88..ae2927ae8 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -262,10 +262,13 @@ function drawPosition1(){ g.setColor(cWhite); // HRM + var maxHrm = Math.max.apply(Math, hrmData); + var gridy = (parseInt(maxHrm / 50)-1) * 50; + gridy = gridy <= 0 ? 50 : gridy; require("graph").drawBar(g, hrmData, { axes : true, gridx : 4, - gridy : 100, + gridy : gridy, width : 140, height : 50, x: 5, @@ -273,10 +276,13 @@ function drawPosition1(){ }); // Steps + var maxSteps = Math.max.apply(Math, stepsData); + var gridy = (parseInt(maxSteps / 1000)-1) * 1000; + gridy = gridy <= 0 ? 1000 : gridy; require("graph").drawBar(g, stepsData, { axes : true, gridx : 4, - gridy : 2500, + gridy : gridy, width : 140, height : 50, x: 5, @@ -284,8 +290,8 @@ function drawPosition1(){ }); g.setFontAntonioMedium(); - g.drawString("HRM", 123, 7); - g.drawString("STEPS", 116, 94); + g.drawString("HRM", 122, 9); + g.drawString("STEPS", 114, 96); } function draw(){ @@ -413,7 +419,7 @@ Bangle.on('HRM', function (hrm) { hrmValue = hrm.bpm; hrmValueAvg += hrmValue; hrmValueCount += 1; - hrmData[current_h.getHours()] = hrmValueAvg / hrmValueCount; + hrmData[current.getHours()] = hrmValueAvg / hrmValueCount; if(current.getMinutes() == 0){ hrmValueAvg = 0; From 4cc822cafb9be795a8f5484c581045e43a17a039 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 19 Dec 2021 20:59:30 +0000 Subject: [PATCH 088/476] ptlaunch: Improve pattern detection code readability by PaddeK --- apps.json | 2 +- apps/ptlaunch/ChangeLog | 3 +- apps/ptlaunch/README.md | 7 ++ apps/ptlaunch/app.js | 216 ++++++++-------------------------------- apps/ptlaunch/boot.js | 183 +++++++++------------------------- 5 files changed, 99 insertions(+), 312 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..125d8609e 100644 --- a/apps.json +++ b/apps.json @@ -4861,7 +4861,7 @@ "id": "ptlaunch", "name": "Pattern Launcher", "shortName": "Pattern Launcher", - "version": "0.11", + "version": "0.12", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", "screenshots": [{"url":"manage_patterns_light.png"}], diff --git a/apps/ptlaunch/ChangeLog b/apps/ptlaunch/ChangeLog index 23031cff3..8cfa77113 100644 --- a/apps/ptlaunch/ChangeLog +++ b/apps/ptlaunch/ChangeLog @@ -2,4 +2,5 @@ 0.02: Turn on lcd when launching an app if the lock screen was disabled in the settings 0.03: Make tap to confirm new pattern more reliable. Also allow for easier creation of single circle patterns. 0.10: Improve the management of existing patterns: Draw the linked pattern on the left hand side of the app name within a scroller, similar to the default launcher. Slighlty clean up the code to make it less horrible. -0.11: Respect theme colors. Fix: Do not pollute global space with internal variables ans functions in boot.js \ No newline at end of file +0.11: Respect theme colors. Fix: Do not pollute global space with internal variables ans functions in boot.js +0.12: Improve pattern detection code readability by PaddeK http://forum.espruino.com/profiles/117930/ \ No newline at end of file diff --git a/apps/ptlaunch/README.md b/apps/ptlaunch/README.md index 7cc39e3d6..c16110f94 100644 --- a/apps/ptlaunch/README.md +++ b/apps/ptlaunch/README.md @@ -58,3 +58,10 @@ Make sure the watch is unlocked before you start drawing. If this bothers you, y 3) I have done all that and still nothing happens! Please note that drawing on the clock screen will not visually show the pattern you drew. It will start the app as soon as the pattern was recognized - this might take 1 or 2 seconds! If still nothing happens, that might be a bug, sorry! + + +## Authors + +Initial creation: [crazysaem](https://github.com/crazysaem) + +Improve pattern detection code readability: [PaddeK](http://forum.espruino.com/profiles/117930/) diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 062cc3c62..5a2fcf228 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -114,7 +114,6 @@ var showMainMenu = () => { E.showMenu(mainmenu); }; -var positions = []; var recognizeAndDrawPattern = () => { return new Promise((resolve) => { E.showMenu(); @@ -137,148 +136,53 @@ var recognizeAndDrawPattern = () => { setWatch(() => finishHandler(), BTN); setTimeout(() => Bangle.on("tap", finishHandler), 250); - positions = []; + var positions = []; + var getPattern = (positions) => { + var circles = [ + { x: 25, y: 25, i: 0 }, + { x: 87, y: 25, i: 1 }, + { x: 150, y: 25, i: 2 }, + { x: 25, y: 87, i: 3 }, + { x: 87, y: 87, i: 4 }, + { x: 150, y: 87, i: 5 }, + { x: 25, y: 150, i: 6 }, + { x: 87, y: 150, i: 7 }, + { x: 150, y: 150, i: 8 }, + ]; + return positions.reduce((pattern, p, i, arr) => { + var idx = circles.findIndex((c) => { + var dx = p.x > c.x ? p.x - c.x : c.x - p.x; + if (dx > CIRCLE_RADIUS) { + return false; + } + var dy = p.y > c.y ? p.y - c.y : c.y - p.y; + if (dy > CIRCLE_RADIUS) { + return false; + } + if (dx + dy <= CIRCLE_RADIUS) { + return true; + } + return dx * dx + dy * dy <= CIRCLE_RADIUS_2; + }); + if (idx >= 0) { + pattern += circles[idx].i; + circles.splice(idx, 1); + } + if (circles.length === 0) { + arr.splice(1); + } + return pattern; + }, ""); + }; var dragHandler = (position) => { - log(position); positions.push(position); - - debounce().then(() => { - if (isFinished) { - return; - } - - // This might actually be a 'tap' event. - // Use this check in addition to the actual tap handler to make it more reliable - if (pattern.length > 0 && positions.length === 2) { - if ( - positions[0].x === positions[1].x && - positions[0].y === positions[1].y - ) { - finishHandler(); - positions = []; - return; - } - } - - E.showMessage("Calculating..."); - var t0 = Date.now(); - - log(positions.length); - - var circlesClone = cloneCirclesArray(); - pattern = []; - - var step = Math.floor(positions.length / 100) + 1; - - var p, a, b, circle; - - for (var i = 0; i < positions.length; i += step) { - p = positions[i]; - - circle = circlesClone[0]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(0, 1); - } - } - - circle = circlesClone[1]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(1, 1); - } - } - - circle = circlesClone[2]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(2, 1); - } - } - - circle = circlesClone[3]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(3, 1); - } - } - - circle = circlesClone[4]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(4, 1); - } - } - - circle = circlesClone[5]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(5, 1); - } - } - - circle = circlesClone[6]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(6, 1); - } - } - circle = circlesClone[7]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(7, 1); - } - } - - circle = circlesClone[8]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(8, 1); - } - } - } - var tx = Date.now(); - log(tx - t0); - positions = []; - var t1 = Date.now(); - log(t1 - t0); - - log("pattern:"); - log(pattern); - - log("redrawing"); + if (position.b === 0 || positions.length >= 200) { + pattern = getPattern(positions).split(""); g.clear(); drawCirclesWithPattern(pattern); - }); + positions = []; + } }; - Bangle.on("drag", dragHandler); }); }; @@ -461,18 +365,6 @@ var getStoredPatternsArray = () => { var CIRCLE_RADIUS = 25; var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; -var CIRCLES = [ - { x: 25, y: 25, i: 0 }, - { x: 87, y: 25, i: 1 }, - { x: 150, y: 25, i: 2 }, - { x: 25, y: 87, i: 3 }, - { x: 87, y: 87, i: 4 }, - { x: 150, y: 87, i: 5 }, - { x: 25, y: 150, i: 6 }, - { x: 87, y: 150, i: 7 }, - { x: 150, y: 150, i: 8 }, -]; - var drawCircle = (circle, drawBuffer, scale) => { if (!drawBuffer) { drawBuffer = g; @@ -563,16 +455,6 @@ var drawCirclesWithPattern = (pattern, options) => { g.drawImage(image, offset.x, offset.y); }; -var cloneCirclesArray = () => { - var circlesClone = Array(CIRCLES.length); - - for (var i = 0; i < CIRCLES.length; i++) { - circlesClone[i] = CIRCLES[i]; - } - - return circlesClone; -}; - ////// // misc lib functions ////// @@ -583,20 +465,6 @@ var log = (message) => { } }; -var debounceTimeoutId; -var debounce = (delay) => { - if (debounceTimeoutId) { - clearTimeout(debounceTimeoutId); - } - - return new Promise((resolve) => { - debounceTimeoutId = setTimeout(() => { - debounceTimeoutId = undefined; - resolve(); - }, delay || 500); - }); -}; - ////// // run main function ////// diff --git a/apps/ptlaunch/boot.js b/apps/ptlaunch/boot.js index 6fbd3ca41..19a8f16cb 100644 --- a/apps/ptlaunch/boot.js +++ b/apps/ptlaunch/boot.js @@ -5,131 +5,54 @@ console.log(JSON.stringify(message)); } }; - + var storedPatterns; + var CIRCLE_RADIUS = 25; + var CIRCLE_RADIUS_2 = Math.pow(CIRCLE_RADIUS, 2); var positions = []; + var getPattern = (positions) => { + var circles = [ + { x: 25, y: 25, i: 0 }, + { x: 87, y: 25, i: 1 }, + { x: 150, y: 25, i: 2 }, + { x: 25, y: 87, i: 3 }, + { x: 87, y: 87, i: 4 }, + { x: 150, y: 87, i: 5 }, + { x: 25, y: 150, i: 6 }, + { x: 87, y: 150, i: 7 }, + { x: 150, y: 150, i: 8 }, + ]; + return positions.reduce((pattern, p, i, arr) => { + var idx = circles.findIndex((c) => { + var dx = p.x > c.x ? p.x - c.x : c.x - p.x; + if (dx > CIRCLE_RADIUS) { + return false; + } + var dy = p.y > c.y ? p.y - c.y : c.y - p.y; + if (dy > CIRCLE_RADIUS) { + return false; + } + if (dx + dy <= CIRCLE_RADIUS) { + return true; + } + return dx * dx + dy * dy <= CIRCLE_RADIUS_2; + }); + if (idx >= 0) { + pattern += circles[idx].i; + circles.splice(idx, 1); + } + if (circles.length === 0) { + arr.splice(1); + } + return pattern; + }, ""); + }; var dragHandler = (position) => { positions.push(position); - - debounce().then(() => { - log(positions.length); - - var CIRCLE_RADIUS = 25; - var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; - - var circles = [ - { x: 25, y: 25, i: 0 }, - { x: 87, y: 25, i: 1 }, - { x: 150, y: 25, i: 2 }, - { x: 25, y: 87, i: 3 }, - { x: 87, y: 87, i: 4 }, - { x: 150, y: 87, i: 5 }, - { x: 25, y: 150, i: 6 }, - { x: 87, y: 150, i: 7 }, - { x: 150, y: 150, i: 8 }, - ]; - var pattern = []; - - var step = Math.floor(positions.length / 100) + 1; - - var p, a, b, circle; - - for (var i = 0; i < positions.length; i += step) { - p = positions[i]; - - circle = circles[0]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(0, 1); - } - } - - circle = circles[1]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(1, 1); - } - } - - circle = circles[2]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(2, 1); - } - } - - circle = circles[3]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(3, 1); - } - } - - circle = circles[4]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(4, 1); - } - } - - circle = circles[5]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(5, 1); - } - } - - circle = circles[6]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(6, 1); - } - } - circle = circles[7]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(7, 1); - } - } - - circle = circles[8]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(8, 1); - } - } - } - positions = []; - - pattern = pattern.join(""); - + if (position.b === 0 || positions.length >= 200) { + var pattern = getPattern(positions); + log(pattern); + if (pattern) { if (storedPatterns[pattern]) { var app = storedPatterns[pattern].app; @@ -139,27 +62,15 @@ Bangle.setLCDPower(true); } } - + Bangle.removeListener("drag", dragHandler); load(app.src); } } } - }); - }; - - var debounceTimeoutId; - var debounce = (delay) => { - if (debounceTimeoutId) { - clearTimeout(debounceTimeoutId); + + positions = []; } - - return new Promise((resolve) => { - debounceTimeoutId = setTimeout(() => { - debounceTimeoutId = undefined; - resolve(); - }, delay || 500); - }); }; var sui = Bangle.setUI; From 200f9e19b58c6691b8ba5cffe4a61c9ee7fedaeb Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sun, 19 Dec 2021 21:09:00 +0000 Subject: [PATCH 089/476] Pastel: added weather, change to queueDraw() update once per minute --- apps/pastel/pastel.app.js | 139 +++++++++++++++++++++++++++------ apps/pastel/pastel.settings.js | 13 ++- 2 files changed, 124 insertions(+), 28 deletions(-) diff --git a/apps/pastel/pastel.app.js b/apps/pastel/pastel.app.js index aa4f6abf8..e0c7df831 100644 --- a/apps/pastel/pastel.app.js +++ b/apps/pastel/pastel.app.js @@ -1,10 +1,22 @@ var SunCalc = require("https://raw.githubusercontent.com/mourner/suncalc/master/suncalc.js"); require("f_latosmall").add(Graphics); +const storage = require('Storage'); +const locale = require("locale"); const SETTINGS_FILE = "pastel.json"; const LOCATION_FILE = "mylocation.json"; let settings; let location; +// cloud, sun, partSun, snow, rain, storm, error +// create 1 bit, max contrast, brightness set to 85 +var cloudIcon = require("heatshrink").decompress(atob("kEggIfcj+AAYM/8ADBuFwAYPAmADCCAMBwEf8ADBhFwg4aBnEPAYMYjAVBhgDDDoQDHCYc4jwDB+EP///FYIDBMTgA==")); +var sunIcon = require("heatshrink").decompress(atob("kEggILIgOAAZkDAYPAgeBwPAgIFBBgPhw4TBp/yAYMcnADBnEcAYMwhgDBsEGgE/AYP8AYYLDCYgbDEYYrD8fHIwI7CIYZLDL54AHA==")); +var sunPartIcon = require("heatshrink").decompress(atob("kEggIHEmADJjEwsEAjkw8EAh0B4EAg35wEAgP+CYMDwv8AYMDBAP2g8HgH+g0DBYMMgPwAYX8gOMEwMG3kAg8OvgSBjg2BgcYGQIcBAY5CBg0Av//HAM///4MYgNBEIMOCoUMDoUAnBwGkEA")); +var snowIcon = require("heatshrink").decompress(atob("kEggITQj/AAYM98ADBsEwAYPAjADCj+AgOAj/gAYMIuEHwEAjEPAYQVChk4AYQhCAYcYBYQTDnEPgEB+EH///IAQACE4IAB8EICIPghwDB4EeBYNAjgDBg8EAYQYCg4bCgZuFA==")); +var rainIcon = require("heatshrink").decompress(atob("kEggIPMh+AAYM/8ADBuFwAYPgmADB4EbAYOAj/ggOAhnwg4aBnAeCjEcCIMMjADCDoQDHjAPCnAXCuEP///8EDAYJECAAXBwkAgPDhwDBwUMgEEhkggEOjFgFgMQLYQAOA==")); +var errIcon = require("heatshrink").decompress(atob("kEggILIgOAAYsD4ADBg/gAYMGsADBhkwAYsYjADCjgDBmEMAYNxxwDBsOGAYPBwYDEgOBwOAgYDB4EDHYPAgwDBsADDhgDBFIcwjAHBjE4AYMcmADBhhNCKIcG/4AGOw4A==")); + + function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; settings.grid = settings.grid||false; @@ -93,6 +105,50 @@ function prevInfo() { } } + +/** +Choose weather icon to display based on condition. +Based on function from the Bangle weather app so it should handle all of the conditions +sent from gadget bridge. +*/ +function chooseIcon(condition) { + condition = condition.toLowerCase(); + if (condition.includes("thunderstorm")) return stormIcon; + if (condition.includes("freezing")||condition.includes("snow")|| + condition.includes("sleet")) { + return snowIcon; + } + if (condition.includes("drizzle")|| + condition.includes("shower")) { + return rainIcon; + } + if (condition.includes("rain")) return rainIcon; + if (condition.includes("clear")) return sunIcon; + if (condition.includes("few clouds")) return partSunIcon; + if (condition.includes("scattered clouds")) return cloudIcon; + if (condition.includes("clouds")) return cloudIcon; + if (condition.includes("mist") || + condition.includes("smoke") || + condition.includes("haze") || + condition.includes("sand") || + condition.includes("dust") || + condition.includes("fog") || + condition.includes("ash") || + condition.includes("squalls") || + condition.includes("tornado")) { + return cloudIcon; + } + return cloudIcon; +} + +/** +Get weather stored in json file by weather app. +*/ +function getWeather() { + let jsonWeather = storage.readJSON('weather.json'); + return jsonWeather; +} + var mm_prev = "xx"; function draw() { @@ -114,7 +170,25 @@ function draw() { var h = g.getHeight(); var x = (g.getWidth()/2); var y = (g.getHeight()/3); - + + var weatherJson = getWeather(); + var w_temp; + var w_icon; + var w_wind; + + if (settings.weather && weatherJson && weatherJson.weather) { + var currentWeather = weatherJson.weather; + const temp = locale.temp(currentWeather.temp-273.15).match(/^(\D*\d*)(.*)$/); + w_temp = temp[1] + " " + temp[2]; + w_icon = chooseIcon(currentWeather.txt); + const wind = locale.speed(currentWeather.wind).match(/^(\D*\d*)(.*)$/); + w_wind = wind[1] + " " + wind[2] + " " + (currentWeather.wrose||'').toUpperCase(); + } else { + w_temp = "Err"; + w_wind = "???"; + w_icon = errIcon; + } + g.reset(); if (process.env.HWVERSION == 1) { @@ -139,6 +213,18 @@ function draw() { g.setColor(g.theme.fg); + // draw weather line + if (settings.weather) { + g.drawImage(w_icon, (w/2) - 40, 24); + g.setFontLatoSmall(); + g.setFontAlign(-1,0); // left aligned + if (drawCount % 2 == 0) + g.drawString(w_temp, (w/2) + 6, 24 + ((y - 24)/2)); + else + g.drawString( (w_wind.split(' ').slice(0, 2).join(' ')), (w/2) + 6, 24 + ((y - 24)/2)); + // display first 2 words of the wind string eg '4 mph' + } + if (settings.font == "Architect") g.setFontArchitect(); else if (settings.font == "GochiHand") @@ -161,36 +247,39 @@ function draw() { // for the colon g.setFontAlign(0,-1); // centre aligned - - if (d.getSeconds()&1) { - g.drawString(":", x,y); - } else { - // on bangle 1, we are not using clearRect(), hide : by printing over it in reverse color - if (process.env.HWVERSION == 1) { - g.setColor(g.theme.bg); - g.drawString(":", x,y); - g.setColor(g.theme.fg); - } - } - + g.drawString(":", x,y); g.setFontLatoSmall(); g.setFontAlign(0, -1); g.drawString((infoData[infoMode].calc()), w/2, h - 24 - 24); - if (drawCount % 3600 == 0) + // recalc sunrise / sunset every hour + if (drawCount % 60 == 0) updateSunRiseSunSet(new Date(), location.lat, location.lon); drawCount++; + queueDraw(); } -// Only update when display turns on -if (process.env.BOARD!="SMAQ3") // hack for Q3 which is always-on -Bangle.on('lcdPower', function(on) { - if (secondInterval) - clearInterval(secondInterval); - secondInterval = undefined; - if (on) - secondInterval = setInterval(draw, 1000); - draw(); +// 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; + nextInfo(); + 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; + } }); Bangle.setUI("clockupdown", btn=> { @@ -204,8 +293,6 @@ loadFonts(); loadLocation(); g.clear(); -var secondInterval = setInterval(draw, 1000); -draw(); - Bangle.loadWidgets(); Bangle.drawWidgets(); +draw(); diff --git a/apps/pastel/pastel.settings.js b/apps/pastel/pastel.settings.js index fad36964d..bf83fa7c2 100644 --- a/apps/pastel/pastel.settings.js +++ b/apps/pastel/pastel.settings.js @@ -4,6 +4,7 @@ // initialize with default settings... let s = { 'grid': false, + 'weather': false, 'font': "Lato" } @@ -39,8 +40,16 @@ value: s.grid, format: () => (s.grid ? 'Yes' : 'No'), onchange: () => { - s.grid = !s.grid - save() + s.grid = !s.grid; + save(); + }, + }, + 'Show Weather': { + value: s.weather, + format: () => (s.weather ? 'Yes' : 'No'), + onchange: () => { + s.weather = !s.weather; + save(); }, } }) From 3dde7126adf0c09fed5c87d4f8604618603802f3 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 19 Dec 2021 21:11:38 +0000 Subject: [PATCH 090/476] ptlaunch: Improve pattern rendering by HughB --- apps.json | 2 +- apps/ptlaunch/ChangeLog | 3 ++- apps/ptlaunch/README.md | 34 ++++++++++++++++++---------------- apps/ptlaunch/app.js | 22 +++++++++++++++++++--- 4 files changed, 40 insertions(+), 21 deletions(-) diff --git a/apps.json b/apps.json index 125d8609e..ddf4e2026 100644 --- a/apps.json +++ b/apps.json @@ -4861,7 +4861,7 @@ "id": "ptlaunch", "name": "Pattern Launcher", "shortName": "Pattern Launcher", - "version": "0.12", + "version": "0.13", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", "screenshots": [{"url":"manage_patterns_light.png"}], diff --git a/apps/ptlaunch/ChangeLog b/apps/ptlaunch/ChangeLog index 8cfa77113..68b7d3e1c 100644 --- a/apps/ptlaunch/ChangeLog +++ b/apps/ptlaunch/ChangeLog @@ -3,4 +3,5 @@ 0.03: Make tap to confirm new pattern more reliable. Also allow for easier creation of single circle patterns. 0.10: Improve the management of existing patterns: Draw the linked pattern on the left hand side of the app name within a scroller, similar to the default launcher. Slighlty clean up the code to make it less horrible. 0.11: Respect theme colors. Fix: Do not pollute global space with internal variables ans functions in boot.js -0.12: Improve pattern detection code readability by PaddeK http://forum.espruino.com/profiles/117930/ \ No newline at end of file +0.12: Improve pattern detection code readability by PaddeK http://forum.espruino.com/profiles/117930/ +0.13: Improve pattern rendering by HughB http://forum.espruino.com/profiles/167235/ \ No newline at end of file diff --git a/apps/ptlaunch/README.md b/apps/ptlaunch/README.md index c16110f94..5ef1e82dd 100644 --- a/apps/ptlaunch/README.md +++ b/apps/ptlaunch/README.md @@ -29,39 +29,41 @@ Then launch the linked apps directly from the clock screen by simply drawing the ## Detailed Steps From the main menu you can: + - Add a new pattern and link it to an app (first entry) - - To create a new pattern first select "Add Pattern" - - Now draw any pattern you like, this will later launch the linked app from the clock screen - - You can also draw a single-circle pattern (meaning a single tap on one circle) instead of drawing a 'complex' pattern - - If you don't like the pattern, simply re-draw it. The previous pattern will be discarded. - - If you are happy with the pattern tap on screen or press the button to continue - - Now select the app you want to launch with the pattern. - - Note, you can bind multiple patterns to the same app. + - To create a new pattern first select "Add Pattern" + - Now draw any pattern you like, this will later launch the linked app from the clock screen + - You can also draw a single-circle pattern (meaning a single tap on one circle) instead of drawing a 'complex' pattern + - If you don't like the pattern, simply re-draw it. The previous pattern will be discarded. + - If you are happy with the pattern tap on screen or press the button to continue + - Now select the app you want to launch with the pattern. + - Note, you can bind multiple patterns to the same app. - Manage created patterns (second entry) - - To manage your patterns first select "Manage Patterns" - - You will now see a scrollabe list of patterns + linked apps - - If you want to deletion a pattern (and unlink the app) simply tap on it, and confirm the deletion + - To manage your patterns first select "Manage Patterns" + - You will now see a scrollabe list of patterns + linked apps + - If you want to deletion a pattern (and unlink the app) simply tap on it, and confirm the deletion - Disable the lock screen on the clock screen from the settings (third entry) - - To launch the app from the pattern on the clock screen the watch must be unlocked. - - If this annoys you, you can disable the lock on the clock screen from the setting here + - To launch the app from the pattern on the clock screen the watch must be unlocked. + - If this annoys you, you can disable the lock on the clock screen from the setting here ## FAQ -1) Nothing happens when I draw on the clock screen! +1. Nothing happens when I draw on the clock screen! Please double-check if you actually have a pattern linked to an app. -2) I have a pattern linked to an app and still nothing happens when I draw on the clock screen! +2. I have a pattern linked to an app and still nothing happens when I draw on the clock screen! Make sure the watch is unlocked before you start drawing. If this bothers you, you can permanently disable the watch-lock from within the Pattern Launcher app (via the Settings). -3) I have done all that and still nothing happens! +3. I have done all that and still nothing happens! Please note that drawing on the clock screen will not visually show the pattern you drew. It will start the app as soon as the pattern was recognized - this might take 1 or 2 seconds! If still nothing happens, that might be a bug, sorry! - ## Authors Initial creation: [crazysaem](https://github.com/crazysaem) Improve pattern detection code readability: [PaddeK](http://forum.espruino.com/profiles/117930/) + +Improve pattern rendering: [HughB](http://forum.espruino.com/profiles/167235/) diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 5a2fcf228..88739ddb7 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -365,6 +365,18 @@ var getStoredPatternsArray = () => { var CIRCLE_RADIUS = 25; var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; +var CIRCLES = [ + { x: 25, y: 25, i: 0 }, + { x: 87, y: 25, i: 1 }, + { x: 150, y: 25, i: 2 }, + { x: 25, y: 87, i: 3 }, + { x: 87, y: 87, i: 4 }, + { x: 150, y: 87, i: 5 }, + { x: 25, y: 150, i: 6 }, + { x: 87, y: 150, i: 7 }, + { x: 150, y: 150, i: 8 }, +]; + var drawCircle = (circle, drawBuffer, scale) => { if (!drawBuffer) { drawBuffer = g; @@ -380,7 +392,8 @@ var drawCircle = (circle, drawBuffer, scale) => { log("drawing circle"); log({ x: x, y: y, r: r }); - drawBuffer.drawCircle(x, y, r); + drawBuffer.setColor(0); + drawBuffer.fillCircle(x, y, r); }; var cachedCirclesDrawings = {}; @@ -425,8 +438,11 @@ var drawCirclesWithPattern = (pattern, options) => { { msb: true } ); - CIRCLES.forEach((circle) => drawCircle(circle, drawBuffer, scale)); + drawBuffer.setColor(1); + drawBuffer.fillRect(0, 0, drawBuffer.getWidth(), drawBuffer.getHeight()); + CIRCLES.forEach((circle) => drawCircle(circle, drawBuffer, scale)); + drawBuffer.setColor(1); drawBuffer.setFontAlign(0, 0); drawBuffer.setFont("Vector", 40 * scale); pattern.forEach((circleIndex, patternIndex) => { @@ -437,12 +453,12 @@ var drawCirclesWithPattern = (pattern, options) => { circle.y * scale ); }); - image = { width: drawBuffer.getWidth(), height: drawBuffer.getHeight(), bpp: 1, buffer: drawBuffer.buffer, + palette: new Uint16Array([g.theme.fg, g.theme.bg], 0, 1), }; if (enableCaching) { From 2c2f07c6bec06e45fc73870d819634e88aee7645 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 19 Dec 2021 21:14:14 +0000 Subject: [PATCH 091/476] ptlaunch: remove tap to confirm pattern since its pretty unreliable. always use button instead --- apps/ptlaunch/README.md | 2 +- apps/ptlaunch/app.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ptlaunch/README.md b/apps/ptlaunch/README.md index 5ef1e82dd..cf75315a9 100644 --- a/apps/ptlaunch/README.md +++ b/apps/ptlaunch/README.md @@ -35,7 +35,7 @@ From the main menu you can: - Now draw any pattern you like, this will later launch the linked app from the clock screen - You can also draw a single-circle pattern (meaning a single tap on one circle) instead of drawing a 'complex' pattern - If you don't like the pattern, simply re-draw it. The previous pattern will be discarded. - - If you are happy with the pattern tap on screen or press the button to continue + - If you are happy with the pattern press the button to continue - Now select the app you want to launch with the pattern. - Note, you can bind multiple patterns to the same app. - Manage created patterns (second entry) diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 88739ddb7..5db3a335b 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -134,7 +134,7 @@ var recognizeAndDrawPattern = () => { resolve(pattern.join("")); }; setWatch(() => finishHandler(), BTN); - setTimeout(() => Bangle.on("tap", finishHandler), 250); + // setTimeout(() => Bangle.on("tap", finishHandler), 250); var positions = []; var getPattern = (positions) => { From f6a5bc563ec884cf54f7677a7b8d0480ad39aacb Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 22:22:28 +0100 Subject: [PATCH 092/476] Use health library to display data. --- apps/lcars/lcars.app.js | 55 +++++++++++++++++++----------------- apps/lcars/screenshot_2.png | Bin 2671 -> 2802 bytes 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index ae2927ae8..53849e840 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -17,10 +17,7 @@ for (const key in saved_settings) { } var stepsData = new Array(24).fill(0); -var hrmData = new Array(24).fill(0); let hrmValue = 0; -var hrmValueAvg = 0; -var hrmValueCount = 0; /* * Colors to use @@ -260,29 +257,43 @@ function drawPosition1(){ // Draw steps bars g.setColor(cWhite); + let health; - // HRM - var maxHrm = Math.max.apply(Math, hrmData); - var gridy = (parseInt(maxHrm / 50)-1) * 50; - gridy = gridy <= 0 ? 50 : gridy; - require("graph").drawBar(g, hrmData, { + try { + health = require("health"); + } catch(ex) { + g.setFontAntonioMedium(); + g.drawString("MODULE HEALTH", 20, 110); + g.drawString("REQUIRED.", 20, 130); + g.drawString("MODULE HEALTH", 20, 20); + g.drawString("REQUIRED.", 20, 40); + return; + } + + // Plot HRM graph + var data = new Uint16Array(31); + var cnt = new Uint8Array(31); + health.readDailySummaries(new Date(), h=>{ + data[h.day]+=h.bpm; + if (h.bpm) cnt[h.day]++; + }); + require("graph").drawBar(g, data, { axes : true, gridx : 4, - gridy : gridy, + gridy : 100, width : 140, height : 50, x: 5, y: 25 }); - // Steps - var maxSteps = Math.max.apply(Math, stepsData); - var gridy = (parseInt(maxSteps / 1000)-1) * 1000; - gridy = gridy <= 0 ? 1000 : gridy; - require("graph").drawBar(g, stepsData, { + // Plot step graph + var data = new Uint16Array(31); + health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); + require("graph").drawBar(g, data, { axes : true, gridx : 4, - gridy : gridy, + gridy : 5, width : 140, height : 50, x: 5, @@ -290,8 +301,10 @@ function drawPosition1(){ }); g.setFontAntonioMedium(); + g.setColor(cWhite); g.drawString("HRM", 122, 9); - g.drawString("STEPS", 114, 96); + g.drawString("STEPS [K]", 90, 96); + } function draw(){ @@ -414,17 +427,7 @@ Bangle.on('charging',function(charging) { }); Bangle.on('HRM', function (hrm) { - var current = new Date(); - hrmValue = hrm.bpm; - hrmValueAvg += hrmValue; - hrmValueCount += 1; - hrmData[current.getHours()] = hrmValueAvg / hrmValueCount; - - if(current.getMinutes() == 0){ - hrmValueAvg = 0; - hrmValueCount = 0; - } }); diff --git a/apps/lcars/screenshot_2.png b/apps/lcars/screenshot_2.png index 8960ff8dffd4a45f0028e54fdd35db85149044ac..4501e52fa0a0fc2bebfff6f916eb8bcd9a89489a 100644 GIT binary patch literal 2802 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 delta 2649 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 Date: Sun, 19 Dec 2021 22:25:55 +0100 Subject: [PATCH 093/476] Updated readme --- apps/lcars/README.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index d84ada29b..8c31d04e4 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -1,26 +1,30 @@ # LCARS clock A simple LCARS inspired clock. -Note: To display the steps, its necessary (but still optional) to install +Note: To display the steps, its necessary to install the [Pedometer widget](https://banglejs.com/apps/#pedometer%20widget). +To display the month graphs on screen 2, the health app is required. +Nevertheless, lcars can also be used, with limited functionality, without +installing those apps. + ## Features * LCARS Style watch face * Shows different states (charging, out of battery, GPS on etc.) * Shows customizable data (steps, HRM, battery, temperature etc.) * Change between multiple screens via swipe left/right. - * Display 24h graphs for steps + hrm. + * Display month graphs for steps + hrm on screen 2. * Swipe up/down to activate an alarm. * Full-screen mode. -## Screenshot of multiple screens -Access via swipe left/ right + +## Multiple screens support +Access different screens via swipe left/ right ![](screenshot.png) ![](screenshot_2.png) - ## Icons
Icons made by Smashicons, Freepik from www.flaticon.com
From 91a3b5feef9bcbfd965dc6ff3f8e2ab64ea620c1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 22:30:40 +0100 Subject: [PATCH 094/476] Updated readme. --- apps/lcars/README.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 8c31d04e4..7c56f5481 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -9,13 +9,15 @@ installing those apps. ## Features - * LCARS Style watch face - * Shows different states (charging, out of battery, GPS on etc.) - * Shows customizable data (steps, HRM, battery, temperature etc.) - * Change between multiple screens via swipe left/right. - * Display month graphs for steps + hrm on screen 2. - * Swipe up/down to activate an alarm. - * Full-screen mode. + * LCARS Style watch face. + * Full screen mode - widgets are still loaded. + * Supports multiple screens with different data. + * [Screen 1] Date + Time + Lock status. + * [Screen 1] Shows randomly images of real planets. + * [Screen 1] Shows different states such as (charging, out of battery, GPS on etc.) + * [Screen 1] Swipe up/down to activate an alarm. + * [Screen 1] Shows 3 customizable datapoints on the first screen. + * [Screen 2] Display month graphs for steps + hrm on the second screen. ## Multiple screens support From 6252dc89828d2fec9f73e4733270dd1ee57b75d1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 22:42:47 +0100 Subject: [PATCH 095/476] Use health app also for steps overview. --- apps/lcars/README.md | 7 ++----- apps/lcars/lcars.app.js | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 7c56f5481..b7a692c96 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -1,11 +1,8 @@ # LCARS clock A simple LCARS inspired clock. -Note: To display the steps, its necessary to install -the [Pedometer widget](https://banglejs.com/apps/#pedometer%20widget). -To display the month graphs on screen 2, the health app is required. -Nevertheless, lcars can also be used, with limited functionality, without -installing those apps. +Note: To display the steps, the health app is required. +If this app is not installed, the data will not be shown. ## Features diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 53849e840..8d86c09d1 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -271,14 +271,15 @@ function drawPosition1(){ } // Plot HRM graph - var data = new Uint16Array(31); - var cnt = new Uint8Array(31); + var data = new Uint16Array(32); + var cnt = new Uint8Array(32); health.readDailySummaries(new Date(), h=>{ data[h.day]+=h.bpm; if (h.bpm) cnt[h.day]++; }); require("graph").drawBar(g, data, { axes : true, + minx: 1, gridx : 4, gridy : 100, width : 140, @@ -288,10 +289,11 @@ function drawPosition1(){ }); // Plot step graph - var data = new Uint16Array(31); + var data = new Uint16Array(32); health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); require("graph").drawBar(g, data, { axes : true, + minx: 1, gridx : 4, gridy : 5, width : 140, @@ -341,9 +343,15 @@ function draw(){ * Step counter via widget */ function getSteps() { - if (stepsWidget() !== undefined) - return stepsWidget().getSteps(); - return 0; + var steps = 0 + try { + health = require("health"); + } catch(ex) { + return steps; + } + + health.readDay(new Date(), h=>steps+=h.steps); + return steps; } function stepsWidget() { From 23ac5310088c966892bf1b316dcd6bd9440c1a6c Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 22:49:18 +0100 Subject: [PATCH 096/476] Removed unused code. --- apps/lcars/lcars.app.js | 27 ++------------------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 8d86c09d1..d63b2c743 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -16,9 +16,6 @@ for (const key in saved_settings) { settings[key] = saved_settings[key] } -var stepsData = new Array(24).fill(0); -let hrmValue = 0; - /* * Colors to use */ @@ -28,10 +25,11 @@ let cPurple = "#FF00DC"; let cWhite = "#FFFFFF"; /* - * Position in lcars + * Global lcars variables */ let lcarsViewPos = 0; let drag; +let hrmValue = 0; /* * Requirements and globals @@ -313,9 +311,6 @@ function draw(){ // First handle alarm to show this correctly afterwards handleAlarm(); - // Handle steps for graph data - handleSteps(); - // Clear data var current = new Date(); if(current.getHours() == 0 && current.getMinutes() == 0){ @@ -354,24 +349,6 @@ function getSteps() { return steps; } -function stepsWidget() { - if (WIDGETS.activepedom !== undefined) { - return WIDGETS.activepedom; - } else if (WIDGETS.wpedom !== undefined) { - return WIDGETS.wpedom; - } - return undefined; -} - -function handleSteps(){ - var current_h = (new Date()).getHours(); - if(current_h == 0){ - stepsData[current_h] = getSteps(); - } else { - stepsData[current_h] = getSteps() - stepsData[current_h-1]; - } -} - /* * Handle alarm From e8909dd57efa3a99ad2114c8582130cee3d02d88 Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 22:52:05 +0100 Subject: [PATCH 097/476] Minor design improvements. --- apps/lcars/lcars.app.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index d63b2c743..9068868f0 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -165,10 +165,10 @@ function drawLock(){ g.setFontAntonioMedium(); g.setColor(cOrange); g.clearRect(120, 10, g.getWidth(), 75); - g.drawString("LCARS", 130, 15); - g.drawString("B-JS2", 130, 35); + g.drawString("LCARS", 130, 12); + g.drawString("B-JS2", 130, 32); if(Bangle.isLocked()){ - g.drawString("LOCK", 130, 55); + g.drawString("LOCK", 130, 52); } } @@ -223,7 +223,7 @@ function drawPosition0(){ var currentDate = new Date(); var timeStr = locale.time(currentDate,1); g.setFontAntonioLarge(); - g.drawString(timeStr, 25, 12); + g.drawString(timeStr, 25, 10); // Write date g.setColor(cWhite); @@ -231,7 +231,7 @@ function drawPosition0(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 28, 58); + g.drawString(dayStr, 28, 56); // Draw data g.setColor(cWhite); From 9d180064f54ca3e5decebca46e990a50c9b88661 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sun, 19 Dec 2021 22:25:18 +0000 Subject: [PATCH 098/476] Pastel: added dependancy on weather, fix issues on a B1, extend support to B1 for Pebble and Widbata --- apps.json | 8 ++++---- apps/pastel/ChangeLog | 1 + apps/pastel/pastel.app.js | 16 ++-------------- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/apps.json b/apps.json index 909c4793a..214b8b350 100644 --- a/apps.json +++ b/apps.json @@ -4210,10 +4210,10 @@ "id": "pastel", "name": "Pastel Clock", "shortName": "Pastel", - "version": "0.09", + "version": "0.10", "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", - "dependencies": {"mylocation":"app", "widpedom":"app"}, + "dependencies": {"mylocation":"app", "widpedom":"app","weather":"app"}, "screenshots": [{"url":"screenshot_pastel.png"}], "type": "clock", "tags": "clock", @@ -4733,7 +4733,7 @@ "screenshots": [{"url":"pebble_screenshot.png"}], "type": "clock", "tags": "clock", - "supports": ["BANGLEJS2"], + "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ {"name":"pebble.app.js","url":"pebble.app.js"}, {"name":"pebble.settings.js","url":"pebble.settings.js"}, @@ -4767,7 +4767,7 @@ "screenshots": [{"url":"screenshot_widbata_1.png"}], "version":"0.01", "type": "widget", - "supports": ["BANGLEJS2"], + "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", "description": "Shows the current battery level status in the top right using the clocks colour theme", "tags": "widget,battery", diff --git a/apps/pastel/ChangeLog b/apps/pastel/ChangeLog index afeb305c5..627531f03 100644 --- a/apps/pastel/ChangeLog +++ b/apps/pastel/ChangeLog @@ -7,3 +7,4 @@ 0.07: Added info line that cycles on BTN1/BTN3 (or vitual buttons on a bangle 2) 0.08: Added dependancy on MyLocation 0.09: Added dependancy on Pedometer Widget +0.10: Added Weather line, fixed issues on a Bangle 1, update every minute diff --git a/apps/pastel/pastel.app.js b/apps/pastel/pastel.app.js index e0c7df831..db60a2738 100644 --- a/apps/pastel/pastel.app.js +++ b/apps/pastel/pastel.app.js @@ -149,8 +149,6 @@ function getWeather() { return jsonWeather; } -var mm_prev = "xx"; - function draw() { var d = new Date(); var da = d.toString().split(" "); @@ -190,18 +188,8 @@ function draw() { } g.reset(); - - if (process.env.HWVERSION == 1) { - // avoid flicker on a bangle 1 by comparing with previous minute - if (mm_prev != mm) { - mm_prev = mm; - g.clearRect(0, 30, w, h - 24); - } - } else { - // on a b2 safe to just clear anyway as there is no flicker - g.clearRect(0, 30, w, h - 24); - } - + g.clearRect(0, 30, w, h - 24); + // draw a grid like graph paper if (settings.grid && process.env.HWVERSION !=1) { g.setColor("#0f0"); From 89928990470562b85be5dbdd65be45cbd09e4b28 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:29:32 -0800 Subject: [PATCH 099/476] Create app.js --- apps/promenu/app.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/promenu/app.js diff --git a/apps/promenu/app.js b/apps/promenu/app.js new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/promenu/app.js @@ -0,0 +1 @@ + From 63bfaf308d63f3f274ab1196c5628303ef06ce08 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:39:40 -0800 Subject: [PATCH 100/476] Create boot.js --- apps/promenu/boot.js | 165 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 apps/promenu/boot.js diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js new file mode 100644 index 000000000..20c5af8f5 --- /dev/null +++ b/apps/promenu/boot.js @@ -0,0 +1,165 @@ +E.showMenu = function(items) { + function RectRnd(x1,y1,x2,y2,r) { + pp = []; + pp.push.apply(pp,g.quadraticBezier([x2-r,y1, x2,y1,x2,y1+r])); + pp.push.apply(pp,g.quadraticBezier([x2,y2-r,x2,y2,x2-r,y2])); + pp.push.apply(pp,g.quadraticBezier([x1+r,y2,x1,y2,x1,y2-r])); + pp.push.apply(pp,g.quadraticBezier([x1,y1+r,x1,y1,x1+r,y1])); + return pp; + } + function fillRectRnd(x1,y1,x2,y2,r,c) { + g.setColor(c); + g.fillPoly(RectRnd(x1,y1,x2,y2,r),1); + g.setColor(255,255,255); + } + function drawRectRnd(x1,y1,x2,y2,r,c) { + g.setColor(c); + g.drawPoly(RectRnd(x1,y1,x2,y2,r),1); + g.setColor(255,255,255); + } + g.reset().clearRect(Bangle.appRect); // clear if no menu supplied + Bangle.setLCDPower(1); // ensure screen is on + if (!items) { + Bangle.setUI(); + return; + } + var menuItems = Object.keys(items); + var options = items[""]; + if (options) menuItems.splice(menuItems.indexOf(""),1); + if (!(options instanceof Object)) options = {}; + options.fontHeight = options.fontHeight||27; + if (options.selected === undefined) + options.selected = 0; + if (!options.fontHeight) + options.fontHeight = 6; + var ar = Bangle.appRect; + var x = ar.x; + var x2 = ar.x2-11; // padding at side for up/down + var y = ar.y; + var y2 = ar.y2 - 20; // padding at end for arrow + if (options.title) + y += options.fontHeight+2; + var loc = require("locale"); + var l = { + lastIdx : 0, + draw : function(rowmin,rowmax) { + var rows = 0|Math.min((y2-y) / options.fontHeight,menuItems.length); + var idx = E.clip(options.selected-(rows>>1),0,menuItems.length-rows); + if (idx!=l.lastIdx) rowmin=undefined; // redraw all if we scrolled + l.lastIdx = idx; + var iy = y; + g.reset().setFont('6x8',2).setFontAlign(0,-1,0); + if (options.predraw) options.predraw(g); + if (rowmin===undefined && options.title) { + g.drawString(options.title,(x+x2)/2,y-options.fontHeight); + g.drawLine(x,y-7,x2,y-7); + } + if (rowmin!==undefined) { + if (idxrowmax) { + rows = 1+rowmax-rowmin; + } + } + while (rows--) { + var name = menuItems[idx]; + var item = items[name]; + var hl = (idx==options.selected && !l.selectEdit); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : 255,255,255); + g.setColor(hl ? g.theme.fgH : g.theme.fg); + g.setFontAlign(-1,-1); + if(loc.translate(name).length >= 15){ + g.drawString(loc.translate(name).substring(0, 15)+"...",x+8,iy+4); + }else{ + g.drawString(loc.translate(name),x+8,iy+4); + } + if ("object" == typeof item) { + var xo = x2; + var v = item.value; + if (item.format) v=item.format(v); + v = loc.translate(""+v); + if (l.selectEdit && idx==options.selected) { + xo -= 24 + 1; + g.setColor(g.theme.fgH).drawImage("\x0c\x05\x81\x00 \x07\x00\xF9\xF0\x0E\x00@",xo,iy+(options.fontHeight-10)/2,{scale:2}); + } + g.setFontAlign(1,-1); + g.drawString(v,xo-6,iy+4); + } + g.setColor(g.theme.fg); + iy += options.fontHeight; + idx++; + } + g.setFontAlign(-1,-1); + var more = idxitem.max) item.value = item.wrap ? item.min : item.max; + if (item.onchange) item.onchange(item.value); + l.draw(options.selected,options.selected); + } else { + var lastSelected=options.selected; + options.selected = (dir+options.selected+menuItems.length)%menuItems.length; + l.draw(Math.min(lastSelected,options.selected), Math.max(lastSelected,options.selected)); + } + } + }; + l.draw(); + Bangle.setUI("updown",dir => { + if (dir) l.move(dir); + else l.select(); + }); + return l; +}; From 476a975171731935a3f65b8d80f71048ae6ea126 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:46:12 -0800 Subject: [PATCH 101/476] Update apps.json --- apps.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..efb76c360 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,18 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "promenu", + "name": "Pro Menu", + "version": "0.01", + "description": "Replace Bangle.js 1's built in show message.", + "icon": "app.png", + "type": "boot", + "tags": "system", + "supports": ["BANGLEJS"], + "storage": [ + {"name":"promenu.boot.js","url":"boot.js"} + ] } ] From ab9bcf9f66f24d54e42592d9dec24063354af72c Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:48:22 -0800 Subject: [PATCH 102/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index efb76c360..66748d2c3 100644 --- a/apps.json +++ b/apps.json @@ -5068,7 +5068,7 @@ "name": "Pro Menu", "version": "0.01", "description": "Replace Bangle.js 1's built in show message.", - "icon": "app.png", + "icon": "promenuIcon.png", "type": "boot", "tags": "system", "supports": ["BANGLEJS"], From 2527cb947663195dc8b003f85256c139f4e0827c Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:49:39 -0800 Subject: [PATCH 103/476] Create promenuIcon.png --- apps/promenu/promenuIcon.png | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/promenu/promenuIcon.png diff --git a/apps/promenu/promenuIcon.png b/apps/promenu/promenuIcon.png new file mode 100644 index 000000000..5c2dc6adc --- /dev/null +++ b/apps/promenu/promenuIcon.png @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwyBC/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AFE+rwBSAAU2j02js1/oBC7oBBlu9AIWdluclt8AIMlrgBCngBCjgBBjn7AIXbAIW7AIMUzYBFLv5ddMJ5d/LqJfeLv5fdLv5fQMJhd/LqQA/AH4A/AH4A/AH4A/AH4A/AAM+rwBSAAU2j02js1/oBC7oBBlu9AIWdluclt8AIMlrgBCngBCjgBBjn7AIXbAIW7AIMUzYBFLv5ddMJ5d/LqJfeLv5fdLv5fQMJhd/LqQA/AH4A/AH4A/AH4A/AH4A/AAM+rwBSAAU2j02js1/oBC7oBBlu9AIWdluclt8AIMlrgBCngBCjgBBjn7AIXbAIW7AIMUzYBFLv5ddMJ5d/LqJfeLv5fdLv5fQMJhd/LqQA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/ADIA==")) From 621866352b7652e21b6bb5d9fde2a4e7abdd4805 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:50:21 -0800 Subject: [PATCH 104/476] Create README.md --- apps/promenu/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/promenu/README.md diff --git a/apps/promenu/README.md b/apps/promenu/README.md new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/promenu/README.md @@ -0,0 +1 @@ + From 38f6797994bde65d17d6c6070f3b1c28151138a3 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 07:50:35 -0800 Subject: [PATCH 105/476] Create ChangeLog --- apps/promenu/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/promenu/ChangeLog diff --git a/apps/promenu/ChangeLog b/apps/promenu/ChangeLog new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/apps/promenu/ChangeLog @@ -0,0 +1 @@ + From d60e7c181620e9486457500ebaf7eedf66ed2f61 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 18:48:16 -0500 Subject: [PATCH 106/476] Create app.js --- apps/slimehunt/app.js | 341 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 341 insertions(+) create mode 100644 apps/slimehunt/app.js diff --git a/apps/slimehunt/app.js b/apps/slimehunt/app.js new file mode 100644 index 000000000..255399072 --- /dev/null +++ b/apps/slimehunt/app.js @@ -0,0 +1,341 @@ +//Create constants +const GREEN_SLIME = 1; //Normal slime, is always neutral. +const PINK_SLIME = 2; //Can get angry +const GRAY_SLIME = 3; //Can be neutral, angry or erratic +const YELLOW_SLIME = 4; //Is always erratic +const PURPLE_SLIME = 5; //Is always angry + +//Initialize variables +var playerHP = 20; +var slimeHP = 3; +var slimeType = GREEN_SLIME; +var turn = 0; +var screenWidth = g.getWidth(); +var screenHeight = g.getHeight(); +var slimeState = 0; +var showBattleResult = false; +var dmgDealt = 0; +var playerDefence = 0; + +var refreshInterval; +var waitTime = 0; + +var highscore = 0; +var score = 0; + +var themeNote = 0; + +//Load files +var file = require("Storage").open("highscore.txt","r"); +highscore = file.readLine(); +if (highscore == undefined) highscore = 0; + +var greenSlime = require("Storage").read("slime.img"); +var pinkSlime = require("Storage").read("slimered.img"); +var graySlime = require("Storage").read("slimegray.img"); +var yellowSlime = require("Storage").read("slimeyellow.img"); +var purpleSlime = require("Storage").read("slimepurple.img"); + +//UI Stuff +function drawOpeningUI() { + g.clear(); + g.setFont("Vector",screenWidth/15); + g.setFontAlign(0,0); // center font + g.drawString("SLIME HUNT",screenWidth/2,screenHeight*0.1); + g.drawString("-SCORE TO BEAT-",screenWidth/2,screenHeight*0.3); + g.drawString("<><><> "+highscore+" <><><>",screenWidth/2,screenHeight*0.45); + g.setFont("Vector",screenWidth/20); + g.drawString("A Slime approches...",screenWidth/2,screenHeight*0.6); + wait(8,waitForBattle); +} + +function drawSlime() { + switch(slimeType) { + case GREEN_SLIME: + g.drawImage(greenSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); + break; + case PINK_SLIME: + g.drawImage(pinkSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); + break; + case GRAY_SLIME: + g.drawImage(graySlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); + break; + case YELLOW_SLIME: + g.drawImage(yellowSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); + break; + case PURPLE_SLIME: + g.drawImage(purpleSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); + break; + } +} + +function drawBattleUI() { + g.clear(); + g.setFont("Vector",screenWidth/8); + g.setFontAlign(0,0); // center font + g.drawString("SLIME HP: " + slimeHP,screenWidth/2,screenHeight*0.1); + g.setFont("Vector",screenWidth/20); + if (!showBattleResult) { + switch(slimeState) { + case 0: + g.drawString("The slime seems neutral...",screenWidth/2,screenHeight*0.25); + break; + case 1: + g.drawString("The slime seems angry...",screenWidth/2,screenHeight*0.25); + break; + case 2: + g.drawString("The slime seems eratic...",screenWidth/2,screenHeight*0.25); + break; + } + }else{ + var brString = (turn == 0 ? "The Slime loses " : "You lose "); + g.drawString(brString + dmgDealt + "HP!",screenWidth/2,screenHeight*0.25); + } + drawSlime(); + g.drawLine(0,screenHeight*0.72,screenWidth,screenHeight*0.72); + if (turn == 0) { + g.setFont("Vector",screenWidth/15); + g.drawString("Your HP is " + playerHP + ".",screenWidth/2,screenHeight*0.8); + g.setFont("Vector",screenWidth/20); + g.drawString("(B1) FIGHT\t|\t(B2) DEFEND\t|\t(B3) RUN",screenWidth/2,screenHeight*0.9); + } +} + +function win() { + wait(5,winTheme); + calcScore(slimeType); + showBattleResult = false; + g.clear(); + g.setFont("Vector",screenWidth/8); + g.setFontAlign(0,0); // center font + g.drawString("YOU WON!",screenWidth/2,screenHeight/2); + g.setFont("Vector",screenWidth/20); + g.drawString("Your score is << " + score + " >>",screenWidth/2,screenHeight*0.75); + g.drawString("Press (B3) to find another slime!",screenWidth/2,screenHeight*0.9); + turn = 0; + setWatch(run,BTN3); +} + +function lose() { + wait(5,loseTheme); + playerHP = 20; + showBattleResult = false; + g.clear(); + g.setFont("Vector",screenWidth/8); + g.setFontAlign(0,0); // center font + g.drawString("You lose...",screenWidth/2,screenHeight/2); + g.setFont("Vector",screenWidth/20); + g.drawString("Your score is << " + score + " >>",screenWidth/2,screenHeight*0.75); + g.drawString("Press (B3) to try again...",screenWidth/2,screenHeight*0.9); + score = 0; + turn = 0; + setWatch(run,BTN3); +} + +//Battle Stuff +function nextTurn() { + turn = (turn == 0 ? 1 : 0); +} + +function slimeFight() { + Bangle.beep(100, 500); + switch(slimeState) { + case 0: + dmgDealt = Math.floor(Math.random() * 2); + break; + case 1: + dmgDealt = Math.floor(Math.random() * 3) + 3; + break; + case 2: + dmgDealt = Math.floor(Math.random() * 6); + break; + } + dmgDealt = Math.max(0,dmgDealt - playerDefence); + playerHP -= dmgDealt; + slimeAI(); +} + +function fight() { + if (turn == 0 && waitTime <= 0) { + Bangle.beep(100, 1000); + dmgDealt = 1; + playerDefence = 0; + slimeHP -= dmgDealt; + showBattleResult = true; + drawBattleUI(); + wait(5,waitForTurn); + } +} + +function defend() { + if (turn == 0 && waitTime <= 0) { + dmgDealt = 0; + playerDefence = 3; + showBattleResult = true; + drawBattleUI(); + wait(5,waitForTurn); + } +} + +function run() { + if (turn == 0 && waitTime <= 0) { + showBattleResult = false; + Bangle.beep(200, 4000); + wait(3,waitForBattle); + } +} + + +function newBattle() { + showBattleResult = false; + slimeType = Math.floor(Math.random() * 5) + 1; + switch(slimeType) { + case GREEN_SLIME: + slimeHP = 3; + break; + case PINK_SLIME: + slimeHP = 3; + break; + case GRAY_SLIME: + slimeHP = 5; + break; + case YELLOW_SLIME: + slimeHP = 5; + break; + case PURPLE_SLIME: + slimeHP = 5; + break; + } + turn = 0; + battle(); + slimeAI(); + drawBattleUI(); +} + +function battle() { + setWatch(fight,BTN1); + setWatch(defend,BTN2); + setWatch(run,BTN3); +} + +function slimeAI() { + switch(slimeType) { + case GREEN_SLIME: + slimeState = 0; + break; + case PINK_SLIME: + slimeState = Math.floor(Math.random() * 2); + break; + case GRAY_SLIME: + slimeState = Math.floor(Math.random() * 3); + break; + case YELLOW_SLIME: + slimeState = 2; + break; + case PURPLE_SLIME: + slimeState = 1; + break; + } +} + + +//Timed transitions +function wait(duration,waitFunc) { + waitTime = duration; + if (!refreshInterval) + refreshInterval = setInterval(waitFunc, 500); +} + +function waitForTurn() { + waitTime--; + if (waitTime <= 0) { + clearInterval(refreshInterval); + refreshInterval = undefined; + nextTurn(); + if (playerHP > 0 && slimeHP > 0) { + if (turn == 1) { + slimeFight(); + wait(5,waitForTurn); + }else{ + showBattleResult = false; + battle(); + } + drawBattleUI(); + }else{ + if (playerHP <= 0) { + lose(); + } + if (slimeHP <= 0) { + win(); + } + } + } + Bangle.setLCDPower(1); +} + +function waitForBattle() { + waitTime--; + Bangle.beep(100, 1000); + if (waitTime <= 0) { + clearInterval(refreshInterval); + refreshInterval = undefined; + showBattleResult = false; + newBattle(); + } + Bangle.setLCDPower(1); +} + +function winTheme() { + waitTime--; + Bangle.beep(200, 100*themeNote); + themeNote++; + if (waitTime <= 0) { + themeNote = 0; + clearInterval(refreshInterval); + refreshInterval = undefined; + } + Bangle.setLCDPower(1); +} + +function loseTheme() { + waitTime--; + Bangle.beep(200, 600-(100*themeNote)); + themeNote++; + if (waitTime <= 0) { + themeNote = 0; + clearInterval(refreshInterval); + refreshInterval = undefined; + } + Bangle.setLCDPower(1); +} + +//Calculations +function calcScore(slimeType) { + switch(slimeType) { + case GREEN_SLIME: + score += 1; + break; + case PINK_SLIME: + score += 2; + break; + case GRAY_SLIME: + score += 2; + break; + case YELLOW_SLIME: + score += 5; + break; + case PURPLE_SLIME: + score += 10; + break; + } + if (score > highscore) { + file.erase(); + file = require("Storage").open("highscore.txt","w"); + file.write(score); + } +} + +//------------------------------------GAME STARTS HERE ----------------------------------------------- + +//Load opening UI +drawOpeningUI(); From 13a28d2a5fbcb782da42ac01f4630e35b897d3c0 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 15:51:16 -0800 Subject: [PATCH 107/476] Update ChangeLog --- apps/promenu/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/ChangeLog b/apps/promenu/ChangeLog index 8b1378917..5560f00bc 100644 --- a/apps/promenu/ChangeLog +++ b/apps/promenu/ChangeLog @@ -1 +1 @@ - +0.01: New App! From 42f943e03bd701500b1c6337cbf72ad383275322 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 15:52:02 -0800 Subject: [PATCH 108/476] Rename promenuIcon.png to promenuIcon.js --- apps/promenu/{promenuIcon.png => promenuIcon.js} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/promenu/{promenuIcon.png => promenuIcon.js} (100%) diff --git a/apps/promenu/promenuIcon.png b/apps/promenu/promenuIcon.js similarity index 100% rename from apps/promenu/promenuIcon.png rename to apps/promenu/promenuIcon.js From 3e8f7101923396725aebe74d108a2d8dd02192d6 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 15:52:18 -0800 Subject: [PATCH 109/476] Add files via upload --- apps/promenu/icons8-menu-48 (1).png | Bin 0 -> 251 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/promenu/icons8-menu-48 (1).png diff --git a/apps/promenu/icons8-menu-48 (1).png b/apps/promenu/icons8-menu-48 (1).png new file mode 100644 index 0000000000000000000000000000000000000000..c6138b765bad3521b688dd3f11e606ef8ceeedb3 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCwj^(N7l!{JxM1({$v}|}o-U3d z8I5nRIdUB`5NUZ>Y3UwY&5{4WantL@DxvicY~P&QdV5b^RK^hv){Xu@>@|FynS?b` zR2Ufk%~)&icm4RyH9UHy^UbOXr#|}hQ`7(b_s8G6p{`fYMf_IP%8RYv x`25A08uAx$Uu@kLmsPTG@8Qd>3=AA8OeGeAk$j1@-9Wc9c)I$ztaD0e0sz6fXyX6? literal 0 HcmV?d00001 From 997f1aba741cba00b6131fe680785c4629ab03b6 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 18:52:45 -0500 Subject: [PATCH 110/476] Create app-icon.js --- apps/slimehunt/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/slimehunt/app-icon.js diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js new file mode 100644 index 000000000..b575aa4d6 --- /dev/null +++ b/apps/slimehunt/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) From dabc8225737843294235dab681a8598e5aa1fcba Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 18:56:14 -0500 Subject: [PATCH 111/476] Update apps.json --- apps.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/apps.json b/apps.json index fd2e14e60..7c9e1b524 100644 --- a/apps.json +++ b/apps.json @@ -4857,5 +4857,17 @@ {"name":"clicompleteclk.app.js","url":"app.js"}, {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true} ] +}, +{ "id": "slimehunt", + "name": "Slime Hunt", + "shortName":"SlimeHunt", + "icon": "app.png", + "version":"0.01", + "description": "Fight against slimes in turn based combat, try to get the highscore!", + "tags": "RPG", + "storage": [ + {"name":"slimehunt.app.js","url":"app.js"}, + {"name":"slimehunt.img","url":"app-icon.js","evaluate":true} + ] } ] From 0cca21ab61bec6ab3a2afd9a4f1fcc20367abfe7 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 15:58:27 -0800 Subject: [PATCH 112/476] Update apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 66748d2c3..c61376b6c 100644 --- a/apps.json +++ b/apps.json @@ -5068,12 +5068,13 @@ "name": "Pro Menu", "version": "0.01", "description": "Replace Bangle.js 1's built in show message.", - "icon": "promenuIcon.png", + "icon": "icons8-menu-48 (1).png", "type": "boot", "tags": "system", "supports": ["BANGLEJS"], "storage": [ {"name":"promenu.boot.js","url":"boot.js"} + {"name":"promenu.img","url":"promenuIcon.js","evaluate":true} ] } ] From 98b2721893fa28464da653269d4e4dcd937d7b16 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:01:27 -0500 Subject: [PATCH 113/476] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index b575aa4d6..793681814 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")); From a04f169d094afbfae5236b915d66870eabdb4352 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:04:20 -0500 Subject: [PATCH 114/476] Update apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 7c9e1b524..a8fbe2bfe 100644 --- a/apps.json +++ b/apps.json @@ -4864,7 +4864,8 @@ "icon": "app.png", "version":"0.01", "description": "Fight against slimes in turn based combat, try to get the highscore!", - "tags": "RPG", + "tags": "rpg", + "supports" : ["BANGLEJS"], "storage": [ {"name":"slimehunt.app.js","url":"app.js"}, {"name":"slimehunt.img","url":"app-icon.js","evaluate":true} From 869aa0f6dcee45f62926df029be3ec82c8cb6bd7 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:07:08 -0500 Subject: [PATCH 115/476] Update apps.json --- apps.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/apps.json b/apps.json index a8fbe2bfe..8a2513f33 100644 --- a/apps.json +++ b/apps.json @@ -4857,18 +4857,18 @@ {"name":"clicompleteclk.app.js","url":"app.js"}, {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true} ] -}, -{ "id": "slimehunt", - "name": "Slime Hunt", - "shortName":"SlimeHunt", - "icon": "app.png", - "version":"0.01", - "description": "Fight against slimes in turn based combat, try to get the highscore!", - "tags": "rpg", - "supports" : ["BANGLEJS"], - "storage": [ - {"name":"slimehunt.app.js","url":"app.js"}, - {"name":"slimehunt.img","url":"app-icon.js","evaluate":true} - ] -} + }, + { "id": "slimehunt", + "name": "Slime Hunt", + "shortName":"SlimeHunt", + "icon": "app.png", + "version":"0.01", + "description": "Fight against slimes in turn based combat, try to get the highscore!", + "tags": "rpg", + "supports" : ["BANGLEJS"], + "storage": [ + {"name":"slimehunt.app.js","url":"app.js"}, + {"name":"slimehunt.img","url":"app-icon.js","evaluate":true} + ] + } ] From 5961b04095e37f3582076ebc551ff304d1659236 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 16:08:19 -0800 Subject: [PATCH 116/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c61376b6c..dc635540f 100644 --- a/apps.json +++ b/apps.json @@ -5073,7 +5073,7 @@ "tags": "system", "supports": ["BANGLEJS"], "storage": [ - {"name":"promenu.boot.js","url":"boot.js"} + {"name":"promenu.boot.js","url":"boot.js"}, {"name":"promenu.img","url":"promenuIcon.js","evaluate":true} ] } From 1d2433c3ae460b6178c9842c918a3268407d8de3 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:08:52 -0500 Subject: [PATCH 117/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8a2513f33..44f1ca11e 100644 --- a/apps.json +++ b/apps.json @@ -4861,7 +4861,7 @@ { "id": "slimehunt", "name": "Slime Hunt", "shortName":"SlimeHunt", - "icon": "app.png", + "icon": "slime.png", "version":"0.01", "description": "Fight against slimes in turn based combat, try to get the highscore!", "tags": "rpg", From 5e30c0f51c9efc65cc585a96f9c8e54776b826c0 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:09:37 -0500 Subject: [PATCH 118/476] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index 793681814..b575aa4d6 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")); +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) From 2422474bab030c9af18c9aa0f8f95b124a7a2051 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:12:25 -0500 Subject: [PATCH 119/476] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index b575aa4d6..d38a9ad55 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) +E.toArrayBuffer(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA"))); From 55e9695b9dc1eff3a33f372c52da73735a5a9a34 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:13:53 -0500 Subject: [PATCH 120/476] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index d38a9ad55..1e2339e38 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA"))); +var img = require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) From d3997747da3e1b703dc61fc7f0002b4f8adbbc2e Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:16:56 -0500 Subject: [PATCH 121/476] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index 1e2339e38..b575aa4d6 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -var img = require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) +require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) From da5c6f5b001678d8b6398362888567faecb1e11b Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:18:32 -0500 Subject: [PATCH 122/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 44f1ca11e..8a2513f33 100644 --- a/apps.json +++ b/apps.json @@ -4861,7 +4861,7 @@ { "id": "slimehunt", "name": "Slime Hunt", "shortName":"SlimeHunt", - "icon": "slime.png", + "icon": "app.png", "version":"0.01", "description": "Fight against slimes in turn based combat, try to get the highscore!", "tags": "rpg", From 13d92ff26213e9786dd1c8d82e710edf9cf87e0d Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:19:33 -0500 Subject: [PATCH 124/476] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index b575aa4d6..d312bc76d 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) +E.toArrayBuffer(atob("MDCI/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v4AAAAAAAAAAAAAAAAAAAAA/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+AABhjIyMjIyMjIyMjIyMjIzXAAAA/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/gAAYYyMjIyMjIyMjIyMjIyMjIyMjIzXAP7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+AGGMjIyMjIyMjIyMjIyMjIyMjIyMjIyM1wD+/v7+/v7+/v7+/v7+/v7+/v7+/v4AjIyMjIyMjIyMjIyMjIyMjIyMjNfXjIyMjNcA/v7+/v7+/v7+/v7+/v7+/v7+/gBhjIyMjIyMjIyMjIyMjIyMjIyMjIzX14yMjIwA/v7+/v7+/v7+/v7+/v7+/v7+/gCMjIyMjIyMjIyMjIyMjIyMjIyMjIyM19eMjIzXAP7+/v7+/v7+/v7+/v7+/v7+/gCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjNeMjIyMAP7+/v7+/v7+/v7+/v7+/v7+AGGMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQD+/v7+/v7+/v7+/v7+/v7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/g==")) From dd15188a59c7d7958606da5d13d738f71732dfca Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:20:52 -0500 Subject: [PATCH 125/476] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index d312bc76d..76b2a598f 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("MDCI/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v4AAAAAAAAAAAAAAAAAAAAA/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+AABhjIyMjIyMjIyMjIyMjIzXAAAA/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/gAAYYyMjIyMjIyMjIyMjIyMjIyMjIzXAP7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+AGGMjIyMjIyMjIyMjIyMjIyMjIyMjIyM1wD+/v7+/v7+/v7+/v7+/v7+/v7+/v4AjIyMjIyMjIyMjIyMjIyMjIyMjNfXjIyMjNcA/v7+/v7+/v7+/v7+/v7+/v7+/gBhjIyMjIyMjIyMjIyMjIyMjIyMjIzX14yMjIwA/v7+/v7+/v7+/v7+/v7+/v7+/gCMjIyMjIyMjIyMjIyMjIyMjIyMjIyM19eMjIzXAP7+/v7+/v7+/v7+/v7+/v7+/gCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjNeMjIyMAP7+/v7+/v7+/v7+/v7+/v7+AGGMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjAD+/v7+/v7+/v7+/v7+/v7+AGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQD+/v7+/v7+/v7+/v7+/v7+/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/g==")) +E.toArrayBuffer(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) From a2291e928efb0be0884e82f0a89b0e879721ac95 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:22:20 -0500 Subject: [PATCH 126/476] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index 76b2a598f..68d1abd03 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -E.toArrayBuffer(atob("mEwxH+AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AB8AABwtfsOMABnXGTYtQGQwuXFqYwZgAqT64wYLqowFF6iMWGAZgTF6wrBMCrsXAAwwQLy4v/F/FhADjwSADguQAH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AXA")) +require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AH4A/AH4AGgAAGCx8iAAsvgEBCyYAC+AWKiAWJGIIwKgQVI/4wLFxUv+UikBGUGAJIJLxgCBC5BeJAAhIIC/4XfiEAABjwKAH4A/AH4A/AH4A/AFI")) From 31563c13c8dcfe6c484a7f9557f0a1345c5efbab Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:24:56 -0500 Subject: [PATCH 127/476] Update app-icon.js --- apps/slimehunt/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app-icon.js b/apps/slimehunt/app-icon.js index 68d1abd03..36486cb8a 100644 --- a/apps/slimehunt/app-icon.js +++ b/apps/slimehunt/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwkBiIA/AH4A/AH4A/AH4AGgAAGCx8iAAsvgEBCyYAC+AWKiAWJGIIwKgQVI/4wLFxUv+UikBGUGAJIJLxgCBC5BeJAAhIIC/4XfiEAABjwKAH4A/AH4A/AH4A/AFI")) +require("heatshrink").decompress(atob("mEwxH+If4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH9bxgAM1gtsGTwtTGDVhFSPX64wZLqgwFF6iMVGAhgUF6owBMCzsWAAthL1AAGF/4vxrdhADVbeCQA/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4AFA")) From b8773d064635110095527ecdb9365eef04d54eab Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Mon, 20 Dec 2021 19:27:05 -0500 Subject: [PATCH 128/476] Add files via upload --- apps/slimehunt/app.png | Bin 0 -> 217 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/slimehunt/app.png diff --git a/apps/slimehunt/app.png b/apps/slimehunt/app.png new file mode 100644 index 0000000000000000000000000000000000000000..208e68f463b57658c478b548886bdb8315d8d702 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)I7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=y0_nJQHf`U-Zr;3EbjkDo|Nr@C-PfMKzXvG6S>O>_%)r2R2!t6$ zHM|;tg1(+Ejv*GOlO Date: Mon, 20 Dec 2021 19:30:45 -0500 Subject: [PATCH 129/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8a2513f33..4ffda8624 100644 --- a/apps.json +++ b/apps.json @@ -4864,7 +4864,7 @@ "icon": "app.png", "version":"0.01", "description": "Fight against slimes in turn based combat, try to get the highscore!", - "tags": "rpg", + "tags": "rpg,slime", "supports" : ["BANGLEJS"], "storage": [ {"name":"slimehunt.app.js","url":"app.js"}, From 75e5e9490d4852c4c5e0fb6d9fd9a9a8b85e629d Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 16:35:34 -0800 Subject: [PATCH 130/476] no need for app.js so I deleted it --- apps/promenu/app.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/promenu/app.js diff --git a/apps/promenu/app.js b/apps/promenu/app.js deleted file mode 100644 index 8b1378917..000000000 --- a/apps/promenu/app.js +++ /dev/null @@ -1 +0,0 @@ - From d7582e5972973a0917a5387dc12046aabb8d9094 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 16:36:07 -0800 Subject: [PATCH 131/476] Update boot.js update that solves text overlaying text --- apps/promenu/boot.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 20c5af8f5..26042d620 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -1,3 +1,6 @@ +Bangle.loadWidgets(); +Bangle.drawWidgets(); + E.showMenu = function(items) { function RectRnd(x1,y1,x2,y2,r) { pp = []; @@ -72,6 +75,8 @@ E.showMenu = function(items) { g.setFontAlign(-1,-1); if(loc.translate(name).length >= 15){ g.drawString(loc.translate(name).substring(0, 15)+"...",x+8,iy+4); + }else if(loc.translate(name).length >= 10 && "object" == typeof item){ + g.drawString(loc.translate(name).substring(0, 10)+"...",x+8,iy+4); }else{ g.drawString(loc.translate(name),x+8,iy+4); } From 2279358f950242eb29c4e0dccc4b541a98e2e22e Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Mon, 20 Dec 2021 16:40:06 -0800 Subject: [PATCH 132/476] Update boot.js fix overlapping text bug --- apps/promenu/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 26042d620..cbaa91815 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -75,7 +75,7 @@ E.showMenu = function(items) { g.setFontAlign(-1,-1); if(loc.translate(name).length >= 15){ g.drawString(loc.translate(name).substring(0, 15)+"...",x+8,iy+4); - }else if(loc.translate(name).length >= 10 && "object" == typeof item){ + }else if(loc.translate(name).length >= 15 && "object" == typeof item){ g.drawString(loc.translate(name).substring(0, 10)+"...",x+8,iy+4); }else{ g.drawString(loc.translate(name),x+8,iy+4); From f796bbfe5c1c90840092772df0d04fffd0f1986a Mon Sep 17 00:00:00 2001 From: xxDUxx <96152564+xxDUxx@users.noreply.github.com> Date: Tue, 21 Dec 2021 12:24:28 +0100 Subject: [PATCH 133/476] Update apps.json --- apps.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps.json b/apps.json index 7c226818f..2a47d5d80 100644 --- a/apps.json +++ b/apps.json @@ -5061,6 +5061,8 @@ "storage": [ {"name":"contourclock.app.js","url":"app.js"}, {"name":"contourclock.img","url":"app-icon.js","evaluate":true} + ] + }, { "id": "ltherm", "name": "Localized Thermometer", From 9cc8afa833a615ee1a6edef2895faafda345f866 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 12:15:02 -0500 Subject: [PATCH 134/476] Create README.md --- apps/slimehunt/README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 apps/slimehunt/README.md diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md new file mode 100644 index 000000000..d64b44300 --- /dev/null +++ b/apps/slimehunt/README.md @@ -0,0 +1,40 @@ +<><><><>-SLIME HUNT-<><><><> + +Slime Hunt is a RPG turn-based style combat game where you fight slimes until your HP runs out. + +During each fight the player has 3 options, + +BTN1) FIGHT - Attacks the slime, dealing 1 hp worth of damage. + +BTN2) DEFEND - Defends against the slime, blocking 3 damage from the next slime attack. + +BTN3) RUN - Find a new slime to fight against. (This could change in the future!) + + + +There are currently 5 types of slime each with unique behavior. + +<><>-BEHAVIORS-<><> + +NEUTRAL - Slime deals 0-1 damage on it's next attack. + +ANGRY - Slime deals 3-5 damage on it's next attack. + +ERACTIC - Slime deals 0-5 damage on it's next attack. + + +<><>-SLIMES-<><> + +1. GREEN SLIME - Is always neutral. + +2. RED SLIME - Can be either neutral or angry. + +3. GRAY SLIME - Can be neutral, angry or eratic. + +4. YELLOW SLIME - Is always eratic. + +5. PURPLE SLIME - Is always angry. + + + +Created by Colton LaChance! From e1a0539bcf5b2b06be082b3c017c5aaea97fc0f5 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 12:15:46 -0500 Subject: [PATCH 135/476] Update README.md --- apps/slimehunt/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md index d64b44300..830e55d1b 100644 --- a/apps/slimehunt/README.md +++ b/apps/slimehunt/README.md @@ -2,6 +2,8 @@ Slime Hunt is a RPG turn-based style combat game where you fight slimes until your HP runs out. +The main goal is to beat your personal highscore! + During each fight the player has 3 options, BTN1) FIGHT - Attacks the slime, dealing 1 hp worth of damage. From c33ce67b567e58b4a90f983fb7dfda699ac967b1 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 12:16:00 -0500 Subject: [PATCH 136/476] Update README.md --- apps/slimehunt/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md index 830e55d1b..5bd404e55 100644 --- a/apps/slimehunt/README.md +++ b/apps/slimehunt/README.md @@ -4,6 +4,7 @@ Slime Hunt is a RPG turn-based style combat game where you fight slimes until yo The main goal is to beat your personal highscore! + During each fight the player has 3 options, BTN1) FIGHT - Attacks the slime, dealing 1 hp worth of damage. From 0bda621938454e5544ec296fc9a3b8ba6b39cf45 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 12:17:20 -0500 Subject: [PATCH 137/476] Update README.md --- apps/slimehunt/README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md index 5bd404e55..4cd6bc1ab 100644 --- a/apps/slimehunt/README.md +++ b/apps/slimehunt/README.md @@ -1,9 +1,10 @@ -<><><><>-SLIME HUNT-<><><><> +=========================<><><><>-SLIME HUNT-<><><><>======================== Slime Hunt is a RPG turn-based style combat game where you fight slimes until your HP runs out. The main goal is to beat your personal highscore! +=========================================================================== During each fight the player has 3 options, @@ -13,11 +14,11 @@ BTN2) DEFEND - Defends against the slime, blocking 3 damage from the next slime BTN3) RUN - Find a new slime to fight against. (This could change in the future!) - +=========================================================================== There are currently 5 types of slime each with unique behavior. -<><>-BEHAVIORS-<><> +============================<><>-BEHAVIORS-<><>============================ NEUTRAL - Slime deals 0-1 damage on it's next attack. @@ -26,7 +27,7 @@ ANGRY - Slime deals 3-5 damage on it's next attack. ERACTIC - Slime deals 0-5 damage on it's next attack. -<><>-SLIMES-<><> +============================<><>-SLIMES-<><>============================ 1. GREEN SLIME - Is always neutral. @@ -38,6 +39,6 @@ ERACTIC - Slime deals 0-5 damage on it's next attack. 5. PURPLE SLIME - Is always angry. - +=========================================================================== Created by Colton LaChance! From 4b011befa1622b07ce307763850a2b5a150d09ca Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 12:18:39 -0500 Subject: [PATCH 138/476] Update apps.json --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 4ffda8624..ed2b9a903 100644 --- a/apps.json +++ b/apps.json @@ -4865,7 +4865,8 @@ "version":"0.01", "description": "Fight against slimes in turn based combat, try to get the highscore!", "tags": "rpg,slime", - "supports" : ["BANGLEJS"], + "supports" : ["BANGLEJS"], + "readme": "README.md", "storage": [ {"name":"slimehunt.app.js","url":"app.js"}, {"name":"slimehunt.img","url":"app-icon.js","evaluate":true} From 48da0cbacfff51febdc72c952bb21b45ca644764 Mon Sep 17 00:00:00 2001 From: Craig Millett Date: Tue, 21 Dec 2021 12:11:30 -0700 Subject: [PATCH 139/476] Update calendar.js If week is set to start on Sunday, make Saturday (last row) and Sunday (first row) have weekend colors. --- apps/calendar/calendar.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/calendar/calendar.js b/apps/calendar/calendar.js index 01977570a..00e7d54cc 100644 --- a/apps/calendar/calendar.js +++ b/apps/calendar/calendar.js @@ -110,10 +110,19 @@ function drawCalendar(date) { g.clearRect(0, 0, maxX, maxY); g.setBgColor(bgColorMonth); g.clearRect(0, 0, maxX, headerH); - g.setBgColor(bgColorDow); - g.clearRect(0, headerH, maxX, headerH + rowH); - g.setBgColor(bgColorWeekend); - g.clearRect(colW * 5, headerH + rowH, maxX, maxY); + if (settings.startOnSun){ + g.setBgColor(bgColorWeekend); + g.clearRect(0, headerH + rowH, colW, maxY); + g.setBgColor(bgColorDow); + g.clearRect(0, headerH, maxX, headerH + rowH); + g.setBgColor(bgColorWeekend); + g.clearRect(colW * 6, headerH + rowH, maxX, maxY); + } else { + g.setBgColor(bgColorDow); + g.clearRect(0, headerH, maxX, headerH + rowH); + g.setBgColor(bgColorWeekend); + g.clearRect(colW * 5, headerH + rowH, maxX, maxY); + } for (let y = headerH; y < maxY; y += rowH) { g.drawLine(0, y, maxX, y); } From 7119eda34566b87ac40d64dab8e7b2036ef0cfd1 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:09:36 -0500 Subject: [PATCH 140/476] Update app.js --- apps/slimehunt/app.js | 344 +++++++++++++++++++++++++++++------------- 1 file changed, 240 insertions(+), 104 deletions(-) diff --git a/apps/slimehunt/app.js b/apps/slimehunt/app.js index 255399072..106b567c1 100644 --- a/apps/slimehunt/app.js +++ b/apps/slimehunt/app.js @@ -1,11 +1,26 @@ -//Create constants -const GREEN_SLIME = 1; //Normal slime, is always neutral. -const PINK_SLIME = 2; //Can get angry -const GRAY_SLIME = 3; //Can be neutral, angry or erratic -const YELLOW_SLIME = 4; //Is always erratic -const PURPLE_SLIME = 5; //Is always angry +//Create constants------------------------------------------------------------------ -//Initialize variables +//Slimes +const GREEN_SLIME = 1; //Normal slime, is always neutral. | 0% Item chance +const PINK_SLIME = 2; //Can get angry. | 10% Item chance +const GRAY_SLIME = 3; //Can be neutral, angry or erratic. | 20% Item chance +const YELLOW_SLIME = 4; //Is always erratic. | 50% Item chance +const PURPLE_SLIME = 5; //Is always angry. | 100% Item chance + +//Items +const ITEM_ATK_UP = 1; //Raises damage dealt by +1 for next battle +const ITEM_DEF_UP = 2; //Reduces all damage by +1 for next battle +const ITEM_HP_UP = 3; //Increases HP by 3 +const ITEM_BLOCK_UP = 4; //Raises defence when defending by from 3 to 5 for next battle +const ITEM_CRIT_UP = 5; //Gives attack a 20% chance to instantly KO slime for next battle + +//Base stats +const BASE_ATK = 1; +const BASE_DEF = 0; +const BASE_BLOCK = 3; +const BASE_CRIT = 0; + +//Initialize variables------------------------------------------------------------------ var playerHP = 20; var slimeHP = 3; var slimeType = GREEN_SLIME; @@ -16,6 +31,19 @@ var slimeState = 0; var showBattleResult = false; var dmgDealt = 0; var playerDefence = 0; +var playerItem = 0; +var critChance = 0; + +//Stats (Modifiers) +var statAtk = 1; +var statDef = 0; +var statBlock = 3; +var statCrit = 0; + +//Item vars +var itemName = ""; +var itemDesc = ""; +var itemChance = 0; var refreshInterval; var waitTime = 0; @@ -25,8 +53,8 @@ var score = 0; var themeNote = 0; -//Load files -var file = require("Storage").open("highscore.txt","r"); +//Load files------------------------------------------------------------------ +var file = require("Storage").open("highscore.txt", "r"); highscore = file.readLine(); if (highscore == undefined) highscore = 0; @@ -36,121 +64,150 @@ var graySlime = require("Storage").read("slimegray.img"); var yellowSlime = require("Storage").read("slimeyellow.img"); var purpleSlime = require("Storage").read("slimepurple.img"); -//UI Stuff +//UI Stuff------------------------------------------------------------------ function drawOpeningUI() { g.clear(); - g.setFont("Vector",screenWidth/15); - g.setFontAlign(0,0); // center font - g.drawString("SLIME HUNT",screenWidth/2,screenHeight*0.1); - g.drawString("-SCORE TO BEAT-",screenWidth/2,screenHeight*0.3); - g.drawString("<><><> "+highscore+" <><><>",screenWidth/2,screenHeight*0.45); - g.setFont("Vector",screenWidth/20); - g.drawString("A Slime approches...",screenWidth/2,screenHeight*0.6); - wait(8,waitForBattle); + g.setFont("Vector", screenWidth / 15); + g.setFontAlign(0, 0); // center font + g.drawString("SLIME HUNT", screenWidth / 2, screenHeight * 0.1); + g.drawString("-SCORE TO BEAT-", screenWidth / 2, screenHeight * 0.3); + g.drawString("<><><> " + highscore + " <><><>", screenWidth / 2, screenHeight * 0.45); + g.setFont("Vector", screenWidth / 20); + g.drawString("A Slime approches...", screenWidth / 2, screenHeight * 0.6); + wait(8, waitForBattle); } function drawSlime() { - switch(slimeType) { + switch (slimeType) { case GREEN_SLIME: - g.drawImage(greenSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); - break; + g.drawImage(greenSlime, screenWidth / 2, screenHeight / 2, { + scale: 4, + rotate: 0 + }); + break; case PINK_SLIME: - g.drawImage(pinkSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); - break; + g.drawImage(pinkSlime, screenWidth / 2, screenHeight / 2, { + scale: 4, + rotate: 0 + }); + break; case GRAY_SLIME: - g.drawImage(graySlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); - break; + g.drawImage(graySlime, screenWidth / 2, screenHeight / 2, { + scale: 4, + rotate: 0 + }); + break; case YELLOW_SLIME: - g.drawImage(yellowSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); - break; + g.drawImage(yellowSlime, screenWidth / 2, screenHeight / 2, { + scale: 4, + rotate: 0 + }); + break; case PURPLE_SLIME: - g.drawImage(purpleSlime,screenWidth/2,screenHeight/2,{scale:4,rotate:0}); - break; + g.drawImage(purpleSlime, screenWidth / 2, screenHeight / 2, { + scale: 4, + rotate: 0 + }); + break; } } function drawBattleUI() { g.clear(); - g.setFont("Vector",screenWidth/8); - g.setFontAlign(0,0); // center font - g.drawString("SLIME HP: " + slimeHP,screenWidth/2,screenHeight*0.1); - g.setFont("Vector",screenWidth/20); + g.setFont("Vector", screenWidth / 8); + g.setFontAlign(0, 0); // center font + g.drawString("SLIME HP: " + slimeHP, screenWidth / 2, screenHeight * 0.1); + g.setFont("Vector", screenWidth / 20); if (!showBattleResult) { - switch(slimeState) { + switch (slimeState) { case 0: - g.drawString("The slime seems neutral...",screenWidth/2,screenHeight*0.25); - break; + g.drawString("The slime seems neutral...", screenWidth / 2, screenHeight * 0.25); + break; case 1: - g.drawString("The slime seems angry...",screenWidth/2,screenHeight*0.25); - break; + g.drawString("The slime seems angry...", screenWidth / 2, screenHeight * 0.25); + break; case 2: - g.drawString("The slime seems eratic...",screenWidth/2,screenHeight*0.25); - break; + g.drawString("The slime seems eratic...", screenWidth / 2, screenHeight * 0.25); + break; } - }else{ + } else { var brString = (turn == 0 ? "The Slime loses " : "You lose "); - g.drawString(brString + dmgDealt + "HP!",screenWidth/2,screenHeight*0.25); + g.drawString(brString + dmgDealt + "HP!", screenWidth / 2, screenHeight * 0.25); } drawSlime(); - g.drawLine(0,screenHeight*0.72,screenWidth,screenHeight*0.72); + g.drawLine(0, screenHeight * 0.72, screenWidth, screenHeight * 0.72); if (turn == 0) { - g.setFont("Vector",screenWidth/15); - g.drawString("Your HP is " + playerHP + ".",screenWidth/2,screenHeight*0.8); - g.setFont("Vector",screenWidth/20); - g.drawString("(B1) FIGHT\t|\t(B2) DEFEND\t|\t(B3) RUN",screenWidth/2,screenHeight*0.9); + g.setFont("Vector", screenWidth / 15); + g.drawString("Your HP is " + playerHP + ".", screenWidth / 2, screenHeight * 0.8); + g.setFont("Vector", screenWidth / 20); + g.drawString("(B1) FIGHT\t|\t(B2) DEFEND\t|\t(B3) RUN", screenWidth / 2, screenHeight * 0.9); } } +//Win / lose functions------------------------------------------------------------------ function win() { - wait(5,winTheme); + wait(5, winTheme); calcScore(slimeType); showBattleResult = false; g.clear(); - g.setFont("Vector",screenWidth/8); - g.setFontAlign(0,0); // center font - g.drawString("YOU WON!",screenWidth/2,screenHeight/2); - g.setFont("Vector",screenWidth/20); - g.drawString("Your score is << " + score + " >>",screenWidth/2,screenHeight*0.75); - g.drawString("Press (B3) to find another slime!",screenWidth/2,screenHeight*0.9); + g.setFont("Vector", screenWidth / 8); + g.setFontAlign(0, 0); // center font + g.drawString("YOU WON!", screenWidth / 2, screenHeight * 0.1); + g.drawLine(0, screenHeight * 0.2, screenWidth, screenHeight * 0.2); + g.setFont("Vector", screenWidth / 12); + g.drawString((playerItem == 0 ? "No Item." : "GOT ITEM!"), screenWidth / 2, screenHeight * 0.27); + g.setFont("Vector", screenWidth / 15); + g.drawString((playerItem == 0 ? "" : "<><> " + itemName + " <><>"), screenWidth / 2, screenHeight * 0.40); + g.setFont("Vector", screenWidth / 20); + g.drawString((playerItem == 0 ? "" : itemDesc), screenWidth / 2, screenHeight * 0.52); + g.drawLine(0, screenHeight * 0.6, screenWidth, screenHeight * 0.6); + g.drawString("Your score is << " + score + " >>", screenWidth / 2, screenHeight * 0.75); + g.drawString("Press (B3) to find another slime!", screenWidth / 2, screenHeight * 0.9); turn = 0; - setWatch(run,BTN3); + setWatch(run, BTN3); } function lose() { - wait(5,loseTheme); + wait(5, loseTheme); playerHP = 20; showBattleResult = false; g.clear(); - g.setFont("Vector",screenWidth/8); - g.setFontAlign(0,0); // center font - g.drawString("You lose...",screenWidth/2,screenHeight/2); - g.setFont("Vector",screenWidth/20); - g.drawString("Your score is << " + score + " >>",screenWidth/2,screenHeight*0.75); - g.drawString("Press (B3) to try again...",screenWidth/2,screenHeight*0.9); + g.setFont("Vector", screenWidth / 8); + g.setFontAlign(0, 0); // center font + g.drawString("You lose...", screenWidth / 2, screenHeight * 0.1); + g.drawLine(0, screenHeight * 0.2, screenWidth, screenHeight * 0.2); + g.setFont("Vector", screenWidth / 12); + g.drawString((score > highscore ? "-NEW HIGHSCORE-" : "-SCORE TO BEAT-"), screenWidth / 2, screenHeight * 0.27); + g.setFont("Vector", screenWidth / 15); + g.drawString((score > highscore ? "<><> " + score + " <><>" : "<><> " + highscore + " <><>"), screenWidth / 2, screenHeight * 0.43); + g.drawLine(0, screenHeight * 0.6, screenWidth, screenHeight * 0.6); + g.setFont("Vector", screenWidth / 20); + g.drawString("Your score is << " + score + " >>", screenWidth / 2, screenHeight * 0.75); + g.drawString("Press (B3) to try again...", screenWidth / 2, screenHeight * 0.9); score = 0; turn = 0; - setWatch(run,BTN3); + setWatch(run, BTN3); } -//Battle Stuff +//Battle Stuff------------------------------------------------------------------ function nextTurn() { turn = (turn == 0 ? 1 : 0); } function slimeFight() { Bangle.beep(100, 500); - switch(slimeState) { + switch (slimeState) { case 0: dmgDealt = Math.floor(Math.random() * 2); - break; + break; case 1: dmgDealt = Math.floor(Math.random() * 3) + 3; - break; + break; case 2: dmgDealt = Math.floor(Math.random() * 6); - break; + break; } - dmgDealt = Math.max(0,dmgDealt - playerDefence); + dmgDealt = Math.max(0, dmgDealt - playerDefence); playerHP -= dmgDealt; slimeAI(); } @@ -158,22 +215,33 @@ function slimeFight() { function fight() { if (turn == 0 && waitTime <= 0) { Bangle.beep(100, 1000); - dmgDealt = 1; - playerDefence = 0; - slimeHP -= dmgDealt; + dmgDealt = statAtk; + playerDefence = statDef; + if (statCrit == 0) { + slimeHP -= dmgDealt; + }else{ + critChance = Math.floor(Math.random() * 100); + if (critChance >= 100-critStat) { + slimeHP = 0; + dmgDealt = 99; + }else{ + slimeHP -= dmgDealt; + } + critChance = 0; + } showBattleResult = true; drawBattleUI(); - wait(5,waitForTurn); + wait(5, waitForTurn); } } function defend() { if (turn == 0 && waitTime <= 0) { dmgDealt = 0; - playerDefence = 3; + playerDefence = statBlock + statDef; showBattleResult = true; drawBattleUI(); - wait(5,waitForTurn); + wait(5, waitForTurn); } } @@ -181,7 +249,7 @@ function run() { if (turn == 0 && waitTime <= 0) { showBattleResult = false; Bangle.beep(200, 4000); - wait(3,waitForBattle); + wait(3, waitForBattle); } } @@ -189,22 +257,23 @@ function run() { function newBattle() { showBattleResult = false; slimeType = Math.floor(Math.random() * 5) + 1; - switch(slimeType) { + useItem(); //Use item at start of new battle + switch (slimeType) { case GREEN_SLIME: slimeHP = 3; - break; + break; case PINK_SLIME: slimeHP = 3; - break; + break; case GRAY_SLIME: slimeHP = 5; - break; + break; case YELLOW_SLIME: slimeHP = 5; - break; + break; case PURPLE_SLIME: slimeHP = 5; - break; + break; } turn = 0; battle(); @@ -213,37 +282,87 @@ function newBattle() { } function battle() { - setWatch(fight,BTN1); - setWatch(defend,BTN2); - setWatch(run,BTN3); + setWatch(fight, BTN1); + setWatch(defend, BTN2); + setWatch(run, BTN3); } function slimeAI() { - switch(slimeType) { + switch (slimeType) { case GREEN_SLIME: slimeState = 0; - break; + break; case PINK_SLIME: slimeState = Math.floor(Math.random() * 2); - break; + break; case GRAY_SLIME: slimeState = Math.floor(Math.random() * 3); - break; + break; case YELLOW_SLIME: slimeState = 2; - break; + break; case PURPLE_SLIME: slimeState = 1; break; } } +//Items------------------------------------------------------------------ +function getItem() { + playerItem = Math.floor(Math.random() * 5) + 1; + switch (playerItem) { + case ITEM_ATK_UP: + itemName = "Attack Up"; + itemDesc = "+1 damage next battle."; + break; + case ITEM_DEF_UP: + itemName = "Defence Up"; + itemDesc = "+1 defence next battle."; + break; + case ITEM_HP_UP: + itemName = "HP Up"; + itemDesc = "+3 HP."; + break; + case ITEM_BLOCK_UP: + itemName = "Block Up"; + itemDesc = "+2 block on DEFEND next battle."; + break; + case ITEM_CRIT_UP: + itemName = "Critical Up"; + itemDesc = "20% chance to crit next battle."; + break; + } +} +function useItem() { + statAtk = BASE_ATK; + statDef = BASE_DEF; + statBlock = BASE_BLOCK; + statCrit = BASE_CRIT; + switch (playerItem) { + case ITEM_ATK_UP: + statAtk = 2; + break; + case ITEM_DEF_UP: + statDef = 1; + break; + case ITEM_HP_UP: + playerHP += 3; + break; + case ITEM_BLOCK_UP: + statBlock = 5; + break; + case ITEM_CRIT_UP: + statCrit = 20; + break; + } + playerItem = 0; +} -//Timed transitions -function wait(duration,waitFunc) { - waitTime = duration; - if (!refreshInterval) - refreshInterval = setInterval(waitFunc, 500); +//Timed transitions------------------------------------------------------------------ +function wait(duration, waitFunc) { + waitTime = duration; + if (!refreshInterval) + refreshInterval = setInterval(waitFunc, 500); } function waitForTurn() { @@ -255,13 +374,13 @@ function waitForTurn() { if (playerHP > 0 && slimeHP > 0) { if (turn == 1) { slimeFight(); - wait(5,waitForTurn); - }else{ + wait(5, waitForTurn); + } else { showBattleResult = false; battle(); } drawBattleUI(); - }else{ + } else { if (playerHP <= 0) { lose(); } @@ -287,54 +406,71 @@ function waitForBattle() { function winTheme() { waitTime--; - Bangle.beep(200, 100*themeNote); + Bangle.beep(200, 100 * themeNote); themeNote++; if (waitTime <= 0) { themeNote = 0; clearInterval(refreshInterval); refreshInterval = undefined; + setWatch(run, BTN3); } Bangle.setLCDPower(1); } function loseTheme() { waitTime--; - Bangle.beep(200, 600-(100*themeNote)); + Bangle.beep(200, 600 - (100 * themeNote)); themeNote++; if (waitTime <= 0) { themeNote = 0; clearInterval(refreshInterval); refreshInterval = undefined; + setWatch(run, BTN3); } Bangle.setLCDPower(1); } -//Calculations +//Calculations------------------------------------------------------------------ function calcScore(slimeType) { - switch(slimeType) { + switch (slimeType) { case GREEN_SLIME: score += 1; + //No items break; case PINK_SLIME: score += 2; + itemChance = Math.floor(Math.random() * 100); + if (itemChance >= 100 - 10) { //100 - ITEM CHANCE % + getItem(); + } break; case GRAY_SLIME: - score += 2; + score += 3; + itemChance = Math.floor(Math.random() * 100); + if (itemChance >= 100 - 25) { //100 - ITEM CHANCE % + getItem(); + } break; case YELLOW_SLIME: score += 5; + itemChance = Math.floor(Math.random() * 100); + if (itemChance >= 100 - 50) { //100 - ITEM CHANCE % + getItem(); + } break; case PURPLE_SLIME: score += 10; + getItem(); break; } if (score > highscore) { file.erase(); - file = require("Storage").open("highscore.txt","w"); + file = require("Storage").open("highscore.txt", "w"); file.write(score); } } + //------------------------------------GAME STARTS HERE ----------------------------------------------- //Load opening UI From 48105f82432143e84bcdfb957e2a3f546ed2ea74 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:14:31 -0500 Subject: [PATCH 141/476] Update README.md --- apps/slimehunt/README.md | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md index 4cd6bc1ab..201c32ab3 100644 --- a/apps/slimehunt/README.md +++ b/apps/slimehunt/README.md @@ -26,18 +26,36 @@ ANGRY - Slime deals 3-5 damage on it's next attack. ERACTIC - Slime deals 0-5 damage on it's next attack. +============================<><>-ITEMS-<><>============================ + +Attack Up ++1 damage next battle. + +Defence Up ++1 defence next battle, stacks with block. Setting defence to 4 when using DEFEND, and 1 otherwise. + +HP Up ++3 HP. + +Block Up ++2 block on DEFEND next battle, setting Defence to 5 when using DEFEND command. + +Critical Up +20% chance to crit next battle on each attack, instantly defeating the Slime. + +*****Using the RUN command causes you to lose your item!***** ============================<><>-SLIMES-<><>============================ -1. GREEN SLIME - Is always neutral. +1. GREEN SLIME - Is always neutral. | 0% chance of item. -2. RED SLIME - Can be either neutral or angry. +2. RED SLIME - Can be either neutral or angry. | 10% chance of item. -3. GRAY SLIME - Can be neutral, angry or eratic. +3. GRAY SLIME - Can be neutral, angry or eratic. | 20% chance of item. -4. YELLOW SLIME - Is always eratic. +4. YELLOW SLIME - Is always eratic. | 50% chance of item. -5. PURPLE SLIME - Is always angry. +5. PURPLE SLIME - Is always angry. | 100% chance of item. =========================================================================== From 9e131d2e7fa1db989e65e4cb29e74cba4cbeb01a Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:15:13 -0500 Subject: [PATCH 142/476] Update README.md --- apps/slimehunt/README.md | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md index 201c32ab3..c22525403 100644 --- a/apps/slimehunt/README.md +++ b/apps/slimehunt/README.md @@ -28,20 +28,15 @@ ERACTIC - Slime deals 0-5 damage on it's next attack. ============================<><>-ITEMS-<><>============================ -Attack Up -+1 damage next battle. +Attack Up - +1 damage next battle. -Defence Up -+1 defence next battle, stacks with block. Setting defence to 4 when using DEFEND, and 1 otherwise. +Defence Up - +1 defence next battle, stacks with block. Setting defence to 4 when using DEFEND, and 1 otherwise. -HP Up -+3 HP. +HP Up - +3 HP. -Block Up -+2 block on DEFEND next battle, setting Defence to 5 when using DEFEND command. +Block Up - +2 block on DEFEND next battle, setting Defence to 5 when using DEFEND command. -Critical Up -20% chance to crit next battle on each attack, instantly defeating the Slime. +Critical Up - 20% chance to crit next battle on each attack, instantly defeating the Slime. *****Using the RUN command causes you to lose your item!***** From bd5bb54b6f6aedc77c16d698030073d62e3fe79d Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:17:45 -0500 Subject: [PATCH 143/476] Create ChangeLog --- apps/slimehunt/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/slimehunt/ChangeLog diff --git a/apps/slimehunt/ChangeLog b/apps/slimehunt/ChangeLog new file mode 100644 index 000000000..067add5a5 --- /dev/null +++ b/apps/slimehunt/ChangeLog @@ -0,0 +1 @@ +0.01: Public version is a go! From 7aedbaf07e430897e34fb09f309a2db475d39ad9 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:23:40 -0500 Subject: [PATCH 144/476] Update README.md --- apps/slimehunt/README.md | 68 ++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 24 deletions(-) diff --git a/apps/slimehunt/README.md b/apps/slimehunt/README.md index c22525403..84d8f2b16 100644 --- a/apps/slimehunt/README.md +++ b/apps/slimehunt/README.md @@ -1,57 +1,77 @@ -=========================<><><><>-SLIME HUNT-<><><><>======================== +<><><><>-SLIME HUNT-<><><><> -Slime Hunt is a RPG turn-based style combat game where you fight slimes until your HP runs out. +Slime Hunt is a RPG turn-based style combat game +where you fight slimes until your HP runs out. The main goal is to beat your personal highscore! -=========================================================================== +============================ During each fight the player has 3 options, -BTN1) FIGHT - Attacks the slime, dealing 1 hp worth of damage. +BTN1) FIGHT +- Attacks the slime, dealing 1 hp worth of damage. -BTN2) DEFEND - Defends against the slime, blocking 3 damage from the next slime attack. +BTN2) DEFEND +- Defends against the slime, blocking 3 damage from the next slime attack. -BTN3) RUN - Find a new slime to fight against. (This could change in the future!) +BTN3) RUN +- Find a new slime to fight against. (This could change in the future!) -=========================================================================== +============================ There are currently 5 types of slime each with unique behavior. -============================<><>-BEHAVIORS-<><>============================ +<><>-BEHAVIORS-<><> -NEUTRAL - Slime deals 0-1 damage on it's next attack. +1. NEUTRAL +- Slime deals 0-1 damage on it's next attack. -ANGRY - Slime deals 3-5 damage on it's next attack. +2. ANGRY +- Slime deals 3-5 damage on it's next attack. -ERACTIC - Slime deals 0-5 damage on it's next attack. +3. ERACTIC +- Slime deals 0-5 damage on it's next attack. -============================<><>-ITEMS-<><>============================ +<><>-ITEMS-<><> -Attack Up - +1 damage next battle. +1. Attack Up +- +1 damage next battle. -Defence Up - +1 defence next battle, stacks with block. Setting defence to 4 when using DEFEND, and 1 otherwise. +2. Defence Up +- +1 defence next battle, stacks with block. +Setting defence to 4 when using DEFEND, and 1 otherwise. -HP Up - +3 HP. +3. HP Up +- +3 HP. -Block Up - +2 block on DEFEND next battle, setting Defence to 5 when using DEFEND command. +4. Block Up +- +2 block on DEFEND next battle, +setting Defence to 5 when using DEFEND command. -Critical Up - 20% chance to crit next battle on each attack, instantly defeating the Slime. +5. Critical Up +- 20% chance to crit next battle on each attack, +instantly defeating the Slime. *****Using the RUN command causes you to lose your item!***** -============================<><>-SLIMES-<><>============================ +<><>-SLIMES-<><> -1. GREEN SLIME - Is always neutral. | 0% chance of item. +1. GREEN SLIME +- Is always neutral. | 0% chance of item. -2. RED SLIME - Can be either neutral or angry. | 10% chance of item. +2. RED SLIME +- Can be either neutral or angry. | 10% chance of item. -3. GRAY SLIME - Can be neutral, angry or eratic. | 20% chance of item. +3. GRAY SLIME +- Can be neutral, angry or eratic. | 20% chance of item. -4. YELLOW SLIME - Is always eratic. | 50% chance of item. +4. YELLOW SLIME +- Is always eratic. | 50% chance of item. -5. PURPLE SLIME - Is always angry. | 100% chance of item. +5. PURPLE SLIME +- Is always angry. | 100% chance of item. -=========================================================================== +============================ Created by Colton LaChance! From 6b58c98be081547324292179e421931195a8cb01 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 15:51:43 -0500 Subject: [PATCH 145/476] Update apps.json --- apps.json | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/apps.json b/apps.json index 85d861a4d..b7102b45f 100644 --- a/apps.json +++ b/apps.json @@ -4875,22 +4875,6 @@ ], "data": [{"name":"ptlaunch.patterns.json"}] }, - { "id": "clicompleteclk", - "name": "CLI complete clock", - "shortName":"CLI cmplt clock", - "version":"0.02", - "description": "Command line styled clock with lots of information", - "icon": "app.png", - "allow_emulator": true, - "type": "clock", - "tags": "clock,cli,command,bash,shell,weather,hrt", - "supports" : ["BANGLEJS", "BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"clicompleteclk.app.js","url":"app.js"}, - {"name":"clicompleteclk.img","url":"app-icon.js","evaluate":true} - ] - }, { "id": "slimehunt", "name": "Slime Hunt", "shortName":"SlimeHunt", From 8897c9aecc8d006a09f85915c970314d6cffc5ff Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 16:13:54 -0500 Subject: [PATCH 146/476] Update app.js --- apps/slimehunt/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/slimehunt/app.js b/apps/slimehunt/app.js index 106b567c1..547ea7356 100644 --- a/apps/slimehunt/app.js +++ b/apps/slimehunt/app.js @@ -221,7 +221,7 @@ function fight() { slimeHP -= dmgDealt; }else{ critChance = Math.floor(Math.random() * 100); - if (critChance >= 100-critStat) { + if (critChance >= 100-statCrit) { slimeHP = 0; dmgDealt = 99; }else{ From c8041295cdc29f441b2f59e6495be5e309547583 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 16:15:16 -0500 Subject: [PATCH 147/476] Update ChangeLog --- apps/slimehunt/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/slimehunt/ChangeLog b/apps/slimehunt/ChangeLog index 067add5a5..eb0cc5918 100644 --- a/apps/slimehunt/ChangeLog +++ b/apps/slimehunt/ChangeLog @@ -1 +1,2 @@ 0.01: Public version is a go! +0.02: Fixed bug where Critial Up wasn't letting player attack. From 5a2ca8219728f525fe0e3e6dd0f788bbd14f4d42 Mon Sep 17 00:00:00 2001 From: ColtJLaCh <91559845+ColtJLaCh@users.noreply.github.com> Date: Tue, 21 Dec 2021 16:32:32 -0500 Subject: [PATCH 148/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b7102b45f..bc4b94522 100644 --- a/apps.json +++ b/apps.json @@ -4879,7 +4879,7 @@ "name": "Slime Hunt", "shortName":"SlimeHunt", "icon": "app.png", - "version":"0.01", + "version":"0.02", "description": "Fight against slimes in turn based combat, try to get the highscore!", "tags": "rpg,slime", "supports" : ["BANGLEJS"], From 9a58a14681f8c112266dde5726097cacbefe6db4 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Tue, 21 Dec 2021 21:46:30 +0000 Subject: [PATCH 149/476] swp2clk: Create Initial app with whitelist feature --- apps.json | 17 +++++ apps/swp2clk/ChangeLog | 1 + apps/swp2clk/README.md | 12 ++++ apps/swp2clk/app-icon.js | 1 + apps/swp2clk/app.pdn | Bin 0 -> 7005 bytes apps/swp2clk/app.png | Bin 0 -> 1569 bytes apps/swp2clk/boot.js | 92 +++++++++++++++++++++++++++ apps/swp2clk/settings.js | 133 +++++++++++++++++++++++++++++++++++++++ 8 files changed, 256 insertions(+) create mode 100644 apps/swp2clk/ChangeLog create mode 100644 apps/swp2clk/README.md create mode 100644 apps/swp2clk/app-icon.js create mode 100644 apps/swp2clk/app.pdn create mode 100644 apps/swp2clk/app.png create mode 100644 apps/swp2clk/boot.js create mode 100644 apps/swp2clk/settings.js diff --git a/apps.json b/apps.json index e5e9f8f02..0a537d676 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,22 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "swp2clk", + "name": "Swipe back to the Clock", + "shortName": "Swipe to Clock", + "version": "0.01", + "description": "Let's you swipe from left to right on any app to return back to the clock face. Please configure in the settings app after installing to activate, since its disabled by default.", + "icon": "app.png", + "tags": "tools", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + { "name": "swp2clk.boot.js", "url": "boot.js" }, + {"name":"swp2clk.settings.js","url":"settings.js"}, + { "name": "swp2clk.img", "url": "app-icon.js", "evaluate": true } + ], + "data": [{"name":"swp2clk.data.json"}] } ] diff --git a/apps/swp2clk/ChangeLog b/apps/swp2clk/ChangeLog new file mode 100644 index 000000000..ea6473980 --- /dev/null +++ b/apps/swp2clk/ChangeLog @@ -0,0 +1 @@ +0.01: Initial creation of "Swipe back to the Clock" App. Let's you swipe from left to right on any app to return back to the clock face. diff --git a/apps/swp2clk/README.md b/apps/swp2clk/README.md new file mode 100644 index 000000000..f6d0dd2b4 --- /dev/null +++ b/apps/swp2clk/README.md @@ -0,0 +1,12 @@ +# Swipe back to the Clock + +Let's you swipe from left to right on any app to return back to the clock face. + +## Configurable Modes: + +The swipe modes can be configured in the settings app, under "Swipe to Clock". + +- Always Off: Deactivated for all apps (Default) +- White List: Only activate for chosen apps, otherwise deactivated for all apps. +- Black List: Only disabled for chosen apps, otherwise activated for all apps. +- Always On: Active for all apps (Not actually recommended! E.g. Games need to be able to deal with swipe gestures) \ No newline at end of file diff --git a/apps/swp2clk/app-icon.js b/apps/swp2clk/app-icon.js new file mode 100644 index 000000000..e59cd6244 --- /dev/null +++ b/apps/swp2clk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkE/4A2+cyiJABiMjn4WPiAVCDIUBDBsyiEBiUzAwMzkIHBl4tMBw/yBIIxKkIME+YEEiESIpMBkYGD+MfKQoMEEQcgiYHE+EPAwkxgRJG+RSGC4xJBNYwuGC44wCD4sRG4wXHCAweGC5JABQAhGHC5IpFiDIHC5HzgIEHC5oqE+JeHC5RgDmBkEC5vxgYXZkDdGC5fyLYSOIC5SLDC5MgQJAXDUxHygEAKREQC5XxC4KCIC8xHLO4/ziERiSPTmI4IC4rXGFwMTC5LXDmBsFFwLHINQUDC44uH+fc54XG+LlE+QuFnvM5gXDkArCMYYFCkYsECwIAHSBIsDC5cgLIoVMC4ZgFC6PziJIFLpYXDJA53PUY6nHZQMvEwwwIa4kxgQmHmUBXoYMHiAMJkJJJIoMSEZIMBgJTG+QJBERAOFiUzAwMzkIgIGJEAgERiIDBFpgYEmQVCiMjCx4AoA=")) \ No newline at end of file diff --git a/apps/swp2clk/app.pdn b/apps/swp2clk/app.pdn new file mode 100644 index 0000000000000000000000000000000000000000..60baf6cab3ff2c1a4c0ed0f096d691b636627b77 GIT binary patch literal 7005 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 LKL52a!)x_F<_%{L literal 0 HcmV?d00001 diff --git a/apps/swp2clk/app.png b/apps/swp2clk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..b964520e684ed24dbe4052cce745c2eea43921ff GIT binary patch literal 1569 zcmV++2HyFJP)Px#1ZP1_K>z@;j|==^1poj77Enx7MgRZ*{{H^@`ug?t_3`oX?(XjF?Ck67>-hNi z*Voslr>Agma7RZ+CMG5k5fKIk1}7&cadB~|sHoW3*!1-D-rnA$qoY$(QxXyq2?+@k z6B8R78zCVfC@3gYR8*v-q}|=!n3$M3IXMmv4j331FE1}!TU(Klk-53K+S=Oi@bLTl z`;d^3T3T8JEo?l3JMB5JUnY_Ye7Ll`T6;_wzfh-LbbKEQBhIc+}un|Odud2RaI5s;NUJU zE)*0LTwGjPSy`&8s*aA1a&mIJySuo!xJgM#BqSsvA|l({+XV#$B_$;Q001;JGy(zw z2L}f@I5;yiGrGFE3=9lEKR?sc(@IK84Gj%OMn=%k&=3$1)z#Ji*Vn77tN;7^|GT^Y zaB%-1ApZaW-{0SUetsMr9RKt4|EH(_TwMPU5SN#iR#sN6t*w21egEU*|Cg8lL`44x z2>;K||AT}7G&KMB_y25c|F5tAWMuyo6#u`!|0E>;)6@SrICXV(|C^itNJ!)3B2^e;OJZqN1WpOG}TBj~*T#Qc_ay@9&(PoCpXAS65d$gE8=cCr5lsMH#q&}s=> zqgDarTo*tRDXD3?^i6vGrp>x7TQdl9BMmSZGq+JD+H6T@m~@MoHqqOyM#H)i(w3EN zcjV;m$aCfw6y!Ve3U}r>?5-jsi2|emytssNdrG}5azNN!MIJZhDZ>>8@p;Rcib{VK zGI#Gm6~bB_2-bLg$P{2hwc)yYo6ytV98|%8EfNezL!xmxe9nf(Sd#`>kmhDofoS|K zfqfy#7{D8?*k9a=EDo^%Q?<1>)_TS3z{|re9g;yM0*oz-g==tRK*(aIE>+xrvH)xK z2ZJ5L?gCp$MZIYL97zI96A5%06O%GzQI$4SPmnCYy1J=S178Kk>;p~7CnFPpOt%XS zL0avdiSrVW2{3Jm-OsOr*ybpWSH#E#SeBzF-Y>|YbG&hn7zIIZ-$5rgCsnHHP|~?W z6a;L)X+Q-_bsD{c_lQvtV1v|<8WtLz`7rMgqa+wMk8r1jA2~Y8JJu*D9~&DiK!!lb zlFp?EL5+*Dgr}UEn4kxdA%Kt51T3_AhFgk+W0MmTlgE%D(8?Uw!a_j+PH+MjvILMo zJ|)n5a%^%^zISL!vPJtw+f64=WEaXNiWUvG^%U>mVN-Oc&j^_;25l=mxI*3$hn+fm z?)<1yeB$6>YUHk^20LASL3dGd;V+>Qrp9G%nq2bj;$4tw4^=(2rk|O;a&->X=TY)u z#CAtf+{1D0x@S5Ozi?ym<{Si>OO9LowITg>k8pu*-$C(r@7;gEMJEHBfYIglOIP`D z`4MWD!8IF-sOq&x;PLE}tFS?_dk7Z-jGjP5cxE0yefAtRDiMz%%Ys3_=pmbVapfgy zm%&HiHQ`v9^q#(2evLw;@U6i620q5gADX*w-^EvgwRW^OMpq>J!aescYtnNGS$Mzr zd@kP_t7wou_wd|9(Qq)*rI14(K7L|8zi~<@4Doquf`RT#F5x9;zkChUt**#ES#TYA zM { + var settings = readSettings(); + + if (settings.addSwipeHandler) { + var swipeHandler = (dir) => { + log("swipe"); + log(dir); + if (dir === 1) { + load(); + } + }; + Bangle.on("swipe", swipeHandler); + } + + var global_load = global.load; + global.load = (fileName) => { + log("loading filename!"); + log(fileName); + var settings = readSettings(); + + if (fileName) { + // "Off" + if (settings.mode === 0) { + settings.addSwipeHandler = false; + } + + // "White List" + if (settings.mode === 1) { + if (settings.whiteList.indexOf(fileName) >= 0) { + settings.addSwipeHandler = true; + } else { + settings.addSwipeHandler = false; + } + } + + // "Black List" + if (settings.mode === 2) { + if (settings.blackList.indexOf(fileName) >= 0) { + settings.addSwipeHandler = false; + } else { + settings.addSwipeHandler = true; + } + } + + // "Always" + if (settings.mode === 3) { + settings.addSwipeHandler = true; + } + } else { + // Clock will load + settings.addSwipeHandler = false; + } + + writeSettings(settings); + global_load(fileName); + }; + }; + + // lib functions + + var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } + }; + + var readSettings = () => { + log("reading settings"); + var settings = require("Storage").readJSON(FILE, 1) || { + mode: 0, + whiteList: [], + blackList: [], + addSwipeHandler: false, + }; + log(settings); + return settings; + }; + + var writeSettings = (settings) => { + log("writing settings"); + log(settings); + require("Storage").writeJSON(FILE, settings); + }; + + // start main function + + main(); +})(); diff --git a/apps/swp2clk/settings.js b/apps/swp2clk/settings.js new file mode 100644 index 000000000..8af34fe68 --- /dev/null +++ b/apps/swp2clk/settings.js @@ -0,0 +1,133 @@ +(function (back) { + var DEBUG = true; + var FILE = "swp2clk.data.json"; + + var settings = {}; + + var showMainMenu = () => { + log("Loading main menu"); + + E.showMenu({ + "": { title: "Swipe to Clock" }, + "< Back": () => back(), + Mode: { + value: settings.mode, + min: 0, + max: 3, + format: (value) => ["Off", "White List", "Black List", "Always"][value], + onchange: (value) => { + settings.mode = value; + writeSettings(settings); + }, + }, + "White List": () => showWhiteListMenu(), + "Black List": () => {}, + }); + }; + + var showWhiteListMenu = () => { + var appList = getAppList(); + + var whiteListMenu = { + "": { title: "White List" }, + "< Back": () => showMainMenu(), + "_Add App_": () => { + var addAppMenu = { + "": { title: "Add to WL" }, + "< Back": () => showWhiteListMenu(), + }; + + appList.forEach((app) => { + if (settings.whiteList.indexOf(app.src) < 0) { + addAppMenu[app.name] = () => { + settings.whiteList.push(app.src); + writeSettings(settings); + showWhiteListMenu(); + }; + } + }); + + E.showMenu(addAppMenu); + }, + }; + + appList.forEach((app) => { + if (settings.whiteList.indexOf(app.src) >= 0) { + whiteListMenu[app.name] = () => { + E.showPrompt("Delete from WL?", { + title: "Delete from WL?", + buttons: { Yes: true, No: false }, + }).then(function (flag) { + if (flag) { + settings.whiteList.splice(index, 1); + writeSettings(settings); + } + + showWhiteListMenu(); + }); + }; + } + }); + + log("Loading white list menu"); + E.showMenu(whiteListMenu); + }; + + // lib functions + + var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } + }; + + var readSettings = () => { + log("reading settings"); + var settings = require("Storage").readJSON(FILE, 1) || { + mode: 0, + whiteList: [], + blackList: [], + addSwipeHandler: false, + }; + log(settings); + return settings; + }; + + var writeSettings = (settings) => { + log("writing settings"); + log(settings); + require("Storage").writeJSON(FILE, settings); + }; + + var getAppList = () => { + var appList = storage + .list(/\.info$/) + .map((appInfoFileName) => { + var appInfo = storage.readJSON(appInfoFileName, 1); + return ( + appInfo && { + name: appInfo.name, + // type: appInfo.type, + // icon: appInfo.icon, + sortorder: appInfo.sortorder, + src: appInfo.src, + } + ); + }) + .filter((app) => app && !!app.src); + appList.sort((a, b) => { + var n = (0 | a.sortorder) - (0 | b.sortorder); + if (n) return n; // do sortorder first + if (a.name < b.name) return -1; + if (a.name > b.name) return 1; + return 0; + }); + + return appList; + }; + + // start main function + + settings = readSettings(); + showMainMenu(); +}); From a90315ef45c3eadf7ebb95b6359671b2dbba1357 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Tue, 21 Dec 2021 22:12:30 +0000 Subject: [PATCH 150/476] swp2clk: Add blacklist feature --- apps/swp2clk/settings.js | 52 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/apps/swp2clk/settings.js b/apps/swp2clk/settings.js index 8af34fe68..1e29e5a6c 100644 --- a/apps/swp2clk/settings.js +++ b/apps/swp2clk/settings.js @@ -21,7 +21,7 @@ }, }, "White List": () => showWhiteListMenu(), - "Black List": () => {}, + "Black List": () => showBlackListMenu(), }); }; @@ -33,7 +33,7 @@ "< Back": () => showMainMenu(), "_Add App_": () => { var addAppMenu = { - "": { title: "Add to WL" }, + "": { title: "Add app to WL" }, "< Back": () => showWhiteListMenu(), }; @@ -73,6 +73,54 @@ E.showMenu(whiteListMenu); }; + var showBlackListMenu = () => { + var appList = getAppList(); + + var blackListMenu = { + "": { title: "Black List" }, + "< Back": () => showMainMenu(), + "_Add App_": () => { + var addAppMenu = { + "": { title: "Add app to BL" }, + "< Back": () => showBlackListMenu(), + }; + + appList.forEach((app) => { + if (settings.blackList.indexOf(app.src) < 0) { + addAppMenu[app.name] = () => { + settings.blackList.push(app.src); + writeSettings(settings); + showBlackListMenu(); + }; + } + }); + + E.showMenu(addAppMenu); + }, + }; + + appList.forEach((app) => { + if (settings.blackList.indexOf(app.src) >= 0) { + blackListMenu[app.name] = () => { + E.showPrompt("Delete from BL?", { + title: "Delete from BL?", + buttons: { Yes: true, No: false }, + }).then(function (flag) { + if (flag) { + settings.blackList.splice(index, 1); + writeSettings(settings); + } + + showBlackListMenu(); + }); + }; + } + }); + + log("Loading black list menu"); + E.showMenu(blackListMenu); + }; + // lib functions var log = (message) => { From 3c510db6a8ee8f65a8b270be7f4feaa383a8693a Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 00:25:01 +0100 Subject: [PATCH 151/476] Create app.js --- apps/supf/app.js | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 apps/supf/app.js diff --git a/apps/supf/app.js b/apps/supf/app.js new file mode 100644 index 000000000..6f9d264a0 --- /dev/null +++ b/apps/supf/app.js @@ -0,0 +1,56 @@ +require("Font7x11Numeric7Seg").add(Graphics); + +function draw() { + var d = new Date(); + //d.setHours(22); + //d.setMinutes(22); + //d.setMonth(2); + var size = Math.floor(g.getWidth()/(7*6)); + var x = (g.getWidth()/2) - size*6, + y = (g.getHeight()/2) - size*7 - 0; + var y_dop = 70 - 0; + g.reset().clearRect(0,y,g.getWidth(),y+size*12+8); + g.setFont("7x11Numeric7Seg",size).setFontAlign(1,-1); + //g.drawString(d.getHours()+''+("0"+d.getMinutes()).substr(-2)+''+("0"+d.getSeconds()).substr(-2), x+size*28, y); + if (d.getHours() == '0') { + g.drawString('0'+d.getHours(), 58, y); + } + else { + g.drawString(d.getHours(), 58, y); + } + //g.setFontAlign(-1,-1); + g.setFont("7x11Numeric7Seg",size/2).setFontAlign(1,-1); + g.drawString(":",64,y_dop); + g.setFont("7x11Numeric7Seg",size).setFontAlign(1,-1); + g.drawString(("0"+d.getMinutes()).substr(-2),118,y); + g.setFont("7x11Numeric7Seg",size/2).setFontAlign(1,-1); + g.drawString(":",124,y_dop); + // draw seconds + g.setFont("7x11Numeric7Seg",size).setFontAlign(1,-1); + g.drawString(("0"+d.getSeconds()).substr(-2),178,y); + // date + g.setFont("6x8",size/2).setFontAlign(0,-1); + var s_date_string = d.getDate()+' '+require('locale').month(new Date()); + g.drawString(require('locale').dow(new Date()),g.getWidth()/2, y + size*16); + g.drawString(s_date_string,g.getWidth()/2, y + size*20); + g.drawString((d.getFullYear()),g.getWidth()/2, y + size*24); + +} +// Only update when display turns on +if (process.env.BOARD!="SMAQ3") // hack for Q3 which is always-on +Bangle.on('lcdPower', function(on) { + if (secondInterval) + clearInterval(secondInterval); + secondInterval = undefined; + if (on) + secondInterval = setInterval(draw, 1000); + draw(); +}); + +g.clear(); +var secondInterval = setInterval(draw, 1000); +draw(); +// Show launcher when button pressed +Bangle.setUI("clock"); +Bangle.loadWidgets(); +Bangle.drawWidgets(); From 519330adc09f895a155386c1f1cd9025eac036dd Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 00:33:32 +0100 Subject: [PATCH 152/476] Create app-icon.js --- apps/supf/app-icon.js | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/supf/app-icon.js diff --git a/apps/supf/app-icon.js b/apps/supf/app-icon.js new file mode 100644 index 000000000..e05e934b2 --- /dev/null +++ b/apps/supf/app-icon.js @@ -0,0 +1,2 @@ +require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) +} From b753c119f180dd0845b7cb9704d96fcf615bc1af Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 00:39:11 +0100 Subject: [PATCH 153/476] Create supf.info --- apps/supf/supf.info | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/supf/supf.info diff --git a/apps/supf/supf.info b/apps/supf/supf.info new file mode 100644 index 000000000..c8b613049 --- /dev/null +++ b/apps/supf/supf.info @@ -0,0 +1 @@ +{"id":"supf","name":"Simple Clock with seconds and Date in custom language","type":"clock","src":"supf.app.js","icon":"supf.img","version":"0.01","tags":"clock","files":"supf.info,supf.app.js,app-icon.js"} From 71200f68216aeb3c31825d6de81042d7ab0a61f4 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 00:39:36 +0100 Subject: [PATCH 154/476] Create readme.md --- apps/supf/readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/supf/readme.md diff --git a/apps/supf/readme.md b/apps/supf/readme.md new file mode 100644 index 000000000..0001ad69c --- /dev/null +++ b/apps/supf/readme.md @@ -0,0 +1 @@ +Simple Clock with seconds and Date in custom language From d3e914a9e14b3d3f4fbcf165f057dcb6cac920d4 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 00:46:38 +0100 Subject: [PATCH 155/476] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..0ce8a78cd 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,22 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "supf", + "name": "supf Simple Clock with seconds and Date in custom language", + "shortName": "supf Clock", + "version": "0.01", + "description": "Displays the current temperature in localized units.", + "icon": "thermf.png", + "tags": "clock", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + {"name":"supf.app.js","url":"app.js"}, + {"name":"supf.img","url":"app-icon.js","evaluate":true}, + {"name":"supf.info","url":"supf.info","evaluate":true} + ] } ] From 1b5b3016c2394d3599765b9cd1eccdf5588e2391 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:11:42 +0100 Subject: [PATCH 156/476] Update app.js --- apps/supf/app.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/supf/app.js b/apps/supf/app.js index 6f9d264a0..d7a30aed9 100644 --- a/apps/supf/app.js +++ b/apps/supf/app.js @@ -2,26 +2,24 @@ require("Font7x11Numeric7Seg").add(Graphics); function draw() { var d = new Date(); - //d.setHours(22); - //d.setMinutes(22); - //d.setMonth(2); var size = Math.floor(g.getWidth()/(7*6)); var x = (g.getWidth()/2) - size*6, y = (g.getHeight()/2) - size*7 - 0; + // y variable for ':' var y_dop = 70 - 0; - g.reset().clearRect(0,y,g.getWidth(),y+size*12+8); + g.reset().clearRect(0,y,g.getWidth(),y+size*28); + // draw hours in 24h format g.setFont("7x11Numeric7Seg",size).setFontAlign(1,-1); - //g.drawString(d.getHours()+''+("0"+d.getMinutes()).substr(-2)+''+("0"+d.getSeconds()).substr(-2), x+size*28, y); - if (d.getHours() == '0') { + if (d.getHours().toString.length < 2) { g.drawString('0'+d.getHours(), 58, y); } else { g.drawString(d.getHours(), 58, y); } - //g.setFontAlign(-1,-1); g.setFont("7x11Numeric7Seg",size/2).setFontAlign(1,-1); g.drawString(":",64,y_dop); g.setFont("7x11Numeric7Seg",size).setFontAlign(1,-1); + // draw minutes g.drawString(("0"+d.getMinutes()).substr(-2),118,y); g.setFont("7x11Numeric7Seg",size/2).setFontAlign(1,-1); g.drawString(":",124,y_dop); @@ -30,9 +28,11 @@ function draw() { g.drawString(("0"+d.getSeconds()).substr(-2),178,y); // date g.setFont("6x8",size/2).setFontAlign(0,-1); - var s_date_string = d.getDate()+' '+require('locale').month(new Date()); + // draw name of day g.drawString(require('locale').dow(new Date()),g.getWidth()/2, y + size*16); - g.drawString(s_date_string,g.getWidth()/2, y + size*20); + // draw date and name of month + g.drawString(d.getDate()+' '+require('locale').month(new Date()),g.getWidth()/2, y + size*20); + // draw year g.drawString((d.getFullYear()),g.getWidth()/2, y + size*24); } From 9719b1277fc71801312358b1d9fda05c1a80e6c6 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:13:20 +0100 Subject: [PATCH 157/476] Update readme.md --- apps/supf/readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/supf/readme.md b/apps/supf/readme.md index 0001ad69c..e4008556e 100644 --- a/apps/supf/readme.md +++ b/apps/supf/readme.md @@ -1 +1,2 @@ Simple Clock with seconds and Date in custom language +ATTENTION: requires Languages app From f5bcf45e36ae3fd152a45eace60ada7512b7b70c Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:22:36 +0100 Subject: [PATCH 158/476] Update supf.info --- apps/supf/supf.info | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/supf/supf.info b/apps/supf/supf.info index c8b613049..dc0a49a0d 100644 --- a/apps/supf/supf.info +++ b/apps/supf/supf.info @@ -1 +1 @@ -{"id":"supf","name":"Simple Clock with seconds and Date in custom language","type":"clock","src":"supf.app.js","icon":"supf.img","version":"0.01","tags":"clock","files":"supf.info,supf.app.js,app-icon.js"} +{"id":"supf","name":"Simple Clock with Date","type":"clock","src":"supf.app.js","icon":"supf.img","version":"0.01","tags":"clock","files":"supf.info,supf.app.js,app-icon.js"} From da33ef1cbed22cefdbd886af5acb2cdf950d68c5 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:25:29 +0100 Subject: [PATCH 159/476] Add files via upload --- apps/supf/screenshot_supf.png | Bin 0 -> 10477 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/supf/screenshot_supf.png diff --git a/apps/supf/screenshot_supf.png b/apps/supf/screenshot_supf.png new file mode 100644 index 0000000000000000000000000000000000000000..18e391f28287c45e6d12dafbc3da4ce2868c4cd2 GIT binary patch literal 10477 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 literal 0 HcmV?d00001 From bdc066ed79e96c211b9f27b33b82a9479eca5d64 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:26:49 +0100 Subject: [PATCH 160/476] Update readme.md --- apps/supf/readme.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/supf/readme.md b/apps/supf/readme.md index e4008556e..5b80152c3 100644 --- a/apps/supf/readme.md +++ b/apps/supf/readme.md @@ -1,2 +1,4 @@ -Simple Clock with seconds and Date in custom language +# Simple Clock with seconds and Date in custom language ATTENTION: requires Languages app + +![](screenshot_supf.png) From e4c8f3991385e681ac7c9764ae7b8d273ac785d3 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:27:52 +0100 Subject: [PATCH 161/476] Create ChangeLog --- apps/supf/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/supf/ChangeLog diff --git a/apps/supf/ChangeLog b/apps/supf/ChangeLog new file mode 100644 index 000000000..55ebb3e4b --- /dev/null +++ b/apps/supf/ChangeLog @@ -0,0 +1 @@ +0.01: New App From a5c69fba73310b484aff5d61ac49a30eb996ce9c Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:30:21 +0100 Subject: [PATCH 162/476] Add files via upload --- apps/supf/icon.png | Bin 0 -> 7090 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/supf/icon.png diff --git a/apps/supf/icon.png b/apps/supf/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca4d6140129667bdc4900b5a580a7ae189cec88 GIT binary patch literal 7090 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 Date: Wed, 22 Dec 2021 01:31:24 +0100 Subject: [PATCH 163/476] Create icon.js --- apps/supf/icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/supf/icon.js diff --git a/apps/supf/icon.js b/apps/supf/icon.js new file mode 100644 index 000000000..2b555d7d0 --- /dev/null +++ b/apps/supf/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA"))} From 1192e0e2a7b7facf32c17324ccb4e8cff4a51c6f Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:31:59 +0100 Subject: [PATCH 164/476] Delete app-icon.js --- apps/supf/app-icon.js | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 apps/supf/app-icon.js diff --git a/apps/supf/app-icon.js b/apps/supf/app-icon.js deleted file mode 100644 index e05e934b2..000000000 --- a/apps/supf/app-icon.js +++ /dev/null @@ -1,2 +0,0 @@ -require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) -} From 85e3bf2584447c4816ea1beec382dc931e138ec7 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:37:49 +0100 Subject: [PATCH 165/476] Update apps.json --- apps.json | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/apps.json b/apps.json index 0ce8a78cd..6d51a941d 100644 --- a/apps.json +++ b/apps.json @@ -5063,21 +5063,22 @@ {"name":"ltherm.img","url":"icon.js","evaluate":true} ] }, - { + { "id": "supf", - "name": "supf Simple Clock with seconds and Date in custom language", - "shortName": "supf Clock", + "name": "Simple Clock with Date", + "shortName": "supf", "version": "0.01", - "description": "Displays the current temperature in localized units.", - "icon": "thermf.png", + "description": "Simple Clock with seconds and Date in custom language. \nATTENTION: requires Languages app", + "icon": "icon.png", + "screenshots": [{"url":"screenshot_supf.png"}], + "type": "clock", "tags": "clock", "supports": ["BANGLEJS2"], "allow_emulator": true, "readme": "README.md", "storage": [ {"name":"supf.app.js","url":"app.js"}, - {"name":"supf.img","url":"app-icon.js","evaluate":true}, - {"name":"supf.info","url":"supf.info","evaluate":true} + {"name":"supf.img","url":"icon.js","evaluate":true}, ] } ] From ad95c35a7e8bdd7e72b7c9d43f3a2ad90ca96843 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:39:36 +0100 Subject: [PATCH 166/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 6d51a941d..8d08a8bc2 100644 --- a/apps.json +++ b/apps.json @@ -5078,7 +5078,7 @@ "readme": "README.md", "storage": [ {"name":"supf.app.js","url":"app.js"}, - {"name":"supf.img","url":"icon.js","evaluate":true}, + {"name":"supf.img","url":"icon.js","evaluate":true} ] } ] From 15f622e0d815f04ca6fe72af86800c984454def9 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:45:05 +0100 Subject: [PATCH 167/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8d08a8bc2..c25de913f 100644 --- a/apps.json +++ b/apps.json @@ -5068,7 +5068,7 @@ "name": "Simple Clock with Date", "shortName": "supf", "version": "0.01", - "description": "Simple Clock with seconds and Date in custom language. \nATTENTION: requires Languages app", + "description": "Simple Clock with seconds and Date in custom language. Install 'Languages' to get localized names.", "icon": "icon.png", "screenshots": [{"url":"screenshot_supf.png"}], "type": "clock", From 3626918d5a77f5ff579e5ea99fe545ec7d2af4b2 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 01:51:33 +0100 Subject: [PATCH 168/476] Rename readme.md to README.md --- apps/supf/{readme.md => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/supf/{readme.md => README.md} (100%) diff --git a/apps/supf/readme.md b/apps/supf/README.md similarity index 100% rename from apps/supf/readme.md rename to apps/supf/README.md From 8ae2de3f255fcb48a5bd2be3e6f9058b2f4b936c Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:00:26 +0100 Subject: [PATCH 169/476] Update icon.js --- apps/supf/icon.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/supf/icon.js b/apps/supf/icon.js index 2b555d7d0..e05e934b2 100644 --- a/apps/supf/icon.js +++ b/apps/supf/icon.js @@ -1 +1,2 @@ -require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA"))} +require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) +} From 9c3373f7093a56d90a5e1e031c9bda70cfaa952e Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:02:37 +0100 Subject: [PATCH 170/476] Update icon.js --- apps/supf/icon.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/supf/icon.js b/apps/supf/icon.js index e05e934b2..60df6e9c7 100644 --- a/apps/supf/icon.js +++ b/apps/supf/icon.js @@ -1,2 +1 @@ require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) -} From 705a0aa0cae13968097588b4a904bbec0ae25a59 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:10:55 +0100 Subject: [PATCH 171/476] Delete icon.js --- apps/supf/icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/supf/icon.js diff --git a/apps/supf/icon.js b/apps/supf/icon.js deleted file mode 100644 index 60df6e9c7..000000000 --- a/apps/supf/icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) From c07495cbb6b804f48259d37edc966e1279b83d56 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:13:05 +0100 Subject: [PATCH 172/476] Create icon.js --- apps/supf/icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/supf/icon.js diff --git a/apps/supf/icon.js b/apps/supf/icon.js new file mode 100644 index 000000000..60df6e9c7 --- /dev/null +++ b/apps/supf/icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) From c51098a6d0bdbfcade2fd7d373df625e7edc94ab Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:16:09 +0100 Subject: [PATCH 173/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c25de913f..9d54f1d79 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id": "supf", "name": "Simple Clock with Date", - "shortName": "supf", + "shortName": "supf Clock", "version": "0.01", "description": "Simple Clock with seconds and Date in custom language. Install 'Languages' to get localized names.", "icon": "icon.png", From 29780f398bf61d9ad4f53a272714785b69853db8 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:19:38 +0100 Subject: [PATCH 174/476] Delete supf.info --- apps/supf/supf.info | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/supf/supf.info diff --git a/apps/supf/supf.info b/apps/supf/supf.info deleted file mode 100644 index dc0a49a0d..000000000 --- a/apps/supf/supf.info +++ /dev/null @@ -1 +0,0 @@ -{"id":"supf","name":"Simple Clock with Date","type":"clock","src":"supf.app.js","icon":"supf.img","version":"0.01","tags":"clock","files":"supf.info,supf.app.js,app-icon.js"} From 62fe33b42f5780170e1fc3d6dabe80d1724e4ed4 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 02:19:58 +0100 Subject: [PATCH 175/476] Update icon.js --- apps/supf/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/supf/icon.js b/apps/supf/icon.js index 60df6e9c7..c06a65409 100644 --- a/apps/supf/icon.js +++ b/apps/supf/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("iIA/AH4A/AEkQdbgcEDq46FgEBQX5HGACZbBDjQeCDrocbAH4A/AH4A1iIACAqYdkAQgIIARAAFiAdTgIdtgIdaR4wdZBAwdUPRodmcBbvRR4wFQDsYA/AH4A/AH4AJiAcbgMRDrcRAHxXdDrq2WWAIeaDg4A/AH4AwA")) +require("heatshrink").decompress(atob("ogA/AH4A/AElAdbgcEDq46FgEEQX5HGACZbBDjQeCDrocbAH4A/AH4A0gX/AAPzgEBAoX/BgIFDiEAn4FCkAdFgYXEDpQXBAocwDow4BHwIIDEAIdCHAIdDAQM/Dp4UBAQodxmYABDrK5DDrY7BmQdaPRAd4d6CPESo4ACDoQACDowXDHwMBDpI+Bn4jEAH4A/AH4A/AB9ADjcEogdbogA+K7oddWyywBDzQcHAH4A/AGAA=")) From 6cb5bd5da9df302d823bc460f0582a2faee2724e Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Tue, 21 Dec 2021 22:08:05 -0500 Subject: [PATCH 176/476] Initial commit of DirAct app --- apps.json | 17 ++ apps/diract/ChangeLog | 1 + apps/diract/README.md | 28 ++ apps/diract/diract-icon.js | 1 + apps/diract/diract.js | 548 +++++++++++++++++++++++++++++++++++++ apps/diract/diract.png | Bin 0 -> 1784 bytes 6 files changed, 595 insertions(+) create mode 100644 apps/diract/ChangeLog create mode 100644 apps/diract/README.md create mode 100644 apps/diract/diract-icon.js create mode 100644 apps/diract/diract.js create mode 100644 apps/diract/diract.png diff --git a/apps.json b/apps.json index f5be04136..58693208b 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,22 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "diract", + "name": "DirAct", + "shortName": "DirAct", + "version": "0.01", + "description": "Proximity interaction detection.", + "icon": "diract.png", + "type": "app", + "tags": "tool,sensors", + "supports" : [ "BANGLEJS2" ], + "allow_emulator": false, + "readme": "README.md", + "storage": [ + { "name": "diract.app.js", "url": "diract.js" }, + { "name": "diract.img", "url": "diract-icon.js", "evaluate": true } + ] } ] diff --git a/apps/diract/ChangeLog b/apps/diract/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/diract/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/diract/README.md b/apps/diract/README.md new file mode 100644 index 000000000..efecade3f --- /dev/null +++ b/apps/diract/README.md @@ -0,0 +1,28 @@ +# DirAct + +[DirAct](https://www.reelyactive.com/diract/) implementation for the Bangle.js. + + +## Usage + +Real-time interactions will be recognised by [Pareto Anywhere](https://www.reelyactive.com/pareto/anywhere/) open source middleware and any other program which observes the [DirAct open standard](https://reelyactive.github.io/diract/). + + +## Features + +Currently implements DirAct real-time functionality. + + +## Controls + +None. + + +## Requests + +[Contact reelyActive](https://www.reelyactive.com/contact/) for support/updates. + + +## Creator + +Developed by [jeffyactive](https://github.com/jeffyactive) of [reelyActive](https://www.reelyactive.com). DirAct is jointly developed by reelyActive and Code Blue Consulting. diff --git a/apps/diract/diract-icon.js b/apps/diract/diract-icon.js new file mode 100644 index 000000000..e351d09bf --- /dev/null +++ b/apps/diract/diract-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkE/4AImUQgMjBpIAI+UQFAMBn4XRmJBDiYXRFwQwCC9HzF93/kAXDgSPWj4XRMAZGSDAUhiTWSAH4Ag+URAAUvRBkSAofxgUzmchX4khSw3ygIID+UiFwMiF4bIBGowIBiYvEmUjF4kxEwgABmU/mMCC4cBiUhiAXDkET+cjC4cgj5IE+MAI4MAC4RGCHQIXEgRREF44kCCIIeCDoIIBMAYkDHQJeDEwJBBn/xgYGBn8hC5cS+YoBmEfFoP/IoMxgYXJmETJIISBj/zgBOBDgITCSgYXDBoYUCDQIXBiYXNBIIXBA4IXHI44XEJIJHIC5JHEVwRkBO5qKBbYqPGgMikTXDmKPDEAPyAIJJCX4cAAAQXDIoQtBl6IEGIIXJFoYmCSAQ4BSYIXJRYJWBDQIACkM/eYQXJdYcSC4fzG4J2CC5MwK4I+CAAR4BLwQXJBwowDiQfDC5HzLAIXFGwoXILAQALC5IANC/4X/C+w")) \ No newline at end of file diff --git a/apps/diract/diract.js b/apps/diract/diract.js new file mode 100644 index 000000000..dba41cccb --- /dev/null +++ b/apps/diract/diract.js @@ -0,0 +1,548 @@ +/** + * Copyright reelyActive 2017-2021 + * We believe in an open Internet of Things + * + * DirAct is jointly developed by reelyActive and Code Blue Consulting + */ + +// User-configurable constants +const INSTANCE_ID = [ 0x00, 0x00, 0x00, 0x01 ]; +const NAMESPACE_FILTER_ID = [ 0xc0, 0xde, 0xb1, 0x0e, 0x1d, + 0xd1, 0xe0, 0x1b, 0xed, 0x0c ]; +const EXCITER_INSTANCE_IDS = new Uint32Array([ 0xe8c17e45 ]); +const RESETTER_INSTANCE_IDS = new Uint32Array([ 0x4e5e77e4 ]); +const PROXIMITY_RSSI_THRESHOLD = -65; +const PROXIMITY_LED_RSSI_THRESHOLD = -65; +const PROXIMITY_TABLE_SIZE = 8; +const DIGEST_TABLE_SIZE = 32; +const OBSERVE_PERIOD_MILLISECONDS = 400; +const BROADCAST_PERIOD_MILLISECONDS = 3600; +const BROADCAST_DIGEST_PAGE_MILLISECONDS = 400; +const PROXIMITY_PACKET_INTERVAL_MILLISECONDS = 400; +const DIGEST_PACKET_INTERVAL_MILLISECONDS = 100; +const DIGEST_TIME_CYCLE_THRESHOLD = 86400; +const EXCITER_HOLDOFF_SECONDS = 60; +const BLINK_ON_PROXIMITY = true; +const BLINK_ON_DISTANCING = true; +const BLINK_ON_DIGEST = true; +const BLINK_ON_RESET = true; + + +// Eddystone protocol constants +const EDDYSTONE_UUID = 'feaa'; +const EDDYSTONE_UID_FRAME = 0x00; +const EDDYSTONE_NAMESPACE_OFFSET = 2; +const EDDYSTONE_NAMESPACE_LENGTH = 10; +const EDDYSTONE_INSTANCE_OFFSET = 14; + + +// DirAct constants +const DIRACT_MANUFACTURER_ID = 0x0583; // Code Blue Consulting +const DIRACT_PROXIMITY_FRAME = 0x01; +const DIRACT_DIGEST_FRAME = 0x11; +const DIRACT_DEFAULT_COUNT_LENGTH = 0x07; +const DIRACT_INSTANCE_LENGTH = 4; +const DIRACT_INSTANCE_OFFSET = 2; +const MAX_NUMBER_STRONGEST = 3; +const MAX_BATTERY_VOLTAGE = 3.3; +const MIN_BATTERY_VOLTAGE = 3.0; +const MAX_RSSI_TO_ENCODE = -28; +const MIN_RSSI_TO_ENCODE = -92; +const MAX_ACCELERATION_TO_ENCODE = 2; +const MAX_ACCELERATION_MAGNITUDE = 0x1f; +const INVALID_ACCELERATION_CODE = 0x20; +const SCAN_OPTIONS = { + filters: [ + { manufacturerData: { 0x0583: {} } }, + { services: [ EDDYSTONE_UUID ] } + ] +}; + + +// Other constants +const BITS_PER_BYTE = 8; +const DUMMY_INSTANCE_ID = 0; +const DUMMY_RSSI = MIN_RSSI_TO_ENCODE; + + +// Global variables +let proximityInstances = new Uint32Array(PROXIMITY_TABLE_SIZE); +let proximityRssis = new Int8Array(PROXIMITY_TABLE_SIZE); +let digestInstances = new Uint32Array(DIGEST_TABLE_SIZE); +let digestCounts = new Uint16Array(DIGEST_TABLE_SIZE); +let digestTime = new Uint8Array([ 0, 0, 0 ]); +let numberOfDigestPages = 0; +let sensorData = [ 0x82, 0x08, 0x3f ]; +let cyclicCount = 0; +let lastDigestTime = Math.round(getTime()); +let lastResetTime = Math.round(getTime()); +let isExciterPresent = false; +let isResetterPresent = false; +let isProximityDetected = false; +let menu = { + "": { "title": "-- DirAct --" } +}; + + +/** + * Initiate observer mode, scanning for devices in proximity. + */ +function observe() { + proximityInstances.fill(DUMMY_INSTANCE_ID); // Reset proximity + proximityRssis.fill(DUMMY_RSSI); // table data + isExciterPresent = false; + isResetterPresent = false; + + NRF.setScan(handleDiscoveredDevice, SCAN_OPTIONS); // Start scanning + setTimeout(broadcast, OBSERVE_PERIOD_MILLISECONDS); // ...until period end +} + + +/** + * Compile the scan results and initiate broadcaster mode, advertising either + * proximity or digest packets, in consequence. + */ +function broadcast() { + NRF.setScan(); // Stop scanning + + let sortedProximityIndices = getSortedIndices(proximityRssis); + + updateDigestTable(sortedProximityIndices); + updateSensorData(); + + let currentTime = Math.round(getTime()); + let isExcited = isExciterPresent && + ((currentTime - lastDigestTime) > EXCITER_HOLDOFF_SECONDS); + + if(isResetterPresent) { + if(BLINK_ON_RESET) { + Bangle.setLCDPower(true); + } + lastResetTime = currentTime; + resetDigest(); + broadcastProximity(sortedProximityIndices); + } + else if(isExcited) { + let sortedDigestIndices = getSortedIndices(digestCounts); + compileDigest(); + broadcastDigest(sortedDigestIndices, 0); + } + else { + broadcastProximity(sortedProximityIndices); + } +} + + +/** + * Initiate broadcaster mode advertising proximity packets. + * @param {TypedArray} sortedIndices The sorted proximity table indices. + */ +function broadcastProximity(sortedIndices) { + let advertisingOptions = { + interval: PROXIMITY_PACKET_INTERVAL_MILLISECONDS, + showName: false, + manufacturer: DIRACT_MANUFACTURER_ID + }; + + advertisingOptions.manufacturerData = compileProximityData(sortedIndices); + NRF.setAdvertising({}, advertisingOptions); // Start advertising + setTimeout(observe, BROADCAST_PERIOD_MILLISECONDS); // ...until period end +} + + +/** + * Initiate broadcaster mode advertising digest packets. + * @param {TypedArray} sortedIndices The sorted digest table indices. + * @param {Number} pageNumber The page number to broadcast. + */ +function broadcastDigest(sortedIndices, pageNumber) { + let isLastPage = (pageNumber === (numberOfDigestPages - 1)); + let advertisingOptions = { + interval: DIGEST_PACKET_INTERVAL_MILLISECONDS, + showName: false, + manufacturer: DIRACT_MANUFACTURER_ID + }; + + advertisingOptions.manufacturerData = compileDigestData(sortedIndices, + pageNumber); + NRF.setAdvertising({}, advertisingOptions); // Start advertising + + if(isLastPage) { + setTimeout(observe, BROADCAST_DIGEST_PAGE_MILLISECONDS); + if(getTime() > DIGEST_TIME_CYCLE_THRESHOLD) { + lastResetTime = Math.round(getTime()); + resetDigest(); + } + if(BLINK_ON_DIGEST) { + Bangle.setLCDPower(true); + } + } + else { + setTimeout(broadcastDigest, BROADCAST_DIGEST_PAGE_MILLISECONDS, + sortedIndices, ++pageNumber); + } +} + + +/** + * Handle the given device discovered on scan and process further if + * Eddystone-UID or DirAct. + * @param {BluetoothDevice} device The discovered device. + */ +function handleDiscoveredDevice(device) { + let isEddystone = (device.hasOwnProperty('services') && + device.hasOwnProperty('serviceData') && + (device.services[0] === EDDYSTONE_UUID)); + let isManufacturer = (device.hasOwnProperty('manufacturer') && + device.manufacturer === DIRACT_MANUFACTURER_ID); + + if(isEddystone) { + let isEddystoneUID = (device.serviceData[EDDYSTONE_UUID][0] === + EDDYSTONE_UID_FRAME); + if(isEddystoneUID) { + handleEddystoneUidDevice(device.serviceData[EDDYSTONE_UUID], device.rssi); + } + } + else if(isManufacturer) { + let isDirAct = ((device.manufacturerData[0] === DIRACT_PROXIMITY_FRAME) || + (device.manufacturerData[0] === DIRACT_DIGEST_FRAME)); + if(isDirAct) { + handleDirActDevice(device.manufacturerData, device.rssi); + } + } +} + + +/** + * Handle the given Eddystone-UID device, adding to the devices in range if + * it meets the filter criteria. + * @param {Array} serviceData The Eddystone service data. + * @param {Number} rssi The received signal strength. + */ +function handleEddystoneUidDevice(serviceData, rssi) { + for(let cByte = 0; cByte < EDDYSTONE_NAMESPACE_LENGTH; cByte++) { + let namespaceIndex = EDDYSTONE_NAMESPACE_OFFSET + cByte; + if(serviceData[namespaceIndex] !== NAMESPACE_FILTER_ID[cByte]) { + return; + } + } + + let instanceId = 0; + let bitShift = (DIRACT_INSTANCE_LENGTH - 1) * BITS_PER_BYTE; + + for(let cByte = 0; cByte < DIRACT_INSTANCE_LENGTH; cByte++) { + let instanceByte = serviceData[EDDYSTONE_INSTANCE_OFFSET + cByte]; + instanceId += instanceByte << bitShift; + bitShift -= BITS_PER_BYTE; + } + + let unsignedInstanceId = new Uint32Array([instanceId])[0]; + + if(EXCITER_INSTANCE_IDS.indexOf(unsignedInstanceId) >= 0) { + isExciterPresent = true; + } + else if(RESETTER_INSTANCE_IDS.indexOf(unsignedInstanceId) >= 0) { + isResetterPresent = true; + } + else { + updateProximityTable(instanceId, rssi); + } +} + + +/** + * Handle the given DirAct device, adding to the devices in range if + * it meets the filter criteria. + * @param {Array} manufacturerData The DirAct manufacturer data. + * @param {Number} rssi The received signal strength. + */ +function handleDirActDevice(manufacturerData, rssi) { + let instanceId = 0; + let bitShift = (DIRACT_INSTANCE_LENGTH - 1) * BITS_PER_BYTE; + + for(let cByte = DIRACT_INSTANCE_OFFSET; + cByte < DIRACT_INSTANCE_OFFSET + DIRACT_INSTANCE_LENGTH; cByte++) { + let instanceByte = manufacturerData[cByte]; + instanceId += instanceByte << bitShift; + bitShift -= BITS_PER_BYTE; + } + + updateProximityTable(instanceId, rssi); +} + + +/** + * Update the proximity table with the given instance's RSSI. If the instance + * already exists, combine RSSI values in a weighted average. + * @param {String} instanceId The DirAct 4-byte instance id as a 32-bit integer. + * @param {Number} rssi The received signal strength. + */ +function updateProximityTable(instanceId, rssi) { + let instanceIndex = proximityInstances.indexOf(instanceId); + let isNewInstance = (instanceIndex < 0); + + if(isNewInstance) { + let nextIndex = proximityInstances.indexOf(DUMMY_INSTANCE_ID); + if(nextIndex >= 0) { + proximityInstances[nextIndex] = instanceId; + proximityRssis[nextIndex] = rssi; + } + } + else { + proximityRssis[instanceIndex] = (proximityRssis[instanceIndex] + rssi) / 2; + } +} + + +/** + * Update the digest table based on the proximity table and its sorted indices. + * @param {TypedArray} sortedIndices The sorted proximity table indices. + */ +function updateDigestTable(sortedIndices) { + for(let cInstance = 0; cInstance < PROXIMITY_TABLE_SIZE; cInstance++) { + let proximityIndex = sortedIndices[cInstance]; + + if(proximityRssis[proximityIndex] >= PROXIMITY_RSSI_THRESHOLD) { + let instanceId = proximityInstances[proximityIndex]; + let instanceIndex = digestInstances.indexOf(instanceId); + let isNewInstance = (instanceIndex < 0); + + if(isNewInstance) { + let nextIndex = digestInstances.indexOf(DUMMY_INSTANCE_ID); + if(nextIndex >= 0) { + digestInstances[nextIndex] = instanceId; + digestCounts[nextIndex] = 1; + } + } + else if(digestCounts[instanceIndex] < 65535) { + digestCounts[instanceIndex]++; + } + } + else { + cInstance = PROXIMITY_TABLE_SIZE; // Break + } + } +} + + +/* + * Compile the digest from the digest table. + */ +function compileDigest() { + let numberOfEntries = digestCounts.findIndex(count => count === 0); + let currentTime = Math.round(getTime()); + let elapsedTime = currentTime - lastResetTime; + if(numberOfEntries < 0) { + numberOfEntries = DIGEST_TABLE_SIZE; + } + digestTime[0] = (elapsedTime >> 16) & 0xff; + digestTime[1] = (elapsedTime >> 8) & 0xff; + digestTime[2] = elapsedTime & 0xff; + numberOfDigestPages = Math.max(1, Math.min(8, Math.ceil(numberOfEntries/3))); + lastDigestTime = currentTime; +} + + +/* + * Clear the digest table. + */ +function resetDigest() { + digestInstances.fill(DUMMY_INSTANCE_ID); + digestCounts.fill(0); +} + + +/** + * Compile the DirAct proximity data. + * @param {TypedArray} sortedIndices The sorted proximity table indices. + */ +function compileProximityData(sortedIndices) { + let data = [ + DIRACT_PROXIMITY_FRAME, DIRACT_DEFAULT_COUNT_LENGTH, + INSTANCE_ID[0], INSTANCE_ID[1], INSTANCE_ID[2], INSTANCE_ID[3], + sensorData[0], sensorData[1], sensorData[2] + ]; + let isNewProximityDetected = false; + + for(let cInstance = 0; cInstance < MAX_NUMBER_STRONGEST; cInstance++) { + let index = sortedIndices[cInstance]; + + if(proximityRssis[index] >= PROXIMITY_RSSI_THRESHOLD) { + let instanceId = proximityInstances[index]; + data.push((instanceId >> 24) & 0xff, (instanceId >> 16) & 0xff, + (instanceId >> 8) & 0xff, instanceId & 0xff, + encodeRssi(proximityRssis[index])); + if(proximityRssis[index] >= PROXIMITY_LED_RSSI_THRESHOLD) { + isNewProximityDetected = true; + } + } + else { + cInstance = PROXIMITY_TABLE_SIZE; // Break + } + } + + cyclicCount = (cyclicCount + 1) % 8; + + data[1] = (cyclicCount << 5) + (data.length - 2); + + if(isProximityDetected && !isNewProximityDetected && BLINK_ON_DISTANCING) { + Bangle.setLCDPower(true); + } + else if(isNewProximityDetected && BLINK_ON_PROXIMITY) { + Bangle.setLCDPower(true); + } + isProximityDetected = isNewProximityDetected; + + return data; +} + + +/** + * Compile the DirAct digest data. + * @param {TypedArray} sortedIndices The sorted digest table indices. + * @param {Number} digestPage The page of the digest to compile. + */ +function compileDigestData(sortedIndices, digestPage) { + let isLastPage = (digestPage === (numberOfDigestPages - 1)); + + let digestStatus = digestTime[0] & 0x7f; + if(isLastPage) { + digestStatus |= 0x80; + } + + let data = [ + DIRACT_DIGEST_FRAME, DIRACT_DEFAULT_COUNT_LENGTH, + INSTANCE_ID[0], INSTANCE_ID[1], INSTANCE_ID[2], INSTANCE_ID[3], + digestStatus, digestTime[1], digestTime[2] + ]; + let pageIndex = digestPage * 3; + + for(let cInstance = pageIndex; cInstance < (pageIndex + 3); cInstance++) { + let index = sortedIndices[cInstance]; + + if(digestCounts[index] > 0) { + let instanceId = digestInstances[index]; + let encodedCount = digestCounts[index]; + if(encodedCount > 127) { + encodedCount = 0x80 | (Math.min((encodedCount >> 8), 0x7f) & 0x7f); + } + data.push((instanceId >> 24) & 0xff, (instanceId >> 16) & 0xff, + (instanceId >> 8) & 0xff, instanceId & 0xff, + encodedCount); + } + else { + cInstance = pageIndex + 3; // Break + } + } + + data[1] = (digestPage << 5) + (data.length - 2); + + return data; +} + + +/** + * Encode the given RSSI. + * @param {Number} rssi The given RSSI. + * @return {Number} The encoded RSSI. + */ +function encodeRssi(rssi) { + rssi = Math.round(rssi); + + if(rssi >= MAX_RSSI_TO_ENCODE) { + return 0x3f; + } + if(rssi <= MIN_RSSI_TO_ENCODE) { + return 0x00; + } + return rssi - MIN_RSSI_TO_ENCODE; +} + + +/** + * Encode the battery percentage. + * @return {Number} The battery percentage. + */ +function encodeBatteryPercentage() { + let voltage = NRF.getBattery(); + + if(voltage <= MIN_BATTERY_VOLTAGE) { + return 0x00; + } + if(voltage >= MAX_BATTERY_VOLTAGE) { + return 0x3f; + } + + return Math.round(0x3f * (voltage - MIN_BATTERY_VOLTAGE) / + (MAX_BATTERY_VOLTAGE - MIN_BATTERY_VOLTAGE)); +} + + +/** + * Encode the acceleration. + * @return {Array} The encoded acceleration [ x, y, z ]. + */ +function encodeAcceleration() { + let encodedAcceleration = { x: INVALID_ACCELERATION_CODE, + y: INVALID_ACCELERATION_CODE, + z: INVALID_ACCELERATION_CODE }; + + let acceleration = { x: Bangle.getAccel().x, + y: Bangle.getAccel().y, + z: Bangle.getAccel().z }; + + for(let axis in acceleration) { + let magnitude = acceleration[axis]; + let encodedMagnitude = Math.min(MAX_ACCELERATION_MAGNITUDE, + Math.round(MAX_ACCELERATION_MAGNITUDE * + (Math.abs(magnitude) / + MAX_ACCELERATION_TO_ENCODE))); + if(magnitude < 0) { + encodedMagnitude = 0x3f - encodedMagnitude; + } + encodedAcceleration[axis] = encodedMagnitude; + } + + return encodedAcceleration; +} + + +/** + * Update the sensor data (battery & acceleration) for the advertising packet. + */ +function updateSensorData() { + + // Update the battery measurement each time the cyclic count resets + if(cyclicCount === 0) { + encodedBattery = encodeBatteryPercentage(); + } + + encodedAcceleration = encodeAcceleration(); + + sensorData[0] = ((encodedAcceleration.x << 2) & 0xfc) | + ((encodedAcceleration.y >> 4) & 0x3f); + sensorData[1] = ((encodedAcceleration.y << 4) & 0xf0) | + ((encodedAcceleration.z >> 2) & 0x0f); + sensorData[2] = ((encodedAcceleration.z << 6) & 0xc0) | + (encodedBattery & 0x3f); +} + + +/** + * Determine the sorted order of the indices of the given array. + * @return {Uint8Array} The array of indices sorted in descending order. + */ +function getSortedIndices(unsortedArray) { + let sortedIndices = new Uint8Array(unsortedArray.length); + + sortedIndices.forEach((value, index) => sortedIndices[index] = index); + sortedIndices.sort((a, b) => unsortedArray[b] - unsortedArray[a]); + + return sortedIndices; +} + + +// On start: begin DirAct operation and display the menu +g.clear(); +E.showMenu(menu); +observe(); diff --git a/apps/diract/diract.png b/apps/diract/diract.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2c099786f5b6d8398825feb62cee4b890d67e8 GIT binary patch literal 1784 zcmX|Cc{tly7bcb}(Z*iFAe2zFN^M^)ZR|8+`K&{9l?a-OK@&R-siky7M@x!9$6AJ} zqLvVQMJy3Zo7#ubl!msZ=BM+0{o~yG-1|J|ocF%(d!9={A??IP6-4>?_{1ITt=)kA z)Io@VfORS`>^5onzOhaG#JpaNIZ zPUF{4?lT6r5 zr|sJmSjNZoWXMADl027?P!X3gKFz8Z-Y%1hbkC_co$hE zdc)5eU7w5T%~BdoX;4ETNW69IM5WJ^qsepwmast2!61n_6zWNI8(7J#0spSkRn64( z`ISEI`(C>-M!GZDzdf!Mk$S{cj(Y0G?8{$BUwNU12ATBkH?(v)c4H{?7w+YVjp`yKCWW~3lldB>)QNc>E-ItVY>(fsLATo)jHNk)DHJKqhg$9$!RngNylUD)SkDi7 zQ>jk5dOpX6#AGvw6q-(?(>I{?Xu&oNf#9sO>IHgEZ|31w8<9XGGvYQTeR%QW8nfcT z2`?jwiPRY=*rzGF zGWwL14F0gY^OJwwrCSA>E>98^2%4V(1Oe@F8`-Dn6W!y#dv$>lRlDkMZY{l?5$P=M znIV@XTk&@$-BYp7f@6iJ0yVDrh(nDkBR8g7A~(M5a*M0{Y68stqc-P49|2^d0TmwV z`aLnZ0n<@A;f?TX3KMT4G3gMG7ydsUvaLSE2d!n1$zb`UOOt0~cHac@R>ykXP_8*Tv%V=uW0}NNY!`l(< z{n~FSbY*p{41hNMKZDraHxvlz7C>0w_WXhB$%l?kCqApvk5HI-aYJCT0^6Y5Q=3qg z(?rE%B^c+vn-c>2p0pxgPnXm24y0%m36B*MuZorH?QG7E^!Eo(RzE%p-jt9PX^gGA zM1zqVLs(DscN%k#fP_TEkVz2JrzP@%U6%*f2tjz$!ZSEo`5gjnh+P@b`ekt-ceuhf zQz8E?FmtIwAVeFA^l5F;W*^xNIKP$H-wFT04+^M~oS)|t@!^rbG9B!T5v~V@LA$lr zl(2Nn`SdWY*6O)iucY#D--kR#b_4`&<$d7jn+GZmUa3(fZ36R}1;skv8YL|0<3e1W zPu)IpF|n3vUt*~Kql>k}pOBd97|Wk!P=`vWxS1Dq)30}XGNI!W!Q;=AOz9))Xv&>{)$X~J}bX08@|HTdgned#W11mB-9PHsqwBDFvOU6>$W17KfX&1%A z2i5{r*%y{mqdCNeP_~ir=wT@hxMVYdldq5j43DNn^DE(;&TKqqeZC#-@HZ=!c#X`V z{Fh%03HySExk3Al*V%*MMX0<&c;3Fz{h&Rg`{?g+2mH5yla!0gT`hJP@T2iL*dVQ| I&j%*`1M&S_MgRZ+ literal 0 HcmV?d00001 From 0de5a23736eaa4a8152cba314dfbcecf2d817b62 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 22 Dec 2021 08:45:13 +0100 Subject: [PATCH 177/476] Fix: Gadgedbridge freezes screen --- apps/lcars/lcars.app.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 9068868f0..2104c6f7f 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -30,6 +30,7 @@ let cWhite = "#FFFFFF"; let lcarsViewPos = 0; let drag; let hrmValue = 0; +var connected = NRF.getSecurityStatus().connected; /* * Requirements and globals @@ -311,13 +312,6 @@ function draw(){ // First handle alarm to show this correctly afterwards handleAlarm(); - // Clear data - var current = new Date(); - if(current.getHours() == 0 && current.getMinutes() == 0){ - stepsData = new Array(24).fill(0); - hrmData = new Array(24).fill(0); - } - // Next draw the watch face g.reset(); g.clearRect(0, 0, g.getWidth(), g.getHeight()); @@ -396,7 +390,13 @@ function handleAlarm(){ */ Bangle.on('lcdPower',on=>{ if (on) { - draw(); // draw immediately, queue redraw + // Whenever we connect to Gadgetbridge, reading data from + // health failed. Therefore, we update and read data from + // health iff the connection state did not change. + if(connected == NRF.getSecurityStatus().connected) { + draw(); // draw immediately, queue redraw + } + connected = NRF.getSecurityStatus().connected } else { // stop draw timer if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; From 63850e74b3461f67f05e3d1dd6348e494b58141b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20ICH=C3=89?= <4037271+peeweek@users.noreply.github.com> Date: Wed, 22 Dec 2021 08:48:07 +0100 Subject: [PATCH 178/476] Added Support for messages --- apps.json | 2 +- apps/hcclock/ChangeLog | 5 ++-- apps/hcclock/README.md | 1 + apps/hcclock/hcclock.app.js | 51 +++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..e3d9a5314 100644 --- a/apps.json +++ b/apps.json @@ -4064,7 +4064,7 @@ { "id": "hcclock", "name": "Hi-Contrast Clock", - "version": "0.02", + "version": "0.03", "description": "Hi-Contrast Clock : A simple yet very bold clock that aims to be readable in high luninosity environments. Uses big 10x5 pixel digits. Use BTN 1 to switch background and foreground colors.", "icon": "hcclock-icon.png", "type": "clock", diff --git a/apps/hcclock/ChangeLog b/apps/hcclock/ChangeLog index aaa55d01a..f70653d58 100644 --- a/apps/hcclock/ChangeLog +++ b/apps/hcclock/ChangeLog @@ -1,2 +1,3 @@ -0.01: base code -0.02: saved settings when switching color scheme \ No newline at end of file +0.01: Base code +0.02: Saved settings when switching color scheme +0.03: Added Button 3 opening messages (if app is installed) \ No newline at end of file diff --git a/apps/hcclock/README.md b/apps/hcclock/README.md index 328f1fe03..122401dd8 100644 --- a/apps/hcclock/README.md +++ b/apps/hcclock/README.md @@ -5,6 +5,7 @@ A High-contrast, black-on-white or white-on-black clock displaying huge pixel di ## Usage * BTN 1 switches between the two modes : black-on-white or white-on-black +* BTN 3 opens the messages (if installed, and there are new messages) * That's it! ## Issues and Requests diff --git a/apps/hcclock/hcclock.app.js b/apps/hcclock/hcclock.app.js index 4664dd763..623b28f13 100644 --- a/apps/hcclock/hcclock.app.js +++ b/apps/hcclock/hcclock.app.js @@ -129,6 +129,7 @@ function updateTime() g.setFontAlign(0, -1, 0); g.drawString(fmtDate(d,mo,y,hour), 120, 120); } + drawMessages(); } function drawDigits(x, value) @@ -222,6 +223,55 @@ function flipColors() setColorScheme(0); } +////////////////////////////////////////// +// +// MESSAGE HANDLING() +// + +let messages_installed = require("Storage").read("messages.app.js") != undefined; + +function handleMessages() +{ + if(messages_installed && hasMessages() > 0) + { + E.showMessage("Loading Messages..."); + load("messages.app.js"); + } +} + +function hasMessages() +{ + if(!messages_installed) + return false; + + var messages = require("Storage").readJSON("messages.json",1)||[]; + if (messages.some(m=>m.new)) + return true; + else + return false; +} + +let msg = atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA=="); +let had_messages = false; + +function drawMessages() +{ + if(!had_messages && hasMessages()) { + g.setColor(255,255,255); + g.drawImage(msg, 200, 206); + g.setFont("6x8", 2); + g.setFontAlign(0, -1, 0); + g.drawString(">", 224, 210); + had_messages = true; + } + else if (had_messages && !hasMessages()) + { + g.setColor(255,0,0); + g.fillRect(200, 200, 240, 240); + had_messages = false; + } +} + ////////////////////////////////////////// // // MAIN FUNCTION() @@ -238,6 +288,7 @@ setInterval(updateTime, interval); // Handle Button Press setWatch(flipColors, BTN1, true); setWatch(Bangle.showLauncher, BTN2, false); +setWatch(handleMessages, BTN3, true); // Handle redraw on LCD on / fullscreen notifications dismissed Bangle.on('lcdPower', (on) => { if(on) redraw(); }); From 07049c4d880a82a6a5554d4bafe41c8392245357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20ICH=C3=89?= <4037271+peeweek@users.noreply.github.com> Date: Wed, 22 Dec 2021 09:01:41 +0100 Subject: [PATCH 179/476] Fixed position of icon --- apps/hcclock/hcclock.app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/hcclock/hcclock.app.js b/apps/hcclock/hcclock.app.js index 623b28f13..de5163996 100644 --- a/apps/hcclock/hcclock.app.js +++ b/apps/hcclock/hcclock.app.js @@ -258,16 +258,16 @@ function drawMessages() { if(!had_messages && hasMessages()) { g.setColor(255,255,255); - g.drawImage(msg, 200, 206); + g.drawImage(msg, 184, 212); g.setFont("6x8", 2); g.setFontAlign(0, -1, 0); - g.drawString(">", 224, 210); + g.drawString(">", 224, 216); had_messages = true; } else if (had_messages && !hasMessages()) { - g.setColor(255,0,0); - g.fillRect(200, 200, 240, 240); + g.setColor(0,0,0); + g.fillRect(180, 210, 240, 240); had_messages = false; } } From 1cf197df6faf28c23f666bfe107657c930bc574d Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 22 Dec 2021 12:28:01 +0100 Subject: [PATCH 180/476] Sitch between month / 24h --- apps/lcars/lcars.app.js | 113 +++++++++++++++++++++++++++------------- 1 file changed, 76 insertions(+), 37 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 2104c6f7f..afbca2b8b 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -31,6 +31,7 @@ let lcarsViewPos = 0; let drag; let hrmValue = 0; var connected = NRF.getSecurityStatus().connected; +var plotWeek = false; /* * Requirements and globals @@ -270,36 +271,71 @@ function drawPosition1(){ } // Plot HRM graph - var data = new Uint16Array(32); - var cnt = new Uint8Array(32); - health.readDailySummaries(new Date(), h=>{ - data[h.day]+=h.bpm; - if (h.bpm) cnt[h.day]++; - }); - require("graph").drawBar(g, data, { - axes : true, - minx: 1, - gridx : 4, - gridy : 100, - width : 140, - height : 50, - x: 5, - y: 25 - }); + if(plotWeek){ + var data = new Uint16Array(32); + var cnt = new Uint8Array(32); + health.readDailySummaries(new Date(), h=>{ + data[h.day]+=h.bpm; + if (h.bpm) cnt[h.day]++; + }); + require("graph").drawBar(g, data, { + axes : true, + minx: 1, + gridx : 5, + gridy : 100, + width : 140, + height : 50, + x: 5, + y: 25 + }); - // Plot step graph - var data = new Uint16Array(32); - health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); - require("graph").drawBar(g, data, { - axes : true, - minx: 1, - gridx : 4, - gridy : 5, - width : 140, - height : 50, - x: 5, - y: 115 - }); + // Plot step graph + var data = new Uint16Array(32); + health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); + require("graph").drawBar(g, data, { + axes : true, + minx: 1, + gridx : 5, + gridy : 5, + width : 140, + height : 50, + x: 5, + y: 115 + }); + + // Plot day + } else { + var data = new Uint16Array(24); + var cnt = new Uint8Array(24); + health.readDay(new Date(), h=>{ + data[h.hr]+=h.bpm; + if (h.bpm) cnt[h.hr]++; + }); + require("graph").drawBar(g, data, { + axes : true, + minx: 1, + gridx : 4, + gridy : 100, + width : 140, + height : 50, + x: 5, + y: 25 + }); + + // Plot step graph + var data = new Uint16Array(24); + health.readDay(new Date(), h=>data[h.hr]+=h.steps); + require("graph").drawBar(g, data, { + axes : true, + minx: 1, + gridx : 4, + gridy : 1000, + width : 140, + height : 50, + x: 5, + y: 115 + }); + } g.setFontAntonioMedium(); g.setColor(cWhite); @@ -394,13 +430,14 @@ Bangle.on('lcdPower',on=>{ // health failed. Therefore, we update and read data from // health iff the connection state did not change. if(connected == NRF.getSecurityStatus().connected) { - draw(); // draw immediately, queue redraw + draw(); } - connected = NRF.getSecurityStatus().connected } else { // stop draw timer if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; } + + connected = NRF.getSecurityStatus().connected }); Bangle.on('lock', function(isLocked) { @@ -456,14 +493,16 @@ Bangle.on("drag", e => { // Vertical swipe } else if (Math.abs(dy)>Math.abs(dx)+10) { - if(lcarsViewPos != 0){ - return; + if(lcarsViewPos == 0){ + if(dy > 0){ + decreaseAlarm(); + } else { + increaseAlarm(); + } } - if(dy > 0){ - decreaseAlarm(); - } else { - increaseAlarm(); + if(lcarsViewPos == 1){ + plotWeek = dy < 0 } } From 56a42fb0648c88da743fa5e19822d6cc9410d044 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Wed, 22 Dec 2021 14:37:16 +0100 Subject: [PATCH 181/476] note longer needed --- apps/andark/add_to_apps.json | 15 --------------- 1 file changed, 15 deletions(-) delete mode 100644 apps/andark/add_to_apps.json diff --git a/apps/andark/add_to_apps.json b/apps/andark/add_to_apps.json deleted file mode 100644 index 57613f9d2..000000000 --- a/apps/andark/add_to_apps.json +++ /dev/null @@ -1,15 +0,0 @@ -{ "id": "andark", - "name": "Analog Dark", - "shortName":"AnDark", - "version":"0.01", - "description": "analog clock face without disturbing widgets", - "icon": "andark_icon.png", - "type": "clock", - "tags": "clock", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"anrark.app.js","url":"app.js"}, - {"name":"andark.img","url":"app_icon.js ","evaluate":true} - ] -} From 1533180617f82e4e0be6c4c52d1e86eff78cd28a Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 15:36:40 +0100 Subject: [PATCH 182/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 9d54f1d79..c15511dd2 100644 --- a/apps.json +++ b/apps.json @@ -5068,7 +5068,7 @@ "name": "Simple Clock with Date", "shortName": "supf Clock", "version": "0.01", - "description": "Simple Clock with seconds and Date in custom language. Install 'Languages' to get localized names.", + "description": "Simple Clock with seconds and date in custom language. Install 'Languages' to get localized names.", "icon": "icon.png", "screenshots": [{"url":"screenshot_supf.png"}], "type": "clock", From 21324ec224791802506a466de8d9438749881491 Mon Sep 17 00:00:00 2001 From: M14aAUI <77926990+M14aAUI@users.noreply.github.com> Date: Wed, 22 Dec 2021 15:39:21 +0100 Subject: [PATCH 183/476] Update README.md --- apps/supf/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/supf/README.md b/apps/supf/README.md index 5b80152c3..258a69d4b 100644 --- a/apps/supf/README.md +++ b/apps/supf/README.md @@ -1,4 +1,4 @@ -# Simple Clock with seconds and Date in custom language -ATTENTION: requires Languages app +# Simple Clock with Date +Simple Clock with seconds and date in custom language. Install 'Languages' to get localized names. ![](screenshot_supf.png) From f0a2767c8c4d1a8b2b41c9900617bed358270700 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Wed, 22 Dec 2021 16:24:51 +0100 Subject: [PATCH 184/476] changed update on lock changed update on lock, so that the display only refreshes after 60 seconds (banglejs2) --- apps/andark/app.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps/andark/app.js b/apps/andark/app.js index cf248d462..2a2c4b29d 100644 --- a/apps/andark/app.js +++ b/apps/andark/app.js @@ -1,5 +1,6 @@ const c={"x":g.getWidth()/2,"y":g.getHeight()/2}; let zahlpos=[]; +let unlock = true; function zeiger(len,dia,tim){ const x =c.x+ Math.cos(tim)*len/2, @@ -41,9 +42,11 @@ function draw(){ // g.setColor(1,1,1); const minz = zeiger(150,5,m); g.fillPoly(minz,true); + if (unlock){ const sekz = zeiger(150,2,s); g.fillPoly(sekz,true); g.fillCircle(c.x,c.y,4); + } } @@ -90,6 +93,7 @@ g.setBgColor(0,0,0); g.clear(); drawScale(); draw(); + let secondInteraval= setInterval(draw, 1000); // Stop updates when LCD is off, restart when on @@ -102,6 +106,19 @@ Bangle.on('lcdPower',on=>{ }else{ } }); +Bangle.on('lock',on=>{ + if (secondInterval) clearInterval(secondInterval); + secondInterval = undefined; + if (!on) { + secondInterval = setInterval(draw, 1000); + unlock = true; + draw(); // draw immediately + }else{ + secondInterval = setInterval(draw, 60000); + unlock = false; + draw(); + } + }); // Show launcher when middle button pressed Bangle.setUI("clock"); From 967812c05f4d3ec17b0147bfb705d82d17c4d783 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 23 Dec 2021 00:33:19 +0900 Subject: [PATCH 185/476] AwairMonitor: the app is now a clock, data is greyed when connection is lost --- apps/awairmonitor/app.js | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/apps/awairmonitor/app.js b/apps/awairmonitor/app.js index a5a1d1a72..9123a9c2c 100644 --- a/apps/awairmonitor/app.js +++ b/apps/awairmonitor/app.js @@ -30,6 +30,8 @@ var bt_temp_history = new Array(10).fill(0); var internal_last_update = -1; +var display_frozen = false; + function draw() { g.reset().clearRect(0,24,g.getWidth(),g.getHeight()); @@ -47,14 +49,8 @@ function draw() { g.drawString("Humi", 125, 100); g.drawString("Temp", 160, 100); - g.setFont("HaxorNarrow7x17"); - g.drawString(""+bt_current_co2, 18, 110); - g.drawString(""+bt_current_voc, 53, 110); - g.drawString(""+bt_current_pm25, 88, 110); - g.drawString(""+bt_current_humi, 123, 110); - g.drawString(""+bt_current_temp, 158, 110); - if (last_update != bt_last_update) { + display_frozen = false; last_update = bt_last_update; internal_last_update = last_update; if (last_update % 10 == 0) { @@ -65,16 +61,29 @@ function draw() { bt_temp_history.shift(); bt_temp_history.push(bt_current_temp); } } - + if (internal_last_update == -1) { g.drawString("Waiting for connection", 88, 164); - } else if (internal_last_update > last_update + 5) { + } else if ((internal_last_update > last_update + 5) && (internal_last_update < last_update + 60)) { g.drawString("Trying to reconnect since " + (internal_last_update - last_update), 88, 164); + } else if (internal_last_update > last_update + 5) { + display_frozen = true; + g.drawString("Waiting for connection", 88, 164); } + if (display_frozen) { g.setColor("#888"); } + + g.setFont("HaxorNarrow7x17"); + g.drawString(""+bt_current_co2, 18, 110); + g.drawString(""+bt_current_voc, 53, 110); + g.drawString(""+bt_current_pm25, 88, 110); + g.drawString(""+bt_current_humi, 123, 110); + g.drawString(""+bt_current_temp, 158, 110); for (i = 0; i < 10; i++) { - // max height = 32 + if (display_frozen) { g.setColor("#888"); } + + // max height = 32 g.drawLine(10+i*2, 150-(Math.min(Math.max(bt_co2_history[i],400), 1200)-400)/25, 10+i*2, 150); g.drawLine(45+i*2, 150-(Math.min(Math.max(bt_voc_history[i],0), 1440)-0)/45, 45+i*2, 150); g.drawLine(80+i*2, 150-(Math.min(Math.max(bt_pm25_history[i],0), 32)-0)/1, 80+i*2, 150); @@ -91,6 +100,7 @@ function draw() { } // init +Bangle.setUI("clock"); require("FontHaxorNarrow7x17").add(Graphics); g.clear(); Bangle.loadWidgets(); From 28fb84422383a1d36e931a058fa9160b4f1c2af3 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 23 Dec 2021 00:34:05 +0900 Subject: [PATCH 186/476] Update ChangeLog --- apps/awairmonitor/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/awairmonitor/ChangeLog b/apps/awairmonitor/ChangeLog index 0cc9a42b0..88e9690d8 100644 --- a/apps/awairmonitor/ChangeLog +++ b/apps/awairmonitor/ChangeLog @@ -1 +1,2 @@ 0.01: Beta version for Bangle 2 paired with Chrome (2021/12/11) +0.02: The app is now a clock, the data is greyed after the connection is lost (2021/12/22) From 4f709d0d4b9fa60dac5c56be1ee11aa009056f86 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Thu, 23 Dec 2021 00:35:51 +0900 Subject: [PATCH 187/476] Update apps.json --- apps.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..bf5e8c77f 100644 --- a/apps.json +++ b/apps.json @@ -4931,10 +4931,12 @@ "id":"awairmonitor", "name":"Awair Monitor", "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], "allow_emulator": true, - "version":"0.01", + "version":"0.02", "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", - "tags": "tool,health", + "type": "clock", + "tags": "clock,tool,health", "readme":"README.md", "supports":["BANGLEJS2"], "storage": [ From ad6ed2496e6b97eb66e376caaee835863c5c2b89 Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Wed, 22 Dec 2021 16:49:50 +0100 Subject: [PATCH 188/476] fixed wrong spelling in variable name --- apps/andark/app.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/apps/andark/app.js b/apps/andark/app.js index 2a2c4b29d..efa00ce6f 100644 --- a/apps/andark/app.js +++ b/apps/andark/app.js @@ -1,6 +1,6 @@ const c={"x":g.getWidth()/2,"y":g.getHeight()/2}; let zahlpos=[]; -let unlock = true; +let unlock = false; function zeiger(len,dia,tim){ const x =c.x+ Math.cos(tim)*len/2, @@ -45,8 +45,9 @@ function draw(){ if (unlock){ const sekz = zeiger(150,2,s); g.fillPoly(sekz,true); - g.fillCircle(c.x,c.y,4); } + g.fillCircle(c.x,c.y,4); + } @@ -94,7 +95,7 @@ g.clear(); drawScale(); draw(); -let secondInteraval= setInterval(draw, 1000); +let secondInterval= setInterval(draw, 1000); // Stop updates when LCD is off, restart when on Bangle.on('lcdPower',on=>{ @@ -122,6 +123,3 @@ Bangle.on('lock',on=>{ // Show launcher when middle button pressed Bangle.setUI("clock"); -// Load widgets -//Bangle.loadWidgets(); -//Bangle.drawWidgets(); From 4e41b3a2b03a685e89d8f35598e858b9ae355d0a Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Wed, 22 Dec 2021 16:50:53 +0100 Subject: [PATCH 189/476] Update ChangeLog --- apps/andark/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/andark/ChangeLog b/apps/andark/ChangeLog index 91bbd190f..341868930 100644 --- a/apps/andark/ChangeLog +++ b/apps/andark/ChangeLog @@ -1,3 +1,4 @@ 0.01: Release 0.02: Rename app 0.03: Add type "clock" +0.04: changed update cylce, when locked From b9660042230976ef111dbab228a3847471aa708f Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Wed, 22 Dec 2021 16:56:10 +0100 Subject: [PATCH 190/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 5675c30d5..b067b59cb 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id": "andark", "name": "Analog Dark", "shortName":"AnDark", - "version":"0.03", + "version":"0.04", "description": "analog clock face without disturbing widgets", "icon": "andark_icon.png", "type": "clock", From 7912a8e0a5312bcbbdd852765c3ffc1e6a10cebe Mon Sep 17 00:00:00 2001 From: HeiLaut <66202132+HeiLaut@users.noreply.github.com> Date: Wed, 22 Dec 2021 17:02:28 +0100 Subject: [PATCH 191/476] removed banglejs1 support can't test if it's working correkt on banglejs1 --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b067b59cb..9fefe6701 100644 --- a/apps.json +++ b/apps.json @@ -5071,7 +5071,7 @@ "icon": "andark_icon.png", "type": "clock", "tags": "clock", - "supports" : ["BANGLEJS","BANGLEJS2"], + "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ {"name":"andark.app.js","url":"app.js"}, From 83ced79ec8cf916eba9b56462ae032ddac1de34b Mon Sep 17 00:00:00 2001 From: "A. Benjamins" Date: Wed, 22 Dec 2021 20:53:37 +0100 Subject: [PATCH 192/476] Create widget.js --- apps/widviztime/widget.js | 53 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 apps/widviztime/widget.js diff --git a/apps/widviztime/widget.js b/apps/widviztime/widget.js new file mode 100644 index 000000000..5e81af611 --- /dev/null +++ b/apps/widviztime/widget.js @@ -0,0 +1,53 @@ +(() => { + + var saved = null; + + + function hide() { + if (!Bangle.isLCDOn() || saved) return; + saved = []; + for (var wd of WIDGETS) { + saved.push({ + d: wd.draw, + a: wd.area + }); + wd.draw = () => {}; + wd.area = ""; + } + g.setColor(0, 0, 0); + g.fillRect(0, 0, g.getWidth(), 23); + } + + function reveal() { + if (!Bangle.isLCDOn() || !saved) return; + for (var wd of WIDGETS) { + var o = saved.shift(); + wd.draw = o.d; + wd.area = o.a; + } + Bangle.drawWidgets(); + saved = null; + } + + function draw() { + g.setColor(0x07ff); + g.drawImage(atob("GBgBAAAAAAAAAAAAAAAAAH4AAf+AB4HgDgBwHDw4OH4cMOcMYMMGYMMGMOcMOH4cHDw4DgBwB4HgAf+AAH4AAAAAAAAAAAAAAAAA"), this.x, this.y); + } + + WIDGETS.viz = { + area: "tl", + width: 24, + draw: draw + }; + + + + Bangle.on('lock', (locked) => { + if (!locked) { + reveal(); + setTimeout(function() { + hide(); + }, 4000); + } + }); +})(); From 52cc043787e7f74316d8fb4f363b4a6201c7d0fd Mon Sep 17 00:00:00 2001 From: "A. Benjamins" Date: Wed, 22 Dec 2021 20:54:05 +0100 Subject: [PATCH 193/476] Create changelog --- apps/widviztime/changelog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/widviztime/changelog diff --git a/apps/widviztime/changelog b/apps/widviztime/changelog new file mode 100644 index 000000000..287061d0c --- /dev/null +++ b/apps/widviztime/changelog @@ -0,0 +1 @@ +0.01: New Widget, forked from widviz From 80c41ae35e485dff19dbea0c2b4d654b8097b885 Mon Sep 17 00:00:00 2001 From: "A. Benjamins" Date: Wed, 22 Dec 2021 21:01:33 +0100 Subject: [PATCH 194/476] Add files via upload --- apps/widviztime/eye.png | Bin 0 -> 3364 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/widviztime/eye.png diff --git a/apps/widviztime/eye.png b/apps/widviztime/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..9aec8ce8930a6c34f8d664fdeab042554296b814 GIT binary patch literal 3364 zcmai13piA37v6@HI|t!ZjEN}Bm~qQw5Tj6&dl|V6v$2_*nQ`w(sZbO}goG|kCDjnc zNe9u1NU2DakV_~j*VFIcL#IxsbN>H%_TICGmA(T#Xkh(BK^QX zh(SQTtExdEAu0j2%ZQ{;Vp)ShkZm*@bcx>K>K`5AZ%Rd3n2Vc5;$Zf+&d!88ViT%>SA2q<@wBhs4529ZW+BeXusTpVe}rUu}hiCexH!y^JJh|6W+ zF_?&m2y}!2n#m5tU`%;zCRYQlLrk zV}@}FC=`q%zld|8fN$yy&X?uGiNFXD3>K}A`70fag#LvtKz^XJf|y(;Cy2@Vx`6Lo ze1(57gwyxWCXp1@KaokK|4paUzgq@}YZDG9;!9G$i|J1X9M>ooh;arv%rLe;XcG=H zxN8?PA;=5fj!p>#w}Xs8ZV&-wxbbhmE{OW~d4UiuOi&3o1_ZmteKT?Yh7nLEI1Kh1 zME*xekZQam6baJYi4YxRaA4K1QG5f*{{mVwX-u{Yysbe3YRT8vI^Y*E5|au;28&^Q zgY2xW9oftPhz4UE=dD&qI~!|btf{fF9uB=E0~ZYs+d=_RL<$#X;q-A>JuFTShjYbY z@%r#(q$7ChFDfsx;j=)ca4G+fFWAvYGuVPe!rMX|E|VR#IJLCRUBJ+#(bA9xE$(k5 zabfg2M<7-Jj8!VSb3;Y?1JnQwrNH&B3Q1ZX=kleFPqS?L;60 zZa-|e&xC&HI|u+m`yjY7KU4$&w9~@UUh2d20wNTVWjI7oHKGc zlrz@dLmF%Bn%{AJ_dvK!(yAKtj6|i|l?;?KyU0`CWav|MPByi5*tB(UPis_OOO$lS zS+Zte`#dreGmf27jD*jPFP9k`Rl_4DTnG@+RLVQ({@%*d6WmAnSYjjV!gG{ z?z8U`3x{ob#d>)eg#i;MSyjiAv<^BPAl&kFoN0I@uNZq{qgSuPkxxMyB2&hch&d&# z*lWkzIJF(hW~;026wJD$5u-|!srC|&)=VY zte~+gjqI;@TJsTA`?Xvc`C^gA#lj*gm0UizP*HjaZ|Ke&m$a%o3*DaD?=OGb{=#gi zZ?;c@<1{ch8yrhfLof?7FM719mR+eEwsG4=tLqfy_Jo8IyibnQk6jeUG(P-E_?e=i zo@?|JzqM@*@mc>RG$l}Ju7A(l*CvTGfuE{HV`t$Hh8WA1%mDxidBH6NWalaafaqa6 z;$~O(gJW5cqkN!p<3d&E3-trC$lvPsI}$~fwbtX(dF9?uMuNIj^yp7UxE}9hcD!wq z2`_uMO2?#ruVi zs;#%*VWRS;qt1Bkrzo3|Pz%gBODRAM0&H!CEv*XkUa4dztmlRIl-<-B9UpmfbmcAn z-LYk|>on^$Q2v!0O`Y+&_V||KR43wIC9SzUWtCTc83v`bPVSv=KD;-xk;@bLT@Nvu zP9!F`H}U(@AuLV^Z6)HiVTF@LTniznYkpT9y=qhXzWuaKez_NlR6l`6s=PyWdlV12 zcYw!so1Izdj&a4um>4)`IP4J4FP9w0-%CbV4yu;X&2|s6VuTw=y?#gR(ynASLiN}U z_Uh|?s}J-3Su1!wMK66l@;pNJG@aGs*L91Rs?rwYs8;>FvZ!A5Rom#sft+DE2zwpL z5nn5PR(nlPIPj2U{U{J&2}-yludQ4^|BJu6|IlRZ+?gvTv&X2){Y?#9KNQUHf=xD@ zoZH!u#ZSB^4nYsBhiNwmuUGhazm*D#xc0d#B*imR<7!a))af=4=NScqN}S4+3xGTp ze^VhnyYcXiLT$w|Dd6K|>XfiaoiMksc4ER*=b2Py(v9tpjwNL*$HWxvYpEI5=7pLw zCII~dPJPLTZ;F+)rU%}6ECR%@R0q{$K9-ZOo(6znr27@?)p9=#o$UTqzw~)`MnElC zSn7S0bXZc-;ns;xC-=Rh0eq981x>NbYS96rpV3_oty|lhRaYL9E~FKdl26a%U}HUw zHGbYyQZ^m$QocIH-fBFr#ex5Ndh5*rGee+S(s<|g>d~?N+CI&<8j7Zt&%_)ojcQNh zS4T$bboZ^8o=Gr1Q=wWj?5h<=KOsd9z5hzD;ty#4eD$e>yAHwEXNiAsHC>hi_o?;O z(tz*#p-q*lh~m-2Gd`!^`StS?c+UcCCV>pHm&D}7n`)oKqwDAU*2YKNdTiO+TGHR_ z=h_~8q=n`TX!D?#ZnV7}#Q6((F1asxKJ`bMEX(rW1f7Zz0gm6M8kWS{3_32RqzEKl}CXXt%lelm80afKHvAmgyod*QpKXWjhw z&@u5P%Zyt{x{gj6{1**9E+SXQXM;i$*Lr()|B`U|#!$O++QMZI`zvKbmE%)$MvfYy z=mJ&Jy30N}iVx_H433hUX$-KY`q7=vnyh^L6zNl+M?46gU4uM;oZKBRv-+oVs)*hQ zuI+kfnRwZvElu9`l6{9vfjmTt#++CEjL!RhUZYjvyYXOL!Rj|5;U5O5D}#P39#1rl zDmvdhB3`bhgaYh?pT|p~cZSWk%WmoYj}~j*O-O2QJ`b>jO5Qei?_^{N`|i_SXJfCB z!<t9F>z`@;lJ?+3fnI4pqk$hE@0og(sZuQ`ag&nQOb`-gXQyt8E@1B@LFm5MA%& zye)H@j6}GfP`P_|f?gG~Ffd-#?886)B)79}U9>l2U^u3PURIGZm3O-fkEyu-yg~F- zF89|FFYyLpAX`j%ubAsbpzLLpTjgl%+MG4Eh!EV_N^P-I%65n|4p^%68@uG)5;TiU zF^w&Nj~0E^Sf>Pl($qbls`YAOx-zXV$IES=w9jCbrKR7fTzk_4yh~-rvnkxn(DpUV z2e*RvGe(hlRZo3PFI>`CZXH5e0rDV8(JuDuJ}EG%D!-j%YwEU+P; zSfb%uBaPwni_I&N7uXN%)H89NEH|OJb@IRaAiT^c3=6o@_)(w*UsNBU>Tq~8&F?^y zOo?Y1c-*}1&Sd6`kaLqdtM5MP9!Tgcj?^Tt@!=~UlUdd^sr^Y`lDPs!y6oe?+XVIG=cY#CUDP`M z=JLxmhqjekm`cUHIWok3?ej+mQvF5F*idQXlARANkUJcj o2D28nICLwO2_e Date: Wed, 22 Dec 2021 21:06:01 +0100 Subject: [PATCH 195/476] Update apps.json --- apps.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..ec1eb0568 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,19 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "widviztime", + "name": "Widget Autohide Widget", + "shortName": "Viz Time Widget", + "version": "0.01", + "description": "The widgets will be shown for four seconds after the device is unlocked.", + "icon": "eye.png", + "type": "widget", + "tags": "widget", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widviztime.wid.js","url":"widget.js"} + ] } ] From 8499a19cbb5ab7b12f936327eb91ff0f910bf270 Mon Sep 17 00:00:00 2001 From: "A. Benjamins" Date: Wed, 22 Dec 2021 21:07:51 +0100 Subject: [PATCH 196/476] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index ec1eb0568..e9eaab42b 100644 --- a/apps.json +++ b/apps.json @@ -5072,6 +5072,7 @@ "icon": "eye.png", "type": "widget", "tags": "widget", + "readme":"README.md", "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ {"name":"widviztime.wid.js","url":"widget.js"} From 82abd587c2b0a8f07d40416b6f6b0317812200e4 Mon Sep 17 00:00:00 2001 From: "A. Benjamins" Date: Wed, 22 Dec 2021 21:10:13 +0100 Subject: [PATCH 197/476] Create README.md --- apps/widviztime/README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 apps/widviztime/README.md diff --git a/apps/widviztime/README.md b/apps/widviztime/README.md new file mode 100644 index 000000000..35ea3c057 --- /dev/null +++ b/apps/widviztime/README.md @@ -0,0 +1,7 @@ +# Widget Autohide Widget +This should make widgets completely hidden (except for 4 seconds after the watch is unlocked) + +Additional features that I want to implement: +- [ ] Only show widgets when in app launcher +- [ ] Make timeout adjustable +- [ ] Disable widgets completely From f1b322a21018d844c586dda63487268df649cbd7 Mon Sep 17 00:00:00 2001 From: "A. Benjamins" Date: Wed, 22 Dec 2021 21:13:06 +0100 Subject: [PATCH 198/476] Update README.md --- apps/widviztime/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/widviztime/README.md b/apps/widviztime/README.md index 35ea3c057..73e24b658 100644 --- a/apps/widviztime/README.md +++ b/apps/widviztime/README.md @@ -1,7 +1,8 @@ # Widget Autohide Widget -This should make widgets completely hidden (except for 4 seconds after the watch is unlocked) +This widget is forked from the "Widget Visibility Widget" +It should make widgets completely hidden (except for 4 seconds after the watch is unlocked) Additional features that I want to implement: -- [ ] Only show widgets when in app launcher -- [ ] Make timeout adjustable -- [ ] Disable widgets completely +- Only show widgets when in app launcher +- Make timeout adjustable +- Disable widgets completely From c664e45eb054eeaddf9ac29ff89a314951fb5996 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 22 Dec 2021 20:58:26 +0000 Subject: [PATCH 199/476] swp2clk: Remove unused app icon (since we are settings-only). Add comment explaining boot.js code. Add credits and motivation. --- apps.json | 3 +-- apps/swp2clk/README.md | 12 +++++++++++- apps/swp2clk/app-icon.js | 1 - apps/swp2clk/app.pdn | Bin 7005 -> 0 bytes apps/swp2clk/boot.js | 17 +++++++++++++++++ 5 files changed, 29 insertions(+), 4 deletions(-) delete mode 100644 apps/swp2clk/app-icon.js delete mode 100644 apps/swp2clk/app.pdn diff --git a/apps.json b/apps.json index 0a537d676..51b17e7f5 100644 --- a/apps.json +++ b/apps.json @@ -5075,8 +5075,7 @@ "readme": "README.md", "storage": [ { "name": "swp2clk.boot.js", "url": "boot.js" }, - {"name":"swp2clk.settings.js","url":"settings.js"}, - { "name": "swp2clk.img", "url": "app-icon.js", "evaluate": true } + {"name":"swp2clk.settings.js","url":"settings.js"} ], "data": [{"name":"swp2clk.data.json"}] } diff --git a/apps/swp2clk/README.md b/apps/swp2clk/README.md index f6d0dd2b4..877a13ecc 100644 --- a/apps/swp2clk/README.md +++ b/apps/swp2clk/README.md @@ -9,4 +9,14 @@ The swipe modes can be configured in the settings app, under "Swipe to Clock". - Always Off: Deactivated for all apps (Default) - White List: Only activate for chosen apps, otherwise deactivated for all apps. - Black List: Only disabled for chosen apps, otherwise activated for all apps. -- Always On: Active for all apps (Not actually recommended! E.g. Games need to be able to deal with swipe gestures) \ No newline at end of file +- Always On: Active for all apps (Not actually recommended! E.g. Games need to be able to deal with swipe gestures) + +## Motivation: + +The goal is to further support touch-only usage of the BangleJS 2 watch. You can use the [Swiper Clock Launch](https://banglejs.com/apps/#swiper%20clock%20launch) or the [Pattern Launcher](https://banglejs.com/apps/#pattern%20launcher) to further enable touch-only support of the watch. + +## Credits: + +Initial creation: [crazysaem](https://github.com/crazysaem) + +Inspired by: [Swiper Clock Launch](https://banglejs.com/apps/#swiper%20clock%20launch) \ No newline at end of file diff --git a/apps/swp2clk/app-icon.js b/apps/swp2clk/app-icon.js deleted file mode 100644 index e59cd6244..000000000 --- a/apps/swp2clk/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwwkE/4A2+cyiJABiMjn4WPiAVCDIUBDBsyiEBiUzAwMzkIHBl4tMBw/yBIIxKkIME+YEEiESIpMBkYGD+MfKQoMEEQcgiYHE+EPAwkxgRJG+RSGC4xJBNYwuGC44wCD4sRG4wXHCAweGC5JABQAhGHC5IpFiDIHC5HzgIEHC5oqE+JeHC5RgDmBkEC5vxgYXZkDdGC5fyLYSOIC5SLDC5MgQJAXDUxHygEAKREQC5XxC4KCIC8xHLO4/ziERiSPTmI4IC4rXGFwMTC5LXDmBsFFwLHINQUDC44uH+fc54XG+LlE+QuFnvM5gXDkArCMYYFCkYsECwIAHSBIsDC5cgLIoVMC4ZgFC6PziJIFLpYXDJA53PUY6nHZQMvEwwwIa4kxgQmHmUBXoYMHiAMJkJJJIoMSEZIMBgJTG+QJBERAOFiUzAwMzkIgIGJEAgERiIDBFpgYEmQVCiMjCx4AoA=")) \ No newline at end of file diff --git a/apps/swp2clk/app.pdn b/apps/swp2clk/app.pdn deleted file mode 100644 index 60baf6cab3ff2c1a4c0ed0f096d691b636627b77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7005 zcmd^Cd7KkfwoasX0YMo=WocRjXVOxYy&^P_%Dz|j1+lGEDoJIj%2Jih1$6{Qn*jwM zj5VhS5O?q4He-H(2AlnVzV#Oz`K=(p>dq&yg%MwR(?6TTYdMQ@0@$i z38uA6mo*5+XCkyIjmOC5A{AldZ7njSr8!Pgu{hh)PT^%Tmv3v4wlwGQ0vYjBY}^M% zD24_L#!6w?SOkWZV`UPRO4c%AJi+BzCOu(18|TvD<_sNcYoUCo!&QVWh8Uv;kKOH! z>%1}0((+w(QKPnjA2cRar^VHgfZgqaP3l};Mkt*8h>Lc5#i&}XDJ6;pBlF_Yh` zD|uZ}2s}y=RLChrg@9NUHI@)k$tk%?Ug-dXP(miMM+0I7NoS;JkHVZt&1hi8kfzZE9Jw6vMz3N#~6#= z<@H(I$&6hZk%p*XTAP$RoHBYNWm&*!+yEJl?Bvi^8~s1!_BUelhC<%0?=LR9CWj0E9{J z^Z7_^Os0`>*0|HF2lNH>sgNJfX0t%8MDO4uCl zE>YkhkSLIXR5}-im^2uKRUnZz1|hH=g8=cWd>9iIa*!$+!Vs?>1Fi-kNizm{Up zj6QKBDhj6|mC5bEcr0)xr9#9xfWN7rXoa8;e%Oz7evq6p~8^Y=ojRTGgy*1*p>yl$@x_37f)Oeie(m&~Za7LmsE zVt)yb>HMXj#A`=&T9+@WEBUNCyI$=j@=DfIaU=P-!&2d3)>g?^IAu7TC_qI?I24SC zQ$8sR?oP3cD3z5c7ePW&yaW|VMvP_&*uaXygc;Uf zv6%?UX1AfS3MQyEp z87!h4E73y)MHL-+C+cCtUa6SQ=@p39S}ennWKx$>Gewq?`ErE8r7jyRX=^G#M3p8r z4tb5Sl2oINnZs_cUxi~b!tFHMbj1{Gh&w#Cw9A$9guEWPI$yMA68G=rU@v%^)#L2~i=&Cejv@I8d_1^nNp*Fso#RvIVUaj0Vi0 z_Mu^w3N=><+K1;dUb{u^EID;yt19DE`>YXHRuzLt6L6DQOyzbO;z68_CX33FCSgWn zl7v)4$6birk!O@*D#jQ=D6r}@2B(d3SF&ECGbpj<88=Ovvq1(J-4xVdaM77(jah?V zmemF2AP&kgV^U*umgAK`F=j9IX9Pa29<$; z7>$VaWtm$P*JZ9Z+B zCpO4HWXt)CGR&AyD!8IEtXFDK0+1?KyNvO)F`-ha;zh9~Zoo_gr*VcM#uQ@Z1nEuT znJDTKsl_rM6;hcMB0sILJF}i*j?gO6gwjxUiEvH=LWPgiumK#l!=Zo~D`>DN!Qm=% zMdM4!3Q!!evIw4)P)@86ElPEmi_mJ_nGmWqR^*~!LIDw8hSp+wIWDuH%4Cs~xqVDQ zTC|HT60WS3hX_j2;B1$xaVbiRL-SSL@t6L+Oj4`7wuY8D48u} zS=KhhqSa&q$H!sutXa)mP9HggOu~R3<-joTCGdzJxMp`OlveP&CrDL(B&cm zx?G)15D39XAh-w~{+ECHUIPS%;S|kk8P-m+W3@Pow>Dp{PJUdRv^HzF6wBqvHk#x> zrc1RpV_Y~z5f-xSVUi@>MsulDEe}8FDpZEx(j?8+fr%z6uch)CCQnA{dMcyZYTZ=V zQ!+LFqeL3W<;k3lWbp_%lZhqMc|nap(5H{^SG}RFd~s!^@+_}PLqmUeIS-bOy`;g{ z!b^P(lS+{U3rep1SOZCuIf@ty4(-EJ90}lZ_edsBzO>ZM<|sPW+MLc4OfE%*d(#1r z1)ra1A*@v5azd^UtE4g#MpRQ;|3AT}OrF9kFKFxo1bpe+2)Gh7)&fz>5C1f0{F=H9 zo&%;Cpw8v+GEbzao#M&9uGc`Gs*uKA&d*BSu-lXmX01uq+UUudicfWKU~+ZsHj3tdP>xDP8rxlDf#NG=@Dea@Lj%7Q2B3x!0>QCA3Iz2$X4SFz znLY=95eBb011|9|Lsj01`XtG6ZGpe4LSbDa80a^OEK$+1EFP0ihNsjufg$a9eyEv> zfd5&ryrnq>f>DcD(bCM8Gh|zfq@}qE(AGj2^qDa2CvK{wg&N;>E9cF&K!Z zzBdASRj$x5IkIuHbjMv3Ed6DK?E~s$spFE;2bLL*`hD%-83+TofnB z0o6&-l{|87&pmjY$?wT4@>9I<&T~~t zugims8X;@*1WxnmsRo4ct4wYq(@d_6rWhj0lgfWDr?JhT-Pi&|Ezi`?bIrR<4UMPC zf36a-Y zTwFGI-K~I=`s!S>q;VAJ2n82w_ks}gzr0-auxj{fZx=N1Q2Zn0eY|=RM)N)1*?C90 z%HCu68Q$@Eo7deAMAH?E^=vP^DEt&`&mRFy3xxc|sG^Ga9)Cmr3AL4bK6h_@_QH!yf9111qXNN${yw@}hfnOmuDLu~v$EHV&-{h)dIxQP|JP{; zI(O>}eRV6slTqWHb2bTX!wmZHhG|c{2+z5OaIwa6-xCuD{O;JwZS`A(+n*m?FIhQy zaOk;v9-Oyz!{g@C)3RgB4;JUlox5+}@%0S~cxd0ousDbQ!^~jj~y1J#M!hFR8dsm|q?_c`~KKxbR%T4z_BHFqh7In8Q z7&KwfzCm|R^P1;)JeyAKzy zz5k}2x1R8J79oOsp=0!!VQ&upzUjtC=B!-0{q@O@e3o4E?dItlumAcHQ>TE~vzvPJ z(-$qsZ{BU#)Hq}1lH31&TvTvb?)qWq!<&9De|LBG#LZ8RPMx};bJ3CKjtrjw|7m=k z^Mzp>W-aM(JgvE_ZQVD_kbBP#-^={|bH`m5`me%Y&pgeIYkCSfx8%VM@2?y@?)txp z8>h}#Rr&C2-*a0K-N4yvH%{Mh`nJI7HQmFux2_s7I;erZm~itpy8pH{r(4gCo7wi} z-Dl>US^4C!wFBq>=8SQE$Lg8gHbq1G8kyq4&p9s7}m)4#MM=U$n!+VJ$y-PEKDqt6}HymesciPcXb?Wy!V z7xo?~i3dH^s<=3|d*u3gTafn-j=1>X`SBLfl!sPN8F}ztEA;V_L#D5q&!4~cop(nr zA9NrvJ^#U`31bd5e&6x@vDGUF9N4sZ^_q{G-il>*{&v&ZwTlOLGOMJ}h2ZD2I~H$z z?60?UP3wC;BtN$!d{J@qd-A>$-V>Q=&uA>O&MCi{xZgNrvf`t+Zta}W@ESeuf^^8H z)bcNK`&;i5b>DH{jN!+Y>AW57Te>?VGrPC!IfY;MN>;-BC|WY-%D7W z&(C$VN8w(jMx#*cgdwGSqL(T(g3F5e}PSL*w}K5f&ouLeDJ;FIZx&zxFts(aD2KS1ZE zZ#etF+g+ZIw=~E*mOOcK?wT-n`i+drPaMAg=(79Ia?iOQ`@wtj(PiV#aBB{WzprcB z^<8vX=gF_vPkiGeYrhXpeK8Ej0t=sg;NDT5P49h4k7`}MtLgj?%RhO%{bBbrKb%EQ zE;+T}@P-i!_mkg^I(hua`EBs4vK@=|J-&+Jj!I{&Iz8^2jnY1^pX{35fAiE?m4hp= z{)%d)24$ioIlAP zxKOz>GxhL(ZocEpg8P;l?^=GkZM|X9XC__Xuhp77l2rn*`U4^LScr zx@L=@K|cu=ToXKd{Ht|>9Rmksem%9c_~6O*`TN%LIk)D|+$(p05Z&^`Cs LKL52a!)x_F<_%{L diff --git a/apps/swp2clk/boot.js b/apps/swp2clk/boot.js index 54486742a..3119ce06b 100644 --- a/apps/swp2clk/boot.js +++ b/apps/swp2clk/boot.js @@ -1,3 +1,20 @@ +/** + * How does this work? + * + * Every *boot.js file is executed everytime any app is loaded, including this one. + * We just need to figure out which app is currently loaded, in case we are in the white list / black list mode, + * to figure out if the swipe handler should be attached or not. + * It does not seem to be the case that this can be done easily, but we can work around it. + * It seems that every app is loaded via the global "load" function, which takes a fileName as it's first parameter to load any app + * or the default clock when the fileName is undefined. + * To be able to use this for us, we wrap the global "load" function, and determine before loading the next app, + * whether the swipe handler should be added or not, since we now know which app will be loaded. + * Note: We cannot add the swipe handler inside the wrapped "load" function, because once the "load" function is complete + * everything is cleaned up. That's why we merely save a flag, whether the swipe handler should be attached or not, + * which is evaluated once this file is executed again, which will be right after the load function completes + * (since every *boot.js file is executed everytime any app is loaded). + */ + (function () { var DEBUG = true; var FILE = "swp2clk.data.json"; From 9890218d25a82ab11407bd39c02e4ccff755ab82 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 22 Dec 2021 21:10:11 +0000 Subject: [PATCH 200/476] swp2clk: Try to fix "ERROR: App swp2clk has no entrypoint" --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 51b17e7f5..5624802c7 100644 --- a/apps.json +++ b/apps.json @@ -5070,6 +5070,7 @@ "version": "0.01", "description": "Let's you swipe from left to right on any app to return back to the clock face. Please configure in the settings app after installing to activate, since its disabled by default.", "icon": "app.png", + "type": "boot", "tags": "tools", "supports": ["BANGLEJS2"], "readme": "README.md", From 968e31c858e5752ec6856ed457ae2389da9f94a3 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 22 Dec 2021 21:24:21 +0000 Subject: [PATCH 201/476] ptlaunch: Add updated screenshots --- apps/ptlaunch/add_pattern_dark.png | Bin 3185 -> 2682 bytes apps/ptlaunch/add_pattern_light.png | Bin 3202 -> 2700 bytes apps/ptlaunch/manage_patterns_dark.png | Bin 3008 -> 941 bytes apps/ptlaunch/manage_patterns_light.png | Bin 3027 -> 2944 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/ptlaunch/add_pattern_dark.png b/apps/ptlaunch/add_pattern_dark.png index 04dfdecd6816c643f49a7246411886abce547b82..4d5770835e660bb266fe10fabf6ec0a18f55ba9f 100644 GIT binary patch literal 2682 zcmb7GdpHwp8`oZk*(ys8uMo?jY)(yHry^@|3OTe%WUu2$&aq)?$~j&XrO;cN({eW3 z-VIAgVZ)m_COM}ur>KNa-yh%g{qcT(e1AOm?|Sb0`aRe4T=#wbeoyK}d&>i$BOoCm zp##=dD5pKF`MH3id$F1}eRU7^ML1a^g{n9TpM-=!r>s%tF8Hg9g~NH1h7ggDyJmmQ zUOb@i*83jwepe;tF1hyr`S8f~CEDoX-0auQwO3~Ex8tJ~2!isGa5FUV_|_}s=CI?L zR_YEKXzTg%F{j^)^)O(*+{7V7eWx>{sr}1acg;|rTURf>s~TjP=9;* z{lJ(nMdf3Z_5nYRB;G$or$+I5yUWu1RU5={5f0>;a3|%v{S4=rj=@?rz#o(io`x>F zECsEGBU+>ky;BsFDQss({aah#cv$ExL_<0K=eBE0Yi(ED9ohy=Ee*$HZ^9ygKiuVj zL5!%%Si#C@nHc~B>Z=Di%v7O?TtqUv^|2#w;E_OuK-9TPTx%Ao0!}(6?lCKyUw1=m zCN{X51B2dEjgs_m>AE{cxy-*Dl%=$pK!OMNAWnHT0GOExndCY!=}%InP)wDY1QxkL$AH=_bWLnA5xM> zSg~$1on|#j(Z4K$!VuBYQH^X9Z5@;LGwAi)0mH+af!Sof7YUQ1nV5o8s^Z9Lg!?Vw zvZ?$)k_w84d?AH5rqMci-93OS+Em^f0c5Zk5j~j)TI^ZU4plGLeXs);B5nDPJ%Rve znKUy6;iV^G*O0(5oV9r8qS7Gk)up`NWPKP5lnLa%xdR?7s*FOm+^F%G&ja z^LKY&&j*&^e>!dU)K{=} z1yYcBPgJ9@*zaKfNwl?QAx0+Z!Q3wq*yrH3>_7Ch=T1MeExi%c732Eav??`Ho3}!q zB62nj8?CY8DZc#}Nt=#RR33+G+!)CUfjR}f``pj)@!D0X5k`TaMh4W0@!xIc)IY7Y zRNjkp4+-YNxpG~gsA!Usa`qD|l^A5Xm6K`e@>maCOBpj)$=Q(^05dVT<#*<(8^46kT~nxFjlZ^#<&sLuy%VCa}o+ z+Hcu&Um>mbZYHvEI4Zn@FN-?g|Wsx}BFAH0(18B4Iwx_G(0s|_$-@}3M%%gXcJiT)^ zdpn?m&tCLM^rh?wa6KbRuL(Z;NQo3P53C)R=hK*!w zIEK<{83p`t>Q{h3+mf|nO``Cv1h7;2Oayc5@Cae6Gs@)-OWG~fYKbrDS)2Uhe3Bhk zAjmv;@>&+04zHWSq-k&1mK5Q0S#s4#DHDy*JP&IU%4K`Mq+p`zzLD+3`?E}BLAOU@ zq1JL{SC@U*AJRl$eNJ1Gn~w(5bwc`>E%ew(G9}`CT0y>vn~xULZ3380g}_CMIEz|! z`VsZ)Jlo0}t0rw<%DM~bWMphT6I@^o>n87l&i)Ub_&xTazs_YHCfDwIRs%~p0FBtdJs zs{LXbbPFQlh{#xS;r!){l5k9bVl&b5M=8MJKsYQKPJ$=R|JzV=Hy?gu{wJA?D{pmX zP`bAAzlDet9hr6s26lgI_Fg&p=rK`wc`~aYIo2l=#AlUJ97>1jm9WtCosR(-s@(?% zFr&LPuVgmmTFEXxCu5ZSz1cuVctbYuiyU-$L0aO7gQO3oYkqshF==-&O;P%xQXEf3 z?WbGvq(W$qRXfp_fYOGwxe4Xw*l{oF2nz?rKlL}YsSE2vs@gm4kzsdaj{Q@8lnSBC zYt=tmAA7#q%o%zLn(`}pqBN20I>4Rl3okvy%C zed!kK+}@1lD>~rJB3ts|VQnSbZPlHbA36=cea$=Bi6iKJP+7@PY;lTQ**>S9ih1+c z(JQS`%Fy;EiiC=j$TOc*9Lq)ci?if$n3Q`AN=?1Uco<<=W2yF8^^1;tIwoDyR~F1d z`e>j~TcI~NR@r(Hmgz5iF<=E~os1Wm{Wqh@qR}r{W+=RzY9F6WKbp%pOmo47Z0rgJ Yshku0-6o!~_n8#3wy;N4A+ZVn0yXeC*#H0l literal 3185 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 diff --git a/apps/ptlaunch/add_pattern_light.png b/apps/ptlaunch/add_pattern_light.png index 47549b43e718f0929a1b58bb7dd71e3ff71f6b2d..998ec21a0819f504b03389508dcd12356c6146af 100644 GIT binary patch literal 2700 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 l8rwYIwsec%<81VVGd00S^dL_t(&-tC%= zlB+NXg~=Om-v4FS<_Cz4+6vCx-ht`58N2;Tj|7A*rKSB_R)2UqV6(TAPD4LTtN?IB zV7x;d81xLd6B>9EnycRRG+bcFuc68IyKp^txZ~9l6@{zw+xZZO)#Ctrir2bCd2Hi&0+$$?OjCBNQ4zHB($dn>($dn> z{#(OCMn7q-d4HQ%CE(LkNqAnB0G*16t*d@XeK*$qPMRe^Sl+_fA%Y$OZ;aCVfTAG? z__e5)Kfyl>rap{`1yct751x$zO0S72^(oPlxT@ypiW#yJBog{9qc0j4XB?|`pr-Z2=LU~%pc zEOX;QlQ=eK7g}`2I#-DPH7Gk+M#ycs9;*u@YhIcfvVm+i7gH{MOHKrT#=&4RH!Laz{8E@(F$J?%;}Kf> z4FW?%WF8lpGqjhxrG{0BeBHTAb88^f8VdYP_B-W1`#wK(^%0<*a#W zvmqPEX7>JgbTnb}usQ$$ literal 3008 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 aeV|ihqCHlzjQt}A082A8^66P@^#1^?Kzw)r diff --git a/apps/ptlaunch/manage_patterns_light.png b/apps/ptlaunch/manage_patterns_light.png index 5e4b27131e5531a7b3191c7664543c5e542d3607..13470f4506ace6d691b83d5b0d845350c07acfb1 100644 GIT binary patch literal 2944 zcmb_ec{J4R7yr&?8AKRKriH8}BuisWwva9RFy=L~6O{=gX1um)5ZSX2k;oQOX!IK- zGluNmNRcJGY$NiU_x=6#{{MT&}~=P@VmBz}jOk<0u=fHB1K_+E15Tx&?#Q=s7xrKrMIogj)a+h}pT*#7v8V z=wnoOtPdMZX=Bd)yg!uV(-Pnt=t;M^7<}RS^K{AUl=PuLifWb|PqhXy!Yyv)T7IsE zyI2iDpml~L#%Du1Rg7q?7=BRh^B=LGG0LK3Dr)+;xO(@5VozdVUmpen$f`oLY1SiN=Ey%7Y`au<mD=y~Qhhg&#^d4RYaF4Jd^zGd(>kCAH~vfcB!L0J(P1@3MRT6re6_1T$M|70@|D>gEnMJydnv2++eg>|fD*r4lH(@_pE{*OkZv`9O{a4L+AV4@Q^R4Y7cYBj5?^5 z2GCVbAZ=v%kPM+<=^H!0#-WDssV`uSz|?z5=D=$11Y}&A$ZxXIdtI2S>9s>_lZLd^-=w889yCh5Tl8=NH7BNr9$J*jyt5v`q}wbUZNs+IQ01U$KM|;04}SYxxpexZNt?v#QVCLy*8F z>m|W!?1m&F26w>p8JHb@1~(HDT9OdE9s?%}HbJQ7c7`Z2RG1YFjC6*v4q7QcG$|9RasRpAt&Gx#OWBqN+8@J}vATSwOl)VdteS0@R$-Or;)1A2SIS7Tu26j8 zD^Ib$2AR$t7H=F(#P_M{JHG}#7Lr?bBV<2Yqp^YzXM#aP4Hm)`0zKQO5s*+3Ap&X$Ng1>;w=@#<}`YskN*UZwdQxywnE9n+Qy^yi5SM_GyZtDAXl`a zu|ScOvtM(1?8ZY7GUUy)FqI(4Yw0ml7(P7Zm#UneSGx}6j;~~YR6!d;$nwayB&jVN zYZILNEP27h>lxvl{Z%4buP%w6VIG~PvP4rs4{EO8 z3dfK0)M9#tgNuoH3U_=dqAzl)bf9c1MB*y%d3O0QsQYjX@Q753*mXhsW(Ja?b)7+W zQ#eq zo}AWO*qY;k0+Wk4#+b{W@NU&%S{&|Gsatxu^j-W#QanC-qr2H-iKV)o)`fgjR##on zc?S(JY1-U1bG!UJHC=PfK3~edSA)p%Y6R&O3mC5Y*4!B9=YpcDtsC_VeSn=F)I%PL z>j9ihPA3H1LU`Xh=vknj|&X1Z2om4NP76L0WxnJ4`&dQ6GWob!v5Sj!d6%Bg! zFKD{?UGEQz6Id#;NhIz3nVrwMO|^fKwX}c1&q2(ApvjDs(|%!yvX8QFYx1kw*7wi+ zR4-OC;qCRE@OIc&cMZ>mub@(b|AB$Y3#DGFCO|>@>az0-<+Xyeq7KN$ahZo*v$MFfY)Ar<+(?6_kNtbW= z7aCJiCryNAPpaW z`Oq{woKnnFtYu<1^@e`lTy}jy=&`~tb0{bJ8X9NTym0X97vd@(_R?$}rUidWzi_)~ zT{gN7ks6UTcl_Rn{Pa9rOAu2J=9#+9*pPnJq%Se5{kydmjU(Juc$YLz(mCTh^3}{` zQpNJ5e&N{~r8Bygw%AR&)71nY#A`JJ4ZbNEOu2wLIIFsAP%8*^&Ith|$kz_L=)WjqS@zyh z9r){%BCH?3eofd5>FHIu0!dn0GK>A$tVJ-kXe9W&L8qSbci%QJIJ9jx{F@#Oy7q5> zQ&8Q?yg8?ucqF8E#Kls)oVp&5;`EhsP?S~L`bDbVR+drdYm2d!8P0G$8+L{>+#?<= zfc0F+a1CT6OARH-)mjaYyE@w=sK_*E8{#(&fCOQj`o(mopFAIwa`nqAwmpE%85X6$ z^@ulgMM5VT$R;Q=>E%#aQuCEG29QP;6$P%`#6ZOR9 z*BnRh^d4cja7}5046CB!QRsH8&d2OtB4&GKaX3ZH&Ml_>&Bz(5`M_u_Z)Ya#M8*4z zC8zGQAcM|6v)q^_C@20 SYZhBl1J?{K3|{JEqyG!vmv2r0 literal 3027 zcmb`Jc{tSD8^FKwWirOjBqmEt%35lW$Pi-&*|!*L_LynNa)+PGSP~IQu|$nw*b_1#$c%>bkg?Ga5sKqXJt%j$V9%IeA3Qk^X&sw%58bTYEA zGOSP63sqMV%nS2N&&)Dgk{yu}n-`P^>Gs-io_c&I{^Vw6NJeUSiU`EL;tLO`SC08> zxYxODqW&xi{oov$cNT`stV=Qm_RV3w!&YD}% zxIkQEwKNC1+KwDul37lj1goA*yxwU7aKI-*(nz#D?N zN5W!SIJB-r53F{IC-7%vWTHqY5(Q+~jUbppO0K|Y{uaZs-E*BO6%JVrYB!4gLP5hf zUv^#8aBEB3vvUGwtk0yk!(puUZo42C2qZ)MzNrtCH}vbQvQ`xp=sOjT(U8b|u7k&GfXYGQ;28oLW?p%kv@7iiz z=6c#zGjHDB2$=tHyOdw`1T`tK`%*5rq4h;N%Al~!HPxMeQUeKLxOE&0sogsz{OYI` zsbuC=d`Hnsm3yszl zdwrYhyeEZNj~cb>41k7d`s$G!amv{vY?myrA#1t!m@9O-onI;rWTqj+tRs>Afp5lH zZ<%Mt{b-!XM(0+S=|?!_m!DzFoSzuq-q~&9_Ct5P_JKoGsa4^;NzSnG!s*HondR|)+iF*52%C+Spb*cn|S`~wki{a+sdXY zdX1A+jBWcsMbN)J%9$bd8>}U}6IzFE^%?#)m2`!-v1zP~ZzuNgwHpf6Uvi_R)??(? zA9svW=ByAOQhznb@2|*h(Vy7wBu~H!#4kmul+ES1TBZ2pDOANyJz=6~dTrU0Nmjr#&wEl=E~$fA4s5^b1LkE!}tXm1uhOYN%TqlC(-^Koh443C61d!&t(B}>+i zj2BB4U-1iF$6W&J_-eIFn+^iztWm3;*lFQV8*_2UPB7o7+WrceQw^Y3aS*=%g;H78 z{`JXn=!O;{M6Ws!S^X%tP++TOm>pj1SUdKI5`e*v&K#;a#DtVlIL_DI_P^|Uyon?T zyo|jwa^tb{lj_3hIk)mnW=}bVb0iqw@sAp$>>_F>jUbGuxLk5!Fe_f=^_yE0`Bwuf zjMCGk<)1te|?lXZX|FAbqJl&U}Jh;-|2aYs2f= z@$8+hkj#zYLCFZ={ZnUJ_UGxEgm-Ryoug=-XI_3;;>npN35K1WS<6=^7AB@jalKE>uNL`E&_A);dgprfkOQf7?IWWCu!AS-c1HX-jvm9|eGm6X!& zNo~`kw8Jh*u*{atMm^>DiZgRWDbma356D7hA2^PqJx9= zpPAWWrwPZlFL|2=vx-K&cw%^loVKRe6^1K@JsuaryPR;M2R0$m3LNB>2<%HR z4bM{htcQ6#ZOWV33O8nXCRR+`+1CWKZ{x5L6UaF`p1|Ek+@H!Yu|1e(MXax!%zyBM zMZ$g_0=t*1nnl7kH6$*#Kad%)7K7xx^5; zHxQ*>D{6*l6R;X%We!H{gu!Q6h$-SzW=1NZ-m0A2M&yb^5q3rZe&{|)k6Rd99wPSMp+uE2t({1jV9sO7iWBwL^$$twRgN&|?y(p9hP)b%)jmqbpAv}dU0qTJe;zCg*^pVHK#H>yAB#e69j>J>!C_>9Yr;8E)ON#7&R zN9@zVjd>@H5tv{EW2>7R2kQ?hd))FM ucK=Gp7($decD|Hi%xyXDxu5SVW5%~*$4A3zqPMwSI$&;Ujjb{EPW&&J#d#wD From 3615d7fe4c65992acb38c110728d501eab245543 Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Wed, 22 Dec 2021 22:57:05 +0100 Subject: [PATCH 202/476] Update gps-info.js 1. (bugfix) Workaround for a crash in toUTCString() if fix.time has the value "undefined", see https://github.com/espruino/BangleApps/issues/1155 2. (improvement) The 4-dot progress indicator is replaced by the number of satellites in view. Tested on Bangle.js 2 with firmware 2v11 --- apps/gpsinfo/gps-info.js | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js index df888651a..cca7e8e0f 100644 --- a/apps/gpsinfo/gps-info.js +++ b/apps/gpsinfo/gps-info.js @@ -16,13 +16,17 @@ var lastFix = { time: 0, satellites: 0 }; -var nofix = 0; +var SATinView = 0; function formatTime(now) { - var fd = now.toUTCString().split(" "); - var time = fd[4].substr(0, 5); - var date = [fd[0], fd[1], fd[2]].join(" "); - return time + " - " + date; + if (now == undefined) { + return "no GPS time available"; + } else { + var fd = now.toUTCString().split(" "); + var time = fd[4].substr(0, 5); + var date = [fd[0], fd[1], fd[2]].join(" "); + return time + " - " + date; + } } function getMaidenHead(param1,param2){ var lat=-100.0; @@ -77,9 +81,9 @@ function onGPS(fix) { {type:"txt", font:"6x8", label:"Waiting for GPS" }, {type:"h", c: [ {type:"txt", font:"10%", label:fix.satellites, pad:2, id:"sat" }, - {type:"txt", font:"6x8", pad:3, label:"Satellites" } + {type:"txt", font:"6x8", pad:3, label:"Satellites used" } ]}, - {type:"txt", font:"6x8", label:"", id:"progress" } + {type:"txt", font:"6x8", label:"", fillx:true, id:"progress" } ]},{lazy:true}); } g.clearRect(0,24,g.getWidth(),g.getHeight()); @@ -87,7 +91,6 @@ function onGPS(fix) { } lastFix = fix; if (fix.fix) { - nofix = 0; var locale = require("locale"); var satellites = fix.satellites; var maidenhead = getMaidenHead(fix.lat,fix.lon); @@ -100,12 +103,18 @@ function onGPS(fix) { layout.maidenhead.label = "Maidenhead: "+maidenhead; } else { layout.sat.label = fix.satellites; - nofix = (nofix+1) % 4; - layout.progress.label = ".".repeat(nofix) + " ".repeat(4-nofix); + layout.progress.label = "in view: " + SATinView; } layout.render(); } +function onGPSraw(nmea) { + if (nmea.slice(3,6) == "GSV") { + SATinView = nmea.slice(11,13); + } +} + Bangle.loadWidgets(); Bangle.drawWidgets(); Bangle.on('GPS', onGPS); +Bangle.on('GPS-raw', onGPSraw); From a382c6bd4f785a49357712781dcb72c7ce44233b Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 22 Dec 2021 22:28:51 +0000 Subject: [PATCH 203/476] touchtimer: initial creation --- apps.json | 16 +++++++ apps/touchtimer/ChangeLog | 1 + apps/touchtimer/README.md | 3 ++ apps/touchtimer/app-icon.js | 1 + apps/touchtimer/app.js | 92 ++++++++++++++++++++++++++++++++++++ apps/touchtimer/app.png | Bin 0 -> 1770 bytes 6 files changed, 113 insertions(+) create mode 100644 apps/touchtimer/ChangeLog create mode 100644 apps/touchtimer/README.md create mode 100644 apps/touchtimer/app-icon.js create mode 100644 apps/touchtimer/app.js create mode 100644 apps/touchtimer/app.png diff --git a/apps.json b/apps.json index e5e9f8f02..33dae37c7 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,21 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "touchtimer", + "name": "Touch Timer", + "shortName": "Touch Timer", + "version": "0.01", + "description": "Quickly and easily create a timer touch-only.", + "icon": "app.png", + "tags": "tools", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + { "name": "touchtimer.app.js", "url": "app.js" }, + { "name": "touchtimer.boot.js", "url": "boot.js" }, + { "name": "touchtimer.img", "url": "app-icon.js", "evaluate": true } + ] } ] diff --git a/apps/touchtimer/ChangeLog b/apps/touchtimer/ChangeLog new file mode 100644 index 000000000..193a476aa --- /dev/null +++ b/apps/touchtimer/ChangeLog @@ -0,0 +1 @@ +0.01: Initial creation of the touch timer app \ No newline at end of file diff --git a/apps/touchtimer/README.md b/apps/touchtimer/README.md new file mode 100644 index 000000000..99c755639 --- /dev/null +++ b/apps/touchtimer/README.md @@ -0,0 +1,3 @@ +# Touch Timer + +Quickly and easily create a timer touch-only. diff --git a/apps/touchtimer/app-icon.js b/apps/touchtimer/app-icon.js new file mode 100644 index 000000000..d58446bcc --- /dev/null +++ b/apps/touchtimer/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkE/4A3mUQIAMRkYWQkBaFiQWQgMjn8zGYUDCxkxFA3zD4MfCxXygECMAURiReCDAM/IpUBFIJ2CAAIeB+ZJKBYI8BCwMBiABBDARSBC5EwFwMwEwUwh5FCEIJhJiEfGIIXC+IQBSwQeBNYR1Gn4xB+MDDYITBiEzFoIOCC4vwEAIxBAwQzBAoQtCBgaNEh4iEAwMwRQXxHgRnBLwsvFQJdCFoIGBl55DH4QAEEIK/BC4KjBC4RECiED+RnBXooxCn4uBKwPwgIiB+fxgQQCRwgeBLwRbBkAXBh5yCBwoACEAoVBC4fwJ4I+DC5EjJQQXDBYP/kJWDC4qmBBYYXFfIQXKiQvUL6AXGR5LzBR4YXIBAS/BC4UCeAQOFC4rvDN4LvCFYMgd4IXJmEABgMxC4bWBiADDC45EBZIRHBMYINCBQQXIIgIkB//wgIFDmBKBC5QNB+UDboU/kEzgCRBC5QTBNwUxLoZRDC5J5EmAqBkEAiYMCC5XzFIMRkECAgILDC5YYDAAUBIoQXNDAMhiMRkYJEC5oAKC7qKBACDfCK4IWRPwjqBkczAB0yGAcQGgYAOmByCfAYAP+MBC4QWR//yC4ciACMhC4YATC4T9BACUSLiQAdA=")) \ No newline at end of file diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js new file mode 100644 index 000000000..7ffce959f --- /dev/null +++ b/apps/touchtimer/app.js @@ -0,0 +1,92 @@ +var DEBUG = true; + +var main = () => { + var button0 = new Button({ x1: 0, y1: 35, x2: 58, y1: 70 }, 0); + + button0.draw(); + + button0.onClick((value) => { + log("button with value clicked"); + log(value); + }); +}; + +// lib functions + +var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } +}; + +var touchHandlers = []; + +Bangle.on("touch", (_button, xy) => { + touchHandlers.forEach((touchHandler) => { + touchHandler(xy); + }); +}); + +var BUTTON_BORDER_WITH = 2; + +class Button { + constructor(position, value) { + this.position = position; + this.value = value; + + this.onClickCallbacks = []; + + touchHandlers.push((xy) => { + var x = xy.x; + var y = xy.y; + + if ( + x >= this.position.x1 && + x <= this.position.x2 && + y >= this.position.y1 && + y <= this.position.y2 + ) { + this.onClickCallbacks.forEach((onClickCallback) => + onClickCallback(this.value) + ); + } + }); + } + + draw() { + g.clear(); + + g.setColor(g.theme.fg); + g.fillRect( + this.position.x1, + this.position.y1, + this.position.x2, + this.position.y2 + ); + + g.setColor(g.theme.bg); + g.fillRect( + this.position.x1 + BUTTON_BORDER_WITH, + this.position.y1 + BUTTON_BORDER_WITH, + this.position.x2 - BUTTON_BORDER_WITH, + this.position.y2 - BUTTON_BORDER_WITH + ); + + g.setColor(g.theme.fg); + g.setFontAlign(0, 0); + g.setFont("Vector", 40); + g.drawString( + this.value, + this.position.x2 - this.position.x1, + this.position.y2 - this.position.y1 + ); + } + + onClick(callback) { + this.onClickCallbacks.push(callback); + } +} + +// start main function + +main(); diff --git a/apps/touchtimer/app.png b/apps/touchtimer/app.png new file mode 100644 index 0000000000000000000000000000000000000000..8ccdb17f0cc322440aeb52d649f1c6dededacef4 GIT binary patch literal 1770 zcmVPx#1ZP1_K>z@;j|==^1poj7novwsMgRZ*{{H^*^782D=;`U{`1ts_xw&+7bU!~o z8yg!32L}QI0t^fcBO@bDPELr3h|<#1{r&yo;^Gz-761SME-o&YmzVbT_Ve@ec6N3N z2?+}e3rkB&wY9b1-{0Ka+{((zsi~=VcXu>2Gy?+z9v&X0rKQHk#wjT&nVFgK@$nE4 z5bEmcp`oD&2nZ1o5tx{m`}_O1x3`0XgJNQ0Qc_Y?RaI(gYLStV%gf9B{QT?d>t|V!Nl8grSy?M9D**uk4-XHG zjg8ye+u`Bi)YQ~bQBlRk#iOI6aBy%$L`2}=;2j+uHa0f-`T6?#`ZYB*FE20j^z;e} z3MVHgV`F1zXlUo>=YM~H)6>(=&dv=D4Js-s-rn9}VPUeeva_?Z6B83NGc#pnWv#8P zudlE5_4SO5j2Rgjd3kvzCMM?Q<_-=H1_lO3Mn<@}xM^u=U|?XLo}TXR?zFVDhK7dl z@bJ96yk=%*uCA^svsO%yB<21BVPrBEp-3K^DET4*9!5oKi- zm8lsiWfv>cEV|z>|4ZL<_HxM%jUVds%ihcLIq&V9cld9xjEk_2SLLvbw?$qT6|HG8 zu@ff7*;V7{#78D@1c^zLREIgq*E>k(jS7umt&^o5ltsy+*CnHj2^PfPDx=(% zgZ1UyP@!T&RQg#}4O@Ud%{yPFUb9gaut{nxuEk;pZ&$e?mePF(?hJBs-CeG`v1Kb+ zACCstJ@*FazYp8!NKrw>r0r}(auaJJki7#DLGEnkE_ikTyQA5H$||<1q~d=1_Mnk` zK(AQZxP0$}bj2B657Cv1eQd5ZYJ;@%VMNGw1|9((-A^7sx|hw5$*c6Z>{SP{4|1D| z8blo86FAJ3HSEOPBeFM!Kz0H7%%hfzC)uvD2Aw?W!Bc#?vIJ;lOle4XhTeUsNU;~o z9(B__PK9+E`7EqGd`^mMU3~snNLc>@H_PTqZ#$A5GKXOb_#$4Sqfm;+S#MFonz|lN zlctxs)q^I^HliU;a5Y}x&f{`qugds?g3PiPo<&*IUc>8rLxput@=YYkB7MLqo*ot^ z^9!R!XspCx!%TG|x%X z6#6Pmg!3BvrI_l~-W?R)W4Zp8UZ5W)g1v?dV29;>ZeJ1-R=7A1uv`3$G!taIKiD7B zjq~NhC*5bqht4do_ajr`;vv$z1t>{Wg11!;ra`=Vxj0M&d`y0#*9t%7B~QP|`UO+* z87WUO6|9$epjslRYvz^D>9HCWiH@5{Ub^RzGt~is7)3;XCTxwih$f7By?$G3xgL* zGs&J!gI~dD0`U8J9Vh*1T(0|t)$)Sh@`*U!KFs#(^b M07*qoM6N<$f}*WUg8%>k literal 0 HcmV?d00001 From 06283ba7ca77cfea6f0ec8785171435195aa6ff7 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 22 Dec 2021 22:30:29 +0000 Subject: [PATCH 204/476] swp2clk: disable debug output --- apps/swp2clk/boot.js | 2 +- apps/swp2clk/settings.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/swp2clk/boot.js b/apps/swp2clk/boot.js index 3119ce06b..bb8e792c4 100644 --- a/apps/swp2clk/boot.js +++ b/apps/swp2clk/boot.js @@ -16,7 +16,7 @@ */ (function () { - var DEBUG = true; + var DEBUG = false; var FILE = "swp2clk.data.json"; var main = () => { diff --git a/apps/swp2clk/settings.js b/apps/swp2clk/settings.js index 1e29e5a6c..a97b51fab 100644 --- a/apps/swp2clk/settings.js +++ b/apps/swp2clk/settings.js @@ -1,5 +1,5 @@ (function (back) { - var DEBUG = true; + var DEBUG = false; var FILE = "swp2clk.data.json"; var settings = {}; From 6eb5858742702d10deaf97645c958b3277a75413 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Wed, 22 Dec 2021 22:39:26 +0000 Subject: [PATCH 205/476] touchtimer: fix app.json --- apps.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps.json b/apps.json index 33dae37c7..93c5b7fcf 100644 --- a/apps.json +++ b/apps.json @@ -5075,7 +5075,6 @@ "readme": "README.md", "storage": [ { "name": "touchtimer.app.js", "url": "app.js" }, - { "name": "touchtimer.boot.js", "url": "boot.js" }, { "name": "touchtimer.img", "url": "app-icon.js", "evaluate": true } ] } From e81b97dc6f5adbbadde30aea4498a969a1421bfd Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 23 Dec 2021 10:08:22 +0100 Subject: [PATCH 206/476] Minor change --- apps/lcars/lcars.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index afbca2b8b..d9587c1ac 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -329,7 +329,7 @@ function drawPosition1(){ axes : true, minx: 1, gridx : 4, - gridy : 1000, + gridy : 2000, width : 140, height : 50, x: 5, From fdcc1f50dbef5a330bab703dc2300cf8c89796b8 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 23 Dec 2021 14:10:21 +0100 Subject: [PATCH 207/476] Show BT status. --- apps/lcars/lcars.app.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index d9587c1ac..32020a01c 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -168,7 +168,11 @@ function drawLock(){ g.setColor(cOrange); g.clearRect(120, 10, g.getWidth(), 75); g.drawString("LCARS", 130, 12); - g.drawString("B-JS2", 130, 32); + if(connected){ + g.drawString("BT-CO", 130, 32); + } else { + g.drawString("BT-NC", 130, 32); + } if(Bangle.isLocked()){ g.drawString("LOCK", 130, 52); } @@ -502,7 +506,7 @@ Bangle.on("drag", e => { } if(lcarsViewPos == 1){ - plotWeek = dy < 0 + plotWeek = dy < 0 ? true : false; } } From 6c7fd262b7cff644fd7a0b811b78f5311abfca16 Mon Sep 17 00:00:00 2001 From: David Peer Date: Thu, 23 Dec 2021 14:17:05 +0100 Subject: [PATCH 208/476] Minor improvement --- apps/lcars/lcars.app.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 32020a01c..5f328389e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -307,6 +307,11 @@ function drawPosition1(){ y: 115 }); + g.setFontAntonioMedium(); + g.setColor(cWhite); + g.drawString("HRM", 122, 9); + g.drawString("STEPS [K]", 90, 96); + // Plot day } else { var data = new Uint16Array(24); @@ -339,13 +344,12 @@ function drawPosition1(){ x: 5, y: 115 }); + + g.setFontAntonioMedium(); + g.setColor(cWhite); + g.drawString("HRM [24]", 90, 9); + g.drawString("STEPS [24]", 82, 96); } - - g.setFontAntonioMedium(); - g.setColor(cWhite); - g.drawString("HRM", 122, 9); - g.drawString("STEPS [K]", 90, 96); - } function draw(){ From f64c91e0b80e03e4b9a433cb3493867cc2ed5008 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Fri, 24 Dec 2021 00:25:07 +0900 Subject: [PATCH 209/476] SpeechTimer: fixed listing screenshot and allowed in emulator --- apps.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps.json b/apps.json index bf5e8c77f..f76800494 100644 --- a/apps.json +++ b/apps.json @@ -4697,6 +4697,8 @@ "tags": "tool,timer", "readme":"README.md", "supports":["BANGLEJS2"], + "screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}], + "allow_emulator": true, "storage": [ {"name":"a_speech_timer.app.js","url":"app.js"}, {"name":"a_speech_timer.img","url":"app-icon.js","evaluate":true} From 62b3cf0796df1e168a9b30c651bda5460273e0e5 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Thu, 23 Dec 2021 22:56:08 +0000 Subject: [PATCH 210/476] touchtimer: add all main buttons and create click handlers --- apps/touchtimer/app.js | 212 ++++++++++++++++++++++++++++++++++------- 1 file changed, 180 insertions(+), 32 deletions(-) diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index 7ffce959f..534f4d62c 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -1,13 +1,114 @@ var DEBUG = true; var main = () => { - var button0 = new Button({ x1: 0, y1: 35, x2: 58, y1: 70 }, 0); + var button1 = new Button({ x1: 1, y1: 35, x2: 58, y2: 70 }, 1); + var button2 = new Button({ x1: 60, y1: 35, x2: 116, y2: 70 }, 2); + var button3 = new Button({ x1: 118, y1: 35, x2: 174, y2: 70 }, 3); - button0.draw(); + var button4 = new Button({ x1: 1, y1: 72, x2: 58, y2: 105 }, 4); + var button5 = new Button({ x1: 60, y1: 72, x2: 116, y2: 105 }, 5); + var button6 = new Button({ x1: 118, y1: 72, x2: 174, y2: 105 }, 6); - button0.onClick((value) => { - log("button with value clicked"); - log(value); + var button7 = new Button({ x1: 1, y1: 107, x2: 58, y2: 140 }, 7); + var button8 = new Button({ x1: 60, y1: 107, x2: 116, y2: 140 }, 8); + var button9 = new Button({ x1: 118, y1: 107, x2: 174, y2: 140 }, 9); + + var buttonStart = new Button({ x1: 1, y1: 142, x2: 58, y2: 174 }, "GO"); + var button0 = new Button({ x1: 60, y1: 142, x2: 116, y2: 174 }, 0); + var buttonDelete = new Button({ x1: 118, y1: 142, x2: 174, y2: 174 }, "<-"); + + var timerNumberButtons = [ + button1, + button2, + button3, + button4, + button5, + button6, + button7, + button8, + button9, + button0, + ]; + + var timerInputButtons = [ + button1, + button2, + button3, + button4, + button5, + button6, + button7, + button8, + button9, + buttonStart, + button0, + buttonDelete, + ]; + + var buttonPauseContinue = new Button( + { x1: 1, y1: 35, x2: 174, y2: 105 }, + "PAUSE" + ); + var buttonStop = new Button({ x1: 1, y1: 107, x2: 174, y2: 174 }, "STOP"); + + var timerRunningButtons = [buttonPauseContinue, buttonStop]; + + var timeStr = ""; + timerNumberButtons.forEach((numberButton) => { + numberButton.setOnClick((value) => { + log("number button clicked"); + log(value); + log(timeStr); + if (value === 0 && timeStr.length === 0) { + return; + } + + if (timeStr.length <= 6) { + timeStr = timeStr + value; + } + log(timeStr); + drawTimer(timeStr); + }); + }); + + buttonDelete.setOnClick(() => { + log("delete button clicked"); + timeStr = timeStr.slice(0, -1); + log(timeStr); + drawTimer(timeStr); + }); + + buttonStart.setOnClick(() => { + g.clear(); + drawTimer(timeStr); + + timerInputButtons.forEach((button) => button.disable()); + + timerRunningButtons.forEach((button) => { + button.enable(); + button.draw(); + }); + }); + + buttonStop.setOnClick(() => { + g.clear(); + timeStr = ""; + drawTimer(timeStr); + + timerRunningButtons.forEach((button) => button.disable()); + + timerInputButtons.forEach((button) => { + button.enable(); + button.draw(); + }); + }); + + // initalize + g.clear(); + drawTimer(timeStr); + timerInputButtons.forEach((button) => { + button.enable(); + button.draw(); }); }; @@ -19,11 +120,35 @@ var log = (message) => { } }; +var drawTimer = (timeStr) => { + timeStr = timeStr.padStart(6, "0"); + var timeStrDisplay = + "" + + timeStr.slice(0, 2) + + "h " + + timeStr.slice(2, 4) + + "m " + + timeStr.slice(4, 6) + + "s"; + + g.clearRect(0, 0, 176, 34); + g.setColor(g.theme.fg); + g.setFontAlign(-1, -1); + g.setFont("Vector:26x40"); + g.drawString(timeStrDisplay, 2, 0); +}; + var touchHandlers = []; Bangle.on("touch", (_button, xy) => { + log("touch"); + log(xy); + + var x = Math.min(Math.max(xy.x, 1), 174); + var y = Math.min(Math.max(xy.y, 1), 174); + touchHandlers.forEach((touchHandler) => { - touchHandler(xy); + touchHandler(x, y); }); }); @@ -34,28 +159,11 @@ class Button { this.position = position; this.value = value; - this.onClickCallbacks = []; - - touchHandlers.push((xy) => { - var x = xy.x; - var y = xy.y; - - if ( - x >= this.position.x1 && - x <= this.position.x2 && - y >= this.position.y1 && - y <= this.position.y2 - ) { - this.onClickCallbacks.forEach((onClickCallback) => - onClickCallback(this.value) - ); - } - }); + this.touchHandler = undefined; + this.highlightTimeoutId = undefined; } - draw() { - g.clear(); - + draw(highlight) { g.setColor(g.theme.fg); g.fillRect( this.position.x1, @@ -64,7 +172,11 @@ class Button { this.position.y2 ); - g.setColor(g.theme.bg); + if (highlight) { + g.setColor(g.theme.bgH); + } else { + g.setColor(g.theme.bg); + } g.fillRect( this.position.x1 + BUTTON_BORDER_WITH, this.position.y1 + BUTTON_BORDER_WITH, @@ -74,16 +186,52 @@ class Button { g.setColor(g.theme.fg); g.setFontAlign(0, 0); - g.setFont("Vector", 40); + g.setFont("Vector", 35); g.drawString( this.value, - this.position.x2 - this.position.x1, - this.position.y2 - this.position.y1 + this.position.x1 + (this.position.x2 - this.position.x1) / 2 + 2, + this.position.y1 + (this.position.y2 - this.position.y1) / 2 + 2 ); } - onClick(callback) { - this.onClickCallbacks.push(callback); + setOnClick(callback) { + this.touchHandler = (x, y) => { + if ( + x >= this.position.x1 && + x <= this.position.x2 && + y >= this.position.y1 && + y <= this.position.y2 + ) { + this.draw(true); + this.highlightTimeoutId = setTimeout(() => { + this.draw(); + this.highlightTimeoutId = undefined; + }, 100); + setTimeout(() => callback(this.value), 25); + } + }; + } + + disable() { + log("disable button"); + log(this.value); + var touchHandlerIndex = touchHandlers.indexOf(this.touchHandler); + if (touchHandlerIndex > -1) { + log("clearing touch handler"); + touchHandlers.splice(touchHandlerIndex, 1); + } + + if (this.highlightTimeoutId) { + log("clearing higlight timeout"); + clearTimeout(this.highlightTimeoutId); + this.highlightTimeoutId = undefined; + } + } + + enable() { + if (this.touchHandler) { + touchHandlers.push(this.touchHandler); + } } } From 144bb884003e1c249406853e360a485dbf8f3f64 Mon Sep 17 00:00:00 2001 From: t0m1o1 <94725994+t0m1o1@users.noreply.github.com> Date: Fri, 24 Dec 2021 03:03:45 +0000 Subject: [PATCH 211/476] Update settings.js --- apps/setting/settings.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 1a9463858..bb54fa7e9 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -500,6 +500,9 @@ function showUtilMenu() { 'Debug Info': { value: E.clip(0|settings.log,0,2), format: v => ["Hide","Show","Log"][E.clip(0|v,0,2)], + min: 0, + max: 2, + step: 1, onchange: v => { settings.log = v; updateSettings(); From 3873acd7bb3f81ce665e0b333e0160653574a63b Mon Sep 17 00:00:00 2001 From: t0m1o1 <94725994+t0m1o1@users.noreply.github.com> Date: Fri, 24 Dec 2021 03:17:11 +0000 Subject: [PATCH 212/476] Update settings.js --- apps/setting/settings.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/setting/settings.js b/apps/setting/settings.js index bb54fa7e9..1208018ed 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -499,10 +499,9 @@ function showUtilMenu() { '< Back': ()=>showMainMenu(), 'Debug Info': { value: E.clip(0|settings.log,0,2), - format: v => ["Hide","Show","Log"][E.clip(0|v,0,2)], min: 0, max: 2, - step: 1, + format: v => ["Hide","Show","Log"][E.clip(0|v,0,2)], onchange: v => { settings.log = v; updateSettings(); From 74c2eca062ae13bd5b45ed86a6090356085476c4 Mon Sep 17 00:00:00 2001 From: t0m1o1 <94725994+t0m1o1@users.noreply.github.com> Date: Fri, 24 Dec 2021 03:18:29 +0000 Subject: [PATCH 213/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e5e9f8f02..299920067 100644 --- a/apps.json +++ b/apps.json @@ -167,7 +167,7 @@ { "id": "setting", "name": "Settings", - "version": "0.38", + "version": "0.39", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", From d6f6b95daf4eddae94a29d9f2d5de4a4f1d9b4b0 Mon Sep 17 00:00:00 2001 From: t0m1o1 <94725994+t0m1o1@users.noreply.github.com> Date: Fri, 24 Dec 2021 03:24:44 +0000 Subject: [PATCH 214/476] Update ChangeLog --- apps/setting/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 143144d51..a2245a02d 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -41,3 +41,4 @@ 0.36: Added 'Utils' menu with helpful utilities for restoring Bangle.js 0.37: Going into passkey menu now saves settings with passkey 0.38: Restructed menus as per forum discussion +0.39: Fix misbehaving debug info option From d0eb56597670be1db6905d66a436cbbe84d4153d Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Fri, 24 Dec 2021 12:31:00 +0100 Subject: [PATCH 215/476] grocery: Prepare porting to BJS2 --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e5e9f8f02..261c9aeb7 100644 --- a/apps.json +++ b/apps.json @@ -1749,8 +1749,9 @@ "icon": "grocery.png", "type": "app", "tags": "tool,outdoors,shopping,list", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS", "BANGLEJS2"], "custom": "grocery.html", + "allow_emulator": true, "storage": [ {"name":"grocery.app.js","url":"app.js"}, {"name":"grocery.img","url":"grocery-icon.js","evaluate":true} From d76a89b89acdb55aa25059c2522492302854e9e4 Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Fri, 24 Dec 2021 12:42:25 +0100 Subject: [PATCH 216/476] Update gps-info.js Sum up number of GPS and Beidou satellites in view. --- apps/gpsinfo/gps-info.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js index cca7e8e0f..4c935b61a 100644 --- a/apps/gpsinfo/gps-info.js +++ b/apps/gpsinfo/gps-info.js @@ -109,8 +109,13 @@ function onGPS(fix) { } function onGPSraw(nmea) { + var nofBD = 0; + var nofGP = 0; if (nmea.slice(3,6) == "GSV") { - SATinView = nmea.slice(11,13); + // console.log(nmea); + if (nmea.slice(0,7) == "$BDGSV,") nofBD = nmea.slice(11,13); + if (nmea.slice(0,7) == "$GPGSV,") nofGP = nmea.slice(11,13); + SATinView = nofBD + nofGP; } } From 165d1f7b999079aaf98d18ab09b5abdc681f68db Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 24 Dec 2021 12:44:06 +0000 Subject: [PATCH 217/476] Pastel: updated README and screenshots --- apps.json | 4 +-- apps/pastel/README.md | 46 ++++++++++++++++++++++++------ apps/pastel/screenshot_pastel.png | Bin 4014 -> 2993 bytes apps/pastel/weather_icons.png | Bin 0 -> 1506 bytes 4 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 apps/pastel/weather_icons.png diff --git a/apps.json b/apps.json index 214b8b350..a3f2788ee 100644 --- a/apps.json +++ b/apps.json @@ -4214,9 +4214,9 @@ "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", "dependencies": {"mylocation":"app", "widpedom":"app","weather":"app"}, - "screenshots": [{"url":"screenshot_pastel.png"}], + "screenshots": [{"url":"screenshot_pastel.png"}, {"url":"weather_icons.png"}], "type": "clock", - "tags": "clock", + "tags": "clock, weather, tool", "supports": ["BANGLEJS","BANGLEJS2"], "readme": "README.md", "storage": [ diff --git a/apps/pastel/README.md b/apps/pastel/README.md index 66ae0e189..7dbfbe9a1 100644 --- a/apps/pastel/README.md +++ b/apps/pastel/README.md @@ -1,45 +1,73 @@ # Pastel Clock - *a configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times* + *a configurable clock with custom fonts, background and optional weather icons. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times* * Designed specifically for Bangle 1 and Bangle 2 * A choice of 7 different custom fonts * Supports the Light and Dark themes -* Has a settings menu, change font, enable/disable the grid +* Has a settings menu, change font, enable/disable the grid, weather icons * On Bangle 1 use BTN1,BTN3 to cycle through the info display (Date, ID, Batt %, Ram % etc) * On Bangle 2 touch the top right/top left to cycle through the info display (Date, ID, Batt %, Ram % etc) * Uses mylocation.json from MyLocation app to calculate sunrise and sunset times for your location * Uses pedometer widget to get latest step count +* Use the wesather widget to get weather status * Dependant apps are installed when Pastel installs I came up with the name Pastel due to the shade of the grid background. 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/) -## Lato + +## Weather Support + + +![](screenshot_pastel.png) + +Pastel installs the weather app and weather widget. You may want to +hide the weather widget display, this can be done through the weather +widget settings. You should first get the weather app working. If +the weather App is not working, then it is not going to work for +Pastel. + +The following weather icons are supported. + +![](weather_icons.png) + +Mostly cloudy, Sunny, Mostly Sunny, Snow, Rain. + +The triangle icon shows there is a problem connecting to GadgetBridge and the weather service. +You should follow the setup and trouble shooting guide for the Weather App. + +If you find the weather / gadgetbridge service unreliable you can +disable weather updates to pastel through the settings app. + + +## Fonts + +### Lato ![](screenshot_lato.png) -## Architect +### Architect ![](screenshot_architect.png) -## Gochihand +### Gochihand ![](screenshot_gochihand.png) -## Monoton +### Monoton ![](screenshot_monoton.png) -## Elite +### Elite ![](screenshot_elite.png) -## Cabin Sketch +### Cabin Sketch ![](screenshot_cabinsketch.png) -## Orbitron +### Orbitron ![](screenshot_orbitron.png) diff --git a/apps/pastel/screenshot_pastel.png b/apps/pastel/screenshot_pastel.png index d489f19143b598f426b309b2e07904b222d1108f..c792ada8d932feabe3eba3feed17b61de7ed87c5 100644 GIT binary patch literal 2993 zcmc(h={M938^?dY8H}YwOxZ>vnLA}4TXtiRrA!#x43$s{*#~7*vW~cwB14v2s~KW$ zWSgFlijj4!6Oy4ZOm=eT@%#tRInRsdI_J7R=X}rkyt!U|)6O~D?iZC41pr{by&W36 z$EyFVu+ZM6)y)w007hVKtpF-hVIBa)g6+|kuCW9jWh{KgP#n$L-R)%~Lto+C&!eZ0 z=U6cN+oS~{`6&{|9+~=n-J9Jhb63Cff-S=Q3Z^#ih@h~RrLfy1m#ePFHX07{P-0vO z-`KZf%)mlMbBNMQa@M2gjgvocIEL^0>BZQap(*_+~53-rYL{kHFOs{_S4`az~iYxtCRqun#fkz^Y)JtaKFV;q$3ia%f7a}Mgyq=n2rAt>Q*tNZ#b~`%4nCF?<^7G*A12GyXkUNSnH*0moe8ceS!Le zQInz>DKr#Kc=1cw=IW7!H*bah3~omW#Oi!izPDnkRf?sc%*{LNPorXJt$K)I9pl2r zR`;tjrhH_@>bV!)ceuqaexg+mZu`F#Vn6q8xO^+`M|R{SXXy|AhV94Ek>rZjK)IOT zt&kn7(^rPQKu8n)rehJ1n^Xx`Vt9{zm=V#E{jcI6!K&5D#!AYyf&_U|j;4C$vY={r z-DbA$RQ_PgneL$#7Q|0Pcs}A){Sa4g%MMV1ZRB#ON{?V3I-8_@_`u|Y&5NRi0(rB) zdf>Yn3ZPle+IptR_QObZMuA3_A{EYhDC9Bb_SaaYK<Qta==mabf%kc? zM(}4a;SeE0tXVhn3zZyxg~ZA$8nHoIkW^g#Gg;C~44QopS!IusCv-Z3MI|O#<(v-5 zJqp8Rzo7($`N4e=--HE)!|tYM{w#n9Y@+5HZrp_k7+TqM#5#eHor2YILn{!XP@;UP zsR96RImLx2lvo%u@>^#^;C}6ewe<0u{foTN9#aa=kda5z3dm@==V6Quax!2B4ha)L+TL)vNPC=nh}|h?7EgO#X`pGq=v9sv zdozAjvZ}PpcKy@K3vSmDa2@b(X5jOUR#Ivwwa*pb!I_kmB9{VmyZy)Rz9e0Od%R7Yj@tD{7M2A1z09W4 z#qb~E3xYhRW9az49NmingT-(b_wxcDGbb+;hQ=*R&ot9jgGKp9?qWs3~C-rs5G_xqLSdM%2|^%pmJUv9o>F+1sL{rHLkvGcP@8(ARt zu9d|Q>9p>I9PFd^t415^%VNE`P^K*n@lE;bs>2fo&C z&-idg)S(3K>t{wvlEJ!DgPBr8UMHPOU16BXhv+{q+OfR5R|p%@P5IyM+KlM{w(>HF z95u8Gw;G;28S> zlME1jhPoOyfAohej;oRAx}vvehfSH)Pw5MpiK-)*PGUOHetNf ze<1&*cwv6wAd(w}Y#aHh9>sPv3po($3R`D0UqAJrc_Stl-hSCeaoL@o6G^(x`E_AS zYo2vWDw@3KId1obFuYMU4%;_0wHDz~kW8l-mhw|&aPLjDO(V9l_yKyTRUqHE>H)vH zVSs3ojfNbS{d`^uLX$p%A}kA$RjMT#dXQ?m4D7TVhzUNGTsG^Ks4m;kXlFD&sEX$d zt}Mo7Fk3^Wa&g6}1om4WAkcC_5+x;YO!G=&&(zNX#2_+Tds!qlakGZWC^-LIQZWgg zu4Z`*zohLo+9<}5G*dR)d&^*&N=BZARhwlXvHJoQQdJ&W{z#YhF8~v&UbI+|#LT@f z=p!&aIP1&3ehVJ^9+NsRBD-(vEQRSp=*(^T{^G%bhI6PQsmfKpb=>0jyQJ zlbb+2c@QP0%0S(`ejW~nT#D+p5(#ti9dorIjd|c}&OvjN#-&y9cm zUVGXvTx|twf&QSzXAL>5EH*rGr`&XaUL&5ceVY0>DbONrNtnY-TpVu9g4wZEZBs|a zV*_7vI{oA5EV=tf3ci0#Vs2J4=ZA+Dv$?rZ~=SU%Z6o2hr z@aQt;wDKNx8x*aPLW`mO-M3dz6@zt*XH)U6_+R-ef0pR_o PiUamG&Sh$~K5uQkuL!te52-`kE&MoXgQ+6$%% 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 diff --git a/apps/pastel/weather_icons.png b/apps/pastel/weather_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..59d4f007f51ed9a607e3765edbf0c5fb525ee619 GIT binary patch literal 1506 zcmb7E`#;kQ0Nr;sn-Nx_&08uZ2}!19=CQehqGb_RM-ELDNc`9@cz2 zn4J^tmbFJdmv~6ttTcAR-0#08;QE}Ecc%y8N^ezi8vSyRRYCekHZD+eV?Qqfh37`r z1}S{fb<|Nu?eN`4we>lSvQ&y)Ip+~9?>ac^Y%0gaoa?>a9d@X=0U;8wH1D1_1mx zcD`##=gN7X{gxI|bMBDJ>5JC{%`d9cTX^y|`ImgWRKV7CAmjcZ23@k@GJsL1Ck3v3 zIb?sH-6;_*JTrXTd+u37A(BcT$Fo3@--_=^prRvw?S>NC;{z|)3JT?Jp^BBo!FaR) z8g$YhJ)G&PnP#aa$c{2RxLoqsj!F1hpgSISpM`=W3*QzCa#$V(vopO17t+$hPPUTx zNUQBhnD2C|Joi>F3yV5&TWTP9d2NDaX3q})60veR1<$TpgIQ3ds2GYFn--K20fzaT z*T+bf`X&?hm0D>xq_P5AHGh0pR&5Pjt&GdPL5ku!Db#RY#_grsx>`ggO2$e{x4isB z3kZ#xYlvrv!2>WBGGsz?eOQ7acp4LYhjrDNz3Cx<5jsYyc4iTjt`ZwFk2Cwp0a3aJ z_lEm8<*@dY4$A4)gEm~V?hMPR!{=-P!<`Fx6*mC(8II(#H|INWb#xj#Vv3WA(;_Mm zvCG=aqo0_%C|L!Rts1vk!`FQf@)hVn3mfK`&U?SQ+z z3ny&6AA&~RojcdD7L38y{Ym!dgpE@ydk#5uw^5=yN=q(%ay!`%dEQ*hIdFT9ni!Q) zrDkIrv0-DZxDvS*GZGnoz3BMF`*=e|@PwO|Q3J1&YUW}>HA@|_pLsZ=2$p%!hQT4% zorGefaU82OLDc0D!z$iBHoik0cwn^nsuNY=`nLP*YS#1DPZ)OV080V8GLp_&zd1p2-ouq(65%cB;arr`x1h8dPZKiwDJSHES>lN+WiYxY> zc63qWCnsHuG&jY?42KY+aV{x3+H`Pa9P~Xk`qxpve&M?5F)R^Yx0s; zQy5Ml&1-vi%*qiP0>JrV$%9jSGhPQgX^fdxcVK|xm04QKf2>6TrZAno04D>?uXK1L z&8`s4T0KIqgOK`Uruh!%Myguu{ErlMzC>ej z+oPJ*Kvk`ey$B10{|fgRhm@wd-r>6MgRO7oO-;KH!me;M@`E+KHUPgnu@>tAv8wuMv0zM(l`Z=b=dnNgclvheqyc}C zo-#Le$*(I~emXZ%LCWftQ55mh;xC)+9cM>2Ml-fd=4e>AP(dO4?UQC?gPlL>Kmmy1 z035ZpZk)AsGo9QtpZ*Oxwdy#A!2{eB#n6S&{}(-dM6aI-QY|w0@4G>s?mlj9_^_;h E0d)$;RR910 literal 0 HcmV?d00001 From 39adcc7fa6a5c399361b8ebfd347d4d5c558b815 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 24 Dec 2021 13:00:31 +0000 Subject: [PATCH 218/476] Pastel: updated README and screenshots --- apps.json | 2 +- apps/pastel/README.md | 12 +++++++++++- apps/pastel/screenshot_grid.png | Bin 0 -> 3921 bytes 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 apps/pastel/screenshot_grid.png diff --git a/apps.json b/apps.json index a3f2788ee..8a0d86b97 100644 --- a/apps.json +++ b/apps.json @@ -4211,7 +4211,7 @@ "name": "Pastel Clock", "shortName": "Pastel", "version": "0.10", - "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", + "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"}, "screenshots": [{"url":"screenshot_pastel.png"}, {"url":"weather_icons.png"}], diff --git a/apps/pastel/README.md b/apps/pastel/README.md index 7dbfbe9a1..b396386af 100644 --- a/apps/pastel/README.md +++ b/apps/pastel/README.md @@ -8,10 +8,13 @@ * Has a settings menu, change font, enable/disable the grid, weather icons * On Bangle 1 use BTN1,BTN3 to cycle through the info display (Date, ID, Batt %, Ram % etc) * On Bangle 2 touch the top right/top left to cycle through the info display (Date, ID, Batt %, Ram % etc) +* The information display will cycle on each screen update * Uses mylocation.json from MyLocation app to calculate sunrise and sunset times for your location * Uses pedometer widget to get latest step count -* Use the wesather widget to get weather status +* Use the weather widget to get weather status * Dependant apps are installed when Pastel installs +* The screen is updated every minute to save battery power +* The weather display will display temperature and wind speed on alternate screen refreshes I came up with the name Pastel due to the shade of the grid background. @@ -71,3 +74,10 @@ disable weather updates to pastel through the settings app. ### Orbitron ![](screenshot_orbitron.png) +### The Grid + +Setting the grid on provides a graph paper style background to the App. +The grid is not supported on a Bangle 1 due to flicker issues. + +![](screenshot_grid.png) + diff --git a/apps/pastel/screenshot_grid.png b/apps/pastel/screenshot_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..7b993353b533d4ceab374d6cd7272133aa740597 GIT binary patch literal 3921 zcmd5<*H_bv(*30n3C&PM5JZY}kQht=rAw14C^Z6+5|HjejtYbX5o-WxL4y=U5s}`4 z(n2|cAmku5att{HkrJ9z!NBEP>wCNZzx&u)r|^004w9*jTt6 zVAcNxKkOh^(x!b502J+FZ4Oin$j$-4VZjR)W|wdIEapv6I2uA0P5b*r(Qc?k+513g z#@&?b{hTwfw{@am-=Dj;4CPFARQXPo(kp@1;OT%(I}k_<;c{e~$8%VWob)XBK+rp< zTZ6jaK*FTyl+X2hv4pBcJ^RhEl-d1!{hvOO*Kr1ODZ>kEN)YTyM3VeRPeS&A!tTB{ zsff4sqWQ;>xN)t1yJW8`gFxKb5YPxDW}ik$mwZ}jp5T77xL1N3zQpMvU_hg>9N~d9uAC%kg_n+eE?>P^;%e+6%Gpa0pldaMz6QNi z>GdZPSXRALqjTu$tBo^&Qumc$%6W`Sd2BsJAx`ieNo_7uae~ zYN_(b)mtw99LhMJ7(kG7&e+(A&od`O#{~s50*!#U#jB9pW1DW$QiI98^p<`JFG$?g z>WW&tL9H{HzcjS%hzATO*x|EM9-7X*5;0X~%*R0=38o;@g~$UP^BKTDlBe{N(Q{03 z!Rg^Cs)EnN{3$wR!A-c=hk^ezYGH;clw7AQ?(E76G)F2Id5V`4e?&RCl~s`Bf_;rT z9`CA>jvii_UxKqol$slf;9ILeY+B~ndAywkW* zpZnFlk4gxyCFj##_|wPKg9Pc~wt^iFsCSMP#(U3@SB*Fnj9!6Id<7!U5*(kI@AL&z-qzZBqsneHeZQ?W`nkwqmXJq z!~zQ(>WYhy+z(;f7_48Nyur>#ILmBRDobYzZ>y(8Dnd`vB&x|=JwkdXU;d}R!&h? zW_bQ;8z1DSwFl7g`|Y(T+-)=$qc}xz22C2OkF1A4NRIj z>q>*^p=%*I;l5l61I>`cgx;|n#Xtx(#*PG;S@=>2?hC{7I|F$DeKMHG%S6J^^c7q1S`BsR5 zFN)nJ5EkwcG?k74P9M3yGI`?sa=WA_{5ZRlu&-XeYCYBv@^(Fq7ra~67~u5aA6?PW z9p^<|;)n1C-@)^Q-2NrAYM)Y=RZXUKw{rodl<5~}KWx1m8R4-r%sn4ox_SIJ{B9=* z@B6Y2{NbUP*x)0tA9iyk1UjNp#f?}}Pz17CH032UobPKO6x;{G3}pJF-1f;2${Siv zh#CIOx!~+;4UkifT$U@3?fl!`>i@5CQlW@7VAU<9T$+8FdA)q^B2gD))g3^n|Ed%$ z(nl{FVhMGV*JL|&+c7T~#zBGc-zWj0=Iio)-L<6ky_Q_|7u_g!Q?r(Q34OF$?5k6` z<71#BY)VRIOMD=-AjnXsuqUP;n!^`$uTu%II=tz;JGl3x@UsB2GiQPd1&v@y_q9YkSmxMvwbCud0#!6=ELw}fcd$_h4%fTjk zMrLxdKK?uqv5^>1)}wx5G3b*Qwn7Otrxt07K-@Og*&mO0`)5jEO?Vf zCD@phh)6^V9U|c>veWe^xBIwCH3|7g=_5cL~U>ErmVmU=BcZa!oYJ7GSofPT%K2lLjDmR zBc^Qr9FClFibNfUAtAC;5<@3)Q(73cs2{zQv}eka)D2Oonw^^8*8ca#?XwZ+Lrm(C z>r3;%mTAvDJ;4uKkH7)Z67=9E1psU1U49p*I_%z0U1^GNmO&|4g;h)S?3{zHIL!== zmwX?M^R{kb1Tt4O+??Nl7g5}vSq@qpoDkqE5bTtLprp7R%fgop6WP8u*?13K`xiWggZNB7RP3}2a=0?=K^tb5ju)-oNB~sfTlertdQi6L?!z?uIxox; z=)t-=Nzhev@b54G29ucIKa9vFzVws>XPy{2{E*LYK^uisl+2tnt{F0u))&NKE{)n& zk&`q}s({CDeJ>FbQS`u@rpu>7Z%*pX$Gw^f>J#fKeyxjy@GH6r7YCb4%UE}kgAp5g zahX=~u9FkrKfw z(F!L@KbM_eXlQ8(Snd4eHj1j*?jo=rB++w<8)pP60XYB(7J>jDZkJ>u$lBV$PvDQY zlg2wp6PnKualIJN&4bSJx%w8+w8kE^_U^@8Xcg}t6;wMEX&zeXuqyTr_z1PUK|RK1 zIe%rX%-**_8bHc5BClfGr9C0K^+<5f*cT$ZTETDfnzWQ9K9(fYw#YWJ?JG@;gDcj& z=&xZ=r)PaEfFj+uBdNbPpQ5iw%F{sGSvRN3)KEm)7T7*A9?NdgZXJ51i3lI4G5OSB z7sMt!O;=WjKW0Q^C3@E=u6nh?Hr0Z(2Om^TG|r|-est_JF4bW-oB@Bbe)+dbD%_0K ziCX@4+XXl^Q~;_5PTl(aS-vu*=NqYSGv~LksAfyR$4;-sC!gx=g~Q;)XXIzXQJm;< zep$2wAJX=#Z|)JdI=`-@r-UE?K!SV>`?Ni|E1fbkVQ2;Fx0h_ z6%oTb*b?!db>i<%hxVsN=Iz&L92jbiKpQm z0yvHM-U9^`k7>vIx-8=hP)LIpORyg9o&XMHua2B}q;^pF7A8qQiL8ZVb~9r2c7L~B zG{3VQlD{sOWw0LooYmwrI@u3$j3CW6K5Lv~zb}^5wHy0^KGYg?GZ=o=i2i%@_i7tB z495BxobYRAc}|s)>4XmR+|^o7-@AC+*Pqu?+kItiZ~h|Z>NfRH%93`QC^3$j2aa+g z<;;M`rR)S_WkVw|!~e zBEe!;Gv?adaEQB#Tpwd`xrER!lrX(UmozjYh1#*Li!m&oU;dtTTj?6e_H=^I$o4-8KNXW?=vv+wIkHk%A9aa(@f*TzR3Del+Yw%5L8v{#? zLjxh?(Yy9lA(}QD_e7$&BUGtiVm^1b6@Sye>rw}y-0xMJ?-(O1F|OVZt)D7{GYbm; z`SjBl4TFaL{ZjYiwD%6gvu)=N>8$PQMu5V?#UEim)i*_F=fdj!-yKtPQ{j$$4J1k$ z`jD7M3ddTnykv5B>#u35K)ohtFB3kAy}Tb4ezbp>zUx&k5cS>vW($`!;av-0V``69 zEQ#iWo@YC@0(=PK5JMirOMJ^V)Yx}k)TQ6bbZYr&>_7;Wz|HF&8ExQ(xTM Date: Sat, 25 Dec 2021 07:29:53 +0100 Subject: [PATCH 219/476] Create colorwheel.app.js --- apps/colorwheel.app.js | 81 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 apps/colorwheel.app.js diff --git a/apps/colorwheel.app.js b/apps/colorwheel.app.js new file mode 100644 index 000000000..49648558c --- /dev/null +++ b/apps/colorwheel.app.js @@ -0,0 +1,81 @@ +//----------------------------------------------------------------------------// +//-- ColorWheel - draws a "wheel" of good looking colors --// +//----------------------------------------------------------------------------// + + let ColorList = [ + '#0000FF', '#8000FF', '#FF00FF', '#FF0080', '#FF0000', '#FF8000', + '#FFFF00', '#80FF00', '#00FF00', '#00FF80', '#00FFFF', '#0080FF' + ]; + + let ScreenWidth = g.getWidth(), CenterX = ScreenWidth/2; + let ScreenHeight = g.getHeight(), CenterY = ScreenHeight/2; + + let outerRadius = Math.min(CenterX,CenterY) * 0.9; + let innerRadius = outerRadius*0.5; + + let sin = Math.sin, cos = Math.cos; + let twoPi = 2*Math.PI, halfPi = Math.PI/2; + + let DeltaPhi = twoPi/72; + let Epsilon = 0.001; + + g.clear(); + + g.setColor(0,0,0); + g.fillRect(0,0, ScreenWidth,ScreenHeight); + + for (let i = 0; i < 12; i++) { + let Phi0 = i * twoPi/12, Phi1 = (i+1) * twoPi/12; + + let Polygon = []; + for (let Phi = Phi0; Phi <= Phi1+Epsilon; Phi += DeltaPhi) { + Polygon.push(CenterX + outerRadius * sin(Phi)); + Polygon.push(CenterY - outerRadius * cos(Phi)); + } + + for (let Phi = Phi1; Phi >= Phi0-Epsilon; Phi -= DeltaPhi) { + Polygon.push(CenterX + innerRadius * sin(Phi)); + Polygon.push(CenterY - innerRadius * cos(Phi)); + } + g.setColor(ColorList[i]); + g.fillPoly(Polygon); + } + + g.setColor(1,1,1); + g.fillCircle(CenterX,CenterY, innerRadius); + + g.setFont12x20(); + g.setFontAlign(0,0); + g.setColor(0,0,0); + + g.drawString('Tap', CenterX,CenterY-20); + g.drawString('on', CenterX,CenterY); + g.drawString('Color', CenterX,CenterY+20); + + Bangle.on('touch', function (Button,Position) { + Bangle.buzz(); + + let dx = Position.x - CenterX; + let dy = Position.y - CenterY; + + let Radius = Math.sqrt(dx*dx + dy*dy); + + let Color; + switch (true) { + case (Radius > outerRadius): Color = '#000000'; break; + case (Radius < innerRadius): Color = '#FFFFFF'; break; + default: + let Phi = Math.atan2(dy,dx) + halfPi; + if (Phi < 0) { Phi += twoPi; } + if (Phi > twoPi) { Phi -= twoPi; } + + let Index = Math.floor(12*Phi/twoPi); + Color = ColorList[Index]; + } + g.setColor(1,1,1); + g.fillCircle(CenterX,CenterY, innerRadius); + + g.setColor(0,0,0); + g.drawString(Color, CenterX,CenterY); + }); + From 78c61a5327bfa903992680ed880eef767289a85d Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:31:01 +0100 Subject: [PATCH 220/476] Create app.js --- apps/colorwheel/app.js | 80 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 apps/colorwheel/app.js diff --git a/apps/colorwheel/app.js b/apps/colorwheel/app.js new file mode 100644 index 000000000..bdd7f1f18 --- /dev/null +++ b/apps/colorwheel/app.js @@ -0,0 +1,80 @@ +//----------------------------------------------------------------------------// +//-- ColorWheel - draws a "wheel" of good looking colors --// +//----------------------------------------------------------------------------// + + let ColorList = [ + '#0000FF', '#8000FF', '#FF00FF', '#FF0080', '#FF0000', '#FF8000', + '#FFFF00', '#80FF00', '#00FF00', '#00FF80', '#00FFFF', '#0080FF' + ]; + + let ScreenWidth = g.getWidth(), CenterX = ScreenWidth/2; + let ScreenHeight = g.getHeight(), CenterY = ScreenHeight/2; + + let outerRadius = Math.min(CenterX,CenterY) * 0.9; + let innerRadius = outerRadius*0.5; + + let sin = Math.sin, cos = Math.cos; + let twoPi = 2*Math.PI, halfPi = Math.PI/2; + + let DeltaPhi = twoPi/72; + let Epsilon = 0.001; + + g.clear(); + + g.setColor(0,0,0); + g.fillRect(0,0, ScreenWidth,ScreenHeight); + + for (let i = 0; i < 12; i++) { + let Phi0 = i * twoPi/12, Phi1 = (i+1) * twoPi/12; + + let Polygon = []; + for (let Phi = Phi0; Phi <= Phi1+Epsilon; Phi += DeltaPhi) { + Polygon.push(CenterX + outerRadius * sin(Phi)); + Polygon.push(CenterY - outerRadius * cos(Phi)); + } + + for (let Phi = Phi1; Phi >= Phi0-Epsilon; Phi -= DeltaPhi) { + Polygon.push(CenterX + innerRadius * sin(Phi)); + Polygon.push(CenterY - innerRadius * cos(Phi)); + } + g.setColor(ColorList[i]); + g.fillPoly(Polygon); + } + + g.setColor(1,1,1); + g.fillCircle(CenterX,CenterY, innerRadius); + + g.setFont12x20(); + g.setFontAlign(0,0); + g.setColor(0,0,0); + + g.drawString('Tap', CenterX,CenterY-20); + g.drawString('on', CenterX,CenterY); + g.drawString('Color', CenterX,CenterY+20); + + Bangle.on('touch', function (Button,Position) { + Bangle.buzz(); + + let dx = Position.x - CenterX; + let dy = Position.y - CenterY; + + let Radius = Math.sqrt(dx*dx + dy*dy); + + let Color; + switch (true) { + case (Radius > outerRadius): Color = '#000000'; break; + case (Radius < innerRadius): Color = '#FFFFFF'; break; + default: + let Phi = Math.atan2(dy,dx) + halfPi; + if (Phi < 0) { Phi += twoPi; } + if (Phi > twoPi) { Phi -= twoPi; } + + let Index = Math.floor(12*Phi/twoPi); + Color = ColorList[Index]; + } + g.setColor(1,1,1); + g.fillCircle(CenterX,CenterY, innerRadius); + + g.setColor(0,0,0); + g.drawString(Color, CenterX,CenterY); + }); From 859c931a77a26d580d7ff03f04709343ac669b71 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:35:57 +0100 Subject: [PATCH 221/476] Update apps.json --- apps.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..75c311d83 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":"colorwheel", + "name":"Color Wheel", + "tags":"tool", + "version":"0.01", + "description":"a tappable wheel of good-looking colors", + "supports":["BANGLEJS2"], + "allow_emulator":true, + "src":"colorwheel.app.js", + "icon":"colorwheel.img", + "storage": [ + {"name":"colorwheel.app.js","url":"app.js"}, + {"name":"colorwheel.img","url":"app-icon.js","evaluate":true} + ] } ] From 42830ad231e1a4d99f6d768e0fb628ca38d6cce9 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:39:09 +0100 Subject: [PATCH 222/476] Create app-icon.js --- apps/colorwheel/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/colorwheel/app-icon.js diff --git a/apps/colorwheel/app-icon.js b/apps/colorwheel/app-icon.js new file mode 100644 index 000000000..3d7461806 --- /dev/null +++ b/apps/colorwheel/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgYtr4cEiAQMku27ckyVICBUDlmy5YRBpMkCBEE7dtEYYRBwARHm3LEY3QCA0BEAIjFk3boARFhoOBEYs06dNCIogCEYoHCNAoOCEYlNEYUgCIcbEZekCIYODtgjHmgRHtu3///yQrESQfTBIYQBAAPNEYU2SQUGEYd/CIf9EYYRCDAYRF/4KBCIioBAwPfCAn/+wKC7QjEmgRG/xADZAIyBAwIQFCIgjFmoRKEYL4DRgQAFGoojKCIoje7Nly1ZEYLzCkojLNYIRCNZAjIkm/EZ4RH/1ZEYYRMWYpZDy4jJrARBggRBlrYG+VJEYgRBDIVfCIgtCy1QCIZhDCAfkKIW24ARBgJeBEYNbvoQBvOkCIQjDgE2EYYCD2gRCyQQCgEGEYYRBzVp0wRCyAREEY+2CIWAEY4OCEYoQDAAMbEY/SpMgCAkCjIjHzVJEQoABWYIjF7VICI8BBwYjDe4IAHSQ3QCBBuBLgQjCCBIAChu26dMCBgAdA")) From 4521675e1b791b977cd7833c57487d6dc6965a7e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:43:02 +0100 Subject: [PATCH 223/476] Delete colorwheel.app.js --- apps/colorwheel.app.js | 81 ------------------------------------------ 1 file changed, 81 deletions(-) delete mode 100644 apps/colorwheel.app.js diff --git a/apps/colorwheel.app.js b/apps/colorwheel.app.js deleted file mode 100644 index 49648558c..000000000 --- a/apps/colorwheel.app.js +++ /dev/null @@ -1,81 +0,0 @@ -//----------------------------------------------------------------------------// -//-- ColorWheel - draws a "wheel" of good looking colors --// -//----------------------------------------------------------------------------// - - let ColorList = [ - '#0000FF', '#8000FF', '#FF00FF', '#FF0080', '#FF0000', '#FF8000', - '#FFFF00', '#80FF00', '#00FF00', '#00FF80', '#00FFFF', '#0080FF' - ]; - - let ScreenWidth = g.getWidth(), CenterX = ScreenWidth/2; - let ScreenHeight = g.getHeight(), CenterY = ScreenHeight/2; - - let outerRadius = Math.min(CenterX,CenterY) * 0.9; - let innerRadius = outerRadius*0.5; - - let sin = Math.sin, cos = Math.cos; - let twoPi = 2*Math.PI, halfPi = Math.PI/2; - - let DeltaPhi = twoPi/72; - let Epsilon = 0.001; - - g.clear(); - - g.setColor(0,0,0); - g.fillRect(0,0, ScreenWidth,ScreenHeight); - - for (let i = 0; i < 12; i++) { - let Phi0 = i * twoPi/12, Phi1 = (i+1) * twoPi/12; - - let Polygon = []; - for (let Phi = Phi0; Phi <= Phi1+Epsilon; Phi += DeltaPhi) { - Polygon.push(CenterX + outerRadius * sin(Phi)); - Polygon.push(CenterY - outerRadius * cos(Phi)); - } - - for (let Phi = Phi1; Phi >= Phi0-Epsilon; Phi -= DeltaPhi) { - Polygon.push(CenterX + innerRadius * sin(Phi)); - Polygon.push(CenterY - innerRadius * cos(Phi)); - } - g.setColor(ColorList[i]); - g.fillPoly(Polygon); - } - - g.setColor(1,1,1); - g.fillCircle(CenterX,CenterY, innerRadius); - - g.setFont12x20(); - g.setFontAlign(0,0); - g.setColor(0,0,0); - - g.drawString('Tap', CenterX,CenterY-20); - g.drawString('on', CenterX,CenterY); - g.drawString('Color', CenterX,CenterY+20); - - Bangle.on('touch', function (Button,Position) { - Bangle.buzz(); - - let dx = Position.x - CenterX; - let dy = Position.y - CenterY; - - let Radius = Math.sqrt(dx*dx + dy*dy); - - let Color; - switch (true) { - case (Radius > outerRadius): Color = '#000000'; break; - case (Radius < innerRadius): Color = '#FFFFFF'; break; - default: - let Phi = Math.atan2(dy,dx) + halfPi; - if (Phi < 0) { Phi += twoPi; } - if (Phi > twoPi) { Phi -= twoPi; } - - let Index = Math.floor(12*Phi/twoPi); - Color = ColorList[Index]; - } - g.setColor(1,1,1); - g.fillCircle(CenterX,CenterY, innerRadius); - - g.setColor(0,0,0); - g.drawString(Color, CenterX,CenterY); - }); - From 372628cc0e3073e03b0b943560954cb40e38a5f5 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:43:31 +0100 Subject: [PATCH 224/476] Update app-icon.js --- apps/colorwheel/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/colorwheel/app-icon.js b/apps/colorwheel/app-icon.js index 3d7461806..ad868ae52 100644 --- a/apps/colorwheel/app-icon.js +++ b/apps/colorwheel/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgYtr4cEiAQMku27ckyVICBUDlmy5YRBpMkCBEE7dtEYYRBwARHm3LEY3QCA0BEAIjFk3boARFhoOBEYs06dNCIogCEYoHCNAoOCEYlNEYUgCIcbEZekCIYODtgjHmgRHtu3///yQrESQfTBIYQBAAPNEYU2SQUGEYd/CIf9EYYRCDAYRF/4KBCIioBAwPfCAn/+wKC7QjEmgRG/xADZAIyBAwIQFCIgjFmoRKEYL4DRgQAFGoojKCIoje7Nly1ZEYLzCkojLNYIRCNZAjIkm/EZ4RH/1ZEYYRMWYpZDy4jJrARBggRBlrYG+VJEYgRBDIVfCIgtCy1QCIZhDCAfkKIW24ARBgJeBEYNbvoQBvOkCIQjDgE2EYYCD2gRCyQQCgEGEYYRBzVp0wRCyAREEY+2CIWAEY4OCEYoQDAAMbEY/SpMgCAkCjIjHzVJEQoABWYIjF7VICI8BBwYjDe4IAHSQ3QCBBuBLgQjCCBIAChu26dMCBgAdA")) +require("heatshrink").decompress(atob("mEwgkBABECAAQNJEQ8QiAGFB44sHAIMDgeoF4QyHFo0AjWIAAOJzOZzQxHFo0DyYACzAAC1AvLiEYFoQvEGJAcEgeDFwYvEzGj0JiEF4gtEF4273SaEFwoABF4+T0ej0QwDFxQvE3YABGAiMCFwYwEFwowCF4kQFw6/EF4QwBL4YuGF5ejF4kIFo0z+fz+ReDAAWwL4cDuYvEx8vAAYuE0ezSIJeHwf/AAn7LoQwCSIMCgVzAAQuBFogwF2YABiIvBg4uLAAP6MAsQLwQADFw4wCFwWzeQMQjAvEFw//+c7YIovFv4vJkYvDSAMQlBeMSIgACF4NjF6yONF78BiF3AAdzF6MCuQABF5lDAARfCF4lyF6oABF5OzF4dDgUAg4wEn7vIFwmwgECF4l+MBEj4YuDqMBgEGFwfu9wvHnncF4kQgMBsQtBAAVPF43D5vN4ZiBCoMASAQtBAAXzLonc7nMAAKOCR4MBgd+pwwEGIdO5YuBAAPL4QvCgEFFwgAD9oAB9guCAAPAiAvCgNuFwdOp1DAQdDF4fNCgQvBgEEF5XtFwfFCgQZBYINeF4gAFrouFF4cQpwvKMAQuDL4YwDFw4ABFwovDGAMUF5Pt7guEF4YwBSQIvJrouEF4gwBgAvI8lACIgvEGQdeFotegMEF5QxDovk93k6lFBIYvLMYQGLF5AnCAAIDCBxA=")) From 54ce0c4d531fd01aa0a70b06e35f49b44971d8e6 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:47:24 +0100 Subject: [PATCH 225/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 75c311d83..605c1c24f 100644 --- a/apps.json +++ b/apps.json @@ -5075,7 +5075,7 @@ "icon":"colorwheel.img", "storage": [ {"name":"colorwheel.app.js","url":"app.js"}, - {"name":"colorwheel.img","url":"app-icon.js","evaluate":true} + {"name":"colorwheel.img","url":"colorwheel-icon.js","evaluate":true} ] } ] From 6160ab24f21bbe0b7a84816f5243ac44ca06859b Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:48:07 +0100 Subject: [PATCH 226/476] Delete app-icon.js --- apps/colorwheel/app-icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/colorwheel/app-icon.js diff --git a/apps/colorwheel/app-icon.js b/apps/colorwheel/app-icon.js deleted file mode 100644 index ad868ae52..000000000 --- a/apps/colorwheel/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwgkBABECAAQNJEQ8QiAGFB44sHAIMDgeoF4QyHFo0AjWIAAOJzOZzQxHFo0DyYACzAAC1AvLiEYFoQvEGJAcEgeDFwYvEzGj0JiEF4gtEF4273SaEFwoABF4+T0ej0QwDFxQvE3YABGAiMCFwYwEFwowCF4kQFw6/EF4QwBL4YuGF5ejF4kIFo0z+fz+ReDAAWwL4cDuYvEx8vAAYuE0ezSIJeHwf/AAn7LoQwCSIMCgVzAAQuBFogwF2YABiIvBg4uLAAP6MAsQLwQADFw4wCFwWzeQMQjAvEFw//+c7YIovFv4vJkYvDSAMQlBeMSIgACF4NjF6yONF78BiF3AAdzF6MCuQABF5lDAARfCF4lyF6oABF5OzF4dDgUAg4wEn7vIFwmwgECF4l+MBEj4YuDqMBgEGFwfu9wvHnncF4kQgMBsQtBAAVPF43D5vN4ZiBCoMASAQtBAAXzLonc7nMAAKOCR4MBgd+pwwEGIdO5YuBAAPL4QvCgEFFwgAD9oAB9guCAAPAiAvCgNuFwdOp1DAQdDF4fNCgQvBgEEF5XtFwfFCgQZBYINeF4gAFrouFF4cQpwvKMAQuDL4YwDFw4ABFwovDGAMUF5Pt7guEF4YwBSQIvJrouEF4gwBgAvI8lACIgvEGQdeFotegMEF5QxDovk93k6lFBIYvLMYQGLF5AnCAAIDCBxA=")) From 21b8e79980f850d13d07b6da4a71e1bf6d8bb7ec Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:48:31 +0100 Subject: [PATCH 227/476] Create colorwheel-icon.js --- apps/colorwheel/colorwheel-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/colorwheel/colorwheel-icon.js diff --git a/apps/colorwheel/colorwheel-icon.js b/apps/colorwheel/colorwheel-icon.js new file mode 100644 index 000000000..ad868ae52 --- /dev/null +++ b/apps/colorwheel/colorwheel-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgkBABECAAQNJEQ8QiAGFB44sHAIMDgeoF4QyHFo0AjWIAAOJzOZzQxHFo0DyYACzAAC1AvLiEYFoQvEGJAcEgeDFwYvEzGj0JiEF4gtEF4273SaEFwoABF4+T0ej0QwDFxQvE3YABGAiMCFwYwEFwowCF4kQFw6/EF4QwBL4YuGF5ejF4kIFo0z+fz+ReDAAWwL4cDuYvEx8vAAYuE0ezSIJeHwf/AAn7LoQwCSIMCgVzAAQuBFogwF2YABiIvBg4uLAAP6MAsQLwQADFw4wCFwWzeQMQjAvEFw//+c7YIovFv4vJkYvDSAMQlBeMSIgACF4NjF6yONF78BiF3AAdzF6MCuQABF5lDAARfCF4lyF6oABF5OzF4dDgUAg4wEn7vIFwmwgECF4l+MBEj4YuDqMBgEGFwfu9wvHnncF4kQgMBsQtBAAVPF43D5vN4ZiBCoMASAQtBAAXzLonc7nMAAKOCR4MBgd+pwwEGIdO5YuBAAPL4QvCgEFFwgAD9oAB9guCAAPAiAvCgNuFwdOp1DAQdDF4fNCgQvBgEEF5XtFwfFCgQZBYINeF4gAFrouFF4cQpwvKMAQuDL4YwDFw4ABFwovDGAMUF5Pt7guEF4YwBSQIvJrouEF4gwBgAvI8lACIgvEGQdeFotegMEF5QxDovk93k6lFBIYvLMYQGLF5AnCAAIDCBxA=")) From d9cda0e6962b7bcdd7a8f4f1b7e284686555758d Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:51:09 +0100 Subject: [PATCH 228/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 605c1c24f..790cb1b13 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id":"colorwheel", "name":"Color Wheel", - "tags":"tool", + "tags":"app,tool", "version":"0.01", "description":"a tappable wheel of good-looking colors", "supports":["BANGLEJS2"], From b2c2da354d704e992049c88ae5abc9257615e702 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:54:13 +0100 Subject: [PATCH 229/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 790cb1b13..a0272a7ef 100644 --- a/apps.json +++ b/apps.json @@ -5072,7 +5072,7 @@ "supports":["BANGLEJS2"], "allow_emulator":true, "src":"colorwheel.app.js", - "icon":"colorwheel.img", + "icon":"colorwheel.png", "storage": [ {"name":"colorwheel.app.js","url":"app.js"}, {"name":"colorwheel.img","url":"colorwheel-icon.js","evaluate":true} From 438f3a66c2dce1dcf0e7ff9d0081ed993582218a Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:58:11 +0100 Subject: [PATCH 230/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index a0272a7ef..9f7028746 100644 --- a/apps.json +++ b/apps.json @@ -5075,7 +5075,7 @@ "icon":"colorwheel.png", "storage": [ {"name":"colorwheel.app.js","url":"app.js"}, - {"name":"colorwheel.img","url":"colorwheel-icon.js","evaluate":true} + {"name":"colorwheel.img","url":"app-icon.js","evaluate":true} ] } ] From e773e7b471da9b69ce58b4bc87223f73ee6753c2 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:58:59 +0100 Subject: [PATCH 231/476] Delete colorwheel-icon.js --- apps/colorwheel/colorwheel-icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/colorwheel/colorwheel-icon.js diff --git a/apps/colorwheel/colorwheel-icon.js b/apps/colorwheel/colorwheel-icon.js deleted file mode 100644 index ad868ae52..000000000 --- a/apps/colorwheel/colorwheel-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwgkBABECAAQNJEQ8QiAGFB44sHAIMDgeoF4QyHFo0AjWIAAOJzOZzQxHFo0DyYACzAAC1AvLiEYFoQvEGJAcEgeDFwYvEzGj0JiEF4gtEF4273SaEFwoABF4+T0ej0QwDFxQvE3YABGAiMCFwYwEFwowCF4kQFw6/EF4QwBL4YuGF5ejF4kIFo0z+fz+ReDAAWwL4cDuYvEx8vAAYuE0ezSIJeHwf/AAn7LoQwCSIMCgVzAAQuBFogwF2YABiIvBg4uLAAP6MAsQLwQADFw4wCFwWzeQMQjAvEFw//+c7YIovFv4vJkYvDSAMQlBeMSIgACF4NjF6yONF78BiF3AAdzF6MCuQABF5lDAARfCF4lyF6oABF5OzF4dDgUAg4wEn7vIFwmwgECF4l+MBEj4YuDqMBgEGFwfu9wvHnncF4kQgMBsQtBAAVPF43D5vN4ZiBCoMASAQtBAAXzLonc7nMAAKOCR4MBgd+pwwEGIdO5YuBAAPL4QvCgEFFwgAD9oAB9guCAAPAiAvCgNuFwdOp1DAQdDF4fNCgQvBgEEF5XtFwfFCgQZBYINeF4gAFrouFF4cQpwvKMAQuDL4YwDFw4ABFwovDGAMUF5Pt7guEF4YwBSQIvJrouEF4gwBgAvI8lACIgvEGQdeFotegMEF5QxDovk93k6lFBIYvLMYQGLF5AnCAAIDCBxA=")) From d1c8dd7fe33be7b049de07fcb27bb69322a67cb1 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:59:14 +0100 Subject: [PATCH 232/476] Create app-icon.js --- apps/colorwheel/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/colorwheel/app-icon.js diff --git a/apps/colorwheel/app-icon.js b/apps/colorwheel/app-icon.js new file mode 100644 index 000000000..ad868ae52 --- /dev/null +++ b/apps/colorwheel/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgkBABECAAQNJEQ8QiAGFB44sHAIMDgeoF4QyHFo0AjWIAAOJzOZzQxHFo0DyYACzAAC1AvLiEYFoQvEGJAcEgeDFwYvEzGj0JiEF4gtEF4273SaEFwoABF4+T0ej0QwDFxQvE3YABGAiMCFwYwEFwowCF4kQFw6/EF4QwBL4YuGF5ejF4kIFo0z+fz+ReDAAWwL4cDuYvEx8vAAYuE0ezSIJeHwf/AAn7LoQwCSIMCgVzAAQuBFogwF2YABiIvBg4uLAAP6MAsQLwQADFw4wCFwWzeQMQjAvEFw//+c7YIovFv4vJkYvDSAMQlBeMSIgACF4NjF6yONF78BiF3AAdzF6MCuQABF5lDAARfCF4lyF6oABF5OzF4dDgUAg4wEn7vIFwmwgECF4l+MBEj4YuDqMBgEGFwfu9wvHnncF4kQgMBsQtBAAVPF43D5vN4ZiBCoMASAQtBAAXzLonc7nMAAKOCR4MBgd+pwwEGIdO5YuBAAPL4QvCgEFFwgAD9oAB9guCAAPAiAvCgNuFwdOp1DAQdDF4fNCgQvBgEEF5XtFwfFCgQZBYINeF4gAFrouFF4cQpwvKMAQuDL4YwDFw4ABFwovDGAMUF5Pt7guEF4YwBSQIvJrouEF4gwBgAvI8lACIgvEGQdeFotegMEF5QxDovk93k6lFBIYvLMYQGLF5AnCAAIDCBxA=")) From 10e67cef0a50de60ff65dfd2da557f93077925a5 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:03:45 +0100 Subject: [PATCH 233/476] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 9f7028746..c76756624 100644 --- a/apps.json +++ b/apps.json @@ -5069,6 +5069,7 @@ "tags":"app,tool", "version":"0.01", "description":"a tappable wheel of good-looking colors", + "readme":"README.md", "supports":["BANGLEJS2"], "allow_emulator":true, "src":"colorwheel.app.js", From e854bd28a11e438ff9738f94d86eb2937924b2f0 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:04:37 +0100 Subject: [PATCH 234/476] Create README.md --- apps/colorwheel/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/colorwheel/README.md diff --git a/apps/colorwheel/README.md b/apps/colorwheel/README.md new file mode 100644 index 000000000..e4177eeba --- /dev/null +++ b/apps/colorwheel/README.md @@ -0,0 +1 @@ +# ColorWheel # From ceb189643bdd10d2444e1151de5aa406baae496f Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:05:11 +0100 Subject: [PATCH 235/476] Add files via upload --- apps/colorwheel/BangleJS2-ColorWheel-2.png | Bin 0 -> 3165 bytes apps/colorwheel/BangleJS2-ColorWheel-3.png | Bin 0 -> 3095 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/colorwheel/BangleJS2-ColorWheel-2.png create mode 100644 apps/colorwheel/BangleJS2-ColorWheel-3.png diff --git a/apps/colorwheel/BangleJS2-ColorWheel-2.png b/apps/colorwheel/BangleJS2-ColorWheel-2.png new file mode 100644 index 0000000000000000000000000000000000000000..6e0d0645bbb458a24070a95e84ba318cba18d74c GIT binary patch literal 3165 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 DMqmCA literal 0 HcmV?d00001 diff --git a/apps/colorwheel/BangleJS2-ColorWheel-3.png b/apps/colorwheel/BangleJS2-ColorWheel-3.png new file mode 100644 index 0000000000000000000000000000000000000000..981c4d56d6868a79da4162b0174fdb12a1e44a42 GIT binary patch literal 3095 zcmV+y4CwQTP)Px=(Md!>RCr$P-R+jEDhvkT_Wm!rvutbYP?QAn@dh$~&N_QgF+8RLt#iNKZjW33 zWCVgn;GTekj$C&88G!_x5JE>F0f!#G?0f=F1EC|3fI|;oc0K{8fzT01z@djPJD-5l zKm2ac=i8_XuA7mvf9y+eA(YTLM0dQZLpL zHDwgYZ4z}Ess#Lr$m8`?2qmL(+mV5C8z$(*0V|^2k#kLUw_g+Uf`ARss+JKH;p<>t z2e4F43sXKM zag&ozgIN$`1Lnd-Ehl`8o*tEoH^KxD7jWWLVc&;$f6^4Mq`(9`f;Y%qC6uZ zN|C=a9lRKb=LhVKnD0$=3thbah_$zyndP3 z2kU-LtT13D7kavY=(%PM=OqB#+3qCLCFt}sWzyCt;k zu}*xzr+8(r5pqWDZFtDM9%w0;qu_0oRuWlQPFJ;jIQty#)n&6?EATeGs2^p|%E*YR z@xcMi!Yg;pPy@wjhm7}g9(SETC@OJLaAN&hR2!Sn$!Kbp5BQll1l&T$mW?IQG3KwA z$K&F~0NjliXSE_C-W`iK;vTe;6T0yX+*LkcWaP+jE7N+@=X@n&H&RB70T#t;n~^04 zKq3o??8Bfo7U^eYC%uRV0iUh=dRA5K5KoEsQ&Z?o@Y<2>Z($EutoChT?+;3C%c=1y zB9$0I@dItNn8k_hn$0@}VE|%7Cfs#GYtJ%7{+DUgZNH@yd9qH#<=9ZvD{D!0zP( z9dY9Q(mcz=NO-?h5B>QFeg=jrAFeSc-~-RYO%6n~y=6oPV6^g~jyUmFn9>uQt8q>l z(E%9g`KQFomKFf99^eq=L;Wi(?17$jg8+azlQ~`nhMmBDGjZ+vSF>8|KCb|Xsaco_ zILn7_G)Nn+3mAU_ml>FFrK}4WI|CQ`=r$EG24A+h?*YF3b}3@uDNQ%?y0@ zG??wbAIk>{;1-_a?ZWBRKvh{+fPBff=XLPOTefE$NB|4fuk&;CE&5)kH2+hV4N|`5~5=)G6Q!6O>vV% z%m^+x-sNiGoX9co?!_bM9k_jJw#+*4K6IIZ8Hm9%Fa<F)$654cte}^QWQ2XGnzIqD}F$ZrSV9+}Fd?*s} z>#Or;KUjz<53wK5g#I|?aVroL^w5KJnDkjM+=%$n!`D&i5!L!4=rS3Y6Y8aFVHRM2 z#5Nh&sf^&DEx*yVBw{w+GW(B2od2CVF5dnc*a5IaD3?M!jCaQ@5qTPBZut-fuw)3A zKrDvW4sj3OF~G`MSQ710<%Bq1o3f&(e1HY4iTAtgGU3XEI$phu?2~~Nvaki-DG{6D zl}Fr*cRT|N0k%Y2pH2kM#^!Kq>(pZ-*jqk803JJa$))#zh#~NfW#kdOGJprNFb>}1 z8(soHhJst(qNOdFalW{Db#JooR&s4(O1uM#h&I+L#U1{SbW?9jkJP?9HyOahEF1%G znNf&WrgpO}>+S*6K9<=2uSa~ee2^<4j%84B@)6L|u40GM;)u2kq!==*9sNH63B2ln zBjJ5oAsZz(VZC<(wj`EpJlZcfza=`8Sp-A9OPCI}7(F6p!uHhg1`>dgo;iAc43g$Hptup@n9FVH;)Mz7_s(%efDpG7d!)N;nmN;`zV5CVl%w^ffh!riPsJ= zU?w(0Y>5{v6Kmr&1&p*RVTRWu0|OzR3NXs5MB=rHfCXOD4E!mF9oL6#hOTmy#mWdP zye@#fGVxM)9m@zyyl#LKvEh6446j^kysm()5gU%<|3i6{4-U@_d*F2kY=zhjujeX+ zVHx3t7Xq;M?dGNN8X)$>ivjp8Omm$$5$i<28!r@Kt#U$V=oouNsDTwSF#=vVz|x2r z%ygShh8P7eBw#7Tx*{2SPrQs^@tf}9^cS_-iul|3f$0u&z9P{fLUx51aUOHaVBwB$lhgzg~P66 zAme>!;)rm=XW$Z(**hM36oVp${YwRm7{{8#5l##aG9cc_8Mh=b9pJq_CRn#?0)lvk zjJpKj<4L+_WB|M~W!&We? Date: Sat, 25 Dec 2021 08:06:11 +0100 Subject: [PATCH 236/476] Update README.md --- apps/colorwheel/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/colorwheel/README.md b/apps/colorwheel/README.md index e4177eeba..5b2aeffcb 100644 --- a/apps/colorwheel/README.md +++ b/apps/colorwheel/README.md @@ -1 +1,4 @@ # ColorWheel # + +![](BangleJS2-ColorWheel-2.png) +![](BangleJS2-ColorWheel-3.png) From 9f910f8569007c44f23bf02366ea31289a1ca159 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:09:01 +0100 Subject: [PATCH 237/476] Update README.md --- apps/colorwheel/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/apps/colorwheel/README.md b/apps/colorwheel/README.md index 5b2aeffcb..58d382851 100644 --- a/apps/colorwheel/README.md +++ b/apps/colorwheel/README.md @@ -1,4 +1,12 @@ # ColorWheel # +Choosing the right color on a Bangle.js 2 is not always easy. This little app therefore displays a wheel of rather good looking colors and reveals the associated color code by tapping on it + ![](BangleJS2-ColorWheel-2.png) ![](BangleJS2-ColorWheel-3.png) + +Please note: you may also tap outside the wheel (for black) or inside it (for white). + +## License ## + +[MIT License](LICENSE.md) From 0d6cf7caf8a820dfbba29145d7d7d5bd3dd74732 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:10:04 +0100 Subject: [PATCH 238/476] Create LICENSE --- apps/colorwheel/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 apps/colorwheel/LICENSE diff --git a/apps/colorwheel/LICENSE b/apps/colorwheel/LICENSE new file mode 100644 index 000000000..7487dd5da --- /dev/null +++ b/apps/colorwheel/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Andreas Rozek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 970387a7214fc628e1228023646ee304dd3b8b32 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:10:15 +0100 Subject: [PATCH 239/476] Update README.md --- apps/colorwheel/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/colorwheel/README.md b/apps/colorwheel/README.md index 58d382851..2cb94c439 100644 --- a/apps/colorwheel/README.md +++ b/apps/colorwheel/README.md @@ -9,4 +9,4 @@ Please note: you may also tap outside the wheel (for black) or inside it (for wh ## License ## -[MIT License](LICENSE.md) +[MIT License](LICENSE) From aa358138c49d7f8926b4fbe9b6a38e0dbbe9501f Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:27:03 +0100 Subject: [PATCH 240/476] Update app-icon.js --- apps/colorwheel/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/colorwheel/app-icon.js b/apps/colorwheel/app-icon.js index ad868ae52..3d7461806 100644 --- a/apps/colorwheel/app-icon.js +++ b/apps/colorwheel/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgkBABECAAQNJEQ8QiAGFB44sHAIMDgeoF4QyHFo0AjWIAAOJzOZzQxHFo0DyYACzAAC1AvLiEYFoQvEGJAcEgeDFwYvEzGj0JiEF4gtEF4273SaEFwoABF4+T0ej0QwDFxQvE3YABGAiMCFwYwEFwowCF4kQFw6/EF4QwBL4YuGF5ejF4kIFo0z+fz+ReDAAWwL4cDuYvEx8vAAYuE0ezSIJeHwf/AAn7LoQwCSIMCgVzAAQuBFogwF2YABiIvBg4uLAAP6MAsQLwQADFw4wCFwWzeQMQjAvEFw//+c7YIovFv4vJkYvDSAMQlBeMSIgACF4NjF6yONF78BiF3AAdzF6MCuQABF5lDAARfCF4lyF6oABF5OzF4dDgUAg4wEn7vIFwmwgECF4l+MBEj4YuDqMBgEGFwfu9wvHnncF4kQgMBsQtBAAVPF43D5vN4ZiBCoMASAQtBAAXzLonc7nMAAKOCR4MBgd+pwwEGIdO5YuBAAPL4QvCgEFFwgAD9oAB9guCAAPAiAvCgNuFwdOp1DAQdDF4fNCgQvBgEEF5XtFwfFCgQZBYINeF4gAFrouFF4cQpwvKMAQuDL4YwDFw4ABFwovDGAMUF5Pt7guEF4YwBSQIvJrouEF4gwBgAvI8lACIgvEGQdeFotegMEF5QxDovk93k6lFBIYvLMYQGLF5AnCAAIDCBxA=")) +require("heatshrink").decompress(atob("mEwgYtr4cEiAQMku27ckyVICBUDlmy5YRBpMkCBEE7dtEYYRBwARHm3LEY3QCA0BEAIjFk3boARFhoOBEYs06dNCIogCEYoHCNAoOCEYlNEYUgCIcbEZekCIYODtgjHmgRHtu3///yQrESQfTBIYQBAAPNEYU2SQUGEYd/CIf9EYYRCDAYRF/4KBCIioBAwPfCAn/+wKC7QjEmgRG/xADZAIyBAwIQFCIgjFmoRKEYL4DRgQAFGoojKCIoje7Nly1ZEYLzCkojLNYIRCNZAjIkm/EZ4RH/1ZEYYRMWYpZDy4jJrARBggRBlrYG+VJEYgRBDIVfCIgtCy1QCIZhDCAfkKIW24ARBgJeBEYNbvoQBvOkCIQjDgE2EYYCD2gRCyQQCgEGEYYRBzVp0wRCyAREEY+2CIWAEY4OCEYoQDAAMbEY/SpMgCAkCjIjHzVJEQoABWYIjF7VICI8BBwYjDe4IAHSQ3QCBBuBLgQjCCBIAChu26dMCBgAdA")) From 41a50d457f79b414e419399326d142e5b607c84e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 08:28:51 +0100 Subject: [PATCH 241/476] Add files via upload --- apps/colorwheel/colorwheel.png | Bin 0 -> 3869 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/colorwheel/colorwheel.png diff --git a/apps/colorwheel/colorwheel.png b/apps/colorwheel/colorwheel.png new file mode 100644 index 0000000000000000000000000000000000000000..a15fd1c85f5a73e0082acb0806f79a1ba557a301 GIT binary patch literal 3869 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 Date: Sat, 25 Dec 2021 08:36:02 +0100 Subject: [PATCH 242/476] Update apps.json --- apps.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps.json b/apps.json index c76756624..dd5f0cc6d 100644 --- a/apps.json +++ b/apps.json @@ -5072,7 +5072,6 @@ "readme":"README.md", "supports":["BANGLEJS2"], "allow_emulator":true, - "src":"colorwheel.app.js", "icon":"colorwheel.png", "storage": [ {"name":"colorwheel.app.js","url":"app.js"}, From bc58b67675b484270ec15d47ab4ca76d7b1bfe7b Mon Sep 17 00:00:00 2001 From: EmVee381 Date: Sat, 25 Dec 2021 14:23:35 +0100 Subject: [PATCH 243/476] corrected cs_CZ "trans" messages --- 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 b607998a0..a77ea16d3 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -589,7 +589,7 @@ var locales = { month: "leden,únor,březen,duben,květen,červen,červenec,srpen,září,říjen,listopad,prosinec", abday: "ne,po,út,st,čt,pá,so", day: "neděle,pondělí,úterý,středa,čtvrtek,pátek,sobota", - trans: { yes: "tak", Yes: "Tak", no: "nie", No: "Nie", ok: "ok", on: "na", off: "poza" } + trans: { yes: "ano", Yes: "Ano", no: "ne", No: "Ne", ok: "ok", on: "zap", off: "vyp" } }, "sl_SI": { lang: "sl_SI", From 4e19b5c7db68548e86de6c5a391b83471aa27cc8 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sun, 26 Dec 2021 10:06:54 +0100 Subject: [PATCH 244/476] Update app.js --- apps/colorwheel/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/colorwheel/app.js b/apps/colorwheel/app.js index bdd7f1f18..7874c3f54 100644 --- a/apps/colorwheel/app.js +++ b/apps/colorwheel/app.js @@ -49,7 +49,7 @@ g.setColor(0,0,0); g.drawString('Tap', CenterX,CenterY-20); - g.drawString('on', CenterX,CenterY); + g.drawString('on a', CenterX,CenterY); g.drawString('Color', CenterX,CenterY+20); Bangle.on('touch', function (Button,Position) { From 2bf23bb5dc1eae3f0724e422fa683c3d15468763 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 05:00:22 +0900 Subject: [PATCH 245/476] Update awair_to_bangle.html --- apps/awairmonitor/awair_to_bangle.html | 40 ++++++++++++++------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/apps/awairmonitor/awair_to_bangle.html b/apps/awairmonitor/awair_to_bangle.html index 2926cca9e..4e4465b75 100644 --- a/apps/awairmonitor/awair_to_bangle.html +++ b/apps/awairmonitor/awair_to_bangle.html @@ -7,7 +7,6 @@ // Don't forget to enable the Local API on your Awair before using this // https://support.getawair.com/hc/en-us/articles/360049221014-Awair-Local-API-Feature -const awair_ip_1 = "192.168.2.2"; // <- INPUT YOUR AWAIR IP ADDRESS HERE const awair_name_1 = "Awair"; var bt_connection; @@ -15,7 +14,7 @@ var is_connected = false; var reconnect_counter = 5; var reconnect_attempt_counter = 1; -window.onload = function() { +function initChart() { var chart_co2; var chart_voc; var chart_pm; @@ -23,6 +22,8 @@ window.onload = function() { var chart_humidity; var dataPoints_1 = []; var posx = 0; + + var awair_ip_1 = document.getElementById('inputawairip').value; $.getJSON("http://"+awair_ip_1+"/air-data/latest", function(data) { $.each(data, function(key, value){ @@ -105,11 +106,13 @@ window.onload = function() { let current_humi = dataPoints_1['humid'][dataPoints_1['humid'].length-1].y; let current_temp = dataPoints_1['temp'][dataPoints_1['temp'].length-1].y; let last_update = dataPoints_1['temp'].length-1; - if (is_connected && bt_connection.isOpen) { + console.log(is_connected); + console.log(bt_connection); + if (is_connected && bt_connection && bt_connection.isOpen) { bt_connection.write('\x10bt_current_co2='+current_co2+';bt_current_voc='+current_voc+';bt_current_pm25='+current_pm25+';bt_current_humi='+current_humi+';bt_current_temp='+current_temp+';bt_last_update='+last_update+';\n'); console.log("Sent data through Bluetooth"); - } else if (is_connected && !bt_connection.isOpen) { + } else if (is_connected && bt_connection && !bt_connection.isOpen) { console.log("Disconnected - Next attempt to reconnect in " + reconnect_counter); reconnect_counter--; @@ -148,10 +151,13 @@ function connectBT() { bt_connection = c; is_connected = true; reconnect_attempt_counter = 1; + initChart(); }); } function disconnectBT() { + console.log("Disconnect Bluetooth button pressed. bt_connection value below.") + console.log(bt_connection); if (is_connected && bt_connection) { bt_connection.close(); is_connected = false; @@ -167,23 +173,21 @@ function disconnectBT() {

How to use -

+

Step 1: Enable the Local API on your Awair: https://support.getawair.com/hc/en-us/articles/360049221014-Awair-Local-API-Feature -

-Step 2: Modify this HTML file to input the IP address of your Awair on top (const awair_ip_1 = "192.168.xx.xx") -

-Step 3: Launch the Awair Monitor app on your BangleJS -

-Step 4: Click "Connect BangleJS" -

-Step 5: Optionally, open the web inspector's console (Right click > Inspector > Console) to read the bluetooth logs +

+Step 2: Launch the Awair Monitor app on your BangleJS +

+Step 3: Input your Awair IP address and click the Connect button: + + +

+Step 4: Optionally, open the web inspector's console (Right click > Inspector > Console) to read the Bluetooth logs +

+Step 5: Once you are done, click the Disconnect button to properly close the Blutooth connection +

-
- - -
-

From 8d5eb78d7b147d60b67f89735f4f4dc5ad423e2d Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 05:02:53 +0900 Subject: [PATCH 246/476] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index f76800494..b88840a12 100644 --- a/apps.json +++ b/apps.json @@ -4940,6 +4940,7 @@ "type": "clock", "tags": "clock,tool,health", "readme":"README.md", + "custom": "awair_to_bangle.html", "supports":["BANGLEJS2"], "storage": [ {"name":"awairmonitor.app.js","url":"app.js"}, From a8d0baa434c446187ce4fdd9ace60a6181e86356 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 05:09:19 +0900 Subject: [PATCH 247/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b88840a12..ded742dc7 100644 --- a/apps.json +++ b/apps.json @@ -4935,7 +4935,7 @@ "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], "allow_emulator": true, - "version":"0.02", + "version":"0.03", "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", "type": "clock", "tags": "clock,tool,health", From e75bfe48830ff294e2e4673155d4b1e4fe4f5e15 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 05:33:39 +0900 Subject: [PATCH 248/476] Update awair_to_bangle.html --- apps/awairmonitor/awair_to_bangle.html | 493 ++++++++++++++++++++++++- 1 file changed, 488 insertions(+), 5 deletions(-) diff --git a/apps/awairmonitor/awair_to_bangle.html b/apps/awairmonitor/awair_to_bangle.html index 4e4465b75..8624d01f6 100644 --- a/apps/awairmonitor/awair_to_bangle.html +++ b/apps/awairmonitor/awair_to_bangle.html @@ -1,7 +1,488 @@ - + + + + + + + + + + + - function checkIfSupported() { - // Hack for windows - if (navigator.platform.indexOf("Win")>=0 && - (navigator.userAgent.indexOf("Chrome/54")>=0 || - navigator.userAgent.indexOf("Chrome/55")>=0 || - navigator.userAgent.indexOf("Chrome/56")>=0) - ) { - console.warn("Chrome <56 in Windows has navigator.bluetooth but it's not implemented properly"); - if (confirm("Web Bluetooth on Windows is not yet available.\nPlease click Ok to see other options for using Web Bluetooth")) - window.location = "https://www.espruino.com/Puck.js+Quick+Start"; - return false; - } - if (navigator.bluetooth) return true; - console.warn("No Web Bluetooth on this platform"); - var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; - if (iOS) { - if (confirm("To use Web Bluetooth on iOS you'll need the WebBLE App.\nPlease click Ok to go to the App Store and download it.")) - window.location = "https://itunes.apple.com/us/app/webble/id1193531073"; - } else { - if (confirm("This Web Browser doesn't support Web Bluetooth.\nPlease click Ok to see instructions for enabling it.")) - window.location = "https://www.espruino.com/Quick+Start+BLE#with-web-bluetooth"; - } - return false; - } +

+How to use +

+Step 1: Enable the Local API on your Awair: https://support.getawair.com/hc/en-us/articles/360049221014-Awair-Local-API-Feature +

+Step 2: Launch the Awair Monitor app on your BangleJS +

+Step 3: Input your Awair IP address and click the Connect button: + + +

+Step 4: Optionally, open the web inspector's console (Right click > Inspector > Console) to read the Bluetooth logs +

+Step 5: Once you are done, click the Disconnect button to properly close the Blutooth connection +

+

- var NORDIC_SERVICE = "6e400001-b5a3-f393-e0a9-e50e24dcca9e"; - var NORDIC_TX = "6e400002-b5a3-f393-e0a9-e50e24dcca9e"; - var NORDIC_RX = "6e400003-b5a3-f393-e0a9-e50e24dcca9e"; - var DEFAULT_CHUNKSIZE = 20; +

- function log(level, s) { - if (puck.log) puck.log(level, s); - } - - function ab2str(buf) { - return String.fromCharCode.apply(null, new Uint8Array(buf)); +
+
+
+
+
+ +(buf)); } function str2ab(str) { @@ -590,93 +670,4 @@ function initChart() { let last_update = dataPoints_1['temp'].length-1; if (is_connected && bt_connection && bt_connection.isOpen) { - bt_connection.write('\x10bt_current_co2='+current_co2+';bt_current_voc='+current_voc+';bt_current_pm25='+current_pm25+';bt_current_humi='+current_humi+';bt_current_temp='+current_temp+';bt_last_update='+last_update+';\n'); - - console.log("Sent data through Bluetooth"); - } else if (is_connected && bt_connection && !bt_connection.isOpen) { - console.log("Disconnected - Next attempt to reconnect in " + reconnect_counter); - reconnect_counter--; - - if (reconnect_counter <= 0) { - reconnect_counter = 10 * reconnect_attempt_counter; - reconnect_attempt_counter++; - - console.log("Trying to reconnect"); - bt_connection.reconnect(function(c) { - console.log("Reconnect callback"); - if (!c) { - console.log("Couldn't reconnect"); - return; - } - bt_connection = c; - is_connected = true; - reconnect_attempt_counter = 1; - }); - } - } - - setTimeout(function(){updateChart()}, 1000); - }); - } -} - -function connectBT() { - console.log("Connect BT"); - Puck.connect(function(c) { - console.log("Connect callback"); - if (!c) { - console.log("Couldn't connect"); - return; - } - bt_connection = c; - is_connected = true; - reconnect_attempt_counter = 1; - if (!is_chart_started) { - initChart(); - is_chart_started = true; - } - }); -} - -function disconnectBT() { - console.log("Disconnect Bluetooth button pressed. bt_connection value below.") - console.log(bt_connection); - if (is_connected && bt_connection) { - bt_connection.close(); - is_connected = false; - console.log("Closed Bluetooth connection"); - } -} - - - - - - - -

-How to use -

-Step 1: Enable the Local API on your Awair: https://support.getawair.com/hc/en-us/articles/360049221014-Awair-Local-API-Feature -

-Step 2: Launch the Awair Monitor app on your BangleJS -

-Step 3: Input your Awair IP address and click the Connect button: - - -

-Step 4: Optionally, open the web inspector's console (Right click > Inspector > Console) to read the Bluetooth logs -

-Step 5: Once you are done, click the Disconnect button to properly close the Blutooth connection -

-

- -

- -
-
-
-
-
- - + bt_connection.write('\x10bt_current_co2='+current_co2+';bt_current_voc='+current_voc+';bt_current_pm25='+current_pm25+';bt_current_humi='+current_humi+';bt_current_temp='+current_temp+';bt_ From 0a12cebc6e3c62a54c4fd095ea7b3a22f0e47576 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 06:24:48 +0900 Subject: [PATCH 251/476] Update README.md --- apps/awairmonitor/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/awairmonitor/README.md b/apps/awairmonitor/README.md index 69894fea2..f4c7c42c4 100644 --- a/apps/awairmonitor/README.md +++ b/apps/awairmonitor/README.md @@ -5,11 +5,10 @@ Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awai * What you need: * A BangleJS 2 * An Awair device [with local API enabled](https://support.getawair.com/hc/en-us/articles/360049221014-Awair-Local-API-Feature) - * The web app [awair_to_bangle.html](awair_to_bangle.html) that will retrive the data from your Awair device and sent it to your BangleJS 2 through Chrome's Bluetooth LE connection + * The web app [awair_to_bangle.html](awair_to_bangle.html) that will retrieve the data from your Awair device and sent it to your BangleJS 2 through Chrome's Bluetooth LE connection * How to get started - * Open awair_to_bangle.html with a text/code editor and input the IP address of your Awair on top (const awair_ip_1 = "192.168.xx.xx") * Launch the Awair Monitor app on your BangleJS - * Open awair_to_bangle.html on Chrome and click "Connect BangleJS" - it connects to your watch the same way as the Bangle app store + * Open awair_to_bangle.html on Chrome (desktop or Android), input the IP address of your Awair device, and click "Connect BangleJS" - it connects to your watch the same way as the Bangle app store * Once connected to the watch with the app running, the watch app is updated once per second ![](screenshot.png) From d71e267610218b34a467277a94df8db9d10136f6 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 06:26:01 +0900 Subject: [PATCH 252/476] Update ChangeLog --- apps/awairmonitor/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/awairmonitor/ChangeLog b/apps/awairmonitor/ChangeLog index 88e9690d8..71d6399c4 100644 --- a/apps/awairmonitor/ChangeLog +++ b/apps/awairmonitor/ChangeLog @@ -1,2 +1,3 @@ 0.01: Beta version for Bangle 2 paired with Chrome (2021/12/11) 0.02: The app is now a clock, the data is greyed after the connection is lost (2021/12/22) +0.03: Set the Awair's IP directly on the webpage (2021/12/27) From 979593acaebb5a33d00e4838858c379fe961c208 Mon Sep 17 00:00:00 2001 From: untbu <78314607+untbu@users.noreply.github.com> Date: Mon, 27 Dec 2021 15:06:40 +0100 Subject: [PATCH 253/476] added grid positioning and swipe controls added grid positioning and swipe controls to switch between numbers, operators and special for Bangle.js 2. --- apps/calculator/app.js | 271 +++++++++++++++++++++++------------------ 1 file changed, 153 insertions(+), 118 deletions(-) diff --git a/apps/calculator/app.js b/apps/calculator/app.js index 9f801cf22..042b777cc 100644 --- a/apps/calculator/app.js +++ b/apps/calculator/app.js @@ -8,7 +8,7 @@ g.clear(); require("Font7x11Numeric7Seg").add(Graphics); -var DEFAULT_SELECTION = '5'; +var DEFAULT_SELECTION_NUMBERS = '5', DEFAULT_SELECTION_OPERATORS = '=', DEFAULT_SELECTION_SPECIALS = 'R'; var RIGHT_MARGIN = 20; var RESULT_HEIGHT = 40; var COLORS = { @@ -18,97 +18,45 @@ var COLORS = { SPECIAL: ['#65686C', '#7F8183'] }; -var keys = { - '0': { - xy: [0, 200, 120, 240], - trbl: '2.00' - }, - '.': { - xy: [120, 200, 180, 240], - trbl: '3=.0' - }, - '=': { - xy: [181, 200, 240, 240], - trbl: '+==.', - color: COLORS.OPERATOR - }, - '1': { - xy: [0, 160, 60, 200], - trbl: '4201' - }, - '2': { - xy: [60, 160, 120, 200], - trbl: '5301' - }, - '3': { - xy: [120, 160, 180, 200], - trbl: '6+.2' - }, - '+': { - xy: [181, 160, 240, 200], - trbl: '-+=3', - color: COLORS.OPERATOR - }, - '4': { - xy: [0, 120, 60, 160], - trbl: '7514' - }, - '5': { - xy: [60, 120, 120, 160], - trbl: '8624' - }, - '6': { - xy: [120, 120, 180, 160], - trbl: '9-35' - }, - '-': { - xy: [181, 120, 240, 160], - trbl: '*-+6', - color: COLORS.OPERATOR - }, - '7': { - xy: [0, 80, 60, 120], - trbl: 'R847' - }, - '8': { - xy: [60, 80, 120, 120], - trbl: 'N957' - }, - '9': { - xy: [120, 80, 180, 120], - trbl: '%*68' - }, - '*': { - xy: [181, 80, 240, 120], - trbl: '/*-9', - color: COLORS.OPERATOR - }, - 'R': { - xy: [0, 40, 60, 79], - trbl: 'RN7R', - color: COLORS.SPECIAL, - val: 'AC' - }, - 'N': { - xy: [60, 40, 120, 79], - trbl: 'N%8R', - color: COLORS.SPECIAL, - val: '+/-' - }, - '%': { - xy: [120, 40, 180, 79], - trbl: '%/9N', - color: COLORS.SPECIAL - }, - '/': { - xy: [181, 40, 240, 79], - trbl: '//*%', - color: COLORS.OPERATOR - } +var KEY_AREA = [0, RESULT_HEIGHT, g.getWidth(), g.getHeight()]; + +var screen, screenColor; +var globalGrid = [4, 5]; +var swipeEnabled; + +var numbersGrid = [3, 4]; +var numbers = { + '0': {grid: [1, 3], globalGrid: [1, 4], trbl: '2.00'}, + '.': {grid: [2, 3], globalGrid: [2, 4], trbl: '3=.0'}, + '1': {grid: [0, 2], globalGrid: [0, 3], trbl: '4201'}, + '2': {grid: [1, 2], globalGrid: [1, 3], trbl: '5301'}, + '3': {grid: [2, 2], globalGrid: [2, 3], trbl: '6+.2'}, + '4': {grid: [0, 1], globalGrid: [0, 2], trbl: '7514'}, + '5': {grid: [1, 1], globalGrid: [1, 2], trbl: '8624'}, + '6': {grid: [2, 1], globalGrid: [2, 2], trbl: '9-35'}, + '7': {grid: [0, 0], globalGrid: [0, 1], trbl: 'R847'}, + '8': {grid: [1, 0], globalGrid: [1, 1], trbl: 'N957'}, + '9': {grid: [2, 0], globalGrid: [2, 1], trbl: '%*68'}, }; -var selected = DEFAULT_SELECTION; -var prevSelected = DEFAULT_SELECTION; +var operatorsGrid = [2, 3]; +var operators = { + '+': {grid: [0, 0], globalGrid: [3, 3], trbl: '-+=3'}, + '-': {grid: [1, 0], globalGrid: [3, 2], trbl: '*-+6'}, + '*': {grid: [0, 1], globalGrid: [3, 1], trbl: '/*-9'}, + '/': {grid: [1, 1], globalGrid: [3, 0], trbl: '//*%'}, + '=': {grid: [1, 2], globalGrid: [3, 4], trbl: '+==.'}, +}; + +var specialsGrid = [2, 2]; +var specials = { + 'R': {grid: [0, 0], globalGrid: [0, 0], trbl: 'RN7R', val: 'AC'}, + 'N': {grid: [1, 0], globalGrid: [1, 0], trbl: 'N%8R', val: '+/-'}, + '%': {grid: [0, 1], globalGrid: [2, 0], trbl: '%/9N'}, +}; + +var selected = DEFAULT_SELECTION_NUMBERS; +var prevSelected = DEFAULT_SELECTION_NUMBERS; var prevNumber = null; var currNumber = null; var operator = null; @@ -116,6 +64,27 @@ var results = null; var isDecimal = false; var hasPressedEquals = false; +function prepareScreen(screen, grid, defaultColor) { + for (var k in screen) { + if (screen.hasOwnProperty(k)) { + screen[k].color = screen[k].color || defaultColor; + var position = []; + var xGrid = (KEY_AREA[2]-KEY_AREA[0])/grid[0]; + var yGrid = (KEY_AREA[3]-KEY_AREA[1])/grid[1]; + if (swipeEnabled) { + position[0] = KEY_AREA[0]+xGrid*screen[k].grid[0]; + position[1] = KEY_AREA[1]+yGrid*screen[k].grid[1]; + } else { + position[0] = KEY_AREA[0]+xGrid*screen[k].globalGrid[0]; + position[1] = KEY_AREA[1]+yGrid*screen[k].globalGrid[1]; + } + position[2] = position[0]+xGrid-1; + position[3] = position[1]+yGrid-1; + screen[k].xy = position; + } + } +} + function drawKey(name, k, selected) { var rMargin = 0; var bMargin = 0; @@ -142,6 +111,56 @@ function drawKey(name, k, selected) { g.drawString(k.val || name, (k.xy[0] + k.xy[2])/2, (k.xy[1] + k.xy[3])/2); } +function drawKeys() { + g.setColor(screenColor[0]); + g.fillRect(KEY_AREA[0], KEY_AREA[1], KEY_AREA[2], KEY_AREA[3]); + for (var k in screen) { + if (screen.hasOwnProperty(k)) { + drawKey(k, screen[k], k == selected); + } + } +} +function drawGlobal() { + screen = {}; + screenColor = COLORS.DEFAULT; + prepareScreen(numbers, globalGrid, COLORS.DEFAULT); + for (var k in numbers) { + screen[k] = numbers[k]; + } + prepareScreen(operators, globalGrid, COLORS.OPERATOR); + for (var k in operators) { + screen[k] = operators[k]; + } + prepareScreen(specials, globalGrid, COLORS.SPECIAL); + for (var k in specials) { + screen[k] = specials[k]; + } + drawKeys(); + var selected = DEFAULT_SELECTION_NUMBERS; + var prevSelected = DEFAULT_SELECTION_NUMBERS; +} +function drawNumbers() { + screen = numbers; + screenColor = COLORS.DEFAULT; + drawKeys(); + var selected = DEFAULT_SELECTION_NUMBERS; + var prevSelected = DEFAULT_SELECTION_NUMBERS; +} +function drawOperators() { + screen = operators; + screenColor =COLORS.OPERATOR; + drawKeys(); + var selected = DEFAULT_SELECTION_OPERATORS; + var prevSelected = DEFAULT_SELECTION_OPERATORS; +} +function drawSpecials() { + screen = specials; + screenColor = COLORS.SPECIAL; + drawKeys(); + var selected = DEFAULT_SELECTION_SPECIALS; + var prevSelected = DEFAULT_SELECTION_SPECIALS; +} + function getIntWithPrecision(x) { var xStr = x.toString(); var xRadix = xStr.indexOf('.'); @@ -218,8 +237,8 @@ function displayOutput(num) { hasPressedEquals = false; prevNumber = null; operator = null; - keys.R.val = 'AC'; - drawKey('R', keys.R); + specials.R.val = 'AC'; + if (!swipeEnabled) drawKey('R', specials.R); g.setFont('Vector', 22); } else { // might not be a number due to display of dot "." @@ -299,12 +318,12 @@ function buttonPress(val) { results = null; isDecimal = false; hasPressedEquals = false; - if (keys.R.val == 'AC') { + if (specials.R.val == 'AC') { prevNumber = null; operator = null; } else { - keys.R.val = 'AC'; - drawKey('R', keys.R, true); + specials.R.val = 'AC'; + drawKey('R', specials.R, true); } wasPressedEquals = false; hasPressedNumber = false; @@ -331,10 +350,11 @@ function buttonPress(val) { case '+': calculatorLogic(val); hasPressedNumber = false; + if (swipeEnabled) drawNumbers(); break; case '.': - keys.R.val = 'C'; - drawKey('R', keys.R); + specials.R.val = 'C'; + if (!swipeEnabled) drawKey('R', specials.R); isDecimal = true; displayOutput(currNumber == null ? 0 + '.' : currNumber + '.'); break; @@ -348,8 +368,8 @@ function buttonPress(val) { hasPressedNumber = false; break; default: - keys.R.val = 'C'; - drawKey('R', keys.R); + specials.R.val = 'C'; + if (!swipeEnabled) drawKey('R', specials.R); const is0Negative = (currNumber === 0 && 1/currNumber === -Infinity); if (isDecimal) { currNumber = currNumber == null || hasPressedEquals === 1 ? 0 + '.' + val : currNumber + '.' + val; @@ -367,23 +387,31 @@ function buttonPress(val) { } function moveDirection(d) { - drawKey(selected, keys[selected]); + drawKey(selected, screen[selected]); prevSelected = selected; - selected = (d === 0 && selected == '0' && prevSelected === '1') ? '1' : keys[selected].trbl[d]; - drawKey(selected, keys[selected], true); + selected = (d === 0 && selected == '0' && prevSelected === '1') ? '1' : screen[selected].trbl[d]; + drawKey(selected, screen[selected], true); } -if (global.BTN4) { +if (process.env.HWVERSION==1) { setWatch(_ => moveDirection(0), BTN1, {repeat: true, debounce: 100}); setWatch(_ => moveDirection(2), BTN3, {repeat: true, debounce: 100}); setWatch(_ => moveDirection(3), BTN4, {repeat: true, debounce: 100}); setWatch(_ => moveDirection(1), BTN5, {repeat: true, debounce: 100}); setWatch(_ => buttonPress(selected), BTN2, {repeat: true, debounce: 100}); + swipeEnabled = false; + drawGlobal(); } else { // touchscreen? selected = "NONE"; + swipeEnabled = true; + prepareScreen(numbers, numbersGrid, COLORS.DEFAULT); + prepareScreen(operators, operatorsGrid, COLORS.OPERATOR); + prepareScreen(specials, specialsGrid, COLORS.SPECIAL); + drawNumbers(); Bangle.on('touch',(n,e)=>{ - for (var key in keys) { - var r = keys[key].xy; + for (var key in screen) { + if (typeof screen[key] == "undefined") break; + var r = screen[key].xy; if (e.x>=r[0] && e.y>=r[1] && e.x { + if (!e.b) { + if (lastX > 50) { // right + drawSpecials(); + } else if (lastX < -50) { // left + drawOperators(); + } else if (lastY > 50) { // down + drawNumbers(); + } else if (lastY < -50) { // up + drawNumbers(); + } + lastX = 0; + lastY = 0; + } else { + lastX = lastX + e.dx; + lastY = lastY + e.dy; + } + }); } -// rescale for non-240px screens -if (g.getWidth()!=240) { - RESULT_HEIGHT = RESULT_HEIGHT*g.getWidth()/240; - for (var k in keys) { - keys[k].xy = keys[k].xy.map(n => n*g.getWidth()/240); - } -} -// draw keys -for (var k in keys) { - if (keys.hasOwnProperty(k)) { - drawKey(k, keys[k], k == selected); - } -} + displayOutput(0); From 95f0891ad7135a48731b66818bbd929b22565b67 Mon Sep 17 00:00:00 2001 From: untbu <78314607+untbu@users.noreply.github.com> Date: Mon, 27 Dec 2021 15:07:20 +0100 Subject: [PATCH 254/476] added grid positioning and swipe controls added grid positioning and swipe controls to switch between numbers, operators and special for Bangle.js 2. --- apps/calculator/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/calculator/ChangeLog b/apps/calculator/ChangeLog index 6a3308c50..a08a0f5a7 100644 --- a/apps/calculator/ChangeLog +++ b/apps/calculator/ChangeLog @@ -2,3 +2,4 @@ 0.02: fix precision rounding issue + no reset when equals pressed 0.03: Support for different screen sizes and touchscreen 0.04: Display current operation on LHS +0.05: Grid positioning and swipe controls to switch between numbers, operators and special (for Bangle.js 2) From e7e051a4614a381eb18bbf97e568e9be64df5c89 Mon Sep 17 00:00:00 2001 From: untbu <78314607+untbu@users.noreply.github.com> Date: Mon, 27 Dec 2021 15:13:04 +0100 Subject: [PATCH 255/476] removed one spacing error --- apps/calculator/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/calculator/app.js b/apps/calculator/app.js index 042b777cc..40953254e 100644 --- a/apps/calculator/app.js +++ b/apps/calculator/app.js @@ -410,7 +410,7 @@ if (process.env.HWVERSION==1) { drawNumbers(); Bangle.on('touch',(n,e)=>{ for (var key in screen) { - if (typeof screen[key] == "undefined") break; + if (typeof screen[key] == "undefined") break; var r = screen[key].xy; if (e.x>=r[0] && e.y>=r[1] && e.x Date: Mon, 27 Dec 2021 15:48:40 +0100 Subject: [PATCH 257/476] Create app.js --- teatimer/app.js | 233 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 teatimer/app.js diff --git a/teatimer/app.js b/teatimer/app.js new file mode 100644 index 000000000..dd7afdadb --- /dev/null +++ b/teatimer/app.js @@ -0,0 +1,233 @@ +// Tea Timer +// Button press stops timer, next press restarts timer +let drag; +var counter = 0; +var counterStart = 150; // 150 seconds +var counterInterval; +const states = { + init: 1, // unused + help: 2, // show help text + start: 4, // show/change initial counter + count: 8, // count down + countUp: 16, // count up after timer finished + stop: 32 // timer stopped +}; +var state = states.start; +E.setTimeZone(1); + +// Title showing current time +function appTitle() { + return "Tea Timer " + currentTime(); +} + +function currentTime() { + min = Date().getMinutes(); + if (min < 10) min = "0" + min; + return Date().getHours() + ":" + min; +} + +function timeFormated(sec) { + var min = Math.floor(sec / 60); + sec = sec % 60; + if (sec < 10) sec = "0" + sec; + return min + ":" + sec; +} + +// initialize timer and show timer value => state: start +function initTimer() { + counter = counterStart; + setState(states.start); + showCounter(true); +} + +// timer value (counter) can be changed in state start +function changeCounter(diff) { + if (state == states.start) { + if (counter + diff > 0) { + counter = counter + diff; + showCounter(true); + } + } +} + +// start or restart timer => state: count +function startTimer() { + counterStart = counter; + setState(states.count); + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +/* show current counter value at start and while count down + Show + - Title with current time + - initial timer value + - remaining time + - hint for help in state start +*/ +function showCounter(withHint) { + //g.clear(); + E.showMessage("", appTitle()); + g.setFontAlign(0,0); // center font + // draw the current counter value + g.setBgColor(-1).setColor(0,0,1); // blue + g.setFont("Vector",20); // vector font, 20px + g.drawString("Timer: " + timeFormated(counterStart),80,55); + g.setFont("Vector",60); // vector font, 60px + g.drawString(timeFormated(counter),83,100); + if (withHint) { + g.setFont("Vector",20); // vector font, 80px + g.drawString("Tap for help",80,150); + } +} + +// count down and update every second +// when time is up, start counting up +function countDown() { + counter--; + // Out of time + if (counter<=0) { + outOfTime(); + countUp(); + counterInterval = setInterval(countUp, 1000); + return; + } + showCounter(false); +} + +// +function outOfTime() { + E.showMessage("Time is up!",appTitle()); + setState(states.countUp); + resetTimer(); + Bangle.buzz(); + Bangle.buzz(); +} + +/* this counts up (one minute), after time is up + Show + - Title with current time + - initial timer value + - "Time is up!" + - time since timer finished +*/ +function countUp() { + // buzz for 15 seconds + counter++; + if (counter <=15) { + Bangle.buzz(); + } + // stop counting up after 60 seconds + if (counter > 60) { + outOfTime(); + return; + } + g.clear(); + E.showMessage("", appTitle()); + g.setFontAlign(0,0); // center font + g.setBgColor(-1).setColor(0,0,1); // blue + g.setFont("Vector",20); // vector font, 20px + g.drawString("Timer: " + timeFormated(counterStart),80,55); + g.setFont("Vector",30); // vector font, 80px + g.setBgColor(-1).setColor(1,0,0); // red + g.drawString("Time is up!",85,85); + g.setFont("Vector",40); // vector font, 80px + // draw the current counter value + g.drawString(timeFormated(counter),80,130); +} + +// reset when interupted by user oder 60 seconds after timer finished +function resetTimer() { + clearInterval(); + counterInterval = undefined; +} + +// timer is stopped by user => state: stop +function stopTimer() { + resetTimer(); + E.showMessage("Timer stopped!", appTitle()); + setState(states.stop); +} + +// timer is stopped by user while counting up => state: start +function stopTimer2() { + resetTimer(); + initTimer(); +} + + +function setState(st) { + state = st; +} + +function buttonPressed() { + switch(state) { + case states.init: + initTimer(); + break; + case states.help: + initTimer(); + break; + case states.start: + startTimer(); + break; + case states.count: + stopTimer(); + break; + case states.countUp: + stopTimer2(); + break; + case states.stop: + initTimer(); + break; + default: + initTimer(); + break; + } +} + +/* Change initial counter value by swiping + swipe up: +1 minute + swipe down: -1 minute + swipe right: +15 seconds + swipe left: -15 seconds */ +function initDragEvents() { + Bangle.on("drag", e => { + if (state == states.start) { + if (!drag) { // start dragging + drag = {x: e.x, y: e.y}; + } else if (!e.b) { // released + const dx = e.x-drag.x, dy = e.y-drag.y; + drag = null; + if (Math.abs(dx)>Math.abs(dy)+10) { + // horizontal + changeCounter(dx>0 ? 15 : -15); + } else if (Math.abs(dy)>Math.abs(dx)+10) { + // vertical + changeCounter(dy>0 ? -60 : 60); + } + } + } +}); +} + +// show help text while in start state (see initDragEvents()) +function showHelp() { + if (state == states.start) { + state = states.help; + E.showMessage("Swipe up/down\n+/- one minute\n\nSwipe left/right\n+/- 15 seconds\n\nPress Btn1 to start","Tea timer help"); + } + // return to start + else if (state == states.help) { + initTimer(); + } +} + +// drag events in start state (to change counter value) +initDragEvents(); +// Show help test in start state +Bangle.on('touch', function(button, xy) { showHelp(); }); +// event handling for button1 +setWatch(buttonPressed, BTN1, {repeat: true}); +initTimer(); From 5fac230cb9254c3381328ea379c27a1a0942c8c0 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 15:56:22 +0100 Subject: [PATCH 258/476] Create app-icon.js --- teatimer/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 teatimer/app-icon.js diff --git a/teatimer/app-icon.js b/teatimer/app-icon.js new file mode 100644 index 000000000..ae91f88d7 --- /dev/null +++ b/teatimer/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AAONjQAoxoutGAYusGAQutABs4qwAUnAwYik4vQAQnEUMTcxqoAOm6Sdm9PAB0TF7sTF90awIAOFz0bxIAOjYv/F/2s1eq5wAI1Wr1gvg4/GABXH1Yvg5wvL5xffjWIMBfH1lkFzwwC1YvJ1eIF0CRC5CNJF0KRK5CNiGBS8BRsQwJ468jAA2JGAJdpF4et1ms1uJF9YADF1GIxIAD1qQoFwgwpLwoADF1jABxJgjLpGt2YwBjYugjaMIF4IwBsgvgsgvMxIwfLxIwC66RhF/ezF9q/B6/XF9xfrLwYvhjWBABGsAAOmwWBFz0Tp4AOiYvdm4vumNVAB0xFrcUnF6ACE4iguYnFWACk4ebwAcxouu/wwsFwIABGFQuCA==")) From af47e1c672a0904cd01cf9289d5bb3f8d0d0c7ee Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:11:21 +0100 Subject: [PATCH 259/476] Update apps.json --- apps.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..e11d8b4ba 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,19 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "teatimer", + "name": "Tea Timer", + "shortName" : "Tea Timer", + "version": "1.00", + "icon": "teatimer.png", + "description": "description": "A simple timer. You can easyly set up the time.", + "supports": ["BANGLEJS2"], + "tags": "", + "storage": [ + {"name":"teatimer.app.js","url":"app.js"}, + {"name":"teatimer.img","url":"app-icon.js","evaluate":true} + ] } ] From e0e75083616553cdac118128f3d524c94c61988f Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:38:12 +0100 Subject: [PATCH 260/476] Create app-icon.js --- apps/teatimer/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/teatimer/app-icon.js diff --git a/apps/teatimer/app-icon.js b/apps/teatimer/app-icon.js new file mode 100644 index 000000000..ae91f88d7 --- /dev/null +++ b/apps/teatimer/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AAONjQAoxoutGAYusGAQutABs4qwAUnAwYik4vQAQnEUMTcxqoAOm6Sdm9PAB0TF7sTF90awIAOFz0bxIAOjYv/F/2s1eq5wAI1Wr1gvg4/GABXH1Yvg5wvL5xffjWIMBfH1lkFzwwC1YvJ1eIF0CRC5CNJF0KRK5CNiGBS8BRsQwJ468jAA2JGAJdpF4et1ms1uJF9YADF1GIxIAD1qQoFwgwpLwoADF1jABxJgjLpGt2YwBjYugjaMIF4IwBsgvgsgvMxIwfLxIwC66RhF/ezF9q/B6/XF9xfrLwYvhjWBABGsAAOmwWBFz0Tp4AOiYvdm4vumNVAB0xFrcUnF6ACE4iguYnFWACk4ebwAcxouu/wwsFwIABGFQuCA==")) From df52a6b307ac34809a8ca27dae2fae5b1378b510 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:39:25 +0100 Subject: [PATCH 261/476] Create app.js --- apps/teatimer/app.js | 233 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 233 insertions(+) create mode 100644 apps/teatimer/app.js diff --git a/apps/teatimer/app.js b/apps/teatimer/app.js new file mode 100644 index 000000000..dd7afdadb --- /dev/null +++ b/apps/teatimer/app.js @@ -0,0 +1,233 @@ +// Tea Timer +// Button press stops timer, next press restarts timer +let drag; +var counter = 0; +var counterStart = 150; // 150 seconds +var counterInterval; +const states = { + init: 1, // unused + help: 2, // show help text + start: 4, // show/change initial counter + count: 8, // count down + countUp: 16, // count up after timer finished + stop: 32 // timer stopped +}; +var state = states.start; +E.setTimeZone(1); + +// Title showing current time +function appTitle() { + return "Tea Timer " + currentTime(); +} + +function currentTime() { + min = Date().getMinutes(); + if (min < 10) min = "0" + min; + return Date().getHours() + ":" + min; +} + +function timeFormated(sec) { + var min = Math.floor(sec / 60); + sec = sec % 60; + if (sec < 10) sec = "0" + sec; + return min + ":" + sec; +} + +// initialize timer and show timer value => state: start +function initTimer() { + counter = counterStart; + setState(states.start); + showCounter(true); +} + +// timer value (counter) can be changed in state start +function changeCounter(diff) { + if (state == states.start) { + if (counter + diff > 0) { + counter = counter + diff; + showCounter(true); + } + } +} + +// start or restart timer => state: count +function startTimer() { + counterStart = counter; + setState(states.count); + countDown(); + if (!counterInterval) + counterInterval = setInterval(countDown, 1000); +} + +/* show current counter value at start and while count down + Show + - Title with current time + - initial timer value + - remaining time + - hint for help in state start +*/ +function showCounter(withHint) { + //g.clear(); + E.showMessage("", appTitle()); + g.setFontAlign(0,0); // center font + // draw the current counter value + g.setBgColor(-1).setColor(0,0,1); // blue + g.setFont("Vector",20); // vector font, 20px + g.drawString("Timer: " + timeFormated(counterStart),80,55); + g.setFont("Vector",60); // vector font, 60px + g.drawString(timeFormated(counter),83,100); + if (withHint) { + g.setFont("Vector",20); // vector font, 80px + g.drawString("Tap for help",80,150); + } +} + +// count down and update every second +// when time is up, start counting up +function countDown() { + counter--; + // Out of time + if (counter<=0) { + outOfTime(); + countUp(); + counterInterval = setInterval(countUp, 1000); + return; + } + showCounter(false); +} + +// +function outOfTime() { + E.showMessage("Time is up!",appTitle()); + setState(states.countUp); + resetTimer(); + Bangle.buzz(); + Bangle.buzz(); +} + +/* this counts up (one minute), after time is up + Show + - Title with current time + - initial timer value + - "Time is up!" + - time since timer finished +*/ +function countUp() { + // buzz for 15 seconds + counter++; + if (counter <=15) { + Bangle.buzz(); + } + // stop counting up after 60 seconds + if (counter > 60) { + outOfTime(); + return; + } + g.clear(); + E.showMessage("", appTitle()); + g.setFontAlign(0,0); // center font + g.setBgColor(-1).setColor(0,0,1); // blue + g.setFont("Vector",20); // vector font, 20px + g.drawString("Timer: " + timeFormated(counterStart),80,55); + g.setFont("Vector",30); // vector font, 80px + g.setBgColor(-1).setColor(1,0,0); // red + g.drawString("Time is up!",85,85); + g.setFont("Vector",40); // vector font, 80px + // draw the current counter value + g.drawString(timeFormated(counter),80,130); +} + +// reset when interupted by user oder 60 seconds after timer finished +function resetTimer() { + clearInterval(); + counterInterval = undefined; +} + +// timer is stopped by user => state: stop +function stopTimer() { + resetTimer(); + E.showMessage("Timer stopped!", appTitle()); + setState(states.stop); +} + +// timer is stopped by user while counting up => state: start +function stopTimer2() { + resetTimer(); + initTimer(); +} + + +function setState(st) { + state = st; +} + +function buttonPressed() { + switch(state) { + case states.init: + initTimer(); + break; + case states.help: + initTimer(); + break; + case states.start: + startTimer(); + break; + case states.count: + stopTimer(); + break; + case states.countUp: + stopTimer2(); + break; + case states.stop: + initTimer(); + break; + default: + initTimer(); + break; + } +} + +/* Change initial counter value by swiping + swipe up: +1 minute + swipe down: -1 minute + swipe right: +15 seconds + swipe left: -15 seconds */ +function initDragEvents() { + Bangle.on("drag", e => { + if (state == states.start) { + if (!drag) { // start dragging + drag = {x: e.x, y: e.y}; + } else if (!e.b) { // released + const dx = e.x-drag.x, dy = e.y-drag.y; + drag = null; + if (Math.abs(dx)>Math.abs(dy)+10) { + // horizontal + changeCounter(dx>0 ? 15 : -15); + } else if (Math.abs(dy)>Math.abs(dx)+10) { + // vertical + changeCounter(dy>0 ? -60 : 60); + } + } + } +}); +} + +// show help text while in start state (see initDragEvents()) +function showHelp() { + if (state == states.start) { + state = states.help; + E.showMessage("Swipe up/down\n+/- one minute\n\nSwipe left/right\n+/- 15 seconds\n\nPress Btn1 to start","Tea timer help"); + } + // return to start + else if (state == states.help) { + initTimer(); + } +} + +// drag events in start state (to change counter value) +initDragEvents(); +// Show help test in start state +Bangle.on('touch', function(button, xy) { showHelp(); }); +// event handling for button1 +setWatch(buttonPressed, BTN1, {repeat: true}); +initTimer(); From cf865a5d779be2c3bcf7430f340a52ce5f164137 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:39:55 +0100 Subject: [PATCH 262/476] Delete teatimer directory --- teatimer/app-icon.js | 1 - teatimer/app.js | 233 ------------------------------------------- 2 files changed, 234 deletions(-) delete mode 100644 teatimer/app-icon.js delete mode 100644 teatimer/app.js diff --git a/teatimer/app-icon.js b/teatimer/app-icon.js deleted file mode 100644 index ae91f88d7..000000000 --- a/teatimer/app-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("mEwxH+AAONjQAoxoutGAYusGAQutABs4qwAUnAwYik4vQAQnEUMTcxqoAOm6Sdm9PAB0TF7sTF90awIAOFz0bxIAOjYv/F/2s1eq5wAI1Wr1gvg4/GABXH1Yvg5wvL5xffjWIMBfH1lkFzwwC1YvJ1eIF0CRC5CNJF0KRK5CNiGBS8BRsQwJ468jAA2JGAJdpF4et1ms1uJF9YADF1GIxIAD1qQoFwgwpLwoADF1jABxJgjLpGt2YwBjYugjaMIF4IwBsgvgsgvMxIwfLxIwC66RhF/ezF9q/B6/XF9xfrLwYvhjWBABGsAAOmwWBFz0Tp4AOiYvdm4vumNVAB0xFrcUnF6ACE4iguYnFWACk4ebwAcxouu/wwsFwIABGFQuCA==")) diff --git a/teatimer/app.js b/teatimer/app.js deleted file mode 100644 index dd7afdadb..000000000 --- a/teatimer/app.js +++ /dev/null @@ -1,233 +0,0 @@ -// Tea Timer -// Button press stops timer, next press restarts timer -let drag; -var counter = 0; -var counterStart = 150; // 150 seconds -var counterInterval; -const states = { - init: 1, // unused - help: 2, // show help text - start: 4, // show/change initial counter - count: 8, // count down - countUp: 16, // count up after timer finished - stop: 32 // timer stopped -}; -var state = states.start; -E.setTimeZone(1); - -// Title showing current time -function appTitle() { - return "Tea Timer " + currentTime(); -} - -function currentTime() { - min = Date().getMinutes(); - if (min < 10) min = "0" + min; - return Date().getHours() + ":" + min; -} - -function timeFormated(sec) { - var min = Math.floor(sec / 60); - sec = sec % 60; - if (sec < 10) sec = "0" + sec; - return min + ":" + sec; -} - -// initialize timer and show timer value => state: start -function initTimer() { - counter = counterStart; - setState(states.start); - showCounter(true); -} - -// timer value (counter) can be changed in state start -function changeCounter(diff) { - if (state == states.start) { - if (counter + diff > 0) { - counter = counter + diff; - showCounter(true); - } - } -} - -// start or restart timer => state: count -function startTimer() { - counterStart = counter; - setState(states.count); - countDown(); - if (!counterInterval) - counterInterval = setInterval(countDown, 1000); -} - -/* show current counter value at start and while count down - Show - - Title with current time - - initial timer value - - remaining time - - hint for help in state start -*/ -function showCounter(withHint) { - //g.clear(); - E.showMessage("", appTitle()); - g.setFontAlign(0,0); // center font - // draw the current counter value - g.setBgColor(-1).setColor(0,0,1); // blue - g.setFont("Vector",20); // vector font, 20px - g.drawString("Timer: " + timeFormated(counterStart),80,55); - g.setFont("Vector",60); // vector font, 60px - g.drawString(timeFormated(counter),83,100); - if (withHint) { - g.setFont("Vector",20); // vector font, 80px - g.drawString("Tap for help",80,150); - } -} - -// count down and update every second -// when time is up, start counting up -function countDown() { - counter--; - // Out of time - if (counter<=0) { - outOfTime(); - countUp(); - counterInterval = setInterval(countUp, 1000); - return; - } - showCounter(false); -} - -// -function outOfTime() { - E.showMessage("Time is up!",appTitle()); - setState(states.countUp); - resetTimer(); - Bangle.buzz(); - Bangle.buzz(); -} - -/* this counts up (one minute), after time is up - Show - - Title with current time - - initial timer value - - "Time is up!" - - time since timer finished -*/ -function countUp() { - // buzz for 15 seconds - counter++; - if (counter <=15) { - Bangle.buzz(); - } - // stop counting up after 60 seconds - if (counter > 60) { - outOfTime(); - return; - } - g.clear(); - E.showMessage("", appTitle()); - g.setFontAlign(0,0); // center font - g.setBgColor(-1).setColor(0,0,1); // blue - g.setFont("Vector",20); // vector font, 20px - g.drawString("Timer: " + timeFormated(counterStart),80,55); - g.setFont("Vector",30); // vector font, 80px - g.setBgColor(-1).setColor(1,0,0); // red - g.drawString("Time is up!",85,85); - g.setFont("Vector",40); // vector font, 80px - // draw the current counter value - g.drawString(timeFormated(counter),80,130); -} - -// reset when interupted by user oder 60 seconds after timer finished -function resetTimer() { - clearInterval(); - counterInterval = undefined; -} - -// timer is stopped by user => state: stop -function stopTimer() { - resetTimer(); - E.showMessage("Timer stopped!", appTitle()); - setState(states.stop); -} - -// timer is stopped by user while counting up => state: start -function stopTimer2() { - resetTimer(); - initTimer(); -} - - -function setState(st) { - state = st; -} - -function buttonPressed() { - switch(state) { - case states.init: - initTimer(); - break; - case states.help: - initTimer(); - break; - case states.start: - startTimer(); - break; - case states.count: - stopTimer(); - break; - case states.countUp: - stopTimer2(); - break; - case states.stop: - initTimer(); - break; - default: - initTimer(); - break; - } -} - -/* Change initial counter value by swiping - swipe up: +1 minute - swipe down: -1 minute - swipe right: +15 seconds - swipe left: -15 seconds */ -function initDragEvents() { - Bangle.on("drag", e => { - if (state == states.start) { - if (!drag) { // start dragging - drag = {x: e.x, y: e.y}; - } else if (!e.b) { // released - const dx = e.x-drag.x, dy = e.y-drag.y; - drag = null; - if (Math.abs(dx)>Math.abs(dy)+10) { - // horizontal - changeCounter(dx>0 ? 15 : -15); - } else if (Math.abs(dy)>Math.abs(dx)+10) { - // vertical - changeCounter(dy>0 ? -60 : 60); - } - } - } -}); -} - -// show help text while in start state (see initDragEvents()) -function showHelp() { - if (state == states.start) { - state = states.help; - E.showMessage("Swipe up/down\n+/- one minute\n\nSwipe left/right\n+/- 15 seconds\n\nPress Btn1 to start","Tea timer help"); - } - // return to start - else if (state == states.help) { - initTimer(); - } -} - -// drag events in start state (to change counter value) -initDragEvents(); -// Show help test in start state -Bangle.on('touch', function(button, xy) { showHelp(); }); -// event handling for button1 -setWatch(buttonPressed, BTN1, {repeat: true}); -initTimer(); From 1133ea25bc7bda4571ed0e8dc52e61328e5482ab Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 16:44:09 +0100 Subject: [PATCH 263/476] Add files via upload --- apps/teatimer/teatimer.png | Bin 0 -> 1900 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/teatimer/teatimer.png diff --git a/apps/teatimer/teatimer.png b/apps/teatimer/teatimer.png new file mode 100644 index 0000000000000000000000000000000000000000..29ca58f0ecd948dbc172fa9f004f3ec9f05c94bc GIT binary patch literal 1900 zcmV-y2b1`TP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2LVY$K~!i%&01Y- z6jc=d?wy(4+1=UxZ5PohKLuK(R;uD};$H-W01s$lBt%i;FAt58_}~-z;)|j_QH{p` z@L{J9q9>KfC_;qVCSk$DT~T`CZ1!x7)B|5LEt8aHt3;S0^H==MwjKy?A&}>-w)c zPKuj8-?D7mr5jT_(r=8|4(jPv6++0;Q~xu#Bv6zNrgkOnYkc#_r>$boslCqj(N{)o z$8M^mxNztX*MAGt=dSoleNRM4(cgNKk2Q&w{!QObTDeYAK2-ksoX`sj;u!^@eECAa z$mwL-sD-?0m#@r;LY>eDL__cGlQyhqMYkc-7&!%35600pq(ij?s4D|OK_Qcp)l&;{ z_-4fvG7+o%%N!`VlPT(Y*VuGWRlr852NL5N8YUzbpVHBliu!gbTLpUCGB`PZ8dEVF z!-)b+tqKAR=3V#0nyOV`i%Xl>QV%CaB(6ND;Nqjq-y7KKKVL3!v`#{;he6==s?mJdFnAwIuDc+s0Ou;|=$?@z$3YB%*MsydhLu2{? z4X-AtQJpBxK$a56Nb_2}AV0=|!WXcpc!5s>8}LM?9m|hCj#y@}1_BZj^{bFt`V5|p z^%H@8o(Xt%A*9-(x9Jj3w5(&(6s43SR_jgpzZr!mcwNzKHJKiti#4 z9~M8tVXM!T$@=%;XsC!uX9`6seh~insIcV9*+HpY;nR{MeGG%g4Sj z=8R#;`2|ZNH$#bbBAPu;E4LBq4V{L}YjAw=4h$MeyjFaR2-Dn$N)QN)09!LnB!+Ps zD`T569qWK@4pGpy;6&?F7_Gk?y9=-5s5OW@m7w6;h0X*AWENA9TF6aQ$J(Dqs{J`k z(yoVr|G8%PD|kkU~Mdtf%}PXp_N7<2mIrbtxW> zJ_4txlS5HbBc(ZUxyM!*4@MrsWm<R99qR2RuYXOK@A6EJKs{+@}25RYzse#g>o_Z`s^Yl zdldh7RNNi95ADkGKzhL!0al<(y#iap_h5lsbWY_N3h5fBY^@TL3&eaRMDzJ4z`o61pPM zDwj~tZ9|(+SMo(5DdwR=>8xmd26N069MpwNJ)sDJC2}cRWXt&?P$E$axEEM)LlbVY zE5VQYzG9$6p%$>x{0b>TBQ1GR8MVtf6Fvyk239djmS@G82#-oZz$bw!qPGlM@3S_GM@E0Z@4-L2djP}3$~G_PP@T7!|1SU4O;SBh3zKHrS+hHu}pEPiS+ zFE#blM+td1?oiN(cz zo4%iLOn$L>?v+Rx;UdjGvoskqgHimS$kR-9!YE?8nvHJ9$;XvQzu0r?184il?lk#P zV>P|t-cX~T)&d@xDrix%zL4qN&5tz8mk#e~-Ich%Nx~VYp9<_(rMqSU3FZdaZ~v`& zPUU&Xa`khjDX)y}YTDNP^1%CTl0RADuReN`+Z*}Y1OB9CP7>z>q`V^JRGo|r#ufeR mp62bzw+B95cI&~mpZ@?#zU_Tr1SRnR0000 Date: Mon, 27 Dec 2021 16:53:17 +0100 Subject: [PATCH 264/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e11d8b4ba..1c01db9b8 100644 --- a/apps.json +++ b/apps.json @@ -5069,7 +5069,7 @@ "shortName" : "Tea Timer", "version": "1.00", "icon": "teatimer.png", - "description": "description": "A simple timer. You can easyly set up the time.", + "description": "A simple timer. You can easyly set up the time.", "supports": ["BANGLEJS2"], "tags": "", "storage": [ From b513ef8dee7335a8aa73c225cb3f9f2fe6ab03b8 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 17:02:55 +0100 Subject: [PATCH 265/476] Update apps.json --- apps.json | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/apps.json b/apps.json index 1c01db9b8..e5e9f8f02 100644 --- a/apps.json +++ b/apps.json @@ -5062,19 +5062,5 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] - }, - { - "id": "teatimer", - "name": "Tea Timer", - "shortName" : "Tea Timer", - "version": "1.00", - "icon": "teatimer.png", - "description": "A simple timer. You can easyly set up the time.", - "supports": ["BANGLEJS2"], - "tags": "", - "storage": [ - {"name":"teatimer.app.js","url":"app.js"}, - {"name":"teatimer.img","url":"app-icon.js","evaluate":true} - ] } ] From a15c9b3a746d018eeba58643fc4f677641b45aa2 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 17:12:37 +0100 Subject: [PATCH 267/476] Update apps.json --- apps.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..1c01db9b8 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,19 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "teatimer", + "name": "Tea Timer", + "shortName" : "Tea Timer", + "version": "1.00", + "icon": "teatimer.png", + "description": "A simple timer. You can easyly set up the time.", + "supports": ["BANGLEJS2"], + "tags": "", + "storage": [ + {"name":"teatimer.app.js","url":"app.js"}, + {"name":"teatimer.img","url":"app-icon.js","evaluate":true} + ] } ] From 411a08aa701ea713dbe56c92c0f36f22c18aa075 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 17:21:57 +0100 Subject: [PATCH 268/476] Update apps.json --- apps.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/apps.json b/apps.json index 1c01db9b8..c9b7c638d 100644 --- a/apps.json +++ b/apps.json @@ -5063,15 +5063,14 @@ {"name":"ltherm.img","url":"icon.js","evaluate":true} ] }, - { - "id": "teatimer", + { + "id": "teatimr", "name": "Tea Timer", - "shortName" : "Tea Timer", "version": "1.00", - "icon": "teatimer.png", "description": "A simple timer. You can easyly set up the time.", + "icon": "teatimer.png", + "tags": "tool", "supports": ["BANGLEJS2"], - "tags": "", "storage": [ {"name":"teatimer.app.js","url":"app.js"}, {"name":"teatimer.img","url":"app-icon.js","evaluate":true} From 807ebd6d9e326409149409b9b33be7da92ab81af Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 17:23:06 +0100 Subject: [PATCH 269/476] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index c9b7c638d..0401e96eb 100644 --- a/apps.json +++ b/apps.json @@ -5069,6 +5069,7 @@ "version": "1.00", "description": "A simple timer. You can easyly set up the time.", "icon": "teatimer.png", + "type": "app", "tags": "tool", "supports": ["BANGLEJS2"], "storage": [ From 8ff96ed6abd58f66bd9fd0fc665b15fe2c6e72f8 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 17:28:47 +0100 Subject: [PATCH 270/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 0401e96eb..9f9361818 100644 --- a/apps.json +++ b/apps.json @@ -5064,7 +5064,7 @@ ] }, { - "id": "teatimr", + "id": "teatimer", "name": "Tea Timer", "version": "1.00", "description": "A simple timer. You can easyly set up the time.", From c4e17af0d2f9251617155e75f9ddecc1e32951c3 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 18:33:31 +0100 Subject: [PATCH 271/476] Add files via upload --- apps/teatimer/README.md | 45 ++++++++++++++++++++++++++++++++ apps/teatimer/TeatimerHelp.jpg | Bin 0 -> 47004 bytes apps/teatimer/TeatimerRun.jpg | Bin 0 -> 45034 bytes apps/teatimer/TeatimerStart.jpg | Bin 0 -> 43935 bytes apps/teatimer/TeatimerUp.jpg | Bin 0 -> 47055 bytes 5 files changed, 45 insertions(+) create mode 100644 apps/teatimer/README.md create mode 100644 apps/teatimer/TeatimerHelp.jpg create mode 100644 apps/teatimer/TeatimerRun.jpg create mode 100644 apps/teatimer/TeatimerStart.jpg create mode 100644 apps/teatimer/TeatimerUp.jpg diff --git a/apps/teatimer/README.md b/apps/teatimer/README.md new file mode 100644 index 000000000..fd1b3a1cf --- /dev/null +++ b/apps/teatimer/README.md @@ -0,0 +1,45 @@ +# Tea Timer app + +A simple timer. You can easyly set up the time. The initial time is 2:30 + +On the first screen, you can +- tap to get help +- swipe up/down to change the timer by +/- one minute +- swipe left/right to change the time by +/- 15 seconds +- press Btn1 to start + +Press Btn1 again to stop the timer +- when time is up, your Bangle will buzz for 15 seconds +- and it will count up to 60 seconds and stop after that + +## Images +_1. Startscreen_ + +![](TeatimerStart.jpg) +Current time is displayed below the Title. Initial time is 2:30. + +_2. Help Screen_ + +![](TeatimerHelp.jpg) + +_3. Tea Timer running_ + +![](TeatimerRun.jpg) +Remainig time is shown in big font size. Above the initial time is shown. + +_4. When time is up_ + +![](TeatimerUp.jpg) +When time is up, the watch will buzz for 15 seconds. It will count up to 60 seconds. + +## Requests + +Please mail any issues to thomas.fehling@mailbox.org + +## Creator + +Thomas Fehling + +## Attributions + +Icons used in this app are from https://icons8.com \ No newline at end of file diff --git a/apps/teatimer/TeatimerHelp.jpg b/apps/teatimer/TeatimerHelp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..107f5586436d8a93e88ea47eb84707bdeb4cdd8d GIT binary patch literal 47004 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

X6?7CE{e~ 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

gj*$atXf!mvOSb7%%ch6rox0KmZ7sbSI;Oxqxh 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 Bupj^c literal 0 HcmV?d00001 diff --git a/apps/teatimer/TeatimerUp.jpg b/apps/teatimer/TeatimerUp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3217988635d0b2f2c45c70d73dc3a1eff754c770 GIT binary patch literal 47055 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 Date: Mon, 27 Dec 2021 18:35:06 +0100 Subject: [PATCH 272/476] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index 9f9361818..ab53b082a 100644 --- a/apps.json +++ b/apps.json @@ -5072,6 +5072,7 @@ "type": "app", "tags": "tool", "supports": ["BANGLEJS2"], + "readme": "README.md", "storage": [ {"name":"teatimer.app.js","url":"app.js"}, {"name":"teatimer.img","url":"app-icon.js","evaluate":true} From 02af613074f3d7a3ace749f96aad184b59e57cf0 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 18:40:49 +0100 Subject: [PATCH 273/476] Update README.md --- apps/teatimer/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/teatimer/README.md b/apps/teatimer/README.md index fd1b3a1cf..71bec3ea8 100644 --- a/apps/teatimer/README.md +++ b/apps/teatimer/README.md @@ -42,4 +42,4 @@ Thomas Fehling ## Attributions -Icons used in this app are from https://icons8.com \ No newline at end of file +Icons used in this app are from https://icons8.com From 98d34da29a948471d96e1218233f9cb316bea8ca Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 18:55:32 +0100 Subject: [PATCH 274/476] Update apps.json --- apps.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps.json b/apps.json index ab53b082a..66d456daf 100644 --- a/apps.json +++ b/apps.json @@ -5076,6 +5076,12 @@ "storage": [ {"name":"teatimer.app.js","url":"app.js"}, {"name":"teatimer.img","url":"app-icon.js","evaluate":true} + ], + "screenshots": [ + {"url":"TeatimerStart.jpg"}, + {"url":"TeatimerHelp.jpg"}, + {"url":"TeatimerHelp.jpg"}, + {"url":"TeatimerUp.jpg"} ] } ] From 07f959454d12bc32cf82db1d48695264284f5353 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 18:59:01 +0100 Subject: [PATCH 275/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 66d456daf..e6f8d2c08 100644 --- a/apps.json +++ b/apps.json @@ -5080,7 +5080,7 @@ "screenshots": [ {"url":"TeatimerStart.jpg"}, {"url":"TeatimerHelp.jpg"}, - {"url":"TeatimerHelp.jpg"}, + {"url":"TeatimerRun.jpg"}, {"url":"TeatimerUp.jpg"} ] } From e36eb14aedfb497aadd1801197fc8fdf499fbee5 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 19:02:40 +0100 Subject: [PATCH 276/476] Add files via upload --- apps/teatimer/TeatimerHelp.jpg | Bin 47004 -> 5125 bytes apps/teatimer/TeatimerRun.jpg | Bin 45034 -> 3981 bytes apps/teatimer/TeatimerStart.jpg | Bin 43935 -> 4245 bytes apps/teatimer/TeatimerUp.jpg | Bin 47055 -> 3737 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/teatimer/TeatimerHelp.jpg b/apps/teatimer/TeatimerHelp.jpg index 107f5586436d8a93e88ea47eb84707bdeb4cdd8d..e22960c668b2e7e1b783163274d6c80cc3c90416 100644 GIT binary patch delta 3730 zcmV;D4sG$A?*fG=ka+^$ z)8ROl5rg?kBDpwiKXopYJ z+AlN7h>V^=$fs{1duorUvD)d3e-xxKkjDa@BszR76`(+W-OW2ObI-Wuj>Q>N#U5A^ zK3=$|#T~4JDGCgBDT79$Ze7Vdh(}11{`nP3&UI^bX&}kT1%zWAO*M83?Gwo~NG11dwX((YUq-Pg7FaE!U|ehvrZC z(3m14Vn)Xb9lW(d3lIhcSha-0j0!4cv+|N@xoA^&A&%NutR#W9f49opao;)r02(dr z2!rif*XU)I9n&JFKEW7p+3(atuNWr-i~%sr4aHX_oK;(b)%h+ z*+c|U9+cUHFvetXe*hG7O7x zL&8cH^y4}GX+}Eg1(+ps2bnS$z+Cck#wr1*e*mIZP$4{q-JFBdifT6*SH%N5d|&m{ zepS&u}k0ci4zwaMB1sKg5G?9qt?aX$fC3Cn8Z^tD1 z(^d&pfop<5JvNSNRF=99#Pv>C%@H09jkl470SmaVziO^f&|hQ=qhH^!BzS62bZUl7FoZOP~#o z(nta{C3pF28y4w-L{>-2xk=bJ+8CDGf7^gRr9O4@0!4;nl$DUiRIUK#tFE3?3mU)? zco|HbP^OR&_>psA82RYV>JAX)ilr{e+vK! z$iSpYH$)wV+>D&|qQeD|7~n88ttu(QFbC^Jm=6auRDe-H3yLTipRJ79r~Pyv$kAHE zU^J*TiJB6S(D+!b3#5xQzI!1o`qibQ80Wl+B-%;Ou&6I@e5oRZLuPJ_264uJrCea|f2hdrWNUpk zTaF%0rIhT(4m;JmX+-gcWFUY#jCG<*ON|Vj*vODaj(+hU!aH&JQyT6m8fX?WWF#fn@rVG0Jzd(yBGwd+RFi6LbYI6!#nYAXww+6OHg zI1Pwq- zAMO7DLq%&1iDj(QNvwn>dsQn~@2kg>p#N|W`bMDs7o@qns2e}kOjp=>cNk+(e3 z0lm%v{{UyGAFUSF<{9o}IQ{IKhtmLmN^R~0mkRH0=@tVp$27}Za+WD=I93Xwc=cQdws-X#A3T62=w0MxSyYi}4~zT6Fj^v*F; zz$F0rtgL%&6)mQKe{;-g|-l9D9$N4qZlZjCQ7dvS^{5iaUtYaAq5FbJD3tKrTX#jhCFi9S8!T zjpUtVnWSj;y8we70mt;I^RN*^EcbU%hLNHTY$Phaq|@5wSj^BaSfr7r{`hXE@TX<4 z!dU#hM#PC;e?ncp_ivQco1G`$DVG4{h$C!pXP;6sm&Ffb`vYz*~M_k%&Hk2 zK5^F_sGbt)u|_s7a!T=x9R9URTUA&m1Zl&H<;&$8bxC-XkKn0*G!BZ0ye-po%$I4Hr?FL|`!_ z<2z12I-ZkO8BY4?t(pZ;q{_u|&44&3`clDif9@M{h9GD6XK?y`YPoc{5ovc)&lwUU z=ge`qjxY(psTTCSk}PmY{#%qJ0gTY&sMxdKDq6I#;zPBWKt7%7#j}}hqLI3~20w_Y zYRCyOS5b+&*5kMJIcKZd-z~h+;z|nA}Ejf$LIR&Lu3QVbcMZ(=?oP zf4CMgkws=hC~64OSlmW~EYYw7)Z(Lt)a*eljOqaS2pvaC**hQ-!r#g_4C#h>nCH}I zie=5KEy7I?m=#mY+a5F5J?fOb;0U2B9L&(n?&Wj88944fl_jc7BqaHvd-;SM{V_vp zP$Lmd<^qvRA3S{HYW@{}IKU^GnKUw;fAkVdCA^WKe<{lqC$9v5T6_?{pXR!Vu%&h> z;PmF5)rN$MDXp^{NUVj6ZY_?dC;8K?;_@W8R$y95On_&x!2Xn*Kti^c5$VF!0uoh~ zn4Xy@{A$gdb43!zC`=-S1x|B{8%+$cimdQRlRUQjH%X2A^V_B>Q(Z(21ioOJe=?qN zK#iQ^9eAlNpz@2m5M-2s`02pM6gI3f+Kh@TCQB zgOz*?ij3*%%#`ik2{>G=OO|!c9^b0)1(BA6jD*arLJL wKD3$v!H=ywarLRN2w3{mOzqD#Neqn0{{Y^mnP2XL#RZT5**2K!YybcN literal 47004 zcmbTdcU%-r*EZNg&Ik-SOPV1`&KZZChRgsGMY1Hx2#BO1M{y+QEC@&vMac>XLl6)X zIV(z1(l*}DbHDHI@B3qS2YUK+b#?c-s!p9ceVv-ixy!G>H60CY4FCdx09xQ5aQO{a z3lZ$*0s#8@06zc#L;xuS0PsKw+)?&|_5LH1PCzIDoWC^yAQN)!uS^UcV<1cb{y+7B zatQOkayAk3;jHI^fgd-TwP5U=BP7_&a#{-}Al$ znCJ@`$V!Q5T$Nqve5Khxdmjfk?*L)%+W{OB!s5abfS8DwsGO*noR~C+sEnKl_%8tf z+z&AS)d?r{LBYRrZo>8d(Jz7T9~q(o0OA__US{0i zXORN{&QWIiUmd{q#>LCb_*W*$%=}lrR{UT6MMXr4A^*82*k;8z|7~B&-eTPU%A^y; z`2Ur0>B|0#3)G?fzt>*LIRB$tIqv_G@&2nPE`K@xf6AG_`UL;04$=RT{};w`lK)lC z@mGH`5SJMExU0`qFLQ!hF1R`WpL+KHR0dx5=c+!q1zhbfFE1DWa}4hO_QBtBuwLW; zD!)1henh0iW&ZEqpcXj)u?Da;|EcxgZyixFJw07L5fKx8u;}t5pbn4|laP`Sk&}{; zQc#dn(s0nyP*cjL(9tt6GV$>8!QlK7l2Xz#vU2J-5gM9W+BzntX66=_RwyUu z+b(xp-Q4{H?ga(~hlIvFjE##=NJM95W#{BR%6p6{Ei136tg5c5eb&<2_Po8Lv+GS? z|G?nT@W@;2)bz~khq?KMZ%fN7t842Un_K%oe;phi9iROEbA=1E(tlw6i|qe_iweYr zgNKKUM|gz`f)fO8xKw!foT3EOsz^cyUz+P;(L_+SjFRTp#9ZRWKWH8OCQ0bHCBE_O zUqSne?Ef9G2mim2{R`}Wa4i62xS;7#;Zgz0z_%mpZUYqIE9I1BK%#G)@Z{RlDyZjS z)i6E%-5%lhI-6G)JkTtYf$HtEju^P0=&e-M&+q=>9tr->RgY-!~$ZT@vrbUX1x)0)hiF zZsiBa48shn-S|kCk*uE&U>9TdN*l`!!Z(#YVN(o6UGPg_zMLZaw^4zEatkq#@g7?! zF|M>rck|R-#?5Qf;NqRrG)98H&EY&-MZqQ8Enem$Vj@gK{!}Djfw+RnCGsIMK-qPG z$?{-KvUM?V%e9Nrbx1f*Djhi6T-Ik5fvu_eJElky$ezO^TZ|4r>K4$94qS}u9i44l zjN7bVPYqxh4Vt^YhtKY)5;{35>;h{}O7$Njcq<(FCe>lluDM?>l2db@3-=Oe&=hH8 zzn$g=P`F(JcM_bEv1|5uaYWCPlgXwOs{MRp(8BNZ=w#F>yALG!a_9(5k%44({2cdp zg=a1{N_UbHo0U7@fz{*q0(J-Si0|v#%;|CPIxn6)DfkW&tzn{ z4ys7aWh$$$%<8T0+oHGGs7&z~vz^4Fve+js`GVt=k#A~{G_@Sh_Ecr6A`;ltGESzB zt{=TgV*3PtGm@$bJqLSVKdoISXzpY)?G2_hb~k2+JN2=$j!(0qRF>IJ21Qe4Z#%x$ z861%?C{^?}&H09>jNAH#Qug;Iw(0XsN>6rs`8eu)K_c#KMy1ws49_gCaX73?Jvf?OGP3{f~S~IUscel9lf~(T$GR9lv@(M zHqfb?S+jIGcnq}IHLvS&ow!9l8)2o(nPi(xI)AiPn(byEh?D9p9LT@v zk$jEvn@+&M>!nm@r9h4;Xx0~6{>|nn2>avmmFTgg^ZddXD7m8izNQ@CXy{VciCJXJ%0}!}?@$M}je0oRn z+AtESMkUY|@O#(MA~NMTD-@sL;vdj}&8e}G$QVpU0w~N6DnG2`AS7rJzNgHq{}>tb zxt4!*$auB<5^!z*C03=BBV`bZb=8x1jMh@a8sV@Vgqkq8Bp(*zpaDY^42N_U?m8-S zy@_nE}@fvHa9S>;kptH@+GhET-At{O0`1q>&@^Wh*;>%Ihs>=)`wp#D#FqrYTd(n-eFxBIv?7h?+4L`qS(V;TEN(8S7nraZfJB z0ySnvxiJJC5;WtebWK}UtZ&K@i5>o0o$P1Fy4cE_X+sDHdX)JpvW^!qc- zImgsM{ee@7``Hl~g@B6jH%q^XQ?pBnhTLWIY=Ux&S4gC89J~38bd*Z0uj2lwSWtx9 z#`eOtqjjTq5xr8W2W5b-7Tz*pwAr3FHB0W0BEG5FJkoJtQPaogWscKtY}gz(L9#J7 z+!Z3`F7PLHgdNPD983CL$`x9Zp1uV(?XA`JU+iBGij^Z2fbGZzQ#%-i_W+LxXG!-{r)@ zY1{!^GVBBdM1nU^F~*6{)(SW#8$r;bDufkKpfwvXo`4`YC|p4qv|Gkvf~?u5Gi|OL zIj!jtbvho#n{`b;wsQ-Psqf!fYxmdj_{=g}g27kK>nxK19#=P7jI{-@ZZ^DyThHy} z*iEdpj*L^bnSPpkSXvC^n}}mv@!z9RfcKuS4mlmf^}P-Or^KgEZn05pg$Hy4bfgr7 z*xdAo@1dW*HV;U|DX`@*raSGIaL|mhOKC0TCo|*O@2jgiOt(IS8bLmz0eNF1fKu|U z`z5e{%z4}Z-}BJ**VHU9F$4+^BX^O)i-n(CC97B3n2+WXm_uaCt*2eM(zTZ!!O7{n zt|``t8*%V4R(tbVnu=fJ&+M4gJyq37EpWYcLsv?mw=Di=;zA*m#wA@REtfii?5DD>WL+# zKYyi}ZRB4|w_s}@4`JNYTv(AAGmD!@3E~`HG5f^pFF0DBkN;gqS5?Aw5BFEqth2}f z=jO=-SHV8)ch@CAba8Lo`HuzNjU~;x*b_=Ei4kUZx`W2);MK_I{ml74;rJ`T+t{bs z<#A6=MkI>74bFWHvjy4j8kHp%>0mx@y2z`%-uAicq8RgrHHdVh1e)d_V&W$Bgzj;}SHnnl-lR?EMTa-FL3C4uI)?m6bukYxC+qwI)&A?p} z4K3zioQl)FX2;J+F*;fym(jV_*-OBT@3b;Xlig1_{0nMp=Mq?cLzec9)?d1&S-OFi z06%R1B8Cs!X=eL@gi_5zYv-=6Qw92sNLgxWp{Iia#-?Aonv@7KOiR5`n5QZ7Q zjB10Uw%G1X`<^Yfc^ylX*TV%!wKU(IOsD%_aI;IF;YG@=9kGA6pc4R%@ZkxiX60~q zNqS_9ZB?oxsqB2${&#gtJ>{f^09#rbv9H?XuTxTq4(g7~)8zK>mYxJkW=^!67k>Tf zQg4M)Fd^WJ^0#`cT}I&6&Nv`0JKz{q#j{kFqo_Kdad(OjxPPxSVL*DL--%VxJH2ZM-u<}`H>IR1I=cLZ%b!uW zAI<+B-qxSHC(U{-Ux$Knwmr==)Lc?p)DdZPJ+}^;smY!j_RI2ERG%d*RfV=qF)3~} zLP=A467Hz#9n#p-bwNuj&0pHIpl;;sbP|<8a!qT;L)svvDjmj$i)~MPbC><$jFcf1 zy}Va5QfKFtvI?sgN9T67aa4BsD_Pz!nXS~G#V)FSQeEbQN{QoiEtdCOD@V{n!g{>*&It|O6H!EJQYe;5%j;UAlD=W)Qw?d@*NBmEcF zrJ^wda3NuGx_gj|m>bxR!{6S}bq3EFlew-iR+2BfB(gl36*le9Q!O9viDCVX&#`PP zakENMW?@Z&OVl?h454t_xlB^|D$FYKnYwvCoLZXj=A;-dX5HqE%R z?s54{M#d5`E8iOyX9{;A9Am8R+H;={MoIHyO@`CTp#lcrE^CBa_{oK5(^6@FeBr|= z1~viAbivBYaGG{WAH>Z?(4g|g^Y^}^B=g(Fa=&SP+4^!mrKPppXyAOe;a*_m{_@?6 zjk?D@h7U357@VHtv*33&wM7Rx%DW_3c~sqG8dJ>ek>qD>EK;3B=0m znFfirmMbq%g;IM|%aYBQEZ&o*)M4J6W@Nbp5-CSt?V;CvA}#^BrGap*L!VcWO=wR_ zV4+B~%BCu?l$5%Dqdujpj4Y70t%UMGYPrWl`Qd^caS2AIUhk%&A+}Cv)bp#iY^}~$ zH1+(8Eb%)Jz+kwj(c_l0S?tBQ=e+?zswePV4W|db>TY$AK>6~F@u}&rW^V^|`sW0c z*81Q1V1fGRa0?epf6;VuX566_SGf8j?lzy&{upz zYNFe>F4bs=y5C*2b3q|nwu}C}A6+G*yD_4u9}xFbL`#r=tGh3@V8-&IR2rpDSj~kTEOm+S4bQIKNM%HDWPpR>++#6JQL#d*F z?u4ZpZ(2f0R+zSKcQ`Uf^*gpz zrnuD=AYRnYHn&jyBEw{j8Qi~pw&mHY(7>^M00_+)<6HppT)7wwkd^r=usCPG;N} zvt`{tE6r=2!dGD)R<2<`lpa#8v!s6i6NTYuB)`%}dWJCz0l}K;PlJEL(dD_4Ne&l1 zl;N|9R&=@X&cR$8uzCug(sXLQh&ToVwst?b;S#HU z{}_*UUSMeyNk#1?Ff3;nS`7|+*)in{Wk)cW>*n1)F{$aSK(;J+qYt8_c{f*9Pxa_&o;$+*1bj&rtPmx2NU{GShPIKgewsb!37kpwv}> z@?!k59)Jf5lr{K;HjS+mp|FK(t?g2+?7s<|FM(k5N1=({ddJj{`9!sp=OwNqhdxC% zMmF4=4WCy(sH?tf;&cP0cFcg=Caw{E^J$NNYf$a04pYsOSY}pepi6dOkRZgVP~Idq`J%F5QfTYOoXZHS`_W@BZWD3sMSBwC zQ0n;-%^nvQXbLt;_7b3uIDCKXk+&$2M7z&5^X81O9Q(m-8J~wkHpTT4=$|!w^E^QL znKg1b>Y=a&~Qwx3-)o`Z~5TmaYVlSgZTrC zwT|JjN1BOrQ% zi?#~IcQGxJts)i%T<1?WQLI~RJI0IZ`o4K9L&y3=ngZO`>k++6T^?+L#qX;Q>uQ?I z3ntp>HWi*ckwmSK%JdCVST1GTsZpu#X6}+`^MSKPW{$o8m>pb=bi_a15GT+3HsK@h z&a!NBTPby+Zuyw}!@8WT#W+59(H!qEBMHA>*5Z0YtXuZK60jmNsKuEca$Aus+*}q+ z=jK8Etu=1YpRRHqHChz4a)6W!Pcky@+Wf&-uJ72Fj02xxE$QJ@qd+X!RUB|T*JuHPQ zH2sx`p6kWq+0VZE`2KNLve}4DO*f`FzrXw#z+%?L#SW)GvDlOSF=Z0ekRM$>32C_h zy7c~TO5)(QTf}TNBMtb*CXi6q^xp05YbpO`4On_m5k9Oci7j1Sjd-6NJIAZcfo=Za{aR1nmr4&cC zx+#ghLmcWy&1|h?@jH{=Be(Pk7OrUn>K!SZ?%=%eaxOOrytJW!KH| zubS&9btf%()?0Gy?(*i&_&nf9;~3J>IDM6ZD-w>F5#O}wl$9L1qW2u`<6>PKTLwu) zK|k7KD_%Vuf$y=gh++xCd0zC!{Y%%a(q=I-XR2+pi{WIVku^+CT=IH%a9S=UzpwVu zyj=e5Vg)(BdSSKOAY;dbO6{*7?{B$2T=!n6WY zFp24A;uMlq+)xVHnQ2IWooQuMw$65tjuO*n4kUx!ReM@8!KU>GX*1}6MFUsfv7!>9 ziBd6t8TFo|_K;BWrrY-^$$IWg1~BIkST5)9J7yurSVg@Pdo8ev3e$g+{`t~3u0x&1 zu3(mYmeZL*b9FV)AfL8zOhri=6pNjFgE|!tFl-5MQZ1_S0&EW+-}P?lyv?e?|Fj~` zppXCEwwd|3NT_jA6J0z>8MZVSIhV^aQ4kfb)!ay5piKUUX3rP5diBg zc0m8-5?xZK0V5a#a$AM)1c?T8L{$ht0M;Hv@+nGW=Q&jEkm>6UZIR}>NG@cYv6W= zo9Jx)yc%a>W~1>7O+R;j0IvFaj03KisSumyZ$PJ|D0RPnBYm2@%Dm`F3CJ0aO264JxanX!c9?^gQd(^UnO#33hU`CTOd;O% z(nVD!#lyPwc^8CPN?ID2_37DRUJ{-PlRm5Dl__yaY1vZumQu29WYrxG${fb%DUjhU z8hwbNw`^ABbFLkJNvjja;0+3`%HB!X$Rd7@vDt!m2r&(DNwr_4e_PqA3GIx@?%fyL zC5oua8tU<13evpK{7sP!y{+H?a-mKV9YZ<(o}S(&hgGgxUnsL%l$JA2k+)IAZYdTASCyY{;^AWqIMztH!?r{3+8FUb!oD$;PDH-B?HySa>Az zTm9`(#m}DVH42rV)jv1ZD2(Pcb7397)!$Y8-1Mi+R_MB_{_n0?cXiVDXM8R`n`K#^ ztol2KvUgCM@RBBE6Vhju-oAWJ5e_!I{Xv=iL6z^%xYrt!n;-(I$yVbIODVL}smb5n zIot+pCXz{?=F#AKpQ801Kf z=h%%$nj(Jj*{)RBHP9fgK*hghvw*&|W$9a?6iyR<1fIRWtb|HW~kR!d|IEB89e~Fq(r0rs;ro*@SFG`p$uf z!S3~fdO<_*je^6Y2JOYwM7*)N zjOGpvK|Igb6!ug<+p?LlydIW+yOahqUK2>S<4@zi>hgD2CLxQUnp{PL&A^P$j4uG% zlVzEG>9@DSuQgtSgXKSkUPt8|BtfJ^qL@H@vOs#*GB41oags@d>Bx|1Li+(BaQKda zqnhQ)7Zl^9!Wh7`0rKz6i6H>JAQFQIZ3V!zSH)H4N(TmUgIzN=!ewmo5DWX!k_{A8 zWue|k1C-*Q^i`lT7;My5dJ5Z_;Yr7u*;IYsimym%{W(4r|WA z2<8{SObi&rNEkuDX_^rf?mz*TEVvq z5%QDE){*1Wf_H{!W1Q&Fcsz_CBm&-ujj?~O1s$UCmCt7^lfA+U8v}S42Slz(3U3LD zN*l)@qHHF$aL{Bof6%qs_h?>MZvomp7zFMdq-=j^@)w+3Y=b)yp zpu0K20A5k8h4)EgD-bttUpKOx4_kj?c&_(&dm!N5$!($3_-)ljB$+TiXJ{R8cYy!7 znZ*1`a%&B71-VbLx3}_!3dx7r)C!|CluOjUEi}9=OZV?@^?Kt-}-IaTX;m|76h1 zyCscui1K#(Ix+D8ts;?c5@e!<_eJARAY^O4DzL_hLp7wjnN4sz*KX@)?sbLB-t;?Sp!aQRV^{ znY}<9KLPid7sFJSzzcDdX-fKacXcZW{>R_u?>V*vAd+cfI~-0ULv3CL(iV6Dbsslv zF6wHS!yd$N5jJh>V7e(PEG4aY@S=RNRrJpaYdyS8dD%T5O<;$DZajWaMUaJVviVH@ zGiJiEu%6t%)o6?V=2bYtmJJy@d3ugISFZ5wXPN#_|02ZGVa31{sfh}5+MA4-=z_oE zy!dr+!#C0r8}<9EK4O%!K+dV zF1A=K2K++m zd<)GtN1~z))>I|y1ifI5m5BHGGsA3rhSS<3P?-}F>NfZ-U^o9fR-$znc}TzIeE zFEZFAf7w|n79&6fdQc-*-28o`^WjTCu`X?aG8A*=vBhVqEB)|=aG5>{$n9qxCWwM#H&iy3cstcypib-$K5asB(KVfk zIXZ*RMt}XxkSA;R4?k#!J)&wp3V9D;BXaGnCqEAbFz&AZB6rLRaR8fEGtx2+s><+NL#Aon-j0>BY(Qeg&p(O72qc}eA(gb zua_!(TsQkjK#7FvpuVyzJ1ILS3Jev%Ml|8R1kAtaxaxg<`f5dh@AS)TcZzZnLwsAn zhk598L1POMbXVd)_AB+Xx}>I|qwL7^Ngr<4cD{P@4@+G zZD6b-S?#rav8%WCJKp{$*To*3yIt)efUom}Hq|Ad%v(?pk-RKtFRlC$;{_-0<*7OJAU(N;uj;Rd4o%OC$t7g8_5{TDyzy^1ppl)8t5 z$bT3}J2bDg8yZzunZvW!%++Bel`3yimyb8#9GsBhEV|HIvCk<^(^r29EZB>3yL1yP z&$MG}pY}`nSiJZos?_#zE^;Vec@N!n%GnTSyC}#Vqu0`D9nWc?wQXhnsUz{mNptAZ z?yD6p%G1M!8?g@!_La6k8eSk{pOSveMAK)>BiQ3Y^;H^3>sU>n#PvbrW0iF>ScJ>Q zrXL?Fk9X|~T&Vsy#}615< zAa3Fb|d6Rpd|Et&J!cX8AfZm1WT1>ig#oeQzjL+ITm(yur9gXNsyz zB8(K_pXnH!m$oy@S6p92h98zmw0sH7*!l*RQ_20T1=kxo7&_RrJCWfobiTUQJrEF0 zA=cKwj_z+!@57Gpi~1K9n-$oi=Z5>Lp_ucp^CNCSnGv13ov@({%nn{syDY4&AA1kk^+rYNXFI~GGD zBk);LmeOlx(K2!<+w!0hb9#NYe+|9HU03bzbmO$Lqelj$h(`#^?i@B^>~LA6Od=Jg^}|Lz^$+OYwqq;b$a39XvuXL7mba|9-FUSU zM`na!xWS|6S|YsOcfdZ*csg~P9=E1mNNGMdAmb6cNMoKG0ii8g-KLnwIXETA>gjA- z#eS((+P5~4BTNlx?44@Zr=Re49dp(m3ocHRyq>mfr zMx?$}Rk|6UFib8|KqFvd{)urOeEl}_B-ls&4@bd#m!xR&Qr9No-p5Td>m_Cx>$zV( zT06eBInkGZdi3vqlqBv&EMHTj(me4ibJjd2 zc(@?lx?jwy-LdA+M$LYe^R}Kbef9)7%xA`RL*?)6o7R#Ah6$c<%1@wei^omJ|1miS zQwCjza-MuoX(z3njpuq0{?uS^w6b@(;uh{({3-wQ0cwr+AJayo?udW^rbPb4_1rS= zJMb1+R`>L&e3FfaSXAajnSo=-m}EVh6j@o7!i;}aF;=jzTH~XM-yW-m2ZCawkK!T>ay4ezkJ$Yd)pK&%2w0+S)*yfe+ ziSCFl#%3k&J|9Td`rl`tZ9bFuco!g)ZS1%N$gbbpIm@34f4%rYP6hJET&a!nNkA22 zZv%XjQ*1AhDutON^`vTBT`s&x$L{CBU8m&cL=1A*x-&mYs<6PL(wu<#jv}P&_G{Jw zgNG?$vh4WJ23sYP0?{iiWH=o))#o3fDfe3~INpE}3=F7LUc6f&!RssSlNGwoh@Uui z?}(31G_p%MCtwzICcHu#TkB2et|Z4nla0!bT?zJGZl$U}AM}-@Q~5%RwmxjySR^X1 zaDUE$D)F-FlT&YKI<;aZPW@7Ij8lvIPa~@&HolvUe}1^Hn|*WH5E;`NIy248WriDV zWnj}sSL6PO-6eiZkq}z^l#}tfbmjS|W{Koe)>1y1kp|x10gSF#bASM3@P$0`V+3#6{`eXdYN0YN=Dy{@xv0OCbwAY9Qd4@#zbkm(`~`ovxy^CI>X}$sb9=bB z%i);1=eCTa{Iv1?ZK^5p=+rQipfuDN2l>~7>n(>5#jR^&#%v_g(SH={5CO>+0K3i? zhtubOOlN}9#~nTB#B+Bsi_g7sn`^cR1avUv+_$$Tp47!I$OY9Lbi5q5^WB2C?^(Jw z-#^{8y0+3zo8?i}HPY?2me75Z;t307h2Jd>;}0nV2=cy~x^EQ%RT*hZlFdkyC1&cF zV?%7QCT+Eb{#3q8R|CweDcM5bD?`_Dm3CCi2nG}%6jMYFC~p}Rxi1kjr+}v>)tzP$ zLgLx5avY}U6%rr!rAA(mzjHP|ce8X{F|i>qIVgb)bliU7Lkvg;28Pd9+)bD#W;sT4 z2?;U~Ca=|>+)0?bPiuT}ZOLv{cB=9Z)0#xnNNE1yQqGO&#J#|qD^3d?yK2fOk9Fo0 zFs5?xCbd%pAEC6av(zVfgQ7#IhS2%8EVdjYREc=}RO-jJKgkz4U+V7fdbppKe(rlc zCge};a8h=mni?_Szo0G=M6x~YZ<~Dy#K8(kKfl~lseCddGhDMm+iN@0;fo4<%a;_E z`oh%k)0}HFHPOY!w%MWOv84>-iepRC@f7o1Z)@uS*4duM`ohLz&ewW6>t)n)2vaCT zV}Q0`ZU=6r7^{5^iLGdN$YK%@{Yy(jv@{8m_w^|5d(gQtFRr!P=Qy=%%{Li2cJcns z#FO78E^IAw(~Dv-{fSB4fp{M+oUo2UeQO57mLaAC{RciU)-qq$}i;h*fmG_p@ASMu!yZCm5HPCHFCM*EU85#bC$+Vq3;@C-6Ah=%_Kspm`gRP*X5Yl`}J*~5@F zs-YJLq??3@F$)fxvioscDyv#t80?P&9)-nZB=R(t>-LN-Nz<^T&BvQ1k1f*0ZT7R& zTudK{B{HgR1XmCA_x$;whNkVOr%sKU*_D^3zW>7+R#S*x*2o;J^&^y6UJU&pAH>L> zS=A(&5y3U&^S1aan*hpt2k}WtY@#)@dQ7;SEbwEQO%~$(lb<7A7i~vL)!vpIH(&ez5CgTgy^>+wp>%z-}$?bma(d2 z_igq^t_h*&&-IPzlajPi56}QgO-2Ip{-iGHUL!}%$Zt3Ezwt;doaHqFpiQYsRGNIq zP4U9K_2qRd;R1mWPaZ`%c2oy9Tk9&T#zQemqz<=9q5puektjvspyM1%{#qBQ8Qi-z z6kUt$Qc2!LO;%-S?Q~QhY`h$P|7!JiGv^i(b?w!$4GUk2ZCTc;ouy}TQ z+3(i6^j(4v?4QT(!Nb_Dxje6Jv>hWF-{>RpZ4_lFI=2?T&F2X_o;T;x|7N`e{1Js9~M?Qt~V4gnwHl?~zRP_-$!8Sy|YBz+_ zDXk(v^%s#tclIIoC4QSDe>X435W^KPz+~ z7E$vcU>AiA-Qra}3Q22Vzmpw6(B5^ebk_XzbrV96jzAWd{}P~IRnKgTOSuG8cWv(X zFnTPb-^T4k=czdGXdES_6EMzgLcLo%m35P14+_eKMAT!+g?wI@4O7 z6E8Y?{d24JQ(Bs!+r-*NxY`52S{|`jNCs4KD`Con1=C@eLtLU!z#d*Sm@lz$zSUE0 zY1gD7JF-;uJk|jZwmn;E(#0r==gjVF6>YME%oTiRa0&%;Z%2-pP zGIK|*ZEblnzo;_6F*hBbuK|a-IRf5mZ*S7^2CYVd0$}BY%1b2|$!&u)Bc+YQpHoK< zQ7BCqQl$?%l*n@S4&ydQ)}u|{eX((m)@VeU)uWcFE*(;(R9W6GmiR%It+Q0y(sgmJ z+hWrI7pIfCQ%x*pgtnlzKfEnq8)b6;Ck-byqyLq(nuob--_7mR>9zB()(pCMFYhuE zN_I0j@(@Vx%7n~6F; zX-Nz1(9PB-J%S!poKjP~sat4jia;ytWD?Qw4l|7DK5-4?l`#E>Jk2%|b!%V}9l@2D zY9d~J>Y$PwYO?0ou{?lzN1lf4QYIED;1gz^d+dGv6Kx*I zFzZ}psp!xIJWwK#$^{wBN<5R7?}F~C+N>Y-N;_U777Uhcs2SXB($uB@1BSr?k^F%k zbRuI{#3{(Z;=K>Gncx6<-qdVJ^itZ%q2X~|68Me-Hv|32d|?BED-UG%O4F&vNZzF^ z%T!;yW3NCx(RuA~e~euQsUtMO5^Y!zo7e*uMB03#lQqS+Qc|&3{a7IFKJ=$OzKzM(Dd;(YVg+T!*6u2y)LBfea zO1TwChHR^S4Ja!HSM1|UV1Ut?>mj#o}WVdE;*diDwRqgZK)O>vw>k?zv@LwT*p;4IFJWj&4~JY0aGt2HCZ4oF%Yo zhQHnksX`3?=)g@x9OFobR>#%ngH8~4rA+VO#8tUuLEsfpOAn*;7bm-FdwIX3aQzWc z!3s!YoGHd;ec;oMBCC9MGU*oZKj|eLYwx+-dkm5hykK(G}C;eRXxF z@6R)(KOtJFU=nS()FrtpJzJ%X*Tvq>%R)~qX?}jiJa1(ZBoW}C!Pbq*mAv*eL)a#y z+)+Psf`)7lNmjv#j~*UYSU=>0#JR5Gye-6+m&{_sAANW2cPhWUM{M3%eBojE%iZ2i zgbO4Uf$ZwmvWh8;Yb4nr7F@TQes)lECmq4ygpKRj#uaOPO1ta4p3f$bX*6l0agi); zYh+r zH&Iv1@qfDNYBWj!*tu$+Z1`FuOkH7>@4InGAA5=&%*IcTboafalO(k|O9-vT+BZi> z#;7X%!0VFT8s8W4z0>cxPo)cUb{l>-YIn5(d^KS4v z_gyOfjgKlrv`;x2rFXx!zZKAcD1=; zXot)=q!Eqm;(pPds?sY%`;_cSvH4+zOmaoFt(abI3`c52tuC?ET+F8Wt&Mxa@#~B= z9(1CbsQzj0$TnIdA96QcKdZ+fA>6XV+f$N}eL=k6ih>wu+q6zAxI)n@z>ws~_6M;6 zKQrw?k5G~wTMf(B4ZSeQ-)~?$21#VU`V;3_HvKc-A{N1x#%_EyG>D|Rqjrqwq z5&9Wzpgm1$th=8MR73`>Yd^iGIQ6q_^;A!CZvItQS0Fds?2Xv$v+}1 z?0zhHJ*?TarHSmKmVygp7mvfm^>Dxx+0`$50BGEmL6&=G_glDW_-1^VZFzdu=cl&L zuxqXA&a0Yu(#v7&mHh|vL6tJrIrST347f%N^)mGPVCbyB1)L7@_5;sS;w|}=xq%=G zUj+VlLga#@p)ZkF{|cu2NH%2cxfic4)Jk`H!s|93%|xhaCkJBLFQXRj?ThZDAxQJt zv^0ROH7yL%+H&$Se5zqWQHAY#(xa1Se(!j9di3P|3tDh}<(7z-_Y z)VLl_##WeJ^g^>=o)uO=eedpAz@ADvIx2zAB3G&20`xzx20 zE~x9@rVACNkT)aUMR;2F8%SaDUIsbjdcOJ6&*P1d`|e#tmF?59mUF&`gdX&0*?tPK z&-5SnD6ZcU5PMMK5j>wnHBz0_ECl|XiqrBaW6)@r6rQ`FA~ExfpGmDBK3$ zi|Zga^uFP)y06ff9eIC4)dNk*mer@n2z_lON6fXGF((KvwQlBU+t5rcZ>xG9;@-j%yB<5TfXi|E|c|iL{`YaNXS}zc)ObQK>@4k)0aB@L)R_neN zmXe4?t8wKo(G6AjSQu-yN9_&Cyl%t@Xps6hws$655B<8cO3Trea0$@rCNbN4m+rXd z*2%S1PRnv1?HY(qYfwBUCEaMJzVB=MHWi=$V=~GF+e8(=bob;ZOHd@n`sr|T1@at zXEgHw;e(6^mRhTr6H_q|e~yfhrFyp?%z^hs7<|oS!(J381z>&iXJIAXo6<9usxMQf zE%83Xx7;K|r;WipIZj#y0G-k&&Tlv>{$bb3@zuLwS0SnHt|Ul$n;tv)Xti>xh_)L4 z);^!K^cUgmOe7QZov`4cs1bc->h$ybpg`%P9y-E1#A96%0%`k}mw=&RNlnRq^P%LK zNYp&8wKeppy83*LoL~Z#o`bjS7& z6eHz8@{-*os4wy-IrI{siX4irvFj%W*CWOSPsevOPEXn`F_Q>Tv3x+M!7n1*6nOe{ zFTy^UfMi3!bk19jM&+HToDaCmMdcLkLh)*-mS88DT6PP zfuVM1!H5Ie8M|-l){OUIj45Gekt8_6JbV+zm%t-1@GZuy0fd;9aGgkO^CJ5H;_AKQ zn#`K_;m{F5qy*``BS;AXB2A?C4gr*2g3^nELg)~wQq+iuKW*-v>1@n3;+ncJ{h@W4pK?`P$+5g{HY zmlj6Up^I09SM!1tD6rWOC~d#n&nl$aC8IQ_I7R9q64dZl?_&31$GK&=P;C`|HUQMqR3m-`jZGNo5CL zftU!I@jJtb7Ee;){8sJD2AQVPy<9TdIu0~261G9sO0vA$;%;PR@-Ua(l&B{`4sv2s z;X9=kGurjx`IS~7q}E>o_lD^PtljQBpxKt^Y+`c#Mitf;(k+^m2kQ?WXwMZ9ZdJCB zwdX|=3K0>EObX_7Udu)Tbtf*6WIBwQe-mP79#=H?dBm(ht5)9frEnaszc%r~EOOn%p%P3lYbEF6_l#nqo^ji=%rjoOjku zV(W}Fmb-$-#zk4W+CFbTTs=v9tu$DcWZ9w0y3>&7u;O#pGZ$s*e_^Aggcf>cy2+SB zaZq-=ZIn)%VwY(T2m4xTbjhn}Kb*c$9(Uox25;((u}SY&n=>p?tr8`#h!Z>X;4+Fz zKUP25>^{R}_SI%V)OE8VTK4l#8?+`me@Dz=sU19{wTndJZnapLTbuaPKnNcSX6mPa zy2TxMn=YU+BQuI^y|uOM08~MOW2s;1&)?EuyRDvSra9}>|B7B}T1jX8(Nn2w0eVr) zZ1DwJ&yLQEH2T!2cvWvQi-Z>i_}9MV7%!w*%XRkgT$e3#_)3G|m&7^U=ns+Kuw_!< zYq8@Y!-re#eZ$tVK3dKF;Ce0stsI3UBz79e-%`zY%o5vySK3+bKG4ux-7aV7xzaIs z>+7j78;ep}I~_;)$E^vCEDKY{AAQFhXIQ*nkfb9AWJj{KG;e)M3-@f`d+8Ff4M3d~ z{%6*EIISJm`~v(546iF=YKB`1dcI9If5(pE?G6k}1Onr4qiXBZ@t?i5t%V-^vN5h> zzH-O(;ad~blG%_A(|X`zR8y(pmZNynG)~?P;UoPnBVv@tBRw|lwoksSmxs}GXN(I* zmnOiJ?HljbO?+`qa`VltwD}`Me(>~r_FH9Pf=#)a7gB227FsD_qE+Hchzpork8{at zb3JN{IREuu>EjhqH1b8GI~Vj$>prCJl|S(@uamT&G6?I|n7J+(x>IeX6JR?>d&Rm^ z(6u0H)$vg_^>}S9m-=kuQwc%YsJfnI<20f4jZFuOOwYnK)G{&-m`TWv5OvKKpl0GFiCjzNbbPXLO+M2678 z)F%X04IVpqSx^rF^5Tj5r8i8D)KoESeSvtb&@$ooq8O*l{H z`J=Gc1CQ*-xj3V{*!4K>bVdLei4m(^Q)r%J3_aZzz z@|rnEN+o0v_BDyUaj~DPM)jssL`B$&DJ^rAizQd|swINAzFKZqi|a3)-b>gzr^@x< zyV)5J+G50a+_|5D>6-QtX0~RfqOVy?qdZfBFe+uXbw2bN&0L4#sIKSFQ$)cQrEVSp z4?7z{NLA&_j7IKj*it^`DJYj*H>Z3@2$8B%X1OqImr^wz(EBNAA-%Q>w5zH1UT3W$ z9gxCl@wnb88P=(HcJ7#z4rD1U%f^!qo6GTZYM!TT_So;q-wE6`!*Q3E4@t=7A${oH z=`>KEx)gD3B~VRZVQ|&aF{3Nx>PGrENBPf54DysM3EGRy-O8DXWtF;y-@2Yl4uACw z2??EJ8IGN>ZcdCK75wW7iAXl`!u#Mzk_|<1tnkNC-i!KdH@duyJ|-77k9<<%&-U&g zjkb@tEWxPh=K8>Po3erRTP1tiS~21jDrc+!>(ZU1-*cv=+e-; zr1D*Vk!2%blo`)e@lB$D$IOT|SEbm^vebi|zn^4DO3xKuFsqWlNnFUI|@NiPcuXC zK5DQ5fi@7P>MCWhgK`-|idl?0^L@Z52#4eWs9DxyshlBnD0KQIe$>NE!G-{SuMYjU zGz|re5@bR_22hj)@WsIw5DFLIJOMlu3>W;W9&8_RAj^qSciWAAW28W$_nLqiKDJF9k{G`~UrB)ydBVF2<{sI~AU7GbTGOnfF3G?5V1q%VdhX5+x? z$J4TjqJWo!If8&}#J~_x2B3`P-w(+@l7o4K>FgBqrUi!V4MaLNl@72Bj%N~5j~*n>@i2)(6JI9ucLcD#V?F(6d&C7!G8s+$ z0(z?`QS<*JX9BYY7#Jj-DA-?NX1b8(fW9%X{_*Z>?9D8G_jgv8k%!riQl;f)w)f+i z!7qs7{hcFLVqPB74jmw|LemKbCqsPWv9RPs+dkH&ItA(9-x2jm;?++a7Ci>kcmVi5@%h?b zFi?uB|08n|g2<5|zWDEW!4?IrYEZ6#EEK}LOTx^?)#iCbhCZA~M~$nU2;R%Tr|Uy@ zdffmlU5GqxHhFAejL@_KwI2IyqCF9vG-JvL(4vLu?}B{YWy=hzhdoFWMEF=>G{UGk zz@%z|(z^ws2hbufflU${LQ3PqX`$|k3V7g1llI6vxH%<=QExr~`3lWYq~#)AQs;st zQ7~(Lgm(N~AKkW8Lr;Z4X3&7&(oSpdRlDHg9*K(Wjw>n&DHUS^bTM@ID$1L-+!Zo%0ZBAvV-DZJ8^V>KFEo_ zOwKT~akiX<9Dnhi(vk$PqtcH2i_@{|^!dBR3XGr%Q$}}P=Hsl;bF0>c+&T97_(4>> zJ4HMKkFK3CGnFn|@V}E~1PJhpP6G_`|i~U~&2xdj;o{ zKX3G0W-IvA9S$%a9?C4$L)yisa-<@_8I|wF^~Sr>E0kJ+jeC_UgSiH`*T{CqM~iOM z=s3Mv=^@1UkR(+ryL$o5||HY6?K`xwE9OZgQca+eqz2CEH|7M0$ zL4_Z)C`+U7^w+f&6L$eEGDff?gUvMiud@f?0a&wTcvGVjDZfgZNbex2Eqj$d^=te2 z>!{1vKfQ5@V~W$9qeBOI>q+3Z;v*OCn{ap5^D?$?ZQX3<4rwfo-X2-K{`jLT>|o& z|AjI24S#x~8H;`Y&-(CPm%B2Gi`X&%{Jd~!c|}a2VC79|wWo99{Y1_bkCy3B>xgfb z-*f;_0+}@S&wwGL+cxW}y;ZzPGRUElLX~qUf`K+zD02cxKY#TMxd!6Cdm6Nd!xi(F z;QEUW>HIy*m;aj8E1A{Lj*5%neN?>D%ujD)npjX=R{!g zou3RNfB?}Bj~qIyDN!A*oc@KCv}*Ytzel&ujK0rw^Lqu*3u94Xzx1~am6uEzZB*3W znAxr^NRPXM#K2?y?$M`RFBVj$c2@01Y@GV(qyhr`7U*$Sn`bWA55rODfv`7kj)Z0M zT%N}ozv{H$(2&na3+no^;<`7=%{Y5gjb<6-w6%0xD^$GjE@Xt}FCe?#tIiIxk0)ml z2U1^crKvJ8AJ27(J-t!xD|{rT`A=lddBH{D#&f}I+8VBoEO`&l=G;C}EunH+K%(np z>u0rJl~np^x_E<94Wz~HX#w|qi}sQ%1&5<-J8C&;Ha2d&){o;iQ|V&FpCw{QboXFR84DkE&}Lb2wa19Pc{zj{@O}$( zGxue#qU1@oY}JY$#rh>!7N-=4_6MuYM7P|K^Wpu8mu01&eB;`T)0uHB%`@UQXogmPs^?kdCYU-)?&7U}DTgPW}{F1^r3_W_n z`>7XiS%>MIE_)%irT=>sv(&WlF0IFyL-?`7S_WRBOF&^R|I2velTFgy_3J+Qa#R>%GSiBn*}gZ?br#Jv5I*3JA1S_foSN^ z)^Tk086Zshf0hEMWRVilOqFFnJmx0;g^ADPksfP5ZL!eIVZr%NyiKg@|4lwY0q^mQ zLLe0|ow4dCtiF#nl(#QbD96gq+6iRZf@T~VrRF!}>vJYD05k&eMMdd%tL0WS#deg} z$=WcN;t|O{*}JQ0VsH0z*&+j8o-w_UVtsDH)-C>`dGQ*$Rmv)~{NhtM(m>PyvlAQK z>{kfO+}E!Bok)^Wy*tf6pYo?Qkw~8Hvnc676%fh_*1um6F z^dDzsPsuDJyB*2R6?}DYB9r&IOB%kNO#WH2xPZ8gYg_up)lVmDBL5)$7iuSHaF(^+ z5}j>If+hMB=$s3a1ARK76B#r=e-{Thy+hl3oFp>|@?Y3Pg+2C}tID5N?MHSmDd#6^ z1!XWN0M`V9LudhrK@Ze|348UE9b<+5oa2ZlKysp_wzmsGuD}rMyB{8HThM3ZXEcox zRy>hjEov7r`&5Jdg1;-%i3^yo0*Qu1aD%9WPf7Xy&C!e3UZo@`jla=;C zre7Asv{umxh+V0lmOYc^&}3*9<$nRIvQ&j(4yn4cYMndZJa{Dr|FBLd#emYew;klj z<_ZofJR++Bx_eXLr?nZjI|Udg}P#Yp~oL)PHPljLY*a;oH$HB|#@)H3pi z*qtsRJ^m5fxoQ|qkWovD!KrsFDKs&!)q9X;E=4ufZ3VUzchk@zxP2P-D??{(8{;${ zwRIWUDS(WVBrhX&joB29QZ<1KohK!jgE*fwBVUwMID^bw>>cJhY(-ohdAtj-nr%bs zCq`1ou)e3ayNVy{e+2{*+b&WpOS zkdQ!}tmE7RIAG`+!L$cRy5#yQbzzMf_tGGLd`nM(YE8f%!!82k2KoT<64x%$S4urs$ zXo)XTJwTZ=fZByTRNcg5u2M@5Y9efupyQlAh*lxAAs`=vSLnms5~=%_ozH2$Nz5@6J$Zus$P>nnYS57K=`;r~pw)+|b3E~FM4Nv+Ha9} z!rX2++Lgq%E|H-QsOh-jm2f6H{BFh;9&P5|0l6UdSQ7k=%Wu93CrQjH70Qx3OGK zL+J^nt#$Wl&|@}&vmP>wU$_8~bytj)OWa+$*5AJ%oYsO3{oRh& zQ(?B7gTLqEkKYy-g(n{TUO)5!i38fQwcxHU@n+$gnq-oGNnKzilo^>ZDrICjt)o|z zJ4(sLy8LYU-+Mh{c+cd>^vl$?5yONNtZvY#QgFI_m-I&Y+jhhx>GSuoI#_9cR2Bc_ z>(eV5rrltM@jpbJPOxp4eb!n$D`6Rzy#7E>`L;M}z&@MVGRcS2>ZXUKqA*^3mR(BV zXh&qyg6D?SR@&^HIHlj^3F`{cS^b;^_UH|Do$8>M=k_ZierTOban%0|&(n6NdL=)^ z(YZ!HXQTL8OILNY^x`RR)$tdhW#0swn0!+dP#Nca&L`*u&InLG+rY<8>Qb4@Ak9&Ki!gV5WG0Z7H=A~{EP0pAM74GKygNe{9NT8# zrKh2FdCj29ov%jmpD-=4Yfgi_*neX3s1yyhhIGZY_%B zVTSpQPKp^wP_A1S-R`uO)fC2&{kC?MmSXFA&(uqW=^yoTPcSM7^udeCy0$!>d7ju3 zk2NlEX#{uxhHIj$ru_AH(d~>E#@#>O#M^s-Qr&0jTy23Y{3)+3_Z~PthK#e_ZJ}nN zHRoK?XMYaXlDl4I8=oT zF+D-esRd7mX>zic61e)B2L+dYUkpGF=&`pY_ou`v@;vhL9;#mK<0cc9^Gz!bO;-mP}&!afty0f8@nc zt=`GNpw!1p22`k)9rH8PW*xb2Q-s*;n)%E~VkNTgDy5C~tJjHLbBhcqwvLe%vO~^l zn@b}f&Kv4PwcA{3K%3O{1^lY$%Dg){C+q3WijzPfyzTqAwM`?&o+-)?3VFz}*z3`z zzI~1Nw6x$_;EBbomTZWE#;xOhKSju@9gYUGn%m0)^-?#CyuCK3B$$TA@i(i)m1`L5 z@Kt>uDB258^_lCa&9c%`%Ia8P!V(LZ^!PSlJ*$qA`%O}6Cz`Lxje6u{?w53f z;I2Aqv77OrdwKBL-bGH@Ir;I!s^4heUI5ebDnG+GOe5hGv~KWIvFD%kceRVcT@gdq zL)WMlibqPkg{=4=jw_HEXIl&KMg&VfidDj2?OYOQPA6*!HqV)k%PmQai<T`A3^Ag34u+}h^)9F98oNqKgs!b2aT*~}PSqjbIqBQ~! zs$2Q)0A2clq0as;{%DlGuIFf}y7Jyome;C*!+bn58u{NQ1w2u``RV%GUN9W6wJ+xf z0C7HGzk3h6R8*5WiIvF9gwBYNp~Zs=iV%#e4CJWpQ^>zu-ZPCGpt2U&M;Tve;=zSt zbq-=jmL27fn31~%!88kkF~7bwX8a3#=93a@nd#e@{{Wx`#W!8-A6>J*BFKA6OWBJn zanUSP`rRU0&Qd;6=HvIPFX${)dF2oiP4JC4NgwS4>9)PM%j%N%bId@e6j6pq|#_*A{F!E~?w~!fb)o z`aEmezc7K@645P6uL6}D{PetfxCVY1FPbDC4j)v~cfE+)^QgleXsC4GP)o>~`e0&V zGs_uY5L)#XU^toSw_krp=EHfG=yvcA{)N#2fBmU!BWiBa1Q*m3$kvhcBWk4RLm0_n zhbN)w>Cnr#2SxG&y#1gqWuWU!+>eHJq1I_o8jT#B{o(C>bldm~+N!PrQy;Xr;?lvjS`n=v+eS<%V&^o+{n4aiournOde8O~Ro4sjB%}vxa^EYEj~(+n^@a{f$az1S==Iw;);l zovTutwx{Ufgr?6`63V?#B<^ggM%DM=Cxcaa?H|58187y^jqhC@ZDW*LGI=z#mjJ>~6 zy6{5%!u9^^2D6M)O*5K}N?LxgS>q*zzc3klX5)1X`UXPYYy(QFImi`P??!3${_AW( zUi|b;S))I6{gRi&e^Ue?cb_rjkG*eQ_^#4K(_G0v*Yd^t4T}uD7SFqy1M3qfx2wdW zPMZYeGdd{S7^6@Jni<*FZh7g+-F}qHWXOCL)@RPZY=E0NK!A1z70S^MZ>r`DGzsNZ zAak1;T{#yqD^`u209vpUQfou^b@;`ph8(o%*UYqq68Krt++wh*!O{jtgyXy%DGNqj zC*TP8GN(&lMh@gC8Sq$T>h&dj;3cr${~m6^Sq&+cAjxGxtTLz{(}}(5#!X-Y(w%BLv)}VHteGd z=X$?XsPd`(i>|v~TLK$mK{6A!P8S+9pW5+Gzc?Nk=EMrnr6}Vv)kJw5Pm)29-y2u< zs8{lp(8SjgCqAVb#e*niBcpsWBCsX(?2WIsMDX{Mq==LvK}OLZRApr~Z~EEDkOH%a1)3?v+@jP*#O`$M|4!>z2QT+HmKCDa@oCw(wwfb6-5 zu*IMl<{2>SCVqxibHzuwr*5$d-M;^9AjTc!x;&VIzApk#bK> zfHM-_kh4EOlI%e8L06)RL-QA!I+rkDTU%+0lbnx7U`(M}$K4zE5E_tpJ%H7Kze>n4mmABgXt?MtOJL1;1}3%pvfmx9fG{V zin^BCUdf&f$GN@5x!u&@p^r)HqWHkeg@1@&{ZMWkO38u}S~j;9sVBUwqsJ@<{Z*#= zw$!|)i$Dj}3oy>pFkBmrK0rIF#`qN>t?7h|uUd_xAFqj-7* z`>9^2+O+2Nce_zB@}~{8>y{x5i^%Ich$pQsqTb{EaKdS-D-FXm!-v?SYFuDE?zzLp5yeGnT-qI83XjqVud8dF7J0| z&aBJS@P_bL_LSZYyFS0=UHVS$3d1wFx+2{A=*yt{S59lQ(42OA4!^ouMIL#36>q)i zDN;;^=+xxRy7~vJ>(*yyST=LGepd@gbhjs$RkfRqm$fC`blm-&>LB#)^%J_7w7D(Z z(V)guq*dgQwP0g|twYUs>s2M?+IYaqGKcj`H&bHOl}>q&-tQvTQ|nE6am?uJJ$t!( zHgGu-xpZy$5ls)hNi$pM>|vIyPFE><=idj3s{JF&wnDB%O*eBZ z*OYVe1;$363ZXK}V+Id3&f?zU&UlcI4^x|_BXhIHQa}nt4_vTQqF;D_U5=#enUO_8LZ#X zME+qIYc?PQxYJ5|kyJ94_risPG{cT7wg7^0emGjI-GP=s15p9nR^=??zvaO>No-7J znZ!>j^k|pf#+dx9jC7MY$(0x5u5>M8d;vzILPTUSTdQ+H$#PyAVyX*C%(#<6*pOl} zx9b^o+#R)#Ej0taZNT6Lbm1P)e968i47d>~E$bSfv-tIV*lOE=26jZ!rD%Xx)TW6@fQ1Sc?`lNShpFZ+gd z8A|cP?nC8xmt(9IW$r?bakxcI*D??=r3o} z#*hNxkwKw=XqVHzy;MVU%Bz5anQ#--;63iZJhHjHNT$oc1sfMlL9;vGQs>jtO?!eM zUsZT*CG%g{2X&vqdmSJs+WT^(0$RodTQ>ClqGan*2;rq0^(}ScJmuYiO9BU=dxr*x z5?R^l^1qJ+9GTC%wGH4g?Z-)3C{Yg8&&3dY8Oh<+p``-2p0|0YCA=grzegITZPr9i zuk3iLC3yjJ(m`p0f}kWH6#0TZGGmAYqBz2(N^PZWcS=7R*139Df&vmtsz`WrLV(@9 zFdtf+ZFH;+MJONRZ(Fz1H*gA->o)JsFs)aR%tr>t?C7bE{=W3pPg`5}>v%TRExx+Z z@gQq9At7ikKu3r|^yv%=xkw`f+GyJk3?~(PTNv21y7WuM;xAUt348D@EfxkTZ-TuBbV=5XyyeS29Jpq3M{>u8m`Z@G}o{MCA2gFP#R>^cK=OIRTnL z{JaL@D~k1X+UVPgl9@p5oqom2B(n>dzoKzJMo%?36mW-ch0)wHr@Y8X@H!D)N(1B( zfANbZ&m+&O-E)!&@3ns^;D^-~W?mud>BRh-5LUdZTJGL?0Zt5P!zoS`<#&Wr&EflM zBQV8AJ95@1SFvJtL-oQB8`f!>*@w;hOzN#5pn$8YxA>C1l%7sCuv2Ll3os{h{}*QY zMgN>s?0{*>p1JH zA<$qnBgXa1*TrA4y11IOsFsjlpU~1t+C0dR%l?o;akinTS@Lc0^P8U0Ngj%G*cXUp zsw+E{Ue~E6gt*E(Ivl>nW*I!7>3r;Ti}opUtieQTly5%P&N7Tm5)PFpK^5AZDO#OD zcOw4NkVjqQm#kguS{ryLd*ZKJw72SKy^BESMdy}(-0W)UC9NKpog$a#{>Pq~S9YQ8 zaFyci>$0vNflAe*S^-*{b6JFvy4D|_G!Y=z!;VPF8@)4RElI+e8k@HBu*{)8D30xG zXk`q8{knNLyIF|HlY`1Drp>z>ti2@UZsW6uoqN{u@Pv58$5UV4)v0@~Fx7{y)_rHP z>#z$rSS>uMA#-av2rXt<=j5+LsOY8h@l-8q*&MI%nFrPpEPu()jq*Rp(Yp1|5QWz@Mm~PHJ#-BjkDpwW!NExp#Jx?3?JZ% zRf1J!OuY&rtW^^Ca_!%qKO9r!w5}gMdsQmv^+05HzQdPP?}E4+!tQ+OT${GO=Rb>X z2OO-7ceQ_aQfo26oyDIiCvC0{rR^P^UU1XhQeVYX{=8Z1DD&*{$)7i~PkFIyZCo)y zUVrik-u#J_UR_*&E+PdfXHMouw5$a|o)>=Qcr2Hmr;(NusYj)w+C8?&4!ndJ{Q9}O zdY3%2kZ!Kb3sv1%)rG-Tcu-jf1`ul{wO=3W!xAIy;SX*J?rYG<(p{%}>#0`tJI3nAh0tmfYFfGR zhDb8q0}*f~pA8?s4c{yuD6y+Pdez;4YnJSnBpJK@$OP|W(&ykQz&zg|mWXZcbym-j zO9kCuE`RLTE&bNz@du4m4|}vCkuZVI2VE)I3RZwPmYT@ zYN=u)CW^2~d55LYbIUax{vS8Qzd1{`vu314pnaH8Ue7Y@0;vptSW)=%a6Qg{>D_)d z5M{Eq&9(BoiiM;UACA$WuBVf6?&AC~L^HIKeD=BCp7q|r^T?b>T23fJ(|9h4$9Q_psvj zFGfu-)GRu^S=;=HEH9U?YY0;pFA|=Pb6rNpPG7m{9*`Ek|G~T`Vb9FUE;TO~SN;}0 zNAVi=t9n{k@b0j?#QQDON<=Lq^2`g|;54V%H{M0kngwSUrP-@OpU80jBLQWA`_zP8 zD&Dw1*Yf#O5be!v_=8G4-e#IaGI)+!lDXiBhMPxL*|PON#Xn0$%6Nr>#=IjP76s%l zq&(n|z()F<=hFhce)NvYU*^1j7ZrXG#ZbKzBJ@bCWTPtML~HpK|L!FBLSueXcF;@7WY;ZBif6Ua3{M*$)kQ14&ku?tnTiWO zDDm4URoU0y>uU%7aeTS7)w9&mI=dr1`8|0@R*f+(kClfA3s$`OV^Zy@ZueQo(%C9y z^6(n{u7aSmD73j^VB(EMY`G(-#n1?gv{^ac#@sWsn%B7tpWeAY7(R(irS>iC*7U@x zj&WbWKBUD?YTcR>A;aEhPvE_mRIIj!{qgaweG7-kcTdcCZePIEnxs^=olbMg95!n` z^M_uiQR1gFjnoybsqfmdD&{2HOIcUWNUyp2HEQe5=leAA1m703o;oGh>3Sq=9NEw^ zlaKf;UU7>WSNjwszcN59V|@m5vq@teX%0>rxEYx{O+Vq|O!`kd9pd_hQ74rAn1h02 zC#!E5M$Vc%-TiR+Rf74%hcTtvtR)}JNYuQ@8T^Xn5s7BdD=sQR$_GUmpL3m@6YQ-~ zj6!*fiT}dph2F6r^!Ve{yf80ae4aX2Fo=YZ)7=D#r zwKj{D(g6ORFUUw3M*<(9tAD(Kot?9`ADXzxzFbttFs0ewYEk)ML%QNaYAqQLGGNNE z;+#chcSMlE&rzzp$dD#p2b0E92aM;Z>@18D>FmRqG}r;EE2sVb*HE13N7@!GHwZzh z4-=hhgIPvg_Euo%w@V>U;e`i=kv-hJ$r`I#|B_(_M|SW7sWt=PX;}!5T0tsgwV)S) zQGLL>Yl7;mO!O}uL?LU>W#-@a*Un`>o@Pe))Thug=*W@fG{4AIE>VYB-Lf%r+Fu(U zwB{Vou|}I{IYEJl1+4gD3Ofv=#chy|dd)C!TkARrRi=V5xZdDq-RRg7#UbK_5pTxN z%36J{b}AA1?2NZKo|cTLXFl<{XQ$sDjW7Uo(Z`snPYDFgYY+8i^RD5#gZdqZ5IipT zSl`g7zUEsw!Mz>CXB&K8*@G?xzU&C=rYe!K9Sd{yepLrmy1Q1GE5(Ms}VO z|F|>RQ+Z}1L|!EcKarlXH(Sxv>5z7QPe5puVTjwOY~;v*`t^2Y+A+G;91=Ik|Qi#r~NXy&rve=yjAMaGD}W<#i5TK<{Vby6GWCh`VR9Aq8s< zPdusEB6wR&wTFTCYoz7x3ET3JaM!%c4}SY-8V4aFo%_WqFEa$2kHZ8G-#E<2{sMQ# zwVf)iE0E8sym`mJs^Dw2ky?^rv0z>>WnF{aqVBuAc)xe8g*k7vRK(;&_pCRWa(JW^ zOC{fDJoH?R-L>w{xBc{OFHM5x`3V-(i7DQD7UhqhE z^k|;$q^37BmLD8-wt6}%hrDJHn>Ug+>tQn?v?RJu{^gr|QHTf8^u_ z>0FxWr_(uSo(%i`!c9q>WK<(O^ONecq0so6zx@^8-r%bCh{LnN5<+$Zqg?zlzg-5j!7+3%WFTZRXvUSMj#f^~+{_TD{!$|16#O z9WSZP@!>g%_RbEMw=LO?b7`l<-vwU{u;7*6IjNnyK0%u@_WZ29eYWq3Lm%t!%yG%L zw!d!RevGj7>kyl<6oW&=fY??viiP%J^q{z^aab;lj@r8um+cPLe=dG)tmBx zHemp-Q}*^dhGNR?pNKueH`3zq?v1dFQxclSP5X)$Bg_;wCR|pcHfMLaqB>f*RMmFx zcLp5TRh0fCojetKY`Y4MY&G)1M}h{@_0*eXmv!1g6<4tppR)TBMjYoo`EFhuCG<%a z+76n1H+p&fguuQ(mu|rqsSD`?k9i$1vpYu5Q(|<#T9cbLO|o24oB~&(!QCv4Cnp&E zSbtVDeTdYgP%)A3hu@?ztUP>@=SmtIbukNat=BYXhWCF}Bq;pS3#zVb7 zwt&dPdXt);;i-n*XwEj9q@)|E^ly4XOS#^U$C$Q!v5Wj?nefbb;H%u) zFs-wer%$NY=0j`U^&mVg$Mnh;Lvqn)<6llntO5n_(QLM58yjsIK$t_DGi3I|gopKE%o`*< zIMzWF3|z1AACgS>OYr7oG~0S`bZs-hvvzHB-S%;3aOfQew=a_ZXyOuU)jY(0&4szS zG&DVT$r>8>8S63IHSY;e<)upbRW+p*WE4(jiN8ip@DmK_cR%BCUcG1StYroXrv=^b z9$E?etEQk44ja|08U3bDkI7RQbVONRc2+0OiR5e9Cx>dEA=G8#WkxNJxlDA{qa5#> zrj*$OrnD7X15cdoLA*j`DZQ@#ZAvv+yp6bBVjdW@JN)jc;_!4OE1RiW4&!yugIn&0py=&Zta4hHh#kcv-b8QBZQ|JNN$#p4KTJNcy}I^hxnJa` zeZW@wK%yB%YSO*;$u?YKJAJ=c0eI1`S*IZ=5bqvzG+bQ<;#3NF#tAEVt#hvYpaSs~ zH3P~e4@bVrOg~wX!>$g3F1%L*f(!k z?pajrux48WxQ;YLkOO3(V^{>pC30y{5u#bIyNl#a44f#wa4T`V^=3vD&qsV9HSTCY zC3JWo5zxvXrVvW;sk%D}yIx`K-41_85agyisVH`PX`t3nKny9KlKb5neimT9KSt1Wk zAdA=9OLD2xSlw=mZ^~QbOi&2vGRuplwwRxiGko@VU4OXAVZ3stMJT84^6ht&I^oZZ z1I)x63JQyz^#D2#YSi_AG4Utr0}SfT{F%5%n?bbzBoyV;+h;MbODcdC0dRQP5D*d~ zbsdA!Kx)K%NE%R$^weV@q#smVxEr0|1z2e6Z~iIF0AC)nJ^`(wz}euK;RLY?A+ide zS1~DJ2=*oTP=eBA2kiX~VDI zjgT0Ifb9Vwq8$)V35@uE2)`h$3KR!@0HTf%;QtWmddkC4zL1C>fl8VtaD{_wPbI>D)r8Hf%@s<6oAJ!`?(U+F-j+{JYs zcb|~}G--br6<|5D!}LK5 z!#~#cM{MAVK{^bwOGpApi_kKF%m6%?ILR0o9W$(@7^Lry2l|H;3!V%q5~%JEw*V{w zGu>m*JE$ij0MZ0l72$MSI^mh1lb~ODwbzai)+1}Yz{MP*KZ4&v7Dmy+?%@@A|= zC-YZpf1mkBiO>j$%ygoXKSPE}>XAB1Fb%4#URHGnrWXALbbftpxA4hqKnUsKKnG~@AYOhB#Rq5Z;MtiawNVvx@r*UEoWz&se>?unQ(a*?+?iY>0!?TAdM0*FEqrmgl~wX2~W;1vURZ#k~z}# zE4>49%TeT@`c{ah-3Ql0&1k`>Fi)zQ4h(S1G2%0=WSJwK5b&OzEi zc8nJ=>XLjY80hb>413 zS2=xpVy$imlx&$o*h-z~MrZWUX6n=?%+pglB^i|8^%cxObxli>53Ck*qO$Wmxkoz( zTmbB6%TMqQPe=_)H$*@%BIcjlt3}zNgt=Gs9Q)O~>?TbL!M^o@Nw>}nc+zMF`h=u$ zq}{IqsrJNkqV(1B>1LRIGMS6UK~7Y+z-{U7H?BpO^`vi%zn_uf;EG_%>JnZV=wv(x zTJvSFPf2RM_{B^h3F9Q>F87u?u{+Rii7kCZAjn?h%3*^lD5`AA?uZc#*`rOmzRJLh zr4rT$=j8hE1a2L8)xB18Bp213mXog8Bos&pL2iKIy?B9giytVjF>WjgOaGrWcwXGrGiu+#o zI*oD?Iw6^yr^)tq_QQI3j}JDU8I``QcnoSu?~Ll?VNOf&zGbnKL}bXVG8^Wp{ye9> zkn-)yd;1y~W6N#I5;G9inaDRy0T$iE7SnOqBXe79U>xT_jxOwtDf3~9kuczw{g!=#g@3S{$WRH|h z#wjBlWs^NJGEUr)y*>!1qPpx+X7+X>r;LWmN;nRegc2DUB_sRud!0Vt-ye6!aqqi( zJzuZq>-l;<9?!=!lm1ZBn?^)MnPZKe>M@=;dRYr)vXSe8*MF~EDb1bmLm@eG46mLl zzhrUNl`AzjRW$2uxBVuk-D+b-qB}m(kAiRfH!a8O8#-!F7R)jkZJ*L3-4)_2NoIk^ z(}lb|4I+ig6_jp|b%z?h9F&eVY)D$MDSR37{u9?L4(B7nUG9#9DlWD}uU+fl3^(3B ziFX%~R5pRtp60mxkO3h!-XQ_fdg~yw#b|v$d#a)$wHI}mnA`FNEfn5n;iqj_p2)4$ zGXiSS(j^nTmypH2x+#cH6%YRO4hCBEX+QT4pD4{gm>g}!a47qvoF?@5TymO=e1nYR z^LYGX!%;_#!tR{x3N9t zL%CgviRYbcnVKeZzHoCR9Y!uUDOr2@R%rLC?vX0*3?eg@?W|_t$vt|gdduUmfxKy! zt`{*)c^LHFV!sthy4Yxh6f;RxnQud{$W_Q-O}}ZEOd2B4X-`ICV??J!wCxFK&4k{j`$K zjf-#k57y?;wU&Q=`C?^|j=MG`D6WC85cFnRo7K%8w1e+;B?9NFL&O4CUDOAZ3Y-299RxrLWBYq55SSVzr~sJUHo~|GirDNo$eAWmY3X!Tn<0I^=WZ zyxNjaozEp+D?VSia?*F4ZZq0os?U0jc8E0hmD6q2$eTzLWaYi~Xy61b!<0`2K5y`u zU5{9O*$vHjSzEgVT`77hn-igOYVP@5cP4ZDmIl7nuIGNHTGNn{l2%C8kfJ!?|5hUP z)$7MksWvz=5s4*i)T^_n;QTp@;y3&>7B~DjZ!58BEa4OU>)xcF|8fga{ig5sveT-) z$CVkgGYpkAr=l#rKbP_@X+Du!9iVq*b`3pk^JdX(!EsTT?TWoedX$}^H^W4chCXMK zMM_nLYo4KU?j*yA!PC#Z_Y9HU(!%zW5Q6sc*b6v9eT98J*KB1s&?ZEkkJs9ixm`5c z`+Kl4nBW*m4HTL3MBY`{RWw|Vbb@9_KWdj=t3g-M^M}^ouYI&_5x%d@$i&$N|8XMU zE#nDJU*r_W^qKZjOV~wgp--{rjn_YNSG=5}NkSzEUp`v3dC|n)Z=X9T*KgAE(U*!# zJ3*dB&GuT7|ANaIk6Y4yKDD`*kTq%{5f@$e&Ebo`nY~u&<%;NeOMX$ydWe!c(J*U) zez+NIk9S3p-99C(ll*E0*$sCB>_mY~F?TSrX*-dZwV{)K*Sn%zacL;wJwvogB~P$A z-IG#p=_tjbLG9f*+J6^~rG`PVX z#F-_TmNXiXV`47Zhu+1lC(ptsP=LM687j21@u+Y{xzqmU^QtMDAB&a0vdqH5YreEy ziLwCX!=$)`pOJ$fAN7yiBSZospq}1cp5*lyCl5Ottw}ATnnE^XB%vM_ZDesY6>|P# z0%Jh_9%;l*a>d(GCOmaF`2upYnmYediJdy=g*1-+K~h>{t`pCF zgA(i1udmpaIQ*d@h_lhzx9QX~z1hd;FKx&Q_ehOmKG-rt%-6&N**;VnekJ$uCG+33m@n3@Q0NpS!>U)W!C@(;GnPjGo=S*g3A<6`%ZHM=aHX z%>F`{8n2+(a&hkt6Lniw>@FT*MulyQWoyg4C_AvRz3YQZ^-ub!fgas?kXCq@#~l#8 ztR2u;lRT!F)vKDq8H-CU|CKV8vFz~StDL$358Si0_wU&YK>FY$X%niov!1bJ!+M`m zWmQYm`a#M!Am;V$SM4TF+Rt%ZNzdoxCCz5Ql_#Va0Ss$qy+GTLXLtF<-FtS)V>tIV zmI0o+%hqF8WCUAfFU*gLb_hl7kv5NDoojY$Sce66u7|1d9QbUOYhyMk{W18jm-x|A z7$YSUhTOQWvZ8;XuofSu-Op{V8P4!mC*FmHp~FhfFeiRB_ZOX;iwWf~8Xt)ka#yn& zOW&L9=~mFiRV7R;9bNAG+;rP+;k)CKg?I$z_}8;MW7q#Y+WUBwB|qI!q+<}O$EJTj zS6u4Lc1!X0OC#y5HG@wyi#cYh->T*Ev7b7)7qC@*y^ITM*qP>aKu_@0yoE1qr(Wmf zHU0X$nZb-NT79gs#;f(9CO?#>^Js);zvp++506_k5#0012t_8UK1XzSuya!7L4@v` z{gR63+7DzTrLSl5mVz*d`=LVeq_vJSl~*iUe(`m2nc9QL*jTC0nQ}CTgDT3cJ|gL3 z{E6(OrfNP4asEW2VuF)Al`X=qEm5{fv1(G4GvRqS6C+C&UKt^TF4T~?ptPUzw!W9y zS;{m0)ECkdJ!5{a+_y&k#hcdTM9oidCIBv3)|GWt@>TQ4#c^JD+p#dX3xnK3u1c4? z!TZ2DP*L+pF|Q%~*@f+ku-u8q{ixN|Zdp;m(T#2&mZJXHlX4;7_ed^xGkkxktYW8b zQr;&iF?VN#BHb^+U!o|LfU9MUoPPoILq!Z~Q3upk>J|H=S+~x{yZ!Uz=;FvPKp|(W zE}XGA%KaBw`{<-cUsBnL7Ae~>9Wc7g--Au|6BQgozD3fX^*x6HMGERK7YQ%j+*mkX z5J7)i@?n|=bF$`#)A&p4aKzxXx2MmQA`gG87`wu9iS^$V+T-PBuG(w22yT8T+}XYv zY2{d~l#+b%BL)-P)~+iIxa|1ap=g?i9DbYyn95qM1LLxeh4SDDYueSoS6a!>?!Hwi zcq|WXm$crIl_(QI>xxm5YUFoQ1eQAPvy>?tfW!C+M+>1v05-QfUCS=6*9li1F`nU9 z%LCvR8y#Ume>-F{pZ8|3t-xW9Y6|e8RbGfHdN++{p0hJJ?>3Df9a7} zagqnZVfhmdKDKG{ZDP|C)e{q ztTVO?p6BCv9l~9;7%a-WS(&t?3Q^K5NBt?PQ-nxjqVIhxVpD#-ym*HBWOq~Ni6%qT z+UbUoV#aP=$p(xkemhY{qVdiw&idiRw4Zj{%@6jY9!gKiEi&i ztd?y^eXzpJ{4ud123ZjS(em?+tNU3_D-3G4qti0G>3Ro@%bf5VY_rcDf=U?^R zB(zPxlr}(R5072y!XqaN?dfwSCQW5aq&5iU7R0aeSL)tD;kc5+4!t*N;n6d@#E2@b zd)D?;8yU0DP)3$v5FT`gl9V!B~p=I@f^2_#*C3v1C zy8iZFI?$2)2OU_YDx8Q5WeVWlV+hqeJ!gGE;isxN)(qb@QdF9i7F@UvW1lL%hH)KB zVKF#;vKI6wslB#}eK7Rtg2i48KDwOIHFUGC712@%Kv$jrk+1zwfUCLD|e%mKs7!%d7A?m23Au}5SDH$P-Z@D@LyW&0h;T4z3>_yw4;l!d` zZ_(O^b5T})=SZrFZjZh%JKQw6>@tDef19$Z-1`CftFrf$zyjlnPCbj6vbTW7=}^~5 z>-WDG;nxmObqEKGzY**cQgzENfs}vY^reBb=ACdLLjRhl>Cuu?*u$1rG;NXxG6CxG zLZ|n!*Q6mP)<~!e;`pRF%j(Vb&5Knnw)4&B!={5}e52N4An3=al?7(z9=ipojgo~# zlrv&oN2Z!;=9GcjB4*ik|0K5u|9s`Xhi7&7+DstxT*Ozb<`nl@MKYo#x=psj!)w_t z^=_j4PjE_-oOZf*hOYs(Rn=XTLy0YCEEZ#q!SEw-BBNHLR&xTKyjVY|<)Hfa_}LHi zhM)=3O<1cp@q|C0@X|z1?1fLWcCv9xS8*QHpdVWg73eawo&83nJ8;S2H+6TCRkCB+ zs;OF~&_4_}dl2Oj_w@F9-FLa$GSR5I4#mINhQh}s6Q155Y!6?j zHI5~jp@Yx95VUvh5L8`qHg#s$I~m<(`6XCIFtcRuhMW1uQm#{#oF-rEecTY@bnR4;vFcUCSI?SrMcg{yzGn1rMEs#G?wN7s zx_q}FM4u^E>Ju?%f=e-aCA98`EX^HK>Pw7^EydH2TBN|Y^9qDb5SQ|**=i}Db%$Mb zSTU6eq~@6iG=tN!TvMfOa@tU0w2$XC_Y9#axb+U!OL=ZmVSgYU9WxN5{k=A-geH&2 zer}Ffo{x<&!G`Oyp3gv5A4m>6m^4+;i>h`Rdv}D~q&8RTC}~CfRhk3|M8uvs^dZYF zxd{74&8q37b>ic(a@Dgf5Yc1v+oOFkvzt-2FBTcwuID+ba|!%|V`;uKHQps;)Rkw9 z77PEJ{|r5nbw_+#RlqveWhIg2j_s>q>IV+d_n&3=1`eRMG^pLkY6qOB!OqSg37qLj zRZYES*xpFOoPm|;fO!Ye>ICz+80kuZ^rPlyzt=eT_(_{z+IraQDd(K_7^K<2+A4F) zy0~4$;=J;yKL6`%ga)YV$2&huOVP%XYG2+RO2>9;gH*h{hQx`iI>+~ChO?tpYg}Ag zezvuVob3}nBILD-{wjCYbX7T1SX?u&?dq$Eu--^pb=;o4-X^)CaMc=}#IuLXn>2`5 zw^1lJ&d)kXvi3|Dd-wWjek^?v`rP=1c`3lSk5@CvYkK}`z!&k@`Kja&HImJl$L}uH zygU#>Kc|oT`0}!IK?i}?P&kC*(Z2ZYkqz9-5=O?uOqKoDIPqpvW87`|W?@H|qR};O4sE7`NB^4d)@Xq94-h=j}+g?I$0rN^nP ztuMmNy0w?Ee6R-$OgBp&eYn;UV;wBdd|RVB3@ZnFmh@mEt6NrIe<<=7sw%{c!Q)k)UgS2$GQ~%v-`)YniWlCPo!w8%q3GC+nu5z3i-aYWGU9C zJ?-kcmSH?9i?rorQ9xgJq(~V z3XLV8u0Tg{ke6U{wZPJFm#-q|(18eQp?HWRKhhimSU`$PIpk#=&1>8Mgqs`A?@$Jg zj=jGMBh$+Pz;O(IDIur@@en8uP|^dPdy+ttUoqFzcK%;VI+Ob6mAfve($CLmf0fNYILG7Yy3K7Q2d2RLeu$bx*`$0`!E}X^b~c$F^bW; zJSu~_>d=-dPcOV#Sb2~me^hrp-QGr*KL70QRBT{!utQXhg3Y!_4x{$Q$LiL*OPkdw>cMDl zz8qVnTdYQg&i4$?URC8^w=|eR%4l~~kV=J5o%quOFGM9Gs|n?H(iHt(3N#=v9ECpI zrwUBakcuDZYtA3cE5 zi{A{op}KOu(~NLiR}R->9i;!Dp|c!dj&TP#1y>Fd^Qibd#SYTf?0koPlYj#o#04&2~@Dt!f`iqhF01AOrEKBb6vgF~oCKdJk(B3ADHmyFZ$;GK z>20MA_wMttC^6`jVDZUYHz9VZMO@LddzaO< zbxQ?mT*ue+n9Ldf;1<{Cq~^9WpP!{!j@f)p`>5?vK&R7*&m z-qQki&t1$P&T_FjGb^axejRkDc|KBsI+2|o0Hl+1^`4GLj8rV})jH~9K6k%~d%smz z10T+bZI%sA1S_2E@s8mOGG0Y?DP=`E#IPba0I~pk{O1Xd;bf7~k__0giH7MJW8sS2 zF*+kj@Otu;Cj-G`c}-(d>ah(0CJQ6m5*7hCw&bM&2Go579atv)B;Cf0UTON+PA{orAE zoKTZTcO~W$!J+DX=fh;NEhf9Cr#G3g%bT?ZgE=Rp^Ak55MzfM)-uthlt^uL97b7Kc z?l)@UuBx8bmgR&5b9kye1ottG{H)!&crOm;JMjRd}_J%o|GQ@R+3~p#X^GVM!UC%W5n(V)j3)@z8`8wk&&z?zomr{f)KWVKHPMo5; z=}S<>oo%#q$n%6#VM>y)fgOWBxhom8mJuawp(eAcI9Y)*pD@K)6`a?v`=<;hTQsEj z%7r{L_ay7SZLzBu5cb?}{WF#O^PA0Y_C;xj?k8?L+{;GN6o4f0pV|z>eY`-r&dmT- zZ7l}K2;9gHy!02jsPivuDG6BuNLQDFUsBij|7}I8(y=gc2ZjJ;RL3+2pxcK664roH z!epd2B-{mHdt$Qwv9U1V%*)SUE zV&i{iUHdSu>qbGOF0-KE(IJpdOnvzxNHq*$SS@P7n_2_GKesi+SFJT|U)4;wwV zy1Rx9fe0r0ZgAAleL=$Ood z0Ve1=Ht?m*iqm{q8?qhPm)(l<^9$*7t_)dvIhG z-6^Y(FMatJcn7IJU^}jqx5qpqOQ;J7y(g11`@ooPhC4$PNALn536D;1F!8(LnR`Mg zJ9~frQAl)dO}~3Y+Si-kGWzc&I}~K|wBb!vT!b@{TS_nAGVm009@kKm*8c@-Jc6?v zwbWe>&R8Pm-TEAykvq~HnlP>_PG$RhjAf5KV*U1el`h6W9!iLGvkoS%2UI$?YLT}` znoY7WZ(51pA1)Q>Gj)!A*4u{*I^CY9Y4*>#O3xl$qh&@)b*|7{Q>~u6?qukf(U*bI zv~mhe3Hg4n+eHh9ruOJLRXybpc%2Rk;Uw(jFgodJG+ia`+>bqRF5bE_n~vvSXv_A{ z)a+ihpCG=ODjr0I9(*$)1Pd%Q=qzcA_}pe`Sas%H!|SPU&t9uA9gU{Y{>c`fNLjTO zxUQ8Y*iT>ggu3(1rG@-p2M^cWKJR{4P)tCM2f>y=cIhBQ1#0+!O++r0qGWwb))62- zFG~Rfo4qA- zE5Le+920Q+o;)Ua(T~#{sJ$e})vqTmXqM#5`4O&bX*=8M=tP$+7ZVOQ3>T*MH&%61 z2MUDosp=-0ZbM^Vi}*jnAD40vW8j$cDNeRrbxpYC2$Qf`QO@!URUF$>83n&XDrLgG zgwz*^&xYuIPq*wloSGW-Y_k;&7tD%x?m*d41x`1H-t+LuQc&m^L{%KFUbf(}+Lnt| zb7`17(Y--<=^sLIcq_<2T4a`(iGE6Ji3BIKeyqMe)YT?Qi~T^7nVA1>B>5JHq(#%O z8J9XVx2s+kKGB7?9+gVq<+vItsu3>S z5jZq}ARc=na*3~ygBCBO#Y>Lo$Y$l9Coefb?JA5vZ$Q$W_(4}ua7RxTDR8P12a38> zC8S!%X+M=7Etakf&#qDGt8>q33+hzyRDxpRp9n?*M>nD~otAWGh2maj7 zn;jJLN*FDe89^&vYz>ynuqLij25SUsNw2GCR(G7SIbuEo_0bP#=hFF>pN8$}wX=doBh|H#eHz*E5m+Ob2{nK!)K3?CBv2 zEQs=7#|wjy1|7?A%?|cJ@T4b8dS$X#L z(p<=h89WJ#B99uz`R%q!!5(-3Xh>M9b2ElJ<`hR9F&r3LaOjH#*VJOT76mv^ z?s0cDM*;VWeCTr9As)fOY&!n3^h6NIlc|WA$B}9F!O%~$W29uJ`!bnnH zkVO)g)U#}OvTr`UnGLvqGNp>lTLy8=!&F9uCfJ`{x-qQXSV-X~AZdc^t-=z3$707^Ar_Dc)dVw( zqRe3_-dYSa{~L`=D8?GluL`pup)7ID(GD#@*Z?A=Ym!PoP2372m3|`V!Tr$~#Pg?A zbJLzOV5?LVkbqMh6ao5tiS_s)9A?}SNo=@V%j$6H`NiBcdkm3xG>w_x3I?d3a>1Zc zvE>mMTQIZG`bLOzGrGd3ev!}Ke-BT9dr7Ie=`{_;Cxd+H;lfB7F}=v)v}F_UZty!P z4v@){KUKY36%-y(L=P*NqQ+8?1~bINaVIgPh*DIwG`yJ$A~cqY5;3QKl@qRkp2ZWl zqN_0;dlu~zSs0}rZBpVsgN!__W~N`qsxC$mHMLpkMzf{@_f!2LY46rvVQ=wTs8d1r zj@-}fcyOx*&pm0pYMTrJF$MGTiNOoO}>8GAPw9*kEQ{|3YdqR?r9Nb-}ruly5GB59lJ_e+j6_$q=9CXw?Q0U9PZyq$H-GN`SnG<3ZRA z@acF6daPO*Rz|T6f_2aaS$$!wW$6qsUyIG6Qs-LH#sNMq?6b z^f@ZmhA3&Li?-k$M!pJh;;8vlq0Au>U6IwT3VApsg2qh9LB|Y^;mF@APJ-yJFiS3j zg%(!60=!6wd13H+5kwTkcUTP(S?(?w&`NOgGX(PUf)Tr6Ea+nV z{`5@y4`%;1eE#$K0s=~V|NZkuQTr_Um+qhL5y;)4`W_zSM^appm+$ywtlIsun3%AG zMVQSO(Ru&D$Nkfl8%1=V#tq~Lc1I|m#cafcK=WaQX;2%L7Y^9YOAVm)!iSWPcX-LxW;>6*S&wnRG9eMhyHn-gtlkRL*7b+EG>h!gUn?GooM z;U%mnzq+=Kj(TGi9iUm%NNwXqf5{(_#WeK2#dl&zS~t0s0$`vV6$93qF3`KEkC5dD z1Lh;G7HllVd$hs`u;s?#&N%g`+W0JaE0zwZz;@5`p+uz;ba@MW>44oa{c2275R^~` z4~ob7J-_?s`B7X|{xj0Ue+?S?X#W6-b-(>{U*%S-u=1txF=(VBrL=GTf1c5dtDX4v z$vCJI7x@*-Wk|^hjFInJr@40}xJg;a8@U{90;jY_iqa_G?<#<5U92nUOV**Zh{J9p zZlJOJ$u&IzY%)0HTiGRIyIcW``e*!UqS!2<%Z?>!KQW4{m2g`X5k@{z=(}=8Ml(+P zCQvIC;nn_C$4WVan6rvXe~}1irZW%4BQ~&qzx^n#I?LWYEI07YZ8&33w;%M)f0bFT zqso@-DRDrAqJSyOEQ0pkLBwp#2=&0tI^~(A5urK8aHj^XC3Ic39csjfQb{Or&rwJo zL1iP73xLEC_~M7Sbtsl*jc1II>JX9+LlSuy_Ny+QbgpoxYi;@Jf3IShX4SXbqaECj z;_Fh@Z*oMUfD(!ZV)&hNX%GE${)UR@tMML&9s7o^of6{dj{hWkNJyEwR;O9MQ?O+_`loLtSFWE8w0A+7cOZHRiQ|%CY z7BAUPtsi9n0BVnDSFsPWk6K@{udOd=KVo9|rrafrBy;=E=xC{a_NPTP%NrYZ5hvJf z{!#v|f0bDB*ZZQS$(XpSh~8Rtz@!fw94Q3RXSirNO0dYme-u(EDJhI7pbGO{EKj#- zIO~DZrHVzCHIWWO42q{4E0U#mV!W5aHYJgQ1A^G%oh{P|e7KOi013xz)q62>l3LEU z5Q!Jp2BxTzv$1L2Tq!9OV|b-^SVjK;T}SdXR*_m1je8-BC_n3({{SkR6^k-tHx}{C zxsYc7|9%%Fwa`m zQ;XmF*2KBAK6|-L%8-sW2gx42sm~54fblDS;XmV&<2+`tfd$9j^n zW{9P6Hu;*~F|_06bK0hYDC1a_8-!8-^{bYVu`5?{f2N|sXg)%7kTzqlH8L=U>SmMW z4y%vARa@QV{<;gT!%2ywv-!pgIbm08I*#&YkkKHc6$Kf7B3;%o;D5_O{EZc~HU!N( zPAwt-0IqBNs#@oJki5PVygOBRwGMfPb(Sy)^`3hhSn@fFmWl%Rdca& zp-sGJe{Td87zBD#_9<}q`IKN99GfX51w&&!j%jHOVTLwh#Q`V1JR+_zpkt*Cu~`Ph z&UTFY;*@}TfN5Qh!qGs&iUw!vX}Zk^{WKrQ(OXm4Mf-pF_KW?&{HjXlAY;0y%N$h~ z)ooRXG6RoF))eJEiImiLCbzwU;C}7FK9xRce@YH6%&5sVbR`6V){#ba=BpLC+Mhdj z0+&wIe%ULg!n;OmcR{FgGbK{;nHWtK7KC#4$(q zo$3DomSVd8uMXxu)lBf%V+O=zzv{YqeZ%$3Cu%)a^Dr#%G*+=_-(9v7d zf7nfyp#K0-ANzy(Q;lFF7gdht;(d{Z5wE9ud|Et0HS-DG-n$i5P6&&^!z zWsNMtnrucufSmREnzpiAvBH!m+LY9}n;dOqOrb|A2jNbvS)jBEKtp)Dp&##2T0!Vb zC5!z^f4V=FDK(genu6x$J9x`Tz+$d3a&|&)%I7kku7BcNFX8;fXLx-70HsPl*#5Po zKZ7D={6ud9SvvYNq#H(XTl!XXG^mQJ@UoSijQ2k&BqDm$*BV^5@tIMwSDrgpQ>_&) zQx#3x<&75gr6w6$E!9t`t(xPne;!%1bW?YTvbS#YpaTDYrjC`2k(DBB363VNtn0RBl??#cIDO%X-y{=9HYB*}P-QtR`s9 zA(XXqoi<;?`HIf){{REGMDiYznY5TXrWNk5C?46GEKW9e^%03i*Gzr zCg_<+_NLy*sb?`_2gpb1O+~3#O{-kP(G{CeLI(;7KHOJLTH?MkX#67PlvgRJtTMDv znJkHZ;{62#)d=ME8D4AIOMeR$AB9@C)qc+c#<1jp$&S zwJhgri$s-%3ulkUx$4nSe^)n!M<-&1hNC^j+QjIgNI5@+Sk*3NwuKrX2`z)4r4pu< zMG#YNH!BETNvm?6EpAso97yw^gVe>d-$a?9a1wCf>f z8Oh7HQ&)v>)R#1yIwGvBEjqJh4ir>~gniNUq%~-gn`yT0?CcI$l4(D)ZAb8awZFHS z9?Bv8pKL$npX*j5jblKFFr%QUl}Sr-loHsDE#ZxWBw!KVp7ErE4xxbcq~zPU(n(lo zw}<|DujNkiV;}O(e}5`DpK;j=5eG#B@TXF4<3UP3l!h%RqyvR0sbEO7REUGHq^$`I z(@im;qJR>LU@a63D5L->MFSR=kP0cnkPliaL_kjhlQn3OGes~8C>T*d1r!V@#Q-Q2 zw18SD7*mBHBuXk6itK5*t&sssK*E-g2xy>TMF1@=0~88eXHo#g7^DF}pk%SpQ1=m4 z>A9_u1BERNVM~fYA*7)UDbxT`(iq`ONr1Sdpa$lYPy~rZLjtq)rV80?K=Dq+CIaG& nQW(=sriO(S>KFwmq`+_#>{PH96w^W&!e|Dl2^EDE4FUhz5Y6V6 literal 45034 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

X6?7CE{e~ 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

gj*$atXf!mvOSb7%%ch6rox0KmZ7sbSI;Oxqxh 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 literal 43935 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 Bupj^c diff --git a/apps/teatimer/TeatimerUp.jpg b/apps/teatimer/TeatimerUp.jpg index 3217988635d0b2f2c45c70d73dc3a1eff754c770..80b8c3c8abdd8bce55727722ab9bcf782a5f6b65 100644 GIT binary patch delta 2331 zcmV+$3FP+A?*f?}ka+-Mz0>DHqPP#`mW{&g1oX~nEyjo-oujc^tBCS_EAA?-fOn6~l2&86h7V2&6fKHd z4@n#C?;8c-0R(l%PZb+oNGFwke^8;;HTsd%`%|#gLGOM<1LbFCUBqO3y=jej>jcGc z%!#-*Fg}#|N>MB)o=A2B2lzXWeALx0#IVIBAQ1GTni(Z6BM_u@+>E}X6af<3uh|ye z`B0%xzA33}%Hg*r0nZ6dNTkNgZW)S+0NQIoKPp*cw@C{~_$=a1y~S3gU5{IM{IC#_$za{a zc{CeP(Yid2%Hsz#t{lYJ#T0}k6aa^%6wyeMmZZcepaPPCneT-!98=6Nr9e2OKY@$td20Ce-{4c zuF4EDGYyA-KQYEWl-X~v>j3L*``qp<$MDTrse6+53Q9r>N&pQM##t8c=}Y!!^sKqi zdnpU{XQS-T?MJjj_A(Rf&qvvx+K*_1*s?RHAvrOoew5>68A6p(e+NK&Q}(5MCMdKj zFfah^K(ruWU_hCQ`_z4u{{VWAXdc8vYk~KuquK|uFVR>Um9B46-IzMI0LdUx71GKW zgU0-sIO0aQAGe#Z^>e+?so&(%iz0BPZ_3Y9ZetrL8|R5{kTP+ zml>v!e^FPtXB1K(j`aTkqDl0mv;P2(NdBMJkFr0p^B}o)8iXnsfJYYj zE!1#n$!I!}NfTzNT$A?bKqnO_h;B0FoZMnUf5I`-6=u=0qy^+b0jpTve=5-nrFJxB7Q^cH9UBxjB)mqSSO`HDfdo;6k_UyK@%#^(KG$I1s< zSL!DE_bv)6GZH(5GC=6PNT$GsI29YH6#7^%?%0ZG8SdkhbWzPDFtm3v$a+6YtLRrg zf0hym8ad^1MjYf*qlm1sx#;+(ak*aPBGsc~u&GjW$mv#;1sDJir8e#omBr0LBqi<= zOz^ajqU^#*U7vD4UdN?6+T1{=oU?T_H>HN>?%1BAnlUV88l`ATc6TeuX)KBrQX&8kBo&cmlO|=9Kgi^!Sr-tPw`-h)OrxQt1Xatqy-e}LL4Zm0wYbUM1iQ~C1YkC zKqi_R+^45Ttgh@gHhP+E`Yci;h%ilE^*R%N(#5G}SYuXTPJJpX*Cx+$@w*g~GlX?a zb)0A|knI^GCaVMA4P8fKAgf4L${^~{l$`+}x-gULIJ?Z;{bt4hRLXl;&qDLhr` zPjYH}Leh$o1*Zy-94M&~5u`O}kt#XA)XDzo{#8h8a<-fPss8}prfPj7{A#+Jui}>q zD<}*B$E{bt7`4FY2&9OE_mL&1{Ch|As(hvy2=xKpOLvaHzhm|KZ zsc$T@hqycr)mK}c9P#*;<%^FuX!3gJnpcm^gJbn0pRFS_(zEJRSg#`+Q1Ci*sV%Kp zB=coCV@sMljEU*3QDr|&*|Jj9q BJIDY4 literal 47055 zcmbTecUTk48!)<|_ZoWd2~B!YKtMw8od`-3LzN~ds00v%(5n~`10-}11Qf)I6j4FC zh{#cpCfLDV?radx`F+p#$GsOHH~RFHos?nKZm%i&8^HK1OfqBf`8EO7qpg` zW5GcXWM>B{LJ-6Ru_7Rd4vfGD=WQ_W&zN--!3oh&XFyOPf{Qw42H%MYVTgWvK14={ z{2ezTP!KKkJh%&?PMyyMzIPxrsAD7;_tEhFnFF47CV1yr&+7hQ!{=a_VaT>WBmIISVpSs!#Y$?aYN~2M8fqHqyVW&zYv@X<>+M$4->s$%L9!{t z9hhixQ!e}+mu5)+3txu9_84IdLHQ8G2%bQvrlFyhPrCyvO+`N4-|^)F#P%En4J|+h z#Ig+)%|Ic|-}OfdY5$&|E~NWAo-d^TJ7>9&@n0AUng5KzVudV!=e#LQr#_1vf@nS! z=2Kw+_@<>REciQSDJ=Xu<|6IDudb#>Li|}1;EY7GgI~_uB-))Z>nMqSXH3gqy|XU> z19|6OcueyzY-HO1jOljZq*Wx-|2Z!V<}>_f4%2_e|Jfs%*(s~@7`yIF}JX^vUYKGbNBG{!UhB$3ObAn4vC398W(@;ctYyw zwDdC>nS{ck;*!#{W#@=h)nrOdZC!oC<@S!wD_6U^ul3&T>mL}rH*|k|VsdKw@ywIi z7YmComzGyn*IvE<@NskN)8{W=zrp(gT)MrjzdQRs_QehMMMFnNOUDTB3qcbP{?l^P z(Mzc_@R&F;`bF_dYa}xvO$#d9?l8+}I=|!dj~-*;m(_Y9_a5FFb!Y$YHkR`LYiEBq z_V2!CAvRjTdfc?!&|YYqt7bQg6AQ=G+m8~4ksr?HqHV1cS-kH=8BjKnH=Prl;*_%5 z7>vBfPaimi_3(@QFfo4C{~L>H?~9HE7M)!b0kQtso5j8fEFP@ssM}QwY#fum2+VE0 z4OBm*%1BYLhD>q88u(86R}4ZF_VHx(+snmqWXY<0dZEuGTCEPKxC3$`Le`qY5cD2H z%Yx!^GNwnep}@7?<2Cr8jj>x=8;(a74eQv~hWW+tZK4%uU4pU_4@cCRJz0`+z@F3A zk%8{DdgR9GOW~dMwGmu8Z`gwk(;v9H2d3jl{z2KJG~b+z8G^wRkd6p*975BI$RLF5 zfE?{0DI@UsbJfy#w((^=4*^1vXb6xs3aTojN2Y_>7zkMm!2m(dx=9o*4eLFlzDP$f zjh;fLaUNBx!n1(Mc#h3D5>2rqjf+^TekDSHs2iY_;wDq%=ASN7_L&Qtc7YR-vxnpE z^_N2rvYl4y*NFONLodP?C11LxRA!)=Y4E&SL3k+m_9y})$u?nCLlcxUH>$=^&Vln) zL7o`vJ^`s-@moZbNVNr zl386mKFd!(c}8rnaAa3>>br_<};cad0S);Dvft|1xP>;rGdeQq7J4gNd-P zqD~dd6ygAWU%Z61@#cVm=tuK69jCQ)Wo`y90A%1zgR^I9w6qLW-zF&Up}As7Q-SjL zub3P^u18`xqR%I(r9KndDt5c>Awl!wr4`H>UoV6tOK~j87K>)0VimoORW=lvMi>j3 zQqO@y!OiuP>{?8P1U6$QW3Ww{(tLnzC*$5f#6aT^?EB&i!XEC<#b|d4K5x%n(XVG2 z%1#OOt2X)&>?b1{@u_MgI551r=qXKo^-+nqr7bU=l)K2DgEuku>9!MXbo+li83{Qt z%^7W8G+iCcV4gT(iPO!+sWQsuja*2VEQu;KSBxkoa&{tfSOLXY&_u$qr@ zZu$!yR)`FWTpf$1Nj>+0S0FWDl$;M#feIuAB+1$r z83RNOmOCq|$c@rC>pt6SjpLSFvq)gu*D2nCN8^CF@e>%fWfMpp!FX4KHG~#q@To1Z zWtwIhd}ix%y;$O|+rxp}q=VV!i(-t{5h)dceIK7Cm4y7$6H}SQwtAxM&Vc3?srPhr zXP%~7Sb;H%aZTGGvh-zv=8xt)>wCH!Tz6sOi zMT%E6M>M^LLfA@}4h`>amqlq&#ezX<4Fd^M1{v3kMN4akC(o@4PLJSkt*Tr+xP~2G zjeYQ3Yjse&;33kHE*=$_>c6$_wRT8y#4&s@p{qx_x;rN>MPZO`^IOdRQxXc_wF<3d z%YPkp)6u@z8|>sIn6>6vA*t{XBYyFP2WQ5$#B-%O%gbx{?>By~M~LaAj~qK_;-Txm z(ye^8&D=N$T4-o8{}fc5R~*%EJ$fGJNq82%_n67xi3#jS(Kk*P-yYREQrC3Q_G^gc zD@E4xlvF6YXtq)*Q^h*kTW(R-X22mNA^1Jopa`qrKigU}WUM!m==?L2Nl3rC%(O`< zj4dl?5O3$UJ7q}9_&1~z)vvN8p)!o?&XvFOwODxIF~i}(t6LQIUJ33CwYE~-$}2*G z44t!E7ko5&_TO;95?z(|&q$_O4OotZIJA*oSv*%f{xCu^&6obMP(#q?#Hi$p*ia`; zJAshwt^VC4({X3ODnLDxYiP!SCYMSBN*vbcDoDs>e`QTFkCREh^S4o8idbR0gP^h& zRh{z}0v&W4C00jU@m>|vn>#2mefF-G#?3_CO}@r292dXF#fsH6<@z>UonVdSnB&Ao z&4tFu8`{V{)<1&Z@{S^S_ln4(+S-%vPkT-3dZ$<# z_y*O7@at@hteeFQ`4KDH67&1Q_#`*$*qpLYR1xEZc^@2nLon$24P8_0CdhQL^7Y(f zuoR{BRH@@HXAFyanj5m%ps3zGvHv$T*b)A!iqhm&^so7($z6e2iUL?_QFi+AnRl_D zWoA3-+a`A5$2ZWSnq@#A4+JNw{e}WZwW6`f4_6Fgeuf@4UbL4P%Lz5iS$Ri1nWhrx z%Xg+FdyXct*;`ljVxQaSt;MhH6ThLR&>A7`uFa~%5|^0boB2Ph90w)T`PwV1i+H&@UQNw%lawpovlU# zd*^?pH%M?h%`GcmR+Wy}{p;w|$xe~fLG7lg;ToxHChL~FxVDBZ&@_hkuXB!QgtF~l znmYf*vXO9EXksSY6Z31e-m2eka=4)9wdo+KA^aGt`0gkVzNpGuVWNe#@5tYMA3a-W zEUr>Ie^F!dQp~Wg-p^N;!tZ{aq6CK1SI%NT1`Ax9EE$QhiL8S6h9c3C91+HE*9p+e zt-W8qe5PBza>6jV_U7)uB*p2PL9?5*4xM}jBe1t)pd=AsJYwM}IVW0vVye3;X)xL7 z682F*RqgFy=V=SQqfK^+nHFmv>qwi!FPW}R5#v7j$z$r~j(D3bTF zd6@H;$>7X%iH_<)W+TdQ#v^^{ZhTZcZ`}N?kzymR+P0ZqBgR6n_Lt+&>$3vltg7mFs29wmV^ruih*9j)b+yX#D6ZBU5K) zOTZ&&rBMHel3oPr1m+|i?@3ARv4ElxTM~XdsPB^u-%eFXS^Hn$=om+ zZ8TsZ(JVlV{b%WlnM?`N_Pg4iX>`aw#UYIjTg}IWrm(WeA=X8B8%ejM#MGT)xMuQMM9U$%;e>@;UEsqX zpMP~;t$bh0m9X;7y+lXxAaj5-fJ^IDWawG9yHYY=&U~yt)6110mYo!5kQAGwI5d@i z(mgsU-c%LeMomFs~5*bL^ z6l;|67Ai@Se*}D6)C+ z{>sLs?+V}CFTK#c^=5bx6X+}6>ELEMO<;7si(KrQ(DX|#bvv$p=kP;fVCH;9b?US__4D?k}u1rYtEt49|gS6jakQ9iCC>3NRN_fsHY=#XS?r;;iu)xYr-GW-?%m1 zAd@;n*@ISxay(PHJ#Uzy9nB~7PpwGS^Yr62DHetM`-)hyWK3%8r>SOI> zcT_tlM_8uxttmV2za*mg2otRZ3fa%bf^5Ak#Lxi7@-bsY0LqFa%z*L*W^ zOr`gTV-*=+l}xqyG-KmDlx+e4M+;vF52=P!H45lk}cNEp}Hb_^1z6aMEQVGRKV zpVL&cPFXaFrHn18KU)!`w+s12yZ?L5U<@WO5IMxP8*j0X$i=3Hb{8DvtN2XUO)I-g z0z1CDxNK}s#d4nhH$o#)@?5u!{%ySwmk_;p?^Ht>{Bd+HsP@s9JOjjLW&z~y{veD9J*xTRQ(m;bzJ z!eMQ)c&h2o{EC0lc0KWqR%~$z{G_g7ccUi?t5D?iAe!!*8@oBJ>>OK)x|w*j>CBy% z_c+uEw|iHH?X@uGR9sb}>80?;LtAc*TVcg6VJQ@Mjs~!B(A9uRSybFZvl>2o7kwn-Vh^ zqMsIHD@wmealX;{k>XDGPJKeV+^4LFe|oO(_EjhM@5`AH?3oxTstwzg&%!?j9QNS^ zsXiWv?k}K47(2DJtS~a%$NtA=|55YQD3e~i7=e8?XD1nuZ`{v6T6WP8TJt!m?Djy* z6(APc)b`kDT$^rCy=xq{s3n5>=CUHls@IS1uzh!|x=hv6jVal}WW1D=FQY`b^eIrG zR^f)$hO@xN(3-`QMX@v^UruSGWZd`N5sZv9xj{-rh~#7&XDQS$EsNnQG%U6XyB?0m zNep4)DaCBG_KW-kQx=pUcR}iSK8o(SBa<4vAY%(U8=|G`&QGmDZIS5u=|*YdDZ{k1 zspeoG$q1op@k!`LJxZ)Mcaw=-h(tHotOCiw=6y$Xp;3ra#l?^#4m^wpm^P4caYR@H zREgx>Cko3}PZwl3k0J;#R)AfrZibU27+~TM!Qd2#{Gp@N3ly?iH4-Xzf#7gW4J;&O z)ImFf5+pgzrS7FilGii8b>tV$r5;PG|6BoHY^Ik zj)YIgfek90!U-!mM9R<=?w)8q#M3R4&tKon;Q1P3B{iG>4ktJmCLeNZ*0BxRY_KHb z=XMF!oX4{pInA7iVK@YRu=CoB?ziDJT_%{NG2pq%9ocDNGsC=$mnk*Q>Z+i3`5v^g z$rsEHU7OXXDY#T%qVLF9UwhvteRe*xrP|H+{*w^~b*$IR$swLm(k7|gwGd;FqNRL{ z&+m@0p$8XR^k4H>I-J-LJA_X#%jP;E@ZI21*O*Tl;@yQIZ9U$5}D1!MP zgfrXZe2sw^3h@E}FTniE(ehJ`Am9z+-PBDjsVb~B8-_|_ydhg17P`hc;)=VpJ;@R&(nYrgieG{+&S`;Ww=GV)sO*FE|=ICNAKW>~@oudL~HWedQ_Y#F`GFy&;Omiu&HFRyFy^U5D5?ZlCf` zaJ34Mq?Mh{GJWkgF!X7~P%&rWxLsSfeEpsh?pO-v;DKn!Nuwoe|PlWtq=!i{o3h3n8#rQ@kiQH;k1=4U{@GdP&|xUppp>qWjJF2 zi!7ccH2#|-zO*ov8%Oe^^0|tfBnukvJibk`KlA_w3nn6L!HVO-{l3WTC}XZ6`I!gq zu`xQI^z~)<$WE36w?xRY6-nQILq8K{-aY=2aL@2nZQIx`{FB$_O0>m$+{EneqiD0Y zw4>&5^=uWfnY=5(z>Q|mW`trJO0!2H!L{iWMv4;tK??srQM9SV;arPK6CgoU4#|x48%EkojZdanqH3G z=8M;(T$%}a3oADjpDv+AKh;%u_a{7euT39N zDVM;;%*-D|w6d%C$1sn&>Z)g&3q}#@ZdhX++WWabYM9S&30@z1$-ULAi!#4v*lzQw zb`U~f@ccpNxnI-q&e!U!UJsYR>IemMa0`qg9GbFw^IjaGKrxTi1xki~y$2LZdm3gD zmgEA$H1o|}PF`HJZB5~k%VDttik025zoc_hqUsiBenZx;5Z`Za${>N){=;JL$rDfS z(Y`51c*LfCd>*`iuljT0dfe#_Ob$k8MrSOWWm)LVtYd;pUT>&FKuhXRSFc~IO+WoL zK0}Bf64O;MvCh~yC_ayxOiBxB_sb1_5Y?vZe59U_K;#@#!TQN+;b0#mQP zS9KSLElX8?n4MIznW;gw-&uufPi7PK@jNr8@!#U>Dt^+I2jCWEw|y#1P1TNH^b~y*1te-3R%epi%IOxY z{%D(lDD4;!Sd#vlY}gaY->ShE63k83Fp~VR0p8Y(P(Rh4!&>eyWn%%^fv2ARaa)Dn zMsphC5M4qe=;uq<2tt-GJALgoNJr;F9quapZ`J)q6ZuuxO3UyK*_y-ctu z597y%Gktn*9LJ|}Hjj(4J+@3B#>{m`=xTM>%Ql}%8VwvgkW|nTj5<}WrD{mFGZuiJzEXSiha87 z^FBR#kNC<6w(Geu_TPjtt49fHS({aDYJM1+|G^y<V7 zK89bVPbI63SgY^pWg)sR+8kpv%$8zi>q6eYopG?=v{(?HYxF;V zBtRyorZelrKtp2jmdGv9vFizh^9cIIpyBj{3MJJ&LCS)u{oZlHak>i&^Lu@&r7w61 zwNhM$zBw{#o|L(s93Q|}Uv;RNEL&(v(^)Z)lUS3(SAcNU*1P^Bozbl!cM0>#N$t2z zS7fM>Mf^Ed-VX6lm%v!HR{pj(>x9T+whv00I+%o~%}k<&QEoEr(NARPa<{CW(8TGS z%@|E!6IPN@Z;ERP;V+2iCgSQcm+J<#Dne*K>Y!&XD?J>J;L$m7v-7}g-@xmC{4&`D15aTa{dfFFxVG&3mszf{vK2wPjhkBVZ28`ZrU;Co66^lerZianp+Aj)C|~8UKPA*Tj8KpXx?If z{84jYMU~)~a#VW*-Xeh%;aN@q0jusK+4$-aZFjLD6>_jDkHI?!=}To?y3c-w$Zl-N z?-hg+oF{pZGz?Z7n#Q7=?}PmJ(@8jCiPm9PPsA?3bXoPOx-5xqs?3d=#hVG#-3m~^ zn=}P=inOO<@2rNLJDf;QTVYslF!;ziPObN$Yl$!L zGV6{YFLw||akf`YtPOgP3pJqH0<%A|-%Z9Q8ZU||!LxxAAoahfhgAtR0N6o2Tr2{5 z9}Z?hNvb#6#nc@*Vibt24?0 zfz*z4UHcIydwyBbe06LLzuuE?zAkp>)(HA3FFt8nJYh0m(Lep*l@5uqQzcO9GW+|I zjgYc-(anae)_(pFMp@1<=bt$t-RVZGQM?R-3r$6i&t^`)1`(}jG^eS$F<)S(m1e=P z1Dn6BA_=kxso#@*RK=3n#+a>yt{}}&( z&I&CjXA;zlZ2huXn1&(2YSHCn#t=XbRWuu#X$5&(-CUnU2Pi=BjxlBcS_g!g{y-nC z*-(SkGWaV2f^`wHjI7o#SR>gl58wTFB0=4l0X2Yw`US}}{@E^wC@TV_4qWYiL6RT! zT0eLw5(+^2<6FxpgIZ7-SW6ymPeAocvN;D311yV>{slRyNQ5zKF0Nl{M%`G{5uz7d zNS;wQ*Q7r^r_S>=^j0I#G2G!>l@{w>SI~>c4% zFMOZkQBPlkTdw4EwCrJ+M?EFP^QAqtx>7Re%W89VHY+VPTqFuJcwYo<3hoRiKgHZF z_9>>`3BX88J<_RqUzMMx_&f?gR~)Y8t-tR`r-+?^*y*P>m$S~G!m1C$=MHy@oUH4L zPMBX`9M9pT;{-2W$y|L%2|R-wxW^%4_k=CdB7FJm5oAk%?^E-6uwN0} zlYVf$67>`_=sTzdL)|ZO3`X`xW83krulxKq!P*>7al&@R-Y2Ryw7@Q+v$ml-B!U7H z9+014`r(H#WsM`Pf6z%B73eKE*MdV1mJ|5dBp6^CoVY!wG!0Tc|}R=jN$`&D``6_Yu9j#HpI6 zn(Mp$;Rl{+Q39r9EsZUG8}EufbN02xSqrtVm=CKTKEjW@Ie9!5pz@Fi+WQ1RYs!WG z`{JI}4=9mKG{whb-xxWaxMpz88wN=pM*I@NCj~s}xc~MulmQm=innpe)GtC0P@&`0 z>J+&oa7YC47A6Xd4*157cSbH}W&N2LhU{Uazyv{tA;F`4t9`2$m)KKsQpdr{;o`;A zv*Fam;#g={z*AdYWF5J?Dh)Ay^FFBD+yGTa0RCDGBdP~|;+p;$fI+PaAD9dYPD|8H z4pT89@BnbZ;*x+b83mK2mBsGnq<0(u4G4nWHVbZZD2_Y}xR1&}so|=#fPbpTi*PWp z!IwRM1W6j-dL9Qv3W0>#U=Zo+$S;5_BgN7Dku!uZ5P4SCWFUIXK%za>Q2pSPDpe5S zR7W*ccLSXPOFgXRfnVeIWyb|offPVS2+Y|D-QZ8Kz#kJqHPPSz^jwYAXLjwbbE@bl zN6Rj9Kf*6+Ta5rcw_Ozkwfb$}7N{1C8n85I9M_J=1z!Tnb36BzO10v)@Uq*wmg?jF zJz%K;<6p0L2T~YxVC1O>YVu%P3G-~P_UDrJueF-fL-iOFDUjy*o3z<^IQ8ZMDkR8a zxWi!Eh1iCSdXehg`O1mHr@%bo{|&zXoZF7L{)Owmqkm&I>RL1t``-|8wxu8+N(~LR zr^2B#ym4EqF9Y(2pxLS8e}V-#9H%Bs;2YRbHUA0EsY^Jsz&3|G4AP657<{DGAIJgt z=cpZIz)>pFf_SZn$}}&Xh{}ipV=a)}+uq(EsvsRf3CQH{7by7BXNPejuR_)TfND(7 zfEV_3ju5K#^VW6ha`Nqps6NV%&~@q|#vvw!_X%T*MaO)BL$TvF!y`I4dZAJlfez08 zKgkWV2m*9Y2{c%q&-qA?_}b9wU9eyJ0x_K+M)f~PL?}RwPbkJUzeVwuq-!-rJ{<(K zrpM}tCgpAz=C&Gpz3PXb8q zO970LU-y+c7;^5jS>eR$o4#1#SWZ?`fX43cDJ?2tD4xdf$#$8AiQl?kll$7GWKZHI=u^ z76|-QYY}x;bnA0tBu~LH+a3#TEr+h4*217>)w$AN>$ma*@u`XmKY}-?7`Dg z7&D>@(-+3#o8>>}7I2r2ZWahL}{hntfvoNUf^l=t@;lDtuT7=Mh9`P`>+ z1o3sYTfxKmDk1XX#qp}b1>^2TqlFGfGkrF~+N?2?=r^|lB`#Dkk8r+_=oa~-C|hd3 zjb+F1s>L_u;|9-N1{G4h6)g6#yeOM{urbh~)&9M3ukdQ!jb54VXu^ut4j*dT5dW7k zQN!x#IBNSN1`^ugS8GU7|7n;?ZkJw7DS2o$<{w;q%p?7NL&vs3?3>PPU5S_9oipzF z4WPYQKKf{+w#GJR32BBk&rQ1J6hxLhXox0FG!~p^z>%1i^Uc%FCwpD?Ua}evx7XDy zLYLnkG`QHT<2qyfY51s$minO_k*u2LJKiNXWfGE@oV@s5C%;@7`rHy{FJV;G6Zsor z9`=ZS=*Xj)>T;a!DBYAkvzbBaoUj4W`)=zCese+h8x60oI*q#XT^Q@&)|T_dfm{zr z-4#2+tv%FOml_RIomHxP8v3Dj&6L3oV}+Op4TWNLf)|2uu#kctvs>22fzO_{&s*NH z=TO|+E*jf%&%rE4?-iMd%>y1Lyg#&o;IGGjIfE5(_W z`nChdrzQ2Zz6tUjRX$mCDWOuV=UV+basGUVExF}^+HB74Vw#2!Tw~Nk)q6MQ1A#+c z%+;XlXyD{}B+LD)eZdYdSd^siCtTFYKB+{{u(sebdR6<0#dH0Y_hK|=$W{%~AI5{aq=f6@kM>>NRtsQMG2L}@H7vXIsOD}sd>SnRZox<_S zd^uJ0wguA!RSlqekhBA5pS#9WHr<72 zP1;?GrcJdPG^w!^(UuDuGnsC5P%|~D<%^T=OL6|7m>V53t!~y4u%8uU*$cL;1(jqr zvCS>EHrJg9a?=qZqkl`Y&#D?Jy_^I*F&u^QD z-j%n_y(%g>NNTtmPlFbU@#gY~+x_&iNVx8KNjL3dY);yTeH~1dGOka~MiHXT>hK&> z2D6^ZdTj1SmwxqJlJBg3e{OOnD7))IddzSHi`z}<`X5r5KraWEh2gv#ezo5=Z?9-S zws@{~u`g^mY6%~c5_0RQLkzL3ceTY=x6FWe71?vvsDr}Fp&@=bC6ZIyS6oR*Nmy#q z73OM_n(cgH#~BKwb#!<)9w{Q)&)KX*X!Fti@r~Gad?Y91(}qeSeFj?lrmt51 zFgxV&0*zbwC2x(4MDR@zk6p};y~#yxVmBj!ii>>A*{hUYa)S35Iy*8Ap8C)9A9c$i zoh#AzIm;dxs;Q+RKamo;Tk(Tp^=0&|53kX*zx7t5F7Mk&M(fqc&)LNtB5WhFD->+u z%Uz?B*22YPaClE)cbDl~_W)_Dnj6c`>?Of7KP z@2!+#(sW3S-8C!Z3D!$L^EdQN`;7Da;I5cGZ=#u93K8|MTb}qmoyu7Ec_S>^VBGUm zA%<kx``n3ySJdHL93PL!MWaRu#$C0Aa~AP!deTTnv4^>uD?&oN>dI>Kdp;oG=1ZL8m-i)#Hs3Z1 zO}b$d`WupnOw>+rc%d)TJ=y^5qc5891?aTCP)z!Y;+csfp@8ZL}D9;eGp5M$?%QXq+M=lGp z(c}5udSYw6Yyr)|ZK(KSlUgBR*?~y3p*5Cg=6+z;V91n9d7kxhL(?$nO(v=-3+5bZ z|0ap1NC@O8ww+B7Cji$7_?gJZ-+^hM2~o5J)!{$x6D(T&K=DW^3G|)x-TRtzX}{wy zX^qBrC9x-xf_3&Fe3Xv%yDKb;?K*9(MC*hS!}02i+-BeSx~1JsD)=ORBlOy>cVmw% z7PLY+`y|#YKM!s-fzC={t>$;#qij&?#Pzz30KVvh?M4ZKZYmbBwvG1~ zYS{JZS_*7=Xw_t+JT|0)tK5HW1v`&pEwPjah2 z!8tDT0bhNC@;#?C(yZD_xyP;!^B?3$Gt8Z*#7UD5_oG5l{0(y^%T@(Wj6phQo|;O_ zCZ~k-qxZCts`6o+lIWUzyd^qz8AgYONC=hqoE}qOzLw|oV?BcKkC5vxE^-9-&6522 zK^66fd4unT_xt@S;1=8GLH@;CxR-lU;hA>=3&E2vr%-7mt9_4f*ZQ&3#tStRh4?5^ z6`7_@`^3rG)y_`N?2($gu_nLr=gIER|1y)uO`lJFoY)5+I4QAUAH|Dt4oAYfyZK@^ zs;7%zh3NGe-7mRNXVLn4BY6D6OWUae>**v#bD8D{FZ~kR(~H_}Q=MY+-mfvy=YjV? zb?>*i3IvZJDG2*e)HIl;MGqV88` zy2PRu;K(K!9`9BtLZLa9+qA7kojAd*5~gTl^8L7Ali|svBtfx|$hZISxxG18?sv0f z6xYC>639V+B=d_^Ri~EDH2-z=7y-kam>0h^)_27|@bL92e*V~wqF*?wd9=CB#-_+5 zz3yS@p|i~~fjsL4(-k5w-^foY&->VLZy=oYUXNw|4jWN3T zPw$hh=xw(8Eb()~yYRsKTl-3`2^Jo3n18)r*zQ_~-(bjkvy$-&`I3z5$9`Sf@hEF(eb1jgkHrl$L= z162)mtgM`Ul80P3Ik)(BBy>E9c}ODTm4&fk{mdox3zgIc7R_P*P_`4lc0XsCKQnO1 z#qXNYsfqIG=L>}25Vz|uZd{X%@LffdI_q6g9{loWfQN78d|QbZd*q+GPuk6Zt6Bzv zEaxn+tDBwDlQH}Kb>wrGW|cBlfqq%o>7xK;c{u$Ew*dgna+KrHm8CI48b9JwC6@RuKQS5^T-?78&i z+xeM~`xAhOnm)Sv#UniFMRi49AI@F=nr4*X8wO0knJ>eN8<=XpOL<~UEy>r$GQJGj zyx?i=e9k_ZWPL0toA?iN8A2bs+7S_U=Tr0hz06wiyWBZ$YQ~ixURwJ)Etr(u0A_HN zge7=bRA+lqU_PntdhKQ7sWzg7$bXv?HC`(Ay{hrOF!$3|p#jB%?d8j7Gzt-+MdM`t z!=eeUz<)7o59Q8CT&_*JHhqJ!PQ)y;xm>FWKlkH2u|NM!VwE9I|& zm=Mhjg7%#lWUnx^8&uWYRP?^Ncbt;heV%(QHSjdcl=;0+4UJv<{Q7Ua(x)(s1m>2M zyUo1Z)UOpf9Pq=|&U?aFJ}}JVs0FTka_VL5f#TB(*C$%-CacOo_v+p0( z%+R!hVZ`~ozC%u{dn{;Qb68Nq_$eM$MpPJDF ztC@y21^3hxjTb1DbNeL4))`%sG}a~Gk6$6(SU=~Mz-5~5K1=%LHsMu!_DJe^eV5=?S5{%`g{a@&nD|6W7nm4lNFcur6$g_(W3$c7@By6?*Hh%x1aR=&DV z?#;+<_#t;v&hply)|P^s?;HAl1W?}Pz$zktbFVes$bq$_@s^V@dE-|)F#Q>PPkes8 z7IglSHI>tx{S32C7&tTFW0$cRsFbjDChEs}>{ji;Ma7G~QfrBk6=To1fIg)TYIPH6Qx84`HmzO7r-Y>mBns6PK0kP5mw zIw^G{H^f+I=~KXu^%yIS|C97ZxJq7NR%28YON=}|%RCc~ybidDe9Ub(EL4^IOlAuf_HM8hev$>G^ za`BQ#4|&@o=ihogKK&rpa+Uswo!2?5xgrN?`5+mgg_f_2ZT00553(*J?GxR~?3bQ- zS$TH!zS^ZDS^Zf1yq26`wwv=wCL&Ydp*;>E7e^YS=G*={eEG%hn6&@q`TkXWU<7o?G)YK>PZoH%H&(Z+hdU{r)9YTu zaYkJGldd0)*uBEiRiml)dEqY%+xF+&srC7O$Igqr>arFuQq(tf6eJ#e?YKiT&x39T zAN9B=*`FVMY$0BnGk0`9RPOG6NqoKQ-q3BKrqx>~>YM2&@|!34h3-j=blUNqlCEr> zeK-}s9wTlcxObdjKQ3Q&4SiguJe%-%g7;9(#DG%BoA>g>wxG*fsLwu9gL^_14|2PB zVD|BEWV`p{pW+xv{lPxZScvj|-BAQeOn3$6kiB~Vu^ST*7`J%Cs=Md$zRA;8%!f~~ zjAi?UvZS|(*(Gg-Z#IoSA&jakGc9U2`s(ZtUya&76`#q4Az0s@1erV6UAkX?+N*mw zL|Goqh$}0Mgx1zQ@{qM%)4kga1B!m;juu+XRXKfvA|N!o(z`q8T7XiueCmUk5lga~ z_*RI!eBYI6e5=aWX(H6v5zCk6@d92=qtWk8| z@`({X-&I>^|50Pq)f{|-ZK>$LGpb$^Tmq#zYcR!+>T*~ar!*e89i)^U z<-vG3%E~*Czh7?7vau$!r{^WEI7VVo!P&Gk3@j4c!Uam0OrH!Uj5}XzL-R~( z_R1Dm@u|lJge*#3`4Ffqa*5ABb5Bo-JLfs;bqWc&hI2)LSDzTtEPErXk>Bj_ z|Go!m+WmYyOuTr4@AQYqqfSeCCKj5k9BwRn6!J`e&4$n#rcW{F2EB?@&LK9Vh+rKA z=nGZ%)bT%yGsNskO9gK%`&5rQcWodnNEDhZyi@i#LWf|N+Jc@_76GSN7>z-h;;0<_ zlGy)9Er|%%76p7t-gRS2&X7O=8ziO3R2rK zKt~2BM0ON!QyJI^@Uls1a_0Y3UTtHZ+bn#HMRL71%%E(}I>fxUm#o z5cHZ_15lFF$;7u)10U{Ih-Z5bsvbK~AqV7ysO65BzhJ@$p|%CXZ6u&a*c`Xb z3;jr_7%rn!6aV&2gN_G+@gD?Ik?|*-`O_6l-4vDL+i99=3Jf1n)3~=Z8LaJivX1MO z?YOL_IZiMrd$a0}pQd^64E?YiBvLob4>6RZp~J}WldHz^C+$$6NfX~eeNPjO2YoTy z6o+^8Z)r)bsto?}U$z1%Y{6lIUlPT6Uu$IpMypI62Yyii?(_fz%N~c;x0^Y(x%7|c z{TH)447E*rfC;<9v^TWW(=l5lqr{2U4a-`>(e1Vpsg_9l;GRK$G?|&<{m)l+&nr4M z_An9+aUYTSx-80jn3vJ3xQ_yDRd;+pdQ7KEeLs4--$ili%V7}kNJE*=<5=SIF%%`^Z6mN4a73tvT1-7$d zL4<&vQVLZ_s0TDVxTpidhD+^##TRUIf+`fYWKl z{)+65$)H{YzqV`q}L+Z2~$pc4wp3hcW4nt4VDe-c)Jvm-TWubJ6`7&vz~c2 zo5gou>cW=+wAt_@nk?FkN4y%g20MSId7^iT;L8xZgdwprm-d z>|x-=SLbKj&du}$R@7Y3s83(s(vG*4t1#^=k0RD@xPDR{^DIk4-Ub@Oc5Iu;L5Iv= zt|`8aMG5{FoAB>Gz@6CN92vY{VV$jhD5_j{UtP=Xn z@(s298di|oopNw(4eJY1)qmKGD&(+KQzJpZ_D;s^QQxn8bGKblj(Mz2X0MMhj&a|7 zk*@7LGhN#o%$ac1f5Zf6A&k^QGM_fz!^}5U4LwSphV0d?VV_6}*q+j|>@x33i9VbP zy$w&`%|sS@X@^}k^dkCNEr+9YVksY1yS!Z`u4nyx7wVO}UvC4((r}Jn*-WClX^Tx@ z05NuuLG>ZG`{w&R-B*gWZO#e&b;IE0q#!(trZK3}P?gkQ-2{spR2&4im+vSIF>1RG zym=PqKHD_Bd^I=sr0|rcn+mgEUKl>vWB1m&lghoKF6YU@|6LXC2eO7kT{7I!PA`vx zK;eR#AlZ2ycn6Or2!u$m#^%2HqUrd6EEPu>_YDo3T}i(oH`goL^=)MEqHaDsDL>;) zRWM6IE~mD{lY1NN-iHFUrHn@Ai;puJqCZx3r`RMtLy`x%~yU;4Txbarg*O3U{4^Z{c@>MI+ZYkjv;p`dBP{LIpcueLG1TM& z>a8uPt*bMWhY@};)R)Qu9_1kL0v;97fG@Zf&JQM#9jj?6dNEd+SvHoYvDI48>2J=5 z=P%&BC))oblW?&RP7%=X5+dFv#6ffD+so;+?HEhuf_1BkV0=(97Y;F5jJNA0dL~Q= zc2i^%Mrk4_49ToEM4+i@556JZFZas{rVZI&@_p(7=S^(Ge&I&}nBb`_eV90V#<{-P zI?Hles~a=j4h#F{&S3sk@0YTB$F~bev(3hD#y?+9xy+1T>cx!<_bm#%s}>yv>O*UD zp-NfPwZKx>Wpeqv@t})X#%n8PwrBk!A3~bk(w=>oh+nxOo6?(J8`A zgkW|l+FbqG^v{(f9QfS{voni8**L0e+C8(ABCC^W>ubI?uDgK}P*|M;AyT^J^ytQz zGf?0E+H@X*?>^ZE&V;<-g9#m3mQETkIYN3X(CXTLlde2cdT=ovm$M8lv(9rdrq|D8QlPH!)(|2sp=lQ@KUsH%=JLcCFOYCiFcZ7?gb&b^yg#zn=L*ETd`Q* zU9Fc*_tI%|8c~$dQ5+xb6v>buqSX#Ec#R~Vp2|cQ>hurQn__~_8=?(JYP9igbJ~s!I`6>KAr|gpmo#a?2PRfDtz0)>sF8;56$mb>O74CZp zCV{$n;P4gxh+|E+uBckByi&4MVfPa`Gy6DO)2)ZuU_xq0Pt=7t8k18H(Ga5X6~&}C zY#T4l@}^%iwp#R-eeuOmK{>1Du!yzNQa7EiqEkmYqlzxxFEsl=I4g8iG_QHTMoY8< zk|^&a>p^bzigZ z1KKgtrujq$(>EBi2}Jo8U$8L7yJ12-#P8f7sGx=3-*1(BXPlC2_fI@&-Fd9I%DPtT zz2n1PV4SxJ4gaK!HM^Qd%gZSBK?jP*e4p>tC2Vzz`e^BsEN@8#!i=Cck9tE>Z%UMN z;6CMK1}i>~*ZM>E8ZBqJyWJ@95!Zw8p0q=aZOvI|bywPWYobu<=X%_IC*{V#!&>h` zbprc`k*9%Q0`ng1?Ac_$H-6YNAb#XPNX5sBnk)OoBC(uTgLGL0-|x5jY_2GO$j$R4 zAA@}ON3O3zLz~(T3X{_h0&0k(Cm27kavaybeBITS(CD;v;O$S(`rPHHxuH1UNamWr z{Nv5`9a%<^mRItuPxBiN^UL2I^-CUFXgW#aSougEWB0B=)2coX=`C;^E6#rx9Kyt% z?tc03z=D#ci1S>_vBre>`H*cMsdZOg^aIKTOSikQKneqa{_w^ll$fs%tk!!#(PV^x zcr3n^Wc3^J(jC8Gm(}==sO7F834A5+YD3^4SF8BN@$M->)1+DLPQzRx?HL|PL-t@? z_lH1*$%%@7w=Z@ql}((_>KE&pUUaAJ${03i{pNhsWke~U^@7z5Z!5AArO6x2#cod5_Zc(6qWBCB>?SVEL%);un+UhL$KSId(wDEE)Hd5WuxE zpFw%jBi`XD8j-_PuJQj+_2z+4wqM-%J;oAQDkDo{DTSf3P1&*~yD+wDQVD5jc`T)p zWhAA^PGJ&LgRDIiMXMB(%04_QBxGNbEo<+&N8k7N{{FFy+su7mXZxJbIoG)!8cG$b z><+LzcwUVA1|VBd6fy$UK{G!aFVoKk0U|zyDjttEiIT%uAO0X2GsV0rIub4&WZH!_ z6RRur6R;$cfnqB_q=)9v&RiZXP@X1mbO0mHu;m$);u$tn|A9A%YiK+`80FH*3R~p zO+V<)xmjuc<%O^pDyO~fd!4`TBpx`{??LBlop^Gr?v`EC@+F>7BeMZqR4*+TXWve=>c{v5E2KVf zFVT^J9bwFGWn9vh7Qh>BQe1ej;KH|5n)128=cMU6#N}Gj+>bwqLGtkFBgd{b-Y?PN zN&;jrg`9pnw@wb|?B|k(&I~IuE zx~`uexsCe|o*?%OBmC{gTy&;Kw*KVKdK?4$tI3X{lrCxE==}rEto;)d*dv#&V z>{W-0(?#3%bklE0IJZgMGv-~r%>{cK4=(TsVuP1+||3T8* zUi&L=J$~3XUwo{5DJN=t|E|3Bpyr6DlF}oN|K7{PDX)|1&-}4dr|x6`?~KZeOQD*y z80J@})Ry)Bg=^}(_XRl0>m)j~dBJCa=ine`O`~e{w5L}$N{AW7kw2dfbo_1pCc-yD zU#IBJ0^8=plb&W!j}*qGGJ9|t4>R80Gkj$m7Uk0XOIhLM!Slv}p*Cz*fYSI0LxnqE z+sgFTySE9A^2^LH`*Q8oNeagu$TW8cZ83*~B^gRLaffV;r<`U5xub=BGHM>Rzluw8 zpw*@qitH8g>)DbTc6M9k?5Sy8c}$Dp#ac zHZ&;kZF(*BC9TOwJsOl{<@A?3|BLGK}MEhPhS4_@HEVi*{bt$J+ zb$H8&aWfimvv~~=infj4$}AG?6I=|_g{^oE);&r;x2_$d#}(QHG`6ukb{F+vJc6U+ z)#sfC@@fk=J=gA=k@}br-4>WFVZqWr==^5*h+^KpZkf`S4;f{7?7B@C1D>`Ztv~j^ zaB(=f&C*9@=lAGV%j0hrnl>uEw9<@uG&Y_4TOee_?A)~07VP`DPBZV;@R~VEl{0%k z?@HKn|D-`{*7}!XdFw`8M)&G!;=`ZQa?a@AjAZ-K_m9w%xCkFcx2xzq)yX$&Y)@49 ztn`mn)1xrW%L!Iy=UpQ6tv(G1=%Dxv;wqrk`{8L?5u(`9u)8k!*&^Hbrw=}stgtsP zIwf!e{EFFDLiLIFM^ZA$zG6GxTP-@S(eCyt9ID7kilHHcgngClgKzE)YTDe=+Rf*) zQ{~Fu3xYjGs?r3@1ceh-yJ!&6)P(0#yGjdOmOE>CS zsMOr|(dl#3yLMGOH7ra-HiB zhlm<`Y{A+W ztc)DpH+BI?UHyniy{K;!l5 z>b7)>D!R=&q91va%UQAQNgIThr_!dz;dg>967x{^l38USJ2Sa_>V%Ff+oryF;o8Kw zK8pdv2s-PZ-Q6$yMW-#WMP-gC)lSu0WpspCWHQmeRjQS4)f%DBy; zw@$k_bo|KZiQi3U9N+d;r7K;+w4Iyp8M|$AOyN$Dumh}xWF&44S+5bCV1iN(@&_5d zGvxYfs^8G9y~z76j%R?@*nG)5YBVTxRo;zRg|hk1n^) z-O4hpPfbcrpM9Wi7UJa4rYPS*>kDJPZfrA_edeIo7T?|#RX?52r+=|vx94-p=Rr+l zaq;6LMr5wuE3IF7wkW=zaMX{^*I$b(ON;s+cL1D%6+d6N(WjfQ&f+hu>VSUUAH+IN z?4i%LipVonslEE9TRo%h`m5W|^WkZwb@$&N-LsoV;jQhDj#yHxUJoin$cF#K6a zBFiE*8xJ>PVQdYPkPuf?_6sc-*=5H7*M;>@PUx>4nC3`-DE!O6g9H7Ug9MH|8I(GA zf1b_YUEMT}FGkEf4BC^r9N|)m29;XT8|yB+#Ky%bA1l(mBYxn!s!Qn8l?RjL)tI6= zl~g{HrP%imxqZ}Y+Hi7AWbw+~zg}T6KlIkB^c6RFe4&R9q2hljz7SQi++%Omr;cdL zKIg}m^w;jiPbJJd%*$O6(^4zHB=-jqQ=*3ATwUM32+t_nZuuix_|}e&YvTsA#J#J0 zBBBkzRMY6wohpOIcEzrO2s(;B+OBJ<{I`^FSb7*$ig$`!(8p)1VahMb^50r67(~zX zPk570X?`2XtMlNJkGHFL+FY=0=WrLzI?EmH70T0VVy1ay>bC0dJ^sUuB$mr4)10b&P`$}e`K1u0{`P3hO;7bIjI37B?c&Snaem(X z43i6_a>rs}K4RGxNLz5irAVp6R)`L9E4lv}@O}G(Tx0_U1d5(^5BiAbEPF}2_^C<+@K_r9E`w?ORjQ1*q@*w zCXJA97Q8wuVw=uJF1tK%4OA@Uc73R?av@ zwwljUb&IoUXT~CR3W~q%cwiN%vfIc3X2e9#Kvg5lf@H&6yOLcXC_=ZJi#cV}761H_ z*kx-(^5y&keOm6c>Ul_Rt^z^64cSdfB^NWfYr?vA73s$ezU1dhG%q{W9Q7-Qb%Z@o z;w%&SfmtBbbZ#6}<%C_2(wP3x!`FnO`rCEy-d|B4bX&ioa?Ze~-5g!%Nv~e-~ z&eMB!?g7 z>orE{VotqB@{WI2hk9<{B$=6`y7#habu<24owrQchK?F0+scC>*KBju>Efd$fg8Ol zWQBh=YI-xht2H7Ie%!6@SSZ83qu{XP?YbD#{fD#yc*nN^(ZS)n{;GkDu^8FH$WZMElDIcd97i6V+4u0i}Ak)+s?vK+V&Ha2f zB`ucJT*`~>V+CwmXgTFrBEU?jwpd4B6F+v#`c+hz7LQDIfm+bmN4J^5Kdd z9m<;uqss5=#pIcu+)HR^2T1g)OC6OkEAZ6nFr?UtWs3cbT*(wzdhIb z1pBh`9T^#=EyXR^(=THQll#{F^saC{lh|Z$aUq+rx2Y?hpH4{JhC^gbP5b`Mb_nDi zm2p`Ao;b)>Fp{R6DL&gfL_h#cz?_IO&5uVv?$;Ai`^B0w)iG=I>$)~BzA@q2_h|dg zuy=8jUkh$rFLun*g6oPV+n(!8gDVNH%21T8YHNbHF>G8r&7nMVR5cNYbBf( z<+Z;dkK9Q?2413*PS9xrG=x(Wh7uv?sW{)!;x7E@{xgVWwtBY!-}SWwwz0@wx8j$p zdWvW@Xf{AgggS#Xg@G0Y(C+88Fhk1Ir+BN!%kcAXkJ6%#5$nNSx(Cx)TL;`AmX zJ|f!XScOXPZ({&d4#$k%X2Zo5oPsyB1ysukKsz7EcnhZoZnbV@f*CLF5X!=AU3m%SD z4yqmx04c72}X;p0E>{LRF{HPMZX8iuY>$6Qwqz1%L2WyAkJZKq_b3TO5pDHy&{+{5Ljfb)IR+1NbwV|# zXorsIMjurt3k%cyP3Y*&fkyE8fW)DXg)>|Zs3*>PSdn?9(H3b`cQ|XVY5tw#2%*6T z{k;-ZBJ?i%QGJ4U)dMByg+zN zR{K_DV_-g<$qd{VTJ8NiI~sMnip?o-BMoJ6ORKH~-C!(x7yXrU<3LGr^klU_{D0le zs+?fYCE7Dm1s(~?uBAu-x+G}5T@GgAz{8@?5HHC5mA{pIX7vLUdreW@1)ZRwvO(1l zZ8laz_d54BLlaCDJVw?M{OxZIS2hyCxu;?{nu0C>5M8kp^au3cg-g+DFZ_%)uP=Fr zft_Yy%&iczCdWg`#z0s(+4a9tH;Ad~e~JS4hCa&<+!}OjA=*X51$+^_3U@DHq(QrH z@)IpyA_N_D%=T)>0xD&A4}Np98@il^QvB0IBspLNeHp62hEfK}@FIa4N`%f68X3{f zGK@j+@DH$%Fv5`0$mwGW|9|!>qOD0tC}-t&a8U(N4gI_9_N%=;tLwdL&v1(=M35#V zvEU#$N+HNuejZL$+S~kSGBq}?CO1K8h~ptRUW=oW7+sPLS8^k&+22v!Q%4O=BpZ>9 zlmrJJ-GV`VfclN!B-oJ+B~l1QQ2ND#uc#xyXhAw+i&laaC=#B%MUoIt(3?)<=z}5H zG-uiEYN8h#)#_kh3bAwzR17)S{9P~5VM2fre>L2t=Bn;rsr|d}8(n=X2#J|N$X>s$I|(B;$1{Umz)v_E=%#bbtv(M9}M&k7&D6a$$Ywn zqa+Zw(C|e^Y??PtGu%Bh*q*aF8*x&u&FdJ=;N#)VQQs!`_wlMg9wZB6Q|!jo?dYZG zZ=Atts9aFP5rMIlxcl+zo1Hhv#(>vG{R*dL3so*RoSzW{bhuNP`v$^*b<%4=>WELv zuqI?9K6x?mbe(yhM1soA0l{dj@g05fnfq^lY~${hCEM2|Y?P)G5Gl}g=!i>x0XGK= z$wiuBAP%B~rs^>bFE{&bJ%>8Kn+*dJg>GiP@ zPhX86d9Ay5BK*3(pV2%iNblcU&X41jDGG`6EQgzVdBZwf6wbqFxZc z>Sn;7#}cSlsmh88PE#2a)2+tD!5cN9WzOT_N3R>)a?!dfPvUr>!0Ra_wlp&WY6bi>qCXuwxiKNFoPCLifR|_QUY+Iz$!hg-PGbIbvcncoI(k&;8r+>qCj5 zyY}5coiYZ{oG|*NFq=%N2gd%P^1_JtC?P|pY8#^M)pEDREBNb-?H5)aZ8-Hv7C9;H z!=F7RY*A41-eof3c zz?)MedP8Hk(F3oncS`;7C=8oqd(p6v8E!-7oS2O7KT+bnpPDE30Z z+W)W*>H`3VZnz!3)*LRg;DK@URs`gOT~%&^A=+m8x0?%`EKHs43nDcXA(G5VG=&ys zdqGbiR*Kcw=JjB+OLRe>=*V>bjUus2Vj?^3@Xh%HMTgpIJ#3y}@`4}gW`2lJl>0S5 zV*R5pL`m3P%M~vW6>U#mml04WuX!4FO!9+8?diCCuZOLJqFD zY%X!|jiqR$Tr-%z)s{1RgRj>Nf||oQ(0#P?5+8)($7!ey!TCH3q^?wcV{L}#0o6y_ z=jz-)j48Cq1sBoFp#pToq(DZ0n9_L5G1fAFS5isPnl)~p7|wSyXokwy>JM4lx9ce} z&l*eM9`64Tu-8NrQS&L-sprhh*-)`oNn9vM)2vglAJkEb^Fd9?E)1-rAyTSM9E z{qtyFA*G?Vtp0NM`*c+`VO#GU;)e~aYx4B)8X;0EpTCCAJxj+o@>|bk9VTy5U$>rj zw9n~dbJq9U->r?J&c<%(n<+d!-k0R`MAv%<51xKoX)d8flF?@So=w|kYfiqMoqneC z8jl1n(x2cieE^jX8q;t8uX!4k1ezPrl_04EybcDlegzlMm75^a9NmH}5p-Za9G;G7 zgyb@~hs=qUYLKD`QyAD5x{WLZi6!X4%fb9^^wp*Fp6vWkSa_!-dO$3Ldg&Bd{t>;@ z9MjZoO6H5QN=dIwTZbDIqY^m6ME6(X=RhEtrTyBSNT(U*8whjCbC!ZJU~4 zY_i`3U=rY4Fke>jNstoqKI=V$rzhzrfLcQV#85z6KaZN4y~6u`lp>|}fNyMrP)4VB zL?l)$@0;{>;g>20_BXV%Bz1PdKISLY>5C3d>Gwg{7F_g7v8~~iIYbY;Bz4wV!mWFq z($w=aMS6nEnS1=bE$W|CKcwX981<*xy(AJP4NB99uvK4%5GKWqUuYGwh<_`>lI%&p zK!n2Dez|93}ZT)kO+`X zAds%+qG*bN5&;l-!BfSes||1nA$WtwSqmZI?KC89Xi%`LO2w@1paTx2Kkfr0IUocB z@Lv#|iIC*OmkT41DDvv>=i6jg7b}D{!+)Fn)$6C2=$-Du3Tk&Ac~i7sJFY~eXkT=} z=|jvoa#Au6{sIy4v+ye&(1+{yv`=LjKIkR+k)@m3?RBcXhkh@rF0E-!xOL{{9+G{) z`cH2>b~K2YkI@WYy4=1NAM|I|U*f2xvnPMzI>@6W0g+ZHvxwN;C^R9CJhp!(3`B%fys>HSGN zFN=#k(onY(Q`FqsAKfTdJ7$x3Y=`B0KHTQ)0EG)vTRYSf_SYS1yB*Q%Fpdio^Eqt# zJWI%6McsK{KqoDM+SFAo{Kk%Q4RNOLwe_jI9-Xf)*Q~NBT zSe?{%J*eHTXNdgl!qTPK>-029m-ffz-yQs~e>VrbZXZzE+Z@i6Iz8XO5)<$p4n1Q zs7iah8!rWXqgHf7p;XDejr0-`%ZH!KnM=)N79J-%BH%y|s$vn@TZRE3X>|kCqo~ERo#w zB|c{~#>t+Fi6wNf@n<@qSP7s??tkF|u%jN!PD0pFMwn~_bS-oAU7*-yfJc%+nm}zG0MIzz`$B*!Rw@er^ zTAMIrzQjuv{h7T)pr*|-GCQB}USv?J?-=@|&Q`AMO(RQ>xMBPI%ZN+MH~1-h9G$s`L&Bwjh`AA0T1mr^}uv0&VX(&?UW9%FNLHsJWkZ)Wdj^~>L~&e60F zNsE%)lBd5mx=`_R+);wd=f@v~bsZ~gPcYWlYc|s&XpDKBFqigNWh3?#IO=lJA>nd zlK}X6pe?S3Dmuwn_NLm~eR!*%E2X|w_LWDXwrq^rImsg7nPLWYe%Avx^Y$dZ-!TMm zUuCQSOIDHbhn?OUFexA+rjTD>&mK$*lVQfv$>~SML7l1g@owK3A(xb7W#;^3`{aZ* z>!tB0{5j^2X$E(1bF_#RVoUI*3NvX9?4L&rY|a_hug3G&f>Kt@;<5(`vyas5J`Rz? z?0qC_5BP-%kj?g@&eo|+*s9NMIzP6*bVXi!hWRC}jSMG|^^VB2=I~hS_>8L(?LEad zeSE52%@676hdXH+`nry0A^G*y#oZ#=R`S~QO52J*k69Kk*sFw_#I|lC@X-ZqymSh7 zpOx>7)rDpY8^wH86;Ccb_Lc1P7~y_k19gC8>*5fNt4Haf@m&dXiIePchzcNFpplZZ zJq&6kVN$LRT$*u?7Jefx7FXlQHviht5$%O0)=MA(SufQ@>XT5Cvx_RMk5Zk2K-eP- zG@C_xBs4h`SBc^Ps(7ZANar4OSq+0%Sh)K8WqNIuSp(TV?c$4yYsx!(ww^fb&N4`4 z(vy;PW|@lcHcuH@I?Co{STiEyM%J>Afv<|mGd*O4{4CUz-p&4q1{2$m+yS;z`kOjQ zB9uMq5ZM@xzibQ5;!n7Q#nN)ey{&r)A#ju|sr_)v>)ye>gvz3w>HjGH%ssj7NHwY} z3Go~l60)Df=2f#ksrU=>Qp2bQ?V0ScYR$qD_ps)GL<2{1#A~pF1Ade&PYstZ=@$ws zvZgl4-F>M$lW)dm`WxgVBO;2py3bx+(wzZu-- zi1)?6l(GOA0U?N!4T7E~bB@NPp!?_6-G`6^X(6*nfjdM`!1gl6$s&EGlG#6vtAw@8 z_|3qk2Qncev!&GLVB-8N-;aZU=to0xkpVWkJu$2@Pwzaeo}+mWO7dnpfWw=~k`t3h zt!EqS%Qn_r-s>33g`&u#WqEFVpT!gTIUY;``#VNerc6;OO{UZn1!W^vf!)7Qzn3C& znlVshp5Audzn!nE=!l`Lr(_-BG%916X-_Bon*?*2YgCc?SS6&lvDqyUhrEtFIec(? zrc&=;p`H9nGj4{+GBlv&8vRqn_Fnp}3nEp~iw+tb8WrnwUMBFGm<0qC`(ZoWxt#O2 zw})$4N1rP)Zeiq|+;OIQ!raPipSZ)Vz2%bCC#ZXQ3JyyXp9ufX8@ul z%1&+FSDp><3(yuy%R_88;S>b8&~U#>m;i@@vcD)R=qo6%_=EVMrgXUanns=FrC zv@wiqL%Sm-QN6?XJ>V}s$PNAASZ36bp*2>BJWxdZxtghPyc-bGa0Qe|&^8P-Q~dZJ z-Db_Bl`HW{jXh~{Yh|r8Lh`6-2JDJ|d=N089b-oPiTX+d(xz&nnIvL=vinE4VQHi0||@aPhi-!Rp0%$$XUUI!0HHO{~w@G-mbnqGXXHd(wVRM|lZi7;`4e%gd^0K;1#t zNvN7~-sJep;qi34?M!?7`c5DXClmcdQ)B?OfshPi^RMih^-MSo?+i%u9dW$v+A zTjF{)-y_oAs7Uz3*+DgHUmnV#ir7XWM*4J}LZmarb-pCAl4{_i+hw`QF*e)4@`2!hn7QSy7pf}7uD&`&+VNSJFXkob*imY630gmOfj(iGdR!KEEutz31dVM@)gQl_jnEA{{7KUpB+yX*O|HmD&BK%y6P|b z{EEKMw8KBgUe;Nw=iktbeaIszu~-Fz(&Zn=)nB<-n`+OGJNuyXS7EAralX!0p?7`G zcb$4Y^&SL?Pbh8ePPeCgF8JqcN%uh6!KM8s+Fs*tyI9E%JX0gG-%896iMUS z>oIvn*$3ZZGeQQ5^k=FCdG;4X=|@I}z41?kYX9?N28VSKuOCme$-UawcDi}~x?bFX zQ;at&w_a&!=+1_!dpXW-R!McI%x+3-J|MPzAb&wPJ5LQfJLEYiwF8h4Es;WXR1!>< zlR~BZf4DjQwTNb;t{ zSw*Z{651^3B2jOOL=U+iFMkxT{8*rIG~(H&Z`syDZ=!gVM6$7o$*ek{XTXr_$dLqs%4fr@H z#v8P%4HlSx*{Z*nhD})0qNnN;w{^ju>>}(vEP{KJQY3d``8$jJytW_0xpcc=PYT`4 zJz&h-;64CE5=Zv^x6w0QA-ZyMXNah131PJi4@d#CCp&P7md+8=94>Bc z-JmFw6RST&_0{(_a9kcnj-_-(JbgmJ7}$Q#?LNl~&~y+sO(E~4A+XwGSlOtv6pwwr zUy|=W^dGH=S|%*F7_DvjyXY9HQwZy{vnjnfC^>3AN;+3Q zR=J+>^*_WbUNE=YE1YJ2+8$G*Zh@8dHtIGo;2=>C~v03#|NMI>UEdBADf*K>iiO(IU(?=7u(=x z-lN2|HtW-lYXe=6vs{JCPI=rjIA7lWB;M2mv1KP6JUtye zXabn&?4?1BuhLf|*PtAW%3T`o*2u+{N`5d)c3Z;^XrZ6?@_zyo7s18$qyW_8R>7OXSF%&4IXU#3H>#b%N$8|EUB zowlJr(HOht(u%tIk^lrgGL7PLK=9pU3$Dp8(Cbn(zeEzvLpfH<<+@dTV=2!Z&c~`1FQN=59Y)@s9h`iu7xrwrvU3ADj;vwz;ZzxgW|&l1Jyb zHtc@dd#Kvn?|^hH?JzIb0y`@6g{^jnZi`o(#{qe4M02dZkeA;z^LxxVE5sc0AGe>= z0CnJpYn)Hk$E$^Ve|CFDJ8cVz`{8sh&vkdACT;fu&7+)WAbXSkVn%vM zYZRKVsdHWL7U`=p$#;Y_t#203;$S$zPK?NLN7J(twK)C{)lp-g?K%te{8(Z_sa6MY zUa{Vi*MtBKT0^HqfCZL*3HFDWBaFWS#rtuPG9My@zzO$G$3ukFMCH4vPO}PB zk(6@4yrb}kNZFsFMtt2sr9zD)tec2MzAoMSk-ry&r{X%Q_9W zUo1Lbj>@o&(%xlBH*?v%NX+a|NEvPJy}ImEk?^nfrb7W$aiNq&V#RmUou2rfn};m> zlnU(4K9nn0%w+ZL%dsqZQ_n;A#*WObND}QI<&o7os)Wox4~HNXb>jH`!pv`ElFvNf#cmiv(D5-$OX7G7-8KYHq7E1)T$;hHvAqmE&3}-MN|N}5 z6xWTprcarz3a%&I7F7%4DoL}X&g(zyQXl#*Dh<5|b$We*j~Vyj=5_7gZoj^6n~L+f zGwgG?;?4zF^?O-zOOz#m_CSPF4MojmN)a($X5!X>TH?5aXPB4mxOZrMM*rOp10s** zR^|+*U&DZw?MmeVQD^SwIpYwdhOk>vCAM-d8@7S?nafPW0Rm`$4s-yS@gO^ZQ~?YH zgf7RQ8bV-Q0_$CZzrrgJNzpptYKhTdT`Bm}bmfEV0xXlhirvFZ30KA4X|z{YV=a~j z_vYe|%-xqA;5f6S?z5(gIh;?K2lZ-fElnb0smdBMzDrmI2pqz zd#-@x;iGnzJc#U1Wy5YKBvWfHw_))d5<*Uitux{^za*p}zSt9fvn=cdWuDKR=*m5B z_`*BXc9Y}l`cecYNCdUT$_J&*LBN3*13 zDS&-H4zhg^NS!#~j$@13(?mDa)%#K;R>rWnUIy71klyP~rc43&E8r%fJ7!Qxf|FLc zEs$Eu5D5dIE07mW4cUmK0or*|CxLQIW9CGvZAjjw9IgPUZ9gDFp%&i^G$QsFN}F)H z;+7~90VCi7p)E@`MmC0nVg9xuWb@Y)9E? zAkxrMK?4(*&R`uW+m(ZfoMZBX5!JS4GPXJGqetJtqqPi&!zM*k#) zl3Kxzc7}e>>JG!;kP27-t4#^9qFhvA^>^pODj|bk`LP+hSkA!y`*S5Z;Ik3}8rz_J z>^F~`c>l_nq+thF_>H9HdhbwogKh>k!+>meXAvAVU!%kE$Bp(}@o$TnI|fVP@r}Mg z=bh{;rMEzG+1>e)(mxIav;o@<9GP&4DL$hooDWVz*U_&=RQ2mn#AR0#8}o0CZ^YFD$v`zWRFuC5G>=e%HxiZ`=4Fj6VkM_;~L7v@@%Y5{ZKn?EuB`(8Gg`7{g zcgS+;vLmuQut+Qqb7mmo^%|wY%O4ssNyAD56*$BVnvF?l7?L%dqh<{(RyJ~VLn^oe zOiM!jXmg<9E>QZ-#;|*lDlQ$-6TM(*!To+^86Vc*YR~oKvIXVCTzn%}Fmr`0byQ@M z&a3!ASc`sC{cRb77wI8NzwT0?ivAcWZ~6tF)5!HBWWOw7a6h70`;8cJ()d~G+FuJ& zY7yxhpm5XJ^lMfK$^yy0db<#O*f|=gJrextTC8C?Ea}R3oNw4wNO$H$ewYO;p}+=Q zF2=9DNI`RnD0u9*5cE-_O|0Pbm%r%1DfY;V1yTcpfmLjTZ&_TP3l7~gJ*oWA)&mUN zqQlgf1#%lGrD?R0PL=33$H3Bc7}!ZjvM-aM*Alo5omA&0vM&*X+}GCY!+VfHdWwp7hSBIZw`+5O)q7KYfAJg#7F9X#no^VdUu$= z7k`N$4`4#Ugc0)j+j#}i#T=@*${^)KQauHk2XLdTn+Fe^+2Mme_-oa<{rEsvd(5xQ z?>fx5aiA$zhM4k;6#(#8F40|2{uV+Mv=>WH?%`(eOuRe9%m_O_-;A;S{s-C4YD>x- z7hI$vN9}%!e2BZV$go!j-Xypa&g124wAY#inDfc-s{NifODaZu6Z#vY4d=k*wMPjC zp@BQt2()-|Zw6^MM+^UJ^mc{EvgLO!5U+;a2N~EEZc1+jgvg+#@DUI-Sj&Dy z^4NrwtB9iocQ3n%<-Q+L#id_v!CahU#swLHMIhCxz;U2`I;e4=Jt5Tq{_cU8^p%!S zr}sKiPW0#fRJ2x}{My(C`jG#2`aoz{YyRDWCp&AisdflKO(pSL2X>Ml_0+FnB1y`o?7({4_pHnP1ds z#%K)uu2z*VK*Ppdq@w)qa0bu(b8WDk9x4vIJOe+lk&t7!lg%U}46K5~vJ@5b-^5C3 zK$oKh7C9GBHynGY1Up)vTY#{Q7DCjIJtiAdOL`xw|<02eCpJx}dbj1AAW5FtsE&x35N%AmIzvxLC| zmc%-e)rfhsB5E%29bD^ADNauS`lXu~;u3xn5`sSnm4=8c=EQ*>fd^$~jyG~m4Vf#J z$%)d*2xv>dpc2wIiwo|$LKP0l^FcOO3(;td4~ z_{53Df9D-y?%s-#q6Vie78!m0e6SJoOZ3y3c~Yco6$KM|Y`obstYJ3;3%PLtkr6j8 zg=nZ5UZ5Ks4ZC2(8?eNilCXqBWETeLI)=YK#PbH@-cg09}2 z(xV9jEJi~I&TZz4lEjJE&y+r8P#ZBf^fyGjF2^CkUF_qF7$g3vlhF=K%d?G`YqMEz z?bXdw^>UeWnO#=IbyVxlWYSdFMG}Lrp)*pkj;%(lQLS5^!KHfqL3X&rN4{D42@tB% zaJ}&yQ4p#qkQnfWeL=tREv;#qMx&5fbS#81a2WE7HSxR$o|Asf`XC0b=ZU_T>BzBU zVN0emUW*WD)W6Hl)w|RmM=ZtdV-{#tfgX^wbn_-EkE0Z3A?b;30gRp z%SLcArJ)l|dBd1rC&$b1fsRIN-*iVxd2kM6HVr8b&qvXO=Sm@~=H&E{)M3Y-RdD0SV&`28Wh|Ggpg8 z5Wv(H)}ys|2#TDBFH^LG6E^ky20GGWZ*wE|wUlp9cDQ}=p0hqCKLV!IigwA_qg_!GJFns0YWMH^li_Er~PbOKwGoFAMQ)^;ZhV;|j(ApM#Xvfy5BX9=0t zF4t5`QJ=?8mgUYHKKphHY_S3yOv)mJ?O$_dOSv#Rr(t(BK)tY5DTAZXL*SaXg0-BE zYUJv>5S3XKYdCOYOFVC*-(sPFtH}HhXlgfKdYnDdri>Vl-2x{C0Vkt`rZawpDkxKH zwh1tvNao^|xXfoXURf7H#62$a)fdF@V$hi^Ku7Hi?A+Za zO*iz;;3!-@cFtLS7jP7{w;9o;SGDF+h?TD3&;bQi;;3q!9l(jJBY=x!&2WPH2EIxI zvLifl!j~=0LddCnOTy7{6M#jIOmpe!Ba*V;n6aO{kr%?#=>Q2uQWmFQ$o2rS&_OqV z*am@nGJD=m2VO9j$)RH6f((xKH6!yO`&DJ8kyHSOC=!GKCy4G_szz`ete*`*Z^)cC z{JKoC-w=xOWs*7U1fYF1-vJ?Va-RRnHm|i(!n_@_727Vr`ZP{;2%cXoAgioXoX{P` zW$LW(JYev8Hgwq4$9)TfgBR46C+6(!x$jmvf-Q!XSf&|%hQ(OoC>G-GI^*iF^7H%& zrqQ~I8S=5Npdw`Rl$lzs_0-&P3m#a)f&0zt-mZ{$Le6=8@}bg~%T}eX2v<<~`w{a` zhCgxv>*{CYDh#LC?o`pFw&T__x2d8lUugQDN|6^H%g`Y85iBtmnGYLy2;^4Hl+oH> z12V_!WEGddvl*B)doh)G_cTLEIa=doCNXoT!F&$pmq?EfWEbD=BHXO@G6lz0h=zUA z{uG&mBhNAz5;vbL7+z>Ook=EB-3?NG)Mc5DY~{kI9dpD^ zI*46N7>_HBnXZ#GSvo^jiPut(SSk5~=xUjNF(b}k)Fp@OL#E8O3;=EmC;F%x*_;n{ z2pwr1WbA@4$3Un?K$6i#?TVPpBb6qtQuYrW$6K#qH&vga}V@=(?I71pptsS+Ed zglx7u_}WUCPsSO+@?{Y#SX=^#-qe~p$r&0|B+KbF987Y1FI6<7sYn&nC6&RmjkWX$ z=VdqFS9)!8m*J0iT#|X<#6+fs1+$9vOIq2tL0P>EeLu2qTw6aAaopn`JRReC6Llj#__4JVA3^6Xpq}0 zznPg6Gf1;|n!(Xj@H2fY>O#A0H`e<-6cita5j`m;6t|a&^&quF#*o>+dn=Di#w~VAoI5 zvm(B*6TGQ!=Q2CVhL^sbkwSuj?r4J0`G|rToOCNKPgfJ{W@-@}8Ky4%fT=n@h!MhCnyr>(EtS=QMihQ4!e2;*U~nM? zxP|Aeg`!e zhA56df9}w;E~rf3$i`%FI&@Un8q|3F`8eZJXv{n*ckQq6O6@Eja}T4nQIHR_E9}ge z_M+ecqzoJZGz!WMUW-eHPu$JmfoSC06t4@utaq`33G>V{4l%F-7k>>7RmR5ih0W|u z8IcC;EWo#zj4(6jPa4n0QU%v9amA&cCmB@_6yw4wA)LZcHB#dLsp;ASncV;XGh&iV z*|!izoujFQP=swxHAFG_b)-&iUB>DAmB>AtoFbX&P%f1%BhJM+by_EiNFov=Igv}{ zGUO7Q)@*zH-cR4(?;p9$rsw&5UhmiY^?JQObJnI=zq54vPb-k^9q?1E?S#le@<2US znU69d@nZ-j*i#C^0;M~8+GClxFTW^wBc%i|LCJgq#_JfjDfNN@Jp2d)mOK<|P$|F0 zIp9lkh^-W1DPV1i@RRFg0I|gl$YNlwC4i}s&@6ma@gLGq>)F4T>H27bgV|a#b@Y1FG~GXYeS`y;5_1mZUI2q^ zayK%K&nWQAGEL5i9Zda0l8AX#x&0&YYydi;i7o*u*_{q4bX9fK%0smr5{Gm zJtNuZ)G0p&wWd8n<8kh7>eldV2f1*b+KW}Rr($&r^CItRz>Uy?75Q+Fe)KGK-Xy~1 zQ|pDWst3R^UCnzRNR4-FKx3FViI@ZGMoM5JqQPRg&${~iiPXijnQnD=gPICfq|dwn z*6`sPn`BE(W<38065~qM9Ecqdo5m~N8BrqTAfrVWlZY#aB%+iU1nX<1sR`&a zz}8Q^cf_jv$E|?~M%&xcZv{1R5Nbm9Axn6}#32TqjgOPn+ZW^-uI4Xx@>g7GwFtj4meNl>t857pI;im zcmFv{dNlozLpxGlYsmd8m(GWe)KU5dba?C<-@0YM2-*Q%N?wFoa{3pe{Lu;FD@2~u zw2x%X(Dy^?XD;S%qK+2Y>-Z>+!F^al{)o}?W4$Sxq`n>lY=>5HXUtyYXnbR^$ZlW{ zLjERZFRZIEpanPnT_!HpK(-!Ml;i?BAk~pGmB@qBmO9&p28bcG8j!_sg27ohFB%4g zb+PG+ea2#pNZ4a(K&L6DxErJvknQ>k@RX8V9>hQaBw%$wcmU#J#Zv6u%3-R}?*n@c zoE=9ams|Igr5=#Qw?HZ18E#9EN4zenRy*$O0T2O%E7$;9r0!6c`DyQEl!NhcrH#A3 z3`qox%NgvJI7)Zjqp3g+ZP#d=6>UB#QpN1npd1ogyU)lKO>miJI!+4ovfIfRjs$l@ zYXq!p72$nk4|_fA(ldVDNJ1ETs7fIFA-UXwLkk+<$&U?PRX^dxxd)t#0QYKp**aa; znW3x5j#WH)u)O>@@Pl{w1J?KSQ#hS4OhY-^S`N_kz0D;h+r9@)=}x zd@B%>>V*jK;#GThEFovZ*?Ow0;nW0BhpTcs;S=A7i3C%{dq;(UwsxiJy?c9nKiMGp>6e~d04`SzHJu$w4Ed9v(4M`B z%R7#es)jT_bqGC3yyyyHG* z4tI;x=AIeDQOnA5PSg3difIo}K+Z6g6B$P#o|y9#GFAjIK_Rn<7{|WEFyTsewC5A( z6o^q1-pfD&g14SG8LyY}L%=xEJ&&;qEDCRFH|_1liwJ7S!DN4k5@}!!KF!KCF&l)K z=&eqd!XK5HYzTby9U`wunV{};8;iRXK8}+VSCpjIu(bGyJnhSxoVDoWD}&^b5e>n% z;h$ip_eJko`%}w~>IGLCHLiJforGVYc!X8Ns28MmD2abl zgb`{fnu>rlAx-ld{q6}lm`p3&mI_Nfu?%#ZIid#L~m1NaF z%>ESOecYLwIh}dU{SgjGYaFL;llPxW2^7sUyk~~?YITw}P-yX=7*C+O#e;olfR1j3 zinHY&CLI3ZSPD;F9D~&Pm$jJa1A9=lQbM|H!ja>Tnlq2Gs$kI#}CN(@FI?N`S!BQ)iK*_O!w6mgy_|C8ZYf7?4@2|3!3OHT9_&sAy}eMgWp<%^vc znpfK@!`Xn8eYvu*-yCcRxwk*_PmP<@?bO7dNKt?%HMNASgRy$-pOlzTTVv{k4yHjYAbg zu2=01;&p=LW!RdfxPS96|&*fgVo+LXvyk(n8$C=ahey3Q;MFVxB0`$J;+3kJ!XjX5j{Go16Ht&q9LNxayg2*h$G4%An`E|1 zTL6g$v&ja9rcxL#ThUx=90y_W`^E?0r1P(xOeWY_++DQg&9?+uQtSkiudbCLXjpS_ zj0AS7#aixOKowo$`@XW&0QrrS(eULg`N;i}1v8%;tQWQ($s)%~EThCY9LO;xj6%Fe zDjyVxD5hMs23nPySC}fX>;PyHsLW+kSWmvS>NOCCZ#xFO{XPWkF5@E-)?e!@*pH+q`R^Zn|XN4&TT8BEbK=nt=G zSkHDS?|VZ=GJ*GOJ>wEVc|Q;+j{rSfX%2_Qxn3}eMV`i9&t%l0N!p3AxNRd6$L5~w z#Oqh&U9awFLHhj91MXBw{{cC2ZX@wnYNIrn?KW#`Ul=5x>|F$g;0D8M=i$5wx0Wiw zi0w9>95_P=1PK>uTCQ?b>d7~iGvaQIKkh7 zJ0RoSrSnOTj5GQ>^FEGZ-%gwgabL#z4cef3Ko?MqF|~~=9|gX01|*r@BHyHpIob;7 z-&{I7loH}aL#m|B4>rJQU&Kz;2R?z86FO}tXu>@8R|czK#Wc_OL`SIx)5#;OnO* zg57pzn>!jv?cvZ#)g~vC8HyWG8;Tro?pIYZ<+y23knP-pz?YctLn*7Bz1{>I(w%`B zaWkqw?f@qGc89LgO&DapCCHAEZd&bjG^kxSU#9v;0MB5%_IM&=G)#cn-$zV?XzM02 z5pGSS4_qwvM}XrFdr5f3l|G; z8;rlRqw7+;(`b$DK8tL!{Gk>^2$Q1>N}qndz%mLZuUARuC} zQv9Q|R4sX!^V?pXo9Dsu1&*IDtD73T#x}_N9H^BS8yE=f>Ek|XlJZ;2akUSTv)`I; zgUf-bf@4s86*Jenu!38B>fWQAmk@MI8va+Whx(_$WU&VFOe)IH}VcbP(_-;4zuO#)*EIEdgy2=x?Bf z2q55-33fU}M2=cU!|d66&(uQ?)X@q;qR$Pn?8i(Ytq@qZorhQPl?vHyT>9*4l*q#_ zQrKKMe?_4)y-=`C#tCQIMsHNk2Ohy_V-E-M86v#jd&DDUz7hyY%~U2+Gib)FjIX`y zW^5U6Zo2gcEW7QH8kjKPba&8kIm#Zd?>-* zq8c;-bs7GT`EXYB3xJySI+ z0hVN}evoIM55bcjk4AstzNcYwK*uPgK6nfCe9J!Am&ma2SW#CBfm`i z%Z$jXb|*<%*=rqP)6o2&kOBX|g;fK0j9CQbZ+;JR}lXP&l2)HSmqj=nmd~0 zhro{bzXr+5LIWs+EMnKaiURa3Gj(~;Y|(z_YUL!`CkHMeowV1chU)-=H7HWb@rE$f zk7x`yAT@u|H+&p(R03ydJo(!LQ)$XaAqO;6*$*QuV2#CaFzij}G`Fb4W$U*Z-0Om7 zi1O!`t~A{g3C1nY9qCFXI1YLF;zmuEC)zG=j|1Rgo$Yr;_Vj}W6H1tIHOPo@CxN70 z{=zjZ+HL;cyns=mxxpkf?28|1bB*;P1~GPx`!Xq@onlT4?-4#Dkc<7z`qJ_W1i;hf z@I$-bP zP(pgXy^ZYR%1;OdrzhFIxNF0!(&)!#SBr3kRB@5WrG2iVjK4zBe*Iv+9qX)y5pwIc z$*6$jUsH@~mqSYm@PJiy}3Eoo6=s*$t3QM)s2-g7wv!(b@SK4!=5T8Lmau z27#adD*e9M=F#SWwV!V1^rIt2_a|w|@MpKc0)40*Y>+Z;dHShi)&ZPT$KqZ0m!jRa zG;Qc|p!<}SmwEx8s6r(1s#Y{cz*5eGmGkiE^D3D=!C8@E$yDRox%{e4Nk07>P20Qb zyn|30+8ohxciqpbZSR^%8Yafg-}*kXE}XbpGs$2kkG_R0~V+@Qlv5M_eru` z(JmBDsU_D-c6R9vN#2C=o~!fZvu@7~*Q)WJFZs7tNsE#Xx zW5`uxQMI9)O1mo#Dg;Y~o2s2o8wAvq8rNJU1}BxO+6S98nwuV9;?QB=lk7 z*svba*Fh&OuZ2^!YzFfXy>m{2;u{BW5Cg_6SjwrB-1e+uDK@S)W}2ttUF5BJrFU|I z?g@&%eKn;7qH5p|LEy?z1}8qTiN-SG*;xPAvGq>5S08cx3)gkG z77_#5k!jpQiRWXTv!IzhxutHH%y|6P#FRtZ@%Ho3m(ItyH!8~r+{1q9_a8W)Vh@(I zslR++vMbYPd;bj$_>EmpR6T+i>OkZl%MewdS^ENV7UmAV1&(CS0C(nC@}5(QnI=Ud(%l*y)wDEt7ojva6#fw+)X5r0#DE z83WTe)vJmm4n{i3)Yo^m@28ME89w{DW8XojB7B`Rd&|jbH3pnE57SLM^j>n0b4AvoyMV$%uMeoc$yd+ zTRK=c<_`CuZU2SAoEB1oDQ`2*<+=M@i`&nuKod1qF-Jp!C1F!9J;$1;8K}QJAYj)w z?q9AKg%_K@?&EDX`Dv{lD}iI(XKvC?$vboBPI1h!vk@-iO$i|%-QlNp&$16y=yG$uuw(7E_G`QD1 Date: Mon, 27 Dec 2021 19:07:10 +0100 Subject: [PATCH 277/476] Delete TeatimerHelp.jpg --- apps/teatimer/TeatimerHelp.jpg | Bin 5125 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/teatimer/TeatimerHelp.jpg diff --git a/apps/teatimer/TeatimerHelp.jpg b/apps/teatimer/TeatimerHelp.jpg deleted file mode 100644 index e22960c668b2e7e1b783163274d6c80cc3c90416..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5125 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 Z!0XbiQ=eYi86xsdy&oXAAyW26{|hcX0fqno From 9084865501c9356a8f8ead9ad8db8a54bb880dc6 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 19:07:21 +0100 Subject: [PATCH 278/476] Delete TeatimerRun.jpg --- apps/teatimer/TeatimerRun.jpg | Bin 3981 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/teatimer/TeatimerRun.jpg diff --git a/apps/teatimer/TeatimerRun.jpg b/apps/teatimer/TeatimerRun.jpg deleted file mode 100644 index a442d12a577e17b2335a4a5d6be07c6eb597f27c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3981 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 z Date: Mon, 27 Dec 2021 19:07:29 +0100 Subject: [PATCH 279/476] Delete TeatimerStart.jpg --- apps/teatimer/TeatimerStart.jpg | Bin 4245 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/teatimer/TeatimerStart.jpg diff --git a/apps/teatimer/TeatimerStart.jpg b/apps/teatimer/TeatimerStart.jpg deleted file mode 100644 index 4fa8f2fc49b04d4a40328b8cd227a60c958e2325..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4245 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 Mj|KVpyVpkl3!DOAqyPW_ From 5e6b6b03b56451cabb1bee090fb033b7292de427 Mon Sep 17 00:00:00 2001 From: ThFGG <96580062+ThFGG@users.noreply.github.com> Date: Mon, 27 Dec 2021 19:07:36 +0100 Subject: [PATCH 280/476] Delete TeatimerUp.jpg --- apps/teatimer/TeatimerUp.jpg | Bin 3737 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/teatimer/TeatimerUp.jpg diff --git a/apps/teatimer/TeatimerUp.jpg b/apps/teatimer/TeatimerUp.jpg deleted file mode 100644 index 80b8c3c8abdd8bce55727722ab9bcf782a5f6b65..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3737 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 Date: Mon, 27 Dec 2021 19:08:05 +0100 Subject: [PATCH 281/476] Add files via upload --- apps/teatimer/TeatimerHelp.jpg | Bin 0 -> 5125 bytes apps/teatimer/TeatimerRun.jpg | Bin 0 -> 3981 bytes apps/teatimer/TeatimerStart.jpg | Bin 0 -> 4245 bytes apps/teatimer/TeatimerUp.jpg | Bin 0 -> 3737 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/teatimer/TeatimerHelp.jpg create mode 100644 apps/teatimer/TeatimerRun.jpg create mode 100644 apps/teatimer/TeatimerStart.jpg create mode 100644 apps/teatimer/TeatimerUp.jpg diff --git a/apps/teatimer/TeatimerHelp.jpg b/apps/teatimer/TeatimerHelp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e22960c668b2e7e1b783163274d6c80cc3c90416 GIT binary patch literal 5125 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 Z!0XbiQ=eYi86xsdy&oXAAyW26{|hcX0fqno literal 0 HcmV?d00001 diff --git a/apps/teatimer/TeatimerRun.jpg b/apps/teatimer/TeatimerRun.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a442d12a577e17b2335a4a5d6be07c6eb597f27c GIT binary patch literal 3981 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 Mj|KVpyVpkl3!DOAqyPW_ literal 0 HcmV?d00001 diff --git a/apps/teatimer/TeatimerUp.jpg b/apps/teatimer/TeatimerUp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80b8c3c8abdd8bce55727722ab9bcf782a5f6b65 GIT binary patch literal 3737 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 Date: Mon, 27 Dec 2021 21:08:27 +0000 Subject: [PATCH 282/476] touchtimer: add actual timer functionality --- apps/touchtimer/app.js | 134 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 128 insertions(+), 6 deletions(-) diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index 534f4d62c..c0da034b7 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -13,7 +13,7 @@ var main = () => { var button8 = new Button({ x1: 60, y1: 107, x2: 116, y2: 140 }, 8); var button9 = new Button({ x1: 118, y1: 107, x2: 174, y2: 140 }, 9); - var buttonStart = new Button({ x1: 1, y1: 142, x2: 58, y2: 174 }, "GO"); + var buttonOK = new Button({ x1: 1, y1: 142, x2: 58, y2: 174 }, "OK"); var button0 = new Button({ x1: 60, y1: 142, x2: 116, y2: 174 }, 0); var buttonDelete = new Button({ x1: 118, y1: 142, x2: 174, y2: 174 }, "<-"); @@ -40,18 +40,18 @@ var main = () => { button7, button8, button9, - buttonStart, + buttonOK, button0, buttonDelete, ]; - var buttonPauseContinue = new Button( + var buttonStartPause = new Button( { x1: 1, y1: 35, x2: 174, y2: 105 }, - "PAUSE" + "START" ); var buttonStop = new Button({ x1: 1, y1: 107, x2: 174, y2: 174 }, "STOP"); - var timerRunningButtons = [buttonPauseContinue, buttonStop]; + var timerRunningButtons = [buttonStartPause, buttonStop]; var timeStr = ""; timerNumberButtons.forEach((numberButton) => { @@ -78,7 +78,11 @@ var main = () => { drawTimer(timeStr); }); - buttonStart.setOnClick(() => { + buttonOK.setOnClick(() => { + if (timeStr.length === 0) { + return; + } + g.clear(); drawTimer(timeStr); @@ -90,7 +94,80 @@ var main = () => { }); }); + var timerIntervalId = undefined; + var buzzIntervalId = undefined; + buttonStartPause.setOnClick(() => { + if (buttonStartPause.value === "PAUSE") { + buttonStartPause.value = "START"; + buttonStartPause.draw(); + + if (timerIntervalId) { + clearInterval(timerIntervalId); + timerIntervalId = undefined; + } + + if (buzzIntervalId) { + clearInterval(buzzIntervalId); + buzzIntervalId = undefined; + } + + return; + } + + if (buttonStartPause.value === "START") { + buttonStartPause.value = "PAUSE"; + buttonStartPause.draw(); + + var time = timeStrToTime(timeStr); + + timerIntervalId = setInterval(() => { + time = time - 1; + + timeStr = timeToTimeStr(time); + drawTimer(timeStr); + + if (time === 0) { + buttonStartPause.value = "FINISHED!"; + buttonStartPause.draw(); + + if (timerIntervalId) { + clearInterval(timerIntervalId); + timerIntervalId = undefined; + } + + var buzzCount = 0; + Bangle.buzz(1000, 1); + buzzIntervalId = setInterval(() => { + if (buzzCount >= 10) { + clearInterval(buzzIntervalId); + buzzIntervalId = undefined; + return; + } else { + Bangle.buzz(1000, 1); + buzzCount++; + } + }, 5000); + } + }, 1000); + + return; + } + }); + buttonStop.setOnClick(() => { + if (timerIntervalId) { + clearInterval(timerIntervalId); + timerIntervalId = undefined; + } + + if (buzzIntervalId) { + clearInterval(buzzIntervalId); + buzzIntervalId = undefined; + } + + buttonStartPause.value = "START"; + buttonStartPause.draw(); + g.clear(); timeStr = ""; drawTimer(timeStr); @@ -235,6 +312,51 @@ class Button { } } +var timeToTimeStr = (time) => { + var hours = Math.floor(time / 3600); + time = time - hours * 3600; + var minutes = Math.floor(time / 60); + time = time - minutes * 60; + var seconds = time; + + if (hours === 0) { + hours = ""; + } else { + hours = hours.toString(); + } + + if (hours.length === 0) { + if (minutes === 0) { + minutes = ""; + } else { + minutes = minutes.toString(); + } + } else { + minutes = minutes.toString().padStart(2, "0"); + } + + if (hours.length === 0 && minutes.length === 0) { + if (seconds === 0) { + seconds = ""; + } else { + seconds = seconds.toString(); + } + } else { + seconds = seconds.toString().padStart(2, "0"); + } + + return hours + minutes + seconds; +}; + +var timeStrToTime = (timeStr) => { + timeStr = timeStr.padStart(6, "0"); + return ( + parseInt(timeStr.slice(0, 2), 10) * 3600 + + parseInt(timeStr.slice(2, 4), 10) * 60 + + parseInt(timeStr.slice(4, 6), 10) + ); +}; + // start main function main(); From bf345e53b8a42456b502d1a5d43a2ed450af8b5f Mon Sep 17 00:00:00 2001 From: crazysaem Date: Mon, 27 Dec 2021 21:27:33 +0000 Subject: [PATCH 283/476] touchtimer: add screenshots and describe the usage --- apps.json | 3 ++- apps/touchtimer/0_dark_timer_edit.png | Bin 0 -> 3790 bytes apps/touchtimer/0_light_timer_edit.png | Bin 0 -> 3844 bytes apps/touchtimer/1_dark_timer_ready.png | Bin 0 -> 3100 bytes apps/touchtimer/1_light_timer_ready.png | Bin 0 -> 3085 bytes apps/touchtimer/2_dark_timer_running.png | Bin 0 -> 3021 bytes apps/touchtimer/2_light_timer_running.png | Bin 0 -> 3007 bytes apps/touchtimer/3_dark_timer_finished.png | Bin 0 -> 2895 bytes apps/touchtimer/3_light_timer_finished.png | Bin 0 -> 2912 bytes apps/touchtimer/README.md | 27 ++++++++++++++++++++- 10 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 apps/touchtimer/0_dark_timer_edit.png create mode 100644 apps/touchtimer/0_light_timer_edit.png create mode 100644 apps/touchtimer/1_dark_timer_ready.png create mode 100644 apps/touchtimer/1_light_timer_ready.png create mode 100644 apps/touchtimer/2_dark_timer_running.png create mode 100644 apps/touchtimer/2_light_timer_running.png create mode 100644 apps/touchtimer/3_dark_timer_finished.png create mode 100644 apps/touchtimer/3_light_timer_finished.png diff --git a/apps.json b/apps.json index 93c5b7fcf..d457198be 100644 --- a/apps.json +++ b/apps.json @@ -5068,11 +5068,12 @@ "name": "Touch Timer", "shortName": "Touch Timer", "version": "0.01", - "description": "Quickly and easily create a timer touch-only.", + "description": "Quickly and easily create a timer with touch-only input. The time caan be easily set with a number pad.", "icon": "app.png", "tags": "tools", "supports": ["BANGLEJS2"], "readme": "README.md", + "screenshots": [{"url":"0_light_timer_edit.png"},{"url":"1_light_timer_ready.png"},{"url":"2_light_timer_running.png"},{"url":"3_light_timer_finished.png"}], "storage": [ { "name": "touchtimer.app.js", "url": "app.js" }, { "name": "touchtimer.img", "url": "app-icon.js", "evaluate": true } diff --git a/apps/touchtimer/0_dark_timer_edit.png b/apps/touchtimer/0_dark_timer_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..2160ef38db0205d4f1b11da3ac7aedaf2be61981 GIT binary patch literal 3790 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%0DEqKF<0s>QUH}Jv4ncaw+5+mSBP|NI>q31yfHM-A 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 literal 0 HcmV?d00001 diff --git a/apps/touchtimer/1_light_timer_ready.png b/apps/touchtimer/1_light_timer_ready.png new file mode 100644 index 0000000000000000000000000000000000000000..5e2ca3c9d689316ac26a112bee4c315bccc5adbc GIT binary patch literal 3085 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 oT@*^`rXZKr*~Y`-zof5BG;V)!B)-6S)@&0Km>; zcGf4iu=3v{wQXxx)O{vx0Z2PZv;xYzm1h6|6?@Fu@^lR8Yu;Sc96$~7 zV>9D(p0aU$rQp8Q!}NBCFC_w9kgz>9SC&ZOtd`;`_t$SHpQ&KK@1x*On)i7}K)2-Gs)|2zPRh2xZ=8UGr~@c6fowUEp4z!dp5eg+OSNLK7~a7zffl`Hjfx2&L2bTfM4UD*L!_km;rel6 zie;NyRptbWys_&V+lhnbpc$OM3k>*bM8Weiz&WK$LeN)Nc9lKIvkSAOaN>&u?mLTC z-DEtbK8)#Ji(H9<@ku|=!F(z@IZ4%sG-NjhkNZG1D_XS{DK8jM;Zu4`jNz3d7IXjP zL5CU(SqRH9CEPsl++T$jOYEl`@V!rb!o8s(K6q)~AZvCszPfGtzYmiNB zlEqOD@rH|RrU^IWxGT{8X!9Psjx_!CZ)U;RfR^WcGeCA}wuH=Gd5SH|;ZyQ1AdP?_btE$Yzsot0DgdZVCK z7S#UK4M z@!d~)`hCPw@S4^WE8?#FC3`wiKgKeZPG7TbH@IOv5g_63)u!u3caZGV zu!V$P8jg0CH|WQ7E}>vJ(Q?g<)%{?=3la6H zZWx=Zv0ELf}SneMoYO9){l%E3O)4;2aN^t;KH|e_U1lNmA+KJIPeN21Xm3 zeXmnygkBm@&f_Es6>iw&)n|+|SE>%a%2{{!dLLI+GkbGEvOtuoy;f^28n&?HHe9Oc zVO?o0_lG4)FI*d3U_9N)%O5{NL`snjoIODBTthsP1f(UtK}wCk`Eu$zo{&cxV_j%^3#*gKm`QC!e0SBa(vumPv0juQB9}`y}LPxEhafQsz zxS#Fo`-<=X;$A{8?`6Hx4IJ8XN44<}c?>}@k4M88Fo91tWF2LQ@m zF=rh6mss2KO*t&~r!J7{^?OZgYSNpf{Y+r9g9*8OS*O<)0Ko@0|SbKgjm3_kQNjEq3TV z3ACa{;@}zVg?NeQK#(27mDeQXG2teqw1A&1Mri- zh~X9Q>BeX}61bFRSjQKz`C7_#pMtGe7pyGi7SaJH8J7bqT3Gsz^Lm0ETd9Z3`uqNW zp literal 0 HcmV?d00001 diff --git a/apps/touchtimer/3_dark_timer_finished.png b/apps/touchtimer/3_dark_timer_finished.png new file mode 100644 index 0000000000000000000000000000000000000000..c6dd77b8288daf5b0d89f4224b716c0141a43460 GIT binary patch literal 2895 zcmcK6`9IYA7YFdqY?eWcWs++$!ekj+q|%UW%m`UxxMQ1JUCdSCTC&V#6gO%ZN|w4@ zYjlyVk-f>cEEj{Z6Vb#_%D8rl@7zD){&3#shx2&-bRN(1c&9jDB1plN-~a$f*%57A zg}vtA5)%==)h|E#3L7ZQm0$%t=O`}&fP}c6jip4-xNn>> zicer}bXicxiw}{@AcQZPaLV3ysS3rXJUT~8zPI+hj=ivU&Kg^v3 z+rYT3ShCyzXIyE!GTMC;%|4Vvv=tLkG00?6i#>=jdupShFL%8PrsNab&p5*iyf!43 zT7QOf{=MwFVcBGY5&RyU;+P3AA6ajnWal|;lRK0TgU6!JwotNY1Lus4d&Y`ct?7HO z8X#%`r<~4k^d@FrWma#zD}MXEHNO_ZjO?y1w&GVvRzn*-7~Pz844tr>_Lbzp<&9W8 z3D%+$bX=wrv;oFPd01$}@hYz;q=RjmxPTI?bfYQ*MzF|h)4?xZJ$JhRc>iRg0%V>T zctZ=}bFzif)|##x-Wh$?i#glY#E#?v6xt_(i*%d6( zIG*~vsc_9>w0N_9xS15I!RB@~SD;j}yI%o8(~j*XhOHl!qQ;JQ!E+9`QAvQ@oS(q+ zCSnj}sdVOcV?-sI4c&1Eg3cR)FzjlGCnPj?6=Lrtz1J|a-|cF8clM?J@)V)jF8!Z1 z^XjKv&$1hi_|sR@UcgZO*$q^PcOuin zfmc)AB8@TaL%=ILY3iEKq}IAekIvD)I$q^d(PnzH-=d||MuXQX?HQUIMjdU)FFtR( z+WjF{e}VU#ucLJ4pQ>zz-ALdU|BL zo6K^PJafbQht-+<$o5R;c9U>Z-cOhw($w~yqsLsWXqRBK|vkCy|`Iw71(R(bYFtL#3e+;9*4k8zIEa>*x%-3?1Q_f@%*t?k~*)9>1Xv`h3 z-J}sOj7RrbANou0x*z+fUu$-NTPuo_R&i;%$a*=p`HROx51p4`<{;#OWya-jyO3)L zH2VD)VqCSe8(494Q+a&26w4Nq%<$>iugDDCo|K{lp?Ysof<9D56So=ADEa*~K#k>H z2l0|+LKQ(OW_)|E(r~@hcQ@4i5CL;p%%RX8shUMBMx1_cM(5K^J0{d|`yo>7*G1(8 zI=x^BmC`jlPly;^QJF1Vr^MGYQA$+M@9x%4$L6+!u{X07W?veef;F1?-E~#MMzKE ziWZOb{nNdy?j;|!nCGKbg>5fwO>YGE&19R9Dny2`*y)5)JzNWfprVDP*Fp}zM}DY* z1d-&qhB!*04?fIGRTrvWHk;G!O$bHD;R4)KgQfKI8|T#$G3b&B;vm=lo!pGRcCfLZ zG$mP@`5Tz#0wBB~HH%5wdy)*S=LWtDqFD5->p+rTdP^}S;b&6=P{Vh8XC+F6bsuYb zZ9dZ+62z2UVPCjcSYX$}D6KD^xurwTxTFlKX$ULe>7q9pCdU+Vy3E1cbGBqfgupkb z%|SE{PU){odg^(cosR!ds{*PCchpRXXU?w~)nr<@jVtb2R?k1b!b-&dx~zbjff>VC z02U=h9w=s6G)D%{BPe`74KGy;`%q7cT6j}bu%w9?O&|mexC9K-GO-Gzm;}~G?TCe? zBaDxY8tkQW3d=>vj8(Mfb#xd`KUB8Th$)l*j?*-wme|>dhjI$R2q7CW1*)1O2>b`e z3`NkipsTr+q#6rRJl+UbE(Abn&KV|Lc{H2K9S%(dL(f{_r-+y7K$)FW*MA%S)*^%8 z1m1!7xmtXqKKn6^nhm$n6i9_68cr2}kHH%cGqM>4%ManoaDkZRk&8M43Ch7Kr{$QN za=7ZD2CdD>H1F#qZ+@)QR$_(|Fp78B76x<%Kla~N4BhAOzNx}z1q3+0PunvY2SN$+*MK> zTKztEOJkaN;KY~|nX~Tmb!kO!!Z+U(@6hS?A!}vZ)K~PAknPEo#qIt z!Z+=+rp~D!16B6mO?g3A#{$n6zQ8;zHLbx@ZXjZ{Idy85QA|P@?@G$#sV*De!4fVI z+gw0;Ro+2Hs)9r9CG7jM&XIN1y5uO%{mC7_H1jpFBWW7`y~@rVTK~HU!8QMwOwuW; zLCo9=zeQW^$jZ?TD`JgJ=)gi&VM{5+Ha0(r*N8Y?Uy%j8zW!tw9cSAQOtc6}a!UBR zQrNH;WZN`-(VB3nQQ0nui@jxU{f(6$m@PMLE*QvKR98I!0xT+%=2O06-j2jhS{K%0 zT}L8E8tVY2ufM;tmbz#9ZJUY4y^IwEr9@jFCAZu0;%|i2<-g!F+vIGG_(C(;E6=7? zL;4tefxb_%sv!xq-44+g4{_r&>el_~6$$qAjL7g~Mir2kre*Tv)$2MDbAP3$ZD=0K zmgzRIk`ci6O{W)zg?Tt_e>>p~Dg|sM&NLSec5v$ze&&;DJ&Q{u)la>+Tmv#K8|*p! zdhiBPLAUOS-MAOmW$w7q9_k7;p@7^5z6%WanjhKcnlNtG2a45G1{V`LrpahoK{+y5$)gV92g?MKwWqLjg8m=6 z&c?faX}ePBY|$O56Q_R12~Fm2Z73H2pd&IFn16&Oqo;<$=t7egHjlf7CizsS0gwGZPhphS-#({5N4AI^_B=R3XYC!SB_j-JAf^A}|O}gD6w(W6CY=fe%5G X`E_qF+2$_7A2MKvzhv{=igNq^PSH5E literal 0 HcmV?d00001 diff --git a/apps/touchtimer/3_light_timer_finished.png b/apps/touchtimer/3_light_timer_finished.png new file mode 100644 index 0000000000000000000000000000000000000000..18ee015e3e3208e76d93529362264363238f6ab6 GIT binary patch literal 2912 zcmcJR_fwPU7RTSb2?j#Bbdec5ZR0e)sSefH!F?7B1F5~%7^SOfrJc{`ki3(51#qrY-zv_x=({eAq7 zdv`i{T&!eBK=@NZXU!nJULs$0g}KU){ckjs^aXAjaFC(!`lj}A#5W#~hgY{R`e6a8L*N*{h=MBg0lO<=A57h@UW)=#B!c;T*d85X8JlJKMW>v(i}huB{0Y^?;t&`H-#*Efn14yRbjN0joCW|9rSd^@SgxrP%^+@*WWtjYSKVu=pdX228|xY zvhL$Hi~4_I#am2^hTJF?2A(xNqm6~^^Jp)ny!9N3Fz`|fMWhJ0moS79=MK&Kt|9V8?z=)j z-chC7zp{TTsRt3wQQzfEVd`+Y42Dhb>EsF>Kcv9`U`H>TA0R;8*dPJHh{dnEB=GEk z|Fw>VQ8R7guDbLmZ?^PtPHmnfcX{|_dijv|ZcJPMY^UI6wLVM|IdzvEJQ?HEb%fiu z+serc+1xHwEVg|tYpk}6y9+k&|lQHvfQ^f_4N``r>)HV>%brfmZNt=% zmSO{oOtX0nBm$AKVryC?cKX@#j+MaaGVMok!le>lg#eZ6OVQZ7>Epx02UEL!PouoQ zl!qCz7yxzYnIIrxA8#Nik8wpdU+iHtiQ{2eYByw;owV;GkN*b7E%)b>YeVvjWl)D`fzB{)Zmvf(SCMTy?Syvwfw>EO!$D5y2|z_);7FNmQ|5MI zis)y>_ljRDZ_mkzez5T!c9u$uSB)VA;DhVc*j>xkZ)(8tjnklg;!7~UqxfyR^!2%S zk)Jm_bK1fK@sbT}y@H9h#7i{yK5LtP`N4RGEb7Y(!=WJZ&ZYPu--clE_pch!ZcDG~ zOd>XOUx9KaYsKNeikVdV+Z;x}hRcp!FsP6j!eOs1O-Mc9X^6d{1u&njGd{hQI?1{- zfJl=5MTi)e(pvVzdNyN@2NPNUR6~FWD2z`C@X^%KdNm_)HOdWlyYTf54w)Xy!NRmW(*6x$={N*e^_)I`P9|1d{+mrLP+$}b8FKV`+^ zdO~@Ey}nAY#b$hgoWxpDNSgz)UD*5mA9tR(DY7%|rfZa7)lp|P5^iOD+BU1ck9Fb5 zeYc=}>hozxvc9$`gT5?aAkY9DxhhKJlr>;mV#22-yyuzO3~?#$)Oo9dr!+XJJ||^~ zUDh`Lv@Xc}OfE{>j7_|j({e2eX>*OD%3d&+S$r&;#l*OUVth^i6)9P%-y~i%POX{H zN$O~}Mo>#Z2|h1^GC?X1Fz}(e85*yFg;ZS1GYt4N6l_K*lmalSW7dfwX$(7PXgD$n zM4Ym;9=($rnyy=D#IRvLe-Jw-Ftvc04)X$O8}4Kz2z^)~-om7V)4{jN_ zK6=OW05>nc?J>z>NoI*^r$3ArNa=wsCtQ_*%#7;Qdn#FiYe|OX7bp%ehV_fxhOrxV zdZ63AwE9j?N9ACQWsrlqeYAHPdrW!T<)I%waZR2!_vWo+onLw?tHgp1+m5ne+;qCr zaMltrohzH0uj5-!w3#G87KSRQ=Zi&U)s7~A7qLPWAbW3q>asqtea=) zyBYr;oH`>wpB?tmmlx|UikjGskP|B5xY|Mbn2)a_@Ui!Nmdut*2i(*(gH4v&YXO>~ zzkjHvs#|6vZsgRDtYr!Ba;>yUsqgIi9$Cxt&rlOPm-2L`1{8&A{`?|-%D-dd>oIiM zVO>|)P74?=6yY+TUR$Tf{=ima+nN|p=s$-y8COUX!^5?sxz94Gn;QG#6*`R#DH6cW zIYPZ|=_6Auf4iAp9v!d|K51M!@M@?|#&7--rF(9{4W1$N*?Go{BpogRz|0` z(5};C$dxOvzl-(>N-QB(Moq~AWr=YpIiZMf<;OQlE}Izp+f(W~@54vV@8tm7pChq{ zXRV+Bf>LsP&>@>VcY`GNb_iO=*kG9{Pb@ SxW!+Y0Xyq+xGGEU#Qy?`Jv?>* literal 0 HcmV?d00001 diff --git a/apps/touchtimer/README.md b/apps/touchtimer/README.md index 99c755639..b54ed4b1d 100644 --- a/apps/touchtimer/README.md +++ b/apps/touchtimer/README.md @@ -1,3 +1,28 @@ # Touch Timer -Quickly and easily create a timer touch-only. +Quickly and easily create a timer with touch-only input. The time caan be easily set with a number pad. + +## How to + +- First input the timer time via the input buttons +- If you need to correct the time, press "<-". +- If the timer time is correct, press "OK". +- If you have accidentially pressed "OK", press "STOP" to go cancel. +- Press "START" to start the timer, if the time is correct. +- The timer will run the time until 0. Once it hits zero the watch will buzz for 1 second every 5 seconds for a total of 10 times, or until you press "STOP" + +## Screenshots + +### Light Theme + +![](0_light_timer_edit.png) +![](1_light_timer_ready.png) +![](2_light_timer_running.png) +![](3_light_timer_finished.png) + +### Dark Theme + +![](0_dark_timer_edit.png) +![](1_dark_timer_ready.png) +![](2_dark_timer_running.png) +![](3_dark_timer_finished.png) \ No newline at end of file From e40648ac3b93b2957b9fb14a6f3a34cfed70bfc6 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Mon, 27 Dec 2021 21:28:44 +0000 Subject: [PATCH 284/476] touchtimer: disable debug output --- apps/touchtimer/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index c0da034b7..ad8eb42ae 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -1,4 +1,4 @@ -var DEBUG = true; +var DEBUG = false; var main = () => { var button1 = new Button({ x1: 1, y1: 35, x2: 58, y2: 70 }, 1); From c21622015386328119c063e8c355030ad4c21b60 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Mon, 27 Dec 2021 21:30:51 +0000 Subject: [PATCH 285/476] touchtimer: fix typo --- apps.json | 2 +- apps/touchtimer/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index d457198be..01ad2eac4 100644 --- a/apps.json +++ b/apps.json @@ -5068,7 +5068,7 @@ "name": "Touch Timer", "shortName": "Touch Timer", "version": "0.01", - "description": "Quickly and easily create a timer with touch-only input. The time caan be easily set with a number pad.", + "description": "Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad.", "icon": "app.png", "tags": "tools", "supports": ["BANGLEJS2"], diff --git a/apps/touchtimer/README.md b/apps/touchtimer/README.md index b54ed4b1d..c8bc2c084 100644 --- a/apps/touchtimer/README.md +++ b/apps/touchtimer/README.md @@ -1,6 +1,6 @@ # Touch Timer -Quickly and easily create a timer with touch-only input. The time caan be easily set with a number pad. +Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad. ## How to From 29b231bf6582b3931e5e3e7cbc1d85da71c3f46c Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Tue, 28 Dec 2021 12:36:49 +0100 Subject: [PATCH 286/476] Remove wrong parenthesis --- apps/qrcode/custom.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/qrcode/custom.html b/apps/qrcode/custom.html index 4920be655..bf95f261b 100644 --- a/apps/qrcode/custom.html +++ b/apps/qrcode/custom.html @@ -294,7 +294,7 @@ g.clear(1).setColor(1,1,1).setBgColor(0,0,0); g.fillRect(0,0,g.getWidth()-1,g.getHeight()-1); g.drawImage(img,(g.getWidth()-img[0])/2,(g.getHeight()-img[1])/2); ${ document.getElementById("hideDescription").checked ? '' : `g.setFontAlign(0,0).setFont("6x8").setColor(0,0,0); -g.drawString(content,g.getWidth()/2,g.getHeight()-(g.getHeight()-img[1])/4)); +g.drawString(content,g.getWidth()/2,g.getHeight()-(g.getHeight()-img[1])/4); `} g.setColor(1,1,1); `; From e4eea377d7da6f568cd79f9f5f8ca095205d5c44 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Tue, 28 Dec 2021 12:37:21 +0100 Subject: [PATCH 287/476] Allow changing qr code brightness on touch --- apps.json | 2 +- apps/qrcode/ChangeLog | 1 + apps/qrcode/custom.html | 12 +++++++++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..364c68943 100644 --- a/apps.json +++ b/apps.json @@ -1148,7 +1148,7 @@ { "id": "qrcode", "name": "Custom QR Code", - "version": "0.04", + "version": "0.05", "description": "Use this to upload a customised QR code to Bangle.js", "icon": "app.png", "tags": "qrcode", diff --git a/apps/qrcode/ChangeLog b/apps/qrcode/ChangeLog index edcc41cfd..6d9cc0569 100644 --- a/apps/qrcode/ChangeLog +++ b/apps/qrcode/ChangeLog @@ -2,3 +2,4 @@ 0.02: Add posibillity to generate Wifi code. 0.03: Forces integer scaling and adds more configuration (error correction, description, display) 0.04: Allow scanning of QR codes from camera or file +0.05: Change brightness on touch diff --git a/apps/qrcode/custom.html b/apps/qrcode/custom.html index bf95f261b..7ae3eb3af 100644 --- a/apps/qrcode/custom.html +++ b/apps/qrcode/custom.html @@ -72,8 +72,10 @@

Additional options:


+ +
-
+

@@ -287,6 +289,14 @@ } var img = imageconverter.canvastoString(document.getElementsByTagName("canvas")[0],{mode:"1bit",output:"string",compression:true}); var app = `var img = ${img}; +${ document.getElementById("preventBrightnessChangeOnTouch").checked ? '' : `var backlight = 0; +Bangle.on('touch', function(button, xy) { + backlight += 0.3; + if (backlight > 1) backlight = 0; + Bangle.setLCDBrightness(backlight); +}); +`} + ${document.getElementById("boostBacklight").checked ? 'Bangle.setLCDBrightness(1);' : ''} ${document.getElementById("stayOn").checked ? 'Bangle.setLCDTimeout(0);' : ''} ${document.getElementById("hideDescription").checked ? '' : `var content = ${JSON.stringify(content)};`} From abd761bff9f4d45f08388cf876e0b3f5971b3e5c Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 13:43:23 +0100 Subject: [PATCH 288/476] Minor improvements --- apps/lcars/lcars.app.js | 54 +++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 5f328389e..29c349fe9 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -128,25 +128,25 @@ function printData(key, y){ if(key == "Battery"){ var bat = E.getBattery(); - g.drawString("BAT:", 28, y); - g.drawString(bat+ "%", 70, y); + g.drawString("BAT:", 26, y); + g.drawString(bat+ "%", 68, y); } else if(key == "Steps"){ var steps = getSteps(); - g.drawString("STEP:", 28, y); - g.drawString(steps, 70, y); + g.drawString("STEP:", 26, y); + g.drawString(steps, 68, y); } else if(key == "Temp."){ var temperature = Math.floor(E.getTemperature()); - g.drawString("TMP:", 28, y); - g.drawString(temperature + "C", 70, y); + g.drawString("TMP:", 26, y); + g.drawString(temperature + "C", 68, y); } else if(key == "HRM"){ - g.drawString("HRM:", 28, y); - g.drawString(hrmValue, 70, y); + g.drawString("HRM:", 26, y); + g.drawString(hrmValue, 68, y); } else { - g.drawString("NOT FOUND", 28, y); + g.drawString("NOT FOUND", 26, y); } } @@ -167,14 +167,14 @@ function drawLock(){ g.setFontAntonioMedium(); g.setColor(cOrange); g.clearRect(120, 10, g.getWidth(), 75); - g.drawString("LCARS", 130, 12); + g.drawString("LCARS", 128, 13); if(connected){ - g.drawString("BT-CO", 130, 32); + g.drawString("BT-CO", 128, 33); } else { - g.drawString("BT-NC", 130, 32); + g.drawString("BT-NC", 128, 33); } if(Bangle.isLocked()){ - g.drawString("LOCK", 130, 52); + g.drawString("LOCK", 128, 53); } } @@ -196,16 +196,15 @@ function drawState(){ timeInMinutes % 4 == 1 ? iconMars : timeInMinutes % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 120, 118); + g.drawImage(iconImg, 118, 107); // Alarm within symbol g.setFontAlign(-1, -1, 0); g.setFontAntonioMedium(); - g.drawString("STATUS", 123, 97); if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); - g.drawString(getAlarmMinutes(), 120+25, 118+25+1); + g.drawString(getAlarmMinutes(), 118+25, 107+25+1); } } @@ -225,11 +224,12 @@ function drawPosition0(){ drawLock(); // Write time + g.setFontAlign(0, -1, 0); g.setColor(cWhite); var currentDate = new Date(); var timeStr = locale.time(currentDate,1); g.setFontAntonioLarge(); - g.drawString(timeStr, 25, 10); + g.drawString(timeStr, 70, 10); // Write date g.setColor(cWhite); @@ -237,9 +237,10 @@ function drawPosition0(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 28, 56); + g.drawString(dayStr, 70, 56); // Draw data + g.setFontAlign(-1, -1, 0); g.setColor(cWhite); printData(settings.dataRow1, 97); printData(settings.dataRow2, 122); @@ -296,21 +297,24 @@ function drawPosition1(){ // Plot step graph var data = new Uint16Array(32); health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); + var gridY = parseInt(Math.max.apply(Math, data))-1; + gridY = gridY <= 0 ? 1 : gridY; require("graph").drawBar(g, data, { axes : true, minx: 1, gridx : 5, - gridy : 5, + gridy : gridY, width : 140, height : 50, x: 5, y: 115 }); + g.setFontAlign(1, 1, 0); g.setFontAntonioMedium(); g.setColor(cWhite); - g.drawString("HRM", 122, 9); - g.drawString("STEPS [K]", 90, 96); + g.drawString("WEEK HRM", 154, 27); + g.drawString("WEEK STEPS [K]", 154, 115); // Plot day } else { @@ -334,21 +338,23 @@ function drawPosition1(){ // Plot step graph var data = new Uint16Array(24); health.readDay(new Date(), h=>data[h.hr]+=h.steps); + var gridY = parseInt(Math.max.apply(Math, data)/100)*100; require("graph").drawBar(g, data, { axes : true, minx: 1, gridx : 4, - gridy : 2000, + gridy : gridY, width : 140, height : 50, x: 5, y: 115 }); + g.setFontAlign(1, 1, 0); g.setFontAntonioMedium(); g.setColor(cWhite); - g.drawString("HRM [24]", 90, 9); - g.drawString("STEPS [24]", 82, 96); + g.drawString("DAY HRM", 154, 27); + g.drawString("DAY STEPS", 154, 115); } } From ee63b2630ef8c7bbea9d8cb6d60b140416d33d44 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 13:50:48 +0100 Subject: [PATCH 289/476] Week - k steps, dax,steps. --- apps/lcars/lcars.app.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 29c349fe9..f9fc37ee6 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -297,7 +297,7 @@ function drawPosition1(){ // Plot step graph var data = new Uint16Array(32); health.readDailySummaries(new Date(), h=>data[h.day]+=h.steps/1000); - var gridY = parseInt(Math.max.apply(Math, data))-1; + var gridY = parseInt(Math.max.apply(Math, data)/2); gridY = gridY <= 0 ? 1 : gridY; require("graph").drawBar(g, data, { axes : true, @@ -314,7 +314,7 @@ function drawPosition1(){ g.setFontAntonioMedium(); g.setColor(cWhite); g.drawString("WEEK HRM", 154, 27); - g.drawString("WEEK STEPS [K]", 154, 115); + g.drawString("WEEK STEPS [k]", 154, 115); // Plot day } else { @@ -338,7 +338,8 @@ function drawPosition1(){ // Plot step graph var data = new Uint16Array(24); health.readDay(new Date(), h=>data[h.hr]+=h.steps); - var gridY = parseInt(Math.max.apply(Math, data)/100)*100; + var gridY = parseInt(Math.max.apply(Math, data)/1000)*1000; + gridY = gridY <= 0 ? 1000 : gridY; require("graph").drawBar(g, data, { axes : true, minx: 1, From 90d1df2ca068616fe72c3158492be745cb463bed Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 13:51:18 +0100 Subject: [PATCH 290/476] Typo --- apps/lcars/lcars.app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index f9fc37ee6..aea7c60d2 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -314,7 +314,7 @@ function drawPosition1(){ g.setFontAntonioMedium(); g.setColor(cWhite); g.drawString("WEEK HRM", 154, 27); - g.drawString("WEEK STEPS [k]", 154, 115); + g.drawString("WEEK STEPS [K]", 154, 115); // Plot day } else { From f7256c011d8cb825b1525e8453325f0c9abdaea5 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 14:08:45 +0100 Subject: [PATCH 291/476] Show planet for one hour instead of one minute. --- apps/lcars/lcars.app.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index aea7c60d2..9b2ef59c6 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -185,16 +185,17 @@ function drawState(){ g.setColor(cWhite); var bat = E.getBattery(); - var timeInMinutes = getCurrentTimeInMinutes(); + var current = new Date(); + var hours = current.getHours(); var iconImg = isAlarmEnabled() ? iconAlarm : Bangle.isCharging() ? iconCharging : bat < 30 ? iconNoBattery : Bangle.isGPSOn() ? iconSatellite : - timeInMinutes % 4 == 0 ? iconSaturn : - timeInMinutes % 4 == 1 ? iconMars : - timeInMinutes % 4 == 2 ? iconMoon : + hours % 4 == 0 ? iconSaturn : + hours % 4 == 1 ? iconMars : + hours % 4 == 2 ? iconMoon : iconEarth; g.drawImage(iconImg, 118, 107); From e75960ab116cf0278ab2833175cf79baafccb5f6 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 14:18:35 +0100 Subject: [PATCH 292/476] Updated icon and screenshots --- apps/lcars/lcars.icon.js | 2 +- apps/lcars/screenshot.png | Bin 4813 -> 4746 bytes apps/lcars/screenshot_2.png | Bin 2802 -> 3027 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/lcars/lcars.icon.js b/apps/lcars/lcars.icon.js index c404728e0..49694cf7c 100644 --- a/apps/lcars/lcars.icon.js +++ b/apps/lcars/lcars.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgeevPnAQsc+fPngCE+/fvoCEvAbIA4/AgFzEZwRBjwjNvBUBEZ3eCIMOEZtwCIMBEZuARYU5EZecTocHEZf0CIcBEbvgaggjKTwIAEbQpoHAAiSEeoYQHJQr1CCBJKEIgcBI4xKFaIdt3AOFgfuAYMeEYLRBj1pLQ4ICuYjBAgPbtoRHhu3AYN5VoMGzVpI49502AgPPVoM27dsK48N23cgE5CgOmzVoCI4LBzCSB8EP2wjJgILBAYMAhIjBsAjJzVwg47C7YRJEYhfBEZXmEZ53CI4q2BEAiVCkwjCNYaMGboQjDkBfDCAbdB04EBgyPDC4YAD/dt2wRCHIM5njXCCAcHboOmCIQ0B5/nfYT6DFIIjBeAcOvM8+EAjitFEYJEBAANzEYOeeowjCFgUDzwjB+YrDgAgBEYWcA4Mc+YjCvAQCgftEANuDIYOBEYXPNwIAIg4OCCgXkCBEOEZDvBEAhEB4AjF/inB8+OJQOOvILBoAjGU4IFDAQYjGbQIdCAQt4EY0DEZACDEYceEZACDC4bLBEZwCO")) +require("heatshrink").decompress(atob("lmy5YCFi1ZsuWAQgGGy1YgXbtu2AQgjH4EAEZ2XCINbEZxRBvIjNzwRBh4jN2ARBgIjNwCIClojMTQcFEZdkCIgjLngRDg4jLsDREEZOzTwIAEjwjHs5oDAAiSEEYUcCA5uFeoQQJAAP2EYRECgJHGJQrRDps4BwsD5wDBrYjB+AXBtJaHBAV5spoC6dNGY8NmBBBEYMAg2atJHHvOmwEB8qtBmnTpgjImncgEtkEB02atARHBYOYSQPgh4jKgILBCIMAhIjBc4ojEzVwCII7B6dAEZpfBEZXmEZ53CI4twEAqVCkwjCNYaMGboQjDUgIjGboOnAgMGR4WgC4YAD+dNmgEBgg5BluUa4QQDg7dB0wjCJoNl2z7CAQJBDEYLwDh9tyxEBjitFEYJEBfwQjB7z1GEYQsCgfbEYNZT4ggBEYWcOIVZEYPbtAQCgfNEANODIYOBEYVlDQQAHg4OCCgW0CBEKEYySBg4gFi1Z4AjFWwM922OJQOPtoLBoBHGgPlAoQCEoAjGgIdCAQto+wjFhIgFAQwjDrYjIAQYjDEBQjFARwA==")) diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 98bf50546ab06532dbee2dcb58524a138c9ed9f2..11695ba5b05a6a6885ad9bdc7203fed50853e4bb 100644 GIT binary patch delta 4740 zcmV-~5_|2`|$g1%iRSEE(loVu4`bOUy1;`Uy+8zxO-hjMO&6F>pS3wF5?hp|(s7^EG{t z!22_B0p!IT!+$Yw&EQkOx)Xp=@Gb-A2;hb9KL=wNa^JtFYE_4OEpo*>@AMS+C^F9r5IT@GTdoD`%e$bVgk0d(M2K3`7& z*Y-gJzV=;nYozZI1Lw@jF>MY$j-mJepDHJBhqf}TE`P*DIxxyMHEh`$z@B|T0P5{t z?Vv^&cxTj1h!2dY565bHl@E+A`z6c0#*8Ip)=V6vzDohTE&q}VA*psL z$Wb4eliaxcoc%BJfky>!Ez6bUNAsZR(8+cLaRvq^$1TZ^sucSHGEKVE*7VC%h+Y8x zuph#1--!I|dLRs1lOF{pn$8ShM+Qy@y067|MkF=*WuDqmEX-dr_-R#70`TJhIUT8_PJwZ1 zK@KVo{K&Sjv`HczxlG4=S^%emJ0kfulT7X8W5UB(w>BLh4SOV!? z0h}{z?Fv=6FscW2O3U@gHw^>N24KoPxPJ=39zbhV#xyEK0Js%I#x8dX6+&|nwC|on zRKk*$JT3a7T^rKAbM`|vFZR4rASsQ{6b!5ls`mZy0L~7h=K+)!$guz>&R9sG&R>Yq z4)RR16Q==G`~G+UZ<2s^&<44q_9JU1>IR|*?>laY{=3(6dj>|piKOuYvBe$uE`Oi+ z3Ah%0K@P2_5*NaZxg?fP4rE78+JXB5_+yddMg{PIAG6%7^pAFphKtAGBhkCp1_0Fy zk3L8mZxa9y!ob=JK-oJOII~I#0DqQE;wqCiVJvkv0kE)np&iJPRxawIClc5pr_iQl zV5=+Oy;)!Z<1j7+!@%6*BXN%m-c!UZ84Gdkz*dV* zm|jyCw9{(Z_cTz`q&lm41He{`O_*L{VCgkV^!X`Deb6QiYUaxTENzYM->B!IxF=IT z9Y*9ONm477+iJ^1>ZNRg4ziX`0uyz?QhPRv+DYRM_8gM|qkpxhWFQd+M$Rrs?g4kSvhEh;>-GLyj#r2`HQ}3{C5=JYc3pzj zd6qMjRetIC*4`r~%q?#+8W%o|4*dHwON= z8C2jGKJaE03UHPPodOG@$4Vf+Er6YUU{nY8a3db&1LuA>CCgcLV5CfhfiB|o=nvkcyp_l?T6d$#9g66q)~s$ zz7{nA1+S${4ZKuYrHmy>T#^pFgUtd?3+PMx^Ed{Uf=0@vK>TWsSv@7PrY?l?tdw@z z%yQtz{WRJWcj7qqEdj7aIY1|m#PZ05va*?W-nZmC@_&4kb`BZo$IuMC14>d1ECb4c zt)~1L0E_@dOVetnO{;fk6@qGf&2dU3h(Z*Dv|Y7jqOJj&P8;yqz7NU3d9bw`UHbXh z+%3?8t@Qh++|rE`tM9Aka0PJJOC**54i@-%7h-iK{FvD5w)0ixAm>%rX&-jG3OA>RO+5YK z4im6x704SclLIAwshm%*bRUkj`Nb_&>nd3^^bO4BXyUan&} zouEXbV!cU`A}oMgV7(I;42)YWQVwN-t_+O6fq*>Mlv~mA#FS+Ow3j21=c+#SaqWv2 zcPyiEPTQ4%O8}e?K3YbdS-!bT0BmVv0Drh{q%L7#>U}fm*(i#=dJTLHfRT6BdiA3Y zCgbM5gn$&#d_`Vc-BT{|ogI+}WnuB@8U75GWgYy9>G5JQ$dps9GOe_ss^8 zu~T2dz@r1$3NXnZ&x10=cMkyLlV&Og_8NE(0CPhS0LHe9YzZ61|@KkeGbrR3ip6X+5KMx%3S;8Dw4H9HWo48+RNT=Rmz* zsNQ~oeh0sY{iQN4@qq)t=OM{Kd?k2mnU~Ao0?hE!QY|WvGVf;r?($CFlYbn& zZe`gUmaDo6l|FF`w;}+1L!h;6^1+;&Py3BSKG&kYXP9?Y2zEEJ^1S*G0QR!v1m%3e zxPkQu%<9yLmOgO+cmm+{>_X~hJAAdX^!s)652MWftz!!WO=sGcQ4HI`~U{0`?cB80o)RD{- z9<>_*=*9xK3#aARzK;p@O@&zH2==j-L%I0;kLBUL>@Uf`PoC2Lc4c5INK>iiY=iYF zL9Wa_Z;4^ht=%-8cCRmO4_ban+bwxM*xInP{@a;xJvKYKGH}jT6n}f6|KBmow;8Uz zHDMcA?8*F%zOAhHx<4nbZd5siXC=D&z`0Y8zB)-o?VKNN zUE(w-Xyr*0E-$;a^r!WOXU6YA9g%@KUpMn{HJ=t`Zlph58GrcbSfUMT_rr3~=l&A~ zZZ98818>?kt{+@m@^*XpgUEoNL7bd2+cmXsqfdJ8F1>M+0d2#f4ufh2S8jI()<9h9 zLU3${8k9lfo$CIe)d`{TBUSuQsRUbY);};64qqYQwofr6ssF%AXa$tU3Vb!N(RJ;clFC z=Da+Pp$puJAsBcx09zQ+Iw>i?x^{wjGTRB%MBuj6N1bul8j|Y1>8hHl8eVM<1|}?t zfRbAQG=OT~y$04&P6-pA82B87908!FI^^FiZGQvhf(nOPj$h?o=I7dDLdX*NuOuGCQ@(#r9U#?FG*mj?I zNy}_{Ab;ghX}U6SX(O-5r%g1iO<}!7|R^m5xFmS2mZkUhtbqzN$@~iY`pZNEpyM=*E zOd1SaVzmkKoR2d8Ug*rbSmOgrr`k%@ha;}o{D1ceh9tUxT7c7Cc{PGM@FV-YY2b>g z9BBK~bn&oBiPa{^V`aWYFcWs)Fq53!3oIX>Dgaz-!5ikUxqZxa_q1t2T;SAHkP=e{ zfJ>}4QJ(xX+TOJ)pZ8>+%-z^_;;a`qDYJJ2uq5tN+pClzEpIQ>Vhq)3xwcdNy>g?1 zvVRBSo1$kP@<0tyA8N1qzez@879=aWT%~=o=1biRIDhZYJ5}Fzt6EOl;TSk~0W=>IVP&fUbHH){ z=KN$XzlVDRgQ+4R;u~8Sw*~X=-5ZX9DdsyGoA|a8lOs#NWqh9o;M~VQ+@So{@*YA_ zl3BsQ9Ltz|0o?JII=N+DW3rI}ocg%j#F12%l0oa8r<9Re=6+7&r$*34pBun`CUH{s3@KxSs18ih)o2>D#6R z60o&2qvj%L-*?~Nb8@xp@14pXmVwj2trWn$bYTs^t^D&l0j*VAr)J<%09yc=4~*ne zc>3q90CBf+gMo<=(>5Zs08-0;H-C_f+}`0BIMs@G#wv9oN)4|ua9*yKK3s^>k6@VJ#6Af9h`RyWgahe;x5LBcHYljfuEKNFyC)*J*3gmC-pxDEt;7w Sofwz^0000Q|F^8xt)LaR6E;TEC~f$bKMwy?UC~kx z{9b@*8h{LIGDibLON#kj|mR8f62m^bf6o>}aq7VC`{0gVh zTAYODLDP9a5LG5p4wA;xb``)524)w5Ren?>OCdKYKdpCY6rwby#Yt$M=yZ{~8fhDn zCJew14Qxd*&?rSY%4>!0mWuI#Dd-(IGWzmu3jegXy6K0d$maPzyoRua&Bku^f)lDoqiAESfMV|vC-+g0Dh*I z`hv6#Nz)75kCgjmOv;2Bb0YCuZje~{wC(9+;DZ@>DgZk)u(mTt-?7v-Eeey@@nng~ zxqqkxe=|?ikOs?XVHq?}bh;J>mOzZO4M_u<*-VCEM=fG)dCXm9H$^ zDKLa_cMvg0FebW`RnQAJzhm z)4;W?(Bj0~V4ig+j?<#8EY|`6i(zL3uw@79ppKRQi09KrAzBwxM^3@DgH{Ca5diEh zb14Q!jbX)@(Q?%37&yim1@egY&RWLQ4BX1X31A+s=xakL*rlk3b?E&z8n_rz3V&-! zhE4zr0Ipuh)LyuR0j!*bKsGz*oqgPap6MCbGA1%jTV=F7N9v7A)6zaJk7oxAsk3F< zn2SnW>YX^&aDZM!40d+et7%}*4jAH(mV-OBe9$&OO8v>eh$kA-M6oMUPDAt9EXlx) z_XD>&$%@5Fi@e@=aa6rXzmYUy0DmT$RXYWS)R_!ySSbof9-yOX5#U9oLBNEhLAHI7 za`wgbThMZ+(U2Q}mOc;60jY;s5isqJ0W>>Wo;3*3ay-D2(puZa-a4%9Wevo15J)e0 zPOX70=c8=tNr$FIfoJsrEyoKkcES5*OmB$Gx=YQvBTc(J)RHkv?ZhPm_kY0{i9#To z5TBV!e#4`VHb_itf%jR)?HIV{^`7M=1ktSMtL>sBQ8X|TB17uG9Ro+~!XeYTB@NKQ zfYjB;yPw<$18a4)9Gyh&kI=3sUy6aZDWwurM>${Gx-NBl>b25Z&!fOwBza}@?gv~Owq)C}weQl#TO2Z*eC zBg?YDuS$SU4UEK*kwJoJ-w%K<@TJb)X%Yc|1)>(mBlS{Q!-lVzxH6aSh(6Ty^u~da z{K%0_?d@o4mpBG)+(wpI)axt_Oy06QV2-RevMf&@_621TvgIvJ<$qfjV&s7w$+Ye~ zLq1cWeRJayZzZ=FJM*k-0ffmb39%g;&Y!fvlom(^p3-gE=w#r;z!DZn242FA_wB^r z<8=*j$j@I#BqF2%S;*}y@b}oRmJ(h^b^hJj_WO=Gevcb&3t0PG2{~E$ERS;KaG^ak z6sMhmK+Z>a(x7d!Y=1EG^C1k3o+UUMz;!#UGZarJTY%B}W%ZdGH2XqDINxElXJ%lc zZ6CtGl=ZCNYv*zYX6WB6$67moNP9Q~Yx$5ek^FVNRzFb?%$#m0153a|1YxaiXsW}1b86Ttk? z8_K}a!pH-vdZCj5UX5Sv{tRJYy5gqVa#jFKVZvwskVTx9KNa711a>cgHM!y$P*!_qf4&3*Uj@LPg_oth6TsNex- zX4Fo!z}n(iYbuxO*VvpJbkd+~ImX%2&q&t0QdvV7_(}$_Sgt%rV!#$i>2qYz*0N~^ zyPe&}PzHX!*^#dmo$bPV*SEdY`3SrkA_07FK%L$D3c%z(A$rfe<9E-yac6fp>s!kL z`)l=)EPuS|wtPc*Eu>tuH(&Qcyg(es#8GcMk17Y5NnY<(r`<;3=I3IQXePesz=fKH z%pz$o$drdA5^v^7W?kXfrUg#7Kmz!5 zlV^pI7Dxa`S~JT!-2yOxrEA|k5hU%KxMeBiDSz+o5kJeGn@z{9uTF`qsQ`}dycJiC zu5b0hVA=Byq#%dU4j8!>V@RK1x;xWK{kQCSO9nm?L>6Nt1N$~YEqmUMfg{0-825C= zpA{}=f$A_%+=fzucR8F~wnOjZlnLI;dMF#FTHpoXpaokpZ=&sN3;b=bV+5U`L{`OT zcYiSJTiXJ!cjA(P*Y@(ly&J;7*4w+q-pEBE)Hlf6!-zk%yD6UexsT1%f9LwZJ*VlS z+OPFddOOHpUgr>wmf7=d6ApZIar8Fr=4lQCnV;ffK+lx10rD zWDsiYxh8-IL?I*=pc*mKV69R@)8iJKS!LeO&?Clab+)z0vW#v$r_;5yh<}Rg zhc_a^wXMe==qzmYc_;(Z#!0Kx+IYw(xvWlmpG);y07ah{Fj?un?UvGO_LMYm-8Qd3 zP?E9Q#r0=s6e0oqihK61#9M&f1HzuXmhSh0cqjvF8W?4xBlIo>gj9z$<)hC>0Jvsa zY4ME2ZIKxfWngW=JcR~sVWW`%rhgzPM%J{vXZ3$X-w;Y(^@4ZtmWEyCf*;PC?3(vN6)p8i?np?|Ths6#6d zpAX;*#eoY*G$SAY_Bhl^tAWU35vgo+`n?)}C2f!DUFu(C&0|Z5ff|@PSXE z0;T79G=P!vB)fRpZ4Dl+4s>98*;bPv(yV*w(`c&z*aJ9=RjDH_2eyFPsv{b}HPO`V zwZ77X^c}uhs>M)u$YX)w4u3Wn*~bL%Nb6_a-4;jycbhN^7-@k7@JQ=t-Q5;Q0C$@( z3m9pE1n@}fXWiWv7_t-B-RdkLE%3I$kh2hJ{j@-o1%@%O6hGB=WVmP21tY~kNH82R zrggXkIrPJ|X@)rRvyD$Xw*HIQw>8ZW2KIvV*|}ms+EEL@C2y;NN`Jmq0JrwFx4lQ@ z-)|w4Kwa+Wems5lx-uY&M7TZ;VPIsd65VH~0JGk7Zgp%gfVp!Xh#gwn8E2q4b{aJ`7+jsZ%~r)1!rVc%fg7iN9Y2npmpARfZNHJeHx)&N|0*m@kkRseII?SBd5+zG(aG=F7HJdA-Y z5L;}=t#+fqOLe!^CXIo)D8|$bTrK3jwD6DI_?02=0P+5y=i4en7#MM!1r`awJ#1^0 zX|;QH0DqX4fbL)oOtrB`Rt#Za2?({6I0C?yMm-9^9Q#Iw`8*DfO1t&xwbf?sw7tFn z`~CfktsPZ<8h`CT+j%JlzAAtvX+pzm+~Sf0DwR*x+t{cxThmood|~Qj#!UtWujy}P z;2r==>^mC+e?=W?<^&kH?&}Zpg88Mvc`F8PWhjX;Ey+P0H{vE9tuCC63LGp&FPP7d;EXP1Rm@Z2_}YN3U+T%5Q1&QGa=~nT4y9hUmQcFU7z=Q%ZHo zv&MFu<~&nBS^z_1*G20~8agtPf&iEUmuEAAYS{8SH$$=I{%lv<3&T?O5C%q!x=I=g zr1bgO;6*_86)g~=4<8V}OZh7@~n!0p}|HsKHksLYJ8JCrTk`+9ntz>>fmcCcXFoo~`ibxEMKbZ;l3rqPv^jfpxG@@$42)WO;dCO?wnigLK8bmy zXazY1hnPI?g+Q!ygET+e$OMGH=YpA?wS8svr|REGb0&ZztvP8~Jq)}b%&EXzwwHh6 z%#_g$ZH$;R0gPDbhG~94%}o27S-3L}B@jX0=zrKFF5npo#Ow)R#7Z|w)563*3`}js zY&%P5A6m{t3;{5@V`arqUj*>cV%m-0t?^YfPHSy)%sK{YP__2Ky3?aBSK0)T>Yft7 z&(0wCKlE-_A_K@8M6FIAkBG= za^|4T=PhJkOX_i6W6+c+sNb! z_X8IuK(wj`DsJJ{!;Gr~xCS9TjaJJE&!E@SG7COO$n0_&I5G;sZC6V1SrpXT#)Y(P z?U|0_fYDbHqD|2=58T4cD!-@ow|`{d1h5Pl?oyK;fNgo1O^xm{-vvyifjOyR>0S=3 z31A*R&<>o4yq7%i?6^gMcqs<10bcYp3RcdTchbNTnCj^t1{~eg2t5Bw+prV^TMP|5 z;GOX90JgMi>vOLkwDij|uyg>&V?1sngGNf|YJJ8<9Ac9%CMKGe9^mVisd$JLi)t@YPZY i=J}i(5gNVvp#BdLR<5Y%MqAhb0000wJ0tg7?Go++UvSx$gVA?&rRq*qa1XVL@3z004w>X2!$= ztoXMM3mo+F+Bv%efY6DiSAnvA^fCY-6L7{?ZUxw_X08NsPYYdtwjH+AYfAJ##W~J6 zG-kI)Tj-TQzP;m#oK+d<;%)^tDkOD%TW4E55T&ho-Qqu#c{}`BmCO%pGRDCS;&w;p zWXVl-H8!^;d&Ln8{khHG2z2%XuVyI}sy8#gO+(diE!*J7lKAQbXkIrEZ0^d_Em0Vvx_rH`KkIqdPJ9Wg|f zP$dhVwCV0kl}odbpv+VguLVW#DC?pwq@Qo&Rf$#unv_3%Fdlp!q)tFzuR_VJ|*3BwFK-t?qAfxb^%di8IJ$1x*)h`|v#%j&ZRx}TeBnJ6*x!QS) zJ0D_C;o2~e?|$TEgE>l(F50!Y`OQdTa_-sK?kY(OisRTHJwxbJ7Wft>*DwF-bt>Ib zXHZI5CFy1j;gpX*Yq%rm6%(3iZ#@ha-V@4~-6jD8*r=jUH3Ym!toQ5iN?75E_I3Zh z#}4B8W{#$Cl7V*hdg9p(9aR^ECJqX^L^`!)(AdJNQ7Oz*PeRfPNiclBTxxtI!MoUK z-K}a0bLd37hRk^2hd;V7kbsr?MkgO2xW~=@qANj(Gyv=+ozmt?98aCOgOAyqzpMXR zdGn5K9IWKlA@XzEp9wT_W+zZO)YGDeDjk##zwPtSxlV?!EUbc{wa>y74P zaUtFi4vZ1-$2D#O;ZiY#R6jwWB9m!slLG)+qIG-p7pF==!<+8Uz`sKM!8mpT~vGsL;|;#HQ;MMzEm7P(8g z%(Pd5^+_HpzqGzB5t%htzwkoPwYkP29cFJCXrgx);*VgW{^l|t)HOO^$8S{k>Log* zd-M9GI$0&xHP7MYRo*R5{7Pe!d}wz*s!=DRO?y8?J57mImr&$$| zwII^MDCI~3S9&-vokOV(e3{FFE6ti(rGZiifp-`|>+{}bI}tqY`fhOh3(7s8+JIx2 zmCG!i;~moWrN7@rBG;hWwl}Q6_pxoAsPN2!@=c7%GJnDSYq45LS=(0`*Lkes>i$wK(~9Sx zymJ2te(xv6(O*&ol!Ks&u@J2$OeMTRaxiyBA)K4h5yuL+*7XfUi7s9$QbE}Dy>$mh zry=(~8`ffN_WkD6Ws>q{&NV#ls=-#k8nbafcCPXyZGFav86GqeOubvf3i{A58O`cfcaK8RGt+cmU*7j@yJue5Aom}{OfO#)8pRlIfB50$ zczd=d!J<%4z5Q%W@%Y&b7YN=$_!pAYX3+#sFk!u&Q8fYz8`YU|JGJ4 z@nQVLFI0bam1j$nj7Qta~Qk(kO zn3)NKtrgdgpM2<#&`gjBuXSJ##~vg^##JEL-Kz$tfS7hZZI)*WLD!k;m5rM~&;c)t z6`v}=sceOjI%l~9q!c_d4wN`xI~X*Jjao|AEW`cFeK05&ke1evNc#-ZS^-a;kans+ z*)A4##sWSik5viVT4Z>5D{W_7xIY=T`eoGrw<(Ui4AAI>;eY}YunI;@rV^6{DlMut zs=>kymv!re5c)^g`I8-G723jiG!YK(Km(5+u!5qJBbEyzwMF0RMmE4^IB4nrjqBLM zYA-Q|b52@54v@gP{pq{RY+-Sk(AGXi`{?2?*fgT!D~ zEsPA)cekNZGcT?!>siLyYM4`Tu1TKhfs~(Nu8?0s8$M!%D zgOpQx8dP$EP1M0j{i}e=CU9nZfH9-?eo-v7kP3JzW?VUpt~>tvfp`>5?#Y-86hVTP zj;FazFbVFnVFOL?q(Z|MUDT=U8vqkTfpPte{A?tLrhh?}k_;yd)h>%Vwi zIXskYkV0MM7tWt?YB`wLf??1A(Y%A!Zo~=J8CE<%+tnH*-AHsQqm??o@<5vf#vMz@ zY?vk@Fsg117}S(GPqdXNnv~{%X43FC6Fxublut;_dU&ilVAsVXu_?4A3U>D@?eP3j z-2{pbCjVlqtEY&Ig`*dQs<;z?@>#PO;igpIzIgs&w50+~-K*OUsf>sk*-4_^RbQBJ zo+8?>j@44xJFHT9qmrii)u9Q-P~V#o=W|jnw-8BbZ|a}zhQ`TSC!eC+R4fGbQN5cv zMoCaCHObw!G670L?FRpxL3-(8#p-LIq_xME@l@!?5J4IxT_!Uc%36Dj&MqJ2I{BV7 z%~<;*_LI!w@>a08b2;wtKS5JJ1e2BD#eJw9-3np3BWXffs4r|3OWf~sKqo4rl@F0d z==;Z7UUR80NX^ix8M7zy4q@FiOKfo6%LDQ>9MROFiI+BJcf-~?tfEP8D{$R-< ztBrTFlAG4j*mwU~SIz3nsqoZ{#vHQ%;j($*ju{WOg}Uvn>p&Tg`gpgy})SzmgYxD!D4?3OmdiyBC- z@>g^rvP@E0X*CC{wd5AV>oHEEUf^cU-E*Mb09m>u?)M@YXxv;+Q~13)PDdkYHhPr| ze#6BlSNltp7V;F}<3nl|tEt+LRTo0u5C0r{D_S$%8q;}Jq8P^fVPKi*h~$R3Y>(?a z!Jz>uBao?f#Jw*0PDx=ix?3BQ&2XZ~L#KJ;B_GLNuYW2{KpAX?9eTPB`2iq&#T>hv z5;DZZ{MAMC1|Mt$ztXnV4=%3(<~KW~R4ptS=f`30ZcyqYSuf$sw*G`O+GP1uzv| zBQLBbJ{-sN(z&on86EcG(#G>o05nQ=-Vs22-OHNc?kh&K!srAMlNV|YP)Pf5&SdYA zAwcilP0(=A9*1LVU87S-51*!jM(A>R=xY_snY;m!An&@g2k3`vVdJV|h(y5u0qJ<> z4;nWL+Pt%glI%MXK{zy|+BcX87Xc@Bo)XJ!7?b@RAlf+qDd~7L@qizoroJ8h+cxkE zf3@G3@*@gVky2uSkSsJAh{&tWUG)Scg)pRzIKfX=9jI8)R=iVAdA3EJ;) zf1MFJtJh~K572|%0PSMPJJo@Iff1`X_N3TvO=_%Mt*0fcMRAR@!>jeA_V7aBylSKg z_7{^&c#@a8fL=N3j&3zFCf^GC<%aY=a`ye}4f+N%Zri+yvyrG^VImY_hrhz{cD#Ud zvO}Hz((X*AZpV5xB$2&*hi;EOHj(sO#iR&<-@D9IT^%$Tu|rsrI3PS|i79TId$VdCk0P!n`2 zHdEcCvm)R1Kn1Qz+sxx?B2%1SS4_?~`)XIgiRyYsJl}*8cZf6px#QjC*O4z$-l@yz zG`(O?pamB59iyR<>8t*_6qn__2*yGmRN2s4_}Ojm)X7=TVYS-+#q0P7x^FxuhPM5= zSl<<{moluHYFO42ZRCiVlBUd4)IK9AUSF6OW?rntMwEx0FHidC7qTV#1UkNJ zhib00pPXjZg*i1?w0t)A@dKZt zAA{-JLyqY2aV&c)JS(cz;xFH=F!wS-2<+p&Hr(9uW+*yz3MdDJiWTt>PE``ZdZrUY zVys7H4n7P`@4CA*OAD+Wc>ChoL{CYtzXfce9>{^UBPk={%8OQ%;QdGdq?0+yhzpX6 zh!mUT-sAZ6Z}Nmh*)vh#kOw9jRC!Zi;S}#RIC@H#T`g@&!qjnWu|8*1d7$mg)bh)9 z0d*YvrdD@Bl=NeTK3BG_AyvScALQ%i%L=lAbodf$d2~t!+2VFE27Ut!o-VNJ#|g6W zbmF!QgF8t~9cUc%uS(k+>w*mkpy2xt)B0W|C_5+rTHgIU!^ut6*`9kih&g#?$FG-# zsYhhOSm*Yi6J-NK@Bh++TA}$Z%U=M4Jwcyq7LRu8OGyf;U8O1$2@Ah^{9@Ps<@9!3fpu3Ja3aqg8gh@(xyYbcY&w59dxPu(v)@Wbe1~ zn0r9*6`FLx2ymwO9Retbh7>{yuk^=2#9PkYDyp%On4=VMVw)Wx{8QwDLO}$+#G(2n zfP!Nxg(-ky{yksSoNopwB0MBhYarkT=teKh!T|pgF04c2%*+R37`yWWce{R327WvC zgIKV^UTNoqSKe0WTiKiv!vKXU>{9$obYmDpGUef!D(CVF)24~9EVJU8OI z4*>3tf2GIk>!@@h0F3xZDi8Qy zo6qOHEo+uMPVLkJ3NYtmKdt15%Sy3J?u`|frP8;nQdeBokUf>4Deg)%pXN>2IpMDh{Sxn{U1ZdS4AN6a@&5{N(Y;dx#2)V@tk z#0;~Q+_q5aEZH}rEPcgtpFO7+?Y{H=SNoLU*_4`QIg8F>d_wE}_dZTL(_8O#Eefq*fjspXZikzS$M^v+od#HJ%#Yr zi1Kbus9-Y6@Xm^B?_pYKd`jSsZ8-~iO*2adV`fHCjK_lk!FXE z`EeCjd;4*dvicDAFBE@9fdB^LYY zY3?RBxy^>=4Pn3OIQ@I`Bd!%LWR)fi;-)E4Xid1A@F|JnNbojV-uonF(ZJGASZD$B zuTa2?9;ZucZ_;Uc#Qv$EjHlZwcz=4r#+P?kEnHShZ%e_gcG55|NoVd3^=p3ckn0!> zMGRjuy=WbJ@yAZ>(=iD@eypIR0(c=u2 ri=M5}A4v!*E73d#yqhL-`WJ#|7U#5e%Q9X3i3Lbj$1HQqDG~nwBr*|` From 6fab0c8c87fc7d923495f0c11a90f2dc50409154 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 14:21:21 +0100 Subject: [PATCH 293/476] Moved state icon into middle of lower screen. --- apps/lcars/lcars.app.js | 4 ++-- apps/lcars/screenshot.png | Bin 4746 -> 4772 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 9b2ef59c6..7dcdca4ee 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -197,7 +197,7 @@ function drawState(){ hours % 4 == 1 ? iconMars : hours % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 118, 107); + g.drawImage(iconImg, 115, 107); // Alarm within symbol g.setFontAlign(-1, -1, 0); @@ -205,7 +205,7 @@ function drawState(){ if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); - g.drawString(getAlarmMinutes(), 118+25, 107+25+1); + g.drawString(getAlarmMinutes(), 115+25, 107+25+1); } } diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 11695ba5b05a6a6885ad9bdc7203fed50853e4bb..22e00581be28e9800ad17851901460ef318373a3 100644 GIT binary patch delta 4767 zcmV;Q5@79$C8Q;gF@Ii3L_t(|UhQ35w%Z^KZ1%tC+Y{R)80#?tfx%IKdRl`3F$|Ir zf95k>4IKbaEvyA#}>*9-R#yyQ3zZCX*&F>pC~mWijdOo5?Q zCfZI}PHR^Ju76e5w1{)=*mMlMB7nVs=OxFAk!|02C&nZQq)TfxX$11BAwe764d4_m<1GZIvU*vh;t$?g2guEEIStu$SdZ5OZ>JkfI>Z z$2SE7_p@E}4~M+7f&mLw~3Lr{t9V&~}Dx5#JRDMj5At zEd#(9tPuuIjG8lP4pNkXb7n5v)&5P5<~9cI4d7m^UMdl>**(hK&A<|K=4MDb6w?^^ zFuPB-cQ9~~;{M~gnB z5!_}2qkpl~8XH(MPikbg^mlpy15pU+945D2Q5%^HxpDQm#d(_z+yV%VX<7hmVLG(z z^Z*v(z>|ZUERX3c(%! zmdDN1BGKZ$h(q_dC`16*&ciJXEaf=lAPxow=7nQg3j+hqn2Ic6LKvbDTy6w+tX$*R zp?{9vZbBe$qnW0xzA!S`lJwaCjE)B>hm@(+JY@!OAS$cSgWa^FqZj2JP028Q zEP$nqFsof%4-CwvN5F}csqSYUS}=l&Ge0y3jfz6#pqApq`8Xc~V989l!-U`tQ;<0E zwlx+|>%3GcmA*eW@_tYz#azf*%nF z)=UKLyY~cH*%B#_l&Kwuc5O)eE<4uO$H0;6M(BycBN$i%sP?^f;;DKyKtt*vWopNv z-9^*BbM2z_&~j8e!N9e%PSmrS4oL(8PNYojP`Hp+nMi}&QOoOLcfe~;bWh~oyEeI{(9~lRpfq`q8 z{&5U!Wl|5I)Y`t5MRNxObJ2oeV1EW>HIu}F2L*C309%i%wOyh{H>eKKD1gN_-K-Mf zuH9$x7Um0D@3A&8I%yvTI2_q}fa_KOA0R68!Vv~W5`oYQp%SRMd3~G>JQ~0r;N4kA zPP+GMhqmAOtT4?sm0sit1{NN}vj9~Chc%?tQXX~WJWLx@M@Y0Fk+k%RWq;Wom&A@P z3dGi4o`I1`vH%#7Hv+)#HfkOTwDzB}Il03Ggi+7B(U~2&sUeMN`6vW3VF6%SOQRSV zxe#h)`e0yW1qfxVQ4q@;6I$1-kq+K`(V5a39YC2K1vT%)y=UM-w~}cm1;3T7f#zc8 z5y!`x3=a@{ftO;uJ5J(~ZGZi9xeyvyb|!chfIY#RGo^MHt=0zCz=_78sksgt7+C?1 zCPe9+Av;E1#v8mj1J}fXCH0|s#8kN@^MM<&6xAoxfD|Y8=&m0FtG_4X(cO>{8aQiU zs!N?QIiUfo1_HoVjXkiucGCi}QKg&+E(E8wi>NvPjA-fMWwhvm7JntszFR_dR#gXp ztr~k^d5HOfg+614}ZI(4Q9TU5SAs4s0+XtSnhFEe9?uV3r0jz`)XP zAzS0XDIj6FqJPhsZ$A}<;K17&XXe-wwShJErTVAYo2)WhFfxOj>_^Bua z2LyyYB|va&Z3Qs$6Sy@yjs|8l6_UF%XG!?6{D`5}@1KnWr^o{rk+3kHC2}C0I+lGZ zC(mlqAd~+Ye{smbz0989nd5$$lZ!G?hb1ogz%%DUP=6sV#3AA)PuuEq5TSs10)Q=G zXLVaF0&_FWt_bF}Q(%DK1Y<(+C3YFD{ z(OPAq?V>=R8EifJb~^+27!+bcyk&0n9yOY>6OgNzT+u;1>CgXE96oWtu)W_wqjf z%G+Nf<%t0H9=sM;^=|L!;Meq-;v-Mi10P1~uyQrV2nM!A`uAth*#{}{gC$S8rbi|1q1&&4wfDNPzKiCP)J%to@**Kj=bSeGfUdb zk;rpZ?{>NV#e*d^v+}Jol!0piTuweJqkl~;-`X_*w)8Oo+%{9UFfjEJj`VC4#a^Q( zz6HR@LxiKo(FT)wYv01a0pJ}F0p9k7@hArN288upGwaV4c=xv*4(myH6a#w$q9=g4 zr&kk%dO4-*K~(PX6bxMRY$^rT9srhpr}*6-@++TOUoB4G(*W2yo?94L3W4R5jemsG zdNCE%4{D*+0Jt0%$Hu+J)(V=L>fge^0pR^IzSU-)2{^O#d7BI6gm^G8 zw@|e)_8!|T;PdFmEet$6fUN+NY~0c*)9m30ui0SzCDS=YJ3e1KVb8Dh8GST!MII0CPX|f*d{DruX@!r(|F* zE-bND&#BT(6YaaSYfy}f%Ih)aJhq*78_VB4`XtG`g@IA;e1y4xC|m=S_FXdzW!%F*gr`}IA(wr%=9i$j+dM^9A* zfO~3p0omVe{{ZX9G5coPnLw*Bv$skDz}^~tpuF77DBn1>fV+ok0>C}Ax`0g9Z0O9u z-l4Xkao`2!HM&S>AdfDbY=7Yk*so^D5g`72@P7PeXdF1uF^>kmWp=i|u)v+dY4x@5^FaN$J-r{bsV8mw6TQTb$7l6DqZ30J*b36O zF1YM34Zx{x4G_?y-MpN3uP^TpD!-=hTAeqx4lM0|4`y8N!;Ya0Tz|3^no%a@8gMc_ z0IXg4;TT^Vr}kX~Vejv!s6)=200Zv?oH1}kearZ6VPGk35C!!&*nYlWmMgHwLhnwZ{+*H+CqFXWKcABrnUvFL zKI{M<{6f379Z3K_Z5>BMyoVD8@RL^DNvw*=ov;s`dOCY?zwTcUkTz7;QjVF%Q8zbwQol+@!k}Aqf9GH zzdx}FFq(mYdpHAY;HWhr%E4L`D{g%XL!t|AJ_dHqHshGLj7l)a&j?tlGD8^{u}y0M z>;YH}$W$9he}A=ckB&lIj**iMT>MZdMK%{5y{SF1l#MC@xD_Bz za^hH97l=Z9j_?R`;}T~s?L^fOK{hoZLs!N7#(kez~a;(s)NYTs)o(ps;Ei7yO%bv!-} zpcZu~zgzqN*#v%pfvw8XY*vJ=xm{%z08={2L1oq1*Q$8Ohp*Xaod3}3yWGOS*M<8H zgQH%(luuEse2rC~;>7LN03L-nr>_yIlDQe7%BADawR1K!3Xv3-cb1EvYUzn104yyu z4(!wzbANV1zSmBswO*N*n;onjCNB?Gt*vAeAA&wf=e zweMbf&}~uuMDD`CpTm#iN@Z~vl5)7AzZ;K}hcmF(#Dp9_4SYa;c^4uNj@jDFqY|b3 z^lzI)y7W*R*rUTC!=?e&*46TMPrtyFF0U7iTYoaK$rjeHCm|yZ21c~>kTMsWH(f6h z4jHP4E@ZX2GVt3Wt?p!0Tt)+2+?9_;PzgV>&6_)`Xq2N>f$^|Os|FXUZ)HCAhOueP zXNXyyVXdhEu%@Ahd~dmZ%&8zn89v{M3!GXMq*c8E;8qPTSij6hOGBVe(CUXrIDCyE zGk>Zt!vM@Fr(DHSVz_p=@gAVp7KOxVr84MoYCS;eY9h8Nn)8rf6GG&A%}qY?#{t*_ z#L{BZ*y^&aX4>vCfpsw6Yf)xJi@dEaaj4NOQxGsb4y@%mSQ)rHQuYL}bX+YZ{FDhh zR02=WNkwFTU+Cd;B6vAF??ESRj@O4s6Mtf4Hrlr8k4z=b9H<2_CmWf}vWx`Il7T6Z zbM-wISIv0PI=LBu*5QtsN9{J#F>pD_9D7L%p*7Lx7Xgggu-0<$LZ~b_{3K3e;2gk+ zlSDCjD}Xgdrr16o*QyMh?=Bx(zPz=(-GKYP5O^{pIz$;XTu;rw0bp(V`hB-Dt$+29 z#H;6zVc=el5+av#+D6%dUSL>J&hiXQdZteA*dyT0&530GP-fDK;8>y0Q!#KJL#5)W zBM&l4U~&-z3giLcanPTNfjQ735r>{ClK_bV_%0i<<#bGIBdNCm< z2MzI|rpOF{Sgj9_X5d-?BXM9Vlz+x8t^jbqWf2Ta=oX3NN}xpQ_nXq+k~|#)qh5V2 zyCTzzFmM1E(PaNJ(=jl$HIH`UEC8lry1C_}oek5Z^r& z(SD5vPS@%^LF~ooA;)KDe5xKV??MEK{miMSf@Y?1kq?^$hy%nkfm8}8h%fVaMJHBK tM)Y$%a|M1{D!{zn`|$g1%iRSEE(loVu4`bOUy1;`Uy+8zxO-hjMO&6F>pS3wF5?hp|(s7^EG{t z!22_B0p!IT!+$Yw&EQkOx)Xp=@Gb-A2;hb9KL=wNa^JtFYE_4OEpo*>@AMS+C^F9r5IT@GTdoD`%e$bVgk0d(M2K3`7& z*Y-gJzV=;nYozZI1Lw@jF>MY$j-mJepDHJBhqf}TE`P*DIxxyMHEh`$z@B|T0P5{t z?Vv^&cxTj1h!2dY565bHl@E+A`z6c0#*8Ip)=V6vzDohTE&q}VA*psL z$Wb4eliaxcoc%BJfky>!Ez6bUNAsZR(8+cLaRvq^$1TZ^sucSHGEKVE*7VC%h+Y8x zuph#1--!I|dLRs1lOF{pn$8ShM+Qy@y067|MkF=*WuDqmEX-dr_-R#70`TJhIUT8_PJwZ1 zK@KVo{K&Sjv`HczxlG4=S^%emJ0kfulT7X8W5UB(w>BLh4SOV!? z0h}{z?Fv=6FscW2O3U@gHw^>N24KoPxPJ=39zbhV#xyEK0Js%I#x8dX6+&|nwC|on zRKk*$JT3a7T^rKAbM`|vFZR4rASsQ{6b!5ls`mZy0L~7h=K+)!$guz>&R9sG&R>Yq z4)RR16Q==G`~G+UZ<2s^&<44q_9JU1>IR|*?>laY{=3(6dj>|piKOuYvBe$uE`Oi+ z3Ah%0K@P2_5*NaZxg?fP4rE78+JXB5_+yddMg{PIAG6%7^pAFphKtAGBhkCp1_0Fy zk3L8mZxa9y!ob=JK-oJOII~I#0DqQE;wqCiVJvkv0kE)np&iJPRxawIClc5pr_iQl zV5=+Oy;)!Z<1j7+!@%6*BXN%m-c!UZ84Gdkz*dV* zm|jyCw9{(Z_cTz`q&lm41He{`O_*L{VCgkV^!X`Deb6QiYUaxTENzYM->B!IxF=IT z9Y*9ONm477+iJ^1>ZNRg4ziX`0uyz?QhPRv+DYRM_8gM|qkpxhWFQd+M$Rrs?g4kSvhEh;>-GLyj#r2`HQ}3{C5=JYc3pzj zd6qMjRetIC*4`r~%q?#+8W%o|4*dHwON= z8C2jGKJaE03UHPPodOG@$4Vf+Er6YUU{nY8a3db&1LuA>CCgcLV5CfhfiB|o=nvkcyp_l?T6d$#9g66q)~s$ zz7{nA1+S${4ZKuYrHmy>T#^pFgUtd?3+PMx^Ed{Uf=0@vK>TWsSv@7PrY?l?tdw@z z%yQtz{WRJWcj7qqEdj7aIY1|m#PZ05va*?W-nZmC@_&4kb`BZo$IuMC14>d1ECb4c zt)~1L0E_@dOVetnO{;fk6@qGf&2dU3h(Z*Dv|Y7jqOJj&P8;yqz7NU3d9bw`UHbXh z+%3?8t@Qh++|rE`tM9Aka0PJJOC**54i@-%7h-iK{FvD5w)0ixAm>%rX&-jG3OA>RO+5YK z4im6x704SclLIAwshm%*bRUkj`Nb_&>nd3^^bO4BXyUan&} zouEXbV!cU`A}oMgV7(I;42)YWQVwN-t_+O6fq*>Mlv~mA#FS+Ow3j21=c+#SaqWv2 zcPyiEPTQ4%O8}e?K3YbdS-!bT0BmVv0Drh{q%L7#>U}fm*(i#=dJTLHfRT6BdiA3Y zCgbM5gn$&#d_`Vc-BT{|ogI+}WnuB@8U75GWgYy9>G5JQ$dps9GOe_ss^8 zu~T2dz@r1$3NXnZ&x10=cMkyLlV&Og_8NE(0CPhS0LHe9YzZ61|@KkeGbrR3ip6X+5KMx%3S;8Dw4H9HWo48+RNT=Rmz* zsNQ~oeh0sY{iQN4@qq)t=OM{Kd?k2mnU~Ao0?hE!QY|WvGVf;r?($CFlYbn& zZe`gUmaDo6l|FF`w;}+1L!h;6^1+;&Py3BSKG&kYXP9?Y2zEEJ^1S*G0QR!v1m%3e zxPkQu%<9yLmOgO+cmm+{>_X~hJAAdX^!s)652MWftz!!WO=sGcQ4HI`~U{0`?cB80o)RD{- z9<>_*=*9xK3#aARzK;p@O@&zH2==j-L%I0;kLBUL>@Uf`PoC2Lc4c5INK>iiY=iYF zL9Wa_Z;4^ht=%-8cCRmO4_ban+bwxM*xInP{@a;xJvKYKGH}jT6n}f6|KBmow;8Uz zHDMcA?8*F%zOAhHx<4nbZd5siXC=D&z`0Y8zB)-o?VKNN zUE(w-Xyr*0E-$;a^r!WOXU6YA9g%@KUpMn{HJ=t`Zlph58GrcbSfUMT_rr3~=l&A~ zZZ98818>?kt{+@m@^*XpgUEoNL7bd2+cmXsqfdJ8F1>M+0d2#f4ufh2S8jI()<9h9 zLU3${8k9lfo$CIe)d`{TBUSuQsRUbY);};64qqYQwofr6ssF%AXa$tU3Vb!N(RJ;clFC z=Da+Pp$puJAsBcx09zQ+Iw>i?x^{wjGTRB%MBuj6N1bul8j|Y1>8hHl8eVM<1|}?t zfRbAQG=OT~y$04&P6-pA82B87908!FI^^FiZGQvhf(nOPj$h?o=I7dDLdX*NuOuGCQ@(#r9U#?FG*mj?I zNy}_{Ab;ghX}U6SX(O-5r%g1iO<}!7|R^m5xFmS2mZkUhtbqzN$@~iY`pZNEpyM=*E zOd1SaVzmkKoR2d8Ug*rbSmOgrr`k%@ha;}o{D1ceh9tUxT7c7Cc{PGM@FV-YY2b>g z9BBK~bn&oBiPa{^V`aWYFcWs)Fq53!3oIX>Dgaz-!5ikUxqZxa_q1t2T;SAHkP=e{ zfJ>}4QJ(xX+TOJ)pZ8>+%-z^_;;a`qDYJJ2uq5tN+pClzEpIQ>Vhq)3xwcdNy>g?1 zvVRBSo1$kP@<0tyA8N1qzez@879=aWT%~=o=1biRIDhZYJ5}Fzt6EOl;TSk~0W=>IVP&fUbHH){ z=KN$XzlVDRgQ+4R;u~8Sw*~X=-5ZX9DdsyGoA|a8lOs#NWqh9o;M~VQ+@So{@*YA_ zl3BsQ9Ltz|0o?JII=N+DW3rI}ocg%j#F12%l0oa8r<9Re=6+7&r$*34pBun`CUH{s3@KxSs18ih)o2>D#6R z60o&2qvj%L-*?~Nb8@xp@14pXmVwj2trWn$bYTs^t^D&l0j*VAr)J<%09yc=4~*ne zc>3q90CBf+gMo<=(>5Zs08-0;H-C_f+}`0BIMs@G#wv9oN)4|ua9*yKK3s^>k6@VJ#6Af9h`RyWgahe;x5LBcHYljfuEKNFyC)*J*3gmC-pxDEt;7w Sofwz^0000 Date: Tue, 28 Dec 2021 14:24:06 +0100 Subject: [PATCH 294/476] Minor changes --- apps/lcars/lcars.app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 7dcdca4ee..1dbae6668 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -169,9 +169,9 @@ function drawLock(){ g.clearRect(120, 10, g.getWidth(), 75); g.drawString("LCARS", 128, 13); if(connected){ - g.drawString("BT-CO", 128, 33); + g.drawString("CONN", 128, 33); } else { - g.drawString("BT-NC", 128, 33); + g.drawString("NOCON", 128, 33); } if(Bangle.isLocked()){ g.drawString("LOCK", 128, 53); From 53e37132055cae7ccab96598910927a8949b0e51 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 14:24:41 +0100 Subject: [PATCH 295/476] Updated screenshot --- apps/lcars/screenshot.png | Bin 4772 -> 4798 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 22e00581be28e9800ad17851901460ef318373a3..4d4911227dc8ce48bd8db53c3947900c4e8ac87e 100644 GIT binary patch delta 4793 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 TQ(~2;00000NkvXXu0mjfRvY*a delta 4767 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 tM)Y$%a|M1{D!{zn52dV From 5e596f49451c95e296019c29eb9e78af5c483f1e Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 14:36:23 +0100 Subject: [PATCH 296/476] Show disconnect immideately. --- apps/lcars/lcars.app.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 1dbae6668..f27c26b7f 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -200,13 +200,13 @@ function drawState(){ g.drawImage(iconImg, 115, 107); // Alarm within symbol - g.setFontAlign(-1, -1, 0); g.setFontAntonioMedium(); if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); g.drawString(getAlarmMinutes(), 115+25, 107+25+1); } + g.setFontAlign(-1, -1, 0); } @@ -447,6 +447,9 @@ Bangle.on('lcdPower',on=>{ // health iff the connection state did not change. if(connected == NRF.getSecurityStatus().connected) { draw(); + } else { + connected = NRF.getSecurityStatus().connected + drawLock(); } } else { // stop draw timer if (drawTimeout) clearTimeout(drawTimeout); From 4769a1dc078dce61a1bad6a255f92f179b62e6c1 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sun, 12 Dec 2021 19:08:51 +0100 Subject: [PATCH 297/476] lcars: Add implicit semicolons --- apps/lcars/lcars.app.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index f27c26b7f..5042560d3 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -42,73 +42,73 @@ var bgLeft = { width : 27, height : 176, bpp : 3, transparent : 0, buffer : require("heatshrink").decompress(atob("AAUM2XLlgCCwAJBBAuy4EAmQIF5cggAIGlmwgYIG2XIF42wF4ImGF4ImHJoQmGJoQdJhZNHNY47CgRNGBIJZHHgRiGBIRQ/KH5QCAFCh/eX5Q/KAwdCAGVbtu27YCCoAJBkuWrNlAQRGCiwRDAQPQBIMJCIYCBsAJBgomEtu0WoQmEy1YBIMBHYttIwQ7FyxQ/KHFlFAQ7F2weCHYplKChRTCCg5TCHw5TMAD0GzVp0wCCBBGaBIMaBAtpwECBA2mwEJBAugDgMmCIwJBF5EABAtoeQQvGCYQdPJoI7LMQzTCLJKAGzAJBO4xQ/KGQA8UP7y/KH5QnAHih/eX5Q/GQ4JCGRJlKCgxTDBAwgCCg5TCHwxTCNA4A==")) -} +}; var bgRight = { width : 27, height : 176, bpp : 3, transparent : 0, buffer : require("heatshrink").decompress(atob("lmy5YCDBIUyBAmy5AJBhYUG2EAhgIFAQMAgQIGCgQABCg4ABEAwUNFI2AKZHAKZEgGRZTGOIUDQxJxGKH5Q/agwAnUP7y/KH4yGeVYAJrdt23bAQVABIMly1ZsoCCMgUWCIYCB6AJBhIRDAQNgBIMFEwlt2i1CEwmWrAJBgI7FtpGCHYuWKH5QxEwpQDlo7F0A7IqBZBEwo7BCIwCBJo53CJoxiCJpIAdgOmzVpAQR/CgAIEAQJ2CBAoCBBIMmCg1oD4QLGFQUCCjQ+CKYw+CKY4JCKYwoCGRMaGREJDoroCgwdFzBlLKH5QvAHih/eX5Q/KE4A8UP7y/KH5QGDpg7HJoxZCCIx3CJowmCF4yACJox/CgAA=")) -} +}; var iconEarth = { width : 50, height : 50, bpp : 3, buffer : require("heatshrink").decompress(atob("AFtx48ECBsDwU5k/yhARLjgjBjlzAQMQEZcIkOP/fn31IEZgCBnlz58cEpM4geugEgwU/8+WNZJHDuHHvgmBCQ8goEOnVgJoMnyV58mACItHI4X8uAFBuVHnnz4BuGxk4////Egz3IkmWvPgNw8f/prB//BghTC+AjE7848eMjNnzySBwUJkmf/BuGuPDAQIjBiPHhhTCSQnjMo0ITANJn44Dg8MuFBggCCiFBcAJ0Bv5xEh+ITo2OhHkyf/OIQdBWwVHhgjBNwUE+fP/5EEgePMoYLBhMgyVJk/+BQQdC688I4XxOIc8v//NAvr+QEBj/5NwKVBy1/QYUciPBhk1EAJrC+KeC489QYaMBgU/8BNB9+ChEjz1Jkn/QYMBDQIgCcYTCCiP/nlzJQmenMAgV4//uy/9wRaB/1J8iVCcAfHjt9TYYICnhKCgRKBw159/v//r927OIeeoASBDQccvv3791KYVDBYPLJQeCnPnz//AAP6ocEjEkXgMgJQtz79fLAP8KYkccAcJ8Gf/f/xu/cAMQ4eP5MlyQRCMolx40YsOGBAPfnnzU4KVDpKMBvz8Dh0/8me7IICgkxJQXPIgZTD58sEgcJk+eNoONnFBhk4/5uB/pcDg5KD+4mEv4CBXISVDhEn31/8/+mH7x//JQK5CAAMB4JBCnnxJQf/+fJEgkAa4L+CAQOOjMn/1bXIRxDJQXx58f//Hhlz/88EgsChMgz/Zs/+nfkyV/8huDOI6SD498NwoACi1Z8+S/Plz17/+QCI7jC+ZxBmfPnojIAAMDcYWSp//2wRJEwq2GABECjMgNYwAmA=")) -} +}; var iconSaturn = { width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("AH4A/AEkQuPHCJ0ChEAwARNjAjBjgjOhs06Q2OEYVx4ARMhEggUMkANIDoIgBoEEgEBNxJEC6ZrBAAMwNxAjDNYcHNxIjB7dtEwIHBwRoKj158+cuPEjlwCRAjC23bpu0wRNDAAsHEYWeEwaSJ6YjCAQUNSRQjEzxQBWZMNEYlsmg2JWAIjCz95SoJuJggjDtuw6dMG5JKCz998wFBJRVNEYW0yaVBJRNhJQN9+4pCzhKJmBKC4YpB/fINxIgCzFxSoQ3J4ENm3CAQPb98wbpEcAQMYWwKYBNxMDXgc2/fv3g2IEAOAgAjBjy5CEhEMfYICBgfPnjdLjj+CgMHiC3JknDhhoINw4jCAB0IJQIANR4QjPAH4A/AFA")) -} +}; var iconMoon = { width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("AH4AQjlx44CCCZsg8eOkHDwAQKEYgmPhEgEQM48AOIgMHEYoCB4ATI8UAmH/x04JoRuJsImHuBKLn37EwZuIgEQOI8cEpXj/yYBhE8+YNGgkYoJxITBUPnAaC///nC+FjBuIOJZEB8YeCh/8AoYACoMEEAnEjhQDPQJKJ/DCDAoi5DoLdHAoMQgLjFWYPOnngh02IwXzwDjEgPGEYS8BI4MBYoSVG4fP/nghkAgZrDkngJQqSG4gvBg4sBQgkImHihEAWwP8ZBMBEYl5/+cSoVAGQIUFh04weJn///0gj/OEw5KEz45BzhuCTYQAEgePB4IACAoJuBnAQEa4XHjxKB//xFgWHJQsCRgMDEonipwjENwUBDQNx8+evvn/hTDLw3igE+EgZxB8UOXIvEJQUfEYOfv53DEQkgga5BJQvzx84cAj+CDoNh8/eEYJKDuCSEcocnEon+/7xEgFBIIcfB4Mf/IICXI2DgDdBAAn758gCIq5Dv4zBvJuIOIfjEgvP/ARHgwdCB4P3AoTdFAAk4EYk8SQgAFTALaDSQwAGh08//vnDmBABYmEEZYAzA==")) -} +}; var iconMars = { width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("AH4ATjlwCJ+Dh0wwAQMg0cuPHjFhCZkDps0yVJkmQCBMEjFx42atOmzQmLhMkEYQCCCREQoOGEYmmzB0IEY4CBkARGoJKBEYQCEzgSGkGSpAjDyYCCphuGiFhJQgCD8ASFgRHGAQKbB6BuHJRGeOIsINxEk6dNmARDgMEjQjHAQPnVQojIyZKB6YSDNwK5FAQt54BuDXJIjBEwK5EgxKKXgq5BJRdgXIojJAQJKMcAM0EwM2JUApDoCVFExa7FkGCgAmIkAREEwUEjAmHCIgABhEggQmFpACBCIojBEwRQCzVhwkQU4YADgQmBwQCCI4IFBCAojFAQojGJQQjDAQgRGEZICBEo4gFyUIkilFJQUYEAZrBAQMYNw5KDSQSbCNwwABgOGEwgCBsPACQ5xGwdNnARJcAVh48evvnCJK8Chs+/fv33gCRcB48cuPHCBYA/ADAA==")) -} +}; var iconSatellite = { width : 50, height : 50, bpp : 3, transparent : 2, buffer : require("heatshrink").decompress(atob("pMkyQC/ATGXhIRPyNl0gmPjlwCJ9ly1aCJ1c+fHJR1Hy1ZJR1I+fPnlx6QRLpe+/JKBr5KMuYjBJQMdCJce/fvJQW0CJUlEYQCBSpvvJQbXJjl0NwnzNxGQwEOnHhgF78+WqQyIrFx48cAQXz4ShJgAABh0+8cP//9LJEhg4jDuP3//0LhGQgYlBgeAn///5cIy8MuAmDCIP/9I4HkmCEYMOgHfCQWkCI0cuBuDgF/CIP+CI1Ny1IkeAgHANwIAB/QRFrj7BhkxEwQRC/4RFpbXDgSVBg4RCSorXDI4MJAQMfCIP8cwImDn37fwN58+kwHgLgSVFub7CI4NyBAJKDLgkuEYX78+evKtCLg0jEYRKC58JMoRcFkwjDJQTFDl65EkojEAQMdcwn/+gFC3YjEJQLXEpYRDWwQmEdI6SHAQO0CJUkx4jDF4gCIJQgRMXIjCEARIjCCJ2XEYPKCJqJBJQIROcAUpCJ0kybaDARtdCKAC2kAA=")) -} +}; var iconAlarm = { width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("kmSpICEp//BAwCJn/+CJ8k//5CKAABCJs8uPH//x48EI5YjCAARNKEYUcv//jgFBExEnEYoAC+QmHIgIgC/gpCuPBCI2fIgU4AQXjA4P8CIuTEYZKBAolwHApXBEAWP//jxwpBAALaFDoYCIiQmDDIP4EAT+CEwnJEwYjLAQLaFEYomDKALmDNwoCIOIZuD8AkFgCYDHAQjMAQTdDNwOAEg0Dx0/cYeREZtxQYOTHgJuHOIvkXJy8DNwIACJQ8Ah4NDAAfxEZARHOIIkHg4jQAQb1CQ4KVJgEOnDIBSoIjNAQPBcAaVJcAKVBcDGOcD7OBMQM48BuH8f//JKCnhKNggRBkmfTQJxBEwhuD/gRCyVHJRlyCIVJXgYmB8ZQBAoIKBXIQmCOIt/NxAUCOIImCIgIpCBAJuDAQZEE/huIAQWTDgImBTYQGC8gRFcYpKFCI8kDwQAFCJBfBEAX/+IjBiQRIEw4jJAQc8v//NYwCIOgJrIJpA1OcwbaFAQWQA=")) -} +}; var iconCharging = { width : 50, height : 50, bpp : 3, transparent : 5, buffer : require("heatshrink").decompress(atob("23btugAwUBtoICARG0h048eODQYCJ6P/AAUCCJfbo4SDxYRLtEcuPHjlwgoRJ7RnIloUHoYjDAQfAExEAwUIkACEkSAIEYwCBhZKH6EIJI0CJRFHEY0BJRWBSgf//0AJRYSE4BKLj4SE8BKLv4RD/hK/JS2AXY0gXwRKG4cMmACCJQMAg8csEFJQsBAwfasEAm379u0gFbcBfHzgFBz1xMQZKBjY/D0E2+BOChu26yVEEYdww+cgAFCg+cgIfB6RKF4HbgEIkGChEAthfCJQ0eEAIjBBAMxk6GCJQtgtyVBwRKBAQMbHAJKGXIIFCgACBhl54qVG2E+EAJKBJoWAm0WJQ6SCXgdxFgMLJQvYjeAEAUwFIUitEtJQ14NwUHgEwKYZKGwOwNYX7XgWCg3CJQ5rB4MevPnAoPDJRJrCgEG/ECAoNsJRUwoEesIIBiJKI3CVDti/CJRKVDiJHBSo0YsOGjED8AjBcAcIgdhcAXAPIUAcAYIBcA4dBAQUG8BrBgBuCgOwcBEeXIK2BBAIFBgRqBGoYAChq8CcYUE4FbUYOACQsHzgjDgwFBCIImBAQsDtwYD7cAloRI22B86YBw5QBgoRJ7dAgYEDCJaeBJoMcsARMAQNoJIIRE6A")) -} +}; var iconNoBattery = { text: "NO BAT", width : 50, height : 50, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("kmSpIC/AWMyoQIFsmECJFJhMmA4QXByVICIwODAQ4RRFIQGD5JVLkIGDzJqMyAGDph8MiRKGyApEAoZKFyYIDQwMkSQNkQZABBhIIOOJRuEL5gRIAUKACVQMhmUSNYNDQYJTBBwYFByGTkOE5FJWYNMknCAQKYCiaSCpmGochDoSYBhMwTAZrChILBhmEzKPBF4ImBTAREBDoMmEwJVDoYjBycJFgWEJQRuLJQ1kmQCCjJlCBYbjCagaDBwyDBmBuBF4TjJAUQKINBChCDQxZBcZIIQF4NIgEAgKSDiQmEVQKMBoARBAAMCSQLLBVoxqKL4gaCChVCNwoRKOIo4CJIgABBoSMHpIRFgDdJOIJUBCAUJRgJuEAQb+DIIgRIAX4C/ASOQA")) -} +}; // Font to use: // Graphics.prototype.setFontAntonioMedium = function(scale) { // Actual height 20 (19 - 0) g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAA//mP/5gAAAAAAAAAAAAA/gAMAAAAAA/gAPAAAEIIBP+H/8D+IYBP+H/8D+IABCAAwIAfnwP8+PHh448eP3+B4fAAAAAAAH/AD/4AwGAMBgD/4Af8GAAPgAPgAfgAfAAfAA+AAOP/AH/4BgGAYBgH/4A/8AAAAAAAAAQAA/B+f4/+GMPhjv/4/h8Dg/gAcYwAAPwADgAAAAAAAAB//8///sAAaAACAAAMAAb//+f//AAAAAAAbAAGwAA4AA/wADgABsAAbAAAAAAAgAAMAAPwAD8AAMAADAAAAAAAAAAHAAB/AAOAAAAAAAAMAADAAAwAAMAACAAAAAAAAAABgAAYAAAAAAAAA4AD+AP+A/4A/gAOAAAAAAAAAH//j//8wADMAAz//8f/+AAAAAAAMAADAABgAA//+P//gAAAAAAAAAAAAAfgfP4fzAfswfDP/gx/gMAAAHgPj4D8wMDMHAz//8f3+AAEAAAAADwAH8APzA/AwP//j//4AAwAAAD/Hw/x+MwBjOAYz/+Mf/AAAAAAAH//j//8wYDMGAz9/8fP+AAcDAAAwAAMAfjB/4z/wP+AD4AAwAAAAOB/f4///MHAzBwM///H9/gAAAAAAH/Pj/78wGDMBgz//8f/+AAAAAAADhwA4cAAAAAAAAAAAAAADh/A4fgAAAAOAAHwABsAA7gAccAGDAAAAANgADYAA2AANgADYAA2AAAAAAAABgwAccADuAAbAAHwAA4AAAAHwAD8c4/POMHAD/wAfwAAAAAAAAD/wD//B4B4Y/HMf8zMBMyATMwczP+M4BzHwcgf+AA+AAAAAAD4A/+P/8D+DA/4wH/+AB/4AAeAAAAAAA//+P//jBgYwYGP//j//4PH4AAAAAAAf/+P//zgAcwADP4fz+P4Ph8AAAAAAA//+P//jAAYwAGPADj//4P/4AAAAAAA//+P//jBgYwYGMGBgAAAAAAP//j//4wYAMGADBgAAAAAAAA//w///PAHzAQM4MHP7/x+/8AAAAAAD//4//+AGAABgAAYAP//j//4AAAAAAAAAA//+P//gAAAAAAAAAAAHwAB+AABgAAY//+P//AAAAAAAAAAD//4//+APgAf+Afj8PgPjAAYAAAAAAD//4//+AABgAAYAAGAAAAAAA//+P//j/gAD/wAB/gAP4B/4P/AD//4//+AAAAAAAAAAP//j//4P4AAfwAA/g//+P//gAAAAAAAAAA//g//+PAHjAAY4AOP//h//wAAAAAAD//4//+MDADAwA4cAP/AB/gAAAAAAAA//g//+PAHjAAc4APv//5//yAAAAAAD//4//+MGADBgA48AP//h+f4AAAAAAB+Pw/z+MOBjBwY/P+Hx/AAHgwAAMAAD//4//+MAADAAAAAAP//D//4AAOAABgAA4//+P//AAAAwAAP8AD//AA/+AAfgP/4//gPwAAAAA+AAP/4Af/4AD+A//j/wA/wAD/+AA/4B/+P/+D+AAAAAMADj8P4P/4A/4B//w+A+MABgAAA4AAPwAB/gAB/+A//j/gA+AAMAAAAAYwB+MH/jf+Y/8GPwBjAAAAAAP//7//+wABsAAYAAAAAAPAAD/gAH/gAD/gAD4AACAAADAAGwABv//7//+AAAA=="), 32, atob("BQUHCAgVCQQFBQkHBQcFBwgICAgICAgICAgFBQcHBwgPCQkJCQcHCQoFCQkHDQoJCQkJCAYJCQ0ICAcGBwY="), 20+(scale<<8)+(1<<16)); -} +}; Graphics.prototype.setFontAntonioLarge = function(scale) { // Actual height 39 (39 - 1) g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAPgAAAAAB8AAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAD8AAAAAH/gAAAAP/8AAAAf//gAAA///AAAB//+AAAD//8AAAH//4AAAP//wAAAB//gAAAAP/AAAAAB+AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAf////8AP/////4B//////Af/////8D8AAAAfgeAAAAA8DwAAAAHgeAAAAA8D//////gf/////8B//////AP/////wAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAHgAAAAAA8AAAAAAPgAAAAAB4AAAAAAf/////gP/////8B//////gP/////8B//////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/+AAP8A//wAP/gP/+AH/8D//wD//gfgAA//8DwAAf+HgeAAP/A8DwAH/gHgfgP/wA8D///4AHgP//+AA8A///AAHgB//AAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AA/gAD/AAH/gA/4AA/+AP/AAH/4D/4AA//gfgA4AB8DwAPAAHgeAB4AA8DwAPgAHgfAD+AB8D//////gP/////4B//5//+AD/+H//gAH/AH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAP/AAAAAP/4AAAAP//AAAAP/x4AAAf/wPAAAf/gB4AAf/AAPAAP/AAB4AB//////gP/////8B//////gP/////8AAAAAPAAAAAAB4AAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//wD/AB///Af+AP//4D/4B///Af/gP//4B/8B4D4AAPgPAeAAA8B4DwAAHgPAfAAB8B4D////gPAf///4B4B////APAD///gAAAD//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAP////4AH/////wB//////Af/////8D8APAA/geADwAB8DwAeAAHgeADwAA8D4AeAAPgf/j+AH8B/8f///gP/h///4Af8H//+AAPgP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAPAAAAAAB4AAAABgPAAAA/8B4AAB//gPAAD//8B4AH///gPAH///8B4P//+AAPH//wAAB///gAAAP//AAAAB/+AAAAAP+AAAAAB+AAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4A/+AAf/w//+AP//v//4B//////Af/////8D4AfwAPgeAB8AA8DwAHAAHgeAB8AA8D4Af4APgf/////8B//////AP//v//4A//4//8AA/4A/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAD//+D/gB///4f+AP///j/4D///8f/gfAAHgB8DwAA8AHgeAAHgA8DwAA8AHgfgAHgB8D//////gP/////4A/////+AD/////gAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAfgAAB+AD8AAAPwAfgAAB+AD8AAAPwAfgAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DBATExMTExMTExMTCw=="), 45+(scale<<8)+(1<<16)); -} +}; /* * Draw watch face @@ -548,4 +548,4 @@ g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); draw(); // After drawing the watch face, we can draw the widgets -// Bangle.drawWidgets(); \ No newline at end of file +// Bangle.drawWidgets(); From 421681fec9c3e8dc5f93996b489fd52ac5375148 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Thu, 23 Dec 2021 16:06:55 +0100 Subject: [PATCH 298/476] lcars: Show "0" on timer Sometimes when my watch buzzes, I look at it and am puzzled why. Until I remember that I had a timer set. This now shows a timer of "0". --- apps/lcars/lcars.app.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 5042560d3..6e0a46844 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -201,7 +201,7 @@ function drawState(){ // Alarm within symbol g.setFontAntonioMedium(); - if(isAlarmEnabled() > 0){ + if(isAlarmEnabled()){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); g.drawString(getAlarmMinutes(), 115+25, 107+25+1); @@ -404,7 +404,7 @@ function getCurrentTimeInMinutes(){ } function isAlarmEnabled(){ - return settings.alarm > 0; + return settings.alarm >= 0; } function getAlarmMinutes(){ @@ -429,11 +429,13 @@ function handleAlarm(){ .then(() => new Promise(resolve => setTimeout(resolve, t))) .then(() => Bangle.buzz(t, 1)) .then(() => new Promise(resolve => setTimeout(resolve, t))) - .then(() => Bangle.buzz(t, 1)); - - // Update alarm state to disabled - settings.alarm = -1; - Storage.writeJSON(SETTINGS_FILE, settings); + .then(() => Bangle.buzz(t, 1)) + .then(() => new Promise(resolve => setTimeout(resolve, 5E3))) + .then(() => { + // Update alarm state to disabled + settings.alarm = -1; + Storage.writeJSON(SETTINGS_FILE, settings); + }); } From 8c416bab55afbad98b73d4a7aa594a22720f1acc Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Tue, 28 Dec 2021 18:25:43 +0000 Subject: [PATCH 299/476] Tidy graphics --- apps/coretemp/coretemp.js | 37 +++++++++++++-------- apps/coretemp/widget.js | 68 ++++++++++++++++++++++++++------------- 2 files changed, 69 insertions(+), 36 deletions(-) diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 1ad380855..358a2daed 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -2,20 +2,32 @@ Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); + var btm = g.getHeight() - 1; - -function onCore(c) { - var px = g.getWidth() / 2; - g.setFontAlign(0, 0); - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); - - var core = "Core: " + c.core + c.unit; - var skin = "Skin: " + c.skin + c.unit; - - g.setFontVector(24).drawString(core, px, 45); - g.setFontVector(24).drawString(skin, px, 65); +var img = { + width : 146, + height : 48, + bpp : 4, + transparent : 0, + palette : new Uint16Array([ 65535, 65535, 2854, 1419 ]), + buffer : + require("heatshrink") + .decompress(atob( + "AEUDmczmBD/I4xJ/AAMCkBHFAAJG8kQABJAJHFSVURAAUQRphHCkQGBJAySngJHDJRhHEJALZDAgiSBEQ0RPBIAKHAwQQI4xIEaoQFEEZpIULSRHFkDZDBwZIMEYhITa44SKSAxIDSARIDJ4IjKJCpHNEoiQGJDA2CJCQSOCYaQGJDBsCGiKQGTZIJCI4xBEJBAAEFpQAPDQoMGBQyOGIJJPGF6AALC5glCbJAQEgZCEAoowTSBypJBwKQMIQaSBAgZIJWw5ITB5RTDSBLbEAAjDOPRIVabIiQFJBCQKPYhIVCRxIEBg7WDSBpIVbJ5IQJIqQBgZIiCh7ZLJIriDbhJI3JoxIebIZITI6BIjCZ5IRI4RIPHAYAJJH4AIUAJIzHIhI/SAwzBJH6QGJH5HIHApI2HCIAJL4pITkATOJQJIMHCJeFJD8zaZCQHJCEBJCUCJCKPBJBhWGJEcia5oACJBSfHJB4QMJA6SLI4ZIKPAg3QJCUAJCbbBJETbPJAbbKbIhIBYJpIQbZ5UDbZzZFPBxIVSRIOBJA5JISAhIIF4ZIUfQpJHEwQKDJAhJHbJbBJJCIZECY4KGSQoABBIZOBSBbbIJC6IEBQqSJJoyQLbZBIRbYoAKJAaSHJAjbCF541RSRISLSRkgJAKQKbY5ISJJyQDSRyQMbYxITChhHFSRhGMbY5IUCpRHHJJZITiBIVbpBHJbpJHPFhBITfI4ANIwcgI6AAV")) } -Bangle.on('CoreTemp', onCore); + + function onCore(c) { + var core = "Core: " + c.core + "°" + c.unit; + var skin = "Skin: " + c.skin + "°" + c.unit; + + var px = g.getWidth() / 2; + g.setFontAlign(0, 0); + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + g.drawImage(img, 0, 30); + g.setColor(0xC618); // Light gray + g.setFont("6x8", 3).drawString(core, px, 48 + 48); + g.setFont("6x8", 3).drawString(skin, px, 48 + 48 + 24); + } Bangle.on('CoreTemp', onCore); g.clear(); Bangle.loadWidgets(); @@ -23,4 +35,3 @@ Bangle.drawWidgets(); g.reset().setFont("6x8", 2).setFontAlign(0, 0); g.drawString("Please wait...", g.getWidth() / 2, g.getHeight() / 2 - 16); - diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js index 4fe76ea38..c7d7f630c 100644 --- a/apps/coretemp/widget.js +++ b/apps/coretemp/widget.js @@ -1,47 +1,69 @@ -// Widget to show sensor status +// TODO Change to generic multiple sensor (() => { var settings = {}; - var count=0; + var count = 0; + + var img0 = { + width : 24, + height : 24, + bpp : 4, + transparent : 0, + buffer : + require("heatshrink") + .decompress(atob( + "AA0IxGIBAtms0ABQOIwAKFsAWCDAkGBYQUCBwIKEBYgmBBYoHBC4oKDBAILECwRSFDQQLBsBLDBYg4CNYoKBwALGDQYLCQpALaF45jBBZBfJMIZ3GZgwkGZYibCDIMGWoILDWYbBDd4gMFWoTvFYYgAFEYYHDA==")) + }; + var img1 = { + width : 24, + height : 24, + bpp : 3, + transparent : 0, + buffer : + require("heatshrink") + .decompress(atob( + "AAkCpMgAwYFBiVJkgHCAoMAyQIBwAIBAoMEyEABAUkBAkEBAdICIkBBAIdBBAcJEwo1BBAI4EAoJBEKAMAiAIEAAIvBLgosBBCYjFJQIIFKwJHFBARZFBwRrCNAKbCC4J0CpApFR4REGBAWShIxDPQSSCYogvEA=")) + }; // draw your widget function draw() { - if (!settings.enabled) return; + if (!settings.enabled) + return; g.reset(); - g.setFontAlign(0,0); - g.clearRect(this.x,this.y,this.x+23,this.y+23); - g.setColor((count&1)?"#00ff00":"#80ff00"); - g.fillCircle(this.x+6,this.y+6,4); - g.fillCircle(this.x+16,this.y+16,4); - g.setColor(-1); // change color back to be nice to other apps + g.setFontAlign(0, 0); + g.clearRect(this.x, this.y, this.x + 23, this.y + 23); + g.drawImage((count & 1) img1: img0, this.x, this.y); } -// Set a listener to 'twinkle' + // Set a listener to 'blink' function onTemp(temp) { - count=count+1; - WIDGETS["sensors"].draw(); + count = count + 1; + WIDGETS["coretemp"].draw(); } // Called by sensor app to update status function reload() { - settings = require("Storage").readJSON("coretemp.json",1)||{}; -// settings.fileNbr |= 0; + settings = require("Storage").readJSON("coretemp.json", 1) || {}; - Bangle.removeListener('CoreTemp',onTemp); + Bangle.removeListener('CoreTemp', onTemp); if (settings.enabled) { - WIDGETS["sensors"].width = 24; + WIDGETS["coretemp"].width = 24; Bangle.on('CoreTemp', onTemp); } else { - WIDGETS["sensors"].width = 0; + WIDGETS["coretemp"].width = 0; + count = 0; } - } // add the widget - WIDGETS["sensors"]={area:"tl",width:24,draw:draw,reload:function() { - reload(); - Bangle.drawWidgets(); // relayout all widgets - }}; + WIDGETS["coretemp"] = { + area : "tl", + width : 24, + draw : draw, + reload : function() { + reload(); + Bangle.drawWidgets(); // relayout all widgets + } + }; // load settings, set correct widget width reload(); - })() From bffd4d533409534048da4f598cb15d62212c4d3b Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Tue, 28 Dec 2021 18:26:45 +0000 Subject: [PATCH 300/476] Missed semi --- apps/coretemp/coretemp.js | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 358a2daed..2d4e99abf 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -14,20 +14,21 @@ var img = { require("heatshrink") .decompress(atob( "AEUDmczmBD/I4xJ/AAMCkBHFAAJG8kQABJAJHFSVURAAUQRphHCkQGBJAySngJHDJRhHEJALZDAgiSBEQ0RPBIAKHAwQQI4xIEaoQFEEZpIULSRHFkDZDBwZIMEYhITa44SKSAxIDSARIDJ4IjKJCpHNEoiQGJDA2CJCQSOCYaQGJDBsCGiKQGTZIJCI4xBEJBAAEFpQAPDQoMGBQyOGIJJPGF6AALC5glCbJAQEgZCEAoowTSBypJBwKQMIQaSBAgZIJWw5ITB5RTDSBLbEAAjDOPRIVabIiQFJBCQKPYhIVCRxIEBg7WDSBpIVbJ5IQJIqQBgZIiCh7ZLJIriDbhJI3JoxIebIZITI6BIjCZ5IRI4RIPHAYAJJH4AIUAJIzHIhI/SAwzBJH6QGJH5HIHApI2HCIAJL4pITkATOJQJIMHCJeFJD8zaZCQHJCEBJCUCJCKPBJBhWGJEcia5oACJBSfHJB4QMJA6SLI4ZIKPAg3QJCUAJCbbBJETbPJAbbKbIhIBYJpIQbZ5UDbZzZFPBxIVSRIOBJA5JISAhIIF4ZIUfQpJHEwQKDJAhJHbJbBJJCIZECY4KGSQoABBIZOBSBbbIJC6IEBQqSJJoyQLbZBIRbYoAKJAaSHJAjbCF541RSRISLSRkgJAKQKbY5ISJJyQDSRyQMbYxITChhHFSRhGMbY5IUCpRHHJJZITiBIVbpBHJbpJHPFhBITfI4ANIwcgI6AAV")) +}; + +function onCore(c) { + var core = "Core: " + c.core + "°" + c.unit; + var skin = "Skin: " + c.skin + "°" + c.unit; + + var px = g.getWidth() / 2; + g.setFontAlign(0, 0); + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + g.drawImage(img, 0, 30); + g.setColor(0xC618); // Light gray + g.setFont("6x8", 3).drawString(core, px, 48 + 48); + g.setFont("6x8", 3).drawString(skin, px, 48 + 48 + 24); } - - function onCore(c) { - var core = "Core: " + c.core + "°" + c.unit; - var skin = "Skin: " + c.skin + "°" + c.unit; - - var px = g.getWidth() / 2; - g.setFontAlign(0, 0); - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); - g.drawImage(img, 0, 30); - g.setColor(0xC618); // Light gray - g.setFont("6x8", 3).drawString(core, px, 48 + 48); - g.setFont("6x8", 3).drawString(skin, px, 48 + 48 + 24); - } Bangle.on('CoreTemp', onCore); +Bangle.on('CoreTemp', onCore); g.clear(); Bangle.loadWidgets(); From d707f1b7c42c73d979c641f52be82628b82eb830 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 20:58:43 +0100 Subject: [PATCH 301/476] Create app.js --- apps/minimal_clock/app.js | 214 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 apps/minimal_clock/app.js diff --git a/apps/minimal_clock/app.js b/apps/minimal_clock/app.js new file mode 100644 index 000000000..e94881d03 --- /dev/null +++ b/apps/minimal_clock/app.js @@ -0,0 +1,214 @@ + let ScreenWidth = g.getWidth(), CenterX = ScreenWidth/2; + let ScreenHeight = g.getHeight(), CenterY = ScreenHeight/2; + + let outerRadius = Math.min(CenterX,CenterY) * 0.9; + + Bangle.loadWidgets(); + +/**** updateClockFaceSize ****/ + + function updateClockFaceSize () { + CenterX = ScreenWidth/2; + CenterY = ScreenHeight/2; + + outerRadius = Math.min(CenterX,CenterY) * 0.9; + + if (global.WIDGETS == null) { return; } + + let WidgetLayouts = { + tl:{ x:0, y:0, Direction:0 }, + tr:{ x:ScreenWidth-1, y:0, Direction:1 }, + bl:{ x:0, y:ScreenHeight-24, Direction:0 }, + br:{ x:ScreenWidth-1, y:ScreenHeight-24, Direction:1 } + }; + + for (let Widget of WIDGETS) { + let WidgetLayout = WidgetLayouts[Widget.area]; // reference, not copy! + if (WidgetLayout == null) { continue; } + + Widget.x = WidgetLayout.x - WidgetLayout.Direction * Widget.width; + Widget.y = WidgetLayout.y; + + WidgetLayout.x += Widget.width * (1-2*WidgetLayout.Direction); + } + + let x,y, dx,dy; + let cx = CenterX, cy = CenterY, r = outerRadius, r2 = r*r; + + x = WidgetLayouts.tl.x; y = WidgetLayouts.tl.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.tr.x; y = WidgetLayouts.tr.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.bl.x; y = WidgetLayouts.bl.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.br.x; y = WidgetLayouts.br.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + CenterX = cx; CenterY = cy; outerRadius = r * 0.9; + } + + updateClockFaceSize(); + +/**** custom version of Bangle.drawWidgets (does not clear the widget areas) ****/ + + Bangle.drawWidgets = function () { + var w = g.getWidth(), h = g.getHeight(); + + var pos = { + tl:{x:0, y:0, r:0, c:0}, // if r==1, we're right->left + tr:{x:w-1, y:0, r:1, c:0}, + bl:{x:0, y:h-24, r:0, c:0}, + br:{x:w-1, y:h-24, r:1, c:0} + }; + + if (global.WIDGETS) { + for (var wd of WIDGETS) { + var p = pos[wd.area]; + if (!p) continue; + + wd.x = p.x - p.r*wd.width; + wd.y = p.y; + + p.x += wd.width*(1-2*p.r); + p.c++; + } + + g.reset(); + + if (pos.tl.c || pos.tr.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); + } + + if (pos.bl.c || pos.br.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); + } + + try { + for (wd of WIDGETS) { + g.clearRect(wd.x,wd.y, wd.x+wd.width-1,23); + wd.draw(wd); + } + } catch (e) { print(e); } + } + }; + + let HourHandLength = outerRadius * 0.5; + let HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; + + let MinuteHandLength = outerRadius * 0.7; + let MinuteHandWidth = 2*2, halfMinuteHandWidth = MinuteHandWidth/2; + + let SecondHandLength = outerRadius * 0.9; + let SecondHandOffset = 6; + + let twoPi = 2*Math.PI; + let Pi = Math.PI; + let halfPi = Math.PI/2; + + let sin = Math.sin, cos = Math.cos; + + let HourHandPolygon = [ + -halfHourHandWidth,halfHourHandWidth, + -halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth, + ]; + + let MinuteHandPolygon = [ + -halfMinuteHandWidth,halfMinuteHandWidth, + -halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth, + ]; + +/**** transforme polygon ****/ + + let transformedPolygon = new Array(HourHandPolygon.length); + + function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { + let sPhi = sin(Phi), cPhi = 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; + } + } + +/**** draw clock hands ****/ + + function drawClockHands () { + 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('#FFFFFF'); + + 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); + + g.setColor('#FF0000'); + g.drawLine( + CenterX + SecondHandOffset*sPhi, + CenterY - SecondHandOffset*cPhi, + CenterX - SecondHandLength*sPhi, + CenterY + SecondHandLength*cPhi + ); + } + +/**** refreshDisplay ****/ + + let Timer; + function refreshDisplay () { + g.clear(); + + g.setColor(0,0,0); + g.fillRect(0,0, ScreenWidth,ScreenHeight); + + g.setBgColor(1,1,1); + Bangle.drawWidgets(); + + drawClockHands(); + + let Pause = 1000 - (Date.now() % 1000); + Timer = setTimeout(refreshDisplay,Pause); + } + + setTimeout(refreshDisplay, 500); // enqueue first draw request + + Bangle.on('lcdPower', (on) => { + if (on) { + if (Timer != null) { clearTimeout(Timer); Timer = undefined; } + refreshDisplay(); + } + }); + + Bangle.loadWidgets(); + + Bangle.setUI('clock'); From 8ca99f2d831d2dd37657d6b7a901615e217ea80e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:02:09 +0100 Subject: [PATCH 302/476] Create app-screenshot.png --- apps/minimal_clock/app-screenshot.png | Bin 0 -> 1469 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/minimal_clock/app-screenshot.png diff --git a/apps/minimal_clock/app-screenshot.png b/apps/minimal_clock/app-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8db4f5fb9a15b0101e26b763aab04f7fb33021b9 GIT binary patch literal 1469 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfwkPz#WAEJ z?(LnxpeRQHhrk>E7x_B&EETa}x#yd6@1wa<-}ZjpNk<+(EU2)q2u{doR6gLW{`}T+ zCWdB%T?_{nAAkOd!FZHKTo`=+^Ys3`dwjcS$^0u6f4l zfzZ48x0!9S`*!bntGj2i;QK0O|N4LB@53KzANu=ak+lq8{Cu9f(N9_Ly+5C@yzX~Q z?}Moi-^qR0`fwlD6WarKO&`2xvyuHc@54NS_n$03X!HFPwO@WUcu6c%9Bd!|9{@8DBW&*i1o)Ye|Bx1|3%XGi>KQ@zWcZMLA3qDd(6*e^#7!H zthSyaU;TCRfB#>f@9yK;D0PS{;Oms6uZ0KyT3I%TPYPeKt;%cTFN+6p@*)RThyD>? zFKPd43)4O8wt~m84F9^zv@@=6`}lJHue-natyh1}x%;(%AF0abGsewj zeD~Lx@yEZgen&ewdozO_{Kx)1OJuOWSi<_L=8N@%tG{pU>gQ#8aC}#-O&05CmLCNl z?Hg84e=zS)h?||vgWh9h!k>5#n7uQ5$artr@W+C^0SE;U?pl-zx+5WLm#vCK3#@_+t*(fGB!Lu(3j86 maOYcTRSW|#vS_L057QC1PJz8uvyTJIV+K!GKbLh*2~7ZLb=Xq? literal 0 HcmV?d00001 From 8978e92bbc1e868bc8d8d66d99ff72adcc7939f3 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:16:38 +0100 Subject: [PATCH 303/476] Create LICENSE --- apps/minimal_clock/LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 apps/minimal_clock/LICENSE diff --git a/apps/minimal_clock/LICENSE b/apps/minimal_clock/LICENSE new file mode 100644 index 000000000..7487dd5da --- /dev/null +++ b/apps/minimal_clock/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Andreas Rozek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From ea187361498d7e3854a49d453838c4aad46f8f7d Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:16:42 +0100 Subject: [PATCH 304/476] Create app-icon.png --- apps/minimal_clock/app-icon.png | Bin 0 -> 1312 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/minimal_clock/app-icon.png diff --git a/apps/minimal_clock/app-icon.png b/apps/minimal_clock/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..32e1a342590fa03cb75adb0b00f12491b3b0c264 GIT binary patch literal 1312 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTCmUKs7M+SzC{oH>NS%G|oWRD45dJguM!v-tY$DUh!@P+6=(yL;4JWnEM{Qf76xHPhFNnY z7#J8MGeaUuB7A+UlJj%*5>xV%QuQiw3xKK_7;Gx6fXv*~l0=1y+?>2(s|s5sunH?6 z8zii+qySb@l5MLL;TxdfoL`ixV5(=LXP{)qrJ$f-QP|K%!RuMVYBUn?dH= z8QOqVqKHB5vC#)vj^r4KPr;%vQo;#h7$;KjMD;p^^b><|oDu|VmT zj)>2zWo8$B(*54gnblQ!r&!<7g5B?2w%mPl2G6=*C}G(p?cv3&n=!C zJQ8jPrcFp>=)IcD*5jO!aUku0LBp|EX3WPFOL$nA7$3ytXJ@dn6jWDRFA37@IGXhJ zQTV4n)dx!R^YYw^`f_t~Pq8(w%JNRBkdc+uot&SWs~dg2;jHbC0*jbuJ)I#%8V4fN z5)v4G|N1qh#z5l8-o3Ulk&%I~|NZ;dRVMelAlB((hRC~j?-FWiWWvJ37cO7Ue(wBv z#kqdWsjW2!CeLzn@lcy=U}M9Ro}OM%S;;xmhb=EZKa_K$o%yzC|J5^fC9iH0%I%Xf zXKLQOdGo6|S&{DHi~LIal$DjE>Jt+gH{a9|>voNakH7xA)5Yn${O{EU|JheHT@YRz z^ION>%&cwp?Acu`^=sCy&AhptWk>6)IZErkFI&F+W3#!Se`$7_Qft; zO@!-ZY3~8od$x>aUv`*SSy=&tF?!;UP>l!IpQirtFpAIkGxPl8vuAnrbagwEzp`~5 ze_R!-UU1P^S;3E;o&BgnU0lo&rOOo+2mbuC6U+FOo9sNFpO^P#y2}?{w_>KC&2t!6 zem}WV^UuD`%|8!2*Vr2`K2RQHX;{IiUA3vqa+dIq`-Qho9%I*q!vnZl z7ibDG?%4Nl_jAR9&W7(SM~wQXFfKWFcJ~bJ;$MfqhB`%Od^jSMQNRRDJHXV#w5^4Q zIb%(pae|DKGxNSQhj(Y&B(zukc5?U^|JZwO%(j&EN>bwON%vb{eb#b)uHl~CZ9IMN z^R0L079`Z{)YzwVnCX}4S?+fqLa%=6WvG7krAYGcvsVAJ;Y@akdd9C$JI6db_`Fs1 fL2<+CS^t@P7i5M0`+7MGR1SH%`njxgN@xNA89@<} literal 0 HcmV?d00001 From bb34a51d7b00dc4df6fe141d4db2552aa50e2ddb Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:16:45 +0100 Subject: [PATCH 305/476] Create app-icon.js --- apps/minimal_clock/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/minimal_clock/app-icon.js diff --git a/apps/minimal_clock/app-icon.js b/apps/minimal_clock/app-icon.js new file mode 100644 index 000000000..dacc4c0fd --- /dev/null +++ b/apps/minimal_clock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwcBIf4A/AH4A/AHsD+ALJjgFE/4RK/+AAgUH/gvKj/+AYMB/5CMv/AAQYALh//EwYALGQJKEABcH8CMQER4ATEcYA/AH4A/dP4A/ABgA=")) \ No newline at end of file From 01c6dade6377ff29fc7023f49c41fd8151d023fb Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:16:47 +0100 Subject: [PATCH 306/476] Create README.md --- apps/minimal_clock/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/minimal_clock/README.md diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md new file mode 100644 index 000000000..0ba0060d7 --- /dev/null +++ b/apps/minimal_clock/README.md @@ -0,0 +1,12 @@ +# Minimal Analog Clock # + +This app probably displays the most basic analog clock one can think of - just +some clock hands and no clock face. + +![](app-screenshot.png) + +But actually it is almost "stylish" again just because of this simplicity. + +## License ## + +[MIT License](LICENSE) From fdb575fba96f00e85c487d30265f231dc62e2216 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:16:50 +0100 Subject: [PATCH 307/476] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index dd5f0cc6d..67b1dbc09 100644 --- a/apps.json +++ b/apps.json @@ -5077,5 +5077,22 @@ {"name":"colorwheel.app.js","url":"app.js"}, {"name":"colorwheel.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "minimal_clock", + "name": "a minimal analog clock", + "shortName":"Minimal Clock", + "version":"0.01", + "description": "a minimal analog clock - just with some hands and no further clock face", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"minimal_clock.app.js","url":"app.js"}, + {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} + ] } ] From 9cc4d84c1572c1cd1f870165fff716534b7003c0 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:20:23 +0100 Subject: [PATCH 308/476] Update README.md --- apps/minimal_clock/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md index 0ba0060d7..cba486072 100644 --- a/apps/minimal_clock/README.md +++ b/apps/minimal_clock/README.md @@ -1,6 +1,6 @@ # Minimal Analog Clock # -This app probably displays the most basic analog clock one can think of - just +This app displays the perhaps most basic analog clock one can think of - just some clock hands and no clock face. ![](app-screenshot.png) From 51f09703c2e32366e3856c304959ffa07856dc67 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Tue, 28 Dec 2021 21:20:54 +0100 Subject: [PATCH 309/476] Update apps.json --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 67b1dbc09..a9b873e5e 100644 --- a/apps.json +++ b/apps.json @@ -5079,8 +5079,8 @@ ] }, { "id": "minimal_clock", - "name": "a minimal analog clock", - "shortName":"Minimal Clock", + "name": "minimal Analog Clock", + "shortName":"Minimal Analog Clock", "version":"0.01", "description": "a minimal analog clock - just with some hands and no further clock face", "icon": "app-icon.png", From 8692af197adc7983095f18373305e7c89cca9463 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Tue, 28 Dec 2021 21:09:26 +0000 Subject: [PATCH 310/476] Tidy up and add icons --- apps.json | 2 +- apps/coretemp/boot.js | 5 ++-- apps/coretemp/coretemp.js | 52 +++++++++++++++++++++++++++++++++------ apps/coretemp/settings.js | 10 ++++---- apps/coretemp/widget.js | 2 +- 5 files changed, 55 insertions(+), 16 deletions(-) diff --git a/apps.json b/apps.json index 84cd2a96c..12d7db79e 100644 --- a/apps.json +++ b/apps.json @@ -4963,7 +4963,7 @@ }, { "id": "coretemp", - "name": "Core Temp Display", + "name": "CoreTemp", "version": "0.03", "description": "Display CoreTemp device sensor data", "icon": "coretemp.png", diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 3ae9b41ac..269c8e9ff 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -1,5 +1,6 @@ -//If enabled run in the background continuously. - +// +// If enabled in settings run constantly in background +// (function() { var settings = {}; diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 2d4e99abf..afb905c99 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -4,7 +4,7 @@ Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); var btm = g.getHeight() - 1; -var img = { +var corelogo = { width : 146, height : 48, bpp : 4, @@ -16,23 +16,61 @@ var img = { "AEUDmczmBD/I4xJ/AAMCkBHFAAJG8kQABJAJHFSVURAAUQRphHCkQGBJAySngJHDJRhHEJALZDAgiSBEQ0RPBIAKHAwQQI4xIEaoQFEEZpIULSRHFkDZDBwZIMEYhITa44SKSAxIDSARIDJ4IjKJCpHNEoiQGJDA2CJCQSOCYaQGJDBsCGiKQGTZIJCI4xBEJBAAEFpQAPDQoMGBQyOGIJJPGF6AALC5glCbJAQEgZCEAoowTSBypJBwKQMIQaSBAgZIJWw5ITB5RTDSBLbEAAjDOPRIVabIiQFJBCQKPYhIVCRxIEBg7WDSBpIVbJ5IQJIqQBgZIiCh7ZLJIriDbhJI3JoxIebIZITI6BIjCZ5IRI4RIPHAYAJJH4AIUAJIzHIhI/SAwzBJH6QGJH5HIHApI2HCIAJL4pITkATOJQJIMHCJeFJD8zaZCQHJCEBJCUCJCKPBJBhWGJEcia5oACJBSfHJB4QMJA6SLI4ZIKPAg3QJCUAJCbbBJETbPJAbbKbIhIBYJpIQbZ5UDbZzZFPBxIVSRIOBJA5JISAhIIF4ZIUfQpJHEwQKDJAhJHbJbBJJCIZECY4KGSQoABBIZOBSBbbIJC6IEBQqSJJoyQLbZBIRbYoAKJAaSHJAjbCF541RSRISLSRkgJAKQKbY5ISJJyQDSRyQMbYxITChhHFSRhGMbY5IUCpRHHJJZITiBIVbpBHJbpJHPFhBITfI4ANIwcgI6AAV")) }; +first = true; function onCore(c) { - var core = "Core: " + c.core + "°" + c.unit; - var skin = "Skin: " + c.skin + "°" + c.unit; + var core = "Core: " + c.core + c.unit; + var skin = "Skin: " + c.skin + c.unit; var px = g.getWidth() / 2; g.setFontAlign(0, 0); - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); - g.drawImage(img, 0, 30); + if (first) { + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + g.drawImage(corelogo, px - 146 / 2, 30); + first = false; + } else { + g.clearRect(0, 48 + 48, g.getWidth(), 48 + 48 + 24 * 2); + } g.setColor(0xC618); // Light gray g.setFont("6x8", 3).drawString(core, px, 48 + 48); g.setFont("6x8", 3).drawString(skin, px, 48 + 48 + 24); } + Bangle.on('CoreTemp', onCore); g.clear(); + Bangle.loadWidgets(); Bangle.drawWidgets(); -g.reset().setFont("6x8", 2).setFontAlign(0, 0); -g.drawString("Please wait...", g.getWidth() / 2, g.getHeight() / 2 - 16); +// Background task will activate if settings are enabled. +function enableSensor() { + settings = require("Storage").readJSON("coretemp.json", 1) || {}; + + if (!settings.enabled) { + + settings.enabled = true; + require("Storage").write("coretemp.json", settings); + + Bangle.loadWidgets(); + Bangle.drawWidgets(); + } +} + +function drawMessage() { + settings = require("Storage").readJSON("coretemp.json", 1) || {}; + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + + if (!settings.enabled) { + g.reset().setFont("6x8", 2).setFontAlign(0, 0); + g.drawString("Disabled, press BTN2\nto enable.", g.getWidth() / 2, + g.getHeight() / 2 - 16); + } else { + g.reset().setFont("6x8", 2).setFontAlign(0, 0); + g.drawString("Please wait...\nWaiting for data", g.getWidth() / 2, + g.getHeight() / 2 - 16); + } +} + +setWatch(() => { enableSensor(); }, BTN2, {repeat : false}); + +drawMessage(); diff --git a/apps/coretemp/settings.js b/apps/coretemp/settings.js index 5cd98ae09..3fc2dfbf2 100644 --- a/apps/coretemp/settings.js +++ b/apps/coretemp/settings.js @@ -24,9 +24,9 @@ } function updateSettings() { - require("Storage").write("coretemp.json", settings); - if (WIDGETS["sensors"]) - WIDGETS["sensors"].reload(); + require("Storage").write("coretemp.json", s); + if (WIDGETS["coretemp"]) + WIDGETS["coretemp"].reload(); return; } @@ -34,10 +34,10 @@ const menu = { '' : {'title' : 'CoreTemp sensor'}, '< Back' : back, 'Enabled' : { - value : !!settings.enabled, + value : !!s.enabled, format : v => v ? "Yes" : "No", onchange : v => { - settings.enabled = v; + s.enabled = v; updateSettings(); } } diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js index c7d7f630c..2b5522875 100644 --- a/apps/coretemp/widget.js +++ b/apps/coretemp/widget.js @@ -31,7 +31,7 @@ g.reset(); g.setFontAlign(0, 0); g.clearRect(this.x, this.y, this.x + 23, this.y + 23); - g.drawImage((count & 1) img1: img0, this.x, this.y); + g.drawImage((count & 1) ? img1: img0, this.x, this.y); } // Set a listener to 'blink' From f2a02642fd733dd10cd884951dd97b122616312f Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Tue, 28 Dec 2021 21:55:35 +0000 Subject: [PATCH 311/476] Enable coretemp in Recorder --- apps/recorder/README.md | 1 + apps/recorder/interface.html | 17 ++++++++++++----- apps/recorder/widget.js | 15 +++++++-------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/apps/recorder/README.md b/apps/recorder/README.md index ba53a99f2..4a4561f1c 100644 --- a/apps/recorder/README.md +++ b/apps/recorder/README.md @@ -17,6 +17,7 @@ You can record * **GPS** GPS Latitude, Longitude and Altitude * **Steps** Steps counted by the step counter * **HR** Heart rate +* **Core** CoreTemp body temperature **Note:** It is possible for other apps to record information using this app as well. They need to define a `foobar.recorder.js` file - see the `getRecorders` diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index 81ce71e5d..42aa4e16d 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -16,13 +16,17 @@ function saveKML(track,title) { ${track[0].Heartrate!==undefined ? ` Heart Rate - `:``} + `:``} ${track[0].Steps!==undefined ? ` - Step Count`:``} -${track[0].Core!==undefined ? ` + Step Count + `:``} +${track[0].Core!==undefined ? ` Core Temp + `:``} +${track[0].Skin!==undefined ? ` + Skin Temp `:``} - + Tracks @@ -40,9 +44,12 @@ ${track.map(pt=>` ${0|pt.Heartrate}\n`).join("") ${track[0].Steps!==undefined ? ` ${track.map(pt=>` ${0|pt.Steps}\n`).join("")} `:``} -${track[0].Core!==undefined ? ` +${track[0].Core!==undefined ? ` ${track.map(pt=>` ${0|pt.Core}\n`).join("")} `:``} +${track[0].Skin!==undefined ? ` +${track.map(pt=>` ${0|pt.Skin}\n`).join("")} + `:``} diff --git a/apps/recorder/widget.js b/apps/recorder/widget.js index 0c86ff09a..4d8cdddb1 100644 --- a/apps/recorder/widget.js +++ b/apps/recorder/widget.js @@ -48,7 +48,7 @@ Bangle.removeListener('GPS', onGPS); Bangle.setGPSPower(0,"recorder"); }, - draw : (x,y) => g.setColor(hasFix?"#f00":"#888").drawImage(atob("DAyBAAACADgDuBOAeA4AzAHADgAAAA=="),x,y) + draw : (x,y) => g.setColor(hasFix?"#0ff":"#888").drawImage(atob("DAyBAAACADgDuBOAeA4AzAHADgAAAA=="),x,y) }; }, hrm:function() { @@ -84,30 +84,29 @@ }, temp:function() { - var temp = 0; + var core = 0, skin = 0; var hasCore = false; function onCore(c) { - temp=c.core; + core=c.core; + skin=c.skin; hasCore = true; } return { name : "Core", - fields : ["Core"], + fields : ["Core","Skin"], getValues : () => { - var r = [temp]; + var r = [core,skin]; return r; }, start : () => { hasCore = false; Bangle.on('CoreTemp', onCore); -// Bangle.setHRMPower(1,"recorder"); }, stop : () => { hasCore = false; Bangle.removeListener('CoreTemp', onCore); -// Bangle.setHRMPower(0,"recorder"); }, - draw : (x,y) => g.reset().drawImage(atob("DAyBAAADDHnnnnnnnnnnjDmDnDnAAA=="),x,y) + draw : (x,y) => g.setColor(hasCore?"#0f0":"#888").drawImage(atob("DAyBAAHh0js3EuDMA8A8AWBnDj9A8A=="),x,y) }; }, steps:function() { From e5a20256e51d46107fa7cc336c544c58891857ff Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 15:10:26 -0800 Subject: [PATCH 312/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index dc635540f..c31c4306f 100644 --- a/apps.json +++ b/apps.json @@ -5067,7 +5067,7 @@ "id": "promenu", "name": "Pro Menu", "version": "0.01", - "description": "Replace Bangle.js 1's built in show message.", + "description": "Replace Bangle.js 1's built in menu function.", "icon": "icons8-menu-48 (1).png", "type": "boot", "tags": "system", From ac53411af27a96c18eeeb6d5a9fe2681484c49d1 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 15:28:55 -0800 Subject: [PATCH 313/476] Update boot.js --- apps/promenu/boot.js | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index cbaa91815..e05896a47 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -1,6 +1,3 @@ -Bangle.loadWidgets(); -Bangle.drawWidgets(); - E.showMenu = function(items) { function RectRnd(x1,y1,x2,y2,r) { pp = []; @@ -30,7 +27,7 @@ E.showMenu = function(items) { var options = items[""]; if (options) menuItems.splice(menuItems.indexOf(""),1); if (!(options instanceof Object)) options = {}; - options.fontHeight = options.fontHeight||27; + options.fontHeight = options.fontHeight||35; if (options.selected === undefined) options.selected = 0; if (!options.fontHeight) @@ -50,11 +47,11 @@ E.showMenu = function(items) { var idx = E.clip(options.selected-(rows>>1),0,menuItems.length-rows); if (idx!=l.lastIdx) rowmin=undefined; // redraw all if we scrolled l.lastIdx = idx; - var iy = y; + var iy = y-5; g.reset().setFont('6x8',2).setFontAlign(0,-1,0); if (options.predraw) options.predraw(g); if (rowmin===undefined && options.title) { - g.drawString(options.title,(x+x2)/2,y-options.fontHeight); + g.drawString(options.title,(x+x2)/2,y-options.fontHeight+5); g.drawLine(x,y-7,x2,y-7); } if (rowmin!==undefined) { @@ -73,12 +70,18 @@ E.showMenu = function(items) { fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : 255,255,255); g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); - if(loc.translate(name).length >= 15){ - g.drawString(loc.translate(name).substring(0, 15)+"...",x+8,iy+4); - }else if(loc.translate(name).length >= 15 && "object" == typeof item){ - g.drawString(loc.translate(name).substring(0, 10)+"...",x+8,iy+4); + if(loc.translate(name).length >= 10 && "object" == typeof item){ + var v = item.value; + if (item.format) v=item.format(v); + v = loc.translate(""+v); + g.drawString(loc.translate(name).substring(0, 13-v.length)+"...",x+8,iy+7); + console.log("gippo"); }else{ - g.drawString(loc.translate(name),x+8,iy+4); + if(loc.translate(name).length >= 15){ + g.drawString(loc.translate(name).substring(0, 15)+"...",x+8,iy+7); + }else{ + g.drawString(loc.translate(name),x+8,iy+7); + } } if ("object" == typeof item) { var xo = x2; @@ -90,7 +93,7 @@ E.showMenu = function(items) { g.setColor(g.theme.fgH).drawImage("\x0c\x05\x81\x00 \x07\x00\xF9\xF0\x0E\x00@",xo,iy+(options.fontHeight-10)/2,{scale:2}); } g.setFontAlign(1,-1); - g.drawString(v,xo-6,iy+4); + g.drawString(v,xo-4,iy+8.5); } g.setColor(g.theme.fg); iy += options.fontHeight; From 2ee0106e6439cdd5885f7e040918290f4282a9ed Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 15:44:59 -0800 Subject: [PATCH 314/476] Update boot.js --- apps/promenu/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index e05896a47..c9028104c 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -67,7 +67,7 @@ E.showMenu = function(items) { var name = menuItems[idx]; var item = items[name]; var hl = (idx==options.selected && !l.selectEdit); - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : 255,255,255); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+20); g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); if(loc.translate(name).length >= 10 && "object" == typeof item){ From 919e36444c2876510ec3b04054e3ae4c2640eb52 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 15:52:58 -0800 Subject: [PATCH 315/476] Update boot.js --- apps/promenu/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index c9028104c..13d134ce5 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -67,7 +67,7 @@ E.showMenu = function(items) { var name = menuItems[idx]; var item = items[name]; var hl = (idx==options.selected && !l.selectEdit); - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+20); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+10); g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); if(loc.translate(name).length >= 10 && "object" == typeof item){ From a82a8586c7f50dedee0700bd91934fa134ca5fa8 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 16:52:47 -0800 Subject: [PATCH 316/476] Update boot.js --- apps/promenu/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 13d134ce5..577d7841c 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -67,7 +67,7 @@ E.showMenu = function(items) { var name = menuItems[idx]; var item = items[name]; var hl = (idx==options.selected && !l.selectEdit); - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+10); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+30); g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); if(loc.translate(name).length >= 10 && "object" == typeof item){ From 550e88db4fb65701ce82a52e7e07efaef7c30869 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 16:59:31 -0800 Subject: [PATCH 317/476] Update boot.js --- apps/promenu/boot.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 577d7841c..bdef661cf 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -171,3 +171,4 @@ E.showMenu = function(items) { }); return l; }; + From 5ef3d5d93b01b97bb58d202b62abbdb94dfd3525 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 16:59:50 -0800 Subject: [PATCH 318/476] Update boot.js --- apps/promenu/boot.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index bdef661cf..577d7841c 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -171,4 +171,3 @@ E.showMenu = function(items) { }); return l; }; - From 3a0099dff0ed8f6795fce59762a2302cef89678e Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 17:04:41 -0800 Subject: [PATCH 319/476] Add files via upload --- apps/promenu/pro-menu-screenshot.png | Bin 0 -> 3418 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/promenu/pro-menu-screenshot.png diff --git a/apps/promenu/pro-menu-screenshot.png b/apps/promenu/pro-menu-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2ae318eb8489b3b39b0b7392637dc89501e5f6c0 GIT binary patch literal 3418 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 DK6xs| literal 0 HcmV?d00001 From 91e41b71235ad6f5159796e7ef962131e389ad49 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 17:06:08 -0800 Subject: [PATCH 320/476] Update apps.json --- apps.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps.json b/apps.json index c31c4306f..3c9f4678b 100644 --- a/apps.json +++ b/apps.json @@ -5072,6 +5072,7 @@ "type": "boot", "tags": "system", "supports": ["BANGLEJS"], + "screenshots": [{"url":"pro-menu-screenshot.png"}], "storage": [ {"name":"promenu.boot.js","url":"boot.js"}, {"name":"promenu.img","url":"promenuIcon.js","evaluate":true} From 89d0c1173a1274c59a77944f5dd0c64079fc9e86 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Tue, 28 Dec 2021 20:23:15 -0800 Subject: [PATCH 321/476] Update boot.js --- apps/promenu/boot.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 577d7841c..9eac59bfa 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -67,14 +67,14 @@ E.showMenu = function(items) { var name = menuItems[idx]; var item = items[name]; var hl = (idx==options.selected && !l.selectEdit); - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+30); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+24); g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); - if(loc.translate(name).length >= 10 && "object" == typeof item){ + if(loc.translate(name).length >= 11 && "object" == typeof item){ var v = item.value; if (item.format) v=item.format(v); v = loc.translate(""+v); - g.drawString(loc.translate(name).substring(0, 13-v.length)+"...",x+8,iy+7); + g.drawString(loc.translate(name).substring(0, 15-v.length)+"...",x+8,iy+7); console.log("gippo"); }else{ if(loc.translate(name).length >= 15){ @@ -170,4 +170,4 @@ E.showMenu = function(items) { else l.select(); }); return l; -}; +}: From 39b3967183e21e867416cbefb04b78b46e64952b Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:36:13 +0100 Subject: [PATCH 322/476] Update apps.json --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index a9b873e5e..66cadc83d 100644 --- a/apps.json +++ b/apps.json @@ -5079,8 +5079,8 @@ ] }, { "id": "minimal_clock", - "name": "minimal Analog Clock", - "shortName":"Minimal Analog Clock", + "name": "Minimal Analog Clock", + "shortName":"Minimal Clock", "version":"0.01", "description": "a minimal analog clock - just with some hands and no further clock face", "icon": "app-icon.png", From 238ee425a12f58a39cc4209379f534441ea3647b Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:44:58 +0100 Subject: [PATCH 323/476] Update README.md --- apps/minimal_clock/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md index cba486072..918206a8f 100644 --- a/apps/minimal_clock/README.md +++ b/apps/minimal_clock/README.md @@ -7,6 +7,9 @@ some clock hands and no clock face. But actually it is almost "stylish" again just because of this simplicity. +This clock also acts as an example for the building blocks found in the author's +[GitHub repository](https://github.com/rozek/banglejs-2-activities) + ## License ## [MIT License](LICENSE) From 26dbd5fd5a06dc7fc3ef2e71f9618483ece3c74f Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:52:39 +0100 Subject: [PATCH 324/476] Create app.js --- apps/simple_clock/app.js | 234 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 234 insertions(+) create mode 100644 apps/simple_clock/app.js diff --git a/apps/simple_clock/app.js b/apps/simple_clock/app.js new file mode 100644 index 000000000..17d876d35 --- /dev/null +++ b/apps/simple_clock/app.js @@ -0,0 +1,234 @@ + let ScreenWidth = g.getWidth(), CenterX = ScreenWidth/2; + let ScreenHeight = g.getHeight(), CenterY = ScreenHeight/2; + + let outerRadius = Math.min(CenterX,CenterY) * 0.9; + + Bangle.loadWidgets(); + +/**** updateClockFaceSize ****/ + + function updateClockFaceSize () { + CenterX = ScreenWidth/2; + CenterY = ScreenHeight/2; + + outerRadius = Math.min(CenterX,CenterY) * 0.9; + + if (global.WIDGETS == null) { return; } + + let WidgetLayouts = { + tl:{ x:0, y:0, Direction:0 }, + tr:{ x:ScreenWidth-1, y:0, Direction:1 }, + bl:{ x:0, y:ScreenHeight-24, Direction:0 }, + br:{ x:ScreenWidth-1, y:ScreenHeight-24, Direction:1 } + }; + + for (let Widget of WIDGETS) { + let WidgetLayout = WidgetLayouts[Widget.area]; // reference, not copy! + if (WidgetLayout == null) { continue; } + + Widget.x = WidgetLayout.x - WidgetLayout.Direction * Widget.width; + Widget.y = WidgetLayout.y; + + WidgetLayout.x += Widget.width * (1-2*WidgetLayout.Direction); + } + + let x,y, dx,dy; + let cx = CenterX, cy = CenterY, r = outerRadius, r2 = r*r; + + x = WidgetLayouts.tl.x; y = WidgetLayouts.tl.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.tr.x; y = WidgetLayouts.tr.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.bl.x; y = WidgetLayouts.bl.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.br.x; y = WidgetLayouts.br.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + CenterX = cx; CenterY = cy; outerRadius = r * 0.9; + } + + updateClockFaceSize(); + +/**** custom version of Bangle.drawWidgets (does not clear the widget areas) ****/ + + Bangle.drawWidgets = function () { + var w = g.getWidth(), h = g.getHeight(); + + var pos = { + tl:{x:0, y:0, r:0, c:0}, // if r==1, we're right->left + tr:{x:w-1, y:0, r:1, c:0}, + bl:{x:0, y:h-24, r:0, c:0}, + br:{x:w-1, y:h-24, r:1, c:0} + }; + + if (global.WIDGETS) { + for (var wd of WIDGETS) { + var p = pos[wd.area]; + if (!p) continue; + + wd.x = p.x - p.r*wd.width; + wd.y = p.y; + + p.x += wd.width*(1-2*p.r); + p.c++; + } + + g.reset(); + + if (pos.tl.c || pos.tr.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); + } + + if (pos.bl.c || pos.br.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); + } + + try { + for (wd of WIDGETS) { + g.clearRect(wd.x,wd.y, wd.x+wd.width-1,23); + wd.draw(wd); + } + } catch (e) { print(e); } + } + }; + + let HourHandLength = outerRadius * 0.5; + let HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; + + let MinuteHandLength = outerRadius * 0.7; + let MinuteHandWidth = 2*2, halfMinuteHandWidth = MinuteHandWidth/2; + + let SecondHandLength = outerRadius * 0.9; + let SecondHandOffset = 6; + + let twoPi = 2*Math.PI; + let Pi = Math.PI; + let halfPi = Math.PI/2; + + let sin = Math.sin, cos = Math.cos; + + let HourHandPolygon = [ + -halfHourHandWidth,halfHourHandWidth, + -halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth, + ]; + + let MinuteHandPolygon = [ + -halfMinuteHandWidth,halfMinuteHandWidth, + -halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth, + ]; + +/**** drawClockFace ****/ + + function drawClockFace () { + g.setColor(1,1,1); + g.setFont('Vector', 22); + + 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); + } + +/**** transforme polygon ****/ + + let transformedPolygon = new Array(HourHandPolygon.length); + + function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { + let sPhi = sin(Phi), cPhi = 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; + } + } + +/**** draw clock hands ****/ + + function drawClockHands () { + 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('#FFFFFF'); + + 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); + + g.setColor('#FF0000'); + g.drawLine( + CenterX + SecondHandOffset*sPhi, + CenterY - SecondHandOffset*cPhi, + CenterX - SecondHandLength*sPhi, + CenterY + SecondHandLength*cPhi + ); + } + +/**** refreshDisplay ****/ + + let Timer; + function refreshDisplay () { + g.clear(); + + g.setColor(0,0,0); + g.fillRect(0,0, ScreenWidth,ScreenHeight); + + g.setBgColor(1,1,1); + Bangle.drawWidgets(); + + drawClockFace(); + drawClockHands(); + + let Pause = 1000 - (Date.now() % 1000); + Timer = setTimeout(refreshDisplay,Pause); + } + + setTimeout(refreshDisplay, 500); // enqueue first draw request + + Bangle.on('lcdPower', (on) => { + if (on) { + if (Timer != null) { clearTimeout(Timer); Timer = undefined; } + refreshDisplay(); + } + }); + + Bangle.loadWidgets(); + + Bangle.setUI('clock'); From cbe94794050e64e2936da9a2da1f17f70ec2a5ee Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:52:42 +0100 Subject: [PATCH 325/476] Create app-screenshot.png --- apps/simple_clock/app-screenshot.png | Bin 0 -> 1984 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/simple_clock/app-screenshot.png diff --git a/apps/simple_clock/app-screenshot.png b/apps/simple_clock/app-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..ec99c9fc64f2084080bdf0d0c460601962db00e8 GIT binary patch literal 1984 zcma)7YdDna8vf?<;TxfuaY&5TWMYg%Bs8LFScYtxN+oNL^r;-KwT2`LnP$F0MN>9~ z$SIYLg_%|-S2=t+M2V52QI;laQ4`7zu^jiTtJROSf9?0W-uJoR>wT{G`SIM(eW&f@ zc9UrpS zR_|CA#LjfvKA>+usQgFzczirNt22UN(fxT=wH6c_s1M$a5Z}{vbKDMu#qe%DmZIWy z+X&G}v&=$>?Y@`MNwwGY+YX@rj{5G3H$uLg4}d#bb;S@YvWN0ocAuwxZr` zN5ioz9Vt}lwO()1U5I&cRhp@e9M49mTjN9x?;=CrF+x%Vq|=z!X}kVlFzj*e-nLo$ zs8y%2M>$OP&zFl}9uIRj0?#e{($Y~$Wr~&034y$j)A6gFTE^d4=%B3uUcc|QYfaXgUZSivBN@2jln+VyF4f4i%>B<8J zwbK>*_y7FqhlIz}mTd4Cube+*L!Z#A*mtmFX7y5iRb)e9*+}o*MP@HiF8AH*=_ISI z9&XMtkh`YtCHB@0cRGSBglgIJXr1&nHb{31Tk&$x0Hg)^bGcU=GEOC+c};wEam@v+ z$^4FG?B_|CGO@|`Q{3A+!<}>w03|YpcFY7pUW$(-FJ~cUl1QeSSxrA?Bhbe~!9A7m zf<_j-;BX&1lwgF~`B#Unh6dk0(XYv@F0}%w(W(1#dp#9uFZ|wikhN`7Fqlj#Kj8ot z#|r5KT-ld7Sd2ybYFuC;(3(Kmmp(%6!?TAxxur!!)x(y>6_WFqMv7mE+I7xamXz5PqxX=sHtUBjGl;e%l3bFKN6)-~o z4gvvj3wXO!A2P(uq(HT$I?9%Avl01nzDJ0b;5kLsa{>d@D7VGhv^E>d_7H4&eSRO4 zFdI%I)K2T47!dS6Q%hUkq>h@3tgagP3rxcrG93FJSC8>q3aCW}wi zo});_uB2HP`o~1qE7D%w>wZXwNr6F`jDDu=x1atwFx}UIgE)>_s4OHv`=&mcF?h5l zrvLref0`-F0}uH5*R={5Ps^<1ocY!kvRGldvl#P1Bz5t{w}-ix+!ZO#4tzaIx;Y^b zy0`t%oCQnYmm-C0rXNM#*>uER9J3khc)w&3lLUj>Wz=W_rR~huz5@>Yzetj$G!f=r zO2^E$l}X_BE;=Z?#P0wxD8?9E!OCm+JJ|}6%$N8o1{p0Bs>t~jButJ#0ptsqF6MXO zD}8bK%28q5E=$nFeIx%H+sh=x7p)1s%d{(Bz)J=qgJZjXa> zsn=OMKzQIH^QSYa9HX`Bi6oYyXzB-7KLBlp>D?CraOS$~RR{=^y|$r65TTaF@6%OD zwY`Vd)H)%yMS1J^WdJ-w^e>^|{H+(iU@JJExA-JJ_k^`oTN;GX%n1zCF6*yeL|r+J;R&rI*hb_^ikFbX-$3m_spZKL z32HMzrkRr`F^Gete@mGxKwYRb)(E^y^QL*k=+gbdUmG3t7+2eD-MKR~UPwO)F6f@i zDXE^ve&)MJ3kw^({|5eGoyjvv-#0jOpK$n947R@a56IF%d&+mRKU dasN-zC4f3q{+;iQuu_#J13qkyXN?CU`Y&LlTI2u# literal 0 HcmV?d00001 From 56f564c156dd752c7901fcd579ba7103e90039a1 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:52:45 +0100 Subject: [PATCH 326/476] Create app-icon.png --- apps/simple_clock/app-icon.png | Bin 0 -> 2248 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/simple_clock/app-icon.png diff --git a/apps/simple_clock/app-icon.png b/apps/simple_clock/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b1dcc461e3e5e94885a58175df3368fbd3ec1a37 GIT binary patch literal 2248 zcmY*bc{tSH9{$>ju`f@fpJJj&mO<885R;{Ai6(2vK7(0|kwICqWXm>|!7n8JqR75R zAxcPS$TC^749OCeCDk3(?cRHy=WOqJKkxhboag*;;?G+c^Mn2Z0RX^nYJ#$6%_{qy z`v7aSW#75MnmE1Bn4bZFsubQmS1#5b;%;JX4gevt01y!k0J|(GVi5oWS%L2_0|1N$ z0AS+Z%~lB30T0o{J^%oCMfW=!ko&hd0I=C((RO4zb2FGb0jKQhL2&a_rr?MyHUJQ;350Eu5N@tGE!Q4-{?>Kl_weN^ToF`yinE=Kqt-uS$QStWtGB2Dz$k_wHfiY9m z88n7#*xnSAX)C6C*sSleI`x^n&+$TQbalzaPE7~Ccusl@T)w0;VLTJvj1g}34Lmj! z)12UO+f55pe}LY3c98S-Gfrk{sWxhY_CmY!^%{I9U1TDqbT_QF8#x`xo0^$N;JEv zsH~ZI`@PCaA_}Re7mh*}21c<7@=G)(B!H0Q#ngw+t>f<{wD5FMIg7Qrx*3!}fiI5P?zus8#Jnu7nqhhi(N_Zk=dM-`x{Fr0zLLpB#cAp6?5v)FMt`9*^J6vM9XI@ryk|uA_ge&i+tn~WaE=G- zQGIVkDvhw-)8s6W!SgZMGt9s%!{-B2a8a-rq!6$FLn?_~xDX(Q8%o!lD-KVqPSfQ) zp{RedTNACj^%uzio^B_AiU|G9v+ruSv}8)>o^Wv9t$f?n)zx9EuAwpPJQNwp#*s>; z%Cxq&+T_Cm?^g;`T$t80v9wI#gFs`;nS;Tx=)_OF*1|*UUlR?I<|~=Qhd&j4yDuPxSgS=p6yJ>?P zN+JTwCrd)gW>0};JF}>N@+5sYd?Xh6usm6 zM;4geWeB>t?TF+$INQtD4G*VJ4IWz>b+yjTepEF`>g27b0)zweUsfhMj>-+TMW;gn zq>)HN3S_a@{b1QjS0Xq|@7gY%wDr_du2xJeA*nR_>(*MYW$4y9p5$UWy}Mv#WyAXd z)$Cw|alQd#52Lg5u{&LBl_vk8J55HDVc#{-RIhDH z0axmU?b!)8E`l{QH08qit~SP=KE-=Tao}v?A^y#{J$tX?Cpo8dO>ARVK2I2l0#dbp zjC^D$@jYFU`+3Th8%DFt=xOmI*x93Oy(VnhG}Q;M=Pi-@GSO!VcP#xatQ!ub$Wpng-%y{{u4;V2jGqwcZ}vO~>* z%ZjYr8s}FfN-w5=5~apgU7`E0UVZ3L*HfEf-2H6B_f~+RQC@*b0l`SrDmh?dJ7Lpl zy4S4eFrQXye3>W?kACT9(06Sn*P_Fi5ogy2PLLh5o7kbvsPXDu8m!nA5-S02M;zXp zRuy~v&dJGXdqevOAv&4o{t|TQp1jn5 z3(gODo55XyDVo+8kU`1y1=rzlI5l;356R`-&&x{cbK%^6yy@(r-P{T7{MfN-Pqk~i z6p_A-gt_Z+q#>>eQ2|=&{z&h7~@u2NEKf{B<49zh>DQ+L>KHI%z^) zJ~&)?T}qcm5W>Bi8W4XtRSFq`*20Z@OjEZjxfB46L*K#ai3)B5|2&DRO6I47T&)Vk z->4xxG2KwU7e&Q9sfukgSE+6>9bi+hZ+F1cdfpww!k;Xxv-bZBre`fs4-GC~|2JlE B2#Npz literal 0 HcmV?d00001 From 9a13eb99a3270660612b54f592da587fbfaf6794 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:52:47 +0100 Subject: [PATCH 327/476] Create app-icon.js --- apps/simple_clock/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/simple_clock/app-icon.js diff --git a/apps/simple_clock/app-icon.js b/apps/simple_clock/app-icon.js new file mode 100644 index 000000000..9bc0ebfe1 --- /dev/null +++ b/apps/simple_clock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwcBIf4AOgPAjgROh/A/+AEZ8DCKH8Gp/4Gp0QCKAARgQRigFACMUICMT7SEcUAkAvK/EAv//BpH8eoYOBAQP//0ECIrvDCIQABj4TB8AREj4RCgIyFn4RJh5HBCJQ1DAA0/UKBuJQZIRgL4wRL4ARhAH4AIg4RQdIwRcnAjiLKIA/ACI=")) \ No newline at end of file From e1805a156305a0b286104240cc3851d4ffaa1299 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:52:50 +0100 Subject: [PATCH 328/476] Create README.md --- apps/simple_clock/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/simple_clock/README.md diff --git a/apps/simple_clock/README.md b/apps/simple_clock/README.md new file mode 100644 index 000000000..d33bde0b6 --- /dev/null +++ b/apps/simple_clock/README.md @@ -0,0 +1,12 @@ +# Simple Analog Clock # + +This app displays a simple, yet stylish, analog clock. + +![](app-screenshot.png) + +This clock also acts as an example for the building blocks found in the author's +[GitHub repository](https://github.com/rozek/banglejs-2-activities) + +## License ## + +[MIT License](LICENSE) From 63bacfe880a775451ab52e5951fb365c59fea1c6 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 06:52:52 +0100 Subject: [PATCH 329/476] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index 66cadc83d..544af0c71 100644 --- a/apps.json +++ b/apps.json @@ -5094,5 +5094,22 @@ {"name":"minimal_clock.app.js","url":"app.js"}, {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "simple_clock", + "name": "Simple Analog Clock", + "shortName":"Simple Clock", + "version":"0.01", + "description": "a simple, yet stylish, analog clock", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"minimal_clock.app.js","url":"app.js"}, + {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} + ] } ] From 71b978750d02d8bd129d3f0817e8829c92e5099b Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:04:25 +0100 Subject: [PATCH 330/476] Create app.js --- apps/colorful_clock/app.js | 251 +++++++++++++++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 apps/colorful_clock/app.js diff --git a/apps/colorful_clock/app.js b/apps/colorful_clock/app.js new file mode 100644 index 000000000..a1b495c3c --- /dev/null +++ b/apps/colorful_clock/app.js @@ -0,0 +1,251 @@ + let ScreenWidth = g.getWidth(), CenterX = ScreenWidth/2; + let ScreenHeight = g.getHeight(), CenterY = ScreenHeight/2; + + let outerRadius = Math.min(CenterX,CenterY) * 0.9; + + Bangle.loadWidgets(); + +/**** updateClockFaceSize ****/ + + function updateClockFaceSize () { + CenterX = ScreenWidth/2; + CenterY = ScreenHeight/2; + + outerRadius = Math.min(CenterX,CenterY) * 0.9; + + if (global.WIDGETS == null) { return; } + + let WidgetLayouts = { + tl:{ x:0, y:0, Direction:0 }, + tr:{ x:ScreenWidth-1, y:0, Direction:1 }, + bl:{ x:0, y:ScreenHeight-24, Direction:0 }, + br:{ x:ScreenWidth-1, y:ScreenHeight-24, Direction:1 } + }; + + for (let Widget of WIDGETS) { + let WidgetLayout = WidgetLayouts[Widget.area]; // reference, not copy! + if (WidgetLayout == null) { continue; } + + Widget.x = WidgetLayout.x - WidgetLayout.Direction * Widget.width; + Widget.y = WidgetLayout.y; + + WidgetLayout.x += Widget.width * (1-2*WidgetLayout.Direction); + } + + let x,y, dx,dy; + let cx = CenterX, cy = CenterY, r = outerRadius, r2 = r*r; + + x = WidgetLayouts.tl.x; y = WidgetLayouts.tl.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.tr.x; y = WidgetLayouts.tr.y+24; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY + 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.bl.x; y = WidgetLayouts.bl.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + x = WidgetLayouts.br.x; y = WidgetLayouts.br.y; dx = x - cx; dy = y - cy; + if (dx*dx + dy*dy < r2) { + cy = CenterY - 12; dy = y - cy; r2 = dx*dx + dy*dy; r = Math.sqrt(r2); + } + + CenterX = cx; CenterY = cy; outerRadius = r * 0.9; + } + + updateClockFaceSize(); + +/**** custom version of Bangle.drawWidgets (does not clear the widget areas) ****/ + + Bangle.drawWidgets = function () { + var w = g.getWidth(), h = g.getHeight(); + + var pos = { + tl:{x:0, y:0, r:0, c:0}, // if r==1, we're right->left + tr:{x:w-1, y:0, r:1, c:0}, + bl:{x:0, y:h-24, r:0, c:0}, + br:{x:w-1, y:h-24, r:1, c:0} + }; + + if (global.WIDGETS) { + for (var wd of WIDGETS) { + var p = pos[wd.area]; + if (!p) continue; + + wd.x = p.x - p.r*wd.width; + wd.y = p.y; + + p.x += wd.width*(1-2*p.r); + p.c++; + } + + g.reset(); + + if (pos.tl.c || pos.tr.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); + } + + if (pos.bl.c || pos.br.c) { + g.setClipRect(0,h-24,w-1,h-1); + g.reset(); + } + + try { + for (wd of WIDGETS) { + g.clearRect(wd.x,wd.y, wd.x+wd.width-1,23); + wd.draw(wd); + } + } catch (e) { print(e); } + } + }; + + let innerRadius = Math.min(CenterX,CenterY) * 0.8 - 14; + + let HourHandLength = outerRadius * 0.5; + let HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; + + let MinuteHandLength = outerRadius * 0.7; + let MinuteHandWidth = 2*2, halfMinuteHandWidth = MinuteHandWidth/2; + + let SecondHandLength = outerRadius * 0.9; + let SecondHandOffset = 6; + + let twoPi = 2*Math.PI; + let Pi = Math.PI; + let halfPi = Math.PI/2; + + let sin = Math.sin, cos = Math.cos; + + let HourHandPolygon = [ + -halfHourHandWidth,halfHourHandWidth, + -halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth-HourHandLength, + halfHourHandWidth,halfHourHandWidth, + ]; + + let MinuteHandPolygon = [ + -halfMinuteHandWidth,halfMinuteHandWidth, + -halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth-MinuteHandLength, + halfMinuteHandWidth,halfMinuteHandWidth, + ]; + +/**** drawClockFace ****/ + + function drawClockFace () { + for (let i = 0; i < 60; i++) { + let Phi = i * twoPi/60; + + let x = CenterX + outerRadius * sin(Phi); + let y = CenterY - outerRadius * cos(Phi); + + let Color = E.HSBtoRGB(i/60,1,1, true); + g.setColor(Color[0]/255,Color[1]/255,Color[2]/255); + + g.fillCircle(x,y, 1); + } + + g.setFont('Vector', 20); + g.setFontAlign(0,0); + + for (let i = 0; i < 12; i++) { + let Phi = i * twoPi/12; + + let Radius = innerRadius; + if (i >= 10) { Radius -= 4; } + + let x = CenterX + Radius * sin(Phi); + let y = CenterY - Radius * cos(Phi); + + let Color = E.HSBtoRGB(i/12,1,1, true); + g.setColor(Color[0]/255,Color[1]/255,Color[2]/255); + + g.drawString(i == 0 ? '12' : '' + i, x,y); + } + } + +/**** transforme polygon ****/ + + let transformedPolygon = new Array(HourHandPolygon.length); + + function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { + let sPhi = sin(Phi), cPhi = 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; + } + } + +/**** draw clock hands ****/ + + function drawClockHands () { + 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('#FFFFFF'); + + 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); + + g.setColor('#FF0000'); + g.drawLine( + CenterX + SecondHandOffset*sPhi, + CenterY - SecondHandOffset*cPhi, + CenterX - SecondHandLength*sPhi, + CenterY + SecondHandLength*cPhi + ); + } + +/**** refreshDisplay ****/ + + let Timer; + function refreshDisplay () { + g.clear(); + + g.setColor(0,0,0); + g.fillRect(0,0, ScreenWidth,ScreenHeight); + + g.setBgColor(1,1,1); + Bangle.drawWidgets(); + + drawClockFace(); + drawClockHands(); + + let Pause = 1000 - (Date.now() % 1000); + Timer = setTimeout(refreshDisplay,Pause); + } + + setTimeout(refreshDisplay, 500); // enqueue first draw request + + Bangle.on('lcdPower', (on) => { + if (on) { + if (Timer != null) { clearTimeout(Timer); Timer = undefined; } + refreshDisplay(); + } + }); + + Bangle.loadWidgets(); + + Bangle.setUI('clock'); From 976238c4acf5c8493c2242afdb6496fc8f9b09bb Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:04:29 +0100 Subject: [PATCH 331/476] Create app-screenshot.png --- apps/colorful_clock/app-screenshot.png | Bin 0 -> 3221 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/colorful_clock/app-screenshot.png diff --git a/apps/colorful_clock/app-screenshot.png b/apps/colorful_clock/app-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fbc1d854897bb70dfdfc196d3f2867addb315f16 GIT binary patch literal 3221 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 Date: Wed, 29 Dec 2021 07:04:32 +0100 Subject: [PATCH 332/476] Create app-icon.png --- apps/colorful_clock/app-icon.png | Bin 0 -> 4269 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/colorful_clock/app-icon.png diff --git a/apps/colorful_clock/app-icon.png b/apps/colorful_clock/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f2d00374a528dbd6d774a76477f26005648b3da0 GIT binary patch literal 4269 zcmY*dcU%)lx6RU}7o~|I2`WtpNRt+%_fVvV7J39ihX_(s5Rj5krFWzVQ4pkqt5lJ? zLZr7y6%Ys=T)$F zJC45GC|s5Gl>vYnEZrHB^70IF)H2ow0D^A=01=S@z{w>Pu?heLTqdsD0|0Uv004(~ zPP381<;4|mElWQDfR63=`~#4c!wCTVVTm%a@VC&{lXLX)6h%6DIXH`AJiRa30DuBU z?lSar_D6y+o*rmFIgBFYZ-(4u{2PWsKz~#G-4!7g`i3A?FJEVnl&GYr7z9QO0)Z5K zom}LM)inN1zdR{I-2DB$<)F}@pdis82~jU!SE#tGtSnUQF7)nQkxPb%-y^g?5+j24 z#qPo4fKm;ZG_`~BP2WrNV)H&Ag= zG3bA_FH;qMqjCnmDCbM(-}*3dg}<5q5Bt|g0s7ng{}l62r+=fDt-@#(p#Oa~7_Ht% zeoFv=v0YnD*~E=t};p zn7+hYuVeRG^Y`(mRzvUdHd+n_lZjdvUf@&SCy!d)lDp`N7#81m9EMrm!F2Ly2_QDt zO`>+w)E{ve0O_`4-iq9sQx%GY^q{AvN-5+Ucy|VoFmD|?;talQgu6(=;qAJn~k=QZ3$B7RDd zW^nC%{nnBBj)fvi5+whW8f8&m=aQX|KcPj@{dhRXu^zn(b0T|aS|u{Mc9?m4kmavFnr+8t9Oxd+fu1js5#93CJ*@dofi;2( zydAmwXFF3C;JU@fiY-9j?HkogU$u0fz()mUO4KVy0OvZ;RXr;Xp;G=jgoNNlo@5LO z(dbH8ei;j}d~a^~2}kz|HY1k2PGtTan|?F13=3I^zPlH#n5tK`k`$- zd503qThrFn+dsZ?Xc-vIda%ittV7l&f=UJbk^+36nVqRjofe+OMVAKD4PCU?0fp1P zB-QHuaT)=;BB1Up@1a>h(f^K$6*!(E2mExTs#q-}p1R37Fo()F8zn5;q>-|#O4<=J z7IPb`!;}WF3SF(aB84}2cvq9<L6TNpY=vws*M>RbO10(`hZ5BDF;}*q;6yry<$8zSYijy3dRe#_!aqhyEdL0>iJ9vS0jH!?rOE-x^!JE<1 zfN+CZR$80~s2yNx8kX0VsC~0;k^=B{{069rqz>nN?PwT*nwg)tc@Di(SLYP#zk)3d z3BNry?%>c6S(CX)?vESd}*Z%WDx(eol!#j^QBL9gLxt|LA;%2I{Nw< z7LO@i3*v8`lTkAp(iL6Dz`pp=4r#$pLQe3BrD3;*!hco~u4l!_tTMb9jtcDj402am zsDBtzmZ}Pi0SHnb&oU%1DuHMkj~tkvD?0WVmxhsNUG(ye!qO$k;_0qSfBQT$tV%tq z6GAN8fWR9b$S!m3thQd~J zLrJy3kN4Hy7_r37xO;y_Eu_kz>4o+3;*nJSbY;}Uzr2Onf|(5|AXN1rO!Doc-Qs4o zfygUVA%^SFy;fa;Bx)qp4dzMuNiTv%i1!toVy|0Y0nuM z$a``lVPG99^*_1{7iQG&i`I6exkf%`xfxI3q3E%14g-jfS>z2tzI&cX=~(HM?9p-~ zhc$Y=OPF;habR!q^P{7lQeDxcaXclGU5VF7h#P83|IE=_nA#==EF}-0EVEPHWqfZuzl$<<)^6aOB=V`;W&NHh$HZq6*x{$w$cW~+{aA`IebS#c?Gz>X zxGZfdO0fKDLue`2571Y*S{U-QdDzT~Wta9_>(YQ>qWa*&Jb-E#e@%>sU{Ui$E;I2)=1l8tentI`TYL^YYa1n-CC(+TTEGu?q)SD+?{00}k|9nRRS13g z9?$zUF7!-~jy(T7&i`XYVe6Ek)aE8V*JB^f4+?WriBf$Z1;VY~(Qqd|i!ctgl{sy{ zo7xn`nm&|Y+t&{Eu+A{3g|RKk-ekh$wRNgcJ$e*b$a`N+h?WcH+n%bzuaVmep4}>Y z-I}`3H(|h8iJY*Hs#Ok`$rq~UX7CNUchLpPc$zwp6L=lsT+UrTbI_J1=Q7RaK<4UD z2bi^GNFE?wXt&X9dQ_DUM{1|kJscBC%XoD_zU}zrVYDt5sk41brDp$h_MLvjwH%Yp zXtC&m^0alu&b#NN(>IBiepO#-4V_%Ld3FhqChm=CY)8 zWih#wSS7ry?#s&d8Y8bZO$q{&8aQ=Qn&m8)Ufd$;bo&Y$TsF5nHNuN-i=WA7o!)g( z{s#Ysu@Fc`qIoz}??LFqx{r>!i!}Z)J-edr!2L}dyH5~f&CdSrNig+x^Z2?adfF^T zFrh#5m@7XiyIzb0hKa_#k>5Dvd0Q{P@Z`@2jZn?6UWP?fWY2Z#3K?&RUnj>ZlCIu* zCwY8)Y}J6y-ER9)+y5B0yI9{5_#Qtmw-IDOZ<83S5)+21)}U=hRAa+5D@ld|F0Z$hQToQLBGFHBfgj>rqJquzdzX%zGE+04^)qa}!O?kp&OUqdlz;Vy2T0}^p{C81ljN9t2ixRP zUL*W8{F=bfI^GnW1)9^l*-bf{_H~lckD07m7>1mF`Xx_b>9msC8faurv2LKPj)dAc z8`kffXR$`HyC(u2IcG`bkFOoilwh9+BM;Th72dp+TzxX8tE+q7Xshpv4zwtCS2_@x zm(I>!$B5XdX1aYPaHQBJPSow}8zH)_C2Xa|$n`!Dy+(J-%f1(Tzj3$|8^DiGEf7=Hm8PicgsdkM+ug~fOB0`e~A&8U;iY{>&? z?rI_99~=+gi=CFu2CSJY(E7?bE9}-5*gK#UiK8XLSV-G&mw z=Cz#8hJDWW;T$$sPxMFP9uz*_!jze_^t}ux`fq$0Hk0~*GCV@6x$Z6a5d=q?n-T^1 zQzdrdKDT*;ZjXEe=E8-!O~S5@lX!|Ms&nu=tQp6zx2DQpfD1k6Kj5G$Rj>5<-sUUY z`_aoK9&{ZH;iuB^M9pV}QV9cwCH)K;zx5S8T%sHoBPf_^er_LO>bADCl?^DK5Ur%; zF6nu5pPpNp!sl)b$6Ufa#k06_k>n6Oiy{x@pT8EVUrutz+MKa{VRLV^>)iY$!M^c} z|I<+sP1@e@YYoVvaNY`@rDn!GusnPYLDdXC^_z34w)s<=YrL*G`Jcnhn& zAG{@7*5r4?ZUt^`cca_f%r}z|cda&5G{3jv$YU zgFdF!k#f6c_$HYf;F48URKn_2?mtI$V|p?dfW*RRX5K2+mo1e<;$d``ohy)PVX%i& zlOKUnT=Zuij^o;NHG}nX)%Hk(%X*5Kegu-Vr#oi>yJ;CM{K4>FM1FPak#_?RQ*e7O z)1&76euQ7)%-Gg9-y-TCC1i6~4Kr@nGUgC;`wLm@=~9sna}%uTashHOSWwtHChV!2 zAOfL6KYil*L(aN+DLlsg-j2c9^||Lct4a&1S>iP68S^8(7ZO-w*Fghbrj0T7C62)7 zyUOiMxd6mBe76qRNxsa*P$B*sM^~%Av^Xzqh;+cIY%O^WBxl@iO@gud5!DWPUy~BZ zrK$+60W617`*cqYY$NYCERqTZswPe|oU)h!9rov4;H%r>fnPYwe3lq<5bR+*<_wQc z=2Po?nz@d6fYcV%)SQ|JK9l6k9K7|Qzu37u!4&3bnA_fkl>Krbd`iJPL=)@GShjlz zw!g?d?j+?KYk!H2y0%Qc`2M^Hh&<<2{lEeV5cunYs$Len5xIzB{rxGRtqxbitJpvN E4_0sLVE_OC literal 0 HcmV?d00001 From 1b6d7f2270daf7f6d28d4662fab0a1c1f23af8b4 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:04:34 +0100 Subject: [PATCH 333/476] Create app-icon.js --- apps/colorful_clock/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/colorful_clock/app-icon.js diff --git a/apps/colorful_clock/app-icon.js b/apps/colorful_clock/app-icon.js new file mode 100644 index 000000000..31af1f0e2 --- /dev/null +++ b/apps/colorful_clock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgZC/AB0BkmCCBsShEAiFBkARLwEBkGSgEECBQdBCIMSAwMYCBEKCgeQgE2gFgCA0C6Moiw1Dk0AhoRGikACIIHDgzECCI5ECg/gEYOACI+ggMti2ACIUkCIImCABARCAAMNCYIADgu0hdACI1twHACQm0rdoCI0BEYsoilRCI9sUgkBoG2rY1JgYjDCINLCI4fCa5ARHAAggCfYIjLgUB0AECCIy7BFwUCR4IKChIRFm1ACJAjGgwRL+AFDiwREI4YABn41FI4hxFn6IJPoh1B/AQFUI4ABh4RGUIsEyARC4ALEwAjECIl/CIkECIsICId+EQkkwEIA4gRDAAojBLwwHFexAADhaFDgETBw6UChdgA4cbCIKuGggCBCIMDCIkQCI8BEwMbCgMSAQIRGgGQQoQRCEYJrGAAMGIgZKDmBzIjARFTwpuHAARoGAAsMwQVCzARLAAPbtq5KAH4AEA")) \ No newline at end of file From 9a2b423c784777d069a57249c2d1df3c0e8bf614 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:04:37 +0100 Subject: [PATCH 334/476] Create README.md --- apps/colorful_clock/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 apps/colorful_clock/README.md diff --git a/apps/colorful_clock/README.md b/apps/colorful_clock/README.md new file mode 100644 index 000000000..eb90e3e56 --- /dev/null +++ b/apps/colorful_clock/README.md @@ -0,0 +1,12 @@ +# Colorful Analog Clock # + +This app displays an analog clock with a colorful face. + +![](app-screenshot.png) + +This clock also acts as an example for the building blocks found in the author's +[GitHub repository](https://github.com/rozek/banglejs-2-activities) + +## License ## + +[MIT License](LICENSE) From f7e9b3ad2505d7c0d32b9e6fa26c215b87a8bb72 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:09:24 +0100 Subject: [PATCH 335/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 544af0c71..fbb8a17a4 100644 --- a/apps.json +++ b/apps.json @@ -5082,7 +5082,7 @@ "name": "Minimal Analog Clock", "shortName":"Minimal Clock", "version":"0.01", - "description": "a minimal analog clock - just with some hands and no further clock face", + "description": "a minimal analog clock - just with some hands and no clock face", "icon": "app-icon.png", "type": "clock", "tags": "clock", From afadf0aa98545e3ce0327351e5c65a650d1dfa73 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:18:07 +0100 Subject: [PATCH 336/476] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index fbb8a17a4..dc2ef5529 100644 --- a/apps.json +++ b/apps.json @@ -5111,5 +5111,22 @@ {"name":"minimal_clock.app.js","url":"app.js"}, {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "colorful_clock", + "name": "Colorful Analog Clock", + "shortName":"Colorful Clock", + "version":"0.01", + "description": "a colorful analog clock", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"minimal_clock.app.js","url":"app.js"}, + {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} + ] } ] From 978814b813b26965fb51a38ac98817d81f84ac89 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 07:48:46 +0100 Subject: [PATCH 337/476] Update apps.json --- apps.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index dc2ef5529..8e4d7a14e 100644 --- a/apps.json +++ b/apps.json @@ -5108,8 +5108,8 @@ "screenshots": [{"url":"app-screenshot.png"}], "readme": "README.md", "storage": [ - {"name":"minimal_clock.app.js","url":"app.js"}, - {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} + {"name":"simple_clock.app.js","url":"app.js"}, + {"name":"simple_clock.img","url":"app-icon.js","evaluate":true} ] }, { "id": "colorful_clock", @@ -5125,8 +5125,8 @@ "screenshots": [{"url":"app-screenshot.png"}], "readme": "README.md", "storage": [ - {"name":"minimal_clock.app.js","url":"app.js"}, - {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} + {"name":"colorful_clock.app.js","url":"app.js"}, + {"name":"colorful_clock.img","url":"app-icon.js","evaluate":true} ] } ] From 4454b97f5587f3541742c3a8724e54532166d3c5 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 08:58:47 +0100 Subject: [PATCH 338/476] Update app.js --- apps/minimal_clock/app.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/apps/minimal_clock/app.js b/apps/minimal_clock/app.js index e94881d03..057b286d4 100644 --- a/apps/minimal_clock/app.js +++ b/apps/minimal_clock/app.js @@ -84,16 +84,16 @@ p.c++; } - g.reset(); + g.reset(); // also loads the current theme if (pos.tl.c || pos.tr.c) { g.setClipRect(0,h-24,w-1,h-1); - g.reset(); + g.reset(); // also (re)loads the current theme } if (pos.bl.c || pos.br.c) { g.setClipRect(0,h-24,w-1,h-1); - g.reset(); + g.reset(); // also (re)loads the current theme } try { @@ -163,7 +163,7 @@ let MinutesAngle = (Minutes/60) * twoPi - Pi; let SecondsAngle = (Seconds/60) * twoPi - Pi; - g.setColor('#FFFFFF'); + g.setColor(g.theme.fg); transformPolygon(HourHandPolygon, CenterX,CenterY, HoursAngle); g.fillPoly(transformedPolygon); @@ -186,12 +186,8 @@ let Timer; function refreshDisplay () { - g.clear(); + g.clear(true); // also loads current theme - g.setColor(0,0,0); - g.fillRect(0,0, ScreenWidth,ScreenHeight); - - g.setBgColor(1,1,1); Bangle.drawWidgets(); drawClockHands(); From 4504eb1f11625de0c5cdf038b84fb6e350013e20 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 08:58:49 +0100 Subject: [PATCH 339/476] Update README.md --- apps/minimal_clock/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md index 918206a8f..913a2aced 100644 --- a/apps/minimal_clock/README.md +++ b/apps/minimal_clock/README.md @@ -1,12 +1,12 @@ # Minimal Analog Clock # This app displays the perhaps most basic analog clock one can think of - just -some clock hands and no clock face. +some clock hands and no clock face. It considers the currently configured +"theme" (and may therefore look different on your watch than shown in the +screenshot depending on which theme you prefer). ![](app-screenshot.png) -But actually it is almost "stylish" again just because of this simplicity. - This clock also acts as an example for the building blocks found in the author's [GitHub repository](https://github.com/rozek/banglejs-2-activities) From c0a2bc24bb3114b82e344a084f47226ca4b6b9d6 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 08:58:57 +0100 Subject: [PATCH 340/476] Update app.js --- apps/simple_clock/app.js | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/apps/simple_clock/app.js b/apps/simple_clock/app.js index 17d876d35..6cb0f08ce 100644 --- a/apps/simple_clock/app.js +++ b/apps/simple_clock/app.js @@ -84,16 +84,16 @@ p.c++; } - g.reset(); + g.reset(); // also loads the current theme if (pos.tl.c || pos.tr.c) { g.setClipRect(0,h-24,w-1,h-1); - g.reset(); + g.reset(); // also (re)loads the current theme } if (pos.bl.c || pos.br.c) { g.setClipRect(0,h-24,w-1,h-1); - g.reset(); + g.reset(); // also (re)loads the current theme } try { @@ -137,7 +137,7 @@ /**** drawClockFace ****/ function drawClockFace () { - g.setColor(1,1,1); + g.setColor(g.theme.fg); g.setFont('Vector', 22); g.setFontAlign(0,-1); @@ -182,7 +182,7 @@ let MinutesAngle = (Minutes/60) * twoPi - Pi; let SecondsAngle = (Seconds/60) * twoPi - Pi; - g.setColor('#FFFFFF'); + g.setColor(g.theme.fg); transformPolygon(HourHandPolygon, CenterX,CenterY, HoursAngle); g.fillPoly(transformedPolygon); @@ -205,12 +205,8 @@ let Timer; function refreshDisplay () { - g.clear(); + g.clear(true); // also loads current theme - g.setColor(0,0,0); - g.fillRect(0,0, ScreenWidth,ScreenHeight); - - g.setBgColor(1,1,1); Bangle.drawWidgets(); drawClockFace(); From 56205f8ed5270909b21331d35aed9afa3afce299 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 08:59:00 +0100 Subject: [PATCH 341/476] Update README.md --- apps/simple_clock/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/simple_clock/README.md b/apps/simple_clock/README.md index d33bde0b6..b52476372 100644 --- a/apps/simple_clock/README.md +++ b/apps/simple_clock/README.md @@ -1,6 +1,8 @@ # Simple Analog Clock # -This app displays a simple, yet stylish, analog clock. +This app displays a simple, yet stylish, analog clock. It considers the +currently configured "theme" (and may therefore look different on your watch +than shown in the screenshot depending on which theme you prefer). ![](app-screenshot.png) From 9107c599c8d45929f0fc62bf8176b3fb304f8772 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 08:59:04 +0100 Subject: [PATCH 342/476] Update app.js --- apps/colorful_clock/app.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/apps/colorful_clock/app.js b/apps/colorful_clock/app.js index a1b495c3c..10d579a22 100644 --- a/apps/colorful_clock/app.js +++ b/apps/colorful_clock/app.js @@ -84,16 +84,16 @@ p.c++; } - g.reset(); + g.reset(); // also loads the current theme if (pos.tl.c || pos.tr.c) { g.setClipRect(0,h-24,w-1,h-1); - g.reset(); + g.reset(); // also (re)loads the current theme } if (pos.bl.c || pos.br.c) { g.setClipRect(0,h-24,w-1,h-1); - g.reset(); + g.reset(); // also (re)loads the current theme } try { @@ -199,7 +199,7 @@ let MinutesAngle = (Minutes/60) * twoPi - Pi; let SecondsAngle = (Seconds/60) * twoPi - Pi; - g.setColor('#FFFFFF'); + g.setColor(g.theme.fg); transformPolygon(HourHandPolygon, CenterX,CenterY, HoursAngle); g.fillPoly(transformedPolygon); @@ -222,12 +222,8 @@ let Timer; function refreshDisplay () { - g.clear(); + g.clear(true); // also loads current theme - g.setColor(0,0,0); - g.fillRect(0,0, ScreenWidth,ScreenHeight); - - g.setBgColor(1,1,1); Bangle.drawWidgets(); drawClockFace(); From f164c061f53bf5b23fe63d241ac77ea3f01be5f5 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 08:59:06 +0100 Subject: [PATCH 343/476] Update README.md --- apps/colorful_clock/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/colorful_clock/README.md b/apps/colorful_clock/README.md index eb90e3e56..429cc51dd 100644 --- a/apps/colorful_clock/README.md +++ b/apps/colorful_clock/README.md @@ -1,6 +1,8 @@ # Colorful Analog Clock # -This app displays an analog clock with a colorful face. +This app displays an analog clock with a colorful face. It considers the +currently configured "theme" (and may therefore look different on your watch +than shown in the screenshot depending on which theme you prefer). ![](app-screenshot.png) From b8959f7335f56fe1daae00881fcc29fe52e76de1 Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 29 Dec 2021 09:25:06 +0100 Subject: [PATCH 344/476] Wrong icon. --- apps/lcars/lcars.app.js | 12 ++++++------ apps/lcars/lcars.icon.js | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index f27c26b7f..d2295b1f8 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -129,21 +129,21 @@ function printData(key, y){ if(key == "Battery"){ var bat = E.getBattery(); g.drawString("BAT:", 26, y); - g.drawString(bat+ "%", 68, y); + g.drawString(bat+ "%", 65, y); } else if(key == "Steps"){ var steps = getSteps(); g.drawString("STEP:", 26, y); - g.drawString(steps, 68, y); + g.drawString(steps, 65, y); } else if(key == "Temp."){ var temperature = Math.floor(E.getTemperature()); g.drawString("TMP:", 26, y); - g.drawString(temperature + "C", 68, y); + g.drawString(temperature + "C", 65, y); } else if(key == "HRM"){ g.drawString("HRM:", 26, y); - g.drawString(hrmValue, 68, y); + g.drawString(hrmValue, 65, y); } else { g.drawString("NOT FOUND", 26, y); @@ -197,14 +197,14 @@ function drawState(){ hours % 4 == 1 ? iconMars : hours % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 115, 107); + g.drawImage(iconImg, 117, 107); // Alarm within symbol g.setFontAntonioMedium(); if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); - g.drawString(getAlarmMinutes(), 115+25, 107+25+1); + g.drawString(getAlarmMinutes(), 117+25, 107+25+1); } g.setFontAlign(-1, -1, 0); } diff --git a/apps/lcars/lcars.icon.js b/apps/lcars/lcars.icon.js index 49694cf7c..22e98a39a 100644 --- a/apps/lcars/lcars.icon.js +++ b/apps/lcars/lcars.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("lmy5YCFi1ZsuWAQgGGy1YgXbtu2AQgjH4EAEZ2XCINbEZxRBvIjNzwRBh4jN2ARBgIjNwCIClojMTQcFEZdkCIgjLngRDg4jLsDREEZOzTwIAEjwjHs5oDAAiSEEYUcCA5uFeoQQJAAP2EYRECgJHGJQrRDps4BwsD5wDBrYjB+AXBtJaHBAV5spoC6dNGY8NmBBBEYMAg2atJHHvOmwEB8qtBmnTpgjImncgEtkEB02atARHBYOYSQPgh4jKgILBCIMAhIjBc4ojEzVwCII7B6dAEZpfBEZXmEZ53CI4twEAqVCkwjCNYaMGboQjDUgIjGboOnAgMGR4WgC4YAD+dNmgEBgg5BluUa4QQDg7dB0wjCJoNl2z7CAQJBDEYLwDh9tyxEBjitFEYJEBfwQjB7z1GEYQsCgfbEYNZT4ggBEYWcOIVZEYPbtAQCgfNEANODIYOBEYVlDQQAHg4OCCgW0CBEKEYySBg4gFi1Z4AjFWwM922OJQOPtoLBoBHGgPlAoQCEoAjGgIdCAQto+wjFhIgFAQwjDrYjIAQYjDEBQjFARwA==")) +require("heatshrink").decompress(atob("mEwgeevPnAQsc+fPngCE+/fvoCEvAbIA4/AgFzEZwRBjwjNvBUBEZ3eCIMOEZtwCIMBEZuARYU5EZecTocHEZf0CIcBEbvgaggjKTwIAEbQpoHAAiSEeoYQHJQr1CCBJKEIgcBI4xKFaIdt3AOFgfuAYMeEYLRBj1pLQ4ICuYjBAgPbtoRHhu3AYN5VoMGzVpI49502AgPPVoM27dsK48N23cgE5CgOmzVoCI4LBzCSB8EP2wjJgILBAYMAhIjBsAjJzVwg47C7YRJEYhfBEZXmEZ53CI4q2BEAiVCkwjCNYaMGboQjDkBfDCAbdB04EBgyPDC4YAD/dt2wRCHIM5njXCCAcHboOmCIQ0B5/nfYT6DFIIjBeAcOvM8+EAjitFEYJEBAANzEYOeeowjCFgUDzwjB+YrDgAgBEYWcA4Mc+YjCvAQCgftEANuDIYOBEYXPNwIAIg4OCCgXkCBEOEZDvBEAhEB4AjF/inB8+OJQOOvILBoAjGU4IFDAQYjGbQIdCAQt4EY0DEZACDEYceEZACDC4bLBEZwCO")) \ No newline at end of file From 92dde29d4540002fd4008a88275d2b38fc82d17c Mon Sep 17 00:00:00 2001 From: David Peer Date: Wed, 29 Dec 2021 09:26:49 +0100 Subject: [PATCH 345/476] Left align date and time --- apps/lcars/lcars.app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index d2295b1f8..af4ff26e7 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -225,12 +225,12 @@ function drawPosition0(){ drawLock(); // Write time - g.setFontAlign(0, -1, 0); + g.setFontAlign(-1, -1, 0); g.setColor(cWhite); var currentDate = new Date(); var timeStr = locale.time(currentDate,1); g.setFontAntonioLarge(); - g.drawString(timeStr, 70, 10); + g.drawString(timeStr, 28, 10); // Write date g.setColor(cWhite); @@ -238,7 +238,7 @@ function drawPosition0(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 70, 56); + g.drawString(dayStr, 29, 56); // Draw data g.setFontAlign(-1, -1, 0); From cf52d8d8111f61bf1bbd37dd3ce455fa9197b133 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 09:27:03 +0100 Subject: [PATCH 346/476] Update README.md --- apps/simple_clock/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/simple_clock/README.md b/apps/simple_clock/README.md index b52476372..d44c495c6 100644 --- a/apps/simple_clock/README.md +++ b/apps/simple_clock/README.md @@ -1,8 +1,8 @@ # Simple Analog Clock # This app displays a simple, yet stylish, analog clock. It considers the -currently configured "theme" (and may therefore look different on your watch -than shown in the screenshot depending on which theme you prefer). +currently configured "theme" (and may therefore look different than shown in +the screenshot on your watch depending on which theme you prefer). ![](app-screenshot.png) From 780286c475aacf5c8eb61b2a030e299ebeab81c0 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 09:27:05 +0100 Subject: [PATCH 347/476] Update README.md --- apps/minimal_clock/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md index 913a2aced..5dd27fdf4 100644 --- a/apps/minimal_clock/README.md +++ b/apps/minimal_clock/README.md @@ -1,9 +1,10 @@ # Minimal Analog Clock # This app displays the perhaps most basic analog clock one can think of - just -some clock hands and no clock face. It considers the currently configured -"theme" (and may therefore look different on your watch than shown in the -screenshot depending on which theme you prefer). +some clock hands and no clock face. It considers currently configured "theme" +(and may therefore look different than shown in the screenshot on your watch +depending on which theme you prefer). + ![](app-screenshot.png) From 2844ccde4cbe9c4452c9f85fd97c436226833416 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Wed, 29 Dec 2021 09:27:08 +0100 Subject: [PATCH 348/476] Update README.md --- apps/colorful_clock/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/colorful_clock/README.md b/apps/colorful_clock/README.md index 429cc51dd..1ba72a4b0 100644 --- a/apps/colorful_clock/README.md +++ b/apps/colorful_clock/README.md @@ -1,8 +1,8 @@ # Colorful Analog Clock # This app displays an analog clock with a colorful face. It considers the -currently configured "theme" (and may therefore look different on your watch -than shown in the screenshot depending on which theme you prefer). +currently configured "theme" (and may therefore look different than shown in +the screenshot on your watch depending on which theme you prefer). ![](app-screenshot.png) From 9e8a3b6c92dcb65faa5d297e2aeda320cd92b675 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 14:04:50 +0000 Subject: [PATCH 349/476] Cleanup widget --- apps/coretemp/README.md | 13 ++++---- apps/coretemp/coretemp.js | 67 ++++++++++++++++++--------------------- apps/coretemp/widget.js | 44 ++++++++++++------------- 3 files changed, 57 insertions(+), 67 deletions(-) diff --git a/apps/coretemp/README.md b/apps/coretemp/README.md index fac25df21..87be44bb6 100644 --- a/apps/coretemp/README.md +++ b/apps/coretemp/README.md @@ -1,19 +1,18 @@ # CoreTemp display -Basic bare-bones example of connecting to a bluetooth [CoreTemp](https://corebodytemp.com/) device and displaying the current body core temperature readings. +Basic example of connecting to a bluetooth [CoreTemp](https://corebodytemp.com/) device and displaying the current skin and body core temperature readings. ## Usage -On startup connects to a CoreTemp device (1809/2A1C) and emits a "Core, temp" value for each reading. -The app simply displays these readings on screen. +Background task connects to any CoreTemp device (2100/2101) and emits a CoreTemp signal value for each reading. +Application contains three components, one is a background task that monitors the sensor and emits a 'CoreTemp' signal on activity if activated in settings. +The widget shows when the sensor is enabled with a mini value and blinks on use. +The app listens for 'CoreTemp' signals and shows the current skin and core temperatures in large numbers. ## TODO * Integrate with other tracking/sports apps to log data. -* Add device selection -* Provide enable/disable option -* Check status, add Retry/reconnect -* Also provide skin temp reading +* Add specific device selection ## Creator diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index afb905c99..8b618d356 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -4,6 +4,8 @@ Bangle.setLCDPower(1); Bangle.setLCDTimeout(0); var btm = g.getHeight() - 1; +var px = g.getWidth() / 2; + var corelogo = { width : 146, height : 48, @@ -16,61 +18,52 @@ var corelogo = { "AEUDmczmBD/I4xJ/AAMCkBHFAAJG8kQABJAJHFSVURAAUQRphHCkQGBJAySngJHDJRhHEJALZDAgiSBEQ0RPBIAKHAwQQI4xIEaoQFEEZpIULSRHFkDZDBwZIMEYhITa44SKSAxIDSARIDJ4IjKJCpHNEoiQGJDA2CJCQSOCYaQGJDBsCGiKQGTZIJCI4xBEJBAAEFpQAPDQoMGBQyOGIJJPGF6AALC5glCbJAQEgZCEAoowTSBypJBwKQMIQaSBAgZIJWw5ITB5RTDSBLbEAAjDOPRIVabIiQFJBCQKPYhIVCRxIEBg7WDSBpIVbJ5IQJIqQBgZIiCh7ZLJIriDbhJI3JoxIebIZITI6BIjCZ5IRI4RIPHAYAJJH4AIUAJIzHIhI/SAwzBJH6QGJH5HIHApI2HCIAJL4pITkATOJQJIMHCJeFJD8zaZCQHJCEBJCUCJCKPBJBhWGJEcia5oACJBSfHJB4QMJA6SLI4ZIKPAg3QJCUAJCbbBJETbPJAbbKbIhIBYJpIQbZ5UDbZzZFPBxIVSRIOBJA5JISAhIIF4ZIUfQpJHEwQKDJAhJHbJbBJJCIZECY4KGSQoABBIZOBSBbbIJC6IEBQqSJJoyQLbZBIRbYoAKJAaSHJAjbCF541RSRISLSRkgJAKQKbY5ISJJyQDSRyQMbYxITChhHFSRhGMbY5IUCpRHHJJZITiBIVbpBHJbpJHPFhBITfI4ANIwcgI6AAV")) }; -first = true; function onCore(c) { - var core = "Core: " + c.core + c.unit; - var skin = "Skin: " + c.skin + c.unit; - - var px = g.getWidth() / 2; g.setFontAlign(0, 0); - if (first) { - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); - g.drawImage(corelogo, px - 146 / 2, 30); - first = false; - } else { - g.clearRect(0, 48 + 48, g.getWidth(), 48 + 48 + 24 * 2); - } + g.clearRect(0, 48 + 48, g.getWidth(), 48 + 48 + 24 * 2); g.setColor(0xC618); // Light gray - g.setFont("6x8", 3).drawString(core, px, 48 + 48); - g.setFont("6x8", 3).drawString(skin, px, 48 + 48 + 24); + g.setFont("6x8", 3).drawString("Core: " + c.core + c.unit, px, 48 + 48); + g.setFont("6x8", 3).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); } -Bangle.on('CoreTemp', onCore); - -g.clear(); - -Bangle.loadWidgets(); -Bangle.drawWidgets(); - -// Background task will activate if settings are enabled. +// Background task will activate once settings are enabled. function enableSensor() { settings = require("Storage").readJSON("coretemp.json", 1) || {}; if (!settings.enabled) { - settings.enabled = true; require("Storage").write("coretemp.json", settings); + drawBackground(); Bangle.loadWidgets(); Bangle.drawWidgets(); } } -function drawMessage() { - settings = require("Storage").readJSON("coretemp.json", 1) || {}; - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); +function drawBackground() { + g.reset().setFont("6x8", 2).setFontAlign(0, 0); - if (!settings.enabled) { - g.reset().setFont("6x8", 2).setFontAlign(0, 0); - g.drawString("Disabled, press BTN2\nto enable.", g.getWidth() / 2, - g.getHeight() / 2 - 16); - } else { - g.reset().setFont("6x8", 2).setFontAlign(0, 0); - g.drawString("Please wait...\nWaiting for data", g.getWidth() / 2, - g.getHeight() / 2 - 16); - } + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + g.drawImage(corelogo, px - 146 / 2, 30); + + g.drawString("Please wait...\nWaiting for data", g.getWidth() / 2, + g.getHeight() / 2 + 16); +} + +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +Bangle.on('CoreTemp', onCore); + +settings = require("Storage").readJSON("coretemp.json", 1) || {}; +g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + +if (!settings.enabled) { + g.reset().setFont("6x8", 2).setFontAlign(0, 0); + g.drawString("Sensor disabled,\nBTN2 to enable.", g.getWidth() / 2, + g.getHeight() / 2 - 16); +} else { + drawBackground(); } setWatch(() => { enableSensor(); }, BTN2, {repeat : false}); - -drawMessage(); diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js index 2b5522875..c534b2b11 100644 --- a/apps/coretemp/widget.js +++ b/apps/coretemp/widget.js @@ -1,42 +1,40 @@ -// TODO Change to generic multiple sensor +// TODO Change to a generic multiple sensor widget? + (() => { var settings = {}; var count = 0; - - var img0 = { - width : 24, - height : 24, - bpp : 4, - transparent : 0, - buffer : - require("heatshrink") - .decompress(atob( - "AA0IxGIBAtms0ABQOIwAKFsAWCDAkGBYQUCBwIKEBYgmBBYoHBC4oKDBAILECwRSFDQQLBsBLDBYg4CNYoKBwALGDQYLCQpALaF45jBBZBfJMIZ3GZgwkGZYibCDIMGWoILDWYbBDd4gMFWoTvFYYgAFEYYHDA==")) - }; - var img1 = { - width : 24, - height : 24, - bpp : 3, - transparent : 0, - buffer : - require("heatshrink") - .decompress(atob( - "AAkCpMgAwYFBiVJkgHCAoMAyQIBwAIBAoMEyEABAUkBAkEBAdICIkBBAIdBBAcJEwo1BBAI4EAoJBEKAMAiAIEAAIvBLgosBBCYjFJQIIFKwJHFBARZFBwRrCNAKbCC4J0CpApFR4REGBAWShIxDPQSSCYogvEA=")) - }; + var core = 0; // draw your widget function draw() { if (!settings.enabled) return; g.reset(); + g.setFont("6x8", 1).setFontAlign(0, 0); g.setFontAlign(0, 0); g.clearRect(this.x, this.y, this.x + 23, this.y + 23); - g.drawImage((count & 1) ? img1: img0, this.x, this.y); + + if (count & 1) { + g.setColor("#0f0"); // green + } else { + g.setColor(g.theme.dark ? "#333" : "#CCC"); // off = grey + } + + g.drawImage( + atob( + "GBgBAAHwAHP4A+f8B+4cH+4MH84cPwYcfAf4eAP4+AHi+AAO8AAe8AAe8AAe+AAG+AA4eAA8fAB8PgD4P8b4H/7wB/9gA/8AAP4A"), + this.x, this.y); + + g.setColor(g.theme.fg); + g.drawString(core, this.x + 24 / 2, this.y + 19); + + g.setColor(-1); } // Set a listener to 'blink' function onTemp(temp) { count = count + 1; + core = temp.core; WIDGETS["coretemp"].draw(); } From 5b36291f632419e3174bee667fc16881612894b3 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 14:09:35 +0000 Subject: [PATCH 350/476] Update apps.json Correct version num --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 12d7db79e..987ac9826 100644 --- a/apps.json +++ b/apps.json @@ -4964,7 +4964,7 @@ { "id": "coretemp", "name": "CoreTemp", - "version": "0.03", + "version": "0.02", "description": "Display CoreTemp device sensor data", "icon": "coretemp.png", "type": "app", From 73f222535418da8c77cda97dce690965263a06be Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 14:12:44 +0000 Subject: [PATCH 351/476] Update changelogs --- apps/coretemp/ChangeLog | 1 + apps/recorder/ChangeLog | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/coretemp/ChangeLog b/apps/coretemp/ChangeLog index 115067b80..ea6911f1a 100644 --- a/apps/coretemp/ChangeLog +++ b/apps/coretemp/ChangeLog @@ -1 +1,2 @@ 0.01: New app +0.02: Cleanup interface and add settings, widget, add skin temp reporting. diff --git a/apps/recorder/ChangeLog b/apps/recorder/ChangeLog index 40240de64..bedc63141 100644 --- a/apps/recorder/ChangeLog +++ b/apps/recorder/ChangeLog @@ -3,3 +3,4 @@ Fix interface.html 0.03: Fix theme and maps/graphing if no GPS 0.04: Multiple bugfixes +0.05: Add recording for coresensor From 19126205b95d3b0c4bfd40239a3e0f65e0c536c7 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 15:38:59 +0000 Subject: [PATCH 352/476] Tidy tooltip, display invalid core as n/a --- apps/coretemp/boot.js | 25 +++++++++++++++++-------- apps/coretemp/coretemp.js | 4 ++-- apps/coretemp/widget.js | 7 +++---- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 269c8e9ff..56f7b371d 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -28,8 +28,16 @@ class CoreSensor { this.unit = "C"; } - if (flags & 1) this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; - if (flags & 2) this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + if (flags & 1) { + this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; + } else { + this.skin = 0; + } + if (flags & 2) { + this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + } else { + this.core = 0; + } Bangle.emit('CoreTemp', {core : this.core, skin : this.skin, unit : this.unit}); @@ -79,8 +87,8 @@ function connection_setup() { }) .then(function() { console.log("Done!"); -// getSensorBatteryLevel(gatt); -// g.reset().clearRect(Bangle.appRect).flip(); + // getSensorBatteryLevel(gatt); + // g.reset().clearRect(Bangle.appRect).flip(); }) .catch(function(e) { console.log(e.toString(), "ERROR"); @@ -89,16 +97,17 @@ function connection_setup() { } function connection_end() { - if (gatt != undefined) gatt.disconnect(); + if (gatt != undefined) + gatt.disconnect(); } -settings = require("Storage").readJSON("coretemp.json",1)||{}; +settings = require("Storage").readJSON("coretemp.json", 1) || {}; console.log("Settings:"); console.log(settings); if (settings.enabled) { - connection_setup(); - NRF.on('disconnect', connection_setup); + connection_setup(); + NRF.on('disconnect', connection_setup); } E.on('kill', () => { connection_end(); }); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 8b618d356..ed7598553 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -20,9 +20,9 @@ var corelogo = { function onCore(c) { g.setFontAlign(0, 0); - g.clearRect(0, 48 + 48, g.getWidth(), 48 + 48 + 24 * 2); + g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 3); g.setColor(0xC618); // Light gray - g.setFont("6x8", 3).drawString("Core: " + c.core + c.unit, px, 48 + 48); + g.setFont("6x8", 3).drawString("Core: " + ((c.core<327)?(c.core + c.unit):'n/a'), px, 48 + 48); g.setFont("6x8", 3).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); } diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js index c534b2b11..446325118 100644 --- a/apps/coretemp/widget.js +++ b/apps/coretemp/widget.js @@ -21,12 +21,11 @@ } g.drawImage( - atob( - "GBgBAAHwAHP4A+f8B+4cH+4MH84cPwYcfAf4eAP4+AHi+AAO8AAe8AAe8AAe+AAG+AA4eAA8fAB8PgD4P8b4H/7wB/9gA/8AAP4A"), - this.x, this.y); + atob("DAyBAAHh0js3EuDMA8A8AWBnDj9A8A=="), + this.x+(24-12)/2,this.y+1); g.setColor(g.theme.fg); - g.drawString(core, this.x + 24 / 2, this.y + 19); + g.drawString(parseInt(core)+"\n."+parseInt((core*100)%100), this.x + 24 / 2, this.y + 18); g.setColor(-1); } From ab37e5e7d5dad4d2ac056788e572293112d73a89 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 29 Dec 2021 07:51:12 -0800 Subject: [PATCH 353/476] Update boot.js --- apps/promenu/boot.js | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 9eac59bfa..62995edfa 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -67,7 +67,13 @@ E.showMenu = function(items) { var name = menuItems[idx]; var item = items[name]; var hl = (idx==options.selected && !l.selectEdit); - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+24); + if(g.theme.dark){ + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+20); + console.log("yippe!o"); + }else{ + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+40); + console.log("yippe!"); + } g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); if(loc.translate(name).length >= 11 && "object" == typeof item){ @@ -170,4 +176,21 @@ E.showMenu = function(items) { else l.select(); }); return l; -}: +}; + +E.showMenu({ + "" : { "title" : "Sample Pro Menu" }, + "< Back" : () => back(), + 'On or off?': { + value:100, // !! converts undefined to false + format: v => v?"On":"Off", + onchange: v => { + } + }, + 'How Many?': { + min: 0, max: 10, + format: v => v?"On":"Off", + onchange: v => { + } + }, + }); From 9b1e10126710ee810540ca78d353942459beef8a Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 29 Dec 2021 07:51:57 -0800 Subject: [PATCH 354/476] Update boot.js --- apps/promenu/boot.js | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 62995edfa..aeb9308e5 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -69,10 +69,8 @@ E.showMenu = function(items) { var hl = (idx==options.selected && !l.selectEdit); if(g.theme.dark){ fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+20); - console.log("yippe!o"); }else{ fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+40); - console.log("yippe!"); } g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); @@ -81,7 +79,6 @@ E.showMenu = function(items) { if (item.format) v=item.format(v); v = loc.translate(""+v); g.drawString(loc.translate(name).substring(0, 15-v.length)+"...",x+8,iy+7); - console.log("gippo"); }else{ if(loc.translate(name).length >= 15){ g.drawString(loc.translate(name).substring(0, 15)+"...",x+8,iy+7); @@ -177,20 +174,3 @@ E.showMenu = function(items) { }); return l; }; - -E.showMenu({ - "" : { "title" : "Sample Pro Menu" }, - "< Back" : () => back(), - 'On or off?': { - value:100, // !! converts undefined to false - format: v => v?"On":"Off", - onchange: v => { - } - }, - 'How Many?': { - min: 0, max: 10, - format: v => v?"On":"Off", - onchange: v => { - } - }, - }); From 58c66c281dcf0369f7bc998656cce635091b3843 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 29 Dec 2021 07:54:26 -0800 Subject: [PATCH 355/476] Update boot.js --- apps/promenu/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index aeb9308e5..89a8823a8 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -70,7 +70,7 @@ E.showMenu = function(items) { if(g.theme.dark){ fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+20); }else{ - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+40); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+10); } g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); From b0bb834a5f620d65548fd1111922a00513a244f3 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 29 Dec 2021 08:10:01 -0800 Subject: [PATCH 356/476] Update boot.js --- apps/promenu/boot.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/boot.js b/apps/promenu/boot.js index 89a8823a8..002734113 100644 --- a/apps/promenu/boot.js +++ b/apps/promenu/boot.js @@ -70,7 +70,7 @@ E.showMenu = function(items) { if(g.theme.dark){ fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+20); }else{ - fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg+10); + fillRectRnd(x+2,iy+1,x2,iy+options.fontHeight-3,7,hl ? g.theme.bgH : g.theme.bg-10); } g.setColor(hl ? g.theme.fgH : g.theme.fg); g.setFontAlign(-1,-1); From 1f7881e1c2af8098aa6ffbe72a0c4704da7c096b Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 16:20:29 +0000 Subject: [PATCH 357/476] Add screenshot, change colours for theme. --- apps/coretemp/boot.js | 16 ++++++++-------- apps/coretemp/coretemp.js | 2 +- apps/coretemp/screenshot.png | Bin 0 -> 3919 bytes 3 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 apps/coretemp/screenshot.png diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 56f7b371d..8ef264640 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -2,7 +2,7 @@ // If enabled in settings run constantly in background // (function() { - +var log = function() {};//print var settings = {}; var device; var gatt; @@ -63,11 +63,11 @@ function getSensorBatteryLevel(gatt) { } function connection_setup() { - console.log("Scanning for CoreTemp sensor..."); + log("Scanning for CoreTemp sensor..."); NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) .then(function(d) { device = d; - console.log("Found device"); + log("Found device"); return device.gatt.connect(); }) .then(function(g) { @@ -86,13 +86,13 @@ function connection_setup() { return characteristic.startNotifications(); }) .then(function() { - console.log("Done!"); + log("Done!"); // getSensorBatteryLevel(gatt); // g.reset().clearRect(Bangle.appRect).flip(); }) .catch(function(e) { - console.log(e.toString(), "ERROR"); - console.log(e); + log(e.toString(), "ERROR"); + log(e); }); } @@ -102,8 +102,8 @@ function connection_end() { } settings = require("Storage").readJSON("coretemp.json", 1) || {}; -console.log("Settings:"); -console.log(settings); +log("Settings:"); +log(settings); if (settings.enabled) { connection_setup(); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index ed7598553..b3ef7a91e 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -21,7 +21,7 @@ var corelogo = { function onCore(c) { g.setFontAlign(0, 0); g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 3); - g.setColor(0xC618); // Light gray + g.setColor(g.theme.dark ? "#CCC" : "#333"); // gray g.setFont("6x8", 3).drawString("Core: " + ((c.core<327)?(c.core + c.unit):'n/a'), px, 48 + 48); g.setFont("6x8", 3).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); } diff --git a/apps/coretemp/screenshot.png b/apps/coretemp/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..054c16eef71671eb43943d0970b0cfe5564bc0da GIT binary patch literal 3919 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 V_nuPMI`|Yr%uQ@A)f!*@^WX5P5GViu literal 0 HcmV?d00001 From 860bd58b0a8f8abaec7a96e055c66a77547adf0f Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 16:24:22 +0000 Subject: [PATCH 358/476] Update apps.json Add screenshot --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 987ac9826..bc1fc0ed5 100644 --- a/apps.json +++ b/apps.json @@ -4978,7 +4978,8 @@ {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true}, {"name":"coretemp.boot.js","url":"boot.js"} ], - "data": [{"name":"coretemp.json","url":"app-settings.json"}] + "data": [{"name":"coretemp.json","url":"app-settings.json"}], + "screenshots": [{"url":"screenshot.png"}] }, { "id": "showimg", From 9697fd168f0ae86d63563bb77ae19ac5fbe28277 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 22:40:35 +0000 Subject: [PATCH 359/476] Fix B2 drawing compatibility --- apps/coretemp/coretemp.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index b3ef7a91e..10ce35f64 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -19,11 +19,15 @@ var corelogo = { }; function onCore(c) { + + sz = (process.env.HWVERSION == 1) ? 3 : 2; + g.setFontAlign(0, 0); g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 3); g.setColor(g.theme.dark ? "#CCC" : "#333"); // gray - g.setFont("6x8", 3).drawString("Core: " + ((c.core<327)?(c.core + c.unit):'n/a'), px, 48 + 48); - g.setFont("6x8", 3).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); + g.setFont("6x8", sz).drawString( + "Core: " + ((c.core < 327) ? (c.core + c.unit) : 'n/a'), px, 48 + 48); + g.setFont("6x8", sz).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); } // Background task will activate once settings are enabled. @@ -43,10 +47,12 @@ function enableSensor() { function drawBackground() { g.reset().setFont("6x8", 2).setFontAlign(0, 0); - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); + g.setBgColor('#000'); // Put logo on black bg + g.clearRect(0, 28, g.getWidth(), 32 + 48); g.drawImage(corelogo, px - 146 / 2, 30); + g.setBgColor(-1); - g.drawString("Please wait...\nWaiting for data", g.getWidth() / 2, + g.drawString("Please wait...\nWaiting for\ndata", g.getWidth() / 2, g.getHeight() / 2 + 16); } @@ -66,4 +72,4 @@ if (!settings.enabled) { drawBackground(); } -setWatch(() => { enableSensor(); }, BTN2, {repeat : false}); +setWatch(() => { enableSensor(); }, BTN1, {repeat : false}); From 9acf9c89e2a1e1bef8716d44661cf6dcf3ff232b Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Thu, 30 Dec 2021 05:39:09 +0000 Subject: [PATCH 360/476] Let screen sleep --- apps/coretemp/coretemp.js | 45 ++++++++++++++++----------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index 10ce35f64..174e71e6e 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -1,17 +1,17 @@ // Simply listen for core events and show data -Bangle.setLCDPower(1); -Bangle.setLCDTimeout(0); - var btm = g.getHeight() - 1; var px = g.getWidth() / 2; +// Dark or light logo +var col = (process.env.HWVERSION == 1) ? 65535 : 0; + var corelogo = { width : 146, height : 48, bpp : 4, transparent : 0, - palette : new Uint16Array([ 65535, 65535, 2854, 1419 ]), + palette : new Uint16Array([ col, col, 2854, 1419 ]), buffer : require("heatshrink") .decompress(atob( @@ -19,12 +19,12 @@ var corelogo = { }; function onCore(c) { - + // Large or small font sz = (process.env.HWVERSION == 1) ? 3 : 2; g.setFontAlign(0, 0); - g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 3); - g.setColor(g.theme.dark ? "#CCC" : "#333"); // gray + g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 4); + g.setColor(g.theme.dark ? "#CCC" : "#333"); // gray g.setFont("6x8", sz).drawString( "Core: " + ((c.core < 327) ? (c.core + c.unit) : 'n/a'), px, 48 + 48); g.setFont("6x8", sz).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); @@ -38,38 +38,29 @@ function enableSensor() { settings.enabled = true; require("Storage").write("coretemp.json", settings); - drawBackground(); - Bangle.loadWidgets(); - Bangle.drawWidgets(); + drawBackground("Waiting for\ndata..."); } } -function drawBackground() { +function drawBackground(message) { + g.clear(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); g.reset().setFont("6x8", 2).setFontAlign(0, 0); - - g.setBgColor('#000'); // Put logo on black bg - g.clearRect(0, 28, g.getWidth(), 32 + 48); g.drawImage(corelogo, px - 146 / 2, 30); - g.setBgColor(-1); - - g.drawString("Please wait...\nWaiting for\ndata", g.getWidth() / 2, - g.getHeight() / 2 + 16); + g.drawString(message, g.getWidth() / 2, g.getHeight() / 2 + 16); } -g.clear(); -Bangle.loadWidgets(); -Bangle.drawWidgets(); Bangle.on('CoreTemp', onCore); settings = require("Storage").readJSON("coretemp.json", 1) || {}; -g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); if (!settings.enabled) { - g.reset().setFont("6x8", 2).setFontAlign(0, 0); - g.drawString("Sensor disabled,\nBTN2 to enable.", g.getWidth() / 2, - g.getHeight() / 2 - 16); + drawBackground("Sensor disabled\nBTN" + + ((process.env.HWVERSION == 1) ? '2' : '1') + " to enable"); } else { - drawBackground(); + drawBackground("Waiting for\ndata..."); } -setWatch(() => { enableSensor(); }, BTN1, {repeat : false}); +setWatch(() => { enableSensor(); }, (process.env.HWVERSION == 1) ? BTN2 : BTN1, + {repeat : false}); From 2d387c8e07411208a697499fed93c8d4542dfac2 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 29 Dec 2021 14:04:50 +0000 Subject: [PATCH 361/476] Cleanup app and widget and fix B2 drawing compatibility Add screenshot --- apps.json | 5 ++- apps/coretemp/ChangeLog | 1 + apps/coretemp/README.md | 13 +++--- apps/coretemp/boot.js | 41 +++++++++++------- apps/coretemp/coretemp.js | 78 +++++++++++++++-------------------- apps/coretemp/screenshot.png | Bin 0 -> 3919 bytes apps/coretemp/widget.js | 43 +++++++++---------- apps/recorder/ChangeLog | 1 + 8 files changed, 90 insertions(+), 92 deletions(-) create mode 100644 apps/coretemp/screenshot.png diff --git a/apps.json b/apps.json index 12d7db79e..bc1fc0ed5 100644 --- a/apps.json +++ b/apps.json @@ -4964,7 +4964,7 @@ { "id": "coretemp", "name": "CoreTemp", - "version": "0.03", + "version": "0.02", "description": "Display CoreTemp device sensor data", "icon": "coretemp.png", "type": "app", @@ -4978,7 +4978,8 @@ {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true}, {"name":"coretemp.boot.js","url":"boot.js"} ], - "data": [{"name":"coretemp.json","url":"app-settings.json"}] + "data": [{"name":"coretemp.json","url":"app-settings.json"}], + "screenshots": [{"url":"screenshot.png"}] }, { "id": "showimg", diff --git a/apps/coretemp/ChangeLog b/apps/coretemp/ChangeLog index 115067b80..ea6911f1a 100644 --- a/apps/coretemp/ChangeLog +++ b/apps/coretemp/ChangeLog @@ -1 +1,2 @@ 0.01: New app +0.02: Cleanup interface and add settings, widget, add skin temp reporting. diff --git a/apps/coretemp/README.md b/apps/coretemp/README.md index fac25df21..87be44bb6 100644 --- a/apps/coretemp/README.md +++ b/apps/coretemp/README.md @@ -1,19 +1,18 @@ # CoreTemp display -Basic bare-bones example of connecting to a bluetooth [CoreTemp](https://corebodytemp.com/) device and displaying the current body core temperature readings. +Basic example of connecting to a bluetooth [CoreTemp](https://corebodytemp.com/) device and displaying the current skin and body core temperature readings. ## Usage -On startup connects to a CoreTemp device (1809/2A1C) and emits a "Core, temp" value for each reading. -The app simply displays these readings on screen. +Background task connects to any CoreTemp device (2100/2101) and emits a CoreTemp signal value for each reading. +Application contains three components, one is a background task that monitors the sensor and emits a 'CoreTemp' signal on activity if activated in settings. +The widget shows when the sensor is enabled with a mini value and blinks on use. +The app listens for 'CoreTemp' signals and shows the current skin and core temperatures in large numbers. ## TODO * Integrate with other tracking/sports apps to log data. -* Add device selection -* Provide enable/disable option -* Check status, add Retry/reconnect -* Also provide skin temp reading +* Add specific device selection ## Creator diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 269c8e9ff..8ef264640 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -2,7 +2,7 @@ // If enabled in settings run constantly in background // (function() { - +var log = function() {};//print var settings = {}; var device; var gatt; @@ -28,8 +28,16 @@ class CoreSensor { this.unit = "C"; } - if (flags & 1) this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; - if (flags & 2) this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + if (flags & 1) { + this.skin = (dv.buffer[4] * 256 + dv.buffer[3]) / 100; + } else { + this.skin = 0; + } + if (flags & 2) { + this.core = (dv.buffer[2] * 256 + dv.buffer[1]) / 100; + } else { + this.core = 0; + } Bangle.emit('CoreTemp', {core : this.core, skin : this.skin, unit : this.unit}); @@ -55,11 +63,11 @@ function getSensorBatteryLevel(gatt) { } function connection_setup() { - console.log("Scanning for CoreTemp sensor..."); + log("Scanning for CoreTemp sensor..."); NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) .then(function(d) { device = d; - console.log("Found device"); + log("Found device"); return device.gatt.connect(); }) .then(function(g) { @@ -78,27 +86,28 @@ function connection_setup() { return characteristic.startNotifications(); }) .then(function() { - console.log("Done!"); -// getSensorBatteryLevel(gatt); -// g.reset().clearRect(Bangle.appRect).flip(); + log("Done!"); + // getSensorBatteryLevel(gatt); + // g.reset().clearRect(Bangle.appRect).flip(); }) .catch(function(e) { - console.log(e.toString(), "ERROR"); - console.log(e); + log(e.toString(), "ERROR"); + log(e); }); } function connection_end() { - if (gatt != undefined) gatt.disconnect(); + if (gatt != undefined) + gatt.disconnect(); } -settings = require("Storage").readJSON("coretemp.json",1)||{}; -console.log("Settings:"); -console.log(settings); +settings = require("Storage").readJSON("coretemp.json", 1) || {}; +log("Settings:"); +log(settings); if (settings.enabled) { - connection_setup(); - NRF.on('disconnect', connection_setup); + connection_setup(); + NRF.on('disconnect', connection_setup); } E.on('kill', () => { connection_end(); }); diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index afb905c99..7cbbe3577 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -1,76 +1,66 @@ // Simply listen for core events and show data -Bangle.setLCDPower(1); -Bangle.setLCDTimeout(0); - var btm = g.getHeight() - 1; +var px = g.getWidth() / 2; + +// Dark or light logo +var col = (process.env.HWVERSION == 1) ? 65535 : 0; + var corelogo = { width : 146, height : 48, bpp : 4, transparent : 0, - palette : new Uint16Array([ 65535, 65535, 2854, 1419 ]), + palette : new Uint16Array([ col, col, 2854, 1419 ]), buffer : require("heatshrink") .decompress(atob( "AEUDmczmBD/I4xJ/AAMCkBHFAAJG8kQABJAJHFSVURAAUQRphHCkQGBJAySngJHDJRhHEJALZDAgiSBEQ0RPBIAKHAwQQI4xIEaoQFEEZpIULSRHFkDZDBwZIMEYhITa44SKSAxIDSARIDJ4IjKJCpHNEoiQGJDA2CJCQSOCYaQGJDBsCGiKQGTZIJCI4xBEJBAAEFpQAPDQoMGBQyOGIJJPGF6AALC5glCbJAQEgZCEAoowTSBypJBwKQMIQaSBAgZIJWw5ITB5RTDSBLbEAAjDOPRIVabIiQFJBCQKPYhIVCRxIEBg7WDSBpIVbJ5IQJIqQBgZIiCh7ZLJIriDbhJI3JoxIebIZITI6BIjCZ5IRI4RIPHAYAJJH4AIUAJIzHIhI/SAwzBJH6QGJH5HIHApI2HCIAJL4pITkATOJQJIMHCJeFJD8zaZCQHJCEBJCUCJCKPBJBhWGJEcia5oACJBSfHJB4QMJA6SLI4ZIKPAg3QJCUAJCbbBJETbPJAbbKbIhIBYJpIQbZ5UDbZzZFPBxIVSRIOBJA5JISAhIIF4ZIUfQpJHEwQKDJAhJHbJbBJJCIZECY4KGSQoABBIZOBSBbbIJC6IEBQqSJJoyQLbZBIRbYoAKJAaSHJAjbCF541RSRISLSRkgJAKQKbY5ISJJyQDSRyQMbYxITChhHFSRhGMbY5IUCpRHHJJZITiBIVbpBHJbpJHPFhBITfI4ANIwcgI6AAV")) }; -first = true; function onCore(c) { - var core = "Core: " + c.core + c.unit; - var skin = "Skin: " + c.skin + c.unit; + // Large or small font + var sz = ((process.env.HWVERSION == 1) ? 3 : 2); - var px = g.getWidth() / 2; g.setFontAlign(0, 0); - if (first) { - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); - g.drawImage(corelogo, px - 146 / 2, 30); - first = false; - } else { - g.clearRect(0, 48 + 48, g.getWidth(), 48 + 48 + 24 * 2); - } - g.setColor(0xC618); // Light gray - g.setFont("6x8", 3).drawString(core, px, 48 + 48); - g.setFont("6x8", 3).drawString(skin, px, 48 + 48 + 24); + g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 4); + g.setColor(g.theme.dark ? "#CCC" : "#333"); // gray + g.setFont("6x8", sz).drawString( + "Core: " + ((c.core < 327) ? (c.core + c.unit) : 'n/a'), px, 48 + 48); + g.setFont("6x8", sz).drawString("Skin: " + c.skin + c.unit, px, 48 + 48 + 24); } -Bangle.on('CoreTemp', onCore); - -g.clear(); - -Bangle.loadWidgets(); -Bangle.drawWidgets(); - -// Background task will activate if settings are enabled. +// Background task will activate once settings are enabled. function enableSensor() { settings = require("Storage").readJSON("coretemp.json", 1) || {}; if (!settings.enabled) { - settings.enabled = true; require("Storage").write("coretemp.json", settings); - Bangle.loadWidgets(); - Bangle.drawWidgets(); + drawBackground("Waiting for\ndata..."); } } -function drawMessage() { - settings = require("Storage").readJSON("coretemp.json", 1) || {}; - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); - - if (!settings.enabled) { - g.reset().setFont("6x8", 2).setFontAlign(0, 0); - g.drawString("Disabled, press BTN2\nto enable.", g.getWidth() / 2, - g.getHeight() / 2 - 16); - } else { - g.reset().setFont("6x8", 2).setFontAlign(0, 0); - g.drawString("Please wait...\nWaiting for data", g.getWidth() / 2, - g.getHeight() / 2 - 16); - } +function drawBackground(message) { + g.clear(); + Bangle.loadWidgets(); + Bangle.drawWidgets(); + g.reset().setFont("6x8", 2).setFontAlign(0, 0); + g.drawImage(corelogo, px - 146 / 2, 30); + g.drawString(message, g.getWidth() / 2, g.getHeight() / 2 + 16); } -setWatch(() => { enableSensor(); }, BTN2, {repeat : false}); +Bangle.on('CoreTemp', onCore); -drawMessage(); +settings = require("Storage").readJSON("coretemp.json", 1) || {}; + +if (!settings.enabled) { + drawBackground("Sensor off\nBTN" + + ((process.env.HWVERSION == 1) ? '2' : '1') + " to enable"); +} else { + drawBackground("Waiting for\ndata..."); +} + +setWatch(() => { enableSensor(); }, (process.env.HWVERSION == 1) ? BTN2 : BTN1, + {repeat : false}); diff --git a/apps/coretemp/screenshot.png b/apps/coretemp/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..054c16eef71671eb43943d0970b0cfe5564bc0da GIT binary patch literal 3919 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 V_nuPMI`|Yr%uQ@A)f!*@^WX5P5GViu literal 0 HcmV?d00001 diff --git a/apps/coretemp/widget.js b/apps/coretemp/widget.js index 2b5522875..446325118 100644 --- a/apps/coretemp/widget.js +++ b/apps/coretemp/widget.js @@ -1,42 +1,39 @@ -// TODO Change to generic multiple sensor +// TODO Change to a generic multiple sensor widget? + (() => { var settings = {}; var count = 0; - - var img0 = { - width : 24, - height : 24, - bpp : 4, - transparent : 0, - buffer : - require("heatshrink") - .decompress(atob( - "AA0IxGIBAtms0ABQOIwAKFsAWCDAkGBYQUCBwIKEBYgmBBYoHBC4oKDBAILECwRSFDQQLBsBLDBYg4CNYoKBwALGDQYLCQpALaF45jBBZBfJMIZ3GZgwkGZYibCDIMGWoILDWYbBDd4gMFWoTvFYYgAFEYYHDA==")) - }; - var img1 = { - width : 24, - height : 24, - bpp : 3, - transparent : 0, - buffer : - require("heatshrink") - .decompress(atob( - "AAkCpMgAwYFBiVJkgHCAoMAyQIBwAIBAoMEyEABAUkBAkEBAdICIkBBAIdBBAcJEwo1BBAI4EAoJBEKAMAiAIEAAIvBLgosBBCYjFJQIIFKwJHFBARZFBwRrCNAKbCC4J0CpApFR4REGBAWShIxDPQSSCYogvEA=")) - }; + var core = 0; // draw your widget function draw() { if (!settings.enabled) return; g.reset(); + g.setFont("6x8", 1).setFontAlign(0, 0); g.setFontAlign(0, 0); g.clearRect(this.x, this.y, this.x + 23, this.y + 23); - g.drawImage((count & 1) ? img1: img0, this.x, this.y); + + if (count & 1) { + g.setColor("#0f0"); // green + } else { + g.setColor(g.theme.dark ? "#333" : "#CCC"); // off = grey + } + + g.drawImage( + atob("DAyBAAHh0js3EuDMA8A8AWBnDj9A8A=="), + this.x+(24-12)/2,this.y+1); + + g.setColor(g.theme.fg); + g.drawString(parseInt(core)+"\n."+parseInt((core*100)%100), this.x + 24 / 2, this.y + 18); + + g.setColor(-1); } // Set a listener to 'blink' function onTemp(temp) { count = count + 1; + core = temp.core; WIDGETS["coretemp"].draw(); } diff --git a/apps/recorder/ChangeLog b/apps/recorder/ChangeLog index 40240de64..bedc63141 100644 --- a/apps/recorder/ChangeLog +++ b/apps/recorder/ChangeLog @@ -3,3 +3,4 @@ Fix interface.html 0.03: Fix theme and maps/graphing if no GPS 0.04: Multiple bugfixes +0.05: Add recording for coresensor From 3b7f47d17beb7d2af9ce59cb685af9d3097a3d94 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Thu, 30 Dec 2021 06:08:22 +0000 Subject: [PATCH 362/476] Fix merge conflict --- apps/coretemp/coretemp.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/apps/coretemp/coretemp.js b/apps/coretemp/coretemp.js index e628a25ca..7cbbe3577 100644 --- a/apps/coretemp/coretemp.js +++ b/apps/coretemp/coretemp.js @@ -20,11 +20,7 @@ var corelogo = { function onCore(c) { // Large or small font -<<<<<<< HEAD var sz = ((process.env.HWVERSION == 1) ? 3 : 2); -======= - sz = (process.env.HWVERSION == 1) ? 3 : 2; ->>>>>>> 9acf9c89e2a1e1bef8716d44661cf6dcf3ff232b g.setFontAlign(0, 0); g.clearRect(0, 32 + 48, g.getWidth(), 32 + 48 + 24 * 4); @@ -60,11 +56,7 @@ Bangle.on('CoreTemp', onCore); settings = require("Storage").readJSON("coretemp.json", 1) || {}; if (!settings.enabled) { -<<<<<<< HEAD drawBackground("Sensor off\nBTN" + -======= - drawBackground("Sensor disabled\nBTN" + ->>>>>>> 9acf9c89e2a1e1bef8716d44661cf6dcf3ff232b ((process.env.HWVERSION == 1) ? '2' : '1') + " to enable"); } else { drawBackground("Waiting for\ndata..."); From 18efaed6477e8c7eb8eed31a8489063a3a3223d1 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Thu, 30 Dec 2021 06:53:53 +0000 Subject: [PATCH 363/476] Connection seems more reliable on B2 with "active:true" request. --- apps/coretemp/boot.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/coretemp/boot.js b/apps/coretemp/boot.js index 8ef264640..27d437cb1 100644 --- a/apps/coretemp/boot.js +++ b/apps/coretemp/boot.js @@ -64,7 +64,7 @@ function getSensorBatteryLevel(gatt) { function connection_setup() { log("Scanning for CoreTemp sensor..."); - NRF.requestDevice({timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) + NRF.requestDevice({active:true,timeout : 20000, filters : [ {namePrefix : 'CORE'} ]}) .then(function(d) { device = d; log("Found device"); @@ -88,7 +88,6 @@ function connection_setup() { .then(function() { log("Done!"); // getSensorBatteryLevel(gatt); - // g.reset().clearRect(Bangle.appRect).flip(); }) .catch(function(e) { log(e.toString(), "ERROR"); @@ -112,6 +111,4 @@ if (settings.enabled) { E.on('kill', () => { connection_end(); }); -// Bangle.loadWidgets(); -// Bangle.drawWidgets(); })(); From 74114e8efd54a78df519b46e6e18b1833e641a34 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:01:01 +0100 Subject: [PATCH 364/476] Create app.js --- apps/themesetter/app.js | 504 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 504 insertions(+) create mode 100644 apps/themesetter/app.js diff --git a/apps/themesetter/app.js b/apps/themesetter/app.js new file mode 100644 index 000000000..d8536cf22 --- /dev/null +++ b/apps/themesetter/app.js @@ -0,0 +1,504 @@ + let Layout = require('Layout'); + + let ScreenWidth = g.getWidth(), halfWidth = ScreenWidth/2; + let ScreenHeight = g.getHeight(); + + let normalizedColorSet = { + black:g.toColor(0,0,0), white: g.toColor(1,1,1), + red: g.toColor(1,0,0), yellow: g.toColor(1,1,0), + green:g.toColor(0,1,0), magenta:g.toColor(1,0,1), + blue: g.toColor(0,0,1), cyan: g.toColor(0,1,1) + }; + + let activeTheme = g.theme; // currently active theme + let pendingTheme = Object.assign({},activeTheme); + let chosenDetail = null; // one of 'fg','bg','fg2','bg2','fgH','bgH' + +/**** Label ****/ + + function Label (Text, Options) { + function renderLabel (Details) { + let halfWidth = Details.w/2, xAlignment = Details.halign || 0; + let halfHeight = Details.h/2, yAlignment = Details.valign || 0; + let Padding = Details.pad || 0; + + g.setColor(Details.col || g.theme.fg || '#000000'); + + if (Details.font != null) { g.setFont(Details.font); } + g.setFontAlign(xAlignment,yAlignment); + + let x = Details.x + halfWidth + xAlignment*(halfWidth+Padding); + let y = Details.y + halfHeight + yAlignment*(halfHeight+Padding); + + g.drawString(Details.label, x,y); + if (Details.bold) { + g.drawString(Details.label, x+1,y); + g.drawString(Details.label, x,y+1); + g.drawString(Details.label, x+1,y+1); + } + } + + let Result = Object.assign({}, Options || {}, { + type:'custom', render:renderLabel, label:Text || '' + }); + let TextMetrics; + if (! Options.width || ! Options.height) { + if (Options.font != null) { g.setFont(Options.font); } + TextMetrics = g.stringMetrics(Result.label); + } + + Result.width = Options.width || TextMetrics.width + 2*(Options.pad || 0); + Result.height = Options.height || TextMetrics.height + 2*(Options.pad || 0); + return Result; + } + +/**** drawRoundedRect ****/ + + const roundedRectSines = [ + 0, Math.sin(15*Math.PI/180), Math.sin(30*Math.PI/180), + Math.sin(45*Math.PI/180), Math.sin(60*Math.PI/180), + Math.sin(75*Math.PI/180), 1 + ]; + const roundedRectPoly = Array(56); + + function prepareRoundedRect (x1,y1, x2,y2, r) { + r = Math.min(r || 0, Math.abs(x1-x2), Math.abs(y1-y2)); + + for (let i = 0, j = 0; i <= 6; i++, j += 2) { + roundedRectPoly[j] = x1 + r - r*roundedRectSines[6-i]; + roundedRectPoly[j+1] = y1 + r - r*roundedRectSines[i]; + } + + for (let i = 0, j = 14; i <= 6; i++, j += 2) { + roundedRectPoly[j] = x2 - r + r*roundedRectSines[i]; + roundedRectPoly[j+1] = y1 + r - r*roundedRectSines[6-i]; + } + + for (let i = 0, j = 28; i <= 6; i++, j += 2) { + roundedRectPoly[j] = x2 - r + r*roundedRectSines[6-i]; + roundedRectPoly[j+1] = y2 - r + r*roundedRectSines[i]; + } + + for (let i = 0, j = 42; i <= 6; i++, j += 2) { + roundedRectPoly[j] = x1 + r - r*roundedRectSines[i]; + roundedRectPoly[j+1] = y2 - r + r*roundedRectSines[6-i]; + } + } + + g.drawRoundedRect = function drawRoundedRect (x1,y1, x2,y2, r) { + prepareRoundedRect(x1,y1, x2,y2, r); + this.drawPoly(roundedRectPoly,true); + }; + + g.fillRoundedRect = function fillRoundedRect (x1,y1, x2,y2, r) { + prepareRoundedRect(x1,y1, x2,y2, r); + this.fillPoly(roundedRectPoly,true); + }; + + +/**** Button ****/ + + function Button (Text, Options) { + function renderButton (Details) { + let x = Details.x, Width = Details.w, halfWidth = Width/2; + let y = Details.y, Height = Details.h, halfHeight = Height/2; + let Padding = Details.pad || 0; + + g.setColor(Details.col || g.theme.fg || '#000000'); + + if (Details.font != null) { g.setFont(Details.font); } + g.setFontAlign(0,0); + + g.drawRoundedRect(x+Padding,y+Padding, x+Width-Padding-1,y+Height-Padding-1,8); + g.drawString(Details.label, x+halfWidth,y+halfHeight); + g.drawString(Details.label, x+halfWidth+1,y+halfHeight); + g.drawString(Details.label, x+halfWidth,y+halfHeight+1); + g.drawString(Details.label, x+halfWidth+1,y+halfHeight+1); + } + + let Result = Object.assign({}, Options || {}, { + type:'custom', render:renderButton, label:Text || 'Tap' + }); + let TextMetrics; + if (! Options.width || ! Options.height) { + if (Options.font != null) { g.setFont(Options.font); } + TextMetrics = g.stringMetrics(Result.label); + } + + Result.width = Options.width || TextMetrics.width + 2*10 + 2*(Options.pad || 0); + Result.height = Options.height || TextMetrics.height + 2*5 + 2*(Options.pad || 0); + return Result; + } + +/**** ColorDemo ****/ + + function ColorDemo (Text, Options) { + function renderDemo (Details) { + let x = Details.x, Width = Details.w, halfWidth = Width/2; + let y = Details.y, Height = Details.h, halfHeight = Height/2; + let Padding = Details.pad || 0; + + if (Details.font != null) { g.setFont(Details.font); } + g.setFontAlign(0,0); + + g.setColor(Details.bg); // do not use "bgCol"! + g.fillRect(x+Padding, y+Padding, x+Width-Padding, y+Height-Padding); + + g.setColor(Details.fg); + g.drawString(Details.label, x+halfWidth,y+halfHeight); + } + + let Result = Object.assign({}, Options || {}, { + type:'custom', render:renderDemo, label:Text || 'Test' + }); + let TextMetrics; + if (! Options.width || ! Options.height) { + if (Options.font != null) { g.setFont(Options.font); } + TextMetrics = g.stringMetrics(Result.label); + } + + Result.width = Options.width || TextMetrics.width + 2*2 + 2*(Options.pad || 0); + Result.height = Options.height || TextMetrics.height + 2*2 + 2*(Options.pad || 0); + return Result; + } + + +/**** ColorView ****/ + + function ColorView (Color, Options) { + function renderColorView (Details) { + let x = Details.x, Width = Details.w; + let y = Details.y, Height = Details.h; + let Padding = Details.pad || 0; + + g.setColor('#000000'); + g.drawRect(x+Padding,y+Padding, x+Width-Padding-1,y+Height-Padding-1); + + g.setColor(Details.col); + g.fillRect(x+Padding+2, y+Padding+2, x+Width-Padding-3, y+Height-Padding-3); + } + + let Result = Object.assign({}, Options || {}, { + type:'custom', render:renderColorView, col:Color + }); + Result.width = Math.max(10, Options.width || 10) + 2*(Options.pad || 0); + Result.height = Math.max(10, Options.height || 10) + 2*(Options.pad || 0); + return Result; + } + + +/**** ColorSelectionView ****/ + + function ColorSelectionView (Color, Options) { + function renderColorView (Details) { + let x = Details.x, Width = Details.w; + let y = Details.y, Height = Details.h; + let Padding = Details.pad || 0; + + if (Details.selected) { + g.setColor(Details.selected ? '#FF0000' : '#000000'); + g.fillRect(x+Padding,y+Padding, x+Width-Padding-1,y+Height-Padding-1); + + g.setColor('#FFFFFF'); + g.drawRect(x+Padding+4,y+Padding+4, x+Width-Padding-5,y+Height-Padding-5); + } else { + g.setColor('#000000'); + g.drawRect(x+Padding+3,y+Padding+3, x+Width-Padding-4,y+Height-Padding-4); + } + + g.setColor(Details.col); + g.fillRect(x+Padding+5, y+Padding+5, x+Width-Padding-6, y+Height-Padding-6); + } + + let Result = Object.assign({}, Options || {}, { + type:'custom', render:renderColorView, col:Color + }); + Result.width = Math.max(10, Options.width || 10) + 2*(Options.pad || 0); + Result.height = Math.max(10, Options.height || 10) + 2*(Options.pad || 0); + return Result; + } + + +/**** EventConsumerAtPoint ****/ + + function EventConsumerAtPoint (HandlerName, x,y) { + let Layout = (activeLayout || {}).l; + if (Layout == null) { return; } + + function ConsumerIn (Control) { + if ( + (x < Control.x) || (x >= Control.x + Control.w) || + (y < Control.y) || (y >= Control.y + Control.h) + ) { return undefined; } + + if (typeof Control[HandlerName] === 'function') { return Control; } + + if (Control.c != null) { + let ControlList = Control.c; + for (let i = 0, l = ControlList.length; i < l; i++) { + let Consumer = ConsumerIn(ControlList[i]); + if (Consumer != null) { return Consumer; } + } + } + + return undefined; + } + + return ConsumerIn(Layout); + } + +/**** dispatchTouchEvent ****/ + + function dispatchTouchEvent () { + function handleTouchEvent (Button, xy) { + let Control = EventConsumerAtPoint('onTouch', xy.x,xy.y); + if (Control != null) { + Control.onTouch(Control, Button, xy); + } + } + Bangle.on('touch',handleTouchEvent); + } + dispatchTouchEvent(); + +/**** dispatchStrokeEvent ****/ + + function dispatchStrokeEvent () { + function handleStrokeEvent (Coordinates) { + let Control = EventConsumerAtPoint('onStroke', Coordinates.xy[0],Coordinates.xy[1]); + if (Control != null) { + Control.onStroke(Control, Coordinates); + } + } + Bangle.on('stroke',handleStrokeEvent); + } + dispatchStrokeEvent(); + + let ScreenSet = {}; + + g.setFont12x20(); // does not seem to be respected in layout! + let leftColumnWidth = Math.max( + g.stringWidth('Normal '), g.stringWidth('Accented '), g.stringWidth('Hilighted ') + ); + + ScreenSet['MainScreen'] = new Layout({ + type:'v', c:[ + Label('Current Theme', { font:'12x20', pad:8, bold:true, filly:1 }), + { type:'h', c:[ + Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'NormalDemo' }), + ] }, + { type:'h', c:[ + Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'AccentedDemo' }), + ] }, + { type:'h', c:[ + Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'HilitedDemo' }), + ] }, + { height:4 }, + { type:'h', c:[ + Button('Configure', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, + onTouch:() => gotoScreen('DetailSelectionScreen') }) + ], filly:1 } + ] + }); + + let LabelWidth = Math.max( + g.stringWidth('Fg '), g.stringWidth('Fg2 '), g.stringWidth('FgH '), + g.stringWidth('Bg '), g.stringWidth('Bg2 '), g.stringWidth('BgH ') + ); + let LabelHeight = g.stringMetrics('FgH').height; + + ScreenSet['DetailSelectionScreen'] = new Layout({ + type:'v', c:[ + Label('Configure Detail', { font:'12x20', pad:8, bold:true, filly:1 }), + { type:'h', c:[ + Label('fg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + onTouch:() => configureDetail('fg') }), + ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fgView', + onTouch:() => configureDetail('fg') }), + { width:20 }, + Label('bg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + onTouch:() => configureDetail('bg') }), + ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bgView', + onTouch:() => configureDetail('bg') }), + ] }, + { type:'h', c:[ + Label('fg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + onTouch:() => configureDetail('fg2') }), + ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fg2View', + onTouch:() => configureDetail('fg2') }), + { width:20 }, + Label('bg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + onTouch:() => configureDetail('bg2') }), + ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bg2View', + onTouch:() => configureDetail('bg2') }), + ] }, + { type:'h', c:[ + Label('fgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + onTouch:() => configureDetail('fgH') }), + ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fgHView', + onTouch:() => configureDetail('fgH') }), + { width:20 }, + Label('bgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + onTouch:() => configureDetail('bgH') }), + ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bgHView', + onTouch:() => configureDetail('bgH') }), + ] }, + { type:'h', c:[ + Button('Save', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, width:halfWidth, + onTouch:() => { applyChanges(); gotoScreen('MainScreen'); } }), + Button('Cancel', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, width:halfWidth, + onTouch:() => gotoScreen('MainScreen') }) + ], filly:1 }, + ] + }); + + ScreenSet['ColorSelectionScreen'] = new Layout({ + type:'v', c:[ + Label('Choose Color', { font:'12x20', pad:8, bold:true, filly:1 }), + { type:'h', c:[ + ColorSelectionView('#000000',{ width:40, height:40, pad:2, id:'black', + onTouch:() => selectColor(0,0,0) }), + ColorSelectionView('#FF0000',{ width:40, height:40, pad:2, id:'red', + onTouch:() => selectColor(1,0,0) }), + ColorSelectionView('#00FF00',{ width:40, height:40, pad:2, id:'green', + onTouch:() => selectColor(0,1,0) }), + ColorSelectionView('#0000FF',{ width:40, height:40, pad:2, id:'blue', + onTouch:() => selectColor(0,0,1) }), + ] }, + { type:'h', c:[ + ColorSelectionView('#FFFFFF',{ width:40, height:40, pad:2, id:'white', + onTouch:() => selectColor(1,1,1) }), + ColorSelectionView('#FFFF00',{ width:40, height:40, pad:2, id:'yellow', + onTouch:() => selectColor(1,1,0) }), + ColorSelectionView('#FF00FF',{ width:40, height:40, pad:2, id:'magenta', + onTouch:() => selectColor(1,0,1) }), + ColorSelectionView('#00FFFF',{ width:40, height:40, pad:2, id:'cyan', + onTouch:() => selectColor(0,1,1) }), + ] }, + { height:4 }, + { type:'h', c:[ + Button('Back', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:2, width:halfWidth, + onTouch:() => gotoScreen('DetailSelectionScreen') }), + Button('Preview', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:2, width:halfWidth, + onTouch:() => gotoScreen('ThemePreviewScreen') }) + ], filly:1 }, + ] + }); + + ScreenSet['ThemePreviewScreen'] = new Layout({ + type:'v', c:[ + Label('Theme Preview', { font:'12x20', pad:8, bold:true, filly:1 }), + { type:'h', c:[ + Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + ColorDemo(' Test ',{ font:'12x20', pad:2, id:'NormalTest' }), + ] }, + { type:'h', c:[ + Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + ColorDemo(' Test ',{ font:'12x20', pad:2, id:'AccentedTest' }), + ] }, + { type:'h', c:[ + Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + ColorDemo(' Test ',{ font:'12x20', pad:2, id:'HilitedTest' }), + ] }, + { height:4 }, + { type:'h', c:[ + Button('Back', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, + onTouch:() => gotoScreen('ColorSelectionScreen') }) + ], filly:1 } + ] + }); + + +/**** applyChanges ****/ + + function applyChanges () { + let pendingBg = pendingTheme.bg; + let R = ((pendingBg >> 11) & 0b11111) / 0b11111; + let G = ((pendingBg >> 5) & 0b111111) / 0b111111; + let B = (pendingBg & 0b11111) / 0b11111; + pendingTheme.dark = (0.2126*R + 0.7152*G + 0.0722*B < 0.5); + + activeTheme = Object.assign(activeTheme,pendingTheme); + + let globalSettings = Object.assign( + require('Storage').readJSON('setting.json', true) || {}, + { theme:activeTheme } + ); + require('Storage').writeJSON('setting.json', globalSettings); + } + +/**** configureDetail ****/ + + function configureDetail (Detail) { + chosenDetail = Detail; + gotoScreen('ColorSelectionScreen'); + } + +/**** updateColorSelection ****/ + + function updateColorSelection () { + let selectedColor = pendingTheme[chosenDetail]; + + for (let Key in normalizedColorSet) { + if (normalizedColorSet.hasOwnProperty(Key)) { + activeLayout[Key].selected = (selectedColor === normalizedColorSet[Key]); + } + } + } + +/**** selectColor ****/ + + function selectColor (R,G,B) { + let selectedColor = g.toColor(R,G,B); + pendingTheme[chosenDetail] = selectedColor; + + updateColorSelection(); + g.clear(); + activeLayout.render(); + } + +/**** gotoScreen ****/ + + let activeLayout; + + function gotoScreen (ScreenName) { + activeLayout = ScreenSet[ScreenName]; + + switch (ScreenName) { + case 'MainScreen': + activeLayout['NormalDemo'].fg = activeTheme.fg; + activeLayout['NormalDemo'].bg = activeTheme.bg; + activeLayout['AccentedDemo'].fg = activeTheme.fg2; + activeLayout['AccentedDemo'].bg = activeTheme.bg2; + activeLayout['HilitedDemo'].fg = activeTheme.fgH; + activeLayout['HilitedDemo'].bg = activeTheme.bgH; + break; + case 'DetailSelectionScreen': + activeLayout['fgView'].col = pendingTheme.fg; + activeLayout['bgView'].col = pendingTheme.bg; + activeLayout['fg2View'].col = pendingTheme.fg2; + activeLayout['bg2View'].col = pendingTheme.bg2; + activeLayout['fgHView'].col = pendingTheme.fgH; + activeLayout['bgHView'].col = pendingTheme.bgH; + break; + case 'ColorSelectionScreen': + updateColorSelection(); + break; + case 'ThemePreviewScreen': + activeLayout['NormalTest'].fg = pendingTheme.fg; + activeLayout['NormalTest'].bg = pendingTheme.bg; + activeLayout['AccentedTest'].fg = pendingTheme.fg2; + activeLayout['AccentedTest'].bg = pendingTheme.bg2; + activeLayout['HilitedTest'].fg = pendingTheme.fgH; + activeLayout['HilitedTest'].bg = pendingTheme.bgH; + } + + g.setColor('#000000'); g.setBgColor('#FFFFFF'); // assert legibility + g.clear(); + + activeLayout.render(); + } + gotoScreen('MainScreen'); + From 0e75c7e4f38dbf9df2756e5ed1c5e44b27d2684d Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:01:08 +0100 Subject: [PATCH 365/476] Create app-icon.png --- apps/themesetter/app-icon.png | Bin 0 -> 429 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/themesetter/app-icon.png diff --git a/apps/themesetter/app-icon.png b/apps/themesetter/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..19fb4ee6a5e2070dba6c4c630573c2d6cddc3c9d GIT binary patch literal 429 zcmV;e0aE^nP)>W!qQoOKl{Jm=Od9Ql}lvkM?NxK6cJv@oo85| zGjvsCXw4dw574j1WnuDuW2`N6aYfAa5Lc_R_$yL?ikaD+rcL6y&ViBc)WiS`xlQXr zbzt}*27}do4$P$S0j8Bu-M-2}@^7FQ#Ue~rWKcf9wR(i;;i|~MSgmpqf-S!BleqB# z>i!{Pux!|mEwKn4+~VEng034=Y8GuA<5~D$`5R}^>?W{*1Ki_FSo{^|*oovAWEVGh z6PEtO9ro0y-EZLtk0zJM0}inn$#IO9e_A3RYFHv|gA#etpc47z)IcyK{(=*1N3$zH zS6IGN Date: Thu, 30 Dec 2021 11:01:11 +0100 Subject: [PATCH 366/476] Create app-icon.js --- apps/themesetter/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/themesetter/app-icon.js diff --git a/apps/themesetter/app-icon.js b/apps/themesetter/app-icon.js new file mode 100644 index 000000000..d4520486b --- /dev/null +++ b/apps/themesetter/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwMB/4AQ8AZCCwIFL8YVC+IFQ+EHAp/x44FLHYgFMLwgFW/0HAof4h4FD4EfCAcACAgWECCHgn4WEHwgF7AEI=")) \ No newline at end of file From 081443a794a00b1cb43f6c7b9dc2bd2d608388bf Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:01:16 +0100 Subject: [PATCH 367/476] Create app-screenshot.png --- apps/themesetter/app-screenshot.png | Bin 0 -> 3232 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/themesetter/app-screenshot.png diff --git a/apps/themesetter/app-screenshot.png b/apps/themesetter/app-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bf5a6a242fae831bb50cfdf5f5dd824b1d60d5 GIT binary patch literal 3232 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 UG4J$vSYHm{hLI(v#sHV_9}TwiaR2}S literal 0 HcmV?d00001 From 05a8fdb94b2d77c493f862eae340925dd047d2a4 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:01:20 +0100 Subject: [PATCH 368/476] Create ThemeSetter-MainScreen.png --- apps/themesetter/ThemeSetter-MainScreen.png | Bin 0 -> 3232 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/themesetter/ThemeSetter-MainScreen.png diff --git a/apps/themesetter/ThemeSetter-MainScreen.png b/apps/themesetter/ThemeSetter-MainScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..e7bf5a6a242fae831bb50cfdf5f5dd824b1d60d5 GIT binary patch literal 3232 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 UG4J$vSYHm{hLI(v#sHV_9}TwiaR2}S literal 0 HcmV?d00001 From 91dced7ebaf8d3547b06b67193dbf337ea63a455 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:01:28 +0100 Subject: [PATCH 369/476] Create ThemeSetter-DetailSelectionScreen.png --- .../ThemeSetter-DetailSelectionScreen.png | Bin 0 -> 3307 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/themesetter/ThemeSetter-DetailSelectionScreen.png diff --git a/apps/themesetter/ThemeSetter-DetailSelectionScreen.png b/apps/themesetter/ThemeSetter-DetailSelectionScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..79a983652ac26cd24ddae635aadf90ac81133b3f GIT binary patch literal 3307 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 Date: Thu, 30 Dec 2021 11:01:31 +0100 Subject: [PATCH 370/476] Create ThemeSetter-ColorSelectionScreen.png --- .../ThemeSetter-ColorSelectionScreen.png | Bin 0 -> 2691 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/themesetter/ThemeSetter-ColorSelectionScreen.png diff --git a/apps/themesetter/ThemeSetter-ColorSelectionScreen.png b/apps/themesetter/ThemeSetter-ColorSelectionScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed4d857edd97d62bf8618e82a6e6f572d2e7f57 GIT binary patch literal 2691 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 za+ Date: Thu, 30 Dec 2021 11:01:34 +0100 Subject: [PATCH 371/476] Create ThemeSetter-ThemePreviewScreen.png --- .../ThemeSetter-ThemePreviewScreen.png | Bin 0 -> 3125 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/themesetter/ThemeSetter-ThemePreviewScreen.png diff --git a/apps/themesetter/ThemeSetter-ThemePreviewScreen.png b/apps/themesetter/ThemeSetter-ThemePreviewScreen.png new file mode 100644 index 0000000000000000000000000000000000000000..1d21935b2685f8154a50e59cce21fa1a9369d5ba GIT binary patch literal 3125 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 Date: Thu, 30 Dec 2021 11:01:38 +0100 Subject: [PATCH 372/476] Create README.md --- apps/themesetter/README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 apps/themesetter/README.md diff --git a/apps/themesetter/README.md b/apps/themesetter/README.md new file mode 100644 index 000000000..e3af29fd3 --- /dev/null +++ b/apps/themesetter/README.md @@ -0,0 +1,18 @@ +# Theme Setter # + +This little tool allows you to configure the global theme of all Bangle.js apps +(provided that they do not override the global settings) in a more comfortable +way than through the settings menu. + +![](ThemeSetter-MainScreen.png) +![](ThemeSetter-DetailSelectionScreen.png) +![](ThemeSetter-ColorSelectionScreen.png) +![](ThemeSetter-ThemePreviewScreen.png) + +This app also acts as an example for a non-trivial Bangle.js application +using the "layout" library, custom controls and generic event dispatching. +See [GitHub](https://github.com/rozek/banglejs-2-activities) for details. + +## License ## + +[MIT License](LICENSE) From d4750f5cc36a46083a00150fc4efa12c7e285dbd Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:02:47 +0100 Subject: [PATCH 373/476] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index 8e4d7a14e..94300c717 100644 --- a/apps.json +++ b/apps.json @@ -5128,5 +5128,22 @@ {"name":"colorful_clock.app.js","url":"app.js"}, {"name":"colorful_clock.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "themesetter", + "name": "Theme Setter", + "shortName":"Theme Setter", + "version":"0.01", + "description": "a comfortable way to configure theme colors", + "icon": "app-icon.png", + "type": "tool", + "tags": "tool", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"themesetter.app.js","url":"app.js"}, + {"name":"themesetter.img","url":"app-icon.js","evaluate":true} + ] } ] From a131db6da489ad1b425710a8b2dcd9c16ec66911 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:12:26 +0100 Subject: [PATCH 374/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 94300c717..8961300ee 100644 --- a/apps.json +++ b/apps.json @@ -5135,7 +5135,7 @@ "version":"0.01", "description": "a comfortable way to configure theme colors", "icon": "app-icon.png", - "type": "tool", + "type": "app", "tags": "tool", "supports" : ["BANGLEJS2"], "allow_emulator": true, From b47ea2d9e1b05ce919e9d068ed8fcab0c90c5f11 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 11:24:39 +0100 Subject: [PATCH 375/476] Update README.md --- apps/themesetter/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/themesetter/README.md b/apps/themesetter/README.md index e3af29fd3..17eb7fc95 100644 --- a/apps/themesetter/README.md +++ b/apps/themesetter/README.md @@ -1,8 +1,8 @@ # Theme Setter # This little tool allows you to configure the global theme of all Bangle.js apps -(provided that they do not override the global settings) in a more comfortable -way than through the settings menu. +(provided that they do not override global settings) in a more comfortable way +than through the settings menu. ![](ThemeSetter-MainScreen.png) ![](ThemeSetter-DetailSelectionScreen.png) From 82eecf69129f0953b73cdce99845450298b3d13f Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 17:32:01 +0100 Subject: [PATCH 376/476] Update app-icon.png --- apps/themesetter/app-icon.png | Bin 429 -> 940 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/themesetter/app-icon.png b/apps/themesetter/app-icon.png index 19fb4ee6a5e2070dba6c4c630573c2d6cddc3c9d..078920a27e0efc2a004e472675f041ef76ce3ed3 100644 GIT binary patch literal 940 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1SD@Hz9|8>y;bpKhp88yV>WRp=I1=9MH?=;jqGLkxkLMfuL^+7WFhI$72aI=A0Z9t+{{zaLoK$}74+Zoz`RicPN?Xl4Z zS&rlwh)=O`ND*`lTnDqqp9Df|{cksS|2J5T`ncYVhF+4GSI)USn z%yGk9{&)RLW;C8~c0A&u?B-wd`OM7hEbcElW>@)|t7?p9E?{TzomG^_Y5OO z7mWhP4W}N=vuyklVlnNgnW?c#k%mU(m18GD+0+kBTDo)kQJVk`6A7N6ghe8U9~!V} z#C$V!eCD^%cEdZT_A{xWyNaJRu&nlZ*|?=SbNz?f_yS8&{ihpmzpdIEw>65@cV!5Z z^ABOM;I<<#OQQ6qpG^~%X)K5>H=C`vvQR z{`=p${b8#Oy-z(Y+J5_P-uCam|H`UfILSQs{PU|>SM#<@vQItsdC%9X+MO|rWM+8s zyr|l%HI@7znA?9jY{^<-vNp_ny@^7ClW>OJ{9u2BDQ=55M(Fe% zS3bS4WCf?odLuXI_0~&|%x^L+uYPmsz#^6l`#JJ{>woup62+~u`Jz>d>?BJC>-9IC z-!ymrt5x*=^0v}nh*Ew%-)_iLa-_iu%_9;agtkDWHW3MUBbgqxOXJ#h< Svwb%xUwOLvxvX3~ogdh?d5E^EnO3wf^tUyZ(f`STBKtV^%3ar2a&;UCi0YwT2p-@CfiE~Mu z#O7>tujIngS$;qJzu)I0ktmf*WavjeGF%i9Udf$jSf4X=Rexk?%^H*s(67d2Ve)=s ztSxhKMa=aOSF5u4D^h@pnc1DDP2#%FfsyXi!~hJrP3uB+VE7>hgVlWw%%t%Frj=0L zzRE%JZ=e^&B1~3fP(Hx5dW7iVs>r}tt#T29Exz%SxbXq%{vl(qY}k)2u?QX9;@#+i zt{YQo7Hu5kS%3In`5R}^>?W{*1Ki_FSo{^|*oovAWEVGh6PEtO9ro0y-EZLtk0zJM z0}inn$#IO9e_A3RYFHv|gA#etpc47z)IcyK{(=*1N3$zHS6IGN Date: Thu, 30 Dec 2021 17:33:13 +0100 Subject: [PATCH 377/476] Update app-icon.js --- apps/themesetter/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/themesetter/app-icon.js b/apps/themesetter/app-icon.js index d4520486b..31fc30449 100644 --- a/apps/themesetter/app-icon.js +++ b/apps/themesetter/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwMB/4AQ8AZCCwIFL8YVC+IFQ+EHAp/x44FLHYgFMLwgFW/0HAof4h4FD4EfCAcACAgWECCHgn4WEHwgF7AEI=")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwgP/ACHgDAQWBApfjCoXxAqHwg4FP+PHApY7EApheEAq3+g4FD/EPAofAj4QDgAQECwgQQ8E/Cwg+EAvYAhA==")) \ No newline at end of file From 9f84adcd9f3f75c499425532f6ecc80a871b37cc Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 18:04:20 +0100 Subject: [PATCH 378/476] Update app.js --- apps/themesetter/app.js | 64 ++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/apps/themesetter/app.js b/apps/themesetter/app.js index d8536cf22..3c68e2581 100644 --- a/apps/themesetter/app.js +++ b/apps/themesetter/app.js @@ -52,49 +52,39 @@ return Result; } -/**** drawRoundedRect ****/ + if (g.drawRoundedRect == null) { + g.drawRoundedRect = function drawRoundedRect (x1,y1, x2,y2, r) { + let x,y; + if (x1 > x2) { x = x1; x1 = x2; x2 = x; } + if (y1 > y2) { y = y1; y1 = y2; y2 = y; } - const roundedRectSines = [ - 0, Math.sin(15*Math.PI/180), Math.sin(30*Math.PI/180), - Math.sin(45*Math.PI/180), Math.sin(60*Math.PI/180), - Math.sin(75*Math.PI/180), 1 - ]; - const roundedRectPoly = Array(56); + r = Math.min(r || 0, (x2-x1)/2, (y2-y1)/2); - function prepareRoundedRect (x1,y1, x2,y2, r) { - r = Math.min(r || 0, Math.abs(x1-x2), Math.abs(y1-y2)); + let cx1 = x1+r, cx2 = x2-r; + let cy1 = y1+r, cy2 = y2-r; - for (let i = 0, j = 0; i <= 6; i++, j += 2) { - roundedRectPoly[j] = x1 + r - r*roundedRectSines[6-i]; - roundedRectPoly[j+1] = y1 + r - r*roundedRectSines[i]; - } + this.drawLine(cx1,y1, cx2,y1); + this.drawLine(cx1,y2, cx2,y2); + this.drawLine(x1,cy1, x1,cy2); + this.drawLine(x2,cy1, x2,cy2); - for (let i = 0, j = 14; i <= 6; i++, j += 2) { - roundedRectPoly[j] = x2 - r + r*roundedRectSines[i]; - roundedRectPoly[j+1] = y1 + r - r*roundedRectSines[6-i]; - } + x = r; y = 0; - for (let i = 0, j = 28; i <= 6; i++, j += 2) { - roundedRectPoly[j] = x2 - r + r*roundedRectSines[6-i]; - roundedRectPoly[j+1] = y2 - r + r*roundedRectSines[i]; - } + let dx,dy, Error = 0; + while (y <= x) { + dy = 1 + 2*y; y++; Error -= dy; + if (Error < 0) { + dx = 1 - 2*x; x--; Error -= dx; + } - for (let i = 0, j = 42; i <= 6; i++, j += 2) { - roundedRectPoly[j] = x1 + r - r*roundedRectSines[i]; - roundedRectPoly[j+1] = y2 - r + r*roundedRectSines[6-i]; - } + this.setPixel(cx1 - x, cy1 - y); this.setPixel(cx1 - y, cy1 - x); + this.setPixel(cx2 + x, cy1 - y); this.setPixel(cx2 + y, cy1 - x); + this.setPixel(cx2 + x, cy2 + y); this.setPixel(cx2 + y, cy2 + x); + this.setPixel(cx1 - x, cy2 + y); this.setPixel(cx1 - y, cy2 + x); + } + }; } - g.drawRoundedRect = function drawRoundedRect (x1,y1, x2,y2, r) { - prepareRoundedRect(x1,y1, x2,y2, r); - this.drawPoly(roundedRectPoly,true); - }; - - g.fillRoundedRect = function fillRoundedRect (x1,y1, x2,y2, r) { - prepareRoundedRect(x1,y1, x2,y2, r); - this.fillPoly(roundedRectPoly,true); - }; - /**** Button ****/ @@ -297,7 +287,9 @@ ] }, { height:4 }, { type:'h', c:[ - Button('Configure', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, + Button('Exit', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', width:halfWidth, pad:4, + onTouch:() => load() }), + Button('Config', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', width:halfWidth, pad:4, onTouch:() => gotoScreen('DetailSelectionScreen') }) ], filly:1 } ] From a8499c4489d426a22cd8bcf49ce929324e7909f6 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 18:04:22 +0100 Subject: [PATCH 379/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8961300ee..6808e7a4a 100644 --- a/apps.json +++ b/apps.json @@ -5132,7 +5132,7 @@ { "id": "themesetter", "name": "Theme Setter", "shortName":"Theme Setter", - "version":"0.01", + "version":"0.02", "description": "a comfortable way to configure theme colors", "icon": "app-icon.png", "type": "app", From 3d45170cda29a732b64dced240bdd42ee396cd5e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 18:05:34 +0100 Subject: [PATCH 380/476] Update ThemeSetter-MainScreen.png --- apps/themesetter/ThemeSetter-MainScreen.png | Bin 3232 -> 3403 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/themesetter/ThemeSetter-MainScreen.png b/apps/themesetter/ThemeSetter-MainScreen.png index e7bf5a6a242fae831bb50cfdf5f5dd824b1d60d5..3a0fc215c6b44e3c4fb7a49276605a4efcbff197 100644 GIT binary patch delta 3287 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 V;ShCn0CoTX002ovPDHLkV1lH!9J&Ai delta 3136 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 W0)^q&cl!JQ`&~D-!qgbz68{4f&DoIv From e81fc99096fe7a4b551685de13d59c6ff1abbf21 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 18:30:03 +0100 Subject: [PATCH 381/476] Update app.js --- apps/themesetter/app.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/apps/themesetter/app.js b/apps/themesetter/app.js index 3c68e2581..69a2b09a5 100644 --- a/apps/themesetter/app.js +++ b/apps/themesetter/app.js @@ -272,17 +272,17 @@ ScreenSet['MainScreen'] = new Layout({ type:'v', c:[ - Label('Current Theme', { font:'12x20', pad:8, bold:true, filly:1 }), + Label('Current Theme', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), { type:'h', c:[ - Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'NormalDemo' }), ] }, { type:'h', c:[ - Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'AccentedDemo' }), ] }, { type:'h', c:[ - Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'HilitedDemo' }), ] }, { height:4 }, @@ -303,36 +303,36 @@ ScreenSet['DetailSelectionScreen'] = new Layout({ type:'v', c:[ - Label('Configure Detail', { font:'12x20', pad:8, bold:true, filly:1 }), + Label('Configure Detail', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), { type:'h', c:[ - Label('fg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + Label('fg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', onTouch:() => configureDetail('fg') }), ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fgView', onTouch:() => configureDetail('fg') }), { width:20 }, - Label('bg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + Label('bg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', onTouch:() => configureDetail('bg') }), ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bgView', onTouch:() => configureDetail('bg') }), ] }, { type:'h', c:[ - Label('fg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + Label('fg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', onTouch:() => configureDetail('fg2') }), ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fg2View', onTouch:() => configureDetail('fg2') }), { width:20 }, - Label('bg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + Label('bg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', onTouch:() => configureDetail('bg2') }), ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bg2View', onTouch:() => configureDetail('bg2') }), ] }, { type:'h', c:[ - Label('fgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + Label('fgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', onTouch:() => configureDetail('fgH') }), ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fgHView', onTouch:() => configureDetail('fgH') }), { width:20 }, - Label('bgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, + Label('bgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', onTouch:() => configureDetail('bgH') }), ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bgHView', onTouch:() => configureDetail('bgH') }), @@ -348,7 +348,7 @@ ScreenSet['ColorSelectionScreen'] = new Layout({ type:'v', c:[ - Label('Choose Color', { font:'12x20', pad:8, bold:true, filly:1 }), + Label('Choose Color', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), { type:'h', c:[ ColorSelectionView('#000000',{ width:40, height:40, pad:2, id:'black', onTouch:() => selectColor(0,0,0) }), @@ -381,17 +381,17 @@ ScreenSet['ThemePreviewScreen'] = new Layout({ type:'v', c:[ - Label('Theme Preview', { font:'12x20', pad:8, bold:true, filly:1 }), + Label('Theme Preview', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), { type:'h', c:[ - Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), ColorDemo(' Test ',{ font:'12x20', pad:2, id:'NormalTest' }), ] }, { type:'h', c:[ - Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), ColorDemo(' Test ',{ font:'12x20', pad:2, id:'AccentedTest' }), ] }, { type:'h', c:[ - Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0 }), + Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), ColorDemo(' Test ',{ font:'12x20', pad:2, id:'HilitedTest' }), ] }, { height:4 }, From 6468cf1990285329da772533a0d420033b1c708d Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Thu, 30 Dec 2021 18:30:05 +0100 Subject: [PATCH 382/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 6808e7a4a..bd804b0b0 100644 --- a/apps.json +++ b/apps.json @@ -5132,7 +5132,7 @@ { "id": "themesetter", "name": "Theme Setter", "shortName":"Theme Setter", - "version":"0.02", + "version":"0.03", "description": "a comfortable way to configure theme colors", "icon": "app-icon.png", "type": "app", From 52e0cafdd690663ee44ea9ce088879bbc6b1ad29 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Fri, 31 Dec 2021 07:54:04 +0100 Subject: [PATCH 383/476] Update app.js --- apps/themesetter/app.js | 162 ++++++++++++++++++++-------------------- 1 file changed, 82 insertions(+), 80 deletions(-) diff --git a/apps/themesetter/app.js b/apps/themesetter/app.js index 69a2b09a5..aa3c608cf 100644 --- a/apps/themesetter/app.js +++ b/apps/themesetter/app.js @@ -38,17 +38,19 @@ } } - let Result = Object.assign({}, Options || {}, { + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { type:'custom', render:renderLabel, label:Text || '' }); let TextMetrics; - if (! Options.width || ! Options.height) { - if (Options.font != null) { g.setFont(Options.font); } + if (! Result.width || ! Result.height) { + if (Result.font != null) { g.setFont(Result.font); } TextMetrics = g.stringMetrics(Result.label); } - Result.width = Options.width || TextMetrics.width + 2*(Options.pad || 0); - Result.height = Options.height || TextMetrics.height + 2*(Options.pad || 0); + Result.width = Result.width || TextMetrics.width + 2*(Result.pad || 0); + Result.height = Result.height || TextMetrics.height + 2*(Result.pad || 0); return Result; } @@ -106,17 +108,19 @@ g.drawString(Details.label, x+halfWidth+1,y+halfHeight+1); } - let Result = Object.assign({}, Options || {}, { + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { type:'custom', render:renderButton, label:Text || 'Tap' }); let TextMetrics; - if (! Options.width || ! Options.height) { + if (! Result.width || ! Result.height) { if (Options.font != null) { g.setFont(Options.font); } TextMetrics = g.stringMetrics(Result.label); } - Result.width = Options.width || TextMetrics.width + 2*10 + 2*(Options.pad || 0); - Result.height = Options.height || TextMetrics.height + 2*5 + 2*(Options.pad || 0); + Result.width = Result.width || TextMetrics.width + 2*10 + 2*(Result.pad || 0); + Result.height = Result.height || TextMetrics.height + 2*5 + 2*(Result.pad || 0); return Result; } @@ -138,17 +142,19 @@ g.drawString(Details.label, x+halfWidth,y+halfHeight); } - let Result = Object.assign({}, Options || {}, { + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { type:'custom', render:renderDemo, label:Text || 'Test' }); let TextMetrics; - if (! Options.width || ! Options.height) { - if (Options.font != null) { g.setFont(Options.font); } + if (! Result.width || ! Result.height) { + if (Result.font != null) { g.setFont(Result.font); } TextMetrics = g.stringMetrics(Result.label); } - Result.width = Options.width || TextMetrics.width + 2*2 + 2*(Options.pad || 0); - Result.height = Options.height || TextMetrics.height + 2*2 + 2*(Options.pad || 0); + Result.width = Result.width || TextMetrics.width + 2*2 + 2*(Result.pad || 0); + Result.height = Result.height || TextMetrics.height + 2*2 + 2*(Result.pad || 0); return Result; } @@ -168,11 +174,13 @@ g.fillRect(x+Padding+2, y+Padding+2, x+Width-Padding-3, y+Height-Padding-3); } - let Result = Object.assign({}, Options || {}, { + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { type:'custom', render:renderColorView, col:Color }); - Result.width = Math.max(10, Options.width || 10) + 2*(Options.pad || 0); - Result.height = Math.max(10, Options.height || 10) + 2*(Options.pad || 0); + Result.width = Math.max(10, Result.width || 10) + 2*(Result.pad || 0); + Result.height = Math.max(10, Result.height || 10) + 2*(Result.pad || 0); return Result; } @@ -200,11 +208,13 @@ g.fillRect(x+Padding+5, y+Padding+5, x+Width-Padding-6, y+Height-Padding-6); } - let Result = Object.assign({}, Options || {}, { + let Result = Object.assign(( + Options == null ? {} : Object.assign({}, Options.common || {}, Options) + ), { type:'custom', render:renderColorView, col:Color }); - Result.width = Math.max(10, Options.width || 10) + 2*(Options.pad || 0); - Result.height = Math.max(10, Options.height || 10) + 2*(Options.pad || 0); + Result.width = Math.max(10, Result.width || 10) + 2*(Result.pad || 0); + Result.height = Math.max(10, Result.height || 10) + 2*(Result.pad || 0); return Result; } @@ -270,27 +280,31 @@ g.stringWidth('Normal '), g.stringWidth('Accented '), g.stringWidth('Hilighted ') ); + let StdFont = { font:'12x20' }; + let legible = Object.assign({ col:'#000000', bgCol:'#FFFFFF' }, StdFont); + let leftAligned = Object.assign({ halign:-1, valign:0 }, legible); + let MainLabel = Object.assign({ pad:4, width:leftColumnWidth }, leftAligned); + let halfWidthButton = Object.assign({ pad:4, width:halfWidth }, legible); + ScreenSet['MainScreen'] = new Layout({ type:'v', c:[ - Label('Current Theme', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), + Label('Current Theme', { common:legible, pad:8, bold:true, filly:1 }), { type:'h', c:[ - Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), - ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'NormalDemo' }), + Label('Normal', { common:MainLabel }), + ColorDemo(' Demo ',{ common:StdFont, pad:2, id:'NormalDemo' }), ] }, { type:'h', c:[ - Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), - ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'AccentedDemo' }), + Label('Accented', { common:MainLabel }), + ColorDemo(' Demo ',{ common:StdFont, pad:2, id:'AccentedDemo' }), ] }, { type:'h', c:[ - Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), - ColorDemo(' Demo ',{ font:'12x20', pad:2, id:'HilitedDemo' }), + Label('Hilighted', { common:MainLabel }), + ColorDemo(' Demo ',{ common:StdFont, pad:2, id:'HilitedDemo' }), ] }, { height:4 }, { type:'h', c:[ - Button('Exit', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', width:halfWidth, pad:4, - onTouch:() => load() }), - Button('Config', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', width:halfWidth, pad:4, - onTouch:() => gotoScreen('DetailSelectionScreen') }) + Button('Exit', { common:halfWidthButton, onTouch:() => load() }), + Button('Config', { common:halfWidthButton, onTouch:() => gotoScreen('DetailSelectionScreen') }) ], filly:1 } ] }); @@ -301,103 +315,91 @@ ); let LabelHeight = g.stringMetrics('FgH').height; + let DetailLabel = Object.assign({ pad:4, width:LabelWidth }, leftAligned); + let DetailView = { width:30, height:LabelHeight, pad:2 }; + ScreenSet['DetailSelectionScreen'] = new Layout({ type:'v', c:[ Label('Configure Detail', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), { type:'h', c:[ - Label('fg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', - onTouch:() => configureDetail('fg') }), - ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fgView', - onTouch:() => configureDetail('fg') }), + Label('fg', { common:DetailLabel, onTouch:() => configureDetail('fg') }), + ColorView(0, { common:DetailView, onTouch:() => configureDetail('fg'), id:'fgView' }), { width:20 }, - Label('bg', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', - onTouch:() => configureDetail('bg') }), - ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bgView', - onTouch:() => configureDetail('bg') }), + Label('bg', { common:DetailLabel, onTouch:() => configureDetail('bg') }), + ColorView(0, { common:DetailView, onTouch:() => configureDetail('bg'), id:'bgView' }), ] }, { type:'h', c:[ - Label('fg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', - onTouch:() => configureDetail('fg2') }), - ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fg2View', - onTouch:() => configureDetail('fg2') }), + Label('fg2', { common:DetailLabel, onTouch:() => configureDetail('fg2') }), + ColorView(0, { common:DetailView, onTouch:() => configureDetail('fg2'), id:'fg2View' }), { width:20 }, - Label('bg2', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', - onTouch:() => configureDetail('bg2') }), - ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bg2View', - onTouch:() => configureDetail('bg2') }), + Label('bg2', { common:DetailLabel, onTouch:() => configureDetail('bg2') }), + ColorView(0, { common:DetailView, onTouch:() => configureDetail('bg2'), id:'bg2View' }), ] }, { type:'h', c:[ - Label('fgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', - onTouch:() => configureDetail('fgH') }), - ColorView(0, { width:30, height:LabelHeight, pad:2, id:'fgHView', - onTouch:() => configureDetail('fgH') }), + Label('fgH', { common:DetailLabel, onTouch:() => configureDetail('fgH') }), + ColorView(0, { common:DetailView, onTouch:() => configureDetail('fgH'), id:'fgHView' }), { width:20 }, - Label('bgH', { halign:-1, valign:0, font:'12x20', pad:4, width:LabelWidth, col:'#000000', bgCol:'#FFFFFF', - onTouch:() => configureDetail('bgH') }), - ColorView(0, { width:30, height:LabelHeight, pad:2, id:'bgHView', - onTouch:() => configureDetail('bgH') }), + Label('bgH', { common:DetailLabel, onTouch:() => configureDetail('bgH') }), + ColorView(0, { common:DetailView, onTouch:() => configureDetail('bgH'), id:'bgHView' }), ] }, { type:'h', c:[ - Button('Save', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, width:halfWidth, - onTouch:() => { applyChanges(); gotoScreen('MainScreen'); } }), - Button('Cancel', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, width:halfWidth, - onTouch:() => gotoScreen('MainScreen') }) + Button('Save', { common:halfWidthButton, onTouch:() => { applyChanges(); gotoScreen('MainScreen'); } }), + Button('Cancel', { common:halfWidthButton, onTouch:() => gotoScreen('MainScreen') }) ], filly:1 }, ] }); + let StdSelectionView = { width:40, height:40, pad:2 }; + ScreenSet['ColorSelectionScreen'] = new Layout({ type:'v', c:[ Label('Choose Color', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), { type:'h', c:[ - ColorSelectionView('#000000',{ width:40, height:40, pad:2, id:'black', + ColorSelectionView('#000000',{ common:StdSelectionView, id:'black', onTouch:() => selectColor(0,0,0) }), - ColorSelectionView('#FF0000',{ width:40, height:40, pad:2, id:'red', + ColorSelectionView('#FF0000',{ common:StdSelectionView, id:'red', onTouch:() => selectColor(1,0,0) }), - ColorSelectionView('#00FF00',{ width:40, height:40, pad:2, id:'green', + ColorSelectionView('#00FF00',{ common:StdSelectionView, id:'green', onTouch:() => selectColor(0,1,0) }), - ColorSelectionView('#0000FF',{ width:40, height:40, pad:2, id:'blue', + ColorSelectionView('#0000FF',{ common:StdSelectionView, id:'blue', onTouch:() => selectColor(0,0,1) }), ] }, { type:'h', c:[ - ColorSelectionView('#FFFFFF',{ width:40, height:40, pad:2, id:'white', + ColorSelectionView('#FFFFFF',{ common:StdSelectionView, id:'white', onTouch:() => selectColor(1,1,1) }), - ColorSelectionView('#FFFF00',{ width:40, height:40, pad:2, id:'yellow', + ColorSelectionView('#FFFF00',{ common:StdSelectionView, id:'yellow', onTouch:() => selectColor(1,1,0) }), - ColorSelectionView('#FF00FF',{ width:40, height:40, pad:2, id:'magenta', + ColorSelectionView('#FF00FF',{ common:StdSelectionView, id:'magenta', onTouch:() => selectColor(1,0,1) }), - ColorSelectionView('#00FFFF',{ width:40, height:40, pad:2, id:'cyan', + ColorSelectionView('#00FFFF',{ common:StdSelectionView, id:'cyan', onTouch:() => selectColor(0,1,1) }), ] }, { height:4 }, { type:'h', c:[ - Button('Back', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:2, width:halfWidth, - onTouch:() => gotoScreen('DetailSelectionScreen') }), - Button('Preview', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:2, width:halfWidth, - onTouch:() => gotoScreen('ThemePreviewScreen') }) + Button('Back', { common:halfWidthButton, onTouch:() => gotoScreen('DetailSelectionScreen') }), + Button('Preview', { common:halfWidthButton, onTouch:() => gotoScreen('ThemePreviewScreen') }) ], filly:1 }, ] }); ScreenSet['ThemePreviewScreen'] = new Layout({ type:'v', c:[ - Label('Theme Preview', { font:'12x20', pad:8, col:'#000000', bgCol:'#FFFFFF', bold:true, filly:1 }), + Label('Theme Preview', { common:legible, bold:true, filly:1 }), { type:'h', c:[ - Label('Normal', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), - ColorDemo(' Test ',{ font:'12x20', pad:2, id:'NormalTest' }), + Label('Normal', { common:MainLabel }), + ColorDemo(' Test ',{ common:StdFont, pad:2, id:'NormalTest' }), ] }, { type:'h', c:[ - Label('Accented', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), - ColorDemo(' Test ',{ font:'12x20', pad:2, id:'AccentedTest' }), + Label('Accented', { common:MainLabel }), + ColorDemo(' Test ',{ common:StdFont, pad:2, id:'AccentedTest' }), ] }, { type:'h', c:[ - Label('Hilighted', { font:'12x20', pad:4, width:leftColumnWidth, halign:-1, valign:0, col:'#000000', bgCol:'#FFFFFF' }), - ColorDemo(' Test ',{ font:'12x20', pad:2, id:'HilitedTest' }), + Label('Hilighted', { common:MainLabel }), + ColorDemo(' Test ',{ common:StdFont, pad:2, id:'HilitedTest' }), ] }, { height:4 }, { type:'h', c:[ - Button('Back', { font:'12x20', col:'#000000', bgCol:'#FFFFFF', pad:4, - onTouch:() => gotoScreen('ColorSelectionScreen') }) + Button('Back', { common:legible, pad:4, onTouch:() => gotoScreen('ColorSelectionScreen') }) ], filly:1 } ] }); From dd615555321da037acd23873045da6b4c484046e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Fri, 31 Dec 2021 07:54:08 +0100 Subject: [PATCH 384/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index bd804b0b0..97a0f04fe 100644 --- a/apps.json +++ b/apps.json @@ -5132,7 +5132,7 @@ { "id": "themesetter", "name": "Theme Setter", "shortName":"Theme Setter", - "version":"0.03", + "version":"0.04", "description": "a comfortable way to configure theme colors", "icon": "app-icon.png", "type": "app", From df3e5d479cb8d8457fb8900bf85778eb77a1af4e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Fri, 31 Dec 2021 09:39:00 +0100 Subject: [PATCH 385/476] Update README.md --- apps/themesetter/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/themesetter/README.md b/apps/themesetter/README.md index 17eb7fc95..518d05c01 100644 --- a/apps/themesetter/README.md +++ b/apps/themesetter/README.md @@ -16,3 +16,7 @@ See [GitHub](https://github.com/rozek/banglejs-2-activities) for details. ## License ## [MIT License](LICENSE) + +## Credits ## + +The icon for this app was taken from [icons8.com](https://icons8.com/). \ No newline at end of file From d483f8573d8bce47dc7916d3e7b35e4582a97e9c Mon Sep 17 00:00:00 2001 From: fparri Date: Fri, 31 Dec 2021 22:22:10 +0100 Subject: [PATCH 386/476] Fixed Italian localization I am providing small fixes for the Italian localization. 1. using : to separate hours from minutes, instead of . 2. datePattern: changed to the more usual way of representing dates in Italian. 3. datePattern: fixed so that clocks such as Anton Clock work fine 4. day: removed an extra space before. --- apps/locale/locales.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index b607998a0..599ae1491 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -80,7 +80,7 @@ timePattern / datePattern: %S second (00..60) %p locale's equivalent of either AM or PM; blank if not known %P like %p, but lower case -*/ +*/ var locales = { "en_GB": { // this is default @@ -457,12 +457,12 @@ var locales = { distance: { "0": "m", "1": "km" }, temperature: '°C', ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH.%MM.%SS ", 1: "%HH.%MM" }, // 17.00.00 // 17.00 - datePattern: { 0: "%A %B %d %Y", "1": "%d/%m/%Y" }, // sunnuntai 1. maaliskuuta 2020 // 1.3.2020 + timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 + datePattern: { 0: "%d %b %Y", "1": "%d/%m/%Y" }, // 1 marzo 2020 // 01/03/2020 abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic", month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre", abday: "dom,lun,mar,mer,gio,ven,sab", - day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì, sabato", + day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì,sabato", trans: { yes: "sì", Yes: "Sì", no: "no", No: "No", ok: "ok", on: "on", off: "off" } }, "it_IT": { @@ -475,12 +475,12 @@ var locales = { distance: { "0": "m", "1": "km" }, temperature: '°C', ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH.%MM.%SS ", 1: "%HH.%MM" }, // 17.00.00 // 17.00 - datePattern: { 0: "%A %B %d %Y", "1": "%d/%m/%Y" }, // sunnuntai 1. maaliskuuta 2020 // 1.3.2020 + timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 + datePattern: { 0: "%d %b %Y", "1": "%d/%m/%Y" }, // 1 marzo 2020 // 01/03/2020 abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic", month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre", abday: "dom,lun,mar,mer,gio,ven,sab", - day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì, sabato", + day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì,sabato", trans: { yes: "sì", Yes: "Sì", no: "no", No: "No", ok: "ok", on: "on", off: "off" } }, "wae_CH": { From c6f43446906e873a226a93e766cdcd8999d30a41 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 31 Dec 2021 22:14:24 +0000 Subject: [PATCH 388/476] Pebble: foxed icon to 48x48 --- apps.json | 2 +- apps/pebble/ChangeLog | 1 + apps/pebble/pebble.icon.js | 2 +- apps/pebble/pebble.png | Bin 1213 -> 1365 bytes 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 8a0d86b97..f78098b3a 100644 --- a/apps.json +++ b/apps.json @@ -4725,7 +4725,7 @@ "id": "pebble", "name": "Pebble Clock", "shortName": "Pebble", - "version": "0.06", + "version": "0.07", "description": "A pebble style clock to keep the rebellion going", "dependencies": {"widpedom":"app"}, "readme": "README.md", diff --git a/apps/pebble/ChangeLog b/apps/pebble/ChangeLog index d92be5e9c..0cba5a2b2 100644 --- a/apps/pebble/ChangeLog +++ b/apps/pebble/ChangeLog @@ -4,3 +4,4 @@ 0.04: Fix widget hiding code (fix #1046) 0.05: Fix typo in settings - Purple 0.06: Added dependancy on Pedometer Widget +0.07: Fixed icon and ong file to 48x48 diff --git a/apps/pebble/pebble.icon.js b/apps/pebble/pebble.icon.js index ecd7feb7f..1c1166156 100644 --- a/apps/pebble/pebble.icon.js +++ b/apps/pebble/pebble.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("oFAwgNKiIAIFqofegIf/DAUzAAMyAwUQD60T/4ACD7Q/cPxIf/YCofcDhYiSXYYfuUZgf/D/4f/D6USkUgD/4fuogAID6vtDw/UD6vu6geF73kb6vuEAtN9wfYMIneD7JADDwIfaIAJdBD7YgBHwQfbAAgfkf6Qf/D/4feogAID6oAND/4f/iAdJD/4f/D/4fUDxYABD74iODiAftTZgfnYYczAAMyD7UT/4ACH/S+bD8DAKD9Y=")) +require("heatshrink").decompress(atob("mEw4UA///ssp4XthFCBwUBqoABqAaGBZcFBZdX1W1qgLHrwLKqv/6oLJAAILHioLJn5qBAAYLEBQoLeHQQABv4LjGAgLYq2qAAOlBbBHFBdPAKcQLdWcb7jAAoLcn4LKgEVHQVUBQsAgoLLq//6oLIr2q2oXJBZQvCqALGgILTA=")) diff --git a/apps/pebble/pebble.png b/apps/pebble/pebble.png index 10f5adb56b224f3e4d037c4d195fbd9efc81b959..368e08750d5ede99497d54b310fe9b91e03d9c10 100644 GIT binary patch literal 1365 zcmV-b1*-aqP)Px)4@pEpRA@upn$J%oWf;f5@65Ech+x zv{2{Lr1SoGKJW9q@AEwGGXxf&j*gBFO6h${sg)5nRaJf3O2^bb#OfezZEaUYQ5<26 zhgpeNqlqU<|a5!MM+tXy)-`__( z9#8#$LlA_fU@-V^J`k4nfTAcL1GvSlA&<$o1wnW%7!2OaV+?Bo$g<3Zznss+0AlfY z{JrJnjL8}`p4TwIc*HA2YF(Z&`TV|N3A zz$du?84BR>cxDJ8uUk3qa}k8M36YTEp zVrM5|vZwa&)vv9sO$dJk(C_#AZ`$UZ?XIgKO%tB)k~ zeOsM?$OPbWxe^*+jQ#2LdS5(s4KNT?RZs-3hq1m%@Nml*fG*HbV6|8N+4QG#d;Sbsoppz&lSeLBj3C!9cC9YdJ} zgjOVc_*FUp_XC8G&!(rRuMH0mI|MRySs0P!{IVQ$id*?;AX)$vDvuA$b@u1 zkaUa|#*v-02h4zE(?HQ2+5ZCIsS1i;M#9*O7@ow(6eEcYp%ok6|03NF6iov>l&Ekr zd~>M?YqU0q$(nx@?Wa7n*j z*EFq$Qd)@X_31z$&}T~Wqeg}RnFecZZM`K3LTMB@G65)x@)3aBW^T8$tmZbQ^wp)M zrTe+8cxqcq8c-DFO#r+!bgan7E0wm?91_5}EAq9pv^*zC(r>9{)}f&xw70jXm02ey zCNMfWn!0$4s;a({&*~>qSE~akin0peS-pR@Lign4Bp$&|E$>&@`<(6bhZ)rv|btUl9c1rWOBiEEs&!V)H@V+` XI5?_a++oDw00000NkvXXu0mjfkw}hY literal 1213 zcmV;u1Va0XP)POM$%3@Whhhyn@nYhxDeg-e<-cZ zYFr2k?%buN)IY$D3u)c7&`lO@rMoJkr~#QIf+Nxtsa1-};Ey=&+{^zdH@zOnM{mX zvjtWIh=|(&%XQtCm^E8qH2}cN%z6O8ZE6bK^H45MbUEA#JEV9`wMn*=ov6V^% zySuwkO0~5~DF?#<%d&1sDYbW0Hk-xj>T1XM!^1;VDwVeD28LA&YzBCqmmwl;+y4GO zgb;{C^xd7DoZ$HQ*iU*PlgY#ig+iSt(^m8u_dq(G-UG14rPmA*y;>|5zciuESp-cK zzzd8G0~P~16+jM57D5&SEX%sZrKQ7UAq-RlmX?-oDy4Ra==sOnq?EQ&YLqXv|L}5|Ola!1|954-`%Wb(F@@^;gu`v9KmHh$=b zz?A|0PN3hg)_~-=MDC3mBG9he1EGlU<1aQo_~dDZ%=}?Bz_u0A^B$@-pn9+O6{;nG zYf}<`Kd>0H)5AUs5CP97fT*MJ>ls1HVDZr?Fg>Z@^Z2lhdcFPy5q)~`|M@n#Ym7~U z@i=f}MB(%|LZi#=!uS}FOsYUTu4=XV)%yDS`#mKI!$r`xf!P^_vHy8YA_Oo!r7#)r z!*gJK77zlsHtGN2E=(GYo6bbfrL6?V#{kEEG$bCJKfoG|15-%_#@%gTE_Ep!jRH5W zKPrx~n8GvTm)X0XOWzAv5#aiC_;mso1HT!XnVETOb91x#hsS?5Ha6yc10G}G4G==a z0W_D;`+?$l(-}Oj4Cr?P{buM5U@d|Tm+;LG`eQJ?aQA2PHJY`D-~SMJ@1qG$N#hLt z5V$g+-wE`afj8jn?CfJ9#B)u53qj%sekt5&H16ecxu1HCANV^UEJJTVs3G8Y_SYob z=a51f;5ZH($KlGQF9aO|PtK#9bBHKZPJs*{qGFiNOdzGa6DB^;5D-GVDW%+j=2&bW z4obR2luslQ`(eacDoQGqdX0!a=g{)uPN`Hf^6CuNH258Wo{y_`LBW(Tivi_w`7Z!> zIka>rrJig9&iR&6s|Cxlj2XbW7bpP8>Kf+e=CHQ52Fud_-hX;}itX)f?MqVtJlnQI zRr*e_8K9IZ_^r}bR#vdQyxcMV;NU>}(iDKQsrQ8d-aFu;5Vn2IdwY9OO8KrDkB*Ky zy)$y0J8xG=4+z` b5C9$mizYm;5j?(%00000NkvXXu0mjfggZkP From 0516b13669b272d9e48169e17b996e05ad4a85ec Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 31 Dec 2021 22:29:02 +0000 Subject: [PATCH 389/476] Rebble: fixed icon to 48x48 --- apps.json | 2 +- apps/rebble/ChangeLog | 1 + apps/rebble/README.md | 1 + apps/rebble/rebble.icon.js | 2 +- apps/rebble/rebble.png | Bin 4570 -> 4067 bytes 5 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index f78098b3a..e4f280a0b 100644 --- a/apps.json +++ b/apps.json @@ -4879,7 +4879,7 @@ "id": "rebble", "name": "Rebble Clock", "shortName": "Rebble", - "version": "0.03", + "version": "0.04", "description": "A Pebble style clock, with configurable background, three sidebars including steps, day, date, sunrise, sunset, long live the rebellion", "readme": "README.md", "icon": "rebble.png", diff --git a/apps/rebble/ChangeLog b/apps/rebble/ChangeLog index 16e65d4f9..b9c26b4e3 100644 --- a/apps/rebble/ChangeLog +++ b/apps/rebble/ChangeLog @@ -1,3 +1,4 @@ 0.01: First release 0.02: Fix typo to Purple 0.03: Added dependancy on Pedometer Widget +0.04: Fixed icon and png to 48x48 pixels diff --git a/apps/rebble/README.md b/apps/rebble/README.md index 712fa4e9b..0ecb51d7a 100644 --- a/apps/rebble/README.md +++ b/apps/rebble/README.md @@ -11,6 +11,7 @@ * Uses pedometer widget to get latest step count * Dependant apps are installed when Rebble installs * Uses the whole screen, widgets are made invisible but still run in the background +* The icon is James Dean - 'Rebel Without a Cause' ![](screenshot_rebble.png) ![](screenshot_rebble2.png) diff --git a/apps/rebble/rebble.icon.js b/apps/rebble/rebble.icon.js index 4c898974e..3fc45b820 100644 --- a/apps/rebble/rebble.icon.js +++ b/apps/rebble/rebble.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("oFA4X/AAIHBw3Aiv3HmE/HQQAF/gPEnWqAAOpy2VqoFB3gPIBoIABtQPJ1PVqv1q3qB5OlrNVEIQPK2tlBwOptQPIyvdH4VtrQPI3tbqtdB4OaB5FVH4NV0pgBB5F13//MIIPJ1O2TgWV/o/I1fbB4WpqoPI1NvB4REBJ5APD/wPBD5JOBB4WVqwPH0oPE0oPJ/NX//6AoNVF5HZq3pq2qSYIPI6tX+pNBB5Ol6v6B4IABH5P7//b1oPBN5GlLwPr9IPK1IPC/SvK1QPCOAIPL6te//5B5lW/5ABL5APB/wPB3IPJ1Y/C/yuBF5APC9X+yo/K34LB3QPBtQPJ//23SPB1QPI3eVs2qJwIPJ1flqyeBtQPJtZPBLwIPKzf/1ROCB5OWAQJOBB5QsBAAQGBf5FlB5tVvoPMNQO9B4daB5O+B4aPIqtX35tBB5M1qtbB4i/HB4WvOAjvGB4IpBIQIADB46aBB4t8B49VB54AFB6zrB1Wm1RTBywPI0oPCeQOaB4+ltOlq2V02VqwPOrQPIF5w/PFQIvPB71pH4uqX8g")) +require("heatshrink").decompress(atob("mEw4X/AoOG4EV+/I+dVAAVUCgcFBIYABpIJBgcFoIKEqkQgEH6EH0ILEqAhCgkBqEVBYdAhUBBoU9GAlAlw5CgERgILDIocEgEGoALDlEHwEAlkUg8EBYfAFwVA+BgEqmQjWrBgMQhgvDqmA9Wq1WsNoMALweDBQIAB4E8BYdTpwLD/kA4AXDjwKC1f/IAILDnQLC1//4ALEHQQLCKgILDFwYLB6EATgVABYe///MNgdA3kQEoILGqCNBlfQh//4NAPAVQ+YLBQYM/ocABYfAiEqgE0g6DBF4eAlFrYQZHDoOu1Xo8lgBYtCKIOo9aOBAAJrCBYWv9X/+gXEqSZC/f//4LHz/6DQIjEBYOhgG6BY1a1WggDCB3ojErYTBoEOa4QLF1X9jWrXwILGKYOvBYtfKYX+17iBHYdX1WQgf/34LBUwQLB1cLWIJqCBYdV9W+1+//oLBWQVVqnuD4M/KQoAB/+kBYJGBCwYLCI4P/DQILFnwLCEQ1Vp+q/46CBYtDXgJ1FAAVwfI4ABqAUCBY8A9gLIqEA9ALEKYYLB9YLERwQ=")) diff --git a/apps/rebble/rebble.png b/apps/rebble/rebble.png index 69653015cfec75e34382125a56c258c7e9074f5b..acfd37400804494014976eea6bf456b1bdc2fcf6 100644 GIT binary patch literal 4067 zcmV<94;=7`P)Px^ok>JNRA@u3nFn-KRsP36uS{k#nRL5)lHd!YW7+Y`6*<|FG^N z9$o9I6br1vq96z&77#=PK|zWj9YLyKKtQAS%xnV zFn_mil*azk`DESLij4<-cQQyIYqjt2H3N_oooUf7ekmxV|L}fHoUt&pN}IG~a`OwxZrX&kf1EVi zM-1rAGo8~&PLAWfWxIK0*`{hzy)d8$5ABdarVQ9c7lzQ>F9B$7^h2_V;qKmzIw zK#_C|O=eis8BU!ksy1<#*3H>|__)~?p(;2cZ4|r8&EL1RZq9)dXXw$f4NJH0;~)3* zWa_eY)y6;Y*B)@L1dAh*1?#ut4QM1fqFAA}!mEO!3p0{Jrd4kMx(u=oQ(9;&*?Aze z_@FKwcx>!2^gsoDhrJqVf4F}(pDbNlZx35EW)S(h3eHmg@$q-&_`hX!V&pGA$|4nP z6&L-XUK)@w2*?sIrn}j)??^~6=b10~eBL&?XWu~ETXI6}eKOkc{l4590SwOSM9+8& zIm@9C66w=0MDVCItFQq`1{kWr>y~q@ z%{xO{Yz+C%($M0PB#{~yO<{=(&A57CdunK3rY~AaK-bMVdS$d>%_U&pey|UZjvLOu zbKd9u@3)wJI;N*F&6|X7$Ot>Cw+TtIK_BNKa`(=|VUtN{F*F3=f!lB4=ANC&>e-cE zJs;(~=VG+Ebc=6o-jp}r9?iL87XzOdhhZ3u8{C_7s)eZwz72I9`sbS&^Js5w8}SCs zk`j2gK{NUt+{vZ}85kmdo8C}QC*GFiM;g+NnbQ|ybJ#if$C=QAG7>}kc4z*#>ua_7 zZr3&D=Ef;Z+qwt8rqSn?3_i)}&aT`7`o6u8Za1`~%ID58& z@0RXl*|+OC`1@)6Wp12){}tc{cIkjEK90{|-p#_~0Eoh%8mpO7}yQ~-lGzHnvp{S4pOV-hS z%1XSIv_lL%{>})_my~nITVIn9Vd11Jn9ZXjBKR(;F_5rbr;_2@{!i3jGk$>bVHWW@vb2#q4T$4UD;S&37*fO(y?<`w}3c zebHlm88YXhb8m|85FA?tA{;KHU~rc^7pKQdT3jsCdS=k2rHuwpK7vP<5teP!q-ugz zY2tDKVqKv@6Is!Pt_ydT20wZe!1IhdSys9uP<6_W_9sb=JD};(~d;C>Y2z? zbZ&PY!tW1m^Z93c;21L+zu$*ZWipk!EJPSu0VFteso=DM@|+kUm8t>U+jW`*mvYX-6TuPUe{d$_~xN7G=d}z~Nu=Xnj*d48Ml+L_Q9i1tUETiz=a2 zhJ4ecjG%^ut^%4&#p=!2PaeKPK(Q48#X_rhe`IdIn;ElaAIB;Sq{};RiO)b6`VYs6 zdwFy5mItXp#fdM-U$~O(XDj%4-F{Z@%jKQ>d-CF!8@ahfBjyaspwZ}uk^F+kOUQl= zTy8X{8(T^Y{>UiwS+h-0LQ$7%LA2fWMJ`M3ZB2_wYfxkvt&%TY3S#wjnMi&;JOIBo zmU&{|ZgaeQ&j&nk-()uA=X0Tw>tDV*xjW~Qo?vIiTl4VP?Cd&O%KJ-KlNcSvc~?1| zQ`1;B{6<`kWD+XQ1x>EpZt$EeTO}=0Dk&i7R%qG56RNb2Nx{u*A~x>Hx&Z<1H*avU8_7$;a=E z<&mfV6PmDXlZN!|a6OZk|7bEx6XdBS_zfR+*@C^%z$+GC@$?{8|8#=?Zr&C8Hg#BU z9&9F&{KjgNj;F`RGIRJH44JkZcO@UXbfQ%)GI11#X+p21xLEh=G2$X^oI3Og(anaK zb5+IX(&Gz=@_SHP|BZR~bYZ}I|HQAuqKTjJfr_6S>MHB3jhD%nF8 z-5RGep*$({xz0RbGEoU~J2=Q$zXi`9^YK-tf0OU127(ofCX2;_D>BL6JcnygL6Th$1w6d;i%=pqovrkw)AUf`C z8NpLO{e&SjAoyGrVXFin&KTvw0<4Ww!5d)8xP?5C=Ak^GqgZW3>OSP092CuqKhlbP zz65K$1CJ)-_XZuhbowk}tqL&{R@Vt&MeXe@>Kv}sG zLz0LdU$+J}rgnfz9%O>J8kG=<%o_>aw!cEf{@;jb+mr~wX(~-g4@m6TbCm3RU#xZK zp6uM7XR@1-nllXHBYsiOio;>Rs%iLU&!a40@Sm+kOxm=!P7TDzI9RT>FnQ2b0f<6I z9KoPL=7E3X`fLIA`v#$?x=Eyk@P66AD#NF5e943HE}q_Uj#(RmS-a}#(y9q-?rBEF zsL|NP(jo{1z>0=@_B_f3D^($SVt7$$YitGqC0IaRRRdK*v^($`d@z&9kq;B_OUMzy zNTiD*UY02Hc(7PiEFXSEaZD;redqZ5H-9i|&k_DREQ<$n`VrMM6_2D)p+l4^qs<7C zI`Oocv7LhAiw9+OsbO1udsB<`0+77=RZf;NfQqP|d|qrh zBdD-g(Zvb(j5#Rgkqg{1?I&_es}sW7G_XD;1Jx(huc#N5S)SeC_Mu6{Jw6=6VnI{~ z76Bl?keA>3ig&-+5LBronH5*M!_MNIY}#3abwpKCbl&w>Jlpq>c>c5r%oE#yq-W>X z>9|!N=e5hEMV@xif$QS~Vv>x<6OjiDfTSb>I+U;7!VS;NrdMV=W`6VxpU(N7X$w}F z>$Pc^!pg0?X&n>Cu2G#p4wjCd7Hx?((;FqRz@2VxMAex@y?j8d zvZK3$q0Mb1j2eMjT7s041mzX@Kl%i>NM`-+#*t{p^LqjA_3Ma;wBa6dKhlz~iSs%u z9X6QWeY(NAqh5x5xiKsNo8mf9m3%HeG7HNGs#X}}`IVz%ZpZQTQ=D41j?_E|lFZDKkK|E!m43s3)h=^LpT{=gy)yk*IZHX-ZA6)W%olwr} z_cg<-W5#}G08*bCLFu;LEL#3EIrFYG2S-E%N5^DgQ)JWT#giYM%Ju*Hq|Tk6&?%Fy z`8w7L9pQr_ONWjvD@WGbgvt^XTHc#Nnkve5C`fBXibA;tiFOO+ zQ)hX;)P^>b`{%9Wb$ zhA&;LP7^X&s8upcH?i}sD1}HL{N5>wtgcOH_R^KfCoU>FbZb-UE(*3@Z7TzmYo z6iQgNO;jrY#U#4mu_$H~nBLsW{Jp{J(yfpGnT%vRQR79#x%zG7wV>D%mw_%{ywI*| zj#^DfgsxR7KHfZdsM`30V|vm0pO5m(q)+MaUft2;T7(y4ga*WYv=$;Dwa;V%FzgzM9M`{DbDnWVV<=EzmCz*#dku-K zRufv0?&s|T2WwoU^o3sLDMR^%GA?{PpBpDtzl``_B3jz66Uli#G(!%t&&!?o{{g>k Voil!`qIv)T002ovPDHLkV1j)J*pL7K literal 4570 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 Date: Fri, 31 Dec 2021 22:52:28 +0000 Subject: [PATCH 390/476] GPStouch: enhanced icon image, it was a but wishy washy --- apps.json | 2 +- apps/gpstouch/Changelog | 1 + apps/gpstouch/gpstouch.icon.js | 2 +- apps/gpstouch/gpstouch.png | Bin 1571 -> 1443 bytes 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index e4f280a0b..b4364166e 100644 --- a/apps.json +++ b/apps.json @@ -4382,7 +4382,7 @@ { "id": "gpstouch", "name": "GPS Touch", - "version": "0.01", + "version": "0.02", "description": "A touch based GPS watch, shows OS map reference", "icon": "gpstouch.png", "screenshots": [{"url":"screenshot4.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"},{"url":"screenshot1.png"}], diff --git a/apps/gpstouch/Changelog b/apps/gpstouch/Changelog index 7f837e50e..e4a0bdfe8 100644 --- a/apps/gpstouch/Changelog +++ b/apps/gpstouch/Changelog @@ -1 +1,2 @@ 0.01: First version +0.02: Enchanced contrast of icon image diff --git a/apps/gpstouch/gpstouch.icon.js b/apps/gpstouch/gpstouch.icon.js index c4cf85676..3e05da0ff 100644 --- a/apps/gpstouch/gpstouch.icon.js +++ b/apps/gpstouch/gpstouch.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEw4UA///j+EAYO/uYDB//wCYcPBA4AFh/ABZMDBbkX6gLIgtX6tQBY9VBYNVBY0BBYdABYsFqoACEgQLDitVtWpqtUBYtVq2q1WVGAQLErQLB0oLFHQNqBYIkBHgMDIwYKBAAJIDIweqz/2BYJtDBYI6Bv/9HgILHYwILGh4gBBYWfbooLF6AjPBYW//wLGL4Wv/RfGNZaDIBYibEBYizIBYjLDBYzXBd4TXCBZ60BBYRqEBZpUBBYRSFJAQLCA4b7BHgQLFgYLGIwYLEgoLBHQYLEgILBHQYLEgALBAoYLFi/UBZMHBZUD6ALKApQAFBbHwBZMP/4ABBwgIDA=")) +require("heatshrink").decompress(atob("mEw4UA///iADCn+EqoAWqAuJgoLcn/8BZENGwNwBY/VBYNXBY0DJ4fABYoiCEggLDmtX1Wq6tcBYvVrQLB0owCBYdVtQLB1NVBYg6BBQIABHgQLCgIuCGAVABYcNqwtBGIOVJAILFyoCCBY5eBBdo7IgIIB1t6BYJfENZaDB9QKB1aDFBYKbEBYizBrwLB2qnFdwSmCX401cYdUBZTjGfYgHCBZB2BBYhUBAARSBBYhICAAIGCBYkVBQJSCBYpICIwQLFHgQ6CBYo8CHQQLFHgQFDBYsVQIQLHgo6DBY0BHQYLGgY6DBYwAFBbCjDACY")) diff --git a/apps/gpstouch/gpstouch.png b/apps/gpstouch/gpstouch.png index c411356ae69347a83882fe195782df211aa629e9..a40419a3f15ca9a07e80397db537ca307fba02a1 100644 GIT binary patch delta 1425 zcmV;C1#bGI45JH>B!3BTNLh0L01m_e01m_fl`9S#000G5Nkl93g^E$p2PSi7 zxZt%9rL|&hEGG71Olz$eL1GIPvv^sXozsUg>dwq&XJ$8*^nZgu=0E@C`M(OF%@B{P98T4;p&=mZhtW(#d98x}3iK?pH7q# ziN@0iCNxwpdnsoQr&`(IWfG6K8YWE0e7<`xg@2ZlXRL0IaOlJt+`FI3uuYuku2wd< z7SPkvJJV__D$0ER<9at*_N24sXxZJ1D_!0F<^X_XvbW4FFV_MB0lJsVCm6_`t|$<2 zQ|qofRvrWlA0GJ4YP)|w^LfhTQdF-Wnl(qw`k|OIxwPLL05EJ=;Idm@Ugp5BR>QSx znSakk!64SYxiD*jwW}8)7|eVFSFbv{4v2s@tKs5ByVI-lXXDiOE3jtc$Vaw!J{*Z} zTi?JdFWA@2jt+YcB6mwD;9(inG@P>9E?ok;yMb}zGVL!u{~Q*~E5o);w*Ua+o*A97 z{`cYLO`x;WUdu3W)-^A;j-e1;V3rv#JbxV4kw^fkl--|*P&#%DO2>|IB>&(6kVu$0 zo&>Y}(=gClZ~+f-$ZDvs*U{YUEFv3HDd6BiVBI?VjugOQce_y&UIpxCmbT=zwL13g z1Fm1souI1=*t-{~t8*j|rO@bwkf%ev5OgILQzrl{v5wW(n}nL0B&JUXCQUN8&VPV; z2I%TC=S*#_GjRZ5mOltV=e=<9b1Na4Wu*|h;|AL4pyB~>uK}LV#E}S{2XM@5TrM!n z^WiX#c#ZRQs86Ty0kiZlZF55@Z1i(S*i9*#a zXp1Qvro&3%y=>$0xD-Orr-iIp@E%ztLVMzIDXey8`B6Abp7%N~5LE-w>}FP*`*O$Q z>Jz0@f!nxd?z~z|xv*)|KPQP0*txUFSM#EOn7j+xrLB!32COGiWi{{a60|De66lK=n(*hxe|RA_7!JOvVz*38;=4<&H5LVRE7i!wE@)hpWulvKu;xEMTMGS7!-*xS1GdF+PWqH zWMt@9fSV%xV1F1K_Il;lRORe<0ZJ+H`*{N>Hw-36Y&~rc-Ex6krC2C}-|tuTfY zVCqyDJ^B&7QgHJoT)YT%bjfX}Bi;4>gAwr#=$ShEJ^ z&+ifc2qKV^0}B>FX(_l8KlPc0!QSp1reV!lVdR3nB_eoZ?JgHAUL5(C%|Zm0EP?Uk6E^$IaA>H@AVJe<0|Aw< z6v5s$U5Anq7&FDfA%F)r$N#l)Xawm>^ zXn%7$Ar$JQz5S7&rb(_@U8W0gIOKs+40J3k*K$|rpbM?x=a@^WQd~y znBCjf-X6IVJ#dZ7CL?_?ZT}?BpP4=w*SPE`TYEdCrRk)lMVYUd)n%m*T#hwdzaD+< z)OA+9xiBfgsuhdS_2@fr?OHL`;oEdC*?{%IT{%Cw1@$^tOu3pZ| z&rgr@zj!g8L&V$=3KkwAP2;3tMBD1?p}84Gjf%FvIC~m%XXVn|atDA>BZftd|2?>M z3oa#?0~iKpOzSf1SXLuwwDL8ZpLZNtn5g~izaI!}ZPbj{lBND6P*JFPg27hPG z>aw~XsE#$NAj*U#60ovLk!t3iJ#Xbf>k4G$RS=!l^ z*b2NtlHwa1BR_!F*2r5qGt+dMfPYmnme<5yubcypSdBA*b8a_>tp?dz)Q7`-09fd@ zeM2eM+u0+sRe;YYe<;Prc4CuYpVuq#b8Qo_y)TrNg%?t?&EBGEyl*$yb^+_wNl4Rp z7wE9d(T&w*Wpc}IuvSo787wNV7k4FyJ2`nnvzNDbEGJmLvBHutJ z*;O!U65B=i)@qzmTuMu0z1_S9GD#Hq{XQQkE|zdt7t4W03t@M3ou!*LNn3yOr{sXc z=aauQjb*?+6YgQd;O#A2q#+f#Q+7gARwloR@D32}!*%V}t#T|?c~g4C?hRGq%ec01E&B07*qoM6N<$ Ef*6AFy8r+H From 9f1e978822d5f4321ba9414114de89993f987b99 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 31 Dec 2021 23:02:01 +0000 Subject: [PATCH 391/476] MyLocation: enhanced icon image, it was a but wishy washy --- apps.json | 2 +- apps/mylocation/ChangeLog | 1 + apps/mylocation/mylocation.icon.js | 2 +- apps/mylocation/mylocation.png | Bin 1909 -> 1664 bytes 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index b4364166e..427b86fbb 100644 --- a/apps.json +++ b/apps.json @@ -4708,7 +4708,7 @@ "icon": "mylocation.png", "type": "app", "screenshots": [{"url":"screenshot_1.png"}], - "version":"0.01", + "version":"0.02", "description": "Sets and stores the lat and long of your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", "readme": "README.md", "tags": "tool,utility", diff --git a/apps/mylocation/ChangeLog b/apps/mylocation/ChangeLog index 7b83706bf..653f859ae 100644 --- a/apps/mylocation/ChangeLog +++ b/apps/mylocation/ChangeLog @@ -1 +1,2 @@ 0.01: First release +0.02: Enhanced icon, make it bolder diff --git a/apps/mylocation/mylocation.icon.js b/apps/mylocation/mylocation.icon.js index bfb38d5ac..b79f5875f 100644 --- a/apps/mylocation/mylocation.icon.js +++ b/apps/mylocation/mylocation.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEw4UA///t/7j/P3/vB4cBqtVoAbHBQIABBQ0FBYdQBYsVBYdUERIkGHIQADHoguEGAwuEGAwKFBZg8DHQw8EBYNf/1Vq3/8oLDIwNf/Wpv//0oLG9Wq3/qBYJUCBYuqBaBqBBYW+BepHEBbybCBYP+BYSnErYLDyoLFAANq/r8Ga5T7MBZZUBAAhSCfhA6DBZhIGBQg8FHQg8GHQgwGFwowFBQwwDFwwLMlS7Bqta1AKEn2q1K1C1WgBYf/1WqBYIDB1QKCgYLC0taBYoXB/QICBY0//7vBAAQ8EEgIABCwwME9QVEA")) +require("heatshrink").decompress(atob("mEw4UA///gH4AYPO/QPDgNVqtADY/1BYNfBQ0PBQIAB+ALFmoLDrgLF6oLDq4KEgYKDBYPABYcNBYlVuAuIGAwuEAANUBYYKFHgg6Bq4ZCr4DBHgQLBvWq2te1WlBYZGBBYOr1Wq1qSDBYNqBIILDKgQLLgoLHqBqDBfJHLBZBrOgKPCBYiPCU4NaBYe1WYrABBQLCCfgYGCrwVBa4kAirvKNgIAErgLDKgIAEKQQ8EAAY6DBZhIDIww8GHQg8GHQgwGFwowEFwx5EOog8GHQ0AlWpBYNq1AKFWIILBAYOgBYbICytWAgQKCgTgDcwYXGAAgvGAAY8EEgYWGBgoVEA==")) diff --git a/apps/mylocation/mylocation.png b/apps/mylocation/mylocation.png index 7148990a42a1c8858d933d2a4cb35b80123a5505..038ee177e660e3bf643c74bbaa5f549b382fd5f8 100644 GIT binary patch delta 1647 zcmV-#29Wvn4uB1iB!3BTNLh0L01m_e01m_fl`9S#000IuNkl@VZEXpa*ivG=AYh3x2EhdI$|X`njXdCkmyi%brALOq-o4Du%-;ukg_-Hj?soenCx4qgm;d>F=bV`{=KxU> zIlo*-0ELuxR;`Lwzbqo?qRLbx3I`Bpdl!!UcuS2d_jwTr)B|3TIi3CCGK6J-oK6mG z#y3ca--H5@54UpwKuw*BA^$9Od*7gnWE(o^wK;w6Z6`!27i>UU1 z{>bE)kn3(Ab^D0AeMFsJjqbU9)N<-FbshYPf(2y{wF#8%BhR@eaw>uPQlOt$97>yu5M8vGXu7?`#+-sO2sI@ScUD(nLvHc=0KT?p&u4w&*^3B8z43-{GN;z(YG>Ds$RCf0gl-s=_{7fH=t?07;}Uz zgC&HH7;{W6#<}&f^$i5Ib5jZvme>`&Tzvy`Q_oB(i&cq|4;?pJ^on#1u+5u;*jaTm z(tmz=j)OfeqKl7V(FJz&sH#_D{59I$S7lUWb9YVLkPH}86L~zHZr3jy4o)3S|Z0PMw9^*^5BW0ODQuz{>%>j=^-y@c}<(xb7nPRtwUuU&T|$ zegL=k3w;hz^1-kDV#sMG5~V{{4j}&0T7T+1R8KelxJG}s2dL?`OdcrauqDl!J!jYC@E1rrbbYakUkuknctT0Ip^Sa*Iz`YGXxt((g!%E1t6W z06<%cQc0Blor0xvgSHgu9$KPrBEMuFiBeA#;rnT8>B5-6kDACUT1}!PM*&_Yv1nyX z;YUs6N*hU(!oPMGC5`eNA5IJWsDBAj+7W?)&!!drs+*E7-I1RkEI-g_6@I9^?%3tq zfkjRCC@~TSOQ(&dcK?&aaXC!GQes#F;Qnq&gsihCk^b@ekm9%x|BCk4R*(PIZXw_= z2K>qM>hTvIPiTvpfhMB3S$*2qc7c7+?bQ;80tUA`M94aG66v3qo9H@JkAGXMa`X=h zW4Z)JwJ&Da8W>}y*GZ;PTtw+KNZ0KGO9cSWpo(6%XF|@5*i}uC~2s$c9vt>sm+8QsS zZROg~;Q@eAP7*JhPN`|Mn}2=5)hTiO37(DhsuIvMq+&3jK_!#MM6mVu0}PNKNwx+) z7NmpcwWVgy#H3MMduWASpd;}D%Y1+jz97LXYw#-sStXE}A!||?@T0~lj>Q>?x6LYs zJS;8l;Bq03-)*-)Zt&hObD1x)u;vlTxeoIqr#MiC7FpK z9V5fKv}q-ZN4NSm&#`5Uv4xC776+v8982UFY>a_p02l)sk~O&c)qVgfz=i{s$=F#a@%Xstf=C002ovPDHLkV1l2V6!8E6 delta 1894 zcmV-s2buVQ4fPI?B!32COGiWi{{a60|De66lK=n*DoI2^RA_AsG@S#b$cuP-3VG$dGK&`PKY(kne zs5N3l1xZZX*iyvOh*i1M%Pza@_3XLLnR%an*kyOm?wr{(=YK4T{U;}9=6x>j|3B}% zGtc{uFh$VRFTVr&05N+hmOTqw5{SsKRq^~hp6S9jhcVu7mJ0i>}op)z!;xQ{&^&`R#GVw zH9WEaeQfJ>B!3g{l8DW&jG%%sfDUzMTOa}57Thk3yHXzC@XsiGA_>sPw%$c!{Y%&( zSKW0XlOOtbi^Jr{bs4iE9)o1v(9g1lOup}vDcmDZtoy^13(!>CeN1cEGdeNH8WqwR z7|cM?t2E^>1A)2(v@}612F57u9m{3=Q->=GuZaBPPk*nZq3#g2ZA~y{bI{ulo*#|) z1ST>x8Zie3GUpMqOm=L(FlpFi4!WVOnd!-PVotKeU=+H0hXh<6yhl2ItGt-XhdE8W zqT|uvygq@v@569!-`IrL&=BU8#Mqm{9LkP>rnX(rwB#|yR0DMN zKrRoK#fA0jh|g#Oz*nU>SRntwM>L&1Mf0goadO#`eC`!jFnH59D1Pw^Sks%ZV>U9J zw*OB@S-9`za#UQ5&Xe6+x`T{PS!tI1qU42>$$t%z2MP=3kB|pQ=anAUMi(und(mRV z7+O9)PRobKFmvbPee)(_Gnx?~K1@36D!HN|S5(~V7IWpn{S!nFBaT@20KbkVz;V7k za%>d(M#~j{+-=jB^-&!?SIeSj(PB=tUQ5!kSUh92Ov)9N&a{tbv?PbILn;!{`^pIj zoPPtFN;MI4MsLpaVCbaPvX)X5eWiWCn?Sw-EYnmf@L~r~Vo9zkxqZ@sLmL@=Ia4xH z5s;v}@TDL_nWvE4IC7YG!H-xTl!5D2#~uKYuLd;-3s4!YG_zB4^#LN+%44D064V?l zz>@gLv0JRA+slq%0mh8h2>+J?ly+d~$$wMjtebL()fv1pVZ6WL_XDVL{Nn$U!JAveQlhfaa_0~HSmVYck z9hX94mEa8syO5`@w;MZOz{%&Bb?kjCuk6b*N8Y?zmS$N2fUbSy1>nIj zpRp)RZz0{fke)9uV&L;vBO)xE83Tc0cR$XX2WdQeigXk8A+i zs_A_SuwHg<-WKLC`J%q##516Wri@bM_#-pp+b46XY+vZ7kIu)_zXP*srd1hwu>7xw zE#@y_@(}=J`&0ix`2m%$U21`%`amV*p+W%wvTO5x;F+pvRoszmlU-Y0tAEtJVgUej zoOl?OHzJd&6v6>!#2$?n5)t~7jV(CVUx90)#!iAy@yv30uB|spP_z*MVt<`HyXCjFaHvVZ@lI{{+lJJE%-nhVqQ++De(u$y>wkXW z$bYrI77me~LPyT$uU5-iBZd_!EC*TvP^I;q{meO9(N`flm)ywtTkjZKYoAv5i@?O2{@t}o851ACmgxICu{06g)+CiDy;|iGv|YF5f`t&fq%2NuL)i#jN&k& z+m_Cczak=`b1XDVhw2<1)Q=O6v;cGu`t;>P@~Lvw+pjbG*!zLzuCFcS+^Rb#BR?je z>>Ko*d%v|%%6?`FoddZ(^YkV108L4YfX{rR5aHZyt2w{wPKphUBh79@Bj;AF=G<+o zD<=;ix~9Q)?+SGZGk>1!FW%7{v){1Cd|LGtdNV$Q1rxsOqDp*V00i8|rf9@RleF8m zSrIlTCe3=LS63z+-Bahtf^q!F6_u=O$a{+G>s0Q6c>=#TmiO?o`St$_bFBEXobD{% z;>7Hq#T{;TET&slX{Z98uXqMLqxi%Bc~>b^wn3H#4hy{IiC_21@&)z(t|X|cO`9{S zb@ce(wJo_>M7|;xtrj%fmegB9Tm(x15hUXpItKg!zz4~Ic7a|%rBjd-ia9C5@zV?9 gAKfbw`P1kB0CUi}Aa6C17XSbN07*qoM6N<$f-G^U(f|Me From d356d6e482e8a5c12ebc2bb1de8556d1fdb6debf Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 16:08:55 -1000 Subject: [PATCH 392/476] Create app.js --- apps/slash/app.js | 104 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 apps/slash/app.js diff --git a/apps/slash/app.js b/apps/slash/app.js new file mode 100644 index 000000000..22bce1191 --- /dev/null +++ b/apps/slash/app.js @@ -0,0 +1,104 @@ +// Get 12 hour status, from barclock +const is12Hour = (require("Storage").readJSON("setting.json", 1) || {})["12hour"]; + +// Used from waveclk to schedule updates 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)); +} + +// From forum conversation 348275 +function fillLine(x1, y1, x2, y2, lineWidth) { + var dx, dy, d; + if (!lineWidth) { + g.drawLine(x1, y1, x2, y2); + } else { + lineWidth = (lineWidth - 1) / 2; + dx = x2 - x1; + dy = y2 - y1; + d = Math.sqrt(dx * dx + dy * dy); + dx = Math.round(dx * lineWidth / d, 0); + dy = Math.round(dy * lineWidth / d, 0); + g.fillPoly([x1 + dx, y1 - dy, x1 - dx, y1 + dy, x2 - dx, y2 + dy, x2 + dx, y2 - dy], true); + } +} + +// Mainly to convert day number to day of the week +function convertDate(date) { + var dayNum = date.getDay(); + var month = date.getMonth(); + var dayOfMonth = date.getDate(); + var dayChar; + + month += 1; + + switch (dayNum) { + case 0 : dayChar = "Sun"; break; + case 1 : dayChar = "Mon"; break; + case 2 : dayChar = "Tue"; break; + case 3 : dayChar = "Wed"; break; + case 4 : dayChar = "Thur"; break; + case 5 : dayChar = "Fri"; break; + case 6 : dayChar = "Sat"; break; + } + + return dayChar + " " + month + "/" + dayOfMonth; +} + +function draw() { + var d = new Date(); + var h = d.getHours(), m = d.getMinutes(); + var hour = (" "+h).substr(-2); + var minutes = ("0"+m).substr(-2); + g.reset(); + + // Convert to 12hr time mode + if (is12Hour && hour > 12) { + hour = hour - 12; + hour = "0" + hour; + } else if (hour == 0) { + hour = 12; + } + + // Draw the time, vector font + g.setFont("Vector", 50); + g.setFontAlign(1,1); // Align right bottom + g.drawString(hour, 85, 80, true); + g.drawString(minutes, 155, 140, true); + + // Draw slash, width 6 + fillLine(57, 120, 112, 40, 6); + + // Convert date then draw + g.setFont("Vector", 20); + g.setFontAlign(0,1); // Align center bottom + var convertedDate = convertDate(d); + g.drawString(convertedDate, g.getWidth()/2, 170, true); + + Bangle.drawWidgets(); + queueDraw(); +} + +// Clear screen and draw +g.clear(); +draw(); + +// From waveclk +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // Draw immediately, queue redraw + } else { // Stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); + +Bangle.setUI("clock"); +Bangle.loadWidgets(); +Bangle.drawWidgets(); From 5113348ecbfa408f6fbc2563a0439ed2678b9704 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 16:26:58 -1000 Subject: [PATCH 393/476] Create app-icon.js --- apps/slash/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/slash/app-icon.js diff --git a/apps/slash/app-icon.js b/apps/slash/app-icon.js new file mode 100644 index 000000000..a0737974a --- /dev/null +++ b/apps/slash/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwgEBgUiACUgC4IWTAAIuVGAQWVAH4A/AH4AmmQWVl//C6s//4wPkfzAof/F4U/DRgpFC4Uj/4hEFw4RBC4QTDBIouJEoYrEBQouLRwXyBZAuKAwQXCGBQiHPgowJEI6mDGBYXXHIy6GPBQhFRwJ9GVBAiFUwjYNEYiOFa5YkFC4guMFYqOEPgwwIBoSmFn4uLJYopMABKOEACUjCyoA/AH4A/AE0CCysggAXVgEAGCguB")) From d7b9e261b774cbfbe10fe1f1dc5657bb5b4ac819 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 16:35:03 -1000 Subject: [PATCH 394/476] Add slash.png --- apps/slash/slash.png | Bin 0 -> 1068 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/slash/slash.png diff --git a/apps/slash/slash.png b/apps/slash/slash.png new file mode 100644 index 0000000000000000000000000000000000000000..cbfc8693d9d4ca64c0a43114962d199b88e7f526 GIT binary patch literal 1068 zcmV+{1k?M8P) zvIWHhz&4pGBUAzDw_1sDNIzY_VYezx6xEkDdJw493M!>$z-np+tfpq59GV+l=zDh` znj7CXy|-w3#{!xgT{!XiVF&_+^nr{sS0)f&S~ji!E58Eoz0(O{{c$4-0y=zNQ~T?_ z0#1h=pB~(gPG1Xti_YWnnB#{k2p>b{riVKu@3@4!aFK9qs7d8{m#_a&1S$o7?hrCMzNGIFYY=y8`Ix*ywe1XaG)! z{nZ%AiT8WTfA{O&=~LB_*a9-y?8XMB9`E7+R^i_xpm3usVRau=d}HYD*{? mK!OnjnIL~Me){-*0C)kZL%4jR3{M;Y0000 Date: Fri, 31 Dec 2021 16:36:21 -1000 Subject: [PATCH 395/476] Create ChangeLog --- apps/slash/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/slash/ChangeLog diff --git a/apps/slash/ChangeLog b/apps/slash/ChangeLog new file mode 100644 index 000000000..f3fae1785 --- /dev/null +++ b/apps/slash/ChangeLog @@ -0,0 +1 @@ +0.01: First version for upload From e81125d1cc5f40f8e0f0921c38fc29af77eaaba1 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 16:52:18 -1000 Subject: [PATCH 396/476] Update apps.json --- apps.json | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..8a1ff94ab 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,19 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "slash", + "name": "Slash Watch", + "shortName":"Slash", + "icon": "app.png", + "version":"0.01", + "description": "Slash Watch based on Pebble watch face by Nikki.", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "storage": [ + {"name":"slash.app.js","url":"app.js"}, + {"name":"slash.img","url":"app-icon.js","evaluate":true} + ] } ] From 4f9b3de702a9fb4a67c73f626156ab30c6d5f3ad Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 17:05:19 -1000 Subject: [PATCH 397/476] Change icon to slash.png --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 8a1ff94ab..11827a5f0 100644 --- a/apps.json +++ b/apps.json @@ -5067,7 +5067,7 @@ "id": "slash", "name": "Slash Watch", "shortName":"Slash", - "icon": "app.png", + "icon": "slash.png", "version":"0.01", "description": "Slash Watch based on Pebble watch face by Nikki.", "tags": "clock", From e77ea1f200295e506e8a10e9a8b690e5cd299150 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 17:16:43 -1000 Subject: [PATCH 398/476] Create README.md --- apps/slash/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 apps/slash/README.md diff --git a/apps/slash/README.md b/apps/slash/README.md new file mode 100644 index 000000000..5fcd72bb8 --- /dev/null +++ b/apps/slash/README.md @@ -0,0 +1,11 @@ +# Slash Watch + +![](slash.png) + +Slash Watch, a recreation of the Slash watch face for Pebble watches by Nikki. +Simple watchface with a slash through the hours and minutes. Date shown at the bottom. + +This watch face was made using Espruino documentation, Espruino forum threads, the 93 Dub watch face, the barclock watch face, and the waveclk app. + +Contributors: +* Ray Holder (93 Dub watchface helped create this one) From 7272389b5b373086a76bf7861af3bfa1d8e223b2 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 17:23:05 -1000 Subject: [PATCH 399/476] Add files via upload --- apps/slash/screenshot.png | Bin 0 -> 2343 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/slash/screenshot.png diff --git a/apps/slash/screenshot.png b/apps/slash/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..41008d76c0619806bb2386524bcd25d46e2192f5 GIT binary patch literal 2343 zcmc&$c{r4f79Vf#Fr!a*#?V9*ra_YLN?DU_7{*pwjHNMGi!Tyl%)FtzZqX=YE&C@T zvhT7@g=85fMPD&Z_9at|y)4(g_wW1nJc(l?AQtFEHb<0l6=o0!)E66)*%=mXKJ!!Xm^BJ9w6(?iYs@ZbjAuRi zHk?x$roh~xLCHI;#(zDuO}Ex1;2dxt>Uecv(uO?(#{T1|7`SibL^PSMuxHyQ*Ts!u z_efabOa;98To%{?^FRzM=$HCFIDr2DO1*|({lUrrdNzggMuBm)`KNx=p+kv%S&r46 zX~R5&y-VvQl!JIGp-=7$s<3*EaJ@PCp#AUpcJvZ`d53)s#cRd}M{BB7Q%u>Mb5Ndb zb=Sljzh33{J#z-2mE<}p2irpsM!Mik3W%f{j5VH`FilBHE&!cq=(ix8J*1!Gz+UQ_ ztCK8-za>+pS5rUj4MDQr@k@fGUOmlF9LtkbAa=Sa^ex^T!JYMBTv%b;s%$F+$hw0X zKX^aGauWfR~ z;K0j2X>m`30ozfl%~EqF9Phlj_K_l>Kx%gMEW_WV>s|RmKqu@H)EctNSTF)g>gD!p z1sR(wl{xS~AqTtC8F37mJdt1)-_~U?$Zia_l^^n=av~()F{Q{XbA}(@n@06l(ZAMECH- z;1N)Gb63wIqfW@YFsl}jS@3NHw+9-Uus1Qc2FUIaQ-9MXh)PcsOip74?zpM>w-N1R z9?k6Kt(jDgB;1<3r}a6D6N zvHcuK6BNnrf$&N@-A*I9heFO>1i5o~V5(wc;n9?U8C#QR)KFcAisP_-NqkbhNe)&& zUOT&%_|j6~UT^o=y~Qm^)gSO0w-3MZI#BSudpen&YjNJ>5$8p5YRd~#XqUT$3^Yd# z6nCKa@|49iaP{IE19g!LCw6)X5W>#A2%a1OX9{R_0YRwn>EB?EgMX`^%If(j%Lt!O zSQfmW9ED_=xnVz`rJ+ngM4fUuP8~3Mf%LPWOPm~MnA(1f;8>M+`hY1-3UEv~bn)_k zG^y~^7ICVjEtZOwhm!w{eyCh7&06ApnZ1Xt+EQQS4tE8wYgy2d6B&v<5SJ43fRb*aGE`Ju_6z$#-9KnY&FCL#!ouFP&xsbN8<|po$Aj*y zmhClBb(;{4*G)d~riCfOj;PDszwG9)*5372<;hKHt4=ZTWrT7k!E}d>^!W)lh@v!+ zJRUu%G?7Rn3wD?@9X(&)_}7tbr{a6G=o&GbJ(uDvaJ35^wiZd~{%WO$axYQAwvYLy$NrnjALX<*S zI#g6;{b#V~@|%#Q8Cpm6%Ccysej(Y$ zv*tNxW2B($+^{735eFW%ynO=?J-aLgkg0f?9nicI_5)XwK_03qTmEqJ7zEuY=uqbpJ9?|n6{BqX23yozZc((JH-GOl+^cVDs@WnLm3gkexX>^Rx<7e! zTFrM(^LOA@0-NiT37os@gIAVn%%=0Vqus zPctt7HQZqIPF32Jj>YaY+`bUpksRH41aR*zwLcXBFonBn*dT^VYK!24nEF8GQ~Lwq z92J$_L8{@L%ti}e6)|u(w&G76F;FQ-|#EV!Ugvz?AbS>Wx%K4G`eI8ud!ua%|5VU-I|v6 zmQC?C;lrZRcU>S&#-Gv1 zptugY4N``3VlK(9%;qO~e{3yH9sM|0KFOth-bCeOCZvc{2PsnhZKBS`BVkzTtm}(8 zdF@zksQj0biZU%{oUM+S@!Kn99*G`-ib!9*0y>Z$ztL>w-DH)OE1g&G`lV*AWNmlF z9bYn?(Dh93VOdUXHaNI+$jjs4!^zxn<6XUuM+qU;U5 zd*z){`~A@75>7nc;9$x!c{9(at5_D+nUOZiL;wW@RWnsFkeg@wH3&du#6AL3L5zN) zR>i>f2pD=wUz9c#*gbD^Pz&eG+_iaNgZOVDXG`yws%zY Date: Fri, 31 Dec 2021 17:24:16 -1000 Subject: [PATCH 400/476] Update README.md --- apps/slash/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/slash/README.md b/apps/slash/README.md index 5fcd72bb8..9bef104cc 100644 --- a/apps/slash/README.md +++ b/apps/slash/README.md @@ -1,9 +1,9 @@ # Slash Watch -![](slash.png) +![](screenshot.png) Slash Watch, a recreation of the Slash watch face for Pebble watches by Nikki. -Simple watchface with a slash through the hours and minutes. Date shown at the bottom. +Simple watchface with a slash through the hours and minutes. Date shown at the bottom. Theme will change (light/dark) based on watch theme. This watch face was made using Espruino documentation, Espruino forum threads, the 93 Dub watch face, the barclock watch face, and the waveclk app. From 364512266bc7421a1b64285212841efd42945012 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 17:29:48 -1000 Subject: [PATCH 401/476] Update apps.json --- apps.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 11827a5f0..29a9a208e 100644 --- a/apps.json +++ b/apps.json @@ -5068,10 +5068,14 @@ "name": "Slash Watch", "shortName":"Slash", "icon": "slash.png", + "screenshots": [{"url":"screenshot.png"}], "version":"0.01", "description": "Slash Watch based on Pebble watch face by Nikki.", "tags": "clock", - "supports" : ["BANGLEJS2"], + "type": "clock", + "supports":["BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, "storage": [ {"name":"slash.app.js","url":"app.js"}, {"name":"slash.img","url":"app-icon.js","evaluate":true} From 03f5daba90a107dc90b3b2bc228daf5bc472ce07 Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 18:07:48 -1000 Subject: [PATCH 402/476] Fix extra 0 added for hour conversion --- apps/slash/app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/slash/app.js b/apps/slash/app.js index 22bce1191..53ff2640a 100644 --- a/apps/slash/app.js +++ b/apps/slash/app.js @@ -61,7 +61,9 @@ function draw() { // Convert to 12hr time mode if (is12Hour && hour > 12) { hour = hour - 12; - hour = "0" + hour; + if (hour < 10) { + hour = "0" + hour; + } } else if (hour == 0) { hour = 12; } From f996d91ad3a0efefde19d3692a7a7fc8fc76c0bf Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 08:12:57 +0100 Subject: [PATCH 403/476] Update app.js --- apps/minimal_clock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/minimal_clock/app.js b/apps/minimal_clock/app.js index 057b286d4..3f6447fd5 100644 --- a/apps/minimal_clock/app.js +++ b/apps/minimal_clock/app.js @@ -173,7 +173,7 @@ 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, From 7b43fe720fd106e0989b2d834852fe3534165f75 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 08:13:00 +0100 Subject: [PATCH 404/476] Update app.js --- apps/simple_clock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/simple_clock/app.js b/apps/simple_clock/app.js index 6cb0f08ce..3c1843cb0 100644 --- a/apps/simple_clock/app.js +++ b/apps/simple_clock/app.js @@ -192,7 +192,7 @@ 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, From 0ce0d8a8d9a656e85827cf55f5abfb4e1ac043e3 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 08:13:02 +0100 Subject: [PATCH 405/476] Update app.js --- apps/colorful_clock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/colorful_clock/app.js b/apps/colorful_clock/app.js index 10d579a22..afc6b321f 100644 --- a/apps/colorful_clock/app.js +++ b/apps/colorful_clock/app.js @@ -209,7 +209,7 @@ 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, From bfb7d5a1fedde9e71bacad760b69835129ba8606 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 08:13:05 +0100 Subject: [PATCH 406/476] Update apps.json --- apps.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 97a0f04fe..c3a31238b 100644 --- a/apps.json +++ b/apps.json @@ -5081,7 +5081,7 @@ { "id": "minimal_clock", "name": "Minimal Analog Clock", "shortName":"Minimal Clock", - "version":"0.01", + "version":"0.02", "description": "a minimal analog clock - just with some hands and no clock face", "icon": "app-icon.png", "type": "clock", @@ -5098,7 +5098,7 @@ { "id": "simple_clock", "name": "Simple Analog Clock", "shortName":"Simple Clock", - "version":"0.01", + "version":"0.02", "description": "a simple, yet stylish, analog clock", "icon": "app-icon.png", "type": "clock", @@ -5115,7 +5115,7 @@ { "id": "colorful_clock", "name": "Colorful Analog Clock", "shortName":"Colorful Clock", - "version":"0.01", + "version":"0.02", "description": "a colorful analog clock", "icon": "app-icon.png", "type": "clock", From 307799666727f70f01c29c2237a1fa607da8bd69 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 09:17:09 +0100 Subject: [PATCH 407/476] Update README.md --- apps/minimal_clock/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md index 5dd27fdf4..b20a8d480 100644 --- a/apps/minimal_clock/README.md +++ b/apps/minimal_clock/README.md @@ -1,9 +1,9 @@ # Minimal Analog Clock # This app displays the perhaps most basic analog clock one can think of - just -some clock hands and no clock face. It considers currently configured "theme" -(and may therefore look different than shown in the screenshot on your watch -depending on which theme you prefer). +some clock hands and no clock face. It considers the currently configured +"theme" (and may therefore look different than shown in the screenshot on your +watch depending on which theme you prefer). ![](app-screenshot.png) From dbd776cde9ce7e877e698c8a09eb16bf45eda34b Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 09:17:17 +0100 Subject: [PATCH 408/476] Update app.js --- apps/minimal_clock/app.js | 52 +++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/apps/minimal_clock/app.js b/apps/minimal_clock/app.js index 3f6447fd5..d78790347 100644 --- a/apps/minimal_clock/app.js +++ b/apps/minimal_clock/app.js @@ -106,37 +106,50 @@ }; let HourHandLength = outerRadius * 0.5; - let HourHandWidth = 2*3, halfHourHandWidth = HourHandWidth/2; + let HourHandWidth = 2*5, halfHourHandWidth = HourHandWidth/2; let MinuteHandLength = outerRadius * 0.7; - let MinuteHandWidth = 2*2, halfMinuteHandWidth = MinuteHandWidth/2; + let MinuteHandWidth = 2*3, halfMinuteHandWidth = MinuteHandWidth/2; let SecondHandLength = outerRadius * 0.9; - let SecondHandOffset = 6; + let SecondHandOffset = halfHourHandWidth + 10; - let twoPi = 2*Math.PI; + 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 HourHandPolygon = [ - -halfHourHandWidth,halfHourHandWidth, - -halfHourHandWidth,halfHourHandWidth-HourHandLength, - halfHourHandWidth,halfHourHandWidth-HourHandLength, - halfHourHandWidth,halfHourHandWidth, + 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; } + } /**** transforme polygon ****/ - let transformedPolygon = new Array(HourHandPolygon.length); + let transformedPolygon = new Array(HandPolygon.length); function transformPolygon (originalPolygon, OriginX,OriginY, Phi) { let sPhi = sin(Phi), cPhi = cos(Phi), x,y; @@ -180,6 +193,13 @@ CenterX - SecondHandLength*sPhi, 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); } /**** refreshDisplay ****/ From ebc38c13ef8823dcef02b74768a5b9ed7ed40360 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 09:17:22 +0100 Subject: [PATCH 409/476] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c3a31238b..d53c9db48 100644 --- a/apps.json +++ b/apps.json @@ -5081,7 +5081,7 @@ { "id": "minimal_clock", "name": "Minimal Analog Clock", "shortName":"Minimal Clock", - "version":"0.02", + "version":"0.03", "description": "a minimal analog clock - just with some hands and no clock face", "icon": "app-icon.png", "type": "clock", From 9d48048fb16c5499ba81fe441d63103f78482328 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 09:24:00 +0100 Subject: [PATCH 410/476] Update app-icon.js --- apps/minimal_clock/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/minimal_clock/app-icon.js b/apps/minimal_clock/app-icon.js index dacc4c0fd..53ffd52d7 100644 --- a/apps/minimal_clock/app-icon.js +++ b/apps/minimal_clock/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwwcBIf4A/AH4A/AHsD+ALJjgFE/4RK/+AAgUH/gvKj/+AYMB/5CMv/AAQYALh//EwYALGQJKEABcH8CMQER4ATEcYA/AH4A/dP4A/ABgA=")) \ No newline at end of file +require("heatshrink").decompress(atob("mEwgJC/AEBhCjgCBgeAgF8AoXggHwCIXwgfADAX8h4TBAAM+jwkDj/4AocPDwIACgdgBYgoCAAMEuB+/AH4=")) \ No newline at end of file From 86191226fc2bc3b88462fc7198905c0ce97546d9 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 09:24:38 +0100 Subject: [PATCH 411/476] Update app-screenshot.png --- apps/minimal_clock/app-screenshot.png | Bin 1469 -> 1672 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/minimal_clock/app-screenshot.png b/apps/minimal_clock/app-screenshot.png index 8db4f5fb9a15b0101e26b763aab04f7fb33021b9..1ec4901ace47b0a89ac68ebef50ce1715911a228 100644 GIT binary patch literal 1672 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfz8R&#WAEJ z?(OZ1MXMY{TmnD;m!BIQmC6(|L2?N%dzhTAMBnc1x(Yvc-OamiUe6(-`oZ>e&t*jg-!`J|JZUwcTStJ?9`hpS?s(uJZGLi_Tm!LeOJq@&2Mx+ z-aPWxQh)#5yvNdY)sufesM@O-`lIU(bG-g^FZoxe%|FakwcEU7dCr61vtRM%u6w9u zdg0EWy*yg`?+2THFg|mS;k;7e``_zy-epSvSS1u6c<;FDkC}RpzWuOTd+k`b==U$Y zHX<9%pKu9%-?!X&j^3GPMc>%&eV&qZy7uw!;Ld8hPLDeqk1e-vol%!n&04X&_q)iB z@^72By?b%(d8kyy`{1r?X7`*E9_js`Q@oSyUi6c#)2iJQ9Z7yPS*zcwJ^S$W-s1}I|G%_stw=0cpK$o|gPpbY z(L3J@<~-Wfdo60u=G$AlYQ)#3-k$gNp41;E>+A=|CR{&~GxgK+M~_?INNqQqqHWWA ztuLwebhwZ|Yn&B(obZf2uPu4DUpP>^M=sjmHE-hg${7#$9sb*~Taklz5AUszN98Q{ z>>6$5#m|P<%t$}~V*d7H%g*j9>DkG4ZQpHS#Sdj=i*4@mHNXCz{T`NB&Xn(ydAjw^CDuD7EXzgSE)>`?_v#zjj;*(oyic#cYpzxpZNQTE z_{-+d^Lrnx{baXp-CQpdRp$q4KKrG&{!udDd)92PM|5=a0f^35nn#LPz6?%3d_9_f zdE;#l!5zJqGgj~9-mx@w*?H#eTh_DX@wXm$yT&Zn^1DNI_YtWbyylI!EpqR@x>}#2 z)9G`s><&v_`qs?TTkAEY;yws&mp5$uJ+t)fMWur4O=fa}3I!1yOzDim7N@_vJ&!Y&k!57=cj~W$V)bj3TN^ bJ&>R8lP3S|PQfc+)xzNE>gTe~DWM4faElWQ literal 1469 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(Y4M?uv{v-}aF%}28J29*~C-ahlfwkPz#WAEJ z?(LnxpeRQHhrk>E7x_B&EETa}x#yd6@1wa<-}ZjpNk<+(EU2)q2u{doR6gLW{`}T+ zCWdB%T?_{nAAkOd!FZHKTo`=+^Ys3`dwjcS$^0u6f4l zfzZ48x0!9S`*!bntGj2i;QK0O|N4LB@53KzANu=ak+lq8{Cu9f(N9_Ly+5C@yzX~Q z?}Moi-^qR0`fwlD6WarKO&`2xvyuHc@54NS_n$03X!HFPwO@WUcu6c%9Bd!|9{@8DBW&*i1o)Ye|Bx1|3%XGi>KQ@zWcZMLA3qDd(6*e^#7!H zthSyaU;TCRfB#>f@9yK;D0PS{;Oms6uZ0KyT3I%TPYPeKt;%cTFN+6p@*)RThyD>? zFKPd43)4O8wt~m84F9^zv@@=6`}lJHue-natyh1}x%;(%AF0abGsewj zeD~Lx@yEZgen&ewdozO_{Kx)1OJuOWSi<_L=8N@%tG{pU>gQ#8aC}#-O&05CmLCNl z?Hg84e=zS)h?||vgWh9h!k>5#n7uQ5$artr@W+C^0SE;U?pl-zx+5WLm#vCK3#@_+t*(fGB!Lu(3j86 maOYcTRSW|#vS_L057QC1PJz8uvyTJIV+K!GKbLh*2~7ZLb=Xq? From 40f56ea96f7fb068b4461cda3694b5f9a112b40e Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 1 Jan 2022 09:24:40 +0100 Subject: [PATCH 412/476] Update app-icon.png --- apps/minimal_clock/app-icon.png | Bin 1312 -> 1581 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/minimal_clock/app-icon.png b/apps/minimal_clock/app-icon.png index 32e1a342590fa03cb75adb0b00f12491b3b0c264..69788442a39c7ba8ccb99355a5ee68877e3873d7 100644 GIT binary patch delta 1124 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 fCE#;_tD64 Date: Sat, 1 Jan 2022 09:24:43 +0100 Subject: [PATCH 413/476] Update README.md --- apps/minimal_clock/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/minimal_clock/README.md b/apps/minimal_clock/README.md index b20a8d480..7e8700c0d 100644 --- a/apps/minimal_clock/README.md +++ b/apps/minimal_clock/README.md @@ -5,7 +5,6 @@ some clock hands and no clock face. It considers the currently configured "theme" (and may therefore look different than shown in the screenshot on your watch depending on which theme you prefer). - ![](app-screenshot.png) This clock also acts as an example for the building blocks found in the author's From 5ae87ae125e19b4379a492efc968b07d8ae21439 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Sat, 1 Jan 2022 11:56:40 +0100 Subject: [PATCH 414/476] Use weather condition code for icon selection --- apps.json | 2 +- apps/weatherClock/ChangeLog | 1 + apps/weatherClock/app.js | 30 +++++++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..64732f580 100644 --- a/apps.json +++ b/apps.json @@ -4778,7 +4778,7 @@ { "id": "weatherClock", "name": "Weather Clock", - "version": "0.04", + "version": "0.05", "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", "icon": "app.png", "screenshots": [{"url":"screens/screen1.png"}], diff --git a/apps/weatherClock/ChangeLog b/apps/weatherClock/ChangeLog index 72b53ebbf..a6a12c297 100644 --- a/apps/weatherClock/ChangeLog +++ b/apps/weatherClock/ChangeLog @@ -2,3 +2,4 @@ 0.02: Minor layout format tweak so it uses less memory and draws ok on Bangle.js 1 (#1012) 0.03: Minor layout extra spaces. 0.04: Layout now compatible with Bangle.js 2 +0.05: Use weather condition code for icon selection diff --git a/apps/weatherClock/app.js b/apps/weatherClock/app.js index 799f9abc6..1a7f53f05 100644 --- a/apps/weatherClock/app.js +++ b/apps/weatherClock/app.js @@ -53,6 +53,29 @@ function chooseIcon(condition) { return cloudIcon; } +/* +* Choose weather icon to display based on weather conditition code +* https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 +*/ +function chooseIconByCode(code) { + const codeGroup = Math.round(code / 100); + switch (codeGroup) { + case 2: return stormIcon; + case 3: return rainIcon; + case 5: return rainIcon; + case 6: return snowIcon; + case 7: return cloudIcon; + case 8: + switch (code) { + case 800: return sunIcon; + case 801: return partSunIcon; + default: return cloudIcon; + } + break; + default: return cloudIcon; + } +} + /** Get weather stored in json file by weather app. */ @@ -105,7 +128,12 @@ function draw() { var currentWeather = weatherJson.weather; const temp = locale.temp(currentWeather.temp-273.15).match(/^(\D*\d*)(.*)$/); clockLayout.temp.label = temp[1] + " " + temp[2]; - clockLayout.weatherIcon.src = chooseIcon(currentWeather.txt); + const code = currentWeather.code || -1; + if (code > 0) { + clockLayout.weatherIcon.src = chooseIconByCode(code); + } else { + clockLayout.weatherIcon.src = chooseIcon(currentWeather.txt); + } const wind = locale.speed(currentWeather.wind).match(/^(\D*\d*)(.*)$/); clockLayout.wind.label = wind[1] + " " + wind[2] + " " + (currentWeather.wrose||'').toUpperCase(); } From be8f5ebb67dedbf4d4d9abd2099730f2852280a0 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Sat, 1 Jan 2022 13:53:28 +0100 Subject: [PATCH 415/476] Redraw battery on charging event --- apps/circlesclock/app.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index c409c1e32..a23894ba1 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -226,6 +226,10 @@ Bangle.on('HRM', function(hrm) { //} }); +Bangle.on('charging', function(charging) { + drawBattery(); +}); + g.clear(); Bangle.loadWidgets(); /* From 9b29f5d2c72737d06b0d6b48505ff01bd69c93ab Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Sat, 1 Jan 2022 14:13:53 +0100 Subject: [PATCH 416/476] Improve heart rate circle drawing calculation --- apps/circlesclock/app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index a23894ba1..026b47cc6 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -102,7 +102,8 @@ function drawHeartRate() { g.fillCircle(w2, h3, radiusOuter); if (hrtValue != undefined && hrtValue > 0) { - const percent = hrtValue / settings.maxHR; + const minHR = 40; + const percent = (hrtValue - minHR) / (settings.maxHR - minHR); drawGauge(w2, h3, percent, colorRed); } @@ -166,6 +167,7 @@ function drawGauge(cx, cy, percent, color) { var i = 0; var r = radiusInner + 3; + if (percent <= 0) return; if (percent > 1) percent = 1; var startrot = -offset; From 00fdeca185acaaaa00a238b4ca7a2b4e795ab9fb Mon Sep 17 00:00:00 2001 From: pancake Date: Sat, 1 Jan 2022 19:47:43 +0100 Subject: [PATCH 417/476] Initial import of the tinydraw application --- apps.json | 19 ++++ apps/tinydraw/ChangeLog | 1 + apps/tinydraw/README.md | 12 +++ apps/tinydraw/add_to_apps.json | 14 +++ apps/tinydraw/app-icon.js | 1 + apps/tinydraw/app.js | 159 +++++++++++++++++++++++++++++++++ apps/tinydraw/app.png | Bin 0 -> 1650 bytes apps/tinydraw/screenshot.png | Bin 0 -> 4787 bytes 8 files changed, 206 insertions(+) create mode 100644 apps/tinydraw/ChangeLog create mode 100644 apps/tinydraw/README.md create mode 100644 apps/tinydraw/add_to_apps.json create mode 100644 apps/tinydraw/app-icon.js create mode 100644 apps/tinydraw/app.js create mode 100644 apps/tinydraw/app.png create mode 100644 apps/tinydraw/screenshot.png diff --git a/apps.json b/apps.json index e5e9f8f02..b822f2f0b 100644 --- a/apps.json +++ b/apps.json @@ -4838,6 +4838,25 @@ {"name": "flow.img", "url": "app-icon.js","evaluate": true } ] }, + { "id": "tinydraw", + "name": "TinyDraw", + "shortName":"TinyDraw", + "version":"0.01", + "type": "app", + "description": "Draw stuff in your wrist", + "icon": "app.png", + "allow_emulator": true, + "tags": "tools, keyboard, text, scribble", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"tinydraw.app.js","url":"app.js"}, + {"name":"tinydraw.img","url":"app-icon.js","evaluate":true} + ], + "screenshots":[ + { "url":"screenshot.png" } + ] + }, { "id": "scribble", "name": "Scribble", "shortName":"Scribble", diff --git a/apps/tinydraw/ChangeLog b/apps/tinydraw/ChangeLog new file mode 100644 index 000000000..af7f83942 --- /dev/null +++ b/apps/tinydraw/ChangeLog @@ -0,0 +1 @@ +0.01: Initial release diff --git a/apps/tinydraw/README.md b/apps/tinydraw/README.md new file mode 100644 index 000000000..555730262 --- /dev/null +++ b/apps/tinydraw/README.md @@ -0,0 +1,12 @@ +TinyDraw +======== + +This is a simple drawing application to make +simple sketches in your watch! + +It is my first BangleJS application, I plan +to continue improving this app over time, but +if you want to contribute, i would be happy +to apply any patch! + +--pancake diff --git a/apps/tinydraw/add_to_apps.json b/apps/tinydraw/add_to_apps.json new file mode 100644 index 000000000..21a90049e --- /dev/null +++ b/apps/tinydraw/add_to_apps.json @@ -0,0 +1,14 @@ +{ "id": "tinydraw", + "name": "TinyDraw", + "shortName":"TinyDraw", + "version":"0.01", + "description": "Draw stuff in your wrist!", + "icon": "app.png", + "tags": "keyboard, text, scribble", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"tinydraw.app.js","url":"app.js"}, + {"name":"tinydraw.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/tinydraw/app-icon.js b/apps/tinydraw/app-icon.js new file mode 100644 index 000000000..1f0eaae27 --- /dev/null +++ b/apps/tinydraw/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwhC/ACEF7vd6oXTroXB7tQC6QWC7vQC6Xf//9C6n4xGPC4VM5nMoAXNxH/xH96EECwPM4gXNx///AXBhgXC5gXRqAXOt3u91gC4S/BC5sGCwPu8wXCuAXOhwXC9wXcR5oXJX5oXHxGIuF3DYQXRDIWHC5SPH/7yBAIN3u6/QC4JME+AXIg5WCC44CBJRN4KwQXHAgOAC5BWCC6gOCC6xUBC6cIUIQbCAAwXJvAMBQ4QXRg6fEC6SQBLQQXRJAYAJC5UIFpIXMMAQXUVIYXVGBQXLh4XKw4XKgCpCAA34F5apK/FwC5ZIJxAWLSJP4LxhhJxBGMMIeIJQX4xH3Cxz0CxAACu4WQAH4A/AAwA==")) diff --git a/apps/tinydraw/app.js b/apps/tinydraw/app.js new file mode 100644 index 000000000..e4c612219 --- /dev/null +++ b/apps/tinydraw/app.js @@ -0,0 +1,159 @@ +(function () { + var pen = 'circle'; + var discard = null; + var kule = [255, 255, 255]; + var oldLock = false; + + setInterval(() => { + if (Bangle.isLocked()) { + if (oldLock) { + return; + } + g.setColor('#fff'); + g.fillRect(0, 0, g.getWidth(), 20); + g.setFont('6x8', 2); + g.setColor('#000'); + g.drawString('PLEASE UNLOCK', 10, 2); + oldLock = true; + } else { + oldLock = false; + drawUtil(); + } + }, 1000); + + function nextColor () { + kule[0] = Math.random(); + kule[1] = Math.random(); + kule[2] = Math.random(); + } + + function nextPen () { + switch (pen) { + case 'circle': pen = 'pixel'; break; + case 'pixel': pen = 'crayon'; break; + case 'crayon': pen = 'square'; break; + case 'square': pen = 'circle'; break; + default: pen = 'pixel'; break; + } + console.log('set time'); + drawUtil(); + + discard = setTimeout(function () { console.log('timeout'); discard = null; }, 500); + } + + function drawUtil () { + if (Bangle.isLocked()) { + // do something to tell the user to unlock the screen + } + // titlebar + g.setColor(kule[0], kule[1], kule[2]); + g.fillRect(0, 0, g.getWidth(), 20); + // clear button + g.setColor('#000'); // black + g.fillCircle(10, 10, 8, 8); + g.setColor('#fff'); + g.drawLine(8, 8, 13, 13); + g.drawLine(13, 8, 8, 13); + // tool button + g.setColor('#fff'); + g.fillCircle(g.getWidth() - 10, 10, 8); + g.setColor('#000'); + + var w = g.getWidth(); + switch (pen) { + case 'circle': + g.fillCircle(w - 10, 10, 5); + break; + case 'square': + g.fillRect(w - 5, 5, w - 15, 15); + break; + case 'pixel': + g.setPixel(10, 10); + g.fillCircle(w - 10, 10, 2); + break; + case 'crayon': + var tap = { x: 10, y: 15, dy: -5, dx: 5 }; + g.drawLine(w - tap.x, tap.y, w - tap.x + tap.dx, tap.y + tap.dy); + g.drawLine(w - tap.x + 1, tap.y + 2, w - tap.x + tap.dx, tap.y + tap.dy - 2); + g.drawLine(w - tap.x + 2, tap.y + 2, w - tap.x + tap.dx, tap.y + tap.dy + 2); + break; + } + } + var tapTimer = null; + Bangle.on('drag', function (tap) { + if (tap.b === 0) { + if (tapTimer !== null) { + clearTimeout(tapTimer); + tapTimer = null; + } + } + // tap and hold the clear button + if (tap.x < 32 && tap.y < 32) { + if (tap.b === 1) { + if (tapTimer === null) { + tapTimer = setTimeout(function () { + g.clear(); + drawUtil(); + tapTimer = null; + }, 800); + } + if (discard) { + clearTimeout(discard); discard = null; + return; + } + } + return; + } + if (tap.x > g.getWidth() - 32 && tap.y < 32) { + if (tap.b === 1) { + if (tapTimer === null) { + tapTimer = setTimeout(function () { + g.clear(); + drawUtil(); + tapTimer = null; + }, 800); + } + if (discard) { + clearTimeout(discard); + discard = null; + return; + } + nextPen(); + } + drawUtil(); + return; + } else if (tap.y < 32) { + nextColor(); + drawUtil(); + return; + } + + g.setColor(kule[0], kule[1], kule[2]); + + switch (pen) { + case 'pixel': + g.setPixel(tap.x, tap.y); + g.drawLine(tap.x, tap.y, tap.x + tap.dx, tap.y + tap.dy); + break; + case 'crayon': + g.drawLine(tap.x, tap.y, tap.x + tap.dx, tap.y + tap.dy); + g.drawLine(tap.x + 1, tap.y + 2, tap.x + tap.dx, tap.y + tap.dy - 2); + g.drawLine(tap.x + 2, tap.y + 2, tap.x + tap.dx, tap.y + tap.dy + 2); + break; + case 'circle': + var XS = tap.dx / 10; + var YS = tap.dy / 10; + for (i = 0; i < 10; i++) { + g.fillCircle(tap.x + (i * XS), tap.y + (i * YS), 4, 4); + } + break; + case 'square': + g.fillRect(tap.x - 10, tap.y - 10, tap.x + 10, tap.y + 10); + break; + } + drawUtil(); + }); + + g.clear(); + drawUtil(); +})(); diff --git a/apps/tinydraw/app.png b/apps/tinydraw/app.png new file mode 100644 index 0000000000000000000000000000000000000000..01eda0a60ed4eaa25874cbe5cb0788819c796af4 GIT binary patch literal 1650 zcmV-&295cNP)F7=ErT_RA|01Z$N!$o!zp1#2-;FiT`^S%e=%SvCkHGsc9ds39S#_{(G{(X7f8 zSR^Krm`q|MsRh#!OteD0>W9s%HnrdDz1tlr0mAtF)IQyAez8OGKA(Wfc;#G?|=Uaot>R;l8RyQPlXk% zEfxR}Es2>>|6tLea@0Lm>u`*!T`o_QOeXTOth7xk5g)o%EjP~A{<8TBDE{*RSe8Y5 zdppc#Gftj7iDOp^fOszez~+8E!FikA**rM-dZ)|fi2?wZ%M&#?_`+YB&hW595fvq@1+Z&D zM*sj=_HCGp#bN*e4<5ZkUH<2mC;36n;TTm<*Un7*oJOFG>f!;M0B``nMgS%Nw*XxH zg(>`Rs_%?LZ7$=Br$3Ef2ZCWU6=vdRJpuveYXE2h&Li;D0H_J@lOpOHN5;F0m`o<} zPG@f>el8(&0zl3bTuy+W3^o9(-w!ou+w`G0JwF!#2j<8}1CYI2D3yp0#m2Ih$v%jU zWi3*P_)xe7Y@7%G-fVNNT5gP9xni$e9`i65E;5-9K& z`ZU(8S%b4@&!V%lvqh~|WB2aeZww2CXl!gO-nVbxZ;=#m5x|xy61gG3Pb%QtxpOEj zEd|3cP%4$k%*@1&9Xs&o(Ic=d3$0d*oSdA>`}gl#O(xS{V`F1bsZ_f&GBW-M>t?Bp z>f+0&uDp!uy344J0?+bsQz+fNdzXTE`SK+JpvK0=P+4DJ9|55H`ub3r(P$(91b~D> zA&JFe0zj3Ol^4Ul+bFj+6doX=*W>Hchb_*U^E(G zHk(mYRD`^|yz<$0giI!z{75KxdlnK3XW#KN3TSO@#nGcjk(`{2#Kc5sG#U_5t45>A zosFTmxOgxO6ZY`_pxx-ez(DB#`t|E^>C&b2%a<=7udA!emrA7o0H4nXp69_Z3}iAH zL?RJ*o`=up0|2<)qYwxLp?bj{7l}lXy|ySRDanqBiJ^gk0U{#eIF77VE2XEWlR}{& zg+f7ky`DTC4{;nvZnv8{Iy%Vdbdt~KBcIPl9*>7QIy%Vhc9YlZC9l^@9*>8NMk9@l zjfHZ+Y&Oq22WCW1Pmhve80VQYXNc!{;(4Apjw6G?Kmvh)SeB)xrY7=wy&;Ero+rQG zAF3aG5B|o#^E@9}0RT`{RiyzyPoF*w8RIyP3JVMA-C1Zph?s!k;oxCI3EHpc*v!C(j(F&T)0pUfNtNuJul~9ym&!LNlBEOn@d<|6c-oo0YKNUU!Sl_e<<49 z+exKTQA$b*_4f9DhmV0%r%q{t$HSJE7P8yzGsb&YR~MZ>f1UtPdU`r_b#?uSkBO$H zrrgxjR02TDmoKNn!on#9Y}l|NbUdx7s35D=nmt#$OeDl;wc6|l4<6`-hKAnbBoYa> wZ{Ln>+qR{orKOD|BqUg{ge5Ft37;(f2V~L;L7FfU%>V!Z07*qoM6N<$g7T*d=>Px# literal 0 HcmV?d00001 diff --git a/apps/tinydraw/screenshot.png b/apps/tinydraw/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..27d5cc56cd4017f25f42bf9405e2575771e4b4b1 GIT binary patch literal 4787 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 N002ovPDHLkV1i{CF?av~ literal 0 HcmV?d00001 From f7be3effa437251ba5e7fe8f3b5ccb4f2ffa09e7 Mon Sep 17 00:00:00 2001 From: pancake Date: Sun, 2 Jan 2022 01:45:11 +0100 Subject: [PATCH 418/476] Fix readme --- apps/tinydraw/README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/tinydraw/README.md b/apps/tinydraw/README.md index 555730262..a4acd9a72 100644 --- a/apps/tinydraw/README.md +++ b/apps/tinydraw/README.md @@ -1,12 +1,14 @@ TinyDraw ======== -This is a simple drawing application to make -simple sketches in your watch! +This is a simple drawing application to make sketches +using different brushes and colors for your BangleJS2 watch! + +* Brush types: dot, brush, circle, square It is my first BangleJS application, I plan to continue improving this app over time, but -if you want to contribute, i would be happy -to apply any patch! +if you want to contribute or provide feedback +don't hesitate to contact me! --pancake From 6c4e59d5957f13d5db66046d99e32b3631ddb962 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sun, 2 Jan 2022 16:40:49 +0000 Subject: [PATCH 419/476] Settings, moved Turn Off into Utils --- apps.json | 2 +- apps/setting/ChangeLog | 1 + apps/setting/settings.js | 8 ++++---- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/apps.json b/apps.json index 427b86fbb..26ed3d4b1 100644 --- a/apps.json +++ b/apps.json @@ -167,7 +167,7 @@ { "id": "setting", "name": "Settings", - "version": "0.38", + "version": "0.39", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 143144d51..449091bca 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -41,3 +41,4 @@ 0.36: Added 'Utils' menu with helpful utilities for restoring Bangle.js 0.37: Going into passkey menu now saves settings with passkey 0.38: Restructed menus as per forum discussion +0.39: Moved off into Utils, put System after Apps diff --git a/apps/setting/settings.js b/apps/setting/settings.js index 1a9463858..9934a1765 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -66,11 +66,10 @@ function showMainMenu() { '': { 'title': 'Settings' }, '< Back': ()=>load(), /*LANG*/'Apps': ()=>showAppSettingsMenu(), - /*LANG*/'Bluetooth': ()=>showBLEMenu(), /*LANG*/'System': ()=>showSystemMenu(), + /*LANG*/'Bluetooth': ()=>showBLEMenu(), /*LANG*/'Alerts': ()=>showAlertsMenu(), - /*LANG*/'Utils': ()=>showUtilMenu(), - /*LANG*/'Turn Off': ()=>{ if (Bangle.softOff) Bangle.softOff(); else Bangle.off() } + /*LANG*/'Utils': ()=>showUtilMenu() }; return E.showMenu(mainmenu); @@ -535,7 +534,8 @@ function showUtilMenu() { setTimeout(showMainMenu, 50); } else showUtilMenu(); }); - } + }, + /*LANG*/'Turn Off': ()=>{ if (Bangle.softOff) Bangle.softOff(); else Bangle.off() } }; if (Bangle.factoryReset) { menu['Factory Reset'] = ()=>{ From 3db8bd43c8e18e817992efa51c33e74f5caac054 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 2 Jan 2022 20:42:09 +0000 Subject: [PATCH 420/476] touchtimer: calculate time based on actual input, and only convert to 60m/60s afterwards. Clean up code. --- apps/touchtimer/README.md | 2 +- apps/touchtimer/app.js | 246 +++++++++++++++++++++++++------------- 2 files changed, 164 insertions(+), 84 deletions(-) diff --git a/apps/touchtimer/README.md b/apps/touchtimer/README.md index c8bc2c084..c97e69afc 100644 --- a/apps/touchtimer/README.md +++ b/apps/touchtimer/README.md @@ -9,7 +9,7 @@ Quickly and easily create a timer with touch-only input. The time can be easily - If the timer time is correct, press "OK". - If you have accidentially pressed "OK", press "STOP" to go cancel. - Press "START" to start the timer, if the time is correct. -- The timer will run the time until 0. Once it hits zero the watch will buzz for 1 second every 5 seconds for a total of 10 times, or until you press "STOP" +- The timer will run the time until 0. Once it hits zero the watch will buzz for 1 second every 5 seconds for a total of 5 times, or until you press "STOP" ## Screenshots diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index ad8eb42ae..c3200327d 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -53,38 +53,29 @@ var main = () => { var timerRunningButtons = [buttonStartPause, buttonStop]; - var timeStr = ""; + var timerEdit = new TimerEdit(); timerNumberButtons.forEach((numberButton) => { - numberButton.setOnClick((value) => { + numberButton.setOnClick((number) => { log("number button clicked"); - log(value); - log(timeStr); - if (value === 0 && timeStr.length === 0) { - return; - } - - if (timeStr.length <= 6) { - timeStr = timeStr + value; - } - log(timeStr); - drawTimer(timeStr); + log(number); + timerEdit.appendNumber(number); + timerEdit.draw(); }); }); buttonDelete.setOnClick(() => { log("delete button clicked"); - timeStr = timeStr.slice(0, -1); - log(timeStr); - drawTimer(timeStr); + timerEdit.removeNumber(); + timerEdit.draw(); }); buttonOK.setOnClick(() => { - if (timeStr.length === 0) { + if (timerEdit.timeStr.length === 0) { return; } g.clear(); - drawTimer(timeStr); + timerEdit.draw(); timerInputButtons.forEach((button) => button.disable()); @@ -96,8 +87,13 @@ var main = () => { var timerIntervalId = undefined; var buzzIntervalId = undefined; + var timerCountDown = undefined; buttonStartPause.setOnClick(() => { if (buttonStartPause.value === "PAUSE") { + if (timerCountDown) { + timerCountDown.pause(); + } + buttonStartPause.value = "START"; buttonStartPause.draw(); @@ -115,18 +111,19 @@ var main = () => { } if (buttonStartPause.value === "START") { + if (!timerCountDown) { + timerCountDown = new TimerCountDown(timerEdit.timeStr); + } else { + timerCountDown.unpause(); + } + buttonStartPause.value = "PAUSE"; buttonStartPause.draw(); - var time = timeStrToTime(timeStr); - timerIntervalId = setInterval(() => { - time = time - 1; + timerCountDown.draw(); - timeStr = timeToTimeStr(time); - drawTimer(timeStr); - - if (time === 0) { + if (timerCountDown.isFinished()) { buttonStartPause.value = "FINISHED!"; buttonStartPause.draw(); @@ -138,7 +135,7 @@ var main = () => { var buzzCount = 0; Bangle.buzz(1000, 1); buzzIntervalId = setInterval(() => { - if (buzzCount >= 10) { + if (buzzCount >= 5) { clearInterval(buzzIntervalId); buzzIntervalId = undefined; return; @@ -155,6 +152,10 @@ var main = () => { }); buttonStop.setOnClick(() => { + if (timerCountDown) { + timerCountDown = undefined; + } + if (timerIntervalId) { clearInterval(timerIntervalId); timerIntervalId = undefined; @@ -169,8 +170,8 @@ var main = () => { buttonStartPause.draw(); g.clear(); - timeStr = ""; - drawTimer(timeStr); + timerEdit.reset(); + timerEdit.draw(); timerRunningButtons.forEach((button) => button.disable()); @@ -182,7 +183,7 @@ var main = () => { // initalize g.clear(); - drawTimer(timeStr); + timerEdit.draw(); timerInputButtons.forEach((button) => { button.enable(); button.draw(); @@ -197,24 +198,6 @@ var log = (message) => { } }; -var drawTimer = (timeStr) => { - timeStr = timeStr.padStart(6, "0"); - var timeStrDisplay = - "" + - timeStr.slice(0, 2) + - "h " + - timeStr.slice(2, 4) + - "m " + - timeStr.slice(4, 6) + - "s"; - - g.clearRect(0, 0, 176, 34); - g.setColor(g.theme.fg); - g.setFontAlign(-1, -1); - g.setFont("Vector:26x40"); - g.drawString(timeStrDisplay, 2, 0); -}; - var touchHandlers = []; Bangle.on("touch", (_button, xy) => { @@ -312,50 +295,147 @@ class Button { } } -var timeToTimeStr = (time) => { - var hours = Math.floor(time / 3600); - time = time - hours * 3600; - var minutes = Math.floor(time / 60); - time = time - minutes * 60; - var seconds = time; - - if (hours === 0) { - hours = ""; - } else { - hours = hours.toString(); +class TimerEdit { + constructor() { + this.timeStr = ""; } - if (hours.length === 0) { - if (minutes === 0) { - minutes = ""; - } else { - minutes = minutes.toString(); + appendNumber(number) { + if (number === 0 && this.timeStr.length === 0) { + return; } - } else { - minutes = minutes.toString().padStart(2, "0"); - } - if (hours.length === 0 && minutes.length === 0) { - if (seconds === 0) { - seconds = ""; - } else { - seconds = seconds.toString(); + if (this.timeStr.length <= 6) { + this.timeStr = this.timeStr + number; } - } else { - seconds = seconds.toString().padStart(2, "0"); } - return hours + minutes + seconds; -}; + removeNumber() { + if (this.timeStr.length > 0) { + this.timeStr = this.timeStr.slice(0, -1); + } + } -var timeStrToTime = (timeStr) => { - timeStr = timeStr.padStart(6, "0"); - return ( - parseInt(timeStr.slice(0, 2), 10) * 3600 + - parseInt(timeStr.slice(2, 4), 10) * 60 + - parseInt(timeStr.slice(4, 6), 10) - ); -}; + reset() { + this.timeStr = ""; + } + + draw() { + log("drawing timer edit"); + var timeStrPadded = this.timeStr.padStart(6, "0"); + var timeStrDisplay = + "" + + timeStrPadded.slice(0, 2) + + "h " + + timeStrPadded.slice(2, 4) + + "m " + + timeStrPadded.slice(4, 6) + + "s"; + log(timeStrPadded); + log(timeStrDisplay); + + g.clearRect(0, 0, 176, 34); + g.setColor(g.theme.fg); + g.setFontAlign(-1, -1); + g.setFont("Vector:26x40"); + g.drawString(timeStrDisplay, 2, 0); + } +} + +class TimerCountDown { + constructor(timeStr) { + log("creating timer"); + this.timeStr = timeStr; + log(this.timeStr); + this.start = Math.floor(Date.now() / 1000); + log(this.start); + this.pausedTime = undefined; + } + + getAdjustedTime() { + var elapsedTime = Math.floor(Date.now() / 1000) - this.start; + + var timeStrPadded = this.timeStr.padStart(6, "0"); + var timeStrHours = parseInt(timeStrPadded.slice(0, 2), 10); + var timeStrMinutes = parseInt(timeStrPadded.slice(2, 4), 10); + var timeStrSeconds = parseInt(timeStrPadded.slice(4, 6), 10); + + var hours = timeStrHours; + var minutes = timeStrMinutes; + var seconds = timeStrSeconds - elapsedTime; + + if (seconds < 0) { + var neededMinutes = Math.ceil(Math.abs(seconds) / 60); + + seconds = seconds + neededMinutes * 60; + minutes = minutes - neededMinutes; + + if (minutes < 0) { + var neededHours = Math.ceil(Math.abs(minutes) / 60); + + minutes = minutes + neededHours * 60; + hours = hours - neededHours; + } + } + + if (hours < 0 || minutes < 0 || seconds < 0) { + hours = 0; + minutes = 0; + seconds = 0; + } + + return { hours: hours, minutes: minutes, seconds: seconds }; + } + + pause() { + this.pausedTime = Math.floor(Date.now() / 1000); + } + + unpause() { + if (this.pausedTime) { + this.start += Math.floor(Date.now() / 1000) - this.pausedTime; + } + + this.pausedTime = undefined; + } + + draw() { + log("drawing timer count down"); + var adjustedTime = this.getAdjustedTime(); + var hours = adjustedTime.hours; + var minutes = adjustedTime.minutes; + var seconds = adjustedTime.seconds; + + var timeStrDisplay = + "" + + hours.toString().padStart(2, "0") + + "h " + + minutes.toString().padStart(2, "0") + + "m " + + seconds.toString().padStart(2, "0") + + "s"; + log(timeStrDisplay); + + g.clearRect(0, 0, 176, 34); + g.setColor(g.theme.fg); + g.setFontAlign(-1, -1); + g.setFont("Vector:26x40"); + g.drawString(timeStrDisplay, 2, 0); + } + + isFinished() { + var adjustedTime = this.getAdjustedTime(); + var hours = adjustedTime.hours; + var minutes = adjustedTime.minutes; + var seconds = adjustedTime.seconds; + + if (hours <= 0 && minutes <= 0 && seconds <= 0) { + return true; + } else { + return false; + } + } +} // start main function From 3150fc7536b7b8bfa1aaa228a36aefb357bcfc96 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 2 Jan 2022 21:01:49 +0000 Subject: [PATCH 421/476] touchtimer: add settings --- apps.json | 6 ++- apps/touchtimer/ChangeLog | 3 +- apps/touchtimer/README.md | 3 +- apps/touchtimer/app.js | 24 +++++++++--- apps/touchtimer/settings.js | 77 +++++++++++++++++++++++++++++++++++++ 5 files changed, 104 insertions(+), 9 deletions(-) create mode 100644 apps/touchtimer/settings.js diff --git a/apps.json b/apps.json index 01ad2eac4..846ab7efe 100644 --- a/apps.json +++ b/apps.json @@ -5067,7 +5067,7 @@ "id": "touchtimer", "name": "Touch Timer", "shortName": "Touch Timer", - "version": "0.01", + "version": "0.02", "description": "Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad.", "icon": "app.png", "tags": "tools", @@ -5076,7 +5076,9 @@ "screenshots": [{"url":"0_light_timer_edit.png"},{"url":"1_light_timer_ready.png"},{"url":"2_light_timer_running.png"},{"url":"3_light_timer_finished.png"}], "storage": [ { "name": "touchtimer.app.js", "url": "app.js" }, + { "name":"touchtimer.settings.js", "url":"settings.js"}, { "name": "touchtimer.img", "url": "app-icon.js", "evaluate": true } - ] + ], + "data": [{"name":"touchtimer.data.json"}] } ] diff --git a/apps/touchtimer/ChangeLog b/apps/touchtimer/ChangeLog index 193a476aa..01904c6ea 100644 --- a/apps/touchtimer/ChangeLog +++ b/apps/touchtimer/ChangeLog @@ -1 +1,2 @@ -0.01: Initial creation of the touch timer app \ No newline at end of file +0.01: Initial creation of the touch timer app +0.02: Add settings menu \ No newline at end of file diff --git a/apps/touchtimer/README.md b/apps/touchtimer/README.md index c97e69afc..39afba8e5 100644 --- a/apps/touchtimer/README.md +++ b/apps/touchtimer/README.md @@ -9,7 +9,8 @@ Quickly and easily create a timer with touch-only input. The time can be easily - If the timer time is correct, press "OK". - If you have accidentially pressed "OK", press "STOP" to go cancel. - Press "START" to start the timer, if the time is correct. -- The timer will run the time until 0. Once it hits zero the watch will buzz for 1 second every 5 seconds for a total of 5 times, or until you press "STOP" +- The timer will run the time until 0. Once it hits zero the watch will buzz for 1 second every 1 seconds for a total of 3 times, or until you press "STOP" +- -> The number of buzzes, the buzz duration, and the pause between buzzes is configurable in the settings app ## Screenshots diff --git a/apps/touchtimer/app.js b/apps/touchtimer/app.js index c3200327d..ffa1af80a 100644 --- a/apps/touchtimer/app.js +++ b/apps/touchtimer/app.js @@ -1,6 +1,9 @@ var DEBUG = false; +var FILE = "touchtimer.data.json"; var main = () => { + var settings = readSettings(); + var button1 = new Button({ x1: 1, y1: 35, x2: 58, y2: 70 }, 1); var button2 = new Button({ x1: 60, y1: 35, x2: 116, y2: 70 }, 2); var button3 = new Button({ x1: 118, y1: 35, x2: 174, y2: 70 }, 3); @@ -132,18 +135,18 @@ var main = () => { timerIntervalId = undefined; } - var buzzCount = 0; - Bangle.buzz(1000, 1); + var buzzCount = 1; + Bangle.buzz(settings.buzzDuration * 1000, 1); buzzIntervalId = setInterval(() => { - if (buzzCount >= 5) { + if (buzzCount >= settings.buzzCount) { clearInterval(buzzIntervalId); buzzIntervalId = undefined; return; } else { - Bangle.buzz(1000, 1); + Bangle.buzz(settings.buzzDuration * 1000, 1); buzzCount++; } - }, 5000); + }, settings.buzzDuration * 1000 + settings.pauseBetween * 1000); } }, 1000); @@ -437,6 +440,17 @@ class TimerCountDown { } } +var readSettings = () => { + log("reading settings"); + var settings = require("Storage").readJSON(FILE, 1) || { + buzzCount: 3, + buzzDuration: 1, + pauseBetween: 1, + }; + log(settings); + return settings; +}; + // start main function main(); diff --git a/apps/touchtimer/settings.js b/apps/touchtimer/settings.js new file mode 100644 index 000000000..885670f57 --- /dev/null +++ b/apps/touchtimer/settings.js @@ -0,0 +1,77 @@ +(function (back) { + var DEBUG = false; + var FILE = "touchtimer.data.json"; + + var settings = {}; + + var showMainMenu = () => { + log("Loading main menu"); + + E.showMenu({ + "": { title: "Touch Timer" }, + "< Back": () => back(), + "Buzz Count": { + value: settings.buzzCount, + min: 1, + max: 3, + step: 1, + onchange: (value) => { + settings.buzzCount = value; + writeSettings(settings); + }, + }, + "Buzz Duration": { + value: settings.buzzDuration, + min: 1, + max: 10, + step: 0.5, + format: (value) => value + "s", + onchange: (value) => { + settings.buzzDuration = value; + writeSettings(settings); + }, + }, + "Pause Between": { + value: settings.pauseBetween, + min: 1, + max: 5, + step: 1, + format: (value) => value + "s", + onchange: (value) => { + settings.pauseBetween = value; + writeSettings(settings); + }, + }, + }); + }; + + // lib functions + + var log = (message) => { + if (DEBUG) { + console.log(JSON.stringify(message)); + } + }; + + var readSettings = () => { + log("reading settings"); + var settings = require("Storage").readJSON(FILE, 1) || { + buzzCount: 3, + buzzDuration: 1, + pauseBetween: 1, + }; + log(settings); + return settings; + }; + + var writeSettings = (settings) => { + log("writing settings"); + log(settings); + require("Storage").writeJSON(FILE, settings); + }; + + // start main function + + settings = readSettings(); + showMainMenu(); +}); From 495ee69251126350d174b3785117626693d03e3e Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Mon, 3 Jan 2022 11:08:32 +0100 Subject: [PATCH 422/476] Update apps/gpsinfo/gps-info.js (nofBD and/or nofGP are not recognized as numbers) Co-authored-by: BartS23 <10829389+BartS23@users.noreply.github.com> --- apps/gpsinfo/gps-info.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js index 4c935b61a..3c8bd42ea 100644 --- a/apps/gpsinfo/gps-info.js +++ b/apps/gpsinfo/gps-info.js @@ -113,8 +113,8 @@ function onGPSraw(nmea) { var nofGP = 0; if (nmea.slice(3,6) == "GSV") { // console.log(nmea); - if (nmea.slice(0,7) == "$BDGSV,") nofBD = nmea.slice(11,13); - if (nmea.slice(0,7) == "$GPGSV,") nofGP = nmea.slice(11,13); + if (nmea.slice(0,7) == "$BDGSV,") nofBD = Number(nmea.slice(11,13)); + if (nmea.slice(0,7) == "$GPGSV,") nofGP = Number(nmea.slice(11,13)); SATinView = nofBD + nofGP; } } From aa45ecdb961dab07cd74b992f44fe5692f69aafc Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Mon, 3 Jan 2022 11:49:43 +0100 Subject: [PATCH 423/476] Update gps-info.js : make nofBD and nofGP global ...otherwise one of them is always zero. Thanks, BartS23 --- apps/gpsinfo/gps-info.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js index 3c8bd42ea..a16d4a04e 100644 --- a/apps/gpsinfo/gps-info.js +++ b/apps/gpsinfo/gps-info.js @@ -17,6 +17,8 @@ var lastFix = { satellites: 0 }; var SATinView = 0; +var nofBD = 0; +var nofGP = 0; function formatTime(now) { if (now == undefined) { @@ -109,8 +111,6 @@ function onGPS(fix) { } function onGPSraw(nmea) { - var nofBD = 0; - var nofGP = 0; if (nmea.slice(3,6) == "GSV") { // console.log(nmea); if (nmea.slice(0,7) == "$BDGSV,") nofBD = Number(nmea.slice(11,13)); From 402a2fc6b4a99ce6b7be75c7a1c3cc056790bfc8 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 3 Jan 2022 17:07:17 +0100 Subject: [PATCH 424/476] Updated contributors --- apps/lcars/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index b7a692c96..4630db1ea 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -1,9 +1,8 @@ # LCARS clock A simple LCARS inspired clock. -Note: To display the steps, the health app is required. -If this app is not installed, the data will not be shown. - +Note: To display the steps, the health app is required. If this app is not installed, the data will not be shown. +To contribute you can open a PR at this [GitHub Repo]( https://github.com/peerdavid/BangleApps) ## Features * LCARS Style watch face. @@ -28,5 +27,6 @@ Access different screens via swipe left/ right -## Creator -Made by [David Peer](https://github.com/peerdavid) \ No newline at end of file +## Contributors +- Creator: [David Peer](https://github.com/peerdavid). +- Improvements: [Adam Schmalhofer](https://github.com/adamschmalhofer). From b04578840bf945f53cf844e2a64344157f90b86f Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 3 Jan 2022 17:19:48 +0100 Subject: [PATCH 425/476] Added vref to settings --- apps/lcars/lcars.app.js | 5 +++++ apps/lcars/lcars.settings.js | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 391f14c20..36a335a81 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -145,6 +145,11 @@ function printData(key, y){ g.drawString("HRM:", 26, y); g.drawString(hrmValue, 65, y); + } else if (key == "VREF"){ + var voltage = E.getAnalogVRef().toFixed(2); + g.drawString("VREF:", 26, y); + g.drawString(voltage + "V", 65, y); + } else { g.drawString("NOT FOUND", 26, y); } diff --git a/apps/lcars/lcars.settings.js b/apps/lcars/lcars.settings.js index 2255caf9b..0d004b002 100644 --- a/apps/lcars/lcars.settings.js +++ b/apps/lcars/lcars.settings.js @@ -18,14 +18,14 @@ storage.write(SETTINGS_FILE, settings) } - var data_options = ['Battery', 'Steps', 'Temp.', "HRM"]; + var data_options = ["Battery", "Steps", "Temp.", "HRM", "VREF"]; E.showMenu({ '': { 'title': 'LCARS Clock' }, '< Back': back, 'Row 1': { value: 0 | data_options.indexOf(settings.dataRow1), - min: 0, max: 3, + min: 0, max: 4, format: v => data_options[v], onchange: v => { settings.dataRow1 = data_options[v]; @@ -34,7 +34,7 @@ }, 'Row 2': { value: 0 | data_options.indexOf(settings.dataRow2), - min: 0, max: 3, + min: 0, max: 4, format: v => data_options[v], onchange: v => { settings.dataRow2 = data_options[v]; @@ -43,7 +43,7 @@ }, 'Row 3': { value: 0 | data_options.indexOf(settings.dataRow3), - min: 0, max: 3, + min: 0, max: 4, format: v => data_options[v], onchange: v => { settings.dataRow3 = data_options[v]; From 9551f7751033f2b3fabd411cb2bae58945ba942d Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 3 Jan 2022 17:38:02 +0100 Subject: [PATCH 426/476] Show large text for alarm --- apps/lcars/lcars.app.js | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 36a335a81..8aa31f18b 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -23,6 +23,7 @@ let cBlue = "#0094FF"; let cOrange = "#FF9900"; let cPurple = "#FF00DC"; let cWhite = "#FFFFFF"; +let cRed = "#FF0000"; /* * Global lcars variables @@ -79,12 +80,6 @@ var iconSatellite = { buffer : require("heatshrink").decompress(atob("pMkyQC/ATGXhIRPyNl0gmPjlwCJ9ly1aCJ1c+fHJR1Hy1ZJR1I+fPnlx6QRLpe+/JKBr5KMuYjBJQMdCJce/fvJQW0CJUlEYQCBSpvvJQbXJjl0NwnzNxGQwEOnHhgF78+WqQyIrFx48cAQXz4ShJgAABh0+8cP//9LJEhg4jDuP3//0LhGQgYlBgeAn///5cIy8MuAmDCIP/9I4HkmCEYMOgHfCQWkCI0cuBuDgF/CIP+CI1Ny1IkeAgHANwIAB/QRFrj7BhkxEwQRC/4RFpbXDgSVBg4RCSorXDI4MJAQMfCIP8cwImDn37fwN58+kwHgLgSVFub7CI4NyBAJKDLgkuEYX78+evKtCLg0jEYRKC58JMoRcFkwjDJQTFDl65EkojEAQMdcwn/+gFC3YjEJQLXEpYRDWwQmEdI6SHAQO0CJUkx4jDF4gCIJQgRMXIjCEARIjCCJ2XEYPKCJqJBJQIROcAUpCJ0kybaDARtdCKAC2kAA=")) }; -var iconAlarm = { - width : 50, height : 50, bpp : 3, - transparent : 1, - buffer : require("heatshrink").decompress(atob("kmSpICEp//BAwCJn/+CJ8k//5CKAABCJs8uPH//x48EI5YjCAARNKEYUcv//jgFBExEnEYoAC+QmHIgIgC/gpCuPBCI2fIgU4AQXjA4P8CIuTEYZKBAolwHApXBEAWP//jxwpBAALaFDoYCIiQmDDIP4EAT+CEwnJEwYjLAQLaFEYomDKALmDNwoCIOIZuD8AkFgCYDHAQjMAQTdDNwOAEg0Dx0/cYeREZtxQYOTHgJuHOIvkXJy8DNwIACJQ8Ah4NDAAfxEZARHOIIkHg4jQAQb1CQ4KVJgEOnDIBSoIjNAQPBcAaVJcAKVBcDGOcD7OBMQM48BuH8f//JKCnhKNggRBkmfTQJxBEwhuD/gRCyVHJRlyCIVJXgYmB8ZQBAoIKBXIQmCOIt/NxAUCOIImCIgIpCBAJuDAQZEE/huIAQWTDgImBTYQGC8gRFcYpKFCI8kDwQAFCJBfBEAX/+IjBiQRIEw4jJAQc8v//NYwCIOgJrIJpA1OcwbaFAQWQA=")) -}; - var iconCharging = { width : 50, height : 50, bpp : 3, transparent : 5, @@ -193,24 +188,26 @@ function drawState(){ var current = new Date(); var hours = current.getHours(); - var iconImg = - isAlarmEnabled() ? iconAlarm : - Bangle.isCharging() ? iconCharging : - bat < 30 ? iconNoBattery : - Bangle.isGPSOn() ? iconSatellite : - hours % 4 == 0 ? iconSaturn : - hours % 4 == 1 ? iconMars : - hours % 4 == 2 ? iconMoon : - iconEarth; - g.drawImage(iconImg, 117, 107); - - // Alarm within symbol - g.setFontAntonioMedium(); - if(isAlarmEnabled()){ + if(!isAlarmEnabled()){ + var iconImg = + Bangle.isCharging() ? iconCharging : + bat < 30 ? iconNoBattery : + Bangle.isGPSOn() ? iconSatellite : + hours % 4 == 0 ? iconSaturn : + hours % 4 == 1 ? iconMars : + hours % 4 == 2 ? iconMoon : + iconEarth; + g.drawImage(iconImg, 117, 107); + } else { + // Alarm within symbol + g.setFontAntonioMedium(); g.setFontAlign(0, 0, 0); - g.setColor(cWhite); - g.drawString(getAlarmMinutes(), 117+25, 107+25+1); + g.setColor(cRed); + g.drawString("ALARM", 117+25, 107); + g.setFontAntonioLarge(); + g.drawString(getAlarmMinutes(), 117+25, 107+35); } + g.setFontAlign(-1, -1, 0); } From 4856788e9eb13802d6be8688242872dd74c922b4 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 3 Jan 2022 17:48:57 +0100 Subject: [PATCH 427/476] Minor color changes --- apps/lcars/lcars.app.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 8aa31f18b..1ba16fc59 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -23,7 +23,6 @@ let cBlue = "#0094FF"; let cOrange = "#FF9900"; let cPurple = "#FF00DC"; let cWhite = "#FFFFFF"; -let cRed = "#FF0000"; /* * Global lcars variables @@ -202,7 +201,7 @@ function drawState(){ // Alarm within symbol g.setFontAntonioMedium(); g.setFontAlign(0, 0, 0); - g.setColor(cRed); + g.setColor(cPurple); g.drawString("ALARM", 117+25, 107); g.setFontAntonioLarge(); g.drawString(getAlarmMinutes(), 117+25, 107+35); From 9ecfb20fbc1f74b1121bbcf4206b53faaf67cc30 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 3 Jan 2022 17:56:10 +0100 Subject: [PATCH 428/476] Updated colors --- apps/lcars/lcars.app.js | 3 ++- apps/lcars/screenshot.png | Bin 4798 -> 4732 bytes 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 1ba16fc59..9d125db4a 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -173,6 +173,7 @@ function drawLock(){ g.drawString("NOCON", 128, 33); } if(Bangle.isLocked()){ + g.setColor(cPurple); g.drawString("LOCK", 128, 53); } } @@ -201,7 +202,7 @@ function drawState(){ // Alarm within symbol g.setFontAntonioMedium(); g.setFontAlign(0, 0, 0); - g.setColor(cPurple); + g.setColor(cOrange); g.drawString("ALARM", 117+25, 107); g.setFontAntonioLarge(); g.drawString(getAlarmMinutes(), 117+25, 107+35); diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 4d4911227dc8ce48bd8db53c3947900c4e8ac87e..385273048d77e884dd0ebfb66931ccc68d884ca1 100644 GIT binary patch delta 4726 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 Eg5O2u&j0`b delta 4793 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 TQ(~2;00000NkvXXu0mjfvsL(J From a58f32b042b1af718b6d7543c1611b5c7b522b86 Mon Sep 17 00:00:00 2001 From: David Peer Date: Mon, 3 Jan 2022 19:33:49 +0100 Subject: [PATCH 429/476] Performane improvements --- apps/lcars/lcars.app.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 9d125db4a..f9b1e410e 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -183,6 +183,7 @@ function drawState(){ return; } + g.clearRect(110, 90, g.getWidth(), 170); g.setColor(cWhite); var bat = E.getBattery(); var current = new Date(); @@ -197,7 +198,7 @@ function drawState(){ hours % 4 == 1 ? iconMars : hours % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 117, 107); + g.drawImage(iconImg, 117, 104); } else { // Alarm within symbol g.setFontAntonioMedium(); @@ -522,6 +523,11 @@ Bangle.on("drag", e => { } else { increaseAlarm(); } + + // Only update the state and return to + // avoid a full draw as this is much faster. + drawState(); + return; } if(lcarsViewPos == 1){ From 3909c912bcb30389f42b9be6f9d7d1eb61096a45 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Mon, 3 Jan 2022 19:57:42 +0100 Subject: [PATCH 430/476] WIDGET widbatpc: 0.15: Added option to always display the icon when charging (useful if 'hide if charge greater than' is enabled) --- apps.json | 2 +- apps/widbatpc/ChangeLog | 1 + apps/widbatpc/settings.js | 6 ++++++ apps/widbatpc/widget.js | 3 ++- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 7d8faec91..073c6ded5 100644 --- a/apps.json +++ b/apps.json @@ -936,7 +936,7 @@ "id": "widbatpc", "name": "Battery Level Widget (with percentage)", "shortName": "Battery Widget", - "version": "0.14", + "version": "0.15", "description": "Show the current battery level and charging status in the top right of the clock, with charge percentage", "icon": "widget.png", "type": "widget", diff --git a/apps/widbatpc/ChangeLog b/apps/widbatpc/ChangeLog index 99822b5a9..273e611a4 100644 --- a/apps/widbatpc/ChangeLog +++ b/apps/widbatpc/ChangeLog @@ -11,3 +11,4 @@ 0.12: Fixed for Bangle 2 0.13: Fillbar setting added, see README 0.14: Fix drawing the bar when charging +0.15: Added option to always display the icon when charging (useful if 'hide if charge greater than' is enabled) diff --git a/apps/widbatpc/settings.js b/apps/widbatpc/settings.js index b7a5db9e6..b45fc6749 100644 --- a/apps/widbatpc/settings.js +++ b/apps/widbatpc/settings.js @@ -13,6 +13,7 @@ 'fillbar': false, 'charger': true, 'hideifmorethan': 100, + 'alwaysoncharge': false, } // ...and overwrite them with any saved values // This way saved values are preserved if a new version adds more settings @@ -68,6 +69,11 @@ format: x => x+"%", onchange: save('hideifmorethan'), }, + 'Show on charge': { // Not sure if this is readable enough in the 'big' menu + value: s.alwaysoncharge, + format: onOffFormat, + onchange: save('alwaysoncharge'), + }, } E.showMenu(menu) }) diff --git a/apps/widbatpc/widget.js b/apps/widbatpc/widget.js index 3e5ff47b4..8791b9fe3 100644 --- a/apps/widbatpc/widget.js +++ b/apps/widbatpc/widget.js @@ -29,6 +29,7 @@ 'percentage': true, 'charger': true, 'hideifmorethan': 100, + 'alwaysoncharge': false, }; Object.keys(DEFAULTS).forEach(k=>{ if (settings[k]===undefined) settings[k]=DEFAULTS[k] @@ -67,7 +68,7 @@ var w = 40; if (Bangle.isCharging() && setting('charger')) w += 16; - if (E.getBattery() > setting('hideifmorethan')) + if (setting('alwaysoncharge') == false && E.getBattery() > setting('hideifmorethan')) w = 0; var changed = WIDGETS["batpc"].width != w; WIDGETS["batpc"].width = w; From 61797894afbc096a6a1bd327297ae8fe01d0e9b2 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Mon, 3 Jan 2022 20:28:10 +0100 Subject: [PATCH 431/476] WIDGET widbatpc: 0.15: Added option to always display the icon when charging (useful if 'hide if charge greater than' is enabled) --- apps/widbatpc/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widbatpc/widget.js b/apps/widbatpc/widget.js index 8791b9fe3..16aea5dae 100644 --- a/apps/widbatpc/widget.js +++ b/apps/widbatpc/widget.js @@ -68,7 +68,7 @@ var w = 40; if (Bangle.isCharging() && setting('charger')) w += 16; - if (setting('alwaysoncharge') == false && E.getBattery() > setting('hideifmorethan')) + if ((setting('alwaysoncharge') == false && Bangle.isCharging()) && E.getBattery() > setting('hideifmorethan')) w = 0; var changed = WIDGETS["batpc"].width != w; WIDGETS["batpc"].width = w; From 37c8fa092185659a73bc37aa65db343675eb7d14 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Mon, 3 Jan 2022 22:41:40 +0100 Subject: [PATCH 432/476] WIDGET widbatpc: 0.15: Added option to always display the icon when charging (useful if 'hide if charge greater than' is enabled) --- apps/widbatpc/widget.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/widbatpc/widget.js b/apps/widbatpc/widget.js index 16aea5dae..5386ffe22 100644 --- a/apps/widbatpc/widget.js +++ b/apps/widbatpc/widget.js @@ -68,8 +68,11 @@ var w = 40; if (Bangle.isCharging() && setting('charger')) w += 16; - if ((setting('alwaysoncharge') == false && Bangle.isCharging()) && E.getBattery() > setting('hideifmorethan')) + if (E.getBattery() > setting('hideifmorethan')) { w = 0; + if( Bangle.isCharging() && setting('alwaysoncharge') === true) + w = 56; + } var changed = WIDGETS["batpc"].width != w; WIDGETS["batpc"].width = w; return changed; From 8c10eb12dd05715ba96d1297b15143e249b1a325 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Mon, 3 Jan 2022 23:19:15 +0100 Subject: [PATCH 433/476] APP ios: 0.08: Added more app identifiers, added 'cannot display' in case a message goes empty because of replacements --- apps.json | 2 +- apps/ios/ChangeLog | 8 +++----- apps/ios/boot.js | 7 ++++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/apps.json b/apps.json index ed4eb25a8..609b7e002 100644 --- a/apps.json +++ b/apps.json @@ -116,7 +116,7 @@ { "id": "ios", "name": "iOS Integration", - "version": "0.07", + "version": "0.08", "description": "Display notifications/music/etc from iOS devices", "icon": "app.png", "tags": "tool,system,ios,apple,messages,notifications", diff --git a/apps/ios/ChangeLog b/apps/ios/ChangeLog index 5e60068aa..1873649f9 100644 --- a/apps/ios/ChangeLog +++ b/apps/ios/ChangeLog @@ -2,9 +2,7 @@ 0.02: Remove messages on disconnect 0.03: Handling of message actions (ok/clear) 0.04: Added common bundleId's -0.05: Added more bundleId's (app-id's which can be used to - determine a friendly app name in the notifications) +0.05: Added more bundleId's (app-id's which can be used to determine a friendly app name in the notifications) 0.06: Fix (not) popupping up old messages -0.07: Added more details from music (instead of Undefined) - Added more app identifiers - +0.07: Added more details from music (instead of Undefined), added more app identifiers +0.08: Added more app identifiers, added 'cannot display' in case a message goes empty because of replacements diff --git a/apps/ios/boot.js b/apps/ios/boot.js index 8ccfb617d..d317c23b0 100644 --- a/apps/ios/boot.js +++ b/apps/ios/boot.js @@ -66,6 +66,7 @@ E.on('notify',msg=>{ "com.apple.mobilecal": "Calendar", "com.apple.mobilemail": "Mail", "com.apple.mobilephone": "Phone", + "com.apple.mobileslideshow": "Pictures", "com.apple.MobileSMS": "SMS Message", "com.apple.Passbook": "iOS Wallet", "com.apple.podcasts": "Podcasts", @@ -83,6 +84,7 @@ E.on('notify',msg=>{ "com.ifttt.ifttt" : "IFTTT", "com.jumbo.app" : "Jumbo", "com.linkedin.LinkedIn" : "LinkedIn", + "com.marktplaats.iphone": "Marktplaats", "com.microsoft.Office.Outlook" : "Outlook Mail", "com.nestlabs.jasper.release" : "Nest", "com.netflix.Netflix" : "Netflix", @@ -90,6 +92,7 @@ E.on('notify',msg=>{ "com.skype.skype": "Skype", "com.skype.SkypeForiPad": "Skype", "com.spotify.client": "Spotify", + "com.storytel.iphone": "Storytel", "com.strava.stravaride": "Strava", "com.tinyspeck.chatlyio": "Slack", "com.toyopagroup.picaboo": "Snapchat", @@ -98,6 +101,8 @@ E.on('notify',msg=>{ "com.vilcsak.bitcoin2": "Coinbase", "com.wordfeud.free": "WordFeud", "com.zhiliaoapp.musically": "TikTok", + "io.robbie.HomeAssistant": "Home Assistant", + "net.weks.prowl": "Prowl", "net.whatsapp.WhatsApp": "WhatsApp", "nl.ah.Appie": "Albert Heijn", "nl.postnl.TrackNTrace": "PostNL", @@ -118,7 +123,7 @@ E.on('notify',msg=>{ new : msg.new, title : msg.title&&E.decodeUTF8(msg.title, unicodeRemap, replacer), subject : msg.subtitle&&E.decodeUTF8(msg.subtitle, unicodeRemap, replacer), - body : msg.message&&E.decodeUTF8(msg.message, unicodeRemap, replacer) + body : msg.message&&E.decodeUTF8(msg.message, unicodeRemap, replacer) || "Cannot display" }); // TODO: posaction/negaction? }); From 2d7245943373113cb4bc7e07ee3d46a9efe39d34 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Tue, 4 Jan 2022 00:44:48 +0100 Subject: [PATCH 434/476] APP ios: 0.08: Added more app identifiers, added 'cannot display' in case a message goes empty because of replacements --- apps.json | 2 +- apps/messages/ChangeLog | 1 + apps/messages/app.js | 1 + apps/messages/widget.js | 13 +++++++------ 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/apps.json b/apps.json index 609b7e002..179579cb9 100644 --- a/apps.json +++ b/apps.json @@ -77,7 +77,7 @@ { "id": "messages", "name": "Messages", - "version": "0.14", + "version": "0.15", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 94848a26c..4049f3724 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -21,3 +21,4 @@ Add 'Delete All' option to message options Now update correctly when 'require("messages").clearAll()' is called 0.14: Hide widget when all unread notifications are dismissed from phone +0.15: Fix: Get dynamic dimensions of notify icon, fixed notification font diff --git a/apps/messages/app.js b/apps/messages/app.js index 79009e77e..345d2115a 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -243,6 +243,7 @@ function showMessage(msgid) { checkMessages({clockIfNoMsg:1,clockIfAllRead:1,showMsgIfUnread:1}); }}); } + g.setFont(fontMedium); lines = g.wrapString(msg.body, g.getWidth()-10); var body = (lines.length>4) ? lines.slice(0,4).join("\n")+"..." : lines.join("\n"); layout = new Layout({ type:"v", c: [ diff --git a/apps/messages/widget.js b/apps/messages/widget.js index f01d22ec7..05622b162 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,9 +1,10 @@ -WIDGETS["messages"]={area:"tl",width:0,draw:function() { +WIDGETS["messages"]={area:"tl", width:0, ICONS:[atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA=="),atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA==")], //icons should be equal size or first larger +draw:function() { Bangle.removeListener('touch', this.touch); if (!this.width) return; var c = (Date.now()-this.t)/1000; - g.reset().clearRect(this.x,this.y,this.x+this.width,this.y+23); - g.drawImage((c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y); + g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+this.ICONS[0].charCodeAt(1)); + g.drawImage(this.ICONS[c&1], this.x, this.y); //if (c<60) Bangle.setLCDPower(1); // keep LCD on for 1 minute let settings = require('Storage').readJSON("messages.settings.json", true) || {}; if (settings.repeat===undefined) settings.repeat = 4; @@ -17,7 +18,7 @@ WIDGETS["messages"]={area:"tl",width:0,draw:function() { WIDGETS["messages"].t=Date.now(); // first time WIDGETS["messages"].l=Date.now()-10000; // last buzz if (quiet) WIDGETS["messages"].t -= 500000; // if quiet, set last time in the past so there is no buzzing - WIDGETS["messages"].width=64; + WIDGETS["messages"].width=this.ICONS[0].charCodeAt(0); Bangle.drawWidgets(); Bangle.setLCDPower(1);// turns screen on },hide:function() { @@ -36,7 +37,7 @@ WIDGETS["messages"]={area:"tl",width:0,draw:function() { b(); },touch:function(b,c) { var w=WIDGETS["messages"]; - if (!w||!w.width||c.xw.x+w.width||c.yw.y+23) return; + if (!w||!w.width||c.xw.x+w.width||c.yw.y+w.ICONS[0].charCodeAt(1)) return; load("messages.app.js"); }}; /* We might have returned here if we were in the Messages app for a @@ -45,4 +46,4 @@ want to buzz but should still show that there are unread messages. */ if (global.MESSAGES===undefined) (function() { var messages = require("Storage").readJSON("messages.json",1)||[]; if (messages.some(m=>m.new)) WIDGETS["messages"].show(true); -})(); +})(); \ No newline at end of file From e66210b85d9351612d1a960af464a7f9ddcdde9b Mon Sep 17 00:00:00 2001 From: kyleplo <31634240+kyleplo@users.noreply.github.com> Date: Mon, 3 Jan 2022 19:50:09 -0500 Subject: [PATCH 435/476] Create touchmenu.boot.js --- apps/touchmenu.boot.js | 197 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 apps/touchmenu.boot.js diff --git a/apps/touchmenu.boot.js b/apps/touchmenu.boot.js new file mode 100644 index 000000000..93a0ba1c8 --- /dev/null +++ b/apps/touchmenu.boot.js @@ -0,0 +1,197 @@ +E.showMenu = function(items) { + const gw = g.getWidth(); + const gh = g.getHeight(); + Bangle.removeAllListeners("drag"); + if(!items){ + delete m; + g.clearRect(0, 30, gw, gh - 30); + return false; + } + var loc = require("locale"); + var m = { + info: { + title: "Menu", + cB: g.theme.bg, + cF: g.theme.fg, + cHB: g.theme.bgH, + cHF: g.theme.fgH, + cAB: g.theme.bg2, + cAF: g.theme.fg2, + predraw : () => {}, + preflip : () => {} + }, + scroll: 0, + items: [], + selected: -1, + draw: () => { + g.reset().setFont('12x20'); + m.info.predraw(g); + g.setColor(m.info.cB).fillRect(0, 50, gw, gh - 30).setColor(m.info.cF); + m.items.forEach((e, i) => { + const s = (i * 48) - m.scroll + 50; + if(s < 30 || s > gh - 74){ + return false; + } + if(i == m.selected){ + g.setColor(m.info.cHB).fillRect(0, s, gw, Math.min(s + 48, gh - 30)).setColor(m.info.cHF); + }else{ + g.setColor(m.info.cF); + } + g.drawString(e.title, (e.icon ? 30 : 10), s + 5); + if(e.icon){ + g.drawImage(e.icon, 5, s + 5); + } + if(e.type && s < gh - 72){ + if(e.format){ + g.setFontAlign(1, -1, 0).drawString(e.format(e.value), gw - 10, s + 25).setFontAlign(-1, -1, 0); + }else{ + g.setFontAlign(1, -1, 0).drawString(e.value, gw - 10, s + 25).setFontAlign(-1, -1, 0); + } + } + }); + g.setColor(m.info.cAB).fillRect(0, 30, gw, 50); + g.setColor(m.info.cAF).drawString(m.info.title, (m.back ? 30 : 10), 32); + if(m.back){ + g.drawLine(5, 40, 20, 40); + g.drawLine(5, 40, 15, 33); + g.drawLine(5, 40, 15, 47); + } + m.info.preflip(g, m.scroll > 0, m.scroll < (m.items.length - 1) * 48); + }, + select: (x, y) => { + if(m.selected == -1 || m.selected !== Math.max(Math.min(Math.floor((y + m.scroll - 50) / 48), m.items.length - 1), 0)){ + if(y){ + if(y < 50 || y > gh - 30){ + return false; + }else{ + m.selected = Math.max(Math.min(Math.floor((y + m.scroll - 50) / 48), m.items.length - 1), 0); + } + }else{ + m.selected = Math.floor(m.scroll / 48); + } + m.draw(); + }else{ + if(m.items[m.selected].type && m.items[m.selected].type === "boolean"){ + m.items[m.selected].value = !m.items[m.selected].value; + m.items[m.selected].onchange(m.items[m.selected].value); + m.draw(); + }else if(m.items[m.selected].type && m.items[m.selected].type === "number"){ + if(x && x < (gw / 2)){ + m.items[m.selected].value = m.items[m.selected].value - (m.items[m.selected].step ? m.items[m.selected].step : 1); + }else{ + m.items[m.selected].value = m.items[m.selected].value + (m.items[m.selected].step ? m.items[m.selected].step : 1); + } + if(m.items[m.selected].value > (m.items[m.selected].max ? m.items[m.selected].max : Infinity)){ + m.items[m.selected].value = m.items[m.selected].min ? m.items[m.selected].min : 0; + } + if(m.items[m.selected].value < (m.items[m.selected].min ? m.items[m.selected].min : 0)){ + m.items[m.selected].value = m.items[m.selected].max ? m.items[m.selected].max : 10; + } + m.items[m.selected].onchange(m.items[m.selected].value); + m.draw(); + }else{ + if(m.items[m.selected]){ + m.items[m.selected](); + } + } + } + }, + move: d => { + m.scroll += (d * 48); + m.scroll = Math.min(Math.max(m.scroll, 0), (m.items.length - 1) * 48); + m.selected = Math.max(Math.min(Math.floor((m.scroll - 50) / 48), m.items.length - 1), 0); + m.draw(); + }, + }; + Object.keys(items).forEach(i => { + if(i == ""){ + m.info = Object.assign(m.info, items[i]); + }else if(i === "< Back" && items[i]){ + m.back = items[i]; + }else if(items[i]){ + m.items.push(items[i]); + m.items[m.items.length - 1].title = loc.translate(i); + if(items[i].hasOwnProperty("value")){ + if(typeof items[i].value === "boolean"){ + m.items[m.items.length - 1].type = "boolean"; + }else{ + m.items[m.items.length - 1].type = "number"; + } + } + } + }); + m.info.title = loc.translate(m.info.title); + m.draw(); + Bangle.on("drag", d => { + if(!d.b){ + return false; + } + if(d.dx == 0 && d.dy == 0){ + if(d.x < 30 && d.y < 50){ + m.back(); + return false; + } + m.select(d.x, d.y); + }else{ + m.selected = -1; + m.scroll -= d.dy; + m.scroll = Math.min(Math.max(m.scroll, 0), (m.items.length - 1) * 48); + m.draw(); + } + }); + return m; +}; + +E.showAlert = function (e, t){ + if(!e){ + E.showMenu(); + return false; + } + return new Promise(r => { + const menu = { + "": { + "title": (t ? t : "Alert") + }, + Ok: () => { + E.showMenu(); + r(); + } + }; + menu[e] = () => {}; + E.showMenu(menu); + }); +}; +E.showMessage = E.showAlert; + +E.showPrompt = function (e, t){ + if(!e){ + E.showMenu(); + return false; + } + return new Promise(r => { + const menu = { + "": { + "title": (t && t.title ? t.title : "Choose") + } + }; + menu[e] = () => {}; + if(t && t.buttons){ + Object.keys(t.buttons).forEach(b => { + menu[b] = () => { + E.showMenu(); + r(t.buttons[b]); + }; + }); + }else{ + menu.Yes = () => { + E.showMenu(); + r(true); + }; + menu.No = () => { + E.showMenu(); + r(false); + }; + } + E.showMenu(menu); + }); +}; From 3fdd87e728413699ae64bd2f2911325769245c72 Mon Sep 17 00:00:00 2001 From: kyleplo <31634240+kyleplo@users.noreply.github.com> Date: Mon, 3 Jan 2022 19:52:34 -0500 Subject: [PATCH 436/476] Rename apps/touchmenu.boot.js to apps/touchmenu/touchmenu.boot.js --- apps/{ => touchmenu}/touchmenu.boot.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename apps/{ => touchmenu}/touchmenu.boot.js (100%) diff --git a/apps/touchmenu.boot.js b/apps/touchmenu/touchmenu.boot.js similarity index 100% rename from apps/touchmenu.boot.js rename to apps/touchmenu/touchmenu.boot.js From 868e5af855f2f2516979d86b60dfc50e04266373 Mon Sep 17 00:00:00 2001 From: kyleplo <31634240+kyleplo@users.noreply.github.com> Date: Mon, 3 Jan 2022 19:53:25 -0500 Subject: [PATCH 437/476] Create ChangeLog --- apps/touchmenu/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/touchmenu/ChangeLog diff --git a/apps/touchmenu/ChangeLog b/apps/touchmenu/ChangeLog new file mode 100644 index 000000000..c5277e465 --- /dev/null +++ b/apps/touchmenu/ChangeLog @@ -0,0 +1 @@ +0.01: App launched From d03fa628053b4acba96182bd716190846b0aab67 Mon Sep 17 00:00:00 2001 From: kyleplo <31634240+kyleplo@users.noreply.github.com> Date: Mon, 3 Jan 2022 19:58:37 -0500 Subject: [PATCH 438/476] Add files via upload --- apps/touchmenu/touchmenu.png | Bin 0 -> 1355 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/touchmenu/touchmenu.png diff --git a/apps/touchmenu/touchmenu.png b/apps/touchmenu/touchmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..58733cbc758c4597c2da0e508af523288e0a427d GIT binary patch literal 1355 zcmV-R1+@B!P)BE1ZQLxAY_vg;$?V;oX(lt{{G@3qJ`_O^!KmPq;Qw2}Cn0L9?Tam?khm;cmfj@-EE=vY<#k5o0f^m&*sM6pBI0EL{uRZtU4R5Z z`^X8`V)zNfJ8YaF;u6EP09P2E5Ad?jnUOMxUqvh^s*L``+lU9}BlcPZ2XpY-jyyG} zttleQMaed+noc9ry@UIIwng1*#M^^UkFzj+6yF25_LnMhmf?pGpH<}CbcnAmX|u%; z|7E#p3GpKUUAw%6atiT2#A8)^yd3Cssj4^8z$>TJnP(8+gLrkpJj%xIMEtceUz`ec zeo~wa<_{hK;NmJRuzL3+9o0iVC08s$)vACv7|KExH6jmbd4gn8^0FkllzkRT6fd|P0n zrwSVAXrbt(XrcJk;OyVRDf#{Yw^VBW$m{6QFhZvPBk<6w!tZERBfJcLd1$M3&)TehHS09YRtkN(Z(GDi^F2;vKBX;HY+Q*UEnTqUvgh@A9J5aYSek}G;8j! zqp=F+X_rylpF&#LEj%b>g+0Q~5^H*5N-?MwSLAe5T{?GXqX;9WfX;*4pXw6&V*io?m|<6;W0GAb4f<-njQ>$>Q>9MPr@ zwU=n+0I+*9IKpp9{{0u*d8K7@p9VPmCp-6AwmA>rtOL;dXv;Q$XXCx^0IWWyc=l3w zC&Xgk0yx!!!@*Zi8qcdA>-AfBZYACT*nGWS|NH%Vee(m<-vGFv{{#Oecnig2*2@3@ z061k>NoGw=04e|g00;m9hiL!=000010000Q0000000N)_00aO40096105G5f00aO4 z0096105AXm008*^PBs7l0JKR&K~!i3?btC6f;^IyoAU!P|eDqsjiKmY**5J14Mz!!nTE#e{-b Date: Mon, 3 Jan 2022 20:01:59 -0500 Subject: [PATCH 439/476] Update apps.json --- apps.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..3fc319361 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,18 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "touchmenu", + "name": "TouchMenu", + "version": "0.01", + "description": "Redesigned menu that uses the full touchscreen on the Bangle.js 2", + "icon": "touchmenu.png", + "type": "bootloader", + "tags": "tool", + "supports": ["BANGLEJS2"], + "storage": [ + {"name":"touchmenu.boot.js","url":"touchmenu.js"}, + ] } ] From deb46f9aa7fdb2b5efd544309c35a99d7516a531 Mon Sep 17 00:00:00 2001 From: kyleplo <31634240+kyleplo@users.noreply.github.com> Date: Mon, 3 Jan 2022 20:14:00 -0500 Subject: [PATCH 440/476] Create README.md --- apps/touchmenu/README.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 apps/touchmenu/README.md diff --git a/apps/touchmenu/README.md b/apps/touchmenu/README.md new file mode 100644 index 000000000..dfc65a754 --- /dev/null +++ b/apps/touchmenu/README.md @@ -0,0 +1,38 @@ +# TouchMenu + +A redesign of the built-in `E.showMenu()` to take advantage of the full touch screen on the Bangle.js 2. + +## Features + +- All of the features of the built-in `E.showMenu()` +- Icon support for menu items: + ```javascript + menu.items[0].icon = Graphics.createImage(...); + ``` +- Custom accent colors: + ```javascript + E.showMenu({ + "": { + cAB: g.theme.bg2, // Accent background + cAF: g.theme.fg2 // Accent foreground + } + }) + ``` +- Automatic back button detection - name a button `< Back` and it will be given a special position and icon + +## Controls + +- Scroll through the options +- Tap on an option to select it +- Tap on a button again to use it +- Tap on a selected Boolean to toggle it +- Tap on a selected number to change - tap the right side of the screen to decrease, left side to increase +- If detected, tap on the back button in the upper left to go back + +## Requests + +Contact information is on my website: [kyleplo](https://kyleplo.com) + +## Creator + +[kyleplo](https://kyleplo.com) From aa7938162fffccc9054cecab033d6ce7f455beee Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Mon, 3 Jan 2022 15:19:06 -1000 Subject: [PATCH 441/476] Fix leading zero for hours < 12 --- apps/slash/app.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/apps/slash/app.js b/apps/slash/app.js index 53ff2640a..f548bcaf7 100644 --- a/apps/slash/app.js +++ b/apps/slash/app.js @@ -54,20 +54,23 @@ function convertDate(date) { function draw() { var d = new Date(); var h = d.getHours(), m = d.getMinutes(); - var hour = (" "+h).substr(-2); var minutes = ("0"+m).substr(-2); g.reset(); // Convert to 12hr time mode - if (is12Hour && hour > 12) { - hour = hour - 12; - if (hour < 10) { - hour = "0" + hour; + if (is12Hour && h > 12) { + h = h - 12; + if (h < 10) { + h = "0" + h; } - } else if (hour == 0) { - hour = 12; + } else if (h < 12) { + h = "0" + h; + } else if (h == 0) { + h = 12; } + var hour = (" "+h).substr(-2); + // Draw the time, vector font g.setFont("Vector", 50); g.setFontAlign(1,1); // Align right bottom From 6da9121f24ec5655b84c92bb35c83e9f58ca83df Mon Sep 17 00:00:00 2001 From: Joseph Moroney Date: Tue, 4 Jan 2022 13:39:50 +1000 Subject: [PATCH 442/476] v1.00 - Added sonic clock app --- apps.json | 17 +++ apps/sonicclk/Changelog | 1 + apps/sonicclk/README.md | 13 ++ apps/sonicclk/app-icon.js | 1 + apps/sonicclk/app.js | 282 +++++++++++++++++++++++++++++++++++ apps/sonicclk/app.png | Bin 0 -> 372 bytes apps/sonicclk/screenshot.png | Bin 0 -> 6515 bytes 7 files changed, 314 insertions(+) create mode 100644 apps/sonicclk/Changelog create mode 100644 apps/sonicclk/README.md create mode 100644 apps/sonicclk/app-icon.js create mode 100644 apps/sonicclk/app.js create mode 100644 apps/sonicclk/app.png create mode 100644 apps/sonicclk/screenshot.png diff --git a/apps.json b/apps.json index e5e9f8f02..5856486c0 100644 --- a/apps.json +++ b/apps.json @@ -5062,5 +5062,22 @@ {"name":"ltherm.app.js","url":"app.js"}, {"name":"ltherm.img","url":"icon.js","evaluate":true} ] + }, + { + "id": "sonicclk", + "name": "Sonic Clock", + "version": "1.00", + "description": "A classic sonic clock featuring run, stop and wait animations.", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + {"name":"sonicclk.app.js","url":"app.js"}, + {"name":"sonicclk.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/sonicclk/Changelog b/apps/sonicclk/Changelog new file mode 100644 index 000000000..396b6b3f4 --- /dev/null +++ b/apps/sonicclk/Changelog @@ -0,0 +1 @@ +1.00 Added sonic clock app \ No newline at end of file diff --git a/apps/sonicclk/README.md b/apps/sonicclk/README.md new file mode 100644 index 000000000..a381e0a07 --- /dev/null +++ b/apps/sonicclk/README.md @@ -0,0 +1,13 @@ +# Sonic Clock + +A classic sonic clock featuring run, stop and wait animations. + +![Sonic Clock screenshot](screenshot.png) + +## Usage + +- Sonic will run when the screen is unlocked +- Sonic will stop when the screen is locked +- Sonic will wait when looking at your watch face (when `Bangle.on("twist", fn)` is fired). + +### Made with love by [Joseph](https://github.com/Johoseph) 🤗 diff --git a/apps/sonicclk/app-icon.js b/apps/sonicclk/app-icon.js new file mode 100644 index 000000000..33e22971b --- /dev/null +++ b/apps/sonicclk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkBiIA/AE0ZzIACBIgFFC7oTCylEzOIDYeZogX6LwWd7oYCAAOJC82UpoXFAAKnMC6x2CpIVFC/gSCxOYAYP///4C4X/DBIXWIIwWBDAWPAYIXedQJwG/8AgEP//wgAX2CwIADRoQXmSIoXtJAeEoi+C+lEoAcBogX7zOUondolEpvdAAQXgYIgXCAAwXlAAIYC6ENLx4XtAYMZDAvd6gWJC7IKJABgX/C74A/ADY")) diff --git a/apps/sonicclk/app.js b/apps/sonicclk/app.js new file mode 100644 index 000000000..7cd8ef448 --- /dev/null +++ b/apps/sonicclk/app.js @@ -0,0 +1,282 @@ +const vw = g.getWidth(); +const bgWidth = 384; + +const sonic = { + bpp: 4, + transparent: 1, +}; + +const defaultSonic = { + width: 36, + height: 62, + buffer: require("heatshrink").decompress(atob("iIADzIACA4gNECKYOComZxAVDogRXBQfdCQQABCLITCogRFCQIRYLAgAFCQwRQBoQCC///AYYRWGAoMBAAgRYCYf/gEAB4ICBCKrDDCL4UECMA3DolEB4IDBAAQRb7oMB7vdHIIRWCAYRCAAoRWCoozDCBQRRBQI3FERIRPPIbGBPIQiICKAQCdQRZDAYIRXCQIJB/4RDEhQRQGYP//7FEGpARQCAYREgEzERQRNAAIRCLIKkBCLg4CYoIABB5IRWAQQRcBoIODCRYRQB4INECLkRgH/ZAMACRgRSmbGBCIIFBmYWCCLAAC7oCBdgNEAgIRWBQY2B7oTBAwMzCYoRUBIIQBCQQGBHIYRUABwRRA=")), +}; + +const startingBuffers = [ + { + width: 49, + height: 63, + buffer: require("heatshrink").decompress(atob("iIAFzIAEyMRjICBABkZDAogCCxgRBxAACzOUpIzDFxmYC4WJzNEGYgyQzOd6lIDoJiNGQYwB7tEDoQxQI4NN7BPDGJ54BondQAgvPGCjDDGCQVCCAVESAOIx/4GJYuCSIQwBFwX/GJbyEAAmDn///AwJjLyDAAsz/4xBGBAvJGAfwhIwHF5QwDgAwHXwYADGB6+DAAY2EGBYzHGA8P+EAgLyKGBIBBgD3ObwVPGAMEoAwIe4+ZolEGAVEGBRfDAYOUpvd6gaBpvQF5IuBFoOJDANE7vdC4IEBF5h8DGAQABGQNBF5YuCGAgyDYZwxE6lDmcxR5gAFGINEmczF6IxCob1B+YxIF5AxCeoQxJzLNBAAQFBhOUoEDGAIxJjOQC4cJAoIvBgAwCGJIwWiEAgcwglEpOZGwgvCGBANBmcAaIJ2BC4cPC4QwIga3BmEIeoIwBDoJhDF4j5DBgIABgGIGAROBMIYvEilBGAgvDAARIBGQL0FA4IwFF4YABJQIyBoczF4lEGA0JCwWUEoPd7qBCzIwDgAwGF4YXBpvd6iyBzORGAVAgLEEF4YwCF4IwEMYMzGAjECC4YwBF4IwEycxic0GAsN7vRiMZDIQvDBwItBS4IqBGAgQBAgIXCzovCLwItBS4MwgAwCF4XTn/xGIiODF4QwCF40z/4xERwYvCGAQvF7vf+CUEEobvCAAJgEF4Xd/6UEXgTvDAANAMAwwFCwgwESBAwFC4owCF43f/vUoaSCABAvCMAv/aQKSDAA8UF4JgG7/0oIWJGAhgG/9EC5YwCSA5eKFQiQIC5sQF4QwD6hfMGpAvBL5g1IhovVGAQvUGAMEF6owBF6owB")), + }, + { + width: 42, + height: 62, + buffer: require("heatshrink").decompress(atob("iIADzIAEA4QNEAAwUSBwOIAAWZogXECjgWFzPdogECCj5pDondIggUeSAYUjCISRDCQX/CpIUTXQgAEmf/CoIUaCZIUDgAUZRoYADCkIXHCg4BBgAUZX4y+BogUCogUccwgTB7vdCwIEBFA4UTHQYACCgQACogoJCiYAFCoYTHCigTHCoQnICioaJCRwUUHYbhBHpwUTXoQTCmczCpgUTcwYUB/8zAIIUfgDeBCoQUC/4UeRYQPBCoITCHxQUXCYMAgAVBmboKCjCUCAAQPFToIUaMgOIAAIUGBoIUYCoS9DNYIVECYwUWmYVBcIYVBokRBQIUbBoLhB7pjFOYQTGCixpCAwidCCY4UVCoYGFCYIUeBwLaGCZYUVDQ4TRChA")), + }, + { + width: 34, + height: 60, + buffer: require("heatshrink").decompress(atob("iIADzIADBAgOECCALBxAABAYIUDxAQVCQQNBogVFCDAAB7oRFCCwPCogQcNoQQCBoP/CI4QPS4gACmf/CIQQTBwwQEgGIfoQQPfIg1ECC6XFCA4ACCCYRFolECAVECCq5CbobeBAAPdCCgPECAYADoggHCCIRFB4YQQXYwSDOgwQPAAoQDBwMzmYRICB5SCGIYQZB4h0CEBoQKmf/oj/CCQQgHCB4PBAAJ1CxAWBEBAQRmYPBAgJCKCCIyCfoYQXCIKQBB4ndGoIQWiL4BgDaBS4IPBGw4QPBwQSCAgMzCoScECCg4FAAQQVB4IREABAQSAAQtGCCoRDOQYiMCBpxGCCoA==")), + }, + { + width: 44, + height: 62, + buffer: require("heatshrink").decompress(atob("iIAEzIADBAgPFCrIQBxAABAYIZDxAVfC4QSBogaFCsQAB7oWFCsAUCogVmSAQVCCQP/CxgVUYggACmf/CwQVdCYwVEgGIgAVbSoQADCsgYGCowACCroWFolECoVECr7wCAALyB7oXBAYJCJCqgUECoYADokzmYWFCrYWFNoIVceQwXDS4QUBCrYACRwQVDAoIXBCrznCMwRAFAAYpFCqf/mf/CgKZFohQGCrIACS4hFCCQ3dIgIVXIQIUDxAVIBAIVXCYJAFxGITIIVfCwMziOZAIIXEAAIVeAAQFBgBFEDITADCrUAAAoeDCwP/IAX/CrAPBog/CJQoWBHwJsFCrAWBCYpqCCgQNECqwUBCpJrCBooVUIBgABEQwVWokzChRPDCrA/NKIgxJCp4FEAB4VVA")), + }, + { + width: 38, + height: 62, + buffer: require("heatshrink").decompress(atob("iIADzIADBAgOECSgNBxAABAYIWDxASZCgQPBogXFCTgAB7oTFCTQRCogSgPYQSCB4P/CZISRVIgACmf/CYQSXCAwSEgGIgASVdgbvDCToVGCQwACCS4TFolECQVECTLPCe4b4BAAPdCTARECQYADogkJCSYTFCIoSSaIwUDEYwSTAATKCCQa4GCSwRC/8zog3CehASYaIkAmYTGCSYTBCIISEBIITGCSStEZ4YSceo7PBQpASSBAQVFaBISRgChBAIIRCxAkKCSAPBeQI5CK4ITG7oJBCSgRCPoYSFCIISVTwaiEzIREEAISTABH/AAIDBG4YSce4IAB/43MCSQRD7q1CEhwSQRwS1CCTqzDWwgSTA==")), + }, + { + width: 40, + height: 60, + buffer: require("heatshrink").decompress(atob("iIADzIAEA4QNEAAoTRBoOIAAWZogWECbQVFzPdogECCbpkDondIIgTcRIYThCASKDCIX/ChATSWIgAEmf/CgITYCRITDgATXQwYADCb4WHCY4BBgATXWwy1BogTCogTabYgSB7vdCoIDBEwwTSG4YACB4QACogmICaQAFCgYSGCaYSHCgQlHCagZIWIISNCaQ5DmYTB/8zCbq0DogThbYgTDExwTQWIszmazKCagWFbQNEgATcHwpoBomZgAULCaYUFgA8SCZlE7q5DHIITdBQPda4ITDRpQTXMQoUJCbLhCCgUzCgwTWCgIJFMxATVCgQABBYoACCa4IEBQwAICZwA=")), + }, + { + width: 36, + height: 60, + buffer: require("heatshrink").decompress(atob("iIANzIPOCI+ZABWICKwTDxGZogDBAAIRaHAfdCQoRXKQdECLhWCBIQRBAgP/CQwRQB4YAFmf/CQQRUK4YRIgGIgARUdIoReCQgRGAAQRVCQtEogRCogRXBoLqEdYIAB7oRWCAczmYRCAAdEEQ4RNOIR4CCQoQECKJxBogQCCIJcCPYPdCKo1CCIwIBG4QRUSYZ8BGgszUoQRSFIQSBdQbGDQQIVBCKIQCGILJCCAYRBRIKuCCKf/xARIiIRYK4ZYExBYDCKjDBxGICQdEAYQQCCKjcBBQKjFGgayDCKYAGT4gRSCQYRICAgRVCRYRYcIIRdCQSZCG44YFCKArCEiARQAAYTCChwRKA==")), + }, + { + width: 34, + height: 60, + buffer: require("heatshrink").decompress(atob("iIADzIADBAgOECCALBxAABAYIUDxAQVCQQNBogVFCDAAB7oRFCCwPCogQcNoQQCBoP/CI4QPS4gACmf/CIQQTBwwQEgGIfoQQPfIg1ECC6XFCA4ACCCYRFolECAVECCq5C7oADCQLABCCgPBBwkACgogECBwJFCAoPDCCAPFJgJ5BKYJjECCBqBBwf/mYQBAoMzmYRCCCIpCBAIPCA4gQSB4RrBboY6CoggGCCC+DB4YQBOogQRXwYQGU4YQUSYRTEdQgQTWYQzDB4gQVKooABBwYQSRAIQECYgQCHoQQWHQIQDXYLdDCB4RELYQPDCCyOGXYIPKCCAPGCAIgOCBpBLCCKyDBxYQMA==")), + }, + { + width: 36, + height: 60, + buffer: require("heatshrink").decompress(atob("iIANzIPOCI+ZABWICKwTDxGZogDBAAIRaHAfdCQoRXKQdECLhWCBIQRBAgP/CQwRQB4YAFmf/CQQRUK4YRIgGIgARUdIoReCQgRGAAQRVCQtEogRCogRXBoLqEdYIAB7oRWCAczmYRCAAdEEQ4RNOIR4CCQoQECKJxBogQCCIJcCPYwRRGoQRGBAITCCKoACPgI0FUYQSGCJpNDdQbGDQQQRTJooQECIIMBCMMRCKhwDPIMALAoZBCLQADxAABCAQRXogOBUYgUBCLTIDAAQSB/4RYB4oAB/4QDWQYROYowADgDHCCLASGCIYJDCKI2MDQwRQCQgcGQwwRRBAIAGB44RPA==")), + }, + { + width: 34, + height: 60, + buffer: require("heatshrink").decompress(atob("iIADzIADBAgOECCALBxAABAYIUDxAQVCQQNBogVFCDAAB7oRFCCwPCogQcNoQQCBoP/CI4QPS4gACmf/CIQQTBwwQEgGIfoQQPfIg1ECC6XFCA4ACCCYRFolECAVECCq5CbobeBAAPdCCgPDmczCAQADoggGCBkAA4RPBCIoPDCCAPDCAZXCOgoQQJYgQEBwJbBCIQQUBAIxFCCgPDboi7DEA4QPXwYPDCAJ1GCDQJCA4YQPB4hTEdQYQXgCXDB4YQVawQDBxAFBBwYQVAAYQBGAoABCCCqBBAcAAAIQGXYQQPCIcAYApACCCgPFAAX/XoQ5FCCwPBGQIPFCCIREmYOCB44QRTAabHCCAA==")), + }, +]; + +const stoppingBuffers = [ + { + width: 44, + height: 60, + buffer: require("heatshrink").decompress(atob("iIAEzIACA4gOFAAwVTCQVEzOIDIdECsAWC7oWCAAIVkogVFCwIVgNggAECsARCAQX//4VC/4WJCqg8FCgIWCAQIVdM43/gEACYICBCriVBAAQVmIg4VmIQdETAVEogZBogVhzNE7oTB7oACCoYbBCrCbECQgVFIoIVeCwcACg4VbN4xrGCrgCBBwMAC4QNBBwYVeM4IABIYYABBgIUGCqv/iK1CCQOINwdEAwIVDC4QVVmf/G4QNBCooFCCoRRBCqv//4WBCpJsECrb0DC4QVDYYgHBCq8zCohEDNAIGBCrgTBCob4DZAQGCCgYZBCqoICAAqUBdwQUCKYLaCCsACBCwP/IAP/IBQVVCgQECCgRrBmYVfAAhACe4QUOCqzwCCoKCLCrYWDCiIVWeQYVY")), + }, + { + width: 48, + height: 60, + buffer: require("heatshrink").decompress(atob("iIAEzIAFBIYQFAAwXXDAVEzOIxAaCogXlDAPdDAYZBC8wPBC4oYBC8h2FC84VBB4QCB///C4X/DBQXWIIwWBDAQCBC8AWGCQMAgAVBAQIXgOwR4DC9JLGC83/JIuIoimColEDYNEC7wYCHYIACondCoPdAAQXDDoIXYCoT7CC4gAFC4RLBC7IWHDAkACw4XZToY9CJI51EC7ZICAoIJBCAMADIQJCC8IADCAQXDbIJHBDgIWJC7AABCgOIPAdEAwIXDDJIXWCwQXFAoQXCcIIXnOwgXjDIQXDaogHBC8JKDOQIGBC8zaGAwQWDDYIXeDYkADAIPBUoX/IxAXeAQIYB/5GB/5GMC64WCAgQWCOoMzC8YAEIwVEapIXhDANEC4KONC7oYDCyYXYDAIABC7QA==")), + }, +]; + +const waitingBuffers = [ + { + width: 36, + height: 62, + offset: -1, + buffer: require("heatshrink").decompress(atob("iIADzIACA4gNECKYOComZxAVDogRXBQfdCQQABCLITCogRFCQIRYLAgAFCQwRQBoR7C/5aECKwwF/4ABBAQDBCK4TD/8AgH/HQYRUYYYRGzICCCKgUECIoDBCLA3DolEB4IDBAAQRb7oMB7vdHIIRWCAYRCAAoRWCoozDCBQRRBQI3FERIRPPIbGBPIQiICKAQCdQRZDAYIRXCQIJB/4RDEhQRQGYP//7FEGpARQCAYREgEzERQRNAAIRCLIKkBCLg4CYoIABB5IRWAQQRcBoIODCRYRQB4INECLkRgH/ZAMACRgRSmbGBCIIFBmYWCCLAAC7oCBdgNEAgIRWBQY2B7oTBAwMzCYoRUBIIQBCQQGBHIYRUABwRRA")), + }, + { + width: 38, + height: 62, + offset: 1, + buffer: require("heatshrink").decompress(atob("iIADzIACA4gNECSoPComZxAWDogSZBYfdCYQABCTYUCogSFCYISaLogAFCY4SRBwSCC/5fECTAzF/4ABBAQDBCTIUD/8AgH/HoYSWZwYSGzICCCSwVECQoDBCTQ6DolECAIDBAAQSd7oNB7vdHgISYCIYSCAAoSYCwo2DCJYSSBYI6FEhQSQQAbRBQAQkJCSIRCe4ReDAYISZCYIKB/4SDExYSRGwP//7QEHBISRCIYSEgEzEhYSOAAISCLwKtBCTw7CaAIABCBQSXAQQSeBwIPDCZgSRCAIOECT0RgH/aYMACYUzAgQSambRBBoIFBmdEgAAECSwAC7oCBfINECgIABCSwLDHIPdCgIRDEYgSWBYIRBCYSFBQwwSTABKpICR4A=")), + }, +]; + +const bg = { + width: 384, + height: 153, + bpp: 8, + transparent: 254, + buffer: require("heatshrink").decompress(atob("i4ASj0evF4pFIDKYA/AEp//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5/bx+PB5vX64RFC54v3P/4v/P/4v/P/4v/P/4v/P/4v7CY5/VHIKxZACYvvP/4v/P/4v/P4/GAAR/BAAJP/P/5P/P/5P/F8sjkYnBO4oAHP64vHGKJfdF7p//P/5//P/4dTP4dIpB//P/5//P/5//F+p/TIIpDXMIohLF95//P/5//P/4APj0eP/5//P/5//P/4vxB4Z/XAH4AfP/4A/P/4A/P/4A/P/4A/P/4A/AB5/JTIaXJWZobFDpovvP/5//P/5//P/5//P/5//P/5//AAIPFCpp/JEpoABIIZHBL7IvvR45//P/5//P/5//P/5//P/5//P/IbTP6IAbJIpLXF+Z//F/5//F/5//F/5//F/5//F/5/tAH5//AH5//AH5//AH5//AH5//AH5//AH5//AH5//AH4AP4wACP4IABI/5//I/5//I/5//I/5//I/5//I/6B7PoNIpBF/P/5F/P/5F/P/5F/P/5F/P/5F/AHMejx//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//P/5//AHfGAAR/BAAJH/P/5H/P/5H/P/5H/P/5H/P/5H/QPZ9BpFIIv5//Iv4Aj6XSP/4A/P/4A/P/4A96XSP/4A/ACcejx//P/5//AEplB6XSAYJ//AH5//AH5//AHJlB6XSAYJ//AH5//AH5//AGPSAARhBA4oABA4ILBA4p//AH5//AH5//AE/SAARhBA4oABA4ILBA4p//AH5//AH5//AE5dB6QACAofX64HFAoZ//AH5//AH5//AFJdB6QACAofX64HFAoZ//AH5//AH5//AFJdB6XS6/XAYIFLCYJ//AH5//AH5//AFJdB6XS6/XAYIFLCYJ//AH5//AH5//AFZfB6XS6/XhgAEA4ILBB4J//AH5//AH5//AFpfB6XS6/XhgAEA4ILBB4J//AH5//AH5//AE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")), +}; + +const topSpeed = 15; +const timeout = 200; +let currentSpeed = 0; +let currentSonic = -1; + +let drawTimeout, drawInterval; +let bgScroll = [0, null]; + +const start = () => { + if (drawTimeout) clearTimeout(drawTimeout); + if (drawInterval) clearInterval(drawInterval); + + drawInterval = setInterval(() => { + draw("start"); + bgScroll[0] += currentSpeed; + if (bgScroll[1]) bgScroll[1] += currentSpeed; + if (currentSpeed < topSpeed) currentSpeed++; + }, timeout); +}; + +const stop = () => { + if (drawTimeout) clearTimeout(drawTimeout); + if (drawInterval) clearInterval(drawInterval); + + drawInterval = setInterval(() => { + if (currentSpeed <= 0) { + clearInterval(drawInterval); + draw("reset"); + } else { + draw("stop"); + bgScroll[0] += currentSpeed; + if (bgScroll[1]) bgScroll[1] += currentSpeed; + currentSpeed--; + } + }, timeout); +}; + +const wait = () => { + currentSonic = -1; + currentSpeed = 0; + if (drawTimeout) clearTimeout(drawTimeout); + if (drawInterval) clearInterval(drawInterval); + Bangle.setLCDPower(1); + + drawInterval = setInterval(() => draw("wait"), timeout); + + setTimeout(() => { + clearInterval(drawInterval); + currentSonic = -1; + draw("reset"); + }, 7500); +}; + +const queueDraw = () => { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function () { + drawTimeout = undefined; + draw("reset"); + }, 60000 - (Date.now() % 60000)); +}; + +const drawSonic = (action) => { + let target; + + if (action === "reset" || currentSonic === -1) { + target = defaultSonic; + } else if (action === "start") { + target = startingBuffers[currentSonic]; + } else if (action === "stop") { + if (currentSonic > 1) currentSonic = 0; + target = stoppingBuffers[currentSonic]; + } else { + target = waitingBuffers[currentSonic]; + } + + sonic.width = target.width; + sonic.height = target.height; + sonic.buffer = target.buffer; + sonic.offset = target.offset; + + g.drawImage( + sonic, + vw / 2 - 30 + (50 - sonic.width) + (sonic.offset || 0), + 86 + (65 - sonic.height) + ); + + if (action === "start") { + if (currentSonic === startingBuffers.length - 1) { + currentSonic = 6; + } else { + currentSonic++; + } + } else if (action === "stop") { + if (currentSpeed <= 2) { + currentSonic = -1; + } else if (currentSpeed <= 14) { + currentSonic = 1; + } else { + currentSonic = 0; + } + } else { + if (currentSonic === waitingBuffers.length - 1) { + currentSonic = 0; + } else { + currentSonic++; + } + } +}; + +const drawTime = () => { + const x = vw / 2; + const y = 24 + 25; + + const date = new Date(); + const timeStr = require("locale").time(date, 1); + const dateStr = require("locale").date(date).toUpperCase(); + + g.setColor("#000"); + g.setFontAlign(0, 0).setFont("6x8", 5); + g.drawString(timeStr, x + 3, y + 2); + + g.setFont("6x8", 1.5); + g.drawString(dateStr, x + 1, y + 29); + + g.setColor("#fff"); + g.setFontAlign(0, 0).setFont("6x8", 5); + g.drawString(timeStr, x, y); + + g.setFont("6x8", 1.5); + g.drawString(dateStr, x, y + 28); +}; + +const draw = (action) => { + if (bgWidth - bgScroll[0] < 0) { + bgScroll[0] = bgScroll[1]; + bgScroll[1] = null; + } + + g.drawImage(bg, -bgScroll[0], 24); + + if (bgWidth - bgScroll[0] < vw) { + bgScroll[1] = bgScroll[0] - bgWidth; + g.drawImage(bg, -bgScroll[1], 24); + } + + drawSonic(action); + drawTime(); + if (action === "reset") queueDraw(); +}; + +g.setTheme({ bg: "#0099ff", fg: "#fff", dark: true }).clear(); + +Bangle.on("lock", (locked) => { + if (locked) { + stop(); + } else { + start(); + } +}); + +Bangle.on("twist", () => wait()); + +Bangle.setOptions({ + lockTimeout: 10000, + backlightTimeout: 12000, +}); + +Bangle.setUI("clock"); + +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +draw("reset"); + +if (Bangle.isLocked()) { + stop(); +} else { + start(); +} diff --git a/apps/sonicclk/app.png b/apps/sonicclk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..db359d1e58f497a51b621957bf476af89b6c846f GIT binary patch literal 372 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 Z;6HQd1dbxxA@~3Q002ovPDHLkV1fs|jBNk_ literal 0 HcmV?d00001 From 0e167ada67f86208fb6fb84cf5edd708295933d3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 4 Jan 2022 08:05:59 +0100 Subject: [PATCH 443/476] Lower line as battery indicator --- apps/lcars/lcars.app.js | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index f9b1e410e..07037b197 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -149,7 +149,7 @@ function printData(key, y){ } } -function drawHoriztonatlBgLine(color, x1, x2, y, h){ +function drawHorizontalBgLine(color, x1, x2, y, h){ g.setColor(color); for(var i=0; i Date: Tue, 4 Jan 2022 08:45:23 +0100 Subject: [PATCH 444/476] Design chnges --- apps/lcars/lcars.app.js | 55 +++++++++++++++++++++----------------- apps/lcars/screenshot.png | Bin 4732 -> 5112 bytes 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 07037b197..63e3a3a33 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -23,6 +23,7 @@ let cBlue = "#0094FF"; let cOrange = "#FF9900"; let cPurple = "#FF00DC"; let cWhite = "#FFFFFF"; +let cBlack = "#000000"; /* * Global lcars variables @@ -104,6 +105,7 @@ Graphics.prototype.setFontAntonioLarge = function(scale) { g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAPgAAAAAB8AAAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAAAD8AAAAAH/gAAAAP/8AAAAf//gAAA///AAAB//+AAAD//8AAAH//4AAAP//wAAAB//gAAAAP/AAAAAB+AAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAf////8AP/////4B//////Af/////8D8AAAAfgeAAAAA8DwAAAAHgeAAAAA8D//////gf/////8B//////AP/////wAf////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAAAHgAAAAAA8AAAAAAPgAAAAAB4AAAAAAf/////gP/////8B//////gP/////8B//////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAD/+AAP8A//wAP/gP/+AH/8D//wD//gfgAA//8DwAAf+HgeAAP/A8DwAH/gHgfgP/wA8D///4AHgP//+AA8A///AAHgB//AAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4AA/gAD/AAH/gA/4AA/+AP/AAH/4D/4AA//gfgA4AB8DwAPAAHgeAB4AA8DwAPgAHgfAD+AB8D//////gP/////4B//5//+AD/+H//gAH/AH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP4AAAAAP/AAAAAP/4AAAAP//AAAAP/x4AAAf/wPAAAf/gB4AAf/AAPAAP/AAB4AB//////gP/////8B//////gP/////8AAAAAPAAAAAAB4AAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//wD/AB///Af+AP//4D/4B///Af/gP//4B/8B4D4AAPgPAeAAA8B4DwAAHgPAfAAB8B4D////gPAf///4B4B////APAD///gAAAD//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///AAAP////4AH/////wB//////Af/////8D8APAA/geADwAB8DwAeAAHgeADwAA8D4AeAAPgf/j+AH8B/8f///gP/h///4Af8H//+AAPgP//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4AAAAAAPAAAAAAB4AAAABgPAAAA/8B4AAB//gPAAD//8B4AH///gPAH///8B4P//+AAPH//wAAB///gAAAP//AAAAB/+AAAAAP+AAAAAB+AAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4A/+AAf/w//+AP//v//4B//////Af/////8D4AfwAPgeAB8AA8DwAHAAHgeAB8AA8D4Af4APgf/////8B//////AP//v//4A//4//8AA/4A/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/+AAAAD//+D/gB///4f+AP///j/4D///8f/gfAAHgB8DwAA8AHgeAAHgA8DwAA8AHgfgAHgB8D//////gP/////4A/////+AD/////gAD////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAfgAAB+AD8AAAPwAfgAAB+AD8AAAPwAfgAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DBATExMTExMTExMTCw=="), 45+(scale<<8)+(1<<16)); }; + /* * Draw watch face */ @@ -117,36 +119,41 @@ function queueDraw() { } -function printData(key, y){ +function printData(key, y, c){ g.setFontAlign(-1,-1,0); + var text = "ERR"; + var value = "NOT FOUND"; if(key == "Battery"){ - var bat = E.getBattery(); - g.drawString("BAT:", 26, y); - g.drawString(bat+ "%", 65, y); + text = "BAT"; + value = E.getBattery() + "%"; } else if(key == "Steps"){ - var steps = getSteps(); - g.drawString("STEP:", 26, y); - g.drawString(steps, 65, y); + text = "STEP"; + value = getSteps(); } else if(key == "Temp."){ - var temperature = Math.floor(E.getTemperature()); - g.drawString("TMP:", 26, y); - g.drawString(temperature + "C", 65, y); + text = "TEMP"; + value = Math.floor(E.getTemperature()) + "C"; } else if(key == "HRM"){ - g.drawString("HRM:", 26, y); - g.drawString(hrmValue, 65, y); + text = "HRM"; + value = hrmValue; } else if (key == "VREF"){ - var voltage = E.getAnalogVRef().toFixed(2); - g.drawString("VREF:", 26, y); - g.drawString(voltage + "V", 65, y); + text = "VREF"; + value = E.getAnalogVRef().toFixed(2) + "V"; - } else { - g.drawString("NOT FOUND", 26, y); } + + g.setColor(c); + g.fillRect(133, y-2, 165 ,y+18); + g.fillCircle(164, y+8, 10); + g.setColor(cBlack); + g.drawString(text, 135, y); + + g.setColor(c); + g.drawString(value, 88, y); } function drawHorizontalBgLine(color, x1, x2, y, h){ @@ -183,7 +190,7 @@ function drawState(){ return; } - g.clearRect(110, 90, g.getWidth(), 170); + g.clearRect(20, 93, 77, 170); g.setColor(cWhite); var bat = E.getBattery(); var current = new Date(); @@ -198,16 +205,16 @@ function drawState(){ hours % 4 == 1 ? iconMars : hours % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 117, 104); + g.drawImage(iconImg, 29, 104); } else { // Alarm within symbol g.setFontAntonioMedium(); g.setFontAlign(0, 0, 0); g.setColor(cOrange); - g.drawString("ALARM", 117+25, 107); + g.drawString("ALARM", 29+25, 107); g.setColor(cWhite); g.setFontAntonioLarge(); - g.drawString(getAlarmMinutes(), 117+25, 107+35); + g.drawString(getAlarmMinutes(), 29+25, 107+35); } g.setFontAlign(-1, -1, 0); @@ -252,9 +259,9 @@ function drawPosition0(){ // Draw data g.setFontAlign(-1, -1, 0); g.setColor(cWhite); - printData(settings.dataRow1, 97); - printData(settings.dataRow2, 122); - printData(settings.dataRow3, 147); + printData(settings.dataRow1, 97, cOrange); + printData(settings.dataRow2, 122, cPurple); + printData(settings.dataRow3, 147, cBlue); // Draw state drawState(); diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index 385273048d77e884dd0ebfb66931ccc68d884ca1..ea57e979fcbbc7761a7b06bf69000c22d526cab9 100644 GIT binary patch delta 5110 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 YKi)^^b0eb_3;+NC07*qoM6N<$f=R!@)&Kwi delta 4727 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 Date: Tue, 4 Jan 2022 08:47:23 +0100 Subject: [PATCH 445/476] Updated readme --- apps/lcars/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 4630db1ea..97695a408 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -13,6 +13,7 @@ To contribute you can open a PR at this [GitHub Repo]( https://github.com/peerda * [Screen 1] Shows different states such as (charging, out of battery, GPS on etc.) * [Screen 1] Swipe up/down to activate an alarm. * [Screen 1] Shows 3 customizable datapoints on the first screen. + * [Screen 1] The lower orange line indicates the battery level. * [Screen 2] Display month graphs for steps + hrm on the second screen. From a614a398ccc420b95c8d0e0456ccd489c5506cee Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 4 Jan 2022 09:05:31 +0100 Subject: [PATCH 446/476] Minor design improvements --- apps/lcars/lcars.app.js | 5 +++-- apps/lcars/screenshot.png | Bin 5112 -> 5195 bytes 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 63e3a3a33..74d0450c0 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -148,12 +148,13 @@ function printData(key, y, c){ g.setColor(c); g.fillRect(133, y-2, 165 ,y+18); - g.fillCircle(164, y+8, 10); + g.fillCircle(161, y+8, 10); g.setColor(cBlack); g.drawString(text, 135, y); g.setColor(c); - g.drawString(value, 88, y); + g.setFontAlign(1,-1,0); + g.drawString(value, 130, y); } function drawHorizontalBgLine(color, x1, x2, y, h){ diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index ea57e979fcbbc7761a7b06bf69000c22d526cab9..b3dfd42000766a5bff8e62a6e5d66103ac4f2a9b 100644 GIT binary patch delta 5194 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 Ef?}il!TQ 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 YKi)^^b0eb_3;+NC07*qoM6N<$g2zF@sQ>@~ From b5b40b8db6e6d97713c3550df9d4c61d32268796 Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 4 Jan 2022 09:47:00 +0100 Subject: [PATCH 447/476] Extend TODO list --- apps/circlesclock/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/circlesclock/README.md b/apps/circlesclock/README.md index 27c0566d3..66d9afe08 100644 --- a/apps/circlesclock/README.md +++ b/apps/circlesclock/README.md @@ -13,6 +13,8 @@ It shows besides time, date and day of week the following information: ## TODO * Show weather information +* Configure which information to show in each circle +* Configure visibility of widgets ## Creator Marco ([myxor](https://github.com/myxor)) From 36a8623810e8f42db4708401dcf5d27b0a9e245d Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 09:37:59 +0000 Subject: [PATCH 448/476] check for duplicate apps --- bin/sanitycheck.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/sanitycheck.js b/bin/sanitycheck.js index fe59baa25..e50256fb6 100755 --- a/bin/sanitycheck.js +++ b/bin/sanitycheck.js @@ -76,8 +76,11 @@ function globToRegex(pattern) { const isGlob = f => /[?*]/.test(f) // All storage+data files in all apps: {app:,[file: | data:]} let allFiles = []; +let existingApps = []; apps.forEach((app,appIdx) => { if (!app.id) ERROR(`App ${appIdx} has no id`); + if (existingApps.includes(app.id)) ERROR(`Duplicate app '${app.id}'`); + existingApps.push(app.id); //console.log(`Checking ${app.id}...`); var appDir = APPSDIR+app.id+"/"; if (!fs.existsSync(APPSDIR+app.id)) ERROR(`App ${app.id} has no directory`); From 9d548ef5e697dcd659c3670f336984604cf09ff2 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 09:47:18 +0000 Subject: [PATCH 449/476] fix merge --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index e224e1576..4806955fe 100644 --- a/apps.json +++ b/apps.json @@ -5069,14 +5069,14 @@ "shortName":"AnDark", "version":"0.04", "description": "analog clock face without disturbing widgets", - "icon": "app_icon.png", + "icon": "andark_icon.png", "type": "clock", "tags": "clock", "supports" : ["BANGLEJS2"], "readme": "README.md", "storage": [ {"name":"andark.app.js","url":"app.js"}, - {"name":"andark.img","url":"app_icon.js ","evaluate":true} + {"name":"andark.img","url":"app_icon.js","evaluate":true} ] }, { From f9a34bf2c8052a0824434de8ff9f7e32fec7507c Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 10:03:30 +0000 Subject: [PATCH 450/476] fix icon --- apps/supf/icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/supf/icon.js b/apps/supf/icon.js index c06a65409..9b880b5e9 100644 --- a/apps/supf/icon.js +++ b/apps/supf/icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("ogA/AH4A/AElAdbgcEDq46FgEEQX5HGACZbBDjQeCDrocbAH4A/AH4A0gX/AAPzgEBAoX/BgIFDiEAn4FCkAdFgYXEDpQXBAocwDow4BHwIIDEAIdCHAIdDAQM/Dp4UBAQodxmYABDrK5DDrY7BmQdaPRAd4d6CPESo4ACDoQACDowXDHwMBDpI+Bn4jEAH4A/AH4A/AB9ADjcEogdbogA+K7oddWyywBDzQcHAH4A/AGAA=")) +require("heatshrink").decompress(atob("mEw4UBAoP/AAXnnNVAH4ACoEABZJXBgoLUGaIAIgILLbf4AUnWqweq1gEB4QEBBZ0OwEA9k7h3C2ALGlk4BZAeBBZAvCBZOv/gLJ2EABZOggE7hQLFL5U+1XDBYYEB3jB/AClABRMBqoAXEhAiCBZdQBY8FHTAAj")) From 61b214da81a0d2ca1f2bf9898e9fe9efb328683a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 10:13:20 +0000 Subject: [PATCH 451/476] Update version for #1167 --- apps.json | 2 +- apps/gpsinfo/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 63dab2467..9d8ce0930 100644 --- a/apps.json +++ b/apps.json @@ -1501,7 +1501,7 @@ { "id": "gpsinfo", "name": "GPS Info", - "version": "0.05", + "version": "0.06", "description": "An application that displays information about altitude, lat/lon, satellites and time", "icon": "gps-info.png", "type": "app", diff --git a/apps/gpsinfo/ChangeLog b/apps/gpsinfo/ChangeLog index 381412c16..3ff284cb8 100644 --- a/apps/gpsinfo/ChangeLog +++ b/apps/gpsinfo/ChangeLog @@ -2,3 +2,4 @@ 0.03: Show number of satellites while waiting for fix 0.04: Add Maidenhead readout of GPS location 0.05: Refactor to use 'layout' library for multi-device support +0.06: Added number of satellites in view and fixed crash with GPS time From c56044efcc0412748b3240b917bc828f3aa231ed Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 10:22:04 +0000 Subject: [PATCH 452/476] bump versions --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index f5d984143..7f1783dae 100644 --- a/apps.json +++ b/apps.json @@ -971,7 +971,7 @@ { "id": "widbt", "name": "Bluetooth Widget", - "version": "0.07", + "version": "0.08", "description": "Show the current Bluetooth connection status in the top right of the clock", "icon": "widget.png", "type": "widget", @@ -2184,7 +2184,7 @@ "id": "calculator", "name": "Calculator", "shortName": "Calculator", - "version": "0.04", + "version": "0.05", "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus.", "icon": "calculator.png", "screenshots": [{"url":"screenshot_calculator.png"}], From b7d5cbf9b6f174538e96a3f06ad42977eb772945 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 10:44:24 +0000 Subject: [PATCH 453/476] icon rename --- apps.json | 2 +- apps/promenu/{icons8-menu-48 (1).png => icon.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename apps/promenu/{icons8-menu-48 (1).png => icon.png} (100%) diff --git a/apps.json b/apps.json index 03ecb9ae1..0dee4f9d9 100644 --- a/apps.json +++ b/apps.json @@ -5107,7 +5107,7 @@ "name": "Pro Menu", "version": "0.01", "description": "Replace Bangle.js 1's built in menu function.", - "icon": "icons8-menu-48 (1).png", + "icon": "icon.png", "type": "boot", "tags": "system", "supports": ["BANGLEJS"], diff --git a/apps/promenu/icons8-menu-48 (1).png b/apps/promenu/icon.png similarity index 100% rename from apps/promenu/icons8-menu-48 (1).png rename to apps/promenu/icon.png From fdc519c3df64c555b9b98dedfbe65b2ff2918863 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Tue, 4 Jan 2022 11:58:04 +0100 Subject: [PATCH 454/476] Intial try to use weather condition code for icon selection --- apps/weather/app.js | 3 ++- apps/weather/lib.js | 49 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/apps/weather/app.js b/apps/weather/app.js index 8c8526fbd..5c6b29b64 100644 --- a/apps/weather/app.js +++ b/apps/weather/app.js @@ -9,7 +9,7 @@ var layout = new Layout({type:"v", bgCol: g.theme.bg, c: [ {filly: 1}, {type: "h", filly: 0, c: [ {type: "custom", width: g.getWidth()/2, height: g.getWidth()/2, valign: -1, txt: "unknown", id: "icon", - render: l => weather.drawIcon(l.txt, l.x+l.w/2, l.y+l.h/2, l.w/2-5)}, + render: l => weather.drawIcon(l, l.x+l.w/2, l.y+l.h/2, l.w/2-5)}, {type: "v", fillx: 1, c: [ {type: "h", pad: 2, c: [ {type: "txt", font: "18%", id: "temp", label: "000"}, @@ -47,6 +47,7 @@ function formatDuration(millis) { function draw() { layout.icon.txt = current.txt; + layout.icon.cond = current.code; const temp = locale.temp(current.temp-273.15).match(/^(\D*\d*)(.*)$/); layout.temp.label = temp[1]; layout.tempUnit.label = temp[2]; diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 7cb9a9f9b..f86a51a18 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -16,7 +16,7 @@ function scheduleExpiry(json) { function update(weatherEvent) { let json = storage.readJSON('weather.json')||{}; - + if (weatherEvent) { let weather = weatherEvent.clone(); delete weather.t; @@ -55,7 +55,7 @@ scheduleExpiry(storage.readJSON('weather.json')||{}); exports.drawIcon = function(cond, x, y, r) { var palette; - + if (B2) { if (g.theme.dark) { palette = { @@ -101,7 +101,7 @@ exports.drawIcon = function(cond, x, y, r) { }; } } - + function drawSun(x, y, r) { g.setColor(palette.sun); g.fillCircle(x, y, r); @@ -280,5 +280,46 @@ exports.drawIcon = function(cond, x, y, r) { return drawUnknown; } - chooseIcon(cond)(x, y, r); + /* + * Choose weather icon to display based on weather conditition code + * https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 + */ + function chooseIconByCode(code) { + const codeGroup = Math.round(code / 100); + switch (codeGroup) { + case 2: return drawThunderstorm; + case 3: return drawRain; + case 5: + switch (code) { + case 520: return drawShowerRain; + case 521: return drawShowerRain; + case 522: return drawShowerRain; + case 531: return drawShowerRain; + default: return drawRain; + } + break; + case 6: return drawSnow; + case 7: return drawMist; + case 8: + switch (code) { + case 800: return drawSun; + case 801: return drawFewClouds; + case 802: return drawCloud; + default: return drawBrokenClouds; + } + break; + default: return drawUnknown; + } + } + + const code = cond.code || -1; + if (code > 0) { + chooseIconByCode(code.code)(x, y, r); + } else { + chooseIcon(cond.txt)(x, y, r); + } + + console.log(cond); + + }; From 8a9e13b19caaf365680b18d86da28cc6ee4ac2c8 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 11:00:26 +0000 Subject: [PATCH 455/476] remove un-needed files --- apps/bluetoothdock/add_to_apps.json | 15 --------------- apps/scribble/add_to_apps.json | 14 -------------- 2 files changed, 29 deletions(-) delete mode 100644 apps/bluetoothdock/add_to_apps.json delete mode 100644 apps/scribble/add_to_apps.json diff --git a/apps/bluetoothdock/add_to_apps.json b/apps/bluetoothdock/add_to_apps.json deleted file mode 100644 index cb59dcdbe..000000000 --- a/apps/bluetoothdock/add_to_apps.json +++ /dev/null @@ -1,15 +0,0 @@ -// Create an entry in apps.json as follows: -{ "id": "bluetoothdock", - "name": "Bluetooth Dock", - "shortName":"Dock", - "icon": "app.png", - "version":"0.01", - "description": "When charging shows the time, scans Bluetooth for known devices (eg temperature) and shows them on the screen", - "tags": "bluetooth", - "readme": "README.md", - "storage": [ - {"name":"bluetoothdock.app.js","url":"app.js"}, - {"name":"bluetoothdock.boot.js","url":"boot.js"}, - {"name":"bluetoothdock.img","url":"app-icon.js","evaluate":true} - ] -} diff --git a/apps/scribble/add_to_apps.json b/apps/scribble/add_to_apps.json deleted file mode 100644 index 054f35d55..000000000 --- a/apps/scribble/add_to_apps.json +++ /dev/null @@ -1,14 +0,0 @@ -{ "id": "scribble", - "name": "Scribble", - "shortName":"Scribble", - "version":"0.01", - "description": "A keyboard on your wrist!", - "icon": "app.png", - "tags": "keyboard, text, scribble", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"scribble.app.js","url":"app.js"}, - {"name":"scribble.img","url":"app-icon.js","evaluate":true} - ] -} From 0c7cc770fa549f292fb79b0c0957b2a3573d46e6 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 11:00:56 +0000 Subject: [PATCH 456/476] remove un-needed files --- apps/tinydraw/add_to_apps.json | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 apps/tinydraw/add_to_apps.json diff --git a/apps/tinydraw/add_to_apps.json b/apps/tinydraw/add_to_apps.json deleted file mode 100644 index 21a90049e..000000000 --- a/apps/tinydraw/add_to_apps.json +++ /dev/null @@ -1,14 +0,0 @@ -{ "id": "tinydraw", - "name": "TinyDraw", - "shortName":"TinyDraw", - "version":"0.01", - "description": "Draw stuff in your wrist!", - "icon": "app.png", - "tags": "keyboard, text, scribble", - "supports" : ["BANGLEJS2"], - "readme": "README.md", - "storage": [ - {"name":"tinydraw.app.js","url":"app.js"}, - {"name":"tinydraw.img","url":"app-icon.js","evaluate":true} - ] -} From 144f4d31969d1306a193570bad2c6b2697e01c39 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Tue, 4 Jan 2022 12:03:23 +0100 Subject: [PATCH 457/476] Fix naming of variable --- apps/weather/app.js | 2 +- apps/weather/lib.js | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/apps/weather/app.js b/apps/weather/app.js index 5c6b29b64..efd9b0209 100644 --- a/apps/weather/app.js +++ b/apps/weather/app.js @@ -47,7 +47,7 @@ function formatDuration(millis) { function draw() { layout.icon.txt = current.txt; - layout.icon.cond = current.code; + layout.icon.code = current.code; const temp = locale.temp(current.temp-273.15).match(/^(\D*\d*)(.*)$/); layout.temp.label = temp[1]; layout.tempUnit.label = temp[2]; diff --git a/apps/weather/lib.js b/apps/weather/lib.js index f86a51a18..b1c306d58 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -312,14 +312,11 @@ exports.drawIcon = function(cond, x, y, r) { } } - const code = cond.code || -1; - if (code > 0) { - chooseIconByCode(code.code)(x, y, r); + if (cond.code > 0) { + chooseIconByCode(cond.code)(x, y, r); } else { chooseIcon(cond.txt)(x, y, r); } - console.log(cond); - }; From cde46c2cf5c21d74379b64f79f8e2317c54edc64 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 11:03:47 +0000 Subject: [PATCH 458/476] version --- apps.json | 2 +- apps/calendar/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 39f0ddb3b..046f1b4ff 100644 --- a/apps.json +++ b/apps.json @@ -2429,7 +2429,7 @@ { "id": "calendar", "name": "Calendar", - "version": "0.04", + "version": "0.05", "description": "Simple calendar", "icon": "calendar.png", "screenshots": [{"url":"screenshot_calendar.png"}], diff --git a/apps/calendar/ChangeLog b/apps/calendar/ChangeLog index e164d6be9..3deec00e0 100644 --- a/apps/calendar/ChangeLog +++ b/apps/calendar/ChangeLog @@ -2,3 +2,4 @@ 0.02: Make Bangle 2 compatible 0.03: Add setting to start week on Sunday 0.04: Add setting to switch color schemes. On Bangle 2 non-dithering colors will be used by default. Use localized names for months and days of the week (Language app needed). +0.05: Update calendar weekend colors for start on Sunday From 8b0498b195e765d33ff04cdec918cb0a0410ac06 Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Tue, 4 Jan 2022 12:10:15 +0100 Subject: [PATCH 459/476] debug --- apps/weather/lib.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/weather/lib.js b/apps/weather/lib.js index b1c306d58..8ffd2037f 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -291,6 +291,7 @@ exports.drawIcon = function(cond, x, y, r) { case 3: return drawRain; case 5: switch (code) { + case 511: return drawSnow; case 520: return drawShowerRain; case 521: return drawShowerRain; case 522: return drawShowerRain; @@ -312,7 +313,9 @@ exports.drawIcon = function(cond, x, y, r) { } } - if (cond.code > 0) { + console.log("weather cond", cond); + + if (cond.code && cond.code > 0) { chooseIconByCode(cond.code)(x, y, r); } else { chooseIcon(cond.txt)(x, y, r); From fe747934c8a53e3f1d83d6c70665891915cbcffb Mon Sep 17 00:00:00 2001 From: Marco Heiming Date: Tue, 4 Jan 2022 12:16:05 +0100 Subject: [PATCH 460/476] Update changelog and bump version --- apps.json | 2 +- apps/weather/ChangeLog | 1 + apps/weather/lib.js | 2 -- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index ab6089e65..a440e9b15 100644 --- a/apps.json +++ b/apps.json @@ -845,7 +845,7 @@ { "id": "weather", "name": "Weather", - "version": "0.13", + "version": "0.14", "description": "Show Gadgetbridge weather report", "icon": "icon.png", "screenshots": [{"url":"screenshot.png"}], diff --git a/apps/weather/ChangeLog b/apps/weather/ChangeLog index fb6b28bf6..910cd4658 100644 --- a/apps/weather/ChangeLog +++ b/apps/weather/ChangeLog @@ -10,3 +10,4 @@ 0.11: Bangle.js 2 support 0.12: Allow hiding the widget 0.13: Tweak Bangle.js 2 light theme colors +0.14: Use weather condition code for icon selection diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 8ffd2037f..8afdfe6df 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -313,8 +313,6 @@ exports.drawIcon = function(cond, x, y, r) { } } - console.log("weather cond", cond); - if (cond.code && cond.code > 0) { chooseIconByCode(cond.code)(x, y, r); } else { From a44ec783f7eb1342bafa3850e14e0113ab957b6a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 11:22:00 +0000 Subject: [PATCH 461/476] Fix issue with settings overwritten --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 2a8e872ec..5a5957714 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 2a8e872ecb143a10e53273b4d3473164e104e1d3 +Subproject commit 5a5957714d4aa04413329f57c03e6de0cfb74caf From c06afa1132b752ba433730004eb0168e1297d264 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 14:06:06 +0000 Subject: [PATCH 462/476] chronowid 0.05: Fix error running app on new firmwares (fix #1140) --- apps.json | 2 +- apps/chronowid/ChangeLog | 1 + apps/chronowid/app.js | 8 +------- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/apps.json b/apps.json index 046f1b4ff..e36c573f4 100644 --- a/apps.json +++ b/apps.json @@ -2027,7 +2027,7 @@ "id": "chronowid", "name": "Chrono Widget", "shortName": "Chrono Widget", - "version": "0.04", + "version": "0.05", "description": "Chronometer (timer) which runs as widget.", "icon": "app.png", "tags": "tool,widget", diff --git a/apps/chronowid/ChangeLog b/apps/chronowid/ChangeLog index ded543397..ed230b737 100644 --- a/apps/chronowid/ChangeLog +++ b/apps/chronowid/ChangeLog @@ -3,3 +3,4 @@ 0.03: Display only minutes:seconds when less than 1 hour left 0.04: Change to 7 segment font, move to top widget bar Better auto-update behaviour, less RAM used +0.05: Fix error running app on new firmwares (fix #1140) diff --git a/apps/chronowid/app.js b/apps/chronowid/app.js index f38105e34..ab363ed17 100644 --- a/apps/chronowid/app.js +++ b/apps/chronowid/app.js @@ -36,13 +36,7 @@ E.on('kill', () => { function showMenu() { const timerMenu = { '': { - 'title': 'Set timer', - 'predraw': function() { - timerMenu.hours.value = settingsChronowid.hours; - timerMenu.minutes.value = settingsChronowid.minutes; - timerMenu.seconds.value = settingsChronowid.seconds; - timerMenu.started.value = settingsChronowid.started; - } + 'title': 'Set timer' }, '< Back' : ()=>{load();}, 'Reset values': function() { From 128f2d4e66b99875f290fb0900125a39e25375f3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 14:27:23 +0000 Subject: [PATCH 463/476] messages 0.16: Fix text wrapping so it fits the screen even if title is big (fix #1147) --- apps.json | 2 +- apps/messages/ChangeLog | 1 + apps/messages/app.js | 5 +++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index e36c573f4..5072ad5bf 100644 --- a/apps.json +++ b/apps.json @@ -77,7 +77,7 @@ { "id": "messages", "name": "Messages", - "version": "0.15", + "version": "0.16", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", diff --git a/apps/messages/ChangeLog b/apps/messages/ChangeLog index 76407cb45..fe46ba97a 100644 --- a/apps/messages/ChangeLog +++ b/apps/messages/ChangeLog @@ -22,3 +22,4 @@ Now update correctly when 'require("messages").clearAll()' is called 0.14: Hide widget when all unread notifications are dismissed from phone 0.15: Don't buzz when Quiet Mode is active +0.16: Fix text wrapping so it fits the screen even if title is big (fix #1147) diff --git a/apps/messages/app.js b/apps/messages/app.js index eb066acb9..e36bb699e 100644 --- a/apps/messages/app.js +++ b/apps/messages/app.js @@ -243,7 +243,8 @@ function showMessage(msgid) { checkMessages({clockIfNoMsg:1,clockIfAllRead:1,showMsgIfUnread:1}); }}); } - lines = g.wrapString(msg.body, g.getWidth()-10); + var bodyFont = fontMedium; + lines = g.setFont(bodyFont).wrapString(msg.body, g.getWidth()-10); var body = (lines.length>4) ? lines.slice(0,4).join("\n")+"..." : lines.join("\n"); layout = new Layout({ type:"v", c: [ {type:"h", fillx:1, bgCol:colBg, c: [ @@ -256,7 +257,7 @@ function showMessage(msgid) { title?{type:"txt", font:titleFont, label:title, bgCol:colBg, fillx:1, pad:2 }:{}, ]}, ]}, - {type:"txt", font:fontMedium, label:body, fillx:1, filly:1, pad:2 }, + {type:"txt", font:bodyFont, label:body, fillx:1, filly:1, pad:2 }, {type:"h",fillx:1, c: buttons} ]}); g.clearRect(Bangle.appRect); From cb85dc0c8e4f20b58175dd8db8f77b026c41b1c5 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Tue, 4 Jan 2022 15:32:48 +0100 Subject: [PATCH 464/476] Messages app: bring back icons in code, not on top --- apps/messages/widget.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/messages/widget.js b/apps/messages/widget.js index 05622b162..f2852f2ce 100644 --- a/apps/messages/widget.js +++ b/apps/messages/widget.js @@ -1,10 +1,10 @@ -WIDGETS["messages"]={area:"tl", width:0, ICONS:[atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA=="),atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA==")], //icons should be equal size or first larger +WIDGETS["messages"]={area:"tl", width:0, iconwidth:23, draw:function() { Bangle.removeListener('touch', this.touch); if (!this.width) return; var c = (Date.now()-this.t)/1000; - g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+this.ICONS[0].charCodeAt(1)); - g.drawImage(this.ICONS[c&1], this.x, this.y); + g.reset().clearRect(this.x, this.y, this.x+this.width, this.y+this.iconwidth); + g.drawImage((c&1) ? atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+DAADDAADDAADDwAPD8A/DOBzDDn/DA//DAHvDAPvjAPvjAPvjAPvh///gf/vAAD+AAB8AAAAA==") : atob("GBiBAAAAAAAAAAAAAAAAAAAAAB//+D///D///A//8CP/xDj/HD48DD+B8D/D+D/3vD/vvj/vvj/vvj/vvh/v/gfnvAAD+AAB8AAAAA=="), this.x, this.y); //if (c<60) Bangle.setLCDPower(1); // keep LCD on for 1 minute let settings = require('Storage').readJSON("messages.settings.json", true) || {}; if (settings.repeat===undefined) settings.repeat = 4; @@ -18,7 +18,7 @@ draw:function() { WIDGETS["messages"].t=Date.now(); // first time WIDGETS["messages"].l=Date.now()-10000; // last buzz if (quiet) WIDGETS["messages"].t -= 500000; // if quiet, set last time in the past so there is no buzzing - WIDGETS["messages"].width=this.ICONS[0].charCodeAt(0); + WIDGETS["messages"].width=this.iconwidth; Bangle.drawWidgets(); Bangle.setLCDPower(1);// turns screen on },hide:function() { @@ -37,7 +37,7 @@ draw:function() { b(); },touch:function(b,c) { var w=WIDGETS["messages"]; - if (!w||!w.width||c.xw.x+w.width||c.yw.y+w.ICONS[0].charCodeAt(1)) return; + if (!w||!w.width||c.xw.x+w.width||c.yw.y+w.iconwidth) return; load("messages.app.js"); }}; /* We might have returned here if we were in the Messages app for a From 704ef337610a1ea142ec798bc9fef3713061df2f Mon Sep 17 00:00:00 2001 From: Joseph Moroney Date: Wed, 5 Jan 2022 01:01:49 +1000 Subject: [PATCH 465/476] patch - text alignment + twist acceleration --- apps.json | 2 +- apps/sonicclk/Changelog | 3 ++- apps/sonicclk/app.js | 8 +++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/apps.json b/apps.json index 5856486c0..3807b8663 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id": "sonicclk", "name": "Sonic Clock", - "version": "1.00", + "version": "1.01", "description": "A classic sonic clock featuring run, stop and wait animations.", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], diff --git a/apps/sonicclk/Changelog b/apps/sonicclk/Changelog index 396b6b3f4..7c83f6988 100644 --- a/apps/sonicclk/Changelog +++ b/apps/sonicclk/Changelog @@ -1 +1,2 @@ -1.00 Added sonic clock app \ No newline at end of file +1.00 Added sonic clock app +1.01 Fixed text alignment issue; Increased acceleration required to activate twist; \ No newline at end of file diff --git a/apps/sonicclk/app.js b/apps/sonicclk/app.js index 7cd8ef448..296677281 100644 --- a/apps/sonicclk/app.js +++ b/apps/sonicclk/app.js @@ -106,11 +106,12 @@ const timeout = 200; let currentSpeed = 0; let currentSonic = -1; -let drawTimeout, drawInterval; +let drawTimeout, drawInterval, waitTimeout; let bgScroll = [0, null]; const start = () => { if (drawTimeout) clearTimeout(drawTimeout); + if (waitTimeout) clearTimeout(waitTimeout); if (drawInterval) clearInterval(drawInterval); drawInterval = setInterval(() => { @@ -147,7 +148,7 @@ const wait = () => { drawInterval = setInterval(() => draw("wait"), timeout); - setTimeout(() => { + waitTimeout = setTimeout(() => { clearInterval(drawInterval); currentSonic = -1; draw("reset"); @@ -215,7 +216,7 @@ const drawTime = () => { const y = 24 + 25; const date = new Date(); - const timeStr = require("locale").time(date, 1); + const timeStr = require("locale").time(date, 1).trim(); const dateStr = require("locale").date(date).toUpperCase(); g.setColor("#000"); @@ -266,6 +267,7 @@ Bangle.on("twist", () => wait()); Bangle.setOptions({ lockTimeout: 10000, backlightTimeout: 12000, + twistThreshold: 1600, }); Bangle.setUI("clock"); From 2472a2bc7742321791ce4b8806af7504854a81f7 Mon Sep 17 00:00:00 2001 From: kyleplo <31634240+kyleplo@users.noreply.github.com> Date: Tue, 4 Jan 2022 10:39:51 -0500 Subject: [PATCH 466/476] Add files via upload --- apps/touchmenu/touchmenu.gif | Bin 0 -> 616646 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/touchmenu/touchmenu.gif diff --git a/apps/touchmenu/touchmenu.gif b/apps/touchmenu/touchmenu.gif new file mode 100644 index 0000000000000000000000000000000000000000..3df4b3462cf54e9db570567e5a83bd4c7e6b47a4 GIT binary patch literal 616646 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

>zrIgHZNgQ8j)Jb?ofjC;Wkf`VH!isY6 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�!%kWK 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"pgxuI+m&p)2(&i24nFU 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
dT(*nsu9!Bw=H#b=#cwl6qSaz>8ykQ|S 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 Date: Tue, 4 Jan 2022 10:41:19 -0500 Subject: [PATCH 467/476] Update README.md --- apps/touchmenu/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/touchmenu/README.md b/apps/touchmenu/README.md index dfc65a754..0e81f3755 100644 --- a/apps/touchmenu/README.md +++ b/apps/touchmenu/README.md @@ -2,6 +2,8 @@ A redesign of the built-in `E.showMenu()` to take advantage of the full touch screen on the Bangle.js 2. +![screenshot](touchmenu.gif) + ## Features - All of the features of the built-in `E.showMenu()` From a489914a72dc2de876af25e818d9147d44c2581d Mon Sep 17 00:00:00 2001 From: kyleplo <31634240+kyleplo@users.noreply.github.com> Date: Tue, 4 Jan 2022 10:44:35 -0500 Subject: [PATCH 468/476] Update apps.json --- apps.json | 340 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 318 insertions(+), 22 deletions(-) diff --git a/apps.json b/apps.json index 3fc319361..e5000e49e 100644 --- a/apps.json +++ b/apps.json @@ -77,7 +77,7 @@ { "id": "messages", "name": "Messages", - "version": "0.14", + "version": "0.16", "description": "App to display notifications from iOS and Gadgetbridge", "icon": "app.png", "type": "app", @@ -167,7 +167,7 @@ { "id": "setting", "name": "Settings", - "version": "0.38", + "version": "0.39", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", @@ -768,7 +768,7 @@ "id": "recorder", "name": "Recorder (BETA)", "shortName": "Recorder", - "version": "0.04", + "version": "0.05", "description": "Record GPS position, heart rate and more in the background, then download to your PC.", "icon": "app.png", "tags": "tool,outdoors,gps,widget", @@ -971,7 +971,7 @@ { "id": "widbt", "name": "Bluetooth Widget", - "version": "0.07", + "version": "0.08", "description": "Show the current Bluetooth connection status in the top right of the clock", "icon": "widget.png", "type": "widget", @@ -1148,7 +1148,7 @@ { "id": "qrcode", "name": "Custom QR Code", - "version": "0.04", + "version": "0.05", "description": "Use this to upload a customised QR code to Bangle.js", "icon": "app.png", "tags": "qrcode", @@ -1501,7 +1501,7 @@ { "id": "gpsinfo", "name": "GPS Info", - "version": "0.05", + "version": "0.06", "description": "An application that displays information about altitude, lat/lon, satellites and time", "icon": "gps-info.png", "type": "app", @@ -2027,7 +2027,7 @@ "id": "chronowid", "name": "Chrono Widget", "shortName": "Chrono Widget", - "version": "0.04", + "version": "0.05", "description": "Chronometer (timer) which runs as widget.", "icon": "app.png", "tags": "tool,widget", @@ -2184,7 +2184,7 @@ "id": "calculator", "name": "Calculator", "shortName": "Calculator", - "version": "0.04", + "version": "0.05", "description": "Basic calculator reminiscent of MacOs's one. Handy for small calculus.", "icon": "calculator.png", "screenshots": [{"url":"screenshot_calculator.png"}], @@ -2429,7 +2429,7 @@ { "id": "calendar", "name": "Calendar", - "version": "0.04", + "version": "0.05", "description": "Simple calendar", "icon": "calendar.png", "screenshots": [{"url":"screenshot_calendar.png"}], @@ -4064,7 +4064,7 @@ { "id": "hcclock", "name": "Hi-Contrast Clock", - "version": "0.02", + "version": "0.03", "description": "Hi-Contrast Clock : A simple yet very bold clock that aims to be readable in high luninosity environments. Uses big 10x5 pixel digits. Use BTN 1 to switch background and foreground colors.", "icon": "hcclock-icon.png", "type": "clock", @@ -4487,7 +4487,7 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.07", + "version":"0.08", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", @@ -4652,7 +4652,7 @@ "id": "sensible", "name": "SensiBLE", "shortName": "SensiBLE", - "version": "0.04", + "version": "0.05", "description": "Collect, display and advertise real-time sensor data.", "icon": "sensible.png", "screenshots": [ @@ -4697,6 +4697,8 @@ "tags": "tool,timer", "readme":"README.md", "supports":["BANGLEJS2"], + "screenshots": [{"url":"screenshot1.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}], + "allow_emulator": true, "storage": [ {"name":"a_speech_timer.app.js","url":"app.js"}, {"name":"a_speech_timer.img","url":"app-icon.js","evaluate":true} @@ -4778,7 +4780,7 @@ { "id": "weatherClock", "name": "Weather Clock", - "version": "0.04", + "version": "0.05", "description": "A clock which displays current weather conditions (requires Gadgetbridge and Weather apps).", "icon": "app.png", "screenshots": [{"url":"screens/screen1.png"}], @@ -4838,6 +4840,25 @@ {"name": "flow.img", "url": "app-icon.js","evaluate": true } ] }, + { "id": "tinydraw", + "name": "TinyDraw", + "shortName":"TinyDraw", + "version":"0.01", + "type": "app", + "description": "Draw stuff in your wrist", + "icon": "app.png", + "allow_emulator": true, + "tags": "tools, keyboard, text, scribble", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"tinydraw.app.js","url":"app.js"}, + {"name":"tinydraw.img","url":"app-icon.js","evaluate":true} + ], + "screenshots":[ + { "url":"screenshot.png" } + ] + }, { "id": "scribble", "name": "Scribble", "shortName":"Scribble", @@ -4861,7 +4882,7 @@ "id": "ptlaunch", "name": "Pattern Launcher", "shortName": "Pattern Launcher", - "version": "0.11", + "version": "0.13", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", "screenshots": [{"url":"manage_patterns_light.png"}], @@ -4875,6 +4896,20 @@ ], "data": [{"name":"ptlaunch.patterns.json"}] }, + { "id": "slimehunt", + "name": "Slime Hunt", + "shortName":"SlimeHunt", + "icon": "app.png", + "version":"0.02", + "description": "Fight against slimes in turn based combat, try to get the highscore!", + "tags": "rpg,slime", + "supports" : ["BANGLEJS"], + "readme": "README.md", + "storage": [ + {"name":"slimehunt.app.js","url":"app.js"}, + {"name":"slimehunt.img","url":"app-icon.js","evaluate":true} + ] + }, { "id": "rebble", "name": "Rebble Clock", @@ -4931,10 +4966,12 @@ "id":"awairmonitor", "name":"Awair Monitor", "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], "allow_emulator": true, - "version":"0.01", + "version":"0.03", "description": "Displays the level of CO2, VOC, PM 2.5, Humidity and Temperature, from your Awair device.", - "tags": "tool,health", + "type": "clock", + "tags": "clock,tool,health", "readme":"README.md", "supports":["BANGLEJS2"], "storage": [ @@ -4963,8 +5000,8 @@ }, { "id": "coretemp", - "name": "Core Temp Display", - "version": "0.01", + "name": "CoreTemp", + "version": "0.02", "description": "Display CoreTemp device sensor data", "icon": "coretemp.png", "type": "app", @@ -4972,10 +5009,14 @@ "readme": "README.md", "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ - {"name":"coretemp.boot.js","url":"boot.js"}, + {"name":"coretemp.wid.js","url":"widget.js"}, {"name":"coretemp.app.js","url":"coretemp.js"}, - {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true} - ] + {"name":"coretemp.settings.js","url":"settings.js"}, + {"name":"coretemp.img","url":"coretemp-icon.js","evaluate":true}, + {"name":"coretemp.boot.js","url":"boot.js"} + ], + "data": [{"name":"coretemp.json","url":"app-settings.json"}], + "screenshots": [{"url":"screenshot.png"}] }, { "id": "showimg", @@ -5029,9 +5070,10 @@ { "id": "circlesclock", "name": "Circles clock", "shortName":"Circles clock", - "version":"0.02", + "version":"0.03", "description": "A clock with circles for different data at the bottom in a probably familiar style", "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], "dependencies": {"widpedom":"app"}, "type": "clock", "tags": "clock", @@ -5047,6 +5089,22 @@ {"name":"circlesclock.json"} ] }, + { "id": "contourclock", + "name": "Contour Clock", + "shortName" : "Contour Clock", + "version":"0.01", + "icon": "app.png", + "description": "A Minimalist clockface with large Digits. Looks best with the dark theme", + "screenshots" : [{"url":"screenshot.png"}], + "tags": "clock", + "allow_emulator":true, + "supports" : ["BANGLEJS2"], + "type": "clock", + "storage": [ + {"name":"contourclock.app.js","url":"app.js"}, + {"name":"contourclock.img","url":"app-icon.js","evaluate":true} + ] + }, { "id": "ltherm", "name": "Localized Thermometer", @@ -5063,11 +5121,249 @@ {"name":"ltherm.img","url":"icon.js","evaluate":true} ] }, + { + "id": "slash", + "name": "Slash Watch", + "shortName":"Slash", + "icon": "slash.png", + "screenshots": [{"url":"screenshot.png"}], + "version":"0.01", + "description": "Slash Watch based on Pebble watch face by Nikki.", + "tags": "clock", + "type": "clock", + "supports":["BANGLEJS2"], + "readme": "README.md", + "allow_emulator": true, + "storage": [ + {"name":"slash.app.js","url":"app.js"}, + {"name":"slash.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "promenu", + "name": "Pro Menu", + "version": "0.01", + "description": "Replace Bangle.js 1's built in menu function.", + "icon": "icon.png", + "type": "boot", + "tags": "system", + "supports": ["BANGLEJS"], + "screenshots": [{"url":"pro-menu-screenshot.png"}], + "storage": [ + {"name":"promenu.boot.js","url":"boot.js"}, + {"name":"promenu.img","url":"promenuIcon.js","evaluate":true} + ] + }, + { + "id": "touchtimer", + "name": "Touch Timer", + "shortName": "Touch Timer", + "version": "0.02", + "description": "Quickly and easily create a timer with touch-only input. The time can be easily set with a number pad.", + "icon": "app.png", + "tags": "tools", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "screenshots": [{"url":"0_light_timer_edit.png"},{"url":"1_light_timer_ready.png"},{"url":"2_light_timer_running.png"},{"url":"3_light_timer_finished.png"}], + "storage": [ + { "name": "touchtimer.app.js", "url": "app.js" }, + { "name":"touchtimer.settings.js", "url":"settings.js"}, + { "name": "touchtimer.img", "url": "app-icon.js", "evaluate": true } + ], + "data": [{"name":"touchtimer.data.json"}] + }, + { + "id": "teatimer", + "name": "Tea Timer", + "version": "1.00", + "description": "A simple timer. You can easyly set up the time.", + "icon": "teatimer.png", + "type": "app", + "tags": "tool", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"teatimer.app.js","url":"app.js"}, + {"name":"teatimer.img","url":"app-icon.js","evaluate":true} + ], + "screenshots": [ + {"url":"TeatimerStart.jpg"}, + {"url":"TeatimerHelp.jpg"}, + {"url":"TeatimerRun.jpg"}, + {"url":"TeatimerUp.jpg"} + ] + }, + { + "id": "swp2clk", + "name": "Swipe back to the Clock", + "shortName": "Swipe to Clock", + "version": "0.01", + "description": "Let's you swipe from left to right on any app to return back to the clock face. Please configure in the settings app after installing to activate, since its disabled by default.", + "icon": "app.png", + "type": "boot", + "tags": "tools", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + { "name": "swp2clk.boot.js", "url": "boot.js" }, + {"name":"swp2clk.settings.js","url":"settings.js"} + ], + "data": [{"name":"swp2clk.data.json"}] + }, + { + "id":"colorwheel", + "name":"Color Wheel", + "tags":"app,tool", + "version":"0.01", + "description":"a tappable wheel of good-looking colors", + "readme":"README.md", + "supports":["BANGLEJS2"], + "allow_emulator":true, + "icon":"colorwheel.png", + "storage": [ + {"name":"colorwheel.app.js","url":"app.js"}, + {"name":"colorwheel.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "minimal_clock", + "name": "Minimal Analog Clock", + "shortName":"Minimal Clock", + "version":"0.03", + "description": "a minimal analog clock - just with some hands and no clock face", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"minimal_clock.app.js","url":"app.js"}, + {"name":"minimal_clock.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "simple_clock", + "name": "Simple Analog Clock", + "shortName":"Simple Clock", + "version":"0.02", + "description": "a simple, yet stylish, analog clock", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"simple_clock.app.js","url":"app.js"}, + {"name":"simple_clock.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "colorful_clock", + "name": "Colorful Analog Clock", + "shortName":"Colorful Clock", + "version":"0.02", + "description": "a colorful analog clock", + "icon": "app-icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"colorful_clock.app.js","url":"app.js"}, + {"name":"colorful_clock.img","url":"app-icon.js","evaluate":true} + ] + }, + { "id": "themesetter", + "name": "Theme Setter", + "shortName":"Theme Setter", + "version":"0.04", + "description": "a comfortable way to configure theme colors", + "icon": "app-icon.png", + "type": "app", + "tags": "tool", + "supports" : ["BANGLEJS2"], + "allow_emulator": true, + "screenshots": [{"url":"app-screenshot.png"}], + "readme": "README.md", + "storage": [ + {"name":"themesetter.app.js","url":"app.js"}, + {"name":"themesetter.img","url":"app-icon.js","evaluate":true} + ] + }, + { + "id": "widviztime", + "name": "Widget Autohide Widget", + "shortName": "Viz Time Widget", + "version": "0.01", + "description": "The widgets will be shown for four seconds after the device is unlocked.", + "icon": "eye.png", + "type": "widget", + "tags": "widget", + "readme":"README.md", + "supports": ["BANGLEJS","BANGLEJS2"], + "storage": [ + {"name":"widviztime.wid.js","url":"widget.js"} + ] + }, + { + "id": "supf", + "name": "Simple Clock with Date", + "shortName": "supf Clock", + "version": "0.01", + "description": "Simple Clock with seconds and date in custom language. Install 'Languages' to get localized names.", + "icon": "icon.png", + "screenshots": [{"url":"screenshot_supf.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS2"], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + {"name":"supf.app.js","url":"app.js"}, + {"name":"supf.img","url":"icon.js","evaluate":true} + ] + }, + { "id": "andark", + "name": "Analog Dark", + "shortName":"AnDark", + "version":"0.04", + "description": "analog clock face without disturbing widgets", + "icon": "andark_icon.png", + "type": "clock", + "tags": "clock", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"andark.app.js","url":"app.js"}, + {"name":"andark.img","url":"app_icon.js","evaluate":true} + ] + }, + { + "id": "diract", + "name": "DirAct", + "shortName": "DirAct", + "version": "0.01", + "description": "Proximity interaction detection.", + "icon": "diract.png", + "type": "app", + "tags": "tool,sensors", + "supports" : [ "BANGLEJS2" ], + "allow_emulator": false, + "readme": "README.md", + "storage": [ + { "name": "diract.app.js", "url": "diract.js" }, + { "name": "diract.img", "url": "diract-icon.js", "evaluate": true } + ] + }, { "id": "touchmenu", "name": "TouchMenu", "version": "0.01", "description": "Redesigned menu that uses the full touchscreen on the Bangle.js 2", + "screenshots": [{"url":"touchmenu.gif"}], "icon": "touchmenu.png", "type": "bootloader", "tags": "tool", From e0a1732f79fa20506527f4a7cd7d2011064ec6e9 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 16:51:01 +0000 Subject: [PATCH 469/476] Fix GPX file format for banglerun/recorder (fix #1197) --- apps/banglerun/interface.html | 2 +- apps/recorder/interface.html | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/banglerun/interface.html b/apps/banglerun/interface.html index 403f28258..6388d3b65 100644 --- a/apps/banglerun/interface.html +++ b/apps/banglerun/interface.html @@ -68,7 +68,7 @@ ${track.map(pt=>` ${pt.distance}\n`).join("")} function saveGPX(track, title) { var gpx = ` - + diff --git a/apps/recorder/interface.html b/apps/recorder/interface.html index 42aa4e16d..0535b2d51 100644 --- a/apps/recorder/interface.html +++ b/apps/recorder/interface.html @@ -16,7 +16,7 @@ function saveKML(track,title) { ${track[0].Heartrate!==undefined ? ` Heart Rate - `:``} + `:``} ${track[0].Steps!==undefined ? ` Step Count `:``} @@ -25,7 +25,7 @@ ${track[0].Core!==undefined ? ` `:``} ${track[0].Skin!==undefined ? ` Skin Temp - `:``} + `:``} @@ -49,7 +49,7 @@ ${track.map(pt=>` ${0|pt.Core}\n`).join("")} `:``} ${track[0].Skin!==undefined ? ` ${track.map(pt=>` ${0|pt.Skin}\n`).join("")} - `:``} + `:``} @@ -72,8 +72,7 @@ ${track.map(pt=>` ${0|pt.Skin}\n`).join("")} function saveGPX(track, title) { var gpx = ` - - + From 7974e4dd2b8d6dff7477315f9d43cf43b40c3867 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Tue, 4 Jan 2022 23:32:58 +0100 Subject: [PATCH 470/476] Prepare release of cprassist --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 64abacef2..4f966bbdd 100644 --- a/apps.json +++ b/apps.json @@ -2970,7 +2970,7 @@ { "id": "cprassist", "name": "CPR Assist", - "version": "0.02-rc1", + "version": "0.02", "description": "Provides assistance while performing a CPR", "icon": "cprassist-icon.png", "tags": "tool,firstaid", From bbf4e76dce002a077612948df0a827e8125aae00 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 5 Jan 2022 09:10:40 +0000 Subject: [PATCH 471/476] fix build issues after PR merge --- apps.json | 2 +- core | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index f1afbe858..f116049dc 100644 --- a/apps.json +++ b/apps.json @@ -5387,7 +5387,7 @@ "tags": "tool", "supports": ["BANGLEJS2"], "storage": [ - {"name":"touchmenu.boot.js","url":"touchmenu.js"}, + {"name":"touchmenu.boot.js","url":"touchmenu.boot.js"} ] } ] diff --git a/core b/core index 2a8e872ec..5a5957714 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 2a8e872ecb143a10e53273b4d3473164e104e1d3 +Subproject commit 5a5957714d4aa04413329f57c03e6de0cfb74caf From ed6c1ddc839d278a50fded68c0d77368a126aae8 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 5 Jan 2022 09:13:08 +0000 Subject: [PATCH 472/476] now link to changes for new firmwares --- loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loader.js b/loader.js index 768f5f38f..a0c280634 100644 --- a/loader.js +++ b/loader.js @@ -40,7 +40,7 @@ function onFoundDeviceInfo(deviceId, deviceVersion) { if (deviceId != "BANGLEJS" && deviceId != "BANGLEJS2") { showToast(`You're using ${deviceId}, not a Bangle.js. Did you want espruino.com/apps instead?` ,"warning", 20000); } else if (versionLess(deviceVersion, RECOMMENDED_VERSION)) { - showToast(`You're using an old Bangle.js firmware (${deviceVersion}). You can update with the instructions here` ,"warning", 20000); + showToast(`You're using an old Bangle.js firmware (${deviceVersion}) and ${RECOMMENDED_VERSION} is available (see changes). You can update with the instructions here` ,"warning", 20000); } From f81032ac5b7bd084ee6c8695e9497362bd078960 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 5 Jan 2022 09:28:51 +0000 Subject: [PATCH 473/476] Ensure crypto module is only set as included for Bangle.js 2 (fix https://github.com/andrewgoz/Authentiwatch/issues/7) --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index 5a5957714..ae9586977 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 5a5957714d4aa04413329f57c03e6de0cfb74caf +Subproject commit ae9586977948279d267f2749bf3a48d3aa753c11 From cf41ff2bc683c1da8664a3db06d6350512920a38 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Wed, 5 Jan 2022 12:09:21 +0100 Subject: [PATCH 474/476] weather: fix widget icon --- apps.json | 2 +- apps/weather/ChangeLog | 1 + apps/weather/lib.js | 75 ++++++++++++++++++++++++++---------------- apps/weather/widget.js | 4 +-- 4 files changed, 50 insertions(+), 32 deletions(-) diff --git a/apps.json b/apps.json index f116049dc..ed5deec79 100644 --- a/apps.json +++ b/apps.json @@ -845,7 +845,7 @@ { "id": "weather", "name": "Weather", - "version": "0.14", + "version": "0.15", "description": "Show Gadgetbridge weather report", "icon": "icon.png", "screenshots": [{"url":"screenshot.png"}], diff --git a/apps/weather/ChangeLog b/apps/weather/ChangeLog index 910cd4658..101da48e1 100644 --- a/apps/weather/ChangeLog +++ b/apps/weather/ChangeLog @@ -11,3 +11,4 @@ 0.12: Allow hiding the widget 0.13: Tweak Bangle.js 2 light theme colors 0.14: Use weather condition code for icon selection +0.15: Fix widget icon diff --git a/apps/weather/lib.js b/apps/weather/lib.js index 8afdfe6df..1d48116e1 100644 --- a/apps/weather/lib.js +++ b/apps/weather/lib.js @@ -53,6 +53,16 @@ exports.get = function() { scheduleExpiry(storage.readJSON('weather.json')||{}); +/** + * + * @param cond Weather condition, as one of: + * {number} code: (Preferred form) https://openweathermap.org/weather-conditions#Weather-Condition-Codes-2 + * {string} weather description (in English: breaks for other languages!) + * {object} use cond.code if present, or fall back to cond.txt + * @param x Left + * @param y Top + * @param r Icon Size + */ exports.drawIcon = function(cond, x, y, r) { var palette; @@ -249,32 +259,35 @@ exports.drawIcon = function(cond, x, y, r) { g.setColor(g.theme.fg).setFontAlign(0, 0).setFont('Vector', r*2).drawString("?", x+r/10, y+r/6); } - function chooseIcon(condition) { - if (!condition) return () => {}; - condition = condition.toLowerCase(); - if (condition.includes("thunderstorm")) return drawThunderstorm; - if (condition.includes("freezing")||condition.includes("snow")|| - condition.includes("sleet")) { + /* + * Choose weather icon to display based on weather description + */ + function chooseIconByTxt(txt) { + if (!txt) return () => {}; + txt = txt.toLowerCase(); + if (txt.includes("thunderstorm")) return drawThunderstorm; + if (txt.includes("freezing")||txt.includes("snow")|| + txt.includes("sleet")) { return drawSnow; } - if (condition.includes("drizzle")|| - condition.includes("shower")) { + if (txt.includes("drizzle")|| + txt.includes("shower")) { return drawRain; } - if (condition.includes("rain")) return drawShowerRain; - if (condition.includes("clear")) return drawSun; - if (condition.includes("few clouds")) return drawFewClouds; - if (condition.includes("scattered clouds")) return drawCloud; - if (condition.includes("clouds")) return drawBrokenClouds; - if (condition.includes("mist") || - condition.includes("smoke") || - condition.includes("haze") || - condition.includes("sand") || - condition.includes("dust") || - condition.includes("fog") || - condition.includes("ash") || - condition.includes("squalls") || - condition.includes("tornado")) { + if (txt.includes("rain")) return drawShowerRain; + if (txt.includes("clear")) return drawSun; + if (txt.includes("few clouds")) return drawFewClouds; + if (txt.includes("scattered clouds")) return drawCloud; + if (txt.includes("clouds")) return drawBrokenClouds; + if (txt.includes("mist") || + txt.includes("smoke") || + txt.includes("haze") || + txt.includes("sand") || + txt.includes("dust") || + txt.includes("fog") || + txt.includes("ash") || + txt.includes("squalls") || + txt.includes("tornado")) { return drawMist; } return drawUnknown; @@ -298,7 +311,6 @@ exports.drawIcon = function(cond, x, y, r) { case 531: return drawShowerRain; default: return drawRain; } - break; case 6: return drawSnow; case 7: return drawMist; case 8: @@ -308,16 +320,21 @@ exports.drawIcon = function(cond, x, y, r) { case 802: return drawCloud; default: return drawBrokenClouds; } - break; default: return drawUnknown; } } - if (cond.code && cond.code > 0) { - chooseIconByCode(cond.code)(x, y, r); - } else { - chooseIcon(cond.txt)(x, y, r); + function chooseIcon(cond) { + if (typeof (cond)==="object") { + if ("code" in cond) return chooseIconByCode(cond.code); + if ("txt" in cond) return chooseIconByTxt(cond.txt); + } else if (typeof (cond)==="number") { + return chooseIconByCode(cond.code); + } else if (typeof (cond)==="string") { + return chooseIconByTxt(cond.txt); + } + return drawUnknown; } - + chooseIcon(cond)(x, y, r); }; diff --git a/apps/weather/widget.js b/apps/weather/widget.js index f2ddf0b5b..2905d776b 100644 --- a/apps/weather/widget.js +++ b/apps/weather/widget.js @@ -52,8 +52,8 @@ if (!w) return; g.reset(); g.clearRect(this.x, this.y, this.x+this.width-1, this.y+23); - if (w.txt) { - weather.drawIcon(w.txt, this.x+10, this.y+8, 7.5); + if (w.code||w.txt) { + weather.drawIcon(w, this.x+10, this.y+8, 7.5); } if (w.temp) { let t = require('locale').temp(w.temp-273.15); // applies conversion From b21a2bcf8440b34ae85e70b13f4a4913307c2550 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 5 Jan 2022 13:40:41 +0000 Subject: [PATCH 475/476] mclockplus 0.03: Allow widgets to detect this is a clock --- apps.json | 2 +- apps/mclockplus/ChangeLog | 1 + apps/mclockplus/mclockplus.app.js | 5 ++--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index f116049dc..90dc1d941 100644 --- a/apps.json +++ b/apps.json @@ -3533,7 +3533,7 @@ "id": "mclockplus", "name": "Morph Clock+", "shortName": "Morph Clock+", - "version": "0.02", + "version": "0.03", "description": "Morphing Clock with more readable seconds and date and additional stopwatch", "icon": "mclockplus.png", "type": "clock", diff --git a/apps/mclockplus/ChangeLog b/apps/mclockplus/ChangeLog index a1cecc698..097545ba8 100644 --- a/apps/mclockplus/ChangeLog +++ b/apps/mclockplus/ChangeLog @@ -1,2 +1,3 @@ 0.01: Created app 0.02: Use Bangle.setUI for button/launcher handling +0.03: Allow widgets to detect this is a clock diff --git a/apps/mclockplus/mclockplus.app.js b/apps/mclockplus/mclockplus.app.js index 4c74ce1be..970397478 100644 --- a/apps/mclockplus/mclockplus.app.js +++ b/apps/mclockplus/mclockplus.app.js @@ -304,15 +304,14 @@ Bangle.on('lcdPower',function(on) { }); g.clear(); +// Show launcher when button pressed +Bangle.setUI("clock"); Bangle.loadWidgets(); Bangle.drawWidgets(); // Update time once a second timeInterval = setInterval(showTime, 1000); showTime(); -// Show launcher when button pressed -Bangle.setUI("clock"); - // Start stopwatch when BTN3 is pressed setWatch(() => {swInterval=setInterval(stopWatch, 1000);stopWatch();}, BTN3, {repeat:false,edge:"falling"}); B3 = 1; // BTN3 is bound to start the stopwatch From 1b70c9eb9d70b042d2b235a3c45ba52bc2beb5c3 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 5 Jan 2022 13:40:46 +0000 Subject: [PATCH 476/476] Fix error message - ref https://github.com/espruino/BangleApps/issues/1198 --- core | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core b/core index ae9586977..b05af96b2 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit ae9586977948279d267f2749bf3a48d3aa753c11 +Subproject commit b05af96b2522a7a7225a56d804faf9383f8a8f97