From 13525cd11dca59b47c815ae909637c4720bd003b Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 15 Dec 2021 22:11:18 +0000 Subject: [PATCH 001/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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/433] 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 7ad29b48b4bbf224bfa96e8d3f7625089b2398c3 Mon Sep 17 00:00:00 2001 From: Kristoffer Sall-Storgaard Date: Fri, 17 Dec 2021 23:11:41 +0100 Subject: [PATCH 021/433] 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 022/433] 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 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 023/433] 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 024/433] 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 025/433] 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 026/433] 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 027/433] 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 028/433] 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 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 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 029/433] 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 030/433] 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 031/433] 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 032/433] 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 033/433] 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 034/433] 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 035/433] 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 036/433] 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 037/433] 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 038/433] 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 039/433] 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 040/433] 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 041/433] 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 042/433] 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 043/433] 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 044/433] 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 045/433] 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 046/433] 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 zcmbVO`8yMg1791`+>zX8UUK9<=Sq$u*W5>CoBJA5(_*x@WW0{V%d1z85OQs9GL~eL zNIB-7b3zO;XTHAQKjHg%p3m_-pWi>vC&|IiiVG|P1^@tDw{Dt4&z$gIva_9OZS&&Y zGh>M|yXDM&hFErAJOIEUb<6y^^TWKKuYP9ND{>~>7@Im((KIO+%s>LKv=uZiFB-Y< z$*n(oJj$CP2guqUzjF>?`4|KmA>(ktG_t97gioP}o|*%fm{2(zH>We`Jlk8`|6T96 zO}zKC@$Du3WT_RiiDGnDvGB~kC2QFp+1b(KKqP%PxZ&%+Gkz* z^mP5*fFB#(4zxOw0-;CEbU0Wy+K~g(csES(mvaD!q)b_RcS$?j0EZwP z-)nH8iL>wDeMJ_Zi`Urv`*i?>i-_r7E~2W#r^IMy_6uwwIN*~YYHgvg=Acp``A_0# zemrro%cP>eY7))Lty=S@c{!Zj4M{gVPtiW4l&tDF{qRg0iL^XvQjD-4R2Kg*G^szR zz95pSPA@Qr?iLhvPYSeHS$Kw_Oyr!4O78i!#jVq;uh_%m&lro~L zm`g;%RSz3mZ>rhVa4)`&1}S3Z@RY3GCD+UZ>X180x+@r+$V0)FlO$owzKh0ju2&;^ zS8Qje1GNLo5vtyHdXJ7ZSof?3?8B(K-m-l5$?H@T&LK|<&!m96?29~<)&9k(nwf!B zN*8eeFRi+eFCKu}y)E_p<}sV8YfkzfM}-`#spq9nPNuiiRb)H4s9H!JuY5^dcSZuMRkf3 z$3?r6CWPxQF=fU&g2najPcdZl!$WJL+TSN7^@01PC2oXBKO6iFoXPgu%P1u4x9jdO zJk%_&y@U33MED`Dd?bG~B&bswrpu?}iAoq$;*wzLH{~DXV6B{vCE{S%SMfy=EZW^k zGs)rmOyll4DVwKYr*FS4H)(P0`xOb5kgL`QfeHl5TMr|Z?$OmfiF@@b%ANiiOWNRe z)CA^y{RS5K2&ENT{_4V0Actjez(SS%tt1=qxlI*tKkkZ^r$%_R@T zs9FXb4=bwi#fu3#397(`29PEH@W0vc3WmPPF$rgl`%96uWPljvY_L3!YNS;5fyS~; zpy|30f0cT{!(UmIf3O+56O9|Sp0LOlj175x)*kh&w7{KXcPt|V_REvc(m~5GpMcQH z;#yoRjOD_kb_v4*9=2Oldo;|9!-97U*z^j8K?!=Cw~6ZrDe8PYChE#;Qq8|k@t0{DZq8EjyKcl zJD|VIy@zpmmBV!h_JwjC_a0tI=8+S~r2Z?5*c7rO!Rq#!HBiWMWfG}QehJJPCq+cN zPwP~!G6ItDDbn1N6HkI4!BPzt(>CSGB(x__u;|X_oDY%EOlWD;aQLQ09xy#i{WB({ zXAMRDxH2n_?LUz_CKrGCgGiEWdukp^<#=|6P+po8l0~l$TaK2{^Q7_ zz+iy~DW2McTMvhmO}}U_)nI>h;PJRtQCDc_;nQ=ofjWp^(V0S5}BzEe`n<{?J53Pk((h7;E^+NIJw)KOD=7KUTU>&xxO}>!*kKbz}HZWlQX0mJ(UY;pT=UVev&3Q{% zx3EG|cz?$1nhrR^xru!^#Dld5wEQ|#BQJ5G$BqoN_1W+;{Rm(#>y)w=_j;uSjF}urS zh8pqfnUgx!Ul6;plL7MsC!+YRi4*Z(KK}x394h3aTyA&#a~XUr=iHmC{(4pj`9rS= z$iJmW)M8!6$`sdMBoc6$qo|OA!3Bd^PQ9I0BCkEz3qc!EpT8+Tv^=cNx?xcVL=J+O z23vgG{r6+PjN{eVB<5x;9cUa==`|60=+G@g`rf!H4iaiFp=aEu;>6D#(LFL@mIzXa zNEB~%$>TDLGA&PNR$z>d1kOeImY&*UUF)m;k23MLOs0%J$5wzs9IxrVeo3qyM0T< zPAonyKt1O}z>#`>??Z)97>sx4E_@YPc2hhWEfQ}sznh6sI>%k7Z#wcN;czneJH2@m$O5;EBTTJ3NE8V+zo zmWkyiR6a;?;m(50CL5TKnNgF4N9wuymriS!682hZh7UHg2Tor~U!GYe&$T@rZqOKe zIWwaXoLB8%FtVoBc4_}&aW>*!{E_zk0YAB8^-OUQ$X3TI6tNAbWeCnwRMjTDbEd%& z;Mlx??lAM;){ZJ9@jp@;3)mBZ^zDuu>V8BY()Il}QrP^#{1L{}aSIYT)qvKjQG?5g zf%EH#GT(P7lIL+6748Eg=^#8S9VQzW+O+h5Kt1hGy!>LBVKaYk>5Q z@R&T$E?J9811Bghq^h}7a;+yzOOQYQG-Ld<<+8b3K)6)`knW!Gq*@;xO<_;^5}Qy_ zU1AiSUfOP*ECM+-LZfHd1+r$-0$Ib0D7btv&+eU?>THE|7JZA8496Lp6r-7~5hXRe zQ?kdJvZD|O#M7;4nkkx!+@x=f9psn-!V{gtWlUd*>sh~!qN!V>Ca;O)QA1B1@!G|zK zWK&Itvr9^k?q>xOz)T1EOyCZh70{Qr^Vk7an6X1V6eg-EuZOPHc1K8F1UzaXQJ*>` z!C-FGsui;goNsb%HVUL6Y{VtlBY*~cLv Date: Sun, 19 Dec 2021 13:10:49 +0100 Subject: [PATCH 047/433] 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 048/433] 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 049/433] 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 050/433] 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 051/433] 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 052/433] 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 053/433] 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 054/433] 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 055/433] 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 056/433] 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 057/433] 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 058/433] 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 059/433] 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 060/433] 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 061/433] 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 063/433] 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 064/433] 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 065/433] 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 066/433] 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 067/433] 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 068/433] 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 069/433] 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 070/433] 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 071/433] 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 072/433] 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 074/433] 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 075/433] 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 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
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 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 Date: Sun, 19 Dec 2021 19:54:40 +0100 Subject: [PATCH 076/433] 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 077/433] 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 078/433] 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 079/433] 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 080/433] 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 081/433] 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 082/433] 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 083/433] 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 084/433] 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 3dde7126adf0c09fed5c87d4f8604618603802f3 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 19 Dec 2021 21:11:38 +0000 Subject: [PATCH 085/433] 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 086/433] 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 087/433] 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 088/433] 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 089/433] 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 090/433] 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 091/433] 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 092/433] 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 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 093/433] 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 094/433] 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 095/433] 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 096/433] 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 097/433] 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 098/433] 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 099/433] 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 100/433] 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 101/433] 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 102/433] 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 103/433] 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 104/433] 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 105/433] 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 106/433] 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 107/433] 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 108/433] 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 109/433] 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 110/433] 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 111/433] 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 112/433] 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 113/433] 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 114/433] 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 115/433] 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 116/433] 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 118/433] 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 119/433] 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 120/433] 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 121/433] 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 122/433] 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 123/433] 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 124/433] 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 125/433] 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 126/433] 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 127/433] 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 128/433] 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 129/433] 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 130/433] 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 131/433] 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 132/433] 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 133/433] 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 134/433] 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 135/433] 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 136/433] 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 137/433] 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 138/433] 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 139/433] 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 140/433] 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 141/433] 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 142/433] 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 143/433] 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 144/433] 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 145/433] 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 146/433] 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 147/433] 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 148/433] 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 149/433] 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 150/433] 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 151/433] 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 152/433] 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 153/433] 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 154/433] 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 155/433] 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 156/433] 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 zcmV;j8%^YiP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+SQv`b|blxME|jhUIOM}IT+7*JLu*2H3X%Ua;mIS zeY{SVM2ZX|JbW-Wb3~c_zyCSrfB08ItR|*XbIaNCFSgix=S8*8zjl8+8}IM?FU;3x z?(_TR{R7WiK}SA+mi{`v^M3mFg|~CK@%epIU!VB;TFAXG{8*qf>-G9*B=7s@eHUK~ zwf(%vt(K3bj@Lr-b>KDS^%LLCdY<&R`SeD?ODl1r;QbCRSbqEPvLNWkh0c%Xx91ox z;lATTGdzV*UyI?8PnY-hZ0$z}eRA^KEAzeg-(P*_eBWR1hwpruUq0f+Pd{+!yZ6KU zY5b>jc(=%Z{-A6E`~Bs-e$H9-oc&x~j~S2VS4LfDySHUHkVRs+U&}lSKZ)1nJ{pf| zyPbr5*=Yxl>6-IILAYdI>} z+YqxD{JSmgp10leO;_T$c+2Vb14nI}`)Un)$=m!ySDfxwwK8BFJDZYB0o9`5NkM+rCueZS_0+B)vh1j&v z3091W{3)@LLp_BQQ%X6NR84BB=a6GgIp>lEa=nBSODegPQcEknh8k zZh)x0B(Ob>-p^_w@e@z;dAN9R{cNpxH)Ae@fg^C>_9yOA@!j6C=rmlmUCE?yI5@An zTJ-E=UwS@uffmP(QMT6$A^$zH`IPSwGjCIE*aNqZ9j)H1X^rD}xoZ|MHb3sNTbXr0 z`E}}ZA`qUVNTs2_%y9$b2=K1o8~2#@7^YLKRmg+t%MSU}QaIGvac!)TOS@lkVVt$g z>g6ok<28KOg*7Y9!bR=8b~|%(1&ciI^DH2AEZi4M57W3latp9& zG~cu&xCTVU`w@Q=LG#rd3iV!EH>t1P!*-LamUVsgxMo>xpKj@v5h8D5>G>lHpG4Y`)P>9-~*HZ2LGAH;tSo7cG6=4$bEG5TBA%-Bn?0)drvg6p#}!ocS8OeJAOG5x|wW#g+rvu;QM8#^9>KjG2LgMs}4p$TQ9|tD%%?%4_-v z!y{pLggA~FwoZHUg9y3qqY7RY48R%S!^;_~tIT^C<{ARIT=y%R62_ymuvYoD)(@pu6_7%I#kAeJWc9|ao z`OoY!ze=#bYnS;|g8f~)%@t5)ko$qKR%T9k zB(`xz(kc8HS{a%%DB1>9%=G<36U!U2F<=2Xvt%$oBkIE{OR-m zpN0B_4fR4-@2xDip!g9czUT&R)i$c%G;*4J^R`5ryBWy8a_q`JHPO>d-yaScbV3p9 zqVu!xSh>-52zH}?%~nFD$-vv%2`Ge3gCrZa-IgwS7INj1JSf|^ymPU_IW3HQp1gs| z^m<^5F=Z&u8JX|p?)N7AZB|E9TCOab+M#hZbkGdF=Aq7sPMHG&oo1p}VQ!is zI`_#%$vQv7kY7;GBz6xfeX}o=YMR zb;NiqjE309A*f#O}*C@qDPbt2oV<_+;Ow*G2IS21Qr6oV0M@y=1Aiz1R;-*L@Y`& zb~!1BN0GdO^n~aYpliidB+b7o5|4sJfSPqB2`BAT1Ydk(PD+G_I`Q>~JaMW%5gCY< z8Kf#|%OK2dsc>lCMfXXj0f%kkLN71!Otgx{S^NC@kI$aS_PX zyKxi^W!fOqxFR5b`J@g&PcXXj<`d$Ha`DbDNPX<1O&qY5R%ON!twq=)*OfO(XY32< zuXIZ~BZ*y{^OR0FnxYV)I?>q0CMZ4st^9sM8?xC@K%Fsw2cD3S;A@0Nn72*_2oQ*G z-hK0}Tq{JMw?D*I%uC`GKJX>KB;HPCQ7&n7{dT8{z5t96nkn&;$mP`f(P--ycWBaU zK!{6em02hd^0}rbHzMk2eN2qB!?BUSG&~6s*K*W(o!oGC%7I`4ERswmM`G7Ur?Y^C zz#^X7bRtS#ut@%`*;JnWU%B_eeKAH`fom2(CN610)kuzM{h{Qef zN6l{G!?6_|nli#Kq$VeWg(No>=d@-;Z21^7;jODszQAWm7HHerjzCI|?@n)iJby>A zoEp{!C%`)3WV9vFi;a3*$leMHa8_a1?pY#tI9P2W<_ZLjYK4>bqPgruYVG9V7N~wl zJB(^uSLRlY5o9FTUeuBr`Cp8u)zOkHCcFwhIvNoaB+-fvGAorq$tR@~Ju`1XeAPt3 z(jrj&eWjH&_93DmN3E_?)jc*FX5Tj^Nh6jPf7a56rX=a+w5OQj)7OS#*nJ{6R%>kJ zC#V>cux1M!!LV{?F=Higjcj$42zfLrg&<`51fbly_KR}u6e4~U#kM3cG@#^ zx!7dUdIgIqb8@tU!f+qp2MTeQx9ys^ z9_vO{rUmrFm&!Ka22HrqzZRHDxlub)O$mdyhw9A}((LMwwMV-Lg+^u(EBEM;My#Dj)WATp zN-JgvZa6wo>ady8z+{pw;Hhlsbm3fqb}}Q&H(ulXWQO0%}N$N z7xUd0FScKFu}TimMFBFfaS-;Is8vnHZ{kZnINvm+QldISya5_iuPR0tc2P3VGg7oYX?IV1!({sZ$g?)GGM7DWw9zB2{Gw zygokJBDu7yfPBl31d}fT%2Ks3HqmR|z$dxAd=g(i@yZk@z>;4S5tSYBsE?IF_}ReE zN@lm(UVwms@aY}ru}`zCA{@L6^GL7V0J!f2Pj2qTCz)^2AAID*5PpM>Pi8)>x;6Z< zmohgubyj63I`3Em-?a^%9~QX(Tv8|Lp{PSs=^*%|4p8ybFLb6&Z4C6qyA&j)roAkd zHFv<1EWnf$~rzth`W%( zcgpa1MIX$U7c-r4JyQvU925qrI-OE)+ia-TCu$yz3xsJCBc!Aa5KIz! z3mI*mjGBnKOGYC?h1@ZuPAMg3Xf7H6Q1|$FONs$rU>#BxN!M#6KY9Y1;^+lQ98a=R z;E7%&&^6ys_iLbQ?0YAme?E->!6&~VU_raSp|-aTP?2wKz@?`Rz-S<(%7AR#XJEXr zh?9Q+M(H|#eTB|Xe7`>7@DUe3eQgK@ms>t1k?91T>*uzpXPhw7<8OJyiPz8CaV?^*u zy0Fr|5RO>_W~(}FRC_Lvod&iChd!e+GukI=|H7?FMVJW9aJl=a^uqGtXGv{1`tC>|IT{>E zfwD*w4g(h8cilJu+dG=X?5*v*Wiu%s56lEoD3Luf+z$Od@BvN@sPuKaT<+BlM z?oMp|ekZoHPdl+{h|e}G?_75LaO2C2RV0wn%Z*7S$F*ih%F!r}IxS-0jJ@sv7KTZc z&p`m!lH5i#Jwo)*0-E@Zp$BL%sQuW)dMfdoQyC{yzkCHriH%)T1j#0lOasKQ=4l0; zTJTX_-E8DH=@Cy%8V>=7cnaVF_du+MLWG|3UqttbBXadU4D>eOz-d5?g|0fuP&oBE z4Tg@{-l?h}COf>gofSeKX-BZX3SeMST)LM@Yw+3f*TV)!(OR`Z=UxNtINrwN=Z?og zr}QZ4Phq-5^v3B%$$SXY4br9GH%yusDo}P2aT*Sc{6xP3O7(2%*jR}S>AOI*X>g5h zsL) zTp9qRAhx$;->Rj12ZU1L!~G9Zy)*AS0{$U><~@KGxxRIa(M{xZud`@0SV`m)(Ao`K zyFjAJtuwerOk)P0gpj}JWFxnsTOVdvaGtCIo7D9AR^X)O(j5>03au60KdC>+0?-|R zDdgl7UvVe~zkx1I>*|J65YdW#qZWuB*MqneqZO%H#M$Tu4N|*mu5Fk2eLLdW*in$Z ziM*q!(fVkA?Py#SG=EO<*7I|>#YSx!hlCCVIzTfnv(oR-yaVgB#SImRQwP$M(U!7> z4h1z@Kmgp%DPW0oM)+025$y_evPv&h#61L*zAF;(JD3X}5Sya?DPlWmaO!Ky$#jgZ z&Hp=g(cZl82{tKm5dCzXvRI><(Vg5Ks=|!`7$|~_U+mP}29-7upAh24Gn(}2#6Pjq zyctR-ECigCcYQ+zHAb7%5^zdGg%oT7ptfKjeQ}mJWqP%5lF0l*6Xin@@r|mD2bZ;r z;_{-^k?GVS?GC|_8rq63o};WV<&bku4On#Qw86N%A=LJOfLFffU_~*}Hb-O3zcRq`;$SXnFWBg4K+a zNR8$qil!C~$*peNm5SB8#k{@v>hm8ggkanBfg0h)pj?PRRf?LQp15kZx|OXjLnql9 z=w`|$C9VUNrTrAi25o}D;Ymjgt8gJoYQ^W~uD&OY6pp%=BNsO0RqKL}VU5`fHC|p&_&GQs2z# z#)(k9Ok&COy8r64SudkBXZ~c?CCQIj=Gw(&y^Q+KByA0TFzT~OpFCwASAE@6CcI4g zs;A83s;_&>e2CzeJY_y6)mJ=a(kGMtxu?v>r22}d%*Ukqil@wv<@ecB571T(xjy17 zJ!sJ-f(42ZuX{p|Q%A)0;b7u@H3v|BfZB#Ih`R9=rQ-H*$gj|~TerHuw}ZgP(^x4O zKrA6zTlU)gc0oeBYhnumUZ}FDZji-8`=_AFClp?`|}$GzTGGAY-XEZZ8=uddz%w*+2J~ z`RuZP?lJT88x#J%$IL&vN$4kLncpSZ-|?9FU6TDBkC{KYmE%u5X8wiSs;*haX~1fw z>++JB>a;kz49cw?u8EX>4Tx0C=2zkv&MmKpe$iQ>7vm2aAey z$WWauh>AE$6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|=H{g6A|?JW zDYS_3;J6>}?mh0_0Yam~RI_UWP&La)#baVNw<-o+5yT*XA%rDn>WTDX2A<>V9zMR_ zMR}I@xj#prk~bOP6N%@TZdk+{#50?g&Uv3W#7dGvd`>)W&;^Mfxh}i>#<}RQz%xTe zCN)nSA{L7sEO#&~87lEKaYRuy$``UOE1b7DtCbpS-IKpCnAcX)T&EdE97{+b2@x`C zD5C-kQCc-pOr&T(=HVZ4{7G`jM<{bJi6qd;I6 zXx44}``EUdCxHJMxYFAGY6F=4B)#6&B1b^~HgIv>*5p0lat9cG(j`N3BtK1|PypV~ z=$mrDz%9_b=JwXw$LRx*p{|y1fP+I|tVr4G9`Eky?Csw(t^R%hVM=nKkEeM800006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliruB=futJOge?#%n+s_!fnW@)D>6UYFJc-U5j*!`=tnOThlyUIp#2 z-_J(w3UkbaIfrimFM!k~{VwnU_@&CT&lS!9Pl3URF*bmYK&h4EB!PE57KSjkBB1NQ z8{l;eqS*i}4fqM%iAf6o&{~x(5fk91)=uQOC_&7mfEBO;R>08#Hcb=9aqv9Px2>llXd{~=weRM0f-ycG%sU*GELD(Q4u z@M@YyE|=?m*Ph9o`=_R+I6OQI^cM;R;TV-l<@$2CR;vlWkB^Ug%9~QD)YY@LwkCvm zyAD=RB3E-p&Pg9=(Gfd>cAo(?q{ z4K_A5@I3KGY;$unTEJ}`92~H)u%K32p#i>FgvQ3k0{y8}%6E|wq--`TEKpLZ;78G; zqoaXy{I8InpP%o@$8OcyZy8ywR+*ih_1&geEcSGQ^7%aZeExc`@XpQ-uIu`ad7j7a z?yk_cwY7z9+w!xUO!}^+WwLF%qtI2WRq4rhU6<|c?Lc7lOiKYPUy&c+cDy` z62Rve0e=E`$k|)+sJ{@e0}tBd_kb@EhW!dWYA-E?8zEpMVqyFT_)T0T`%Y^Bcn{nS zDc5%(3!GkdgPXufh;#OYvya+((i7k)gs?}z<6c9$tr6gPE3^mtJd96Up Date: Wed, 22 Dec 2021 01:31:24 +0100 Subject: [PATCH 157/433] 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 158/433] 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 159/433] 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 160/433] 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 161/433] 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 162/433] 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 163/433] 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 164/433] 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 165/433] 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 166/433] 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 167/433] 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 168/433] 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 169/433] 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 170/433] 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 171/433] 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 172/433] 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 173/433] 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 174/433] 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 175/433] 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 176/433] 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 177/433] 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 178/433] 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 179/433] 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 180/433] 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 181/433] 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 182/433] 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 183/433] 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 184/433] 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 185/433] 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 186/433] 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 187/433] 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 188/433] 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 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 o2D28nICLwO2_e Date: Wed, 22 Dec 2021 21:06:01 +0100 Subject: [PATCH 189/433] 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 190/433] 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 191/433] 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 192/433] 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 193/433] 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 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 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 194/433] 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 195/433] 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 196/433] 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 197/433] 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 198/433] 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 199/433] 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 200/433] 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 201/433] 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 202/433] 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 203/433] 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 204/433] 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 205/433] 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 206/433] 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 207/433] 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 208/433] 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 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 209/433] 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 298cd231b78d68650f070c94dca30f37305cc5f7 Mon Sep 17 00:00:00 2001 From: Andreas Rozek Date: Sat, 25 Dec 2021 07:29:53 +0100 Subject: [PATCH 210/433] 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 211/433] 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 212/433] 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 213/433] 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 214/433] 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 215/433] 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 216/433] 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 217/433] 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 218/433] 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 219/433] 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 220/433] 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 221/433] 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 222/433] 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 223/433] 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 224/433] 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 225/433] 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 226/433] 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 227/433] 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 228/433] 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 229/433] 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 230/433] 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 231/433] 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 232/433] 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 233/433] 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 234/433] 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 235/433] 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 236/433] 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 237/433] 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 238/433] 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 239/433] 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 242/433] 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 243/433] 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 244/433] 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 245/433] 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 246/433] 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 248/433] 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 249/433] 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 250/433] 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 251/433] 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 252/433] 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 253/433] 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 254/433] 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 255/433] 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 256/433] 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 258/433] 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 259/433] 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 260/433] 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 261/433] 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 262/433] 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 263/433] 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 264/433] 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 265/433] 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 266/433] 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 267/433] 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 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 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 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 Date: Mon, 27 Dec 2021 19:07:10 +0100 Subject: [PATCH 268/433] 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 269/433] 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 270/433] 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 271/433] 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 272/433] 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 273/433] 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 274/433] 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 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 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 275/433] 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 276/433] 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 277/433] 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 278/433] 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 279/433] 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 280/433] 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 281/433] 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 282/433] 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 283/433] 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 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 From 6fab0c8c87fc7d923495f0c11a90f2dc50409154 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 28 Dec 2021 14:21:21 +0100 Subject: [PATCH 284/433] 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 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 Sofwz^0000 Date: Tue, 28 Dec 2021 14:24:06 +0100 Subject: [PATCH 285/433] 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 286/433] 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 287/433] 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 288/433] 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 289/433] 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 290/433] 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 291/433] 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 292/433] 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 293/433] 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 294/433] 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 295/433] 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 296/433] 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 297/433] 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 298/433] 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 299/433] 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 300/433] 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 301/433] 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 302/433] 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 303/433] 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 304/433] 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 305/433] 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 306/433] 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 307/433] 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 308/433] 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 309/433] 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 310/433] 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 zcmeHKSyWTW7ELY}xQr$!ph!p%2LuP4TE>_l5*ZYgSrFn=aKM&9Az=!+A`fkOq#c?; zMM9&XU;vviC<)xARU8lk${<4sA|gac0Mki;z)OF~}k&w$i^Eq^0hO{^K{)27TcO#T8Z2WaqK}uzW!$Wu`Mz+Dy6g!o1lF|JrM_O|zlDLGjuZMTI)Ril3E9r*48fhS~!OT`pze zxo=0)OczNgz{^OHfp~p!@4zV5G7)_MG+EC?^fD>q7!oxS1?Vj&i8B5uz6cTQcA(%4 z9YWPMUVqEvc&k`aKJ9rh9kBEtGHiiE!Dj}L166KO*(6%s>5-EiGhZw;ltFO{WBooqSUL~Hz@dOK3H#7X$pAA@&yuWgMrFf92+~>KMQHL^ajmpHDFO^Zw4+78KDXHjT=I%VqxTi6n{D z>_-jGRB5)YkdyMbxjdzf$heKvygZ9=B-?Fb;zJGG#IeTrll%gCXIuEJD;yP$Gh~x> zJH4-gOG_0iZF;I%R#G-DNHft71v1tP=5$4aPy8!R;qhClOa&dYUD@S~Uu~c8WHLj) z!J&rYq;|P*>Fb z*&j{y?CpjtWU*XE^v}XM{#f0Yh{?TO@8|a(0BhG*ze+sIG&z&L-BRiy;^OEgLde<6 z=tD<3$q`N_oiKn}T~Y8Uk4ugO0SN`KX2vSjp2SW?bQU?^1m#goqf%IvKKrX7%*s&cGl!pSgnp-^Bi>#OKSu)rNk=Um2 zo~4ec2c}CVW@j46k(SUmqpyUxRBd-^i6JneV}6SsPW_C-o70$x73_XJO*f0DZvqPU zvdRAd89sgk#=tyy*JzJk>s0bn)wJBFswYjAiA_h8;B8HJVS5!uv5-HSy$nnM8`G|N zPd4;4(x{~fUn@1F)a27gr{k54D?Oo|SZk26P}}Nq6RA)eg7?!oi( zaPqSHqm>D~+6z4i=fp~m?E4#5{Eg)bFHzu-ugZEGV2Tg0jERGVgNqMo)Lp%tR5?R? zi}-stCt;y_=yk}`xWQjRj6zunW9S{^wxbErFdv{lEthp=KP2)4#JN2oL%;A-Ts}gYG&! z%W?kl8iwv9zb&b8!Uq>lzi6GR1wac6hM|ihhq)qCpxtg1j#{}{`mn%0W-V6>?Suwv zt3P=|-W1U$xHRhSB?1OU0hImMEjo=zB5ucfItaW2hVIZ7DJm?zLjx>X!$f>vkhfu~ zmdCtF4$s?KQ#~^34P{vg2ofK-Ziar#!gPi0UMhsfa zMGpp~S=x0b6t}u!de_B-o&+Pg1Ze=!vbF+hotp3VewyeC{J2H}W$|=MGjmD_qTH2m zDU`j2P=%FxgsL&ge-Z|X6%BQ~#m33SCE;xQROUQxonVvQjK#j8IDX)MiE{I<*mq7k z`bK%bkFTD1SzY@+hZg116xx#1)HwLt?E)0gAIzU_4Y1?@Ga7Z#^<&fDHdUE%XXu;` zgVK1EF~jzd|4_rkBUxbg$msYxuh=gNQ?!_e8_Pg^^s$P>`?o|b+IHQ#Kjq%ux@6nB z7AW^Q971a>CPg_71k29BWyI`84S6FmC+E-eeg~m*rK>;bq90&jyi8N4n z{$(-O*lCQ+UIteHv&4Z7D*|9<2I&rOYl5id&Tp$j)`-j@F7|Y8k9AB)aHu94%Gy9( zP$46F!-g0pvk(Q$=f`S-C2Asj??$%7NSE8`wrU46xS?p+3_gJmb*Y$hrQVM~S=!|w zvDdNmbFPmK(PUBHb7S~pYQ7V6*Nc7NGY-Bk9}v~A27dq;SFw5HFyaTM7|n)T9Wb_d zL1G6}EecjyK-NHabm>6%^t~a~wZSfVZ`p|MtFI$v#Q2npsogSFI`vrotTV`Sptn;* zYYf&sbez(meSW$~UK#vuE-E=OY3zCO;_i+%mZ0qCzF1p!w~S-u*L`@guj9vpzRHsu zB_~{bI8iFu&0=McgS%6^W8r9VmCW?_@_`9wtm3KxK=G9X?eTovCvhwrlzmNcYlgvg9CW-@;5e^mgmeLm41(V1`H^1gbq-4EEYE7&o zc1B?RWRDbOfz48uAdJM<^lc7i^$4%Oq4gK5j*7{l4@xHMcUJ~XO%R1Nk-9R7Q>khk zh>MAeO!N7)Wsh|a17&Fcp7Qzf-Vd^g4HZf9=?aNU__VL;!a_dDHZA^G)7?LZU-*X+uU$(gPIEWJNg?86K8FYp4mU+0xPkacBH{f(v;U4J+|QZ(B}-6)9)Wr#|=py=+7% z;)}=O*NN_%!^K*~4{OFgC~-l?Z>E0$gy^#kdVyUKU74Km{oc~CQ^!OlK1HkGZ6Hr$ zXNhh=0gE)2c6C>Hx*rI?Qqxx4v+pMNP(UUtPs?igX%mHEM)c?vXS46M02&OlTzB>| zVu&u}$u$*6oV0WRUySr^gO#*fht=tO(i3|Xx@epyA9lOBw>)}-V7=rTPVvMlVWe)% z3k~aV-$t#lw{tq0j(h^Mn(*}LEgSIwS%(lKpq{bSMuTnFcO27N$3)2K4>;!PNGNR= zSE+MK+aRYlPA$gf4(}rl0g(C5puRU`6nx>cckcfe{|yez9z2h)dn=R2*I9zuH+K|( z|NRO-8P$7*%+D%_txhomtJu{qbiR3nGV(HzYnk54CpylaJh{hCprx&F3c!eP_M|IZ z6zl?gLs~WeSMe@w9zN^{V)9lok!BD>AC_9<0H{@;L_H2bycqf|Lo^tvMX0hZN}J 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 311/433] 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 312/433] 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 313/433] 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 314/433] 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 315/433] 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 316/433] 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 317/433] 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 318/433] 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 319/433] 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 320/433] 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 321/433] 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 322/433] 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 323/433] 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 324/433] 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 325/433] 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 326/433] 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 327/433] 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 328/433] 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 329/433] 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 330/433] 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 331/433] 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 332/433] 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 333/433] 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 334/433] 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 335/433] 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 336/433] 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 337/433] 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 338/433] 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 339/433] 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 340/433] 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 341/433] 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 342/433] 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 343/433] 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 344/433] 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 345/433] 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 346/433] 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 347/433] 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 348/433] 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 349/433] 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 350/433] 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 351/433] 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 352/433] 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 353/433] 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 354/433] 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 355/433] 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 356/433] 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 357/433] 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 358/433] 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 359/433] 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 360/433] 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 361/433] 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 362/433] 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 363/433] 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 364/433] 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 365/433] 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 366/433] 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 367/433] 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 368/433] 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 369/433] 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 370/433] 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 371/433] 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 372/433] 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 373/433] 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 374/433] 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 375/433] 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 376/433] 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 377/433] 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 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 379/433] 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 380/433] 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 381/433] 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 382/433] 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 383/433] 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 384/433] 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 385/433] 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 386/433] 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 387/433] 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 388/433] 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 389/433] 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 390/433] 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 391/433] 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 392/433] 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 393/433] 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 394/433] 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 395/433] 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 396/433] 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 397/433] 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 398/433] 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 399/433] 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 zcmV-q1e^Py3at#V*#Un9K1oDDRA>e5SWQS9K@^_E{P-`TQpGe{QRBf|@hC!i@+f#J zN-u&Gy-3kREeLuMZIPZlcoC)T#X|95YwN|MD7BQ(gH^G_-ykHYi8hF@^WJ90*lM!d z-K7TN%(D zLY)9s26P5c_wfHN10^LTthBUL6EVDvYJRy9sH&=hoSYmQYqQxjW1w9zE;~CLYHDgE zMpjmql+*a9-TA`8!YkljulGtljln;3D=RByTWf18bai!6-RX2nf+;Yy5hyM$Ch(q~ z9+;Y%0-kcJ*Vcd5g3IM1SwuC3QPL|bD}(ClYLYRN)6>&%etr(8r>BsgpHJSzo)HZ(K@`}_NZ7mY?? za&nUT+-^6=a7euyNL(7YK|ul(6%~=}_xm9diI743TwH%#!2JBY)bsg#;B?v(bsLwJ z^?~ymGbQY_wY9;@%8JBUSXh9@#zyMLjM(i0Bc+ciJEbvU6w{7!OG^uEY-~v5D6Frq zLwkEW_20R3mq)n->gy5T#uxlOiPg~10JF2Ra%>cN*)OJ*u$iV*Pe4q8^73+N zY;JCjG9Z7viO1vc=FMyBfB2BW;9v!pm34xSOiWC`@$oUKhe9D39v+rhxC<2&6i{8* zO5;50swaTD0@&m6$VEFaFaU>#hk^r@pFe+v?(X~W__2cj?AcQY27}ax>t|+WMmkeTK&;XAejX2-N|!$adA8+!?%&;cwjFGEL1hjbPfy52)D;fp>3B5JrbqEiTp z+v?ul9z1_ON?YmX<|eGJt^%GN*e?i+vDXDfLz_MV!Vu15lt)HJXu51|ZNb{w8lU&u zu)BY|OKrGlQ71DqQ?4H|{%=bMA85#PbaX^GOG``a!-x0m)vI^R?OtYHZvpfBhZ$d_ zEF2D#4nLgO+1Z&Pb`gZ4Vnq4-vH$21gZ_R6zqj`Z`27#aR$gA7VKxoR0H4ncvyhvc z%cEY#zI}_ZjEop_IFr#K$lKe3FwtCnqN?82nB$HUUJrY-c{7 zhaDV5StJr>NLJ|UC1DtWWJfYGl4~emaL2d#tF#;CJfi(~zsMAd>c18N^|3NX)5?H3 zaaE6MWk7wb%+a(mU`|}sqgokA6)WW~luAQ?pD7vOcQtzWwV&Tc71?fzCB{s-%*9;e ziqoMG<5y}$Ht_e00+{$>tdx83m1g}Fmy0n$g#W$Be*V;tc^!gj1ke~xA$-k>KH4yq q02$yG62En@YWQP10mD814e%H0p1H@aj&o=L0000e5SW8P=Q4pTQw8lhjz{E#Xg3o5xUm&>BWj95- z5&a2nTnqgJTIj}Ya8c2n1y`=zD7X<+sGuU+EEG)YrZ&+`XHM^&nu>Ycb1y+S2Tsmw z9^W@J_vR!406^+5wgq1-atF92(C7@>4A=}9M!=SkVE~QQZ3cggLuhEgX239j#_Bc$ z#vybJ1OfrzUTdpo33DTu{l_2O6Z{CmK4Z*Fcza*l0nZOR6Ls%lGQcpM!a zEt79;Z7o~ZfXzMla5!A%jEPioD8N}}U|<0I`udc7Fc`$Wy**r6SyAi${{D(~9{X@z zLeXdx?(Xhje0+Z#R##V{r>6(b&(9&9P6K6ye87{MMnp&^lQ29y3}$(v)L>bi$z>t zU)TGIL_*IW`>Qbj2daY56Qf-FEI&3jhMSw4iUfbGt*w7)*|!9^h3cFluJ@*=r}5z6 zK*{g!?&8G6ggWc)?#ABUUNsleHR5qcfQ?5Y5e;m9ejanVoC0=qbcB-*FzD*iGFw|) zSSpq92;03MczFDcJ#P3IyyRVdwW}v_*E$2*X3pWNHSk&{F%?= z&CLxiEiHeEWAz4#$K!fkCved-BOp!(2M5IGC%n18hvI+51wbMJ+2dn)aPB%(QJ(qqo&bSs zVt7|qPzr^hDG~v=zW%%CA#jO+_XNZ;kCXwV&ds}+D|7n8^;JS!Xz;`mXmA3+X252^ zFaoxO3C`V(9 zGnY-h=e69OaA177D83@Y0{S)03-0h$)$)x1d*<|V8U5ykPt8{XK4C61>&ru2=E3KM fCE#;_tD64 Date: Sat, 1 Jan 2022 09:24:43 +0100 Subject: [PATCH 400/433] 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 401/433] 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 402/433] 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 403/433] 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 404/433] 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 405/433] 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 3db8bd43c8e18e817992efa51c33e74f5caac054 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 2 Jan 2022 20:42:09 +0000 Subject: [PATCH 406/433] 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 407/433] 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 408/433] 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 409/433] 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 410/433] 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 411/433] 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 412/433] 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 413/433] 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 414/433] 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 415/433] 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 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 416/433] 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 0e167ada67f86208fb6fb84cf5edd708295933d3 Mon Sep 17 00:00:00 2001 From: David Peer Date: Tue, 4 Jan 2022 08:05:59 +0100 Subject: [PATCH 417/433] 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 418/433] 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 419/433] 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 420/433] 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 421/433] 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 422/433] 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 423/433] 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 424/433] 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 425/433] 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 426/433] 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 427/433] 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 8a9e13b19caaf365680b18d86da28cc6ee4ac2c8 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 11:00:26 +0000 Subject: [PATCH 428/433] 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 429/433] 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 cde46c2cf5c21d74379b64f79f8e2317c54edc64 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 11:03:47 +0000 Subject: [PATCH 430/433] 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 a44ec783f7eb1342bafa3850e14e0113ab957b6a Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Tue, 4 Jan 2022 11:22:00 +0000 Subject: [PATCH 431/433] 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 432/433] 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 433/433] 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);