From 13525cd11dca59b47c815ae909637c4720bd003b Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Wed, 15 Dec 2021 22:11:18 +0000 Subject: [PATCH 001/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] 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/605] Version bump --- apps.json | 2 +- apps/sensible/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e5e9f8f02..f5be04136 100644 --- a/apps.json +++ b/apps.json @@ -4652,7 +4652,7 @@ "id": "sensible", "name": "SensiBLE", "shortName": "SensiBLE", - "version": "0.04", + "version": "0.05", "description": "Collect, display and advertise real-time sensor data.", "icon": "sensible.png", "screenshots": [ diff --git a/apps/sensible/ChangeLog b/apps/sensible/ChangeLog index c50431f51..33e44b70c 100644 --- a/apps/sensible/ChangeLog +++ b/apps/sensible/ChangeLog @@ -2,3 +2,4 @@ 0.02: Corrected variable initialisation 0.03: Advertise app name, added screenshots 0.04: Advertise bar, GPS, HRM and mag services +0.05: Refactored for efficiency, corrected sensor value inaccuracies \ No newline at end of file From 86c90c81ca15c9a186fa1ca861a89adf51f8badd Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 17 Dec 2021 21:57:26 +0000 Subject: [PATCH 021/605] 93dub: fix issue with light theme so that this dark does not end up with a white strip at the top --- apps.json | 2 +- apps/93dub/ChangeLog | 1 + apps/93dub/app.js | 8 +++++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 4a333cdbd..2179e766b 100644 --- a/apps.json +++ b/apps.json @@ -4620,7 +4620,7 @@ "shortName":"93 Dub", "icon": "93dub.png", "screenshots": [{"url":"screenshot.png"}], - "version":"0.05", + "version":"0.06", "description": "Fan recreation of orviwan's 91 Dub app for the Pebble smartwatch. Uses assets from his 91-Dub-v2.0 repo", "tags": "clock", "type": "clock", diff --git a/apps/93dub/ChangeLog b/apps/93dub/ChangeLog index c1b2588bb..1c18ca59b 100644 --- a/apps/93dub/ChangeLog +++ b/apps/93dub/ChangeLog @@ -3,3 +3,4 @@ 0.03: Code style cleanup 0.04: Set 00:00 to 12:00 for 12 hour time 0.05: Display time, even on Thursday +0.06: Fix light theme issue, where widgets would end up on a light strip diff --git a/apps/93dub/app.js b/apps/93dub/app.js index 1b0f69a94..f970eec5d 100644 --- a/apps/93dub/app.js +++ b/apps/93dub/app.js @@ -122,7 +122,13 @@ function draw(){ queueDraw(); } - +/** + * This watch is mostly dark, it does not make sense to respect the + * light theme as you end up with a white strip at the top for the + * widgets and black watch. So set the colours to the dark theme. + * + */ +g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); draw(); //the following section is also from waveclk From 7ad29b48b4bbf224bfa96e8d3f7625089b2398c3 Mon Sep 17 00:00:00 2001 From: Kristoffer Sall-Storgaard Date: Fri, 17 Dec 2021 23:11:41 +0100 Subject: [PATCH 022/605] Disable screen turn on on bluetooth status change --- apps/widbt/widget.js | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/widbt/widget.js b/apps/widbt/widget.js index 88be3d5c9..c7ef8c0ad 100644 --- a/apps/widbt/widget.js +++ b/apps/widbt/widget.js @@ -7,7 +7,6 @@ WIDGETS["bluetooth"]={area:"tr",width:15,draw:function() { g.drawImage(atob("CxQBBgDgFgJgR4jZMawfAcA4D4NYybEYIwTAsBwDAA=="),2+this.x,2+this.y); },changed:function() { WIDGETS["bluetooth"].draw(); - Bangle.setLCDPower(1); // turn screen on }}; NRF.on('connect',WIDGETS["bluetooth"].changed); NRF.on('disconnect',WIDGETS["bluetooth"].changed); From b0dbe1d7d56052a870131342d0e17ad1f132f90e Mon Sep 17 00:00:00 2001 From: Kristoffer Sall-Storgaard Date: Fri, 17 Dec 2021 23:13:34 +0100 Subject: [PATCH 023/605] Disable screen turn on on bluetooth status change --- apps/widbt/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/widbt/ChangeLog b/apps/widbt/ChangeLog index 7aa96ce5c..4c2132122 100644 --- a/apps/widbt/ChangeLog +++ b/apps/widbt/ChangeLog @@ -4,3 +4,4 @@ 0.05: Make Bluetooth widget thinner, and when on a bright theme use light grey for disabled color 0.06: Tweaking colors for dark/light themes and low bpp screens 0.07: Memory usage improvements +0.08: Disable LCD on, on bluetooth status change From d75940b9e617595c0a20d89474876a7e5cb2abdb Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Fri, 17 Dec 2021 22:57:09 +0100 Subject: [PATCH 024/605] Ported cprassist to Banglejs2 --- apps.json | 4 ++-- apps/cprassist/ChangeLog | 1 + apps/cprassist/cprassist.js | 17 +++++++++-------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/apps.json b/apps.json index 8b4e86d52..4f966bbdd 100644 --- a/apps.json +++ b/apps.json @@ -2970,11 +2970,11 @@ { "id": "cprassist", "name": "CPR Assist", - "version": "0.01", + "version": "0.02", "description": "Provides assistance while performing a CPR", "icon": "cprassist-icon.png", "tags": "tool,firstaid", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", "allow_emulator": true, "screenshots": [{"url":"bangle1-CPR-assist-screenshot.png"}], diff --git a/apps/cprassist/ChangeLog b/apps/cprassist/ChangeLog index 5560f00bc..529010aa8 100644 --- a/apps/cprassist/ChangeLog +++ b/apps/cprassist/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Ported to Banglejs2 diff --git a/apps/cprassist/cprassist.js b/apps/cprassist/cprassist.js index 862ae54d6..3e34ea171 100644 --- a/apps/cprassist/cprassist.js +++ b/apps/cprassist/cprassist.js @@ -35,23 +35,24 @@ function provideFeedback() { } function drawHeart() { - g.fillCircle(40, 92, 12); - g.fillCircle(60, 92, 12); - g.fillPoly([29, 98, 50, 120, 71, 98]); + var lowestPoint = g.getHeight()*3/5; + g.fillCircle(40, lowestPoint-29, 12); + g.fillCircle(60, lowestPoint-29, 12); + g.fillPoly([29, lowestPoint-22, 50, lowestPoint, 71, lowestPoint-22]); } function updateScreen() { const colors = [0xFFFF, 0x9492]; - g.reset().clearRect(0, 50, 250, 150); + g.reset().clearRect(0, 0, 250, g.getHeight()*5/6); if (counter > 0) { g.setFont("Vector", 40).setFontAlign(0, 0); g.setColor(colors[counter%2]); drawHeart(); - g.drawString(counter + "", g.getWidth()/2, 100); + g.drawString(counter, 120, g.getHeight()*3/5-20); } else { g.setFont("Vector", 20).setFontAlign(0, 0); - g.drawString("RESCUE", g.getWidth()/2, 70); - g.drawString("BREATHS", g.getWidth()/2, 120); + g.drawString("RESCUE", g.getWidth()/2, g.getHeight()/3); + g.drawString("BREATHS", g.getWidth()/2, g.getHeight()*3/5); } } @@ -73,7 +74,7 @@ function tick() { interval = setInterval(tick, 60000/setting('compression_rpm')); g.clear(1).setFont("6x8"); -g.drawString(setting('compression_count') + ' / ' + setting('breath_count'), 30, 200); +g.drawString(setting('compression_count') + ' / ' + setting('breath_count'), 30, g.getHeight()*5/6); Bangle.loadWidgets(); Bangle.drawWidgets(); From d241cebeb04178e08edd993d7208f04166471a04 Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Fri, 17 Dec 2021 23:23:13 +0100 Subject: [PATCH 025/605] cpassist: work with different bgcolors --- apps/cprassist/cprassist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/cprassist/cprassist.js b/apps/cprassist/cprassist.js index 3e34ea171..ee5b06131 100644 --- a/apps/cprassist/cprassist.js +++ b/apps/cprassist/cprassist.js @@ -42,7 +42,7 @@ function drawHeart() { } function updateScreen() { - const colors = [0xFFFF, 0x9492]; + const colors = [0xFFFF-g.getBgColor(), 0x9492]; g.reset().clearRect(0, 0, 250, g.getHeight()*5/6); if (counter > 0) { g.setFont("Vector", 40).setFontAlign(0, 0); From c5303ef657c7b788da37cd952230573406794d7a Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Sat, 18 Dec 2021 01:00:22 +0100 Subject: [PATCH 026/605] Don't blank widgets --- apps.json | 2 +- apps/cprassist/cprassist.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 4f966bbdd..64abacef2 100644 --- a/apps.json +++ b/apps.json @@ -2970,7 +2970,7 @@ { "id": "cprassist", "name": "CPR Assist", - "version": "0.02", + "version": "0.02-rc1", "description": "Provides assistance while performing a CPR", "icon": "cprassist-icon.png", "tags": "tool,firstaid", diff --git a/apps/cprassist/cprassist.js b/apps/cprassist/cprassist.js index ee5b06131..128ae7407 100644 --- a/apps/cprassist/cprassist.js +++ b/apps/cprassist/cprassist.js @@ -43,7 +43,7 @@ function drawHeart() { function updateScreen() { const colors = [0xFFFF-g.getBgColor(), 0x9492]; - g.reset().clearRect(0, 0, 250, g.getHeight()*5/6); + g.reset().clearRect(0, 24, g.getWidth(), g.getHeight()*5/6); if (counter > 0) { g.setFont("Vector", 40).setFontAlign(0, 0); g.setColor(colors[counter%2]); From e95a8a0fdb68896682492ad9d337869aef259c1d Mon Sep 17 00:00:00 2001 From: numerist Date: Fri, 17 Dec 2021 22:27:33 -0500 Subject: [PATCH 027/605] Create doztime2.app.js --- apps/doztime2.app.js | 243 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100644 apps/doztime2.app.js diff --git a/apps/doztime2.app.js b/apps/doztime2.app.js new file mode 100644 index 000000000..f1866c9fc --- /dev/null +++ b/apps/doztime2.app.js @@ -0,0 +1,243 @@ +// Positioning values for graphics buffers +const g_height = 80; // total graphics height +const g_x_off = 0; // position from left was 16, then 8 here +const g_y_off = (184 - g_height)/2; // vertical center for graphics region was 240 +const g_width = 240 - 2 * g_x_off; // total graphics width +const g_height_d = 28; // height of date region was 32 +const g_y_off_d = 0; // y position of date region within graphics region +const spacing = 0; // space between date and time in graphics region +const g_y_off_t = g_y_off_d + g_height_d + spacing; // y position of time within graphics region +const g_height_t = 44; // height of time region was 48 + +// Other vars +const A1 = [30,30,30,30,31,31,31,31,31,31,30,30]; +const B1 = [30,30,30,30,30,31,31,31,31,31,30,30]; +const B2 = [30,30,30,30,31,31,31,31,31,30,30,30]; +const timeColour = "#000000"; +const dateColours = ["#ff0000","#ffa500","#ffff00","#00b800","#0000ff","#ff00ff","#ff0080"]; +const calen10 = {"size":26,"pt0":[18-g_x_off,16],"step":[16,0],"dx":-4.5,"dy":-4.5}; // positioning for usual calendar line ft w 32, 32-g, step 20 +const calen7 = {"size":26,"pt0":[48-g_x_off,16],"step":[16,0],"dx":-4.5,"dy":-4.5}; // positioning for S-day calendar line ft w 32, 62-g, step 20 +const time5 = {"size":42,"pt0":[39-g_x_off,24],"step":[26,0],"dx":-6.5,"dy":-6.5}; // positioning for lull time line ft w 48, 64-g, step 30 +const time6 = {"size":42,"pt0":[26-g_x_off,24],"step":[26,0],"dx":-6.5,"dy":-6.5}; // positioning for twinkling time line ft w 48, 48-g, step 30 +const baseYear = 11584; +const baseDate = Date(2020,11,21); // month values run from 0 to 11 +let accum = new Date(baseDate.getTime()); +let sequence = []; +let timeActiveUntil; +let addTimeDigit = false; +let dateFormat = false; +let lastX = 999999999; +let res = {}; +//var last_time_log = 0; + +var drawtime_timeout; + +// Date and time graphics buffers +var dateColour = "#ffffff"; // override later +var timeColour2 = timeColour; +var g_d = Graphics.createArrayBuffer(g_width,g_height_d,1,{'msb':true}); +var g_t = Graphics.createArrayBuffer(g_width,g_height_t,1,{'msb':true}); +// Set screen mode and function to write graphics buffers +//Bangle.setLCDMode(); +g.clear(); // start with blank screen +g.flip = function() +{ + g.setBgColor(0.5,0.5,0.5); + g.setColor(dateColour); + g.drawImage( + { + width:g_width, + height:g_height_d, + buffer:g_d.buffer + }, g_x_off, g_y_off + g_y_off_d); + g.setColor(timeColour2); + g.drawImage( + { + width:g_width, + height:g_height_t, + buffer:g_t.buffer + }, g_x_off, g_y_off + g_y_off_t); +}; + +setWatch(function(){ modeTime(); }, BTN, {repeat:true} ); //was BTN1 +setWatch(function(){ Bangle.showLauncher(); }, BTN, { repeat: false, edge: "falling" }); //was BTN2 +//setWatch(function(){ modeWeather(); }, BTN3, {repeat:true}); +//setWatch(function(){ toggleTimeDigits(); }, BTN4, {repeat:true}); +//setWatch(function(){ toggleDateFormat(); }, BTN5, {repeat:true}); + +Bangle.on('touch', function(button, xy) { //from Gordon Williams + if (button==1) toggleTimeDigits(); + if (button==2) toggleDateFormat(); +}); + +function buildSequence(targ){ + for(let i=0;i n > dt)-1; + let year = baseYear+parseInt(index/12); + let month = index % 12; + let day = parseInt((dt-sequence[index])/86400000); + let colour = dateColours[day % 6]; + if(day==30){ colour=dateColours[6]; } + return({"year":year,"month":month,"day":day,"colour":colour}); +} +function toggleTimeDigits(){ + addTimeDigit = !addTimeDigit; + modeTime(); +} +function toggleDateFormat(){ + dateFormat = !dateFormat; + modeTime(); +} +function formatDate(res,dateFormat){ + let yyyy = res.year.toString(12); + calenDef = calen10; + if(!dateFormat){ //ordinal format + let mm = ("0"+(res.month+1).toString(12)).substr(-2); + let dd = ("0"+(res.day+1).toString(12)).substr(-2); + if(res.day==30){ + calenDef = calen7; + let m = ((res.month+1).toString(12)).substr(-2); + return(yyyy+"-"+"S"+m); // ordinal format + } + return(yyyy+"-"+mm+"-"+dd); + } + let m = res.month.toString(12); // cardinal format + let w = parseInt(res.day/6); + let d = res.day%6; + //return(yyyy+"-"+res.month+"-"+w+"-"+d); + return(yyyy+"-"+m+"-"+w+"-"+d); +} + +function writeDozTime(text,def){ + let pts = def.pts; + let x=def.pt0[0]; + let y=def.pt0[1]; + g_t.clear(); + g_t.setFont("Vector",def.size); + for(let i in text){ + if(text[i]=="a"){ g_t.setFontAlign(0,0,2); g_t.drawString("2",x+1+def.dx,y+1+def.dy); } //+1s new + else if(text[i]=="b"){ g_t.setFontAlign(0,0,2); g_t.drawString("3",x+1+def.dx,y+1+def.dy); } //+1s new + else{ g_t.setFontAlign(0,0,0); g_t.drawString(text[i],x,y); } + x = x+def.step[0]; + y = y+def.step[1]; + } +} +function writeDozDate(text,def,colour){ + + dateColour = colour; + let pts = def.pts; + let x=def.pt0[0]; + let y=def.pt0[1]; + g_d.clear(); + g_d.setFont("Vector",def.size); + for(let i in text){ + if(text[i]=="a"){ g_d.setFontAlign(0,0,2); g_d.drawString("2",x+1+def.dx,y+1+def.dy); } //+1s new + else if(text[i]=="b"){ g_d.setFontAlign(0,0,2); g_d.drawString("3",x+1+def.dx,y+1+def.dy); } //+1s new + else{ g_d.setFontAlign(0,0,0); g_d.drawString(text[i],x,y); } + x = x+def.step[0]; + y = y+def.step[1]; + } +} + +// Functions for time mode +function drawTime() +{ + let dt = new Date(); + let date = ""; + let timeDef; + let x = 0; + dt.setDate(dt.getDate()); + if(addTimeDigit){ + x = + 10368*dt.getHours()+172.8*dt.getMinutes()+2.88*dt.getSeconds()+0.00288*dt.getMilliseconds(); + let msg = "00000"+Math.floor(x).toString(12); + let time = msg.substr(-5,3)+"."+msg.substr(-2); + let wait = 347*(1-(x%1)); + timeDef = time6; + } else { + x = + 864*dt.getHours()+14.4*dt.getMinutes()+0.24*dt.getSeconds()+0.00024*dt.getMilliseconds(); + let msg = "0000"+Math.floor(x).toString(12); + let time = msg.substr(-4,3)+"."+msg.substr(-1); + let wait = 4167*(1-(x%1)); + timeDef = time5; + } + if(lastX > x){ res = getDate(dt); } // calculate date once at start-up and once when turning over to a new day + date = formatDate(res,dateFormat); + if(dt2200)) { + } else { + // We have a GPS time. Set time + setTime(g.time.getTime()/1000); + } + }); + Bangle.setGPSPower(1,"time"); + setTimeout(fixTime, 10*60*1000); // every 10 minutes +} +// Start time fixing with GPS on next 10 minute interval +setTimeout(fixTime, ((60-(new Date()).getMinutes()) % 10) * 60 * 1000); From b2a4ede70aff4818435333ec5ae84a9cbf2c3139 Mon Sep 17 00:00:00 2001 From: numerist Date: Fri, 17 Dec 2021 22:43:14 -0500 Subject: [PATCH 028/605] Create app2-icon.js --- app2-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 app2-icon.js diff --git a/app2-icon.js b/app2-icon.js new file mode 100644 index 000000000..19e81c45d --- /dev/null +++ b/app2-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("lEowggdkUiCKIADCJcCkUjmYACmUikAlKB4ImDAoQSJkYhBFAQECAQI5HBQU//4AC+YUCHowzBCQfzAYYKCEw8vEgYqD+QoGgQbBHAYADCwIoBCYkiEwhPEBAIoBHgY6BExHyHwQhBFAQ6BkYTHDgcyHgcCHRZlDCYQsBTYg6GDAJQDPoI6LAAIPBCYRiHHQhkDCYRiHHQhkCCYKKBCYzzBA4yMBCYTVEGYITEBYITZHY5PHUAJjITIJjHRZINBIYoTDWZAoFWYbbJFALbHgUyX4oPDXIcjMQITBmZkHFYszCYZkJMQoTCKAQ8IHQZOCHgYoKkQ6DHgYoEcIgmBHQg8CFAIPCCYfzBQQSEFAbrFCQImHFAQUCkczmYECAQISGHoYzBAAQFCCRA9BEwYoDHI4pFAAgRLCooRPABg=")) From 028d23654927aaf24ffbad4b51b32b5bf18eab52 Mon Sep 17 00:00:00 2001 From: numerist Date: Fri, 17 Dec 2021 22:48:54 -0500 Subject: [PATCH 029/605] Update apps.json --- apps.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 3e0ab4181..1c8f1fff8 100644 --- a/apps.json +++ b/apps.json @@ -3194,4 +3194,19 @@ {"name":"doztime.img","url":"app-icon.js","evaluate":true} ] } -] \ No newline at end of file +] +}, +{ "id": "doztime2", + "name": "Dozenal Time 2", + "shortName":"Dozenal Time 2", + "icon": "app.png", + "version":"0.01", + "description": "A dozenal Holocene calendar and dozenal diurnal clock for Bangle.js2", + "tags": "clock", + "type":"clock" + "storage": [ + {"name":"doztime2.app.js","url":"app.js"}, + {"name":"doztime2.img","url":"app2-icon.js","evaluate":true} + ] +} +] From 8a898a7054f57f3846d5182fbe374cebaa3987cf Mon Sep 17 00:00:00 2001 From: numerist Date: Fri, 17 Dec 2021 23:25:09 -0500 Subject: [PATCH 030/605] Delete doztime2.app.js --- apps/doztime2.app.js | 243 ------------------------------------------- 1 file changed, 243 deletions(-) delete mode 100644 apps/doztime2.app.js diff --git a/apps/doztime2.app.js b/apps/doztime2.app.js deleted file mode 100644 index f1866c9fc..000000000 --- a/apps/doztime2.app.js +++ /dev/null @@ -1,243 +0,0 @@ -// Positioning values for graphics buffers -const g_height = 80; // total graphics height -const g_x_off = 0; // position from left was 16, then 8 here -const g_y_off = (184 - g_height)/2; // vertical center for graphics region was 240 -const g_width = 240 - 2 * g_x_off; // total graphics width -const g_height_d = 28; // height of date region was 32 -const g_y_off_d = 0; // y position of date region within graphics region -const spacing = 0; // space between date and time in graphics region -const g_y_off_t = g_y_off_d + g_height_d + spacing; // y position of time within graphics region -const g_height_t = 44; // height of time region was 48 - -// Other vars -const A1 = [30,30,30,30,31,31,31,31,31,31,30,30]; -const B1 = [30,30,30,30,30,31,31,31,31,31,30,30]; -const B2 = [30,30,30,30,31,31,31,31,31,30,30,30]; -const timeColour = "#000000"; -const dateColours = ["#ff0000","#ffa500","#ffff00","#00b800","#0000ff","#ff00ff","#ff0080"]; -const calen10 = {"size":26,"pt0":[18-g_x_off,16],"step":[16,0],"dx":-4.5,"dy":-4.5}; // positioning for usual calendar line ft w 32, 32-g, step 20 -const calen7 = {"size":26,"pt0":[48-g_x_off,16],"step":[16,0],"dx":-4.5,"dy":-4.5}; // positioning for S-day calendar line ft w 32, 62-g, step 20 -const time5 = {"size":42,"pt0":[39-g_x_off,24],"step":[26,0],"dx":-6.5,"dy":-6.5}; // positioning for lull time line ft w 48, 64-g, step 30 -const time6 = {"size":42,"pt0":[26-g_x_off,24],"step":[26,0],"dx":-6.5,"dy":-6.5}; // positioning for twinkling time line ft w 48, 48-g, step 30 -const baseYear = 11584; -const baseDate = Date(2020,11,21); // month values run from 0 to 11 -let accum = new Date(baseDate.getTime()); -let sequence = []; -let timeActiveUntil; -let addTimeDigit = false; -let dateFormat = false; -let lastX = 999999999; -let res = {}; -//var last_time_log = 0; - -var drawtime_timeout; - -// Date and time graphics buffers -var dateColour = "#ffffff"; // override later -var timeColour2 = timeColour; -var g_d = Graphics.createArrayBuffer(g_width,g_height_d,1,{'msb':true}); -var g_t = Graphics.createArrayBuffer(g_width,g_height_t,1,{'msb':true}); -// Set screen mode and function to write graphics buffers -//Bangle.setLCDMode(); -g.clear(); // start with blank screen -g.flip = function() -{ - g.setBgColor(0.5,0.5,0.5); - g.setColor(dateColour); - g.drawImage( - { - width:g_width, - height:g_height_d, - buffer:g_d.buffer - }, g_x_off, g_y_off + g_y_off_d); - g.setColor(timeColour2); - g.drawImage( - { - width:g_width, - height:g_height_t, - buffer:g_t.buffer - }, g_x_off, g_y_off + g_y_off_t); -}; - -setWatch(function(){ modeTime(); }, BTN, {repeat:true} ); //was BTN1 -setWatch(function(){ Bangle.showLauncher(); }, BTN, { repeat: false, edge: "falling" }); //was BTN2 -//setWatch(function(){ modeWeather(); }, BTN3, {repeat:true}); -//setWatch(function(){ toggleTimeDigits(); }, BTN4, {repeat:true}); -//setWatch(function(){ toggleDateFormat(); }, BTN5, {repeat:true}); - -Bangle.on('touch', function(button, xy) { //from Gordon Williams - if (button==1) toggleTimeDigits(); - if (button==2) toggleDateFormat(); -}); - -function buildSequence(targ){ - for(let i=0;i n > dt)-1; - let year = baseYear+parseInt(index/12); - let month = index % 12; - let day = parseInt((dt-sequence[index])/86400000); - let colour = dateColours[day % 6]; - if(day==30){ colour=dateColours[6]; } - return({"year":year,"month":month,"day":day,"colour":colour}); -} -function toggleTimeDigits(){ - addTimeDigit = !addTimeDigit; - modeTime(); -} -function toggleDateFormat(){ - dateFormat = !dateFormat; - modeTime(); -} -function formatDate(res,dateFormat){ - let yyyy = res.year.toString(12); - calenDef = calen10; - if(!dateFormat){ //ordinal format - let mm = ("0"+(res.month+1).toString(12)).substr(-2); - let dd = ("0"+(res.day+1).toString(12)).substr(-2); - if(res.day==30){ - calenDef = calen7; - let m = ((res.month+1).toString(12)).substr(-2); - return(yyyy+"-"+"S"+m); // ordinal format - } - return(yyyy+"-"+mm+"-"+dd); - } - let m = res.month.toString(12); // cardinal format - let w = parseInt(res.day/6); - let d = res.day%6; - //return(yyyy+"-"+res.month+"-"+w+"-"+d); - return(yyyy+"-"+m+"-"+w+"-"+d); -} - -function writeDozTime(text,def){ - let pts = def.pts; - let x=def.pt0[0]; - let y=def.pt0[1]; - g_t.clear(); - g_t.setFont("Vector",def.size); - for(let i in text){ - if(text[i]=="a"){ g_t.setFontAlign(0,0,2); g_t.drawString("2",x+1+def.dx,y+1+def.dy); } //+1s new - else if(text[i]=="b"){ g_t.setFontAlign(0,0,2); g_t.drawString("3",x+1+def.dx,y+1+def.dy); } //+1s new - else{ g_t.setFontAlign(0,0,0); g_t.drawString(text[i],x,y); } - x = x+def.step[0]; - y = y+def.step[1]; - } -} -function writeDozDate(text,def,colour){ - - dateColour = colour; - let pts = def.pts; - let x=def.pt0[0]; - let y=def.pt0[1]; - g_d.clear(); - g_d.setFont("Vector",def.size); - for(let i in text){ - if(text[i]=="a"){ g_d.setFontAlign(0,0,2); g_d.drawString("2",x+1+def.dx,y+1+def.dy); } //+1s new - else if(text[i]=="b"){ g_d.setFontAlign(0,0,2); g_d.drawString("3",x+1+def.dx,y+1+def.dy); } //+1s new - else{ g_d.setFontAlign(0,0,0); g_d.drawString(text[i],x,y); } - x = x+def.step[0]; - y = y+def.step[1]; - } -} - -// Functions for time mode -function drawTime() -{ - let dt = new Date(); - let date = ""; - let timeDef; - let x = 0; - dt.setDate(dt.getDate()); - if(addTimeDigit){ - x = - 10368*dt.getHours()+172.8*dt.getMinutes()+2.88*dt.getSeconds()+0.00288*dt.getMilliseconds(); - let msg = "00000"+Math.floor(x).toString(12); - let time = msg.substr(-5,3)+"."+msg.substr(-2); - let wait = 347*(1-(x%1)); - timeDef = time6; - } else { - x = - 864*dt.getHours()+14.4*dt.getMinutes()+0.24*dt.getSeconds()+0.00024*dt.getMilliseconds(); - let msg = "0000"+Math.floor(x).toString(12); - let time = msg.substr(-4,3)+"."+msg.substr(-1); - let wait = 4167*(1-(x%1)); - timeDef = time5; - } - if(lastX > x){ res = getDate(dt); } // calculate date once at start-up and once when turning over to a new day - date = formatDate(res,dateFormat); - if(dt2200)) { - } else { - // We have a GPS time. Set time - setTime(g.time.getTime()/1000); - } - }); - Bangle.setGPSPower(1,"time"); - setTimeout(fixTime, 10*60*1000); // every 10 minutes -} -// Start time fixing with GPS on next 10 minute interval -setTimeout(fixTime, ((60-(new Date()).getMinutes()) % 10) * 60 * 1000); From d689849f256decbfde076d74f7c51988b11a8d60 Mon Sep 17 00:00:00 2001 From: numerist Date: Fri, 17 Dec 2021 23:26:17 -0500 Subject: [PATCH 031/605] Update apps.json --- apps.json | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/apps.json b/apps.json index 1c8f1fff8..df7c28af6 100644 --- a/apps.json +++ b/apps.json @@ -3195,18 +3195,3 @@ ] } ] -}, -{ "id": "doztime2", - "name": "Dozenal Time 2", - "shortName":"Dozenal Time 2", - "icon": "app.png", - "version":"0.01", - "description": "A dozenal Holocene calendar and dozenal diurnal clock for Bangle.js2", - "tags": "clock", - "type":"clock" - "storage": [ - {"name":"doztime2.app.js","url":"app.js"}, - {"name":"doztime2.img","url":"app2-icon.js","evaluate":true} - ] -} -] 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 032/605] 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 033/605] 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 034/605] 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 035/605] 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 036/605] 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 037/605] 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 038/605] 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 039/605] 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 040/605] 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 041/605] 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 zcmZ{LV{j!*u=Y90iEZ27Y;4|t+8Z0c@l1^~Ek?qq8unsmg9{_BWr16eiTOE+x{(EG)bHHvCfmGzcRb^fGdIUMZ) z?b|~Mc7F8zd)gNGeuzU>d1Xvny((XM`bFq5Ji)Q!_x<6Gz`wQkXYc(TuU9Wgd1*v;7JskKuG$3LZ2k1g{Pd{3`|7{ao+sYFuUx*aglT+z346b9 zM%O;fzAqelzvDix8h>H^d)ez~z%H}zLD%c1A)njR%S(LrlT7+o^tI!G(s$;S_jq>Z z*X?@y(bh-5`+DcA#Us$?o9o+!KD$ ztr;vwPQy^FTAv+5rzo!7^*7w3QOI{K1%}x6B-!{Es_ykg$+41HA9i(_Pfp*yG=n^z z>nGQ9??;&KpOB1{QQx<5A4NppJbt~u&iOiiL-+dqqPwM=v~EYxlJ|R}g-6|8%f!_A z^>O6;i1#na5Dk;Qbvg$s+t-J&LHg}LXW}~BUGHJzuYyIeYcFFz>cd7z77PsB8?G`8 z+Z(1aT!72qqK4Gg=g%N&Xz}zVx!@9L`L>>`119o9?CT=N?rBQV@ z-1m~>SeTgzcL&GX=iaMQgjB*M+liGN7U9 z^1}AHaWvQ8`H2#$yWDQ0Squ$rj}$cx9iJFBj@zau#;)7e4??e8_eGLV1-_Xa-_Z;X zUEPaQo!>n-e|T=a-!^5K`W`Q>>-ru}-Ku=FUfR^*`ZRCrYA}1NDWgoi^gayPe785- zWIzK_2{ZMY)4(VWEkIaoW5ylH8THhJnXhPIp=dQ`WVBNteJI2eLPPicj;jFuYnrPQ z#XlL>C_ghUs--Uu`ZJSGrm3&p-+l%yEDS~DEb)bk)|X4*>+S3bk@MWy?-Zu^ltx#aChvmVb7B-e|lYL5c1OJjDvUPdav`J!X__kE9&-`IHFG zf1AHPzPxz2L2|IbX%+mc*^`{<3q;!oa9tbWmyqN8r8bQqU#6S><^F{A#C0F>sq4&` zt1-4rS+X)dbJp7k%G-d(odcFB_d@#ChS=Xu!J&S z7p>Ug+u<{9j+ix`@^x?Sr{{8w6BCj)k`GC5uJNu*?MCC3pip{O9;9e23W<8jTEX;jHn+l($K3{(fQo5XGA{(P36)MCUph-mFP5ap4M+_Xjd|%bROAm*x zKhL0w26SCp=UqovF19rt#RM>-hI#iMi(Q$S<}a{1H(2sGVM^zM_Y)_ZkS%w*WD>S& zkPh`a(|KX(;-!D#!C#p$KL7(yD?ozcTuS1pn^b5qESLAx!LE|5RVy9O@9Y-Ue6LR)T3#$nT5NnV8Fxs5bU7iAHj& z_ul(mcPDLfqtwMZUT%eV`y!qC=dqh=#cZm4mU%YIrj&2?;ePFd} zv>d9tIh?9t=J)G>RqT?4yB6;igziVPJ|L#(3ZXx^Oe>hu2=0BhT`l*swvD2bJUvYH zb^K_9ISx)zef!t}?;s z=0-L8r3nHoK-xo+1Cg)t{eDhi%Ad^`AgM>;qz{E_W?;0J$7e=r{&;oIJL5srj1el#w$zp>BkcJz0=;_ZD6s{^3C3 zvz9B3v7f{DBaPbuY|(|=xUz);6L?SY{X{Yfi^w(~QT#W6ORHJ`5zVF#R>s5-+&Y$^ z@$rG4tqaXwgXz;>QY8IwJ05u+{!PC}SJ=5N{k4geR-%OwNMOikFM!XU>R{ayu-5-u*&VH;R{`8`>1n+-FvH!) z*nvN{eW8Iw-GI0uQnzDHg4T{aw7=(oBnS$GSUQC9hqUL&A4f2BdW^?hpW$$x%_v1a z6l_%rg?C3QL>AsnJ|77u<@J%SdpIKIb;!#Y1Z5POGfpp!+1o+~2H!NmP2QpRgIpbn z-Y(eVPm^F5v;4+JLvz~kP>%@o>9S|y40~E%e5Cg%Xi)MSn`dvvd`xze73sux*Nw@^ z@6>GYYpC6@h@!v)D4I)0q+gv z8RUAhAg5i~i{XgSqb?N&LRuIo3oVTXn(};XyRE8Lx+_-B)AFhzriAky!u@zQF;RXF zykuRQc=&bz;v?@;%I2Xe$ZaBxk zS(I3FjI`XS;}rV@LWk7tr5qUG;`p>QaoliViy>B)sW!nl)Eb;@Df}ajWxALkHP*_y z=xK@w@qT^JYjIgsK_fh!+wdSbDr9Wp!RGOhD7C(OTJt;~X8N(On4mY5;ubm39%nV! zQKYI#6&r_Fz4~x~mM}&b(Tmd(XX;0ySg<(qNbC!NH2I`YJiHJw7rnI<6s9DBwC{mgy>4;CQA4bfZ`c9-AdL{)U{G=Ahz z(RyE^15zE~!?c#TK(xZc2#g*_I5~^Igw8FdV1Ci1cOUlB4`V8 z22vGd@zfEsB?q6wE?^I7F<`m#Tnmi|U`pNjT^uHfaYpM1yN3ncCP!IIyBCTZs_Nsz zu7ZfKD?--7M8I^^IZL1*_W%fEB@y3=X;@QEyuhn1sK4mJu<74iFonwChj{U7Ym9dbTm`LrJa?vsyyJ$!HCB&S6FEI*Imd6D;?A`)YfD4>IzXQp{ zM#y=iOu-Q!FuoyiCzkSSdsDBpitqy@jY8IKVynZ^9-!O;;Mp9mIAaWj^N6XRDr&U| zHPDu7Q)GeguKNWhU=ZZ`e7aDuag!%hnL)=iiJl9h`_RtN;+&Xtd8<@z;CbU5)RzZ3 zssX;r@j~vgM@bK@AGaAep(x^{yDnO3}dwLjFMVio6> zo~ZKgO5gaZE8!Bg={U{mEZ!LMVIzrHHAzVb1Ku;#ufn;S!iY5zD7Jb?$6T3Ui$AsU z(~1%4ah2iDgh_J`Oc@f{j}&nh^DH5y%p^?#;sf`7$ly z&O91ptnJ9yNdH8HN_$k%4uC&stR9GErPB59#Jl1dL*VW0&M#s0@Y9x6(MpXl)O-Tk zyRS7(`#I#&Iql({v>z$enoxu?)Wl1kqyp|EUz`EBxs^ur9{p7ojsE`pWkIQ*9K;no z$EP32Rr2~=mCN>8kHkRVFr_$6c6b*%(V;-TTy-%+(hD~W5(iB?Yv&Gu`G1ub3lFyd zy8YBQ?0}zEnaRSefL7^YNt!oij)~281?a*JYsWwwMzqpOtP0KEEtm{MEi$G+TsE?y zadPkZ(U1ht2{~_?j>sp4X=7?x(EZ@z1WF5fGUcF+)YMR*(nfmvegAz|fycPmXwGvn zgwuY$avmXXX#Ek=5zQQ0aZ)zSKeGqJxb3ZEav&6GH--h=FfwM?`}-IK#cXlYfkj)v z+B+&oyHN^WtI7c@f`my8-#QYL$kZb_3_rR%6syr)N!XQz?qOazX^xnN2R}8|?n(h$ zL^CwsxCR{vZ;y*yZTU%;A$mrE`EFaPey6dkr~)@m&R^6Dc0?1Q_AZjLp2z9 zQ5>3bJ8B$-nJh)MQW7{V@(NWH@!k!KflU1iB4A;p7d^)HwEJl4z0mTES4cq=IdoR4 zd19@y>tM^%oISas9m%PIpasKx5;5VcB(;MKVNa-RI|MpLqmc#JA5uU+?`O&x*k>2V zDw12dKcc;=Kz@+Dj=jT`Ejxid|%pqHkH*w=f8WyV=pUAO;I3pz-*oA9PT?UB9SeHL=js$$X-d{3KM9mjbeIb7B30yuLm}9Js?Xyt9(<`nFNEL3;X&tT>PHxk z6uS2owvvpR>GzaZIx#h)WWTgukLG#>*?AxBg9MOc9J0a8X67|EYtg5trq72>Fdfqegi>mLQ_5eCJcN%E)3 z6c&Yait6tEfo5qlpiTLY`X8^$sYiX(*evg`YhBl7gmPD{%$qsC}xQe&^(oRC&V1;Jq?&R+)ql z;dq}{k&V}a>=)VP?|3(4KJPl;0;O6ihz8IicqC_BRk~IRe)~LaSGLc@5(qoK=Cu{V zaseGSTv)U*d>;71eJA=TSWRZ9cUcDnKYNDqnt?<_4UCx5Tes9{XIB98>Nw;X!1D$i ztp-u9ttXmR$7rXrzcbVr%Uo#Qc6AY&v}h8^MR zVzakB6D?}ExShBV3etd&N+Aw%$O^YX0tZMYw!sO@Gcc0o?fH=t&6DUVavp{smMx%* zCU{@~q9859y`2G~X_^Xz?>2wkv}Vx`5`IMrL<#6&S{m9w&SIcZ3^Yx=UhVwv*spT& zSgU(-sf4e!Bxz((J8&;4$Lf7&IMBji%2SE*6s_8_IIlsWvIw0>i8Ovhix?NeL4OKQ z;^;yIuj$4L1{<{9ggS!W8z7RM{_#X}@eG3iLv2{ZuX){}ddcCh9Zi`xv>H`i1^v&E zr|r!HvnU_L?hA?w#|N(o?yqHfpejseJ&-$9Mz3lL!#GEc z#z6?{(h>P0*^m$v`F_t!g!?e5?x!~l^>D#)(5iTC<^3_ z@;^{8)gzN6dPrrZOJRu!(%i8Joh zU0=i=hWm^}G6jJ6bQScHrh^n$$HGvXmj;(VS|f;NI#|sh%9Fa@H~>NQHNe39~7 z7~_y)VDR5X+N2pdUexk+c~-LtYRK#U+&J3PBZL@w!ldXA#7iL63uP4~sx2whgPuT> zK+}5*jqFdsg_94B{njPS0cq$Y;Zh9=K(bw7(^+}yO4~cZMa3;+Fq#BR><@u}wFJb* z%zTxc7ploL#0Ib<5G9#I9Q)~PQzddR!$BmShFYyV&G%h6E-J|*EGt=Ee^e}`r)!w| z(E@^rkh(qA4*(7?x{J5ke%|7+@G``?eAvIxQcO9qiK;FW3a<#YLL(A4c*+)iSi)sW zn|vK@Z3x6JmeN1_9ajsZX0(E3nIy9WD|2>|ZlCkN@KT07t@vOnv~)%1M2u$gy_D;2 z1nsu@z^%e~+;^Y_xccR)EGs-b3h*O%i-%d9_kg}~~Wts=*6Y@0z0nyW>nHl!{vEk^sOn)9Ko2ZQ6^s_?^)Im9A{yOY&nK~kx~ zOcCoyd}+PB#-(!4gt1VNiJ=EB*e#QfbRaW01K^+{c;T8L5CouEliuZ}Jkb|Pm~1k| z1c&#}6U*XseJP0JGT}xHA+w;d127l`x1S$a@KDrFlrgAoj8xyr+3I6Vo_kjMYfTUc zB~B>DW|Go6eqJ#n*BbGCTVVqgg|MO3N86cGezlKUB6uvb$2 zq*(QG*12=(YjekvW9+-Z3J~|l@f4DLCeN8jM^a(6)fiOAT$YQrLm!CYh0BJn805N)1JBX*kH{i{{_dF& z*1_BrvBw1+oZEv>-kQcdgV-#mg5Eb^HU!XYX^_x^{RL&C_F%Et%0XDH04@*gfD}_B z;cY|M6fS%&j5>`5r4N$rU?W}Bw#xr-WnDe#pPVqNOtt#VO54!h z_~apjGvyY$kGE2`+r|9Xk_PNrs1sVDrSR=FH?ifgmFXd>3j$Jp7SjqW${`ZImDNuu zHxOzXnt>&cJJHt2Joo1zS*O9NbzkuejXLedAZ_^Fb}=VWbSW zq&RlaT-bir;x-9q$!F^ySboYoU4ro~fcJ-&IUH04{Em!w{#G@D-0^AZD2L-W&HfXf zQ!r&L#sbbZ92%;5$GG8^j@r>z{tN!DRjYM8smJxTOh8svlr4kpwb*L;qS9@ERf><7 z{p}6b(qDl9>d_q?oTn5G)O}43uoX5rSPH*K;2P8qH z66Wkbb`h!h6h`dW;*BBj{5OI$f+)qMRA^3*P$Wc!80=F?ZL_RDi|cT$|GB6Mv<6xg zA;GAnMwSD{^E!LBHBc18wg(!qD8%9(#bK?Wd!ZT=(dyfuGk%@d=6_$RTSyw%u81K? zfuGVhM^*At>FbU5!{-PxK-MwFE$j93)>x+&<-+hJQl4i&s*|B?Y%s!VyoUHcoG;n4(h)MKdeK!s?KW` zu`{br2AUdtsjZzgGvvW%>q-=qV0^h}95{Z%9}uFc`4r5}i#8fj@o3E0wHPi%7N_(& zM7sSHwO(JRt*T*eu9?M)%_p^kPDk*|21$bj@FsgVuT0+JETOGd5>~iFrgZ!!%wh?v z!IHDpI%p^%ELFrgA|JoCN*mG%x@)0% z8*AFF`c+jPMUIEIs-j85DBmS~=#-Qh&HVSkc!+yk&TiKh$2D0>=aj!4(AC{Sg-;bz zRrn^Lt%TN7=&i(Es^Us}*TvNfME<+BQU%74TY7s;=8aq2{lw20!fX1a>35FeHll2) z92gA^u`dKUO*9{jNhiLU%-a9LN~2X=i7Ob2arXsnF9$wE2&RoeamdzX2&U@`GJK4` z2Veb@Eg1#6t$m~>hrU-q3XUo+t3X^{G2`-|Qe!z(GNjJb8}ppqw7=M#Rx8gM5g&`+ z&VMMdR+lPRW-F!O0>v~8>YoJMIo`7v|u(f4Vu|{v$Cv&ZCDqutmjf;{}O!PC! zcD`JM?BC0NeD#*%8Fa#4GmS7O*kHbi&7m0D`l;jsB>&nhCxmZR?4p>lgem;5?Nu{! zqo8e4FUDeh&uxwcZOI#r#>_3jY+Ts-!c6*TMVc7QDl}7;z?~cr(!Ov0({UL!9{~2c zDq^%|mM*W373%#N4$G?l$6vFD?&4@@aMINJq9|_;)iaxLEW4@KTcNd@aM=V$+j`%a z6%vv0+aYnNEeIY1TyqQ1K_H@hl0@lFRyO27O42%Vep#yH`RW-Xl-JEe%`2H1c#GqC^e56g{Tf|Lua>k>*RZ_g?plXfCP#-Sbq=a?-U@&pbN!hms z$FJT9Olu-A7FHrp7p{d&xy^tJ;Vi{YMd(G+>aDQ_Iwm^sK)&jq;j#;lz0visQ%$)> zB$;nw+cQ@HYv>T^M!6E3L?g_IQ4Glf+(mWga;s8^D%xhtRqTbm-R?JgrMA_%b9PZi z*OSn4_~L0kas*N3Nttz@hd;P%#u^17#1yWwl`D49e31L#Y!X7Jiphg8SQxPOzkdog zp;S2*xrSDT%kyIi8q55EUq6}9bawGgC|7Hqa=L_q*2LOm-dr{m`w5gQ8#%C)prj6ofi1g4>>0?hQR6?|NRwbgGROx1-Nt?zb zaUJEVdnrh|7xO zWMj)a7`4BlMApzyKscg8SS|LHeSepQqH$Y5akjF~Vwj`KO|c6#3rnZ)T@|5~PkwoQ zm+^#pMdjO${5jBM(<~}f+5xgSSpj^Fqt8oCeerUvotKCDWqn5t|`P+ zL6TM)LAvoMuUP`|yOk)K30H9h!K|3*pa*#4SLZ4AE%+iE9wME_q)lOWQ4Da^__j|8 zOIq_Q@UMxd8wvAIb%&SLtu`I=Z)5_zVlqu=_$}RF!lP7@*neK)Lk9C-OJ@sm0O+8S ze=Z{J$!qpo~+p=GL zRFC%dk9{s%>mMytSGOSKG{s%s3@S~M$tD}SVfBLXWwVwcV8Wf;R`|gpra$>Lp@=c2 zIpH3z3YA^%vD6^-w+V04hh6gM8s2W*3jj-~Ki`r1T8=IeQn=`GMP2iR=-5V{4m-z=il@j_`qV`)BmxH)(LYQ-!I3D7nVv z`&Fdk8XF=#ng>7j%1zf>wEJ^v)Ed+;;p5mAt%MPV#)6FA8%Xlw6mXLYPj{Pj#6Fn( z&4S%A(K*yo;g0 z8@}b-d&3n?3iLo8RZE@>9g)93-9CP{T~>^R#-?2(&U~l)6nz9)F%^sD!ff+ON9%*D zsOY>e#|NP1HnVk~v>+P|Y_5OdxYXrYy59M2^WSHvz42eBTY^Wk*Oz}yV6YWdU1;5! zyOI(mZM@O^6CsHBX?q{4pQtL6jIB)b_Zaf!oN~ispWCQHdB3%72$zFmZ?C4{;|6JV ziE_{C#F*)LF_xRpK~#h)xJ;B;KYsw`1fxy~)-KMhsUvuv8FQc|(Ckwc?H!)h(iTAo zqaX%Dl}}~(4}-Crf-N3uO46cxrrz7O_`KOsp%0%GBSDEaKQY!76lNC!>Eji<@29m;^gOGM!8nQz){#~aU45}ybQ`c~E!QE;kd)1he>ctq53#oo zLfi9VBYD5|4;o@^hOstJ47pZ^mBA-P48LR}I{Uw(9jLD-WdD5pF)@Urn;IWBN;bGj=Acpo#^(a6k#*y&p@bRSvwmY($Vs| z^L+hAa=SeTC=gfVk~gc6COV-0lw*hE27Lo*O3#5W=8sj{)UpY&pu>T21jcFuu5r7_ z{tm(|;Q+S)95NX>ykK1n+6Ft6wYqM1;D@e^n5L}GG9(2~6`g0HrY#L;N2{{f&5PU* z^&IDXu{s6dx{XfFs2vceuE94E^D|U6%s6PNn?|BF%iA=0O7sU>>%?!y+U_RzWT>)+CfFd|+5bW-zo z?>ha#F>*MA%H>+?pwsYv{L1;8A0)6m=DrzUPMeOKybq(Tra~-@rIw^UFT5r}fLxi` zDnI>tRGSmlk=aM9 zq(?O@gy#uzttU@zfQ_85>Dq@8NiX+7FW(Bh z@qVQEYwC6)V@2P0^(<}*loLCzy(#JuDv-$+DK_TzV)Nx^an#S18;Z=PoL}!|wO(90 z@hjzieyd-0$_jO?_Tfp0QVdAjVunwxenEK@G2XEi$p-o<9G&QO|W*&&kaDG(4?I?x=<6~jp1 zoLk^9Ph@CyU{)i*$U@3c-vZj=-}*&VoM#Np6lI65wF4_l{Z+;%`_@nK_*$* zLzXEGPM;OI{E^%QS)9obE4+yig3sm4It2FI&#M+3RMZzgF}7z-EA$$1wTZCHmMe6E z`uTVCO>TbEp*VTu-t3Gib10#6py{m+GF)FK4q>IkZ+=k%WQ3nou{q_ zuleMF;v~6n$d!_A`6D6LMClc*kVJ=+Vlu+~F}&qJLO!b7)YiFJ*>RWg2I{ukm&j`+ z3<9*O4s?~KmQNfW!R2DAD9}9Z!Eb(wiOiLyuf>)WoNJ&UofRa_>JC=_v}IPIuDZUDV0Zl zxrw)!0*kw@wp5hXM5d?tsQjW)#S5Aii2}FipUc;J zQp+Lgj3YX%R<^N`Fr~T0))N0AicOPXFUhy+pao<|Zg-~hV(>uSkB3mio%pHB9WurE=|+f3Kp+ZBvQkb6rteX^@m?HZP%ZA4xsOhU>JkY7D+qPmnT0 zR(c)PA$EN9I&oW;D2gLo7pC)LFse)uK1fa_S%k=h(fm866bMEtYDnFG+5A~oWQIao zNH*NG!u-XyY%}~f9uAB+&9M6TwbB^u52wVnwI5ze3tuHIZu|&73P)Yao0^}E*jHk0 zj_|g~%w(gC9JFjsjmz21c0ysIJX(N9xN_mOQ1h<2LK41L)%nA+=Zdd|V~4nU)^D|Q z&|J`rliy~$&n-@Tt*O^oynk(^MYjX1Y#`XoU~v@-o%8+51(A9OtW@YRP;1jzP#?&e zF5jMM^ohTEd@Q0)Uvrj6!6~Pwt%i{KJUEMqhseX*BDca^>v0!8OUgas=rH{wP<%y* z>`?6%0t-Ut%Dfn=_k}pIKBojscoF{^ll-aX{hRw0O?5?H!}jY0Z0b)3uUw@bhIqKN zqHp5nLSnuarO+uY`Q7epg<*y>Cz5xIg^k9NNM>XWcZqo5{;oGG97d1$t38rS>B_9X z1;GseOrWD`-QI0$hUAKaeO^{h4=4worRL8Jl*H9-P06>Al1KUMVJU*~qlHM=(M5du z@34M*8H>3;IB{e*Z^fzT*$B&_dsak5_766Q1b~iOFpfo0$Pin$HZ*t`PMnTo z#QDY_hGQei3zKOhkbi59Dfnu)_HctbDaGDA7L^F}v-b0i(^irjyB8qaN*)I{wEGMG zupOj8CQuw=xKJxf2o)+Q9Y|%*{E=U0yx~>i)_Q_M=3}M9S_@tBE_2nlYFZuTVtc9; zLU|6E48x^oNM%1plY*5cQ(`{^P^k~dc=7kR4)u51o7$o=8CB_pajirUuHIL;*TuSJ z>YHCT7w}1PX9B_0cU$%TZ9aSt&cog3kyMYe*fv^U>hS9L$iaBa$)bUCzYm^6IE=r9 zvNObY?05KD7V3OJjO;Yq$(RF=KH5Q(LkI;ltlyhIW-AuOdoANu7OpjeoS1SB1y_Z9 zEo-aDSuMy1^m3aof>rgVJZ8XTtC4cr2oT366*p<*sii0CilmSgw8Ne)ucW|B3?A~1 zX8a{>U*&F#>i!u>sLO4>c1Jf?! zg8)X)ImbF6@CciE{+Kp0kLv3_qA_ocdcUW;+lw!vLd8INPM=54IS?Wv4P zwSzi9+hXrRoXVZgEibupUM(`|?2F)5?DRF>+`0jLPvo8I{s14i*NB1GY$e1FYXH0X z_HotLUi-_c#d8rFdaHKeEHT5XuEfXRBWBK@w4k=yB<0VciW-7@!70DRs%qoaDq1)D zV_}tsKrHxvDc^|Be>l2e?xEzySib!}p(%_vG@pES2BW=hhsDmFy<4iyeO&0cQ^ zI$wl`mpOh)kAeVo=nR-H%vJ}E%eK(!{0_gJOtr=gu2N>7TFgxUR-i(HN3(2L6_^dC z?#)vnc+w9{%5I65ab_%zZB`jGFNAAGp|qyrrW{C@PeH1Ol#_jj*E9E;{(XSKwop;~ zV$BWcxq6<4#J|f~>z&JM^YILJRb5>DZ@r&6=#MW_eOytSro#VJs#;RV zmjl#}E}`vtvvbKc346evhq@%Tk-y)l>w+=Fi8I@LV?n68$SSzhFP7z)Z;psfPKGCF zH8QP;gj0O>Kc7zo?G@MXaKz zl3Cs}3htk>ws{EgjmK#cRjfCZac7^5+Cb=1Lsu2>L3wYkTs)vyMwOB`2c=ig!oY|t z1OC}jIevxx`X``QZmH1ydixI`WiH0L0z%pU?{gB2y`+{C0KiE0KLT_w5pey_2<0p# zCkAx_j|u}qdaz51rjU&UsF%((Liv?GNI@@NIYwO5HVd)%Vl{zdWYnFy2{Arkb76VI? zYRa`}lu3EE{S^%mjyGHL`sdlx`tSSmb9)7y801n@$Bm+bf_%u|{@}>;kU)Y&41|6_ zq45V1g8;&S|5c&{-LL;+4jZn4MLv{ipojafD*&-5Xk0D;82}CR|4%7_6_W~vBN1bu z7=^-w8fvDVKtd#zwd9F(tD^@?Mu@rv-|u?erI~hYKT_Lh;yvt=f&Ph9X?LDIbzFJo z*wpr1KXwXR0!jFh>Dpg*;ZExG>(ZJvyrjaa>)TC05&@0O5OT*c`NmePmdNHrY`M zs#H@YdlEQwQgj&PK);W53cxDh@yoaEktpJ_1r`SfIySf9fiT1XlvH^cbi# z>Vv#0cB&2+giIh(*h^_s-&c7RGh3Sdbf~1H{$#1<+bPj0d5wLF&5#JG(R4vrV*d4b z=_rv>TmAWZw|Dg5&Yx#pfzdNI_Fs`V^L&O41D0}Hqi6*J6W%7XG!NX@&(Fha`-Svy z4z-NLx-!x{EeDfcwWzILPBR)7H77TC;3WXo;jZ|)vCC|#JNR8(en#W2Q5Uhgzw&yi z*y@3mYS0X$nn`*xaP;JT#>!(^*PB@wdZRF3OJ8}>OX)mqeWZLev_1huvOXhZryGV4 zp(oY(YZ4;XN;Mosn50fH+wue+s%xy@2v*`jW95%3iAjtW!=6iZf!gi!@*ATJ_VGHg zZEStIPd(I3wRIpI`I6EI)XN*>q3tzSp5Y|z zZm5x)M~aTu)MuZ2FdiGY{Y+%Dp6(+B`MSz}87kO@q(zqi0_p5Y#?~#PrLkKp zN^WV1ecP0jl2=44TCtt)bu(2P-AFPcoLe}Nx+&q@1D^PtPI(UW@2Y$|VXCp*-@ugY zb8e5LMrDpHA-W9%L!n?*PHrfxw9$1XEft=3?nBSS-kS=`_U0|ky`sz|l_ksT4=17X zk&@lac3MS2Y{C&sNhl?1qMk4@7)$pfWDGYbN&bc7l_0XJRmhCP+)@SfBOPYr@~_*YvIU{F0bj$3WICkAdTPX4(*uu zY~K@r^fm@={#MepVUxx%G!6`3R2?svV|Qn1lDA({yD`_C@FHTZ4cyT( zdz`Ee4+}z>HsiKo?W&rSoHlBDd6yowI>ZeWPmMz5$SnqEe82HAr|xM&k2)79Jnzx% z)Vpi~Kh(qDd*<8OsmTc^IU8su(+GWg;S{J1?L};=8T%~J&!I0T z!#7C4zDSuKhCrW?ghpQDZ@nA8?t08w70fl93RMbc8OzQzLc!4ruJCMjr==54ybaHKn}Z=WQBPujKHA5Tnf_T}N?9xOo{$ znpE6Sr#`Nu?sRz7!FLQ6`*I~9KHPpDW6I#%%y24wgJCQTNa+;33I3z(%|)aNXGihl z(MQnHQa#`tbKUJu!S2}H0@T4QM53ka=&_42ODDY=AQ(Y?IrX+R{dLXqnu>hfTGtxY z18u#$Y!s97T0c05;NIXa^m$J$@jZ82tvIGA+>HbeLwn%*_&4xqs zGGYJB{?5^4x=<>q(x5KExM)z~Uke_}1PHV8Anvz67Hf!SENWtNp@Y5ghwMMHTWxX? zGG<><3@=mE@QuygP$Qs&oy(E5@6O0QTzc^R%anwL1qzZ}d(fIfZL1u{>K~#|gY20? zsG|_AHZNWkm8n7h1>zsxZ%tVDpf*N75C-7Sv4DHv+p$w<6aP!chbm=`ex4vX<95y- zEDY#5A)(e`!g{3{yIM0xnxbtV#EM+3>i%CJ4X7md;W;K6;=@Ag#v}uExj89ouUHrB zzlc;wtmIQ>ch;=+xdzluh!^Cmy2urw1?eW|r%miz6qC;4Eudh5tf6ms$%|e5d_`$4 z&&Rbb+YignVjYaT%pxTIb`ZB#gJJ(?(*A!Hf5rzQ5!+eoBwZl*|Fn@3lNYTOHVFKG DyUl?1 literal 0 HcmV?d00001 From 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 042/605] 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 043/605] 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 044/605] 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 045/605] 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 046/605] 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 047/605] 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 048/605] 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 049/605] 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 050/605] 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 514bd0e92c1de30b999390beb6dc615e9fcad047 Mon Sep 17 00:00:00 2001 From: numerist Date: Sat, 18 Dec 2021 18:59:52 -0500 Subject: [PATCH 051/605] Delete app2-icon.js --- app2-icon.js | 1 - 1 file changed, 1 deletion(-) delete mode 100644 app2-icon.js diff --git a/app2-icon.js b/app2-icon.js deleted file mode 100644 index 19e81c45d..000000000 --- a/app2-icon.js +++ /dev/null @@ -1 +0,0 @@ -require("heatshrink").decompress(atob("lEowggdkUiCKIADCJcCkUjmYACmUikAlKB4ImDAoQSJkYhBFAQECAQI5HBQU//4AC+YUCHowzBCQfzAYYKCEw8vEgYqD+QoGgQbBHAYADCwIoBCYkiEwhPEBAIoBHgY6BExHyHwQhBFAQ6BkYTHDgcyHgcCHRZlDCYQsBTYg6GDAJQDPoI6LAAIPBCYRiHHQhkDCYRiHHQhkCCYKKBCYzzBA4yMBCYTVEGYITEBYITZHY5PHUAJjITIJjHRZINBIYoTDWZAoFWYbbJFALbHgUyX4oPDXIcjMQITBmZkHFYszCYZkJMQoTCKAQ8IHQZOCHgYoKkQ6DHgYoEcIgmBHQg8CFAIPCCYfzBQQSEFAbrFCQImHFAQUCkczmYECAQISGHoYzBAAQFCCRA9BEwYoDHI4pFAAgRLCooRPABg=")) From 6e720393f657e9d5d29de4925381ddb5c1155839 Mon Sep 17 00:00:00 2001 From: numerist Date: Sat, 18 Dec 2021 19:02:15 -0500 Subject: [PATCH 052/605] Create doztime2.app.js --- apps/doztime2.app.js | 244 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 apps/doztime2.app.js diff --git a/apps/doztime2.app.js b/apps/doztime2.app.js new file mode 100644 index 000000000..855ec9aaf --- /dev/null +++ b/apps/doztime2.app.js @@ -0,0 +1,244 @@ +// Positioning values for graphics buffers +const g_height = 80; // total graphics height +const g_x_off = 0; // position from left was 16, then 8 here +const g_y_off = (184 - g_height)/2; // vertical center for graphics region was 240 +const g_width = 240 - 2 * g_x_off; // total graphics width +const g_height_d = 28; // height of date region was 32 +const g_y_off_d = 0; // y position of date region within graphics region +const spacing = 0; // space between date and time in graphics region +const g_y_off_t = g_y_off_d + g_height_d + spacing; // y position of time within graphics region +const g_height_t = 44; // height of time region was 48 + +// Other vars +const A1 = [30,30,30,30,31,31,31,31,31,31,30,30]; +const B1 = [30,30,30,30,30,31,31,31,31,31,30,30]; +const B2 = [30,30,30,30,31,31,31,31,31,30,30,30]; +const timeColour = "#ffffff"; +const dateColours = ["#ff0000","#ffa500","#ffff00","#00b800","#8383ff","#ff00ff","#ff0080"]; //blue was 0000ff +const calen10 = {"size":26,"pt0":[18-g_x_off,16],"step":[16,0],"dx":-4.5,"dy":-4.5}; // positioning for usual calendar line ft w 32, 32-g, step 20 +const calen7 = {"size":26,"pt0":[48-g_x_off,16],"step":[16,0],"dx":-4.5,"dy":-4.5}; // positioning for S-day calendar line ft w 32, 62-g, step 20 +const time5 = {"size":42,"pt0":[39-g_x_off,24],"step":[26,0],"dx":-6.5,"dy":-6.5}; // positioning for lull time line ft w 48, 64-g, step 30 +const time6 = {"size":42,"pt0":[26-g_x_off,24],"step":[26,0],"dx":-6.5,"dy":-6.5}; // positioning for twinkling time line ft w 48, 48-g, step 30 +const baseYear = 11584; +const baseDate = Date(2020,11,21); // month values run from 0 to 11 +let accum = new Date(baseDate.getTime()); +let sequence = []; +let timeActiveUntil; +let addTimeDigit = false; +let dateFormat = false; +let lastX = 999999999; +let res = {}; +//var last_time_log = 0; + +var drawtime_timeout; + +// Date and time graphics buffers +var dateColour = "#ffffff"; // override later +var timeColour2 = timeColour; +var g_d = Graphics.createArrayBuffer(g_width,g_height_d,1,{'msb':true}); +var g_t = Graphics.createArrayBuffer(g_width,g_height_t,1,{'msb':true}); +// Set screen mode and function to write graphics buffers +//Bangle.setLCDMode(); +g.clear(); // start with blank screen +g.flip = function() +{ + g.setBgColor(0,0,0); + g.setColor(dateColour); + g.drawImage( + { + width:g_width, + height:g_height_d, + buffer:g_d.buffer + }, g_x_off, g_y_off + g_y_off_d); + g.setColor(timeColour2); + g.drawImage( + { + width:g_width, + height:g_height_t, + buffer:g_t.buffer + }, g_x_off, g_y_off + g_y_off_t); +}; + +setWatch(function(){ modeTime(); }, BTN, {repeat:true} ); //was BTN1 +setWatch(function(){ Bangle.showLauncher(); }, BTN, { repeat: false, edge: "falling" }); //was BTN2 +//setWatch(function(){ modeWeather(); }, BTN3, {repeat:true}); +//setWatch(function(){ toggleTimeDigits(); }, BTN4, {repeat:true}); +//setWatch(function(){ toggleDateFormat(); }, BTN5, {repeat:true}); + +Bangle.on('touch', function(button, xy) { //from Gordon Williams + if (button==1) toggleTimeDigits(); + if (button==2) toggleDateFormat(); +}); + +function buildSequence(targ){ + for(let i=0;i n > dt)-1; + let year = baseYear+parseInt(index/12); + let month = index % 12; + let day = parseInt((dt-sequence[index])/86400000); + let colour = dateColours[day % 6]; + if(day==30){ colour=dateColours[6]; } + return({"year":year,"month":month,"day":day,"colour":colour}); +} +function toggleTimeDigits(){ + addTimeDigit = !addTimeDigit; + modeTime(); +} +function toggleDateFormat(){ + dateFormat = !dateFormat; + modeTime(); +} +function formatDate(res,dateFormat){ + let yyyy = res.year.toString(12); + calenDef = calen10; + if(!dateFormat){ //ordinal format + let mm = ("0"+(res.month+1).toString(12)).substr(-2); + let dd = ("0"+(res.day+1).toString(12)).substr(-2); + if(res.day==30){ + calenDef = calen7; + let m = ((res.month+1).toString(12)).substr(-2); + return(yyyy+"-"+"S"+m); // ordinal format + } + return(yyyy+"-"+mm+"-"+dd); + } + let m = res.month.toString(12); // cardinal format + let w = parseInt(res.day/6); + let d = res.day%6; + //return(yyyy+"-"+res.month+"-"+w+"-"+d); + return(yyyy+"-"+m+"-"+w+"-"+d); +} + +function writeDozTime(text,def){ + let pts = def.pts; + let x=def.pt0[0]; + let y=def.pt0[1]; + g_t.clear(); + g_t.setFont("Vector",def.size); + for(let i in text){ + if(text[i]=="a"){ g_t.setFontAlign(0,0,2); g_t.drawString("2",x+1+def.dx,y+1+def.dy); } //+1s are new + else if(text[i]=="b"){ g_t.setFontAlign(0,0,2); g_t.drawString("3",x+1+def.dx,y+1+def.dy); } //+1s are new + else{ g_t.setFontAlign(0,0,0); g_t.drawString(text[i],x,y); } + x = x+def.step[0]; + y = y+def.step[1]; + } +} +function writeDozDate(text,def,colour){ + + dateColour = colour; + let pts = def.pts; + let x=def.pt0[0]; + let y=def.pt0[1]; + g_d.clear(); + g_d.setFont("Vector",def.size); + for(let i in text){ + if(text[i]=="a"){ g_d.setFontAlign(0,0,2); g_d.drawString("2",x+1+def.dx,y+1+def.dy); } //+1s new + else if(text[i]=="b"){ g_d.setFontAlign(0,0,2); g_d.drawString("3",x+1+def.dx,y+1+def.dy); } //+1s new + else{ g_d.setFontAlign(0,0,0); g_d.drawString(text[i],x,y); } + x = x+def.step[0]; + y = y+def.step[1]; + } +} + +// Functions for time mode +function drawTime() +{ + let dt = new Date(); + let date = ""; + let timeDef; + let x = 0; + dt.setDate(dt.getDate()); + if(addTimeDigit){ + x = + 10368*dt.getHours()+172.8*dt.getMinutes()+2.88*dt.getSeconds()+0.00288*dt.getMilliseconds(); + let msg = "00000"+Math.floor(x).toString(12); + let time = msg.substr(-5,3)+"."+msg.substr(-2); + let wait = 347*(1-(x%1)); + timeDef = time6; + } else { + x = + 864*dt.getHours()+14.4*dt.getMinutes()+0.24*dt.getSeconds()+0.00024*dt.getMilliseconds(); + let msg = "0000"+Math.floor(x).toString(12); + let time = msg.substr(-4,3)+"."+msg.substr(-1); + let wait = 4167*(1-(x%1)); + timeDef = time5; + } + if(lastX > x){ res = getDate(dt); } // calculate date once at start-up and once when turning over to a new day + date = formatDate(res,dateFormat); + if(dt2200)) { + } else { + // We have a GPS time. Set time + setTime(g.time.getTime()/1000); + } + }); + Bangle.setGPSPower(1,"time"); + setTimeout(fixTime, 10*60*1000); // every 10 minutes +} +// Start time fixing with GPS on next 10 minute interval +setTimeout(fixTime, ((60-(new Date()).getMinutes()) % 10) * 60 * 1000); From eba6ef6524bec5db94d077882a1bb3666f2dd169 Mon Sep 17 00:00:00 2001 From: numerist Date: Sat, 18 Dec 2021 19:05:18 -0500 Subject: [PATCH 053/605] Create app.js --- apps/doztime2/app.js | 244 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 apps/doztime2/app.js diff --git a/apps/doztime2/app.js b/apps/doztime2/app.js new file mode 100644 index 000000000..855ec9aaf --- /dev/null +++ b/apps/doztime2/app.js @@ -0,0 +1,244 @@ +// Positioning values for graphics buffers +const g_height = 80; // total graphics height +const g_x_off = 0; // position from left was 16, then 8 here +const g_y_off = (184 - g_height)/2; // vertical center for graphics region was 240 +const g_width = 240 - 2 * g_x_off; // total graphics width +const g_height_d = 28; // height of date region was 32 +const g_y_off_d = 0; // y position of date region within graphics region +const spacing = 0; // space between date and time in graphics region +const g_y_off_t = g_y_off_d + g_height_d + spacing; // y position of time within graphics region +const g_height_t = 44; // height of time region was 48 + +// Other vars +const A1 = [30,30,30,30,31,31,31,31,31,31,30,30]; +const B1 = [30,30,30,30,30,31,31,31,31,31,30,30]; +const B2 = [30,30,30,30,31,31,31,31,31,30,30,30]; +const timeColour = "#ffffff"; +const dateColours = ["#ff0000","#ffa500","#ffff00","#00b800","#8383ff","#ff00ff","#ff0080"]; //blue was 0000ff +const calen10 = {"size":26,"pt0":[18-g_x_off,16],"step":[16,0],"dx":-4.5,"dy":-4.5}; // positioning for usual calendar line ft w 32, 32-g, step 20 +const calen7 = {"size":26,"pt0":[48-g_x_off,16],"step":[16,0],"dx":-4.5,"dy":-4.5}; // positioning for S-day calendar line ft w 32, 62-g, step 20 +const time5 = {"size":42,"pt0":[39-g_x_off,24],"step":[26,0],"dx":-6.5,"dy":-6.5}; // positioning for lull time line ft w 48, 64-g, step 30 +const time6 = {"size":42,"pt0":[26-g_x_off,24],"step":[26,0],"dx":-6.5,"dy":-6.5}; // positioning for twinkling time line ft w 48, 48-g, step 30 +const baseYear = 11584; +const baseDate = Date(2020,11,21); // month values run from 0 to 11 +let accum = new Date(baseDate.getTime()); +let sequence = []; +let timeActiveUntil; +let addTimeDigit = false; +let dateFormat = false; +let lastX = 999999999; +let res = {}; +//var last_time_log = 0; + +var drawtime_timeout; + +// Date and time graphics buffers +var dateColour = "#ffffff"; // override later +var timeColour2 = timeColour; +var g_d = Graphics.createArrayBuffer(g_width,g_height_d,1,{'msb':true}); +var g_t = Graphics.createArrayBuffer(g_width,g_height_t,1,{'msb':true}); +// Set screen mode and function to write graphics buffers +//Bangle.setLCDMode(); +g.clear(); // start with blank screen +g.flip = function() +{ + g.setBgColor(0,0,0); + g.setColor(dateColour); + g.drawImage( + { + width:g_width, + height:g_height_d, + buffer:g_d.buffer + }, g_x_off, g_y_off + g_y_off_d); + g.setColor(timeColour2); + g.drawImage( + { + width:g_width, + height:g_height_t, + buffer:g_t.buffer + }, g_x_off, g_y_off + g_y_off_t); +}; + +setWatch(function(){ modeTime(); }, BTN, {repeat:true} ); //was BTN1 +setWatch(function(){ Bangle.showLauncher(); }, BTN, { repeat: false, edge: "falling" }); //was BTN2 +//setWatch(function(){ modeWeather(); }, BTN3, {repeat:true}); +//setWatch(function(){ toggleTimeDigits(); }, BTN4, {repeat:true}); +//setWatch(function(){ toggleDateFormat(); }, BTN5, {repeat:true}); + +Bangle.on('touch', function(button, xy) { //from Gordon Williams + if (button==1) toggleTimeDigits(); + if (button==2) toggleDateFormat(); +}); + +function buildSequence(targ){ + for(let i=0;i n > dt)-1; + let year = baseYear+parseInt(index/12); + let month = index % 12; + let day = parseInt((dt-sequence[index])/86400000); + let colour = dateColours[day % 6]; + if(day==30){ colour=dateColours[6]; } + return({"year":year,"month":month,"day":day,"colour":colour}); +} +function toggleTimeDigits(){ + addTimeDigit = !addTimeDigit; + modeTime(); +} +function toggleDateFormat(){ + dateFormat = !dateFormat; + modeTime(); +} +function formatDate(res,dateFormat){ + let yyyy = res.year.toString(12); + calenDef = calen10; + if(!dateFormat){ //ordinal format + let mm = ("0"+(res.month+1).toString(12)).substr(-2); + let dd = ("0"+(res.day+1).toString(12)).substr(-2); + if(res.day==30){ + calenDef = calen7; + let m = ((res.month+1).toString(12)).substr(-2); + return(yyyy+"-"+"S"+m); // ordinal format + } + return(yyyy+"-"+mm+"-"+dd); + } + let m = res.month.toString(12); // cardinal format + let w = parseInt(res.day/6); + let d = res.day%6; + //return(yyyy+"-"+res.month+"-"+w+"-"+d); + return(yyyy+"-"+m+"-"+w+"-"+d); +} + +function writeDozTime(text,def){ + let pts = def.pts; + let x=def.pt0[0]; + let y=def.pt0[1]; + g_t.clear(); + g_t.setFont("Vector",def.size); + for(let i in text){ + if(text[i]=="a"){ g_t.setFontAlign(0,0,2); g_t.drawString("2",x+1+def.dx,y+1+def.dy); } //+1s are new + else if(text[i]=="b"){ g_t.setFontAlign(0,0,2); g_t.drawString("3",x+1+def.dx,y+1+def.dy); } //+1s are new + else{ g_t.setFontAlign(0,0,0); g_t.drawString(text[i],x,y); } + x = x+def.step[0]; + y = y+def.step[1]; + } +} +function writeDozDate(text,def,colour){ + + dateColour = colour; + let pts = def.pts; + let x=def.pt0[0]; + let y=def.pt0[1]; + g_d.clear(); + g_d.setFont("Vector",def.size); + for(let i in text){ + if(text[i]=="a"){ g_d.setFontAlign(0,0,2); g_d.drawString("2",x+1+def.dx,y+1+def.dy); } //+1s new + else if(text[i]=="b"){ g_d.setFontAlign(0,0,2); g_d.drawString("3",x+1+def.dx,y+1+def.dy); } //+1s new + else{ g_d.setFontAlign(0,0,0); g_d.drawString(text[i],x,y); } + x = x+def.step[0]; + y = y+def.step[1]; + } +} + +// Functions for time mode +function drawTime() +{ + let dt = new Date(); + let date = ""; + let timeDef; + let x = 0; + dt.setDate(dt.getDate()); + if(addTimeDigit){ + x = + 10368*dt.getHours()+172.8*dt.getMinutes()+2.88*dt.getSeconds()+0.00288*dt.getMilliseconds(); + let msg = "00000"+Math.floor(x).toString(12); + let time = msg.substr(-5,3)+"."+msg.substr(-2); + let wait = 347*(1-(x%1)); + timeDef = time6; + } else { + x = + 864*dt.getHours()+14.4*dt.getMinutes()+0.24*dt.getSeconds()+0.00024*dt.getMilliseconds(); + let msg = "0000"+Math.floor(x).toString(12); + let time = msg.substr(-4,3)+"."+msg.substr(-1); + let wait = 4167*(1-(x%1)); + timeDef = time5; + } + if(lastX > x){ res = getDate(dt); } // calculate date once at start-up and once when turning over to a new day + date = formatDate(res,dateFormat); + if(dt2200)) { + } else { + // We have a GPS time. Set time + setTime(g.time.getTime()/1000); + } + }); + Bangle.setGPSPower(1,"time"); + setTimeout(fixTime, 10*60*1000); // every 10 minutes +} +// Start time fixing with GPS on next 10 minute interval +setTimeout(fixTime, ((60-(new Date()).getMinutes()) % 10) * 60 * 1000); From 3e7ac2a2491b80daaaf86f24664fb2f0da45b5c7 Mon Sep 17 00:00:00 2001 From: numerist Date: Sat, 18 Dec 2021 19:07:58 -0500 Subject: [PATCH 054/605] Add files via upload --- apps/doztime2/app.png | Bin 0 -> 2500 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/doztime2/app.png diff --git a/apps/doztime2/app.png b/apps/doztime2/app.png new file mode 100644 index 0000000000000000000000000000000000000000..363537a58cf0ba55de061d555c4501f34d53279e GIT binary patch literal 2500 zcmV;#2|MxUxKLUMAqh<|nF-|;LRvx^$2fKdl30=* zTf&MZTh`URdw2W65B!j0C#D_#-|pSB=l<^Qo;|w<_>POrrE`5lbD2r36_OB@93%w5 zHPSQyK_ZYuha%`FJDyo}=Kls*_vo&2L6yx^!X_@nLVyTWQw+P!CdpKxfB>_YrRQ=y zryD9D2q99t5WESDZQK3ay6*o8V0}Y#858_TB4IO?sVMRJRBy2tg@uKXBq?tn&N))4 zG?K|A;=Kve;ubg;FIfzYd!Jw1^Q{5aJ-+7w0552&s#H`|sD7UhTyP|lN%Z%ppl37C z^&E000|01>3{A7a;V6LHQv{F43yBcK;|X*|It{~MhJf|R?x$~kaZZ4@HNNeT4B7-D z)`!Dk5)1|iV+_$q4Dm!9mStfeV0;NyJ%6R>U260jdr2CI|g@w z4I5U@$MUKYcnfV~eKNWM04T7jWAFOXIu0H0#r6+QB9+M@5C|X?3SwYj5MQ(%H!O=C zA+oV*XXE<*Sp(kI__l*G`F%x}YinvRQzc14dwT~=J&U_;x&*72g(1_4>n@`kIQmr= z0HF4wzywGDFd4@?hdS}vdtXA;?5M1&1hXt0YiZ3HX6`>~CUZl+k<7cgC4)9mN^5Is zFH<=eXlZGIOBLAi%WH7kig{DuX7ksIETQh2`PlM{Yv52gT8 zA9kCHit=LIczFO{oJ!)v$u5+Ym%-z4(|EkMs`9#@b$5L9*Uu*m*7%3|hUPLN$P1xx zn7EuSoai_Kw?n~WcU}&=CZA)>hE-rwr@#TgKMx+o!Oz>^un(_ShbH6kyDx{=rK0_K zJDg4@f}xNEB5kQ_*i|wuAQSvaRa2BuFhC;F7;@PmJbBNRaM)&sn@(RRQ`ouh09Idr zHG-wz8+&ipWc+616)^NHB9R!vp&(RMQ2_cxUckCXca;+fn=2|RRK^&(yJNWPrb|%b zaa=H*5CU7b?}M+{jn&s*HKo1O>%g5qycpfxT`&v-72&W(K<=w=XfB%qD5$cT%2fD$ zK13tKTgmEW;R}WXfPEhw##fOu*tFqCkm;1=4ggratO9PQhFGi%e!mY?rosf4sa$Zx6LD-`O$97>CaBR5}eoleI(PT`fe_G2(J1dqEAH(z(fjD5!Y zFDouUHanauZJH(-IX(0Zpb##Z$`k-hX2EGwX3VXV_3F<3=uZy<0CG8V#;Kj^Uk0-* z0DvsZ6d*2Onp`XeoUmysve_*D-O_PR`^o+@Ivd+78Dkb827r+%CJ?c#u5$pe*=*?P8ya&mTU9Td zhd=!KJ^;XucR$8UuQvk#uBy58oRFjH>C3=AlB@Nc&WRwAF+fg8yOA?g&N&>80<@k^ z&KfMA>TkIg0A>X_s$-|m!tN-5WpNleQza7b7z0!U{e;0nI-Q2wQ-t>R9`vPk6whHV zJRiuul#bJ9QmCvfLpqfLAYdBOL11JJ?s#U^8A*~(^z|j-@pwTg#i6#|3x*rj`kSxC z4a=9{RbPb9xp=8F(rL)D zjPgJ^UfcgAdXhtPhMZ2_eHr}iy)O|61fePlIy)nV;Nr#cm--1CwZ+hA7|e*qx$x<2j6*iO=7%l z-Yiqsu=jOYq3f0|sZ}}WIQ~T&+)f2gY`PMq-uzd9+2-!Z_mScv+t;3q0`T1;p0RVp7_?BBRwOOX}(nX7^RF}(%&dwOR zy1L+TY1r_C1z28Hg5shXN*^g5pC0eUn;)DUj@Cc`;cyTG>5yK5^U{PtidB!xpk7>0pptP5W!;;<}^`DI0@p65YnaRHq6k>XL-L{DD^$4;Nc z=`$%%D#7RTBN!Tv)@US(Xe`DB$KTVMnAJ&YUBjOHK%_0IDytRY3f1rT zfeV3TGKo|wh3rrU*{lwe4WH)}nZj Date: Sat, 18 Dec 2021 19:12:14 -0500 Subject: [PATCH 055/605] Create app-icon.js --- apps/doztime2/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/doztime2/app-icon.js diff --git a/apps/doztime2/app-icon.js b/apps/doztime2/app-icon.js new file mode 100644 index 000000000..6154ac923 --- /dev/null +++ b/apps/doztime2/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("lEoxH+AHNYAAQjirwAEFbYkExIAGFTIkEJYoFDFQhMTDIODEQeI1gACxAJDwYpBKSAmDCoNe1nXABGsBwQoQHgRMBJQIhGFoxUBCoYoLGoImDJJBVIFAZRLJwQmJAA+CFwQoCKBSIDEyGsq+zKIijCEzfXq6tFFBR1CrDCGABOBwLMGXQInIOqmtZZGJE4p2CrDhIOpARI1hGCFAgnBA4J1XAAYfDOyzrFPBzQCYp2zOpLJDEASeFryeM1ldq9dB5ggCKATGF1gqJEwInKC4TIGE9R3PFIIQLO4zHSXQIoLY4xQBAwNeE5woMDoKYBE4gIBrAnPFBYfDE4rIDFCOzTwzGFPCwfCOxxQDwdYZJ5XJrGDJwx4DKCYAE2ZOCE44obExZ5EFComNE4KEBFBWsYQ50CC4IbBE5JQDFATMGE4+IJoTEIKJBhDrxJHFoYOCCQQmNFAo8CAoOIJwIABJQIJCwYmSPYgpBe4QABEQQACBYYlSKQgqEAAouDEyoqIKYokZFZIjgADI")) From a82c24c969495a349b251b22d923d857e664a14b Mon Sep 17 00:00:00 2001 From: numerist Date: Sat, 18 Dec 2021 19:19:47 -0500 Subject: [PATCH 056/605] Update apps.json --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index df7c28af6..16b82ba38 100644 --- a/apps.json +++ b/apps.json @@ -3195,3 +3195,20 @@ ] } ] +}, +{ "id":"doztime2", + "name":"Dozenal Time 2", + "shortName":"Dozenal 2", + "icon":"app.png", + "version":"0.01", + "description":"A dozenal Holocene calendar and dozenal diurnal clock for Bangle.js 2", + "tags":"clock", + "type":"clock", + "allow_emulator":true, + "readme": "README.md", + "storage": [ + {"name":"doztime2.app.js","url":"app.js"}, + {"name":"doztime2.img","url":"app-icon.js","evaluate":true} + ] +} +] From 2d5e2dd180fbfcf924e260d148a456ad7187079d Mon Sep 17 00:00:00 2001 From: numerist Date: Sat, 18 Dec 2021 19:26:21 -0500 Subject: [PATCH 057/605] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 16b82ba38..556cecc50 100644 --- a/apps.json +++ b/apps.json @@ -3198,7 +3198,7 @@ }, { "id":"doztime2", "name":"Dozenal Time 2", - "shortName":"Dozenal 2", + "shortName":"Dozenal Time 2", "icon":"app.png", "version":"0.01", "description":"A dozenal Holocene calendar and dozenal diurnal clock for Bangle.js 2", From 3e3d7599c5ce5d2e2334fad2a39d4b800dbda95b Mon Sep 17 00:00:00 2001 From: numerist Date: Sat, 18 Dec 2021 19:48:41 -0500 Subject: [PATCH 058/605] Update apps.json --- apps.json | 1 - 1 file changed, 1 deletion(-) diff --git a/apps.json b/apps.json index 556cecc50..d694e82ed 100644 --- a/apps.json +++ b/apps.json @@ -3205,7 +3205,6 @@ "tags":"clock", "type":"clock", "allow_emulator":true, - "readme": "README.md", "storage": [ {"name":"doztime2.app.js","url":"app.js"}, {"name":"doztime2.img","url":"app-icon.js","evaluate":true} From 0673803d1b42f48241d9fb56a5efba6645119923 Mon Sep 17 00:00:00 2001 From: numerist Date: Sat, 18 Dec 2021 23:10:00 -0500 Subject: [PATCH 059/605] Update app.js --- apps/doztime2/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/doztime2/app.js b/apps/doztime2/app.js index 855ec9aaf..a0ddfd4d0 100644 --- a/apps/doztime2/app.js +++ b/apps/doztime2/app.js @@ -14,7 +14,7 @@ const A1 = [30,30,30,30,31,31,31,31,31,31,30,30]; const B1 = [30,30,30,30,30,31,31,31,31,31,30,30]; const B2 = [30,30,30,30,31,31,31,31,31,30,30,30]; const timeColour = "#ffffff"; -const dateColours = ["#ff0000","#ffa500","#ffff00","#00b800","#8383ff","#ff00ff","#ff0080"]; //blue was 0000ff +const dateColours = ["#ff0000","#ff8000","#ffff00","#00ff00","#0080ff","#ff00ff","#ffffff"]; const calen10 = {"size":26,"pt0":[18-g_x_off,16],"step":[16,0],"dx":-4.5,"dy":-4.5}; // positioning for usual calendar line ft w 32, 32-g, step 20 const calen7 = {"size":26,"pt0":[48-g_x_off,16],"step":[16,0],"dx":-4.5,"dy":-4.5}; // positioning for S-day calendar line ft w 32, 62-g, step 20 const time5 = {"size":42,"pt0":[39-g_x_off,24],"step":[26,0],"dx":-6.5,"dy":-6.5}; // positioning for lull time line ft w 48, 64-g, step 30 From 9faaca321476bd283ee841ce162f65b37b249a4c Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 11:38:27 +0100 Subject: [PATCH 060/605] 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 061/605] 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 062/605] 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 063/605] 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 064/605] New version --- apps.json | 2 +- apps/lcars/ChangeLog | 3 ++- apps/lcars/README.md | 7 ++++--- apps/lcars/lcars.app.js | 8 ++++---- apps/lcars/lcars.png | Bin 1823 -> 1840 bytes apps/lcars/screenshot.png | Bin 2921 -> 5139 bytes 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..028127859 100644 --- a/apps.json +++ b/apps.json @@ -4487,7 +4487,7 @@ "name": "LCARS Clock", "shortName":"LCARS", "icon": "lcars.png", - "version":"0.07", + "version":"0.08", "readme": "README.md", "supports": ["BANGLEJS2"], "description": "Library Computer Access Retrieval System (LCARS) clock.", diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index c5f8187b7..f30ae4707 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -4,4 +4,5 @@ 0.04: Inluded LCARS Logo. 0.05: Additional icons for (1) charging and (2) bat < 30%. 0.06: Fix - Alarm disabled, if clock was closed. -0.07: Added settings to adjust data that is shown for each row. \ No newline at end of file +0.07: Added settings to adjust data that is shown for each row. +0.08: Smaller background for faster rendering. Full screen mode. \ No newline at end of file diff --git a/apps/lcars/README.md b/apps/lcars/README.md index 15009e838..31cb81341 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -1,14 +1,15 @@ # LCARS clock A simple LCARS inspired clock. -Note: To display the steps, its necessary to install +Note: To display the steps, its necessary (but still optional) to install the [Pedometer widget](https://banglejs.com/apps/#pedometer%20widget). ## Features * LCARS Style watch face - * Shows satate (charging, out of battery etc.) - * SHows data that can be configured (steps, HRM, temperature etc.) + * Shows different states (charging, out of battery, GPS on etc.) + * Shows customizable data (steps, HRM, battery, temperature etc.) * Swipe left/right to activate an alarm + * Full-screen mode ## Icons diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index 84d12953e..8ac1dfe14 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -170,7 +170,7 @@ function drawState(){ timeInMinutes % 4 == 1 ? iconMars : timeInMinutes % 4 == 2 ? iconMoon : iconEarth; - g.drawImage(iconImg, 120, 120); + g.drawImage(iconImg, 120, 118); // Alarm within symbol g.setFontAlign(-1, -1, 0); @@ -179,7 +179,7 @@ function drawState(){ if(isAlarmEnabled() > 0){ g.setFontAlign(0, 0, 0); g.setColor(cWhite); - g.drawString(getAlarmMinutes(), 120+25, 120+25+1); + g.drawString(getAlarmMinutes(), 120+25, 118+25+1); } } @@ -200,7 +200,7 @@ function draw(){ drawHoriztonatlBgLine(cPurple, 120, 176, 81, 3); drawHoriztonatlBgLine(cOrange, 35, 110, 87, 3); drawHoriztonatlBgLine(cOrange, 120, 176, 87, 3); - drawHoriztonatlBgLine(cOrange, 20, 176, 172, 4); + drawHoriztonatlBgLine(cOrange, 20, 176, 171, 5); // Draw logo drawLock(); @@ -218,7 +218,7 @@ function draw(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 28, 60); + g.drawString(dayStr, 28, 58); // Draw data g.setColor(cWhite); diff --git a/apps/lcars/lcars.png b/apps/lcars/lcars.png index 167352ef4bd6db8c6de6bc845396944af7bcc040..9264f93f21be2ea0c39faabab767f88da6d4ad43 100644 GIT binary patch delta 1809 zcmV+s2k!Wv4zLc8G=JwwL_t(&fz6p~P!v}d$A8l^vk(+Z1hmT4RktMSSVk#jVI}c{ zNUHW>_#jn2Qc)ZbU0mG3#qiLq#R_PG5s0QrkO-~`WJ@#;E%QO*qeKiME4mViPzx)T zf@FP-ykwZ!4`y1L>6vMUp4$Cab$@{J%RXZ3ADGj%l0)lH?uY6V^!m+UP78=0hV~4D6+kL`7&jt7gdR?S_w^k z{})bcUk=l!Pp7r5YSeL6nSs51AC5>oKwDcIdv+fib!=5;U~=xyxp(j0h{sKuG>MMR zOQVYI(F}apzmKRdmN6!6Ec{X9k$8a4&Q3xX#FCL-;(yV27{LsDI{q_COG`O-?wrF* zN-Y=+2IAx6+4|=g#bewiaK!&_?Ao=9mX?-L3sj1LfB=$`lE}_k@7C630*lKdsi~=P zI#>_{ugwO)lqpjvC@5e>>;mT+gpZ7j#8w1NTYn%UFq5XHCZ0WerjmSE zv}h51AN7-wk-?ZTVQq~KdAZG2gyf2jj&`se z&E@a!FY&)(#R>I?c>VJ?uvjc2xnaWw@+rF7!N2>^tlYkhEVFsq)fb{XKW z9a%2>M+;Z8yL|a_@&5Mh+W-iyt*s)taDU-Kw*f9(xZt@u1?cYXcG@>@-aH3R=;`SZ z8~*DIY7>)#G%-(MXa9S)peFc`!} zU0t0^$8sygNa5$_$IzH^sIRY=3b3r6P?=j_xH>4L*EnO;o$%Xxx3>fFNr;S_BeHX^XAQw>IPu$ z+_^kIFhJqlk3_C$VKEC9IR8u@{vdz%)o&Rb92DDY*Se3|>*5lUv*L2^oZig*ouIZrx%-U4H^8DJhcE zzO=M7iJitqi`aXltQw=yDA^|J^?EjM-i%(aCoeD0t)OYsrqP!9Z?|^C;gkF`oKzkeUI+02tCPq138=yW=CIvs(5flQn@k;#)MJN-cp#V=<> z)7sjK4cDuh&SmdU7=Qj5yK?192k`(YTi;URP7!i)a#*v*@i=EV6qV4UM~}q&(9lpm z|GV>}KDDrV&98`xisE=>gG)O_Ghkopf`Wqh$F)o@f!^L;GBY#X8~zWVXchW@#(x2Ym$Z{xh~>!u015yANkvXXu0mjfanhH5 delta 1791 zcmVXOMeaKpD>tb0K0#?jIy#a zTr1jOuownQAmwQdN=s+nd__eCp7k9wNF0MCP~~iaq@*MYmzVrbaXKGwYIk6Y1a`><8huqR#ukA{?yb|PUCT!z(;99OiycG zm6b{*e!a1tvwxVJB~Yk(j{5p~R<;ixKEzvg*__1XEP-?9&go=-^5jWQ;&PHe-e{-V zA6Fe@G8q(;XBQlslLRhYxS-cKkw~=Q*gSm(T~TzQq@)Co9zDXy$cWy-dwYA4ohN{= zuP@%VKcklqBesXRGAkt{5()0yxkKBexB{Qg$KJhrVShZ$ey`A)!0#60NK8ybTU*D5|wSx(QFxb}s04FCWh(scE%C@W5z(igh@5b^Y zUonbbxpF0hLLnYJcmQ*AbI!yH1Ok|vno_vV&Q1gb1fZ@lMC~|Q0`YZs5D^i9v9U1< zzhT1$On+YkniKy)v|9|Co0~B_Jj{`NVBNZP7|R_;baXTg*umRL8+iBbT@GZ=K`xggb0~vs7k>ucfLJW1Ow+o$Iuzg9LK#OU@aEPY z85xP|UlcM1%N)wUqOrm^0Dyar^ddMm{$;7skfMWc$>qx#g7rfb#NklJM~GK*p9#je)qH zK7X@NDwRkdOr!DJ#{F^V&>^xdm&?)fJQ@H%oT#N{9UmXBHPEY9uNEj(J#OB-$;hXy z7g45CQBe^9fSAA5J2*HX$asgw00~Xp9D~(C)7SO$^CO>IT3P@A#FHmaNOJAkwORw* zyLV52bu6IiaJYK)Y8pq3j*gOz#fukf4S(?X@nijz>42k^k&L{ptu2istgWrdMsIJg zR_BJC|Fckc{_5%Jp>YJC&nFvIRaF`tGp!K1!ra^(^J6lhy1JT?zkmNe`OM?ZTxEz& zn>LZ8LZLvC><8MwSxBW)U9?hQVq${BhYw>UdlZe||Be0o_p7xXA0KDr=kF6hNOZD?rFRW|@&)v8sPxH5?!H(n&U^ba$zW)1ypGmAH0HaZwRn4bdnkSx!vWiaT5Y4= ziH4`ACyj4vYQnxhLJ<)WL8oi?v;pXOs zR-t~E|Ks&>lv5@}q>&NA!^7dSj9!1DT`9Ys20)lF0uK)lodmeLy6P?d#9znN-tcT} zY><{IWLHiei_+we8*y2%DS9uF#&O7GH(r>7@&1y*XbVO1Ml^R7fM0ZOHk zwRn4bdxVCDLUeu_mX?+PfcExwt>g5njRJtNu`xDp-i*4sIt&a9=zl!k)YKFLfdJm# z-dOIGLg|Z&ib7mm9Qyh+%$?U@m4LN<4vkAlNPvZD47P2Z<5WZny1Tm}m&@_;e4IXg8hAT*(#tutm~5QAc=3XK76=4*-;>*-78ClO?SPMu51f|Y&}hf% z3(PEaGe27Ju0I#9jwSp)DMP1Bvkj{+Ff=p-f*=qV)z5(}Zow)6g+hUt82X(5KY-N~ h`q-yLyU~Aye*r)QY$kz4$b$d?002ovPDHLkV1n#zTzmik diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png index d74635f64c385138e0b08b685db984ef3387f0a9..768c4a172e33f1cc478bc14a13400688af7bbbb2 100644 GIT binary patch literal 5139 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 BpU(gQ literal 2921 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 Date: Sun, 19 Dec 2021 13:10:49 +0100 Subject: [PATCH 065/605] 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 066/605] 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 067/605] 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 068/605] 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 069/605] 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 070/605] 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 071/605] 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 072/605] 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 073/605] 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 074/605] 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 075/605] 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 076/605] 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 077/605] 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 078/605] 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 079/605] 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 081/605] 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 082/605] 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 083/605] 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 084/605] 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 085/605] 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 086/605] 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 087/605] 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 088/605] 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 089/605] 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 090/605] 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 9189be084c9381bd6842585ce84e65aa49a5b1ab Mon Sep 17 00:00:00 2001 From: numerist Date: Sun, 19 Dec 2021 10:11:30 -0500 Subject: [PATCH 092/605] Update app.js --- apps/doztime2/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/doztime2/app.js b/apps/doztime2/app.js index a0ddfd4d0..f57fc386c 100644 --- a/apps/doztime2/app.js +++ b/apps/doztime2/app.js @@ -17,8 +17,8 @@ const timeColour = "#ffffff"; const dateColours = ["#ff0000","#ff8000","#ffff00","#00ff00","#0080ff","#ff00ff","#ffffff"]; const calen10 = {"size":26,"pt0":[18-g_x_off,16],"step":[16,0],"dx":-4.5,"dy":-4.5}; // positioning for usual calendar line ft w 32, 32-g, step 20 const calen7 = {"size":26,"pt0":[48-g_x_off,16],"step":[16,0],"dx":-4.5,"dy":-4.5}; // positioning for S-day calendar line ft w 32, 62-g, step 20 -const time5 = {"size":42,"pt0":[39-g_x_off,24],"step":[26,0],"dx":-6.5,"dy":-6.5}; // positioning for lull time line ft w 48, 64-g, step 30 -const time6 = {"size":42,"pt0":[26-g_x_off,24],"step":[26,0],"dx":-6.5,"dy":-6.5}; // positioning for twinkling time line ft w 48, 48-g, step 30 +const time5 = {"size":36,"pt0":[46-g_x_off,24],"step":[22,0],"dx":-6.5,"dy":-6.5}; // positioning for lull time line ft w 48, 64-g, step 30 +const time6 = {"size":36,"pt0":[36-g_x_off,24],"step":[22,0],"dx":-6.5,"dy":-6.5}; // positioning for twinkling time line ft w 48, 48-g, step 30 const baseYear = 11584; const baseDate = Date(2020,11,21); // month values run from 0 to 11 let accum = new Date(baseDate.getTime()); From 52de03cad83f6ecf51c30b1c23fcce082f212361 Mon Sep 17 00:00:00 2001 From: Ivor Hewitt Date: Sun, 19 Dec 2021 17:09:43 +0000 Subject: [PATCH 093/605] 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 094/605] 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 095/605] 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 096/605] 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 097/605] 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 098/605] 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 099/605] 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 100/605] 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 101/605] 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 dd9520d1862f68573114c941787c9dc8d5de530b Mon Sep 17 00:00:00 2001 From: numerist Date: Sun, 19 Dec 2021 15:04:17 -0500 Subject: [PATCH 102/605] Update app.js --- apps/doztime2/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/doztime2/app.js b/apps/doztime2/app.js index f57fc386c..ac67954d3 100644 --- a/apps/doztime2/app.js +++ b/apps/doztime2/app.js @@ -134,8 +134,8 @@ function writeDozTime(text,def){ g_t.clear(); g_t.setFont("Vector",def.size); for(let i in text){ - if(text[i]=="a"){ g_t.setFontAlign(0,0,2); g_t.drawString("2",x+1+def.dx,y+1+def.dy); } //+1s are new - else if(text[i]=="b"){ g_t.setFontAlign(0,0,2); g_t.drawString("3",x+1+def.dx,y+1+def.dy); } //+1s are new + if(text[i]=="a"){ g_t.setFontAlign(0,0,2); g_t.drawString("2",x+2+def.dx,y+1+def.dy); } //+1s are new + else if(text[i]=="b"){ g_t.setFontAlign(0,0,2); g_t.drawString("3",x+2+def.dx,y+1+def.dy); } //+1s are new else{ g_t.setFontAlign(0,0,0); g_t.drawString(text[i],x,y); } x = x+def.step[0]; y = y+def.step[1]; From 2bc8c672e01645a6834cdd5e0e39e230723bb94f Mon Sep 17 00:00:00 2001 From: David Peer Date: Sun, 19 Dec 2021 21:09:26 +0100 Subject: [PATCH 103/605] 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 104/605] ptlaunch: Improve pattern detection code readability by PaddeK --- apps.json | 2 +- apps/ptlaunch/ChangeLog | 3 +- apps/ptlaunch/README.md | 7 ++ apps/ptlaunch/app.js | 216 ++++++++-------------------------------- apps/ptlaunch/boot.js | 183 +++++++++------------------------- 5 files changed, 99 insertions(+), 312 deletions(-) diff --git a/apps.json b/apps.json index e5e9f8f02..125d8609e 100644 --- a/apps.json +++ b/apps.json @@ -4861,7 +4861,7 @@ "id": "ptlaunch", "name": "Pattern Launcher", "shortName": "Pattern Launcher", - "version": "0.11", + "version": "0.12", "description": "Directly launch apps from the clock screen with custom patterns.", "icon": "app.png", "screenshots": [{"url":"manage_patterns_light.png"}], diff --git a/apps/ptlaunch/ChangeLog b/apps/ptlaunch/ChangeLog index 23031cff3..8cfa77113 100644 --- a/apps/ptlaunch/ChangeLog +++ b/apps/ptlaunch/ChangeLog @@ -2,4 +2,5 @@ 0.02: Turn on lcd when launching an app if the lock screen was disabled in the settings 0.03: Make tap to confirm new pattern more reliable. Also allow for easier creation of single circle patterns. 0.10: Improve the management of existing patterns: Draw the linked pattern on the left hand side of the app name within a scroller, similar to the default launcher. Slighlty clean up the code to make it less horrible. -0.11: Respect theme colors. Fix: Do not pollute global space with internal variables ans functions in boot.js \ No newline at end of file +0.11: Respect theme colors. Fix: Do not pollute global space with internal variables ans functions in boot.js +0.12: Improve pattern detection code readability by PaddeK http://forum.espruino.com/profiles/117930/ \ No newline at end of file diff --git a/apps/ptlaunch/README.md b/apps/ptlaunch/README.md index 7cc39e3d6..c16110f94 100644 --- a/apps/ptlaunch/README.md +++ b/apps/ptlaunch/README.md @@ -58,3 +58,10 @@ Make sure the watch is unlocked before you start drawing. If this bothers you, y 3) I have done all that and still nothing happens! Please note that drawing on the clock screen will not visually show the pattern you drew. It will start the app as soon as the pattern was recognized - this might take 1 or 2 seconds! If still nothing happens, that might be a bug, sorry! + + +## Authors + +Initial creation: [crazysaem](https://github.com/crazysaem) + +Improve pattern detection code readability: [PaddeK](http://forum.espruino.com/profiles/117930/) diff --git a/apps/ptlaunch/app.js b/apps/ptlaunch/app.js index 062cc3c62..5a2fcf228 100644 --- a/apps/ptlaunch/app.js +++ b/apps/ptlaunch/app.js @@ -114,7 +114,6 @@ var showMainMenu = () => { E.showMenu(mainmenu); }; -var positions = []; var recognizeAndDrawPattern = () => { return new Promise((resolve) => { E.showMenu(); @@ -137,148 +136,53 @@ var recognizeAndDrawPattern = () => { setWatch(() => finishHandler(), BTN); setTimeout(() => Bangle.on("tap", finishHandler), 250); - positions = []; + var positions = []; + var getPattern = (positions) => { + var circles = [ + { x: 25, y: 25, i: 0 }, + { x: 87, y: 25, i: 1 }, + { x: 150, y: 25, i: 2 }, + { x: 25, y: 87, i: 3 }, + { x: 87, y: 87, i: 4 }, + { x: 150, y: 87, i: 5 }, + { x: 25, y: 150, i: 6 }, + { x: 87, y: 150, i: 7 }, + { x: 150, y: 150, i: 8 }, + ]; + return positions.reduce((pattern, p, i, arr) => { + var idx = circles.findIndex((c) => { + var dx = p.x > c.x ? p.x - c.x : c.x - p.x; + if (dx > CIRCLE_RADIUS) { + return false; + } + var dy = p.y > c.y ? p.y - c.y : c.y - p.y; + if (dy > CIRCLE_RADIUS) { + return false; + } + if (dx + dy <= CIRCLE_RADIUS) { + return true; + } + return dx * dx + dy * dy <= CIRCLE_RADIUS_2; + }); + if (idx >= 0) { + pattern += circles[idx].i; + circles.splice(idx, 1); + } + if (circles.length === 0) { + arr.splice(1); + } + return pattern; + }, ""); + }; var dragHandler = (position) => { - log(position); positions.push(position); - - debounce().then(() => { - if (isFinished) { - return; - } - - // This might actually be a 'tap' event. - // Use this check in addition to the actual tap handler to make it more reliable - if (pattern.length > 0 && positions.length === 2) { - if ( - positions[0].x === positions[1].x && - positions[0].y === positions[1].y - ) { - finishHandler(); - positions = []; - return; - } - } - - E.showMessage("Calculating..."); - var t0 = Date.now(); - - log(positions.length); - - var circlesClone = cloneCirclesArray(); - pattern = []; - - var step = Math.floor(positions.length / 100) + 1; - - var p, a, b, circle; - - for (var i = 0; i < positions.length; i += step) { - p = positions[i]; - - circle = circlesClone[0]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(0, 1); - } - } - - circle = circlesClone[1]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(1, 1); - } - } - - circle = circlesClone[2]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(2, 1); - } - } - - circle = circlesClone[3]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(3, 1); - } - } - - circle = circlesClone[4]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(4, 1); - } - } - - circle = circlesClone[5]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(5, 1); - } - } - - circle = circlesClone[6]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(6, 1); - } - } - circle = circlesClone[7]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(7, 1); - } - } - - circle = circlesClone[8]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circlesClone.splice(8, 1); - } - } - } - var tx = Date.now(); - log(tx - t0); - positions = []; - var t1 = Date.now(); - log(t1 - t0); - - log("pattern:"); - log(pattern); - - log("redrawing"); + if (position.b === 0 || positions.length >= 200) { + pattern = getPattern(positions).split(""); g.clear(); drawCirclesWithPattern(pattern); - }); + positions = []; + } }; - Bangle.on("drag", dragHandler); }); }; @@ -461,18 +365,6 @@ var getStoredPatternsArray = () => { var CIRCLE_RADIUS = 25; var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; -var CIRCLES = [ - { x: 25, y: 25, i: 0 }, - { x: 87, y: 25, i: 1 }, - { x: 150, y: 25, i: 2 }, - { x: 25, y: 87, i: 3 }, - { x: 87, y: 87, i: 4 }, - { x: 150, y: 87, i: 5 }, - { x: 25, y: 150, i: 6 }, - { x: 87, y: 150, i: 7 }, - { x: 150, y: 150, i: 8 }, -]; - var drawCircle = (circle, drawBuffer, scale) => { if (!drawBuffer) { drawBuffer = g; @@ -563,16 +455,6 @@ var drawCirclesWithPattern = (pattern, options) => { g.drawImage(image, offset.x, offset.y); }; -var cloneCirclesArray = () => { - var circlesClone = Array(CIRCLES.length); - - for (var i = 0; i < CIRCLES.length; i++) { - circlesClone[i] = CIRCLES[i]; - } - - return circlesClone; -}; - ////// // misc lib functions ////// @@ -583,20 +465,6 @@ var log = (message) => { } }; -var debounceTimeoutId; -var debounce = (delay) => { - if (debounceTimeoutId) { - clearTimeout(debounceTimeoutId); - } - - return new Promise((resolve) => { - debounceTimeoutId = setTimeout(() => { - debounceTimeoutId = undefined; - resolve(); - }, delay || 500); - }); -}; - ////// // run main function ////// diff --git a/apps/ptlaunch/boot.js b/apps/ptlaunch/boot.js index 6fbd3ca41..19a8f16cb 100644 --- a/apps/ptlaunch/boot.js +++ b/apps/ptlaunch/boot.js @@ -5,131 +5,54 @@ console.log(JSON.stringify(message)); } }; - + var storedPatterns; + var CIRCLE_RADIUS = 25; + var CIRCLE_RADIUS_2 = Math.pow(CIRCLE_RADIUS, 2); var positions = []; + var getPattern = (positions) => { + var circles = [ + { x: 25, y: 25, i: 0 }, + { x: 87, y: 25, i: 1 }, + { x: 150, y: 25, i: 2 }, + { x: 25, y: 87, i: 3 }, + { x: 87, y: 87, i: 4 }, + { x: 150, y: 87, i: 5 }, + { x: 25, y: 150, i: 6 }, + { x: 87, y: 150, i: 7 }, + { x: 150, y: 150, i: 8 }, + ]; + return positions.reduce((pattern, p, i, arr) => { + var idx = circles.findIndex((c) => { + var dx = p.x > c.x ? p.x - c.x : c.x - p.x; + if (dx > CIRCLE_RADIUS) { + return false; + } + var dy = p.y > c.y ? p.y - c.y : c.y - p.y; + if (dy > CIRCLE_RADIUS) { + return false; + } + if (dx + dy <= CIRCLE_RADIUS) { + return true; + } + return dx * dx + dy * dy <= CIRCLE_RADIUS_2; + }); + if (idx >= 0) { + pattern += circles[idx].i; + circles.splice(idx, 1); + } + if (circles.length === 0) { + arr.splice(1); + } + return pattern; + }, ""); + }; var dragHandler = (position) => { positions.push(position); - - debounce().then(() => { - log(positions.length); - - var CIRCLE_RADIUS = 25; - var CIRCLE_RADIUS_2 = CIRCLE_RADIUS * CIRCLE_RADIUS; - - var circles = [ - { x: 25, y: 25, i: 0 }, - { x: 87, y: 25, i: 1 }, - { x: 150, y: 25, i: 2 }, - { x: 25, y: 87, i: 3 }, - { x: 87, y: 87, i: 4 }, - { x: 150, y: 87, i: 5 }, - { x: 25, y: 150, i: 6 }, - { x: 87, y: 150, i: 7 }, - { x: 150, y: 150, i: 8 }, - ]; - var pattern = []; - - var step = Math.floor(positions.length / 100) + 1; - - var p, a, b, circle; - - for (var i = 0; i < positions.length; i += step) { - p = positions[i]; - - circle = circles[0]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(0, 1); - } - } - - circle = circles[1]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(1, 1); - } - } - - circle = circles[2]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(2, 1); - } - } - - circle = circles[3]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(3, 1); - } - } - - circle = circles[4]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(4, 1); - } - } - - circle = circles[5]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(5, 1); - } - } - - circle = circles[6]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(6, 1); - } - } - circle = circles[7]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(7, 1); - } - } - - circle = circles[8]; - if (circle) { - a = p.x - circle.x; - b = p.y - circle.y; - if (CIRCLE_RADIUS_2 - (a * a + b * b) >= 0) { - pattern.push(circle.i); - circles.splice(8, 1); - } - } - } - positions = []; - - pattern = pattern.join(""); - + if (position.b === 0 || positions.length >= 200) { + var pattern = getPattern(positions); + log(pattern); + if (pattern) { if (storedPatterns[pattern]) { var app = storedPatterns[pattern].app; @@ -139,27 +62,15 @@ Bangle.setLCDPower(true); } } - + Bangle.removeListener("drag", dragHandler); load(app.src); } } } - }); - }; - - var debounceTimeoutId; - var debounce = (delay) => { - if (debounceTimeoutId) { - clearTimeout(debounceTimeoutId); + + positions = []; } - - return new Promise((resolve) => { - debounceTimeoutId = setTimeout(() => { - debounceTimeoutId = undefined; - resolve(); - }, delay || 500); - }); }; var sui = Bangle.setUI; From 200f9e19b58c6691b8ba5cffe4a61c9ee7fedaeb Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sun, 19 Dec 2021 21:09:00 +0000 Subject: [PATCH 105/605] Pastel: added weather, change to queueDraw() update once per minute --- apps/pastel/pastel.app.js | 139 +++++++++++++++++++++++++++------ apps/pastel/pastel.settings.js | 13 ++- 2 files changed, 124 insertions(+), 28 deletions(-) diff --git a/apps/pastel/pastel.app.js b/apps/pastel/pastel.app.js index aa4f6abf8..e0c7df831 100644 --- a/apps/pastel/pastel.app.js +++ b/apps/pastel/pastel.app.js @@ -1,10 +1,22 @@ var SunCalc = require("https://raw.githubusercontent.com/mourner/suncalc/master/suncalc.js"); require("f_latosmall").add(Graphics); +const storage = require('Storage'); +const locale = require("locale"); const SETTINGS_FILE = "pastel.json"; const LOCATION_FILE = "mylocation.json"; let settings; let location; +// cloud, sun, partSun, snow, rain, storm, error +// create 1 bit, max contrast, brightness set to 85 +var cloudIcon = require("heatshrink").decompress(atob("kEggIfcj+AAYM/8ADBuFwAYPAmADCCAMBwEf8ADBhFwg4aBnEPAYMYjAVBhgDDDoQDHCYc4jwDB+EP///FYIDBMTgA==")); +var sunIcon = require("heatshrink").decompress(atob("kEggILIgOAAZkDAYPAgeBwPAgIFBBgPhw4TBp/yAYMcnADBnEcAYMwhgDBsEGgE/AYP8AYYLDCYgbDEYYrD8fHIwI7CIYZLDL54AHA==")); +var sunPartIcon = require("heatshrink").decompress(atob("kEggIHEmADJjEwsEAjkw8EAh0B4EAg35wEAgP+CYMDwv8AYMDBAP2g8HgH+g0DBYMMgPwAYX8gOMEwMG3kAg8OvgSBjg2BgcYGQIcBAY5CBg0Av//HAM///4MYgNBEIMOCoUMDoUAnBwGkEA")); +var snowIcon = require("heatshrink").decompress(atob("kEggITQj/AAYM98ADBsEwAYPAjADCj+AgOAj/gAYMIuEHwEAjEPAYQVChk4AYQhCAYcYBYQTDnEPgEB+EH///IAQACE4IAB8EICIPghwDB4EeBYNAjgDBg8EAYQYCg4bCgZuFA==")); +var rainIcon = require("heatshrink").decompress(atob("kEggIPMh+AAYM/8ADBuFwAYPgmADB4EbAYOAj/ggOAhnwg4aBnAeCjEcCIMMjADCDoQDHjAPCnAXCuEP///8EDAYJECAAXBwkAgPDhwDBwUMgEEhkggEOjFgFgMQLYQAOA==")); +var errIcon = require("heatshrink").decompress(atob("kEggILIgOAAYsD4ADBg/gAYMGsADBhkwAYsYjADCjgDBmEMAYNxxwDBsOGAYPBwYDEgOBwOAgYDB4EDHYPAgwDBsADDhgDBFIcwjAHBjE4AYMcmADBhhNCKIcG/4AGOw4A==")); + + function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE,1)||{}; settings.grid = settings.grid||false; @@ -93,6 +105,50 @@ function prevInfo() { } } + +/** +Choose weather icon to display based on condition. +Based on function from the Bangle weather app so it should handle all of the conditions +sent from gadget bridge. +*/ +function chooseIcon(condition) { + condition = condition.toLowerCase(); + if (condition.includes("thunderstorm")) return stormIcon; + if (condition.includes("freezing")||condition.includes("snow")|| + condition.includes("sleet")) { + return snowIcon; + } + if (condition.includes("drizzle")|| + condition.includes("shower")) { + return rainIcon; + } + if (condition.includes("rain")) return rainIcon; + if (condition.includes("clear")) return sunIcon; + if (condition.includes("few clouds")) return partSunIcon; + if (condition.includes("scattered clouds")) return cloudIcon; + if (condition.includes("clouds")) return cloudIcon; + if (condition.includes("mist") || + condition.includes("smoke") || + condition.includes("haze") || + condition.includes("sand") || + condition.includes("dust") || + condition.includes("fog") || + condition.includes("ash") || + condition.includes("squalls") || + condition.includes("tornado")) { + return cloudIcon; + } + return cloudIcon; +} + +/** +Get weather stored in json file by weather app. +*/ +function getWeather() { + let jsonWeather = storage.readJSON('weather.json'); + return jsonWeather; +} + var mm_prev = "xx"; function draw() { @@ -114,7 +170,25 @@ function draw() { var h = g.getHeight(); var x = (g.getWidth()/2); var y = (g.getHeight()/3); - + + var weatherJson = getWeather(); + var w_temp; + var w_icon; + var w_wind; + + if (settings.weather && weatherJson && weatherJson.weather) { + var currentWeather = weatherJson.weather; + const temp = locale.temp(currentWeather.temp-273.15).match(/^(\D*\d*)(.*)$/); + w_temp = temp[1] + " " + temp[2]; + w_icon = chooseIcon(currentWeather.txt); + const wind = locale.speed(currentWeather.wind).match(/^(\D*\d*)(.*)$/); + w_wind = wind[1] + " " + wind[2] + " " + (currentWeather.wrose||'').toUpperCase(); + } else { + w_temp = "Err"; + w_wind = "???"; + w_icon = errIcon; + } + g.reset(); if (process.env.HWVERSION == 1) { @@ -139,6 +213,18 @@ function draw() { g.setColor(g.theme.fg); + // draw weather line + if (settings.weather) { + g.drawImage(w_icon, (w/2) - 40, 24); + g.setFontLatoSmall(); + g.setFontAlign(-1,0); // left aligned + if (drawCount % 2 == 0) + g.drawString(w_temp, (w/2) + 6, 24 + ((y - 24)/2)); + else + g.drawString( (w_wind.split(' ').slice(0, 2).join(' ')), (w/2) + 6, 24 + ((y - 24)/2)); + // display first 2 words of the wind string eg '4 mph' + } + if (settings.font == "Architect") g.setFontArchitect(); else if (settings.font == "GochiHand") @@ -161,36 +247,39 @@ function draw() { // for the colon g.setFontAlign(0,-1); // centre aligned - - if (d.getSeconds()&1) { - g.drawString(":", x,y); - } else { - // on bangle 1, we are not using clearRect(), hide : by printing over it in reverse color - if (process.env.HWVERSION == 1) { - g.setColor(g.theme.bg); - g.drawString(":", x,y); - g.setColor(g.theme.fg); - } - } - + g.drawString(":", x,y); g.setFontLatoSmall(); g.setFontAlign(0, -1); g.drawString((infoData[infoMode].calc()), w/2, h - 24 - 24); - if (drawCount % 3600 == 0) + // recalc sunrise / sunset every hour + if (drawCount % 60 == 0) updateSunRiseSunSet(new Date(), location.lat, location.lon); drawCount++; + queueDraw(); } -// Only update when display turns on -if (process.env.BOARD!="SMAQ3") // hack for Q3 which is always-on -Bangle.on('lcdPower', function(on) { - if (secondInterval) - clearInterval(secondInterval); - secondInterval = undefined; - if (on) - secondInterval = setInterval(draw, 1000); - draw(); +// timeout used to update every minute +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + nextInfo(); + draw(); + }, 60000 - (Date.now() % 60000)); +} + +// Stop updates when LCD is off, restart when on +Bangle.on('lcdPower',on=>{ + if (on) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } }); Bangle.setUI("clockupdown", btn=> { @@ -204,8 +293,6 @@ loadFonts(); loadLocation(); g.clear(); -var secondInterval = setInterval(draw, 1000); -draw(); - Bangle.loadWidgets(); Bangle.drawWidgets(); +draw(); diff --git a/apps/pastel/pastel.settings.js b/apps/pastel/pastel.settings.js index fad36964d..bf83fa7c2 100644 --- a/apps/pastel/pastel.settings.js +++ b/apps/pastel/pastel.settings.js @@ -4,6 +4,7 @@ // initialize with default settings... let s = { 'grid': false, + 'weather': false, 'font': "Lato" } @@ -39,8 +40,16 @@ value: s.grid, format: () => (s.grid ? 'Yes' : 'No'), onchange: () => { - s.grid = !s.grid - save() + s.grid = !s.grid; + save(); + }, + }, + 'Show Weather': { + value: s.weather, + format: () => (s.weather ? 'Yes' : 'No'), + onchange: () => { + s.weather = !s.weather; + save(); }, } }) From 3dde7126adf0c09fed5c87d4f8604618603802f3 Mon Sep 17 00:00:00 2001 From: crazysaem Date: Sun, 19 Dec 2021 21:11:38 +0000 Subject: [PATCH 106/605] 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 107/605] 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 108/605] 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 zcmbtWXH-+$5%LDQ>9MROFiI+BJcf-~?tfEP8D{$R-< ztBrTFlAG4j*mwU~SIz3nsqoZ{#vHQ%;j($*ju{WOg}Uvn>p&Tg`gpgy})SzmgYxD!D4?3OmdiyBC- z@>g^rvP@E0X*CC{wd5AV>oHEEUf^cU-E*Mb09m>u?)M@YXxv;+Q~13)PDdkYHhPr| ze#6BlSNltp7V;F}<3nl|tEt+LRTo0u5C0r{D_S$%8q;}Jq8P^fVPKi*h~$R3Y>(?a z!Jz>uBao?f#Jw*0PDx=ix?3BQ&2XZ~L#KJ;B_GLNuYW2{KpAX?9eTPB`2iq&#T>hv z5;DZZ{MAMC1|Mt$ztXnV4=%3(<~KW~R4ptS=f`30ZcyqYSuf$sw*G`O+GP1uzv| zBQLBbJ{-sN(z&on86EcG(#G>o05nQ=-Vs22-OHNc?kh&K!srAMlNV|YP)Pf5&SdYA zAwcilP0(=A9*1LVU87S-51*!jM(A>R=xY_snY;m!An&@g2k3`vVdJV|h(y5u0qJ<> z4;nWL+Pt%glI%MXK{zy|+BcX87Xc@Bo)XJ!7?b@RAlf+qDd~7L@qizoroJ8h+cxkE zf3@G3@*@gVky2uSkSsJAh{&tWUG)Scg)pRzIKfX=9jI8)R=iVAdA3EJ;) zf1MFJtJh~K572|%0PSMPJJo@Iff1`X_N3TvO=_%Mt*0fcMRAR@!>jeA_V7aBylSKg z_7{^&c#@a8fL=N3j&3zFCf^GC<%aY=a`ye}4f+N%Zri+yvyrG^VImY_hrhz{cD#Ud zvO}Hz((X*AZpV5xB$2&*hi;EOHj(sO#iR&<-@D9IT^%$Tu|rsrI3PS|i79TId$VdCk0P!n`2 zHdEcCvm)R1Kn1Qz+sxx?B2%1SS4_?~`)XIgiRyYsJl}*8cZf6px#QjC*O4z$-l@yz zG`(O?pamB59iyR<>8t*_6qn__2*yGmRN2s4_}Ojm)X7=TVYS-+#q0P7x^FxuhPM5= zSl<<{moluHYFO42ZRCiVlBUd4)IK9AUSF6OW?rntMwEx0FHidC7qTV#1UkNJ zhib00pPXjZg*i1?w0t)A@dKZt zAA{-JLyqY2aV&c)JS(cz;xFH=F!wS-2<+p&Hr(9uW+*yz3MdDJiWTt>PE``ZdZrUY zVys7H4n7P`@4CA*OAD+Wc>ChoL{CYtzXfce9>{^UBPk={%8OQ%;QdGdq?0+yhzpX6 zh!mUT-sAZ6Z}Nmh*)vh#kOw9jRC!Zi;S}#RIC@H#T`g@&!qjnWu|8*1d7$mg)bh)9 z0d*YvrdD@Bl=NeTK3BG_AyvScALQ%i%L=lAbodf$d2~t!+2VFE27Ut!o-VNJ#|g6W zbmF!QgF8t~9cUc%uS(k+>w*mkpy2xt)B0W|C_5+rTHgIU!^ut6*`9kih&g#?$FG-# zsYhhOSm*Yi6J-NK@Bh++TA}$Z%U=M4Jwcyq7LRu8OGyf;U8O1$2@Ah^{9@Ps<@9!3fpu3Ja3aqg8gh@(xyYbcY&w59dxPu(v)@Wbe1~ zn0r9*6`FLx2ymwO9Retbh7>{yuk^=2#9PkYDyp%On4=VMVw)Wx{8QwDLO}$+#G(2n zfP!Nxg(-ky{yksSoNopwB0MBhYarkT=teKh!T|pgF04c2%*+R37`yWWce{R327WvC zgIKV^UTNoqSKe0WTiKiv!vKXU>{9$obYmDpGUef!D(CVF)24~9EVJU8OI z4*>3tf2GIk>!@@h0F3xZDi8Qy zo6qOHEo+uMPVLkJ3NYtmKdt15%Sy3J?u`|frP8;nQdeBokUf>4Deg)%pXN>2IpMDh{Sxn{U1ZdS4AN6a@&5{N(Y;dx#2)V@tk z#0;~Q+_q5aEZH}rEPcgtpFO7+?Y{H=SNoLU*_4`QIg8F>d_wE}_dZTL(_8O#Eefq*fjspXZikzS$M^v+od#HJ%#Yr zi1Kbus9-Y6@Xm^B?_pYKd`jSsZ8-~iO*2adV`fHCjK_lk!FXE z`EeCjd;4*dvicDAFBE@9fdB^LYY zY3?RBxy^>=4Pn3OIQ@I`Bd!%LWR)fi;-)E4Xid1A@F|JnNbojV-uonF(ZJGASZD$B zuTa2?9;ZucZ_;Uc#Qv$EjHlZwcz=4r#+P?kEnHShZ%e_gcG55|NoVd3^=p3ckn0!> zMGRjuy=WbJ@yAZ>(=iD@eypIR0(c=u2 ri=M5}A4v!*E73d#yqhL-`WJ#|7U#5e%Q9X3i3Lbj$1HQqDG~nwBr*|` delta 2649 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 Date: Sun, 19 Dec 2021 22:25:55 +0100 Subject: [PATCH 109/605] 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 110/605] 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 111/605] 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 112/605] 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 113/605] Minor design improvements. --- apps/lcars/lcars.app.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index d63b2c743..9068868f0 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -165,10 +165,10 @@ function drawLock(){ g.setFontAntonioMedium(); g.setColor(cOrange); g.clearRect(120, 10, g.getWidth(), 75); - g.drawString("LCARS", 130, 15); - g.drawString("B-JS2", 130, 35); + g.drawString("LCARS", 130, 12); + g.drawString("B-JS2", 130, 32); if(Bangle.isLocked()){ - g.drawString("LOCK", 130, 55); + g.drawString("LOCK", 130, 52); } } @@ -223,7 +223,7 @@ function drawPosition0(){ var currentDate = new Date(); var timeStr = locale.time(currentDate,1); g.setFontAntonioLarge(); - g.drawString(timeStr, 25, 12); + g.drawString(timeStr, 25, 10); // Write date g.setColor(cWhite); @@ -231,7 +231,7 @@ function drawPosition0(){ var dayStr = locale.dow(currentDate, true).toUpperCase(); dayStr += " " + currentDate.getDate(); dayStr += " " + currentDate.getFullYear(); - g.drawString(dayStr, 28, 58); + g.drawString(dayStr, 28, 56); // Draw data g.setColor(cWhite); From 9d180064f54ca3e5decebca46e990a50c9b88661 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Sun, 19 Dec 2021 22:25:18 +0000 Subject: [PATCH 114/605] Pastel: added dependancy on weather, fix issues on a B1, extend support to B1 for Pebble and Widbata --- apps.json | 8 ++++---- apps/pastel/ChangeLog | 1 + apps/pastel/pastel.app.js | 16 ++-------------- 3 files changed, 7 insertions(+), 18 deletions(-) diff --git a/apps.json b/apps.json index 909c4793a..214b8b350 100644 --- a/apps.json +++ b/apps.json @@ -4210,10 +4210,10 @@ "id": "pastel", "name": "Pastel Clock", "shortName": "Pastel", - "version": "0.09", + "version": "0.10", "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", - "dependencies": {"mylocation":"app", "widpedom":"app"}, + "dependencies": {"mylocation":"app", "widpedom":"app","weather":"app"}, "screenshots": [{"url":"screenshot_pastel.png"}], "type": "clock", "tags": "clock", @@ -4733,7 +4733,7 @@ "screenshots": [{"url":"pebble_screenshot.png"}], "type": "clock", "tags": "clock", - "supports": ["BANGLEJS2"], + "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ {"name":"pebble.app.js","url":"pebble.app.js"}, {"name":"pebble.settings.js","url":"pebble.settings.js"}, @@ -4767,7 +4767,7 @@ "screenshots": [{"url":"screenshot_widbata_1.png"}], "version":"0.01", "type": "widget", - "supports": ["BANGLEJS2"], + "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", "description": "Shows the current battery level status in the top right using the clocks colour theme", "tags": "widget,battery", diff --git a/apps/pastel/ChangeLog b/apps/pastel/ChangeLog index afeb305c5..627531f03 100644 --- a/apps/pastel/ChangeLog +++ b/apps/pastel/ChangeLog @@ -7,3 +7,4 @@ 0.07: Added info line that cycles on BTN1/BTN3 (or vitual buttons on a bangle 2) 0.08: Added dependancy on MyLocation 0.09: Added dependancy on Pedometer Widget +0.10: Added Weather line, fixed issues on a Bangle 1, update every minute diff --git a/apps/pastel/pastel.app.js b/apps/pastel/pastel.app.js index e0c7df831..db60a2738 100644 --- a/apps/pastel/pastel.app.js +++ b/apps/pastel/pastel.app.js @@ -149,8 +149,6 @@ function getWeather() { return jsonWeather; } -var mm_prev = "xx"; - function draw() { var d = new Date(); var da = d.toString().split(" "); @@ -190,18 +188,8 @@ function draw() { } g.reset(); - - if (process.env.HWVERSION == 1) { - // avoid flicker on a bangle 1 by comparing with previous minute - if (mm_prev != mm) { - mm_prev = mm; - g.clearRect(0, 30, w, h - 24); - } - } else { - // on a b2 safe to just clear anyway as there is no flicker - g.clearRect(0, 30, w, h - 24); - } - + g.clearRect(0, 30, w, h - 24); + // draw a grid like graph paper if (settings.grid && process.env.HWVERSION !=1) { g.setColor("#0f0"); From 6e48dc66f1576a690c54f143b52ae31e053fdd5a Mon Sep 17 00:00:00 2001 From: numerist Date: Sun, 19 Dec 2021 20:47:47 -0500 Subject: [PATCH 115/605] Update app.js --- apps/doztime2/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/doztime2/app.js b/apps/doztime2/app.js index ac67954d3..313ad9e48 100644 --- a/apps/doztime2/app.js +++ b/apps/doztime2/app.js @@ -150,8 +150,8 @@ function writeDozDate(text,def,colour){ g_d.clear(); g_d.setFont("Vector",def.size); for(let i in text){ - if(text[i]=="a"){ g_d.setFontAlign(0,0,2); g_d.drawString("2",x+1+def.dx,y+1+def.dy); } //+1s new - else if(text[i]=="b"){ g_d.setFontAlign(0,0,2); g_d.drawString("3",x+1+def.dx,y+1+def.dy); } //+1s new + if(text[i]=="a"){ g_d.setFontAlign(0,0,2); g_d.drawString("2",x+2+def.dx,y+1+def.dy); } //+1s new + else if(text[i]=="b"){ g_d.setFontAlign(0,0,2); g_d.drawString("3",x+2+def.dx,y+1+def.dy); } //+1s new else{ g_d.setFontAlign(0,0,0); g_d.drawString(text[i],x,y); } x = x+def.step[0]; y = y+def.step[1]; 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 116/605] 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 117/605] 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 118/605] 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 119/605] 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 120/605] 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 121/605] 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 122/605] 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 1f48b21540706dad021ff6706d0b9d6393afaa94 Mon Sep 17 00:00:00 2001 From: numerist Date: Mon, 20 Dec 2021 11:05:36 -0500 Subject: [PATCH 123/605] Update apps.json --- apps.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 7cc91cae5..d099146ea 100644 --- a/apps.json +++ b/apps.json @@ -4716,8 +4716,6 @@ {"name":"doztime.app.js","url":"app.js"}, {"name":"doztime.img","url":"app-icon.js","evaluate":true} ] -} -] }, { "id":"doztime2", "name":"Dozenal Time 2", @@ -4732,7 +4730,7 @@ {"name":"doztime2.app.js","url":"app.js"}, {"name":"doztime2.img","url":"app-icon.js","evaluate":true} ] -} +}, { "id": "mylocation", "name": "My Location", "shortName":"My Location", From 3ceef9afd5a38054f60f70a9d23bb26035479a35 Mon Sep 17 00:00:00 2001 From: numerist Date: Mon, 20 Dec 2021 15:42:36 -0500 Subject: [PATCH 124/605] Update apps.json --- apps.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps.json b/apps.json index d099146ea..5dc306a6f 100644 --- a/apps.json +++ b/apps.json @@ -4710,6 +4710,7 @@ "description":"A dozenal Holocene calendar and dozenal diurnal clock", "tags":"clock", "type":"clock", + "supports":["BANGLEJS"], "allow_emulator":true, "readme": "README.md", "storage": [ @@ -4725,6 +4726,7 @@ "description":"A dozenal Holocene calendar and dozenal diurnal clock for Bangle.js 2", "tags":"clock", "type":"clock", + "supports":["BANGLEJS2"], "allow_emulator":true, "storage": [ {"name":"doztime2.app.js","url":"app.js"}, 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 125/605] 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 126/605] 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 127/605] 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 128/605] 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 129/605] 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 130/605] 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 131/605] 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 132/605] 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 133/605] 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 134/605] 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 135/605] 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 136/605] 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 137/605] 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 138/605] 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 139/605] 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 140/605] 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 141/605] 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 143/605] 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 144/605] 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 145/605] 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 146/605] 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 147/605] 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 148/605] 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 149/605] 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 150/605] 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 151/605] 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 152/605] 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 153/605] 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 154/605] 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 155/605] 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 156/605] 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 157/605] 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 158/605] 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 159/605] 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 160/605] 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 161/605] 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 162/605] 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 163/605] 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 164/605] 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 165/605] 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 166/605] 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 167/605] 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 168/605] 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 169/605] 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 170/605] 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 171/605] 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 172/605] 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 173/605] 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 174/605] 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 175/605] 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 176/605] 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 177/605] 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 178/605] 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 179/605] 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 180/605] 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 181/605] Add files via upload --- apps/supf/icon.png | Bin 0 -> 7090 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/supf/icon.png diff --git a/apps/supf/icon.png b/apps/supf/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca4d6140129667bdc4900b5a580a7ae189cec88 GIT binary patch literal 7090 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 Date: Wed, 22 Dec 2021 01:31:24 +0100 Subject: [PATCH 182/605] 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 183/605] 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 184/605] 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 185/605] 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 186/605] 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 187/605] 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 188/605] 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 189/605] 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 190/605] 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 191/605] 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 192/605] 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 193/605] 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 194/605] 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 195/605] 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 196/605] 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 197/605] 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 198/605] 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 199/605] 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 200/605] 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 201/605] 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 202/605] 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 203/605] 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 204/605] 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 205/605] 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 206/605] 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 207/605] 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 208/605] 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 209/605] 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 210/605] 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 211/605] 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 212/605] 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 213/605] 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 214/605] 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 215/605] 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 216/605] 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 217/605] 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 218/605] 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 219/605] 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 220/605] 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 221/605] 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 222/605] 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 223/605] 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 224/605] 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 225/605] 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 226/605] 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 227/605] 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 228/605] 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 229/605] 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 230/605] 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 231/605] 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 232/605] 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 233/605] Update ChangeLog --- apps/setting/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index 143144d51..a2245a02d 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -41,3 +41,4 @@ 0.36: Added 'Utils' menu with helpful utilities for restoring Bangle.js 0.37: Going into passkey menu now saves settings with passkey 0.38: Restructed menus as per forum discussion +0.39: Fix misbehaving debug info option From d0eb56597670be1db6905d66a436cbbe84d4153d Mon Sep 17 00:00:00 2001 From: Adam Schmalhofer Date: Fri, 24 Dec 2021 12:31:00 +0100 Subject: [PATCH 234/605] grocery: Prepare porting to BJS2 --- apps.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e5e9f8f02..261c9aeb7 100644 --- a/apps.json +++ b/apps.json @@ -1749,8 +1749,9 @@ "icon": "grocery.png", "type": "app", "tags": "tool,outdoors,shopping,list", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS", "BANGLEJS2"], "custom": "grocery.html", + "allow_emulator": true, "storage": [ {"name":"grocery.app.js","url":"app.js"}, {"name":"grocery.img","url":"grocery-icon.js","evaluate":true} From d76a89b89acdb55aa25059c2522492302854e9e4 Mon Sep 17 00:00:00 2001 From: Hilmar Strauch <56518493+HilmarSt@users.noreply.github.com> Date: Fri, 24 Dec 2021 12:42:25 +0100 Subject: [PATCH 235/605] Update gps-info.js Sum up number of GPS and Beidou satellites in view. --- apps/gpsinfo/gps-info.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/gpsinfo/gps-info.js b/apps/gpsinfo/gps-info.js index cca7e8e0f..4c935b61a 100644 --- a/apps/gpsinfo/gps-info.js +++ b/apps/gpsinfo/gps-info.js @@ -109,8 +109,13 @@ function onGPS(fix) { } function onGPSraw(nmea) { + var nofBD = 0; + var nofGP = 0; if (nmea.slice(3,6) == "GSV") { - SATinView = nmea.slice(11,13); + // console.log(nmea); + if (nmea.slice(0,7) == "$BDGSV,") nofBD = nmea.slice(11,13); + if (nmea.slice(0,7) == "$GPGSV,") nofGP = nmea.slice(11,13); + SATinView = nofBD + nofGP; } } From 165d1f7b999079aaf98d18ab09b5abdc681f68db Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 24 Dec 2021 12:44:06 +0000 Subject: [PATCH 236/605] Pastel: updated README and screenshots --- apps.json | 4 +-- apps/pastel/README.md | 46 ++++++++++++++++++++++++------ apps/pastel/screenshot_pastel.png | Bin 4014 -> 2993 bytes apps/pastel/weather_icons.png | Bin 0 -> 1506 bytes 4 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 apps/pastel/weather_icons.png diff --git a/apps.json b/apps.json index 214b8b350..a3f2788ee 100644 --- a/apps.json +++ b/apps.json @@ -4214,9 +4214,9 @@ "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", "dependencies": {"mylocation":"app", "widpedom":"app","weather":"app"}, - "screenshots": [{"url":"screenshot_pastel.png"}], + "screenshots": [{"url":"screenshot_pastel.png"}, {"url":"weather_icons.png"}], "type": "clock", - "tags": "clock", + "tags": "clock, weather, tool", "supports": ["BANGLEJS","BANGLEJS2"], "readme": "README.md", "storage": [ diff --git a/apps/pastel/README.md b/apps/pastel/README.md index 66ae0e189..7dbfbe9a1 100644 --- a/apps/pastel/README.md +++ b/apps/pastel/README.md @@ -1,45 +1,73 @@ # Pastel Clock - *a configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times* + *a configurable clock with custom fonts, background and optional weather icons. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times* * Designed specifically for Bangle 1 and Bangle 2 * A choice of 7 different custom fonts * Supports the Light and Dark themes -* Has a settings menu, change font, enable/disable the grid +* Has a settings menu, change font, enable/disable the grid, weather icons * On Bangle 1 use BTN1,BTN3 to cycle through the info display (Date, ID, Batt %, Ram % etc) * On Bangle 2 touch the top right/top left to cycle through the info display (Date, ID, Batt %, Ram % etc) * Uses mylocation.json from MyLocation app to calculate sunrise and sunset times for your location * Uses pedometer widget to get latest step count +* Use the wesather widget to get weather status * Dependant apps are installed when Pastel installs I came up with the name Pastel due to the shade of the grid background. Written by: [Hugh Barney](https://github.com/hughbarney) For support and discussion please post in the [Bangle JS Forum](http://forum.espruino.com/microcosms/1424/) -## Lato + +## Weather Support + + +![](screenshot_pastel.png) + +Pastel installs the weather app and weather widget. You may want to +hide the weather widget display, this can be done through the weather +widget settings. You should first get the weather app working. If +the weather App is not working, then it is not going to work for +Pastel. + +The following weather icons are supported. + +![](weather_icons.png) + +Mostly cloudy, Sunny, Mostly Sunny, Snow, Rain. + +The triangle icon shows there is a problem connecting to GadgetBridge and the weather service. +You should follow the setup and trouble shooting guide for the Weather App. + +If you find the weather / gadgetbridge service unreliable you can +disable weather updates to pastel through the settings app. + + +## Fonts + +### Lato ![](screenshot_lato.png) -## Architect +### Architect ![](screenshot_architect.png) -## Gochihand +### Gochihand ![](screenshot_gochihand.png) -## Monoton +### Monoton ![](screenshot_monoton.png) -## Elite +### Elite ![](screenshot_elite.png) -## Cabin Sketch +### Cabin Sketch ![](screenshot_cabinsketch.png) -## Orbitron +### Orbitron ![](screenshot_orbitron.png) diff --git a/apps/pastel/screenshot_pastel.png b/apps/pastel/screenshot_pastel.png index d489f19143b598f426b309b2e07904b222d1108f..c792ada8d932feabe3eba3feed17b61de7ed87c5 100644 GIT binary patch literal 2993 zcmc(h={M938^?dY8H}YwOxZ>vnLA}4TXtiRrA!#x43$s{*#~7*vW~cwB14v2s~KW$ zWSgFlijj4!6Oy4ZOm=eT@%#tRInRsdI_J7R=X}rkyt!U|)6O~D?iZC41pr{by&W36 z$EyFVu+ZM6)y)w007hVKtpF-hVIBa)g6+|kuCW9jWh{KgP#n$L-R)%~Lto+C&!eZ0 z=U6cN+oS~{`6&{|9+~=n-J9Jhb63Cff-S=Q3Z^#ih@h~RrLfy1m#ePFHX07{P-0vO z-`KZf%)mlMbBNMQa@M2gjgvocIEL^0>BZQap(*_+~53-rYL{kHFOs{_S4`az~iYxtCRqun#fkz^Y)JtaKFV;q$3ia%f7a}Mgyq=n2rAt>Q*tNZ#b~`%4nCF?<^7G*A12GyXkUNSnH*0moe8ceS!Le zQInz>DKr#Kc=1cw=IW7!H*bah3~omW#Oi!izPDnkRf?sc%*{LNPorXJt$K)I9pl2r zR`;tjrhH_@>bV!)ceuqaexg+mZu`F#Vn6q8xO^+`M|R{SXXy|AhV94Ek>rZjK)IOT zt&kn7(^rPQKu8n)rehJ1n^Xx`Vt9{zm=V#E{jcI6!K&5D#!AYyf&_U|j;4C$vY={r z-DbA$RQ_PgneL$#7Q|0Pcs}A){Sa4g%MMV1ZRB#ON{?V3I-8_@_`u|Y&5NRi0(rB) zdf>Yn3ZPle+IptR_QObZMuA3_A{EYhDC9Bb_SaaYK<Qta==mabf%kc? zM(}4a;SeE0tXVhn3zZyxg~ZA$8nHoIkW^g#Gg;C~44QopS!IusCv-Z3MI|O#<(v-5 zJqp8Rzo7($`N4e=--HE)!|tYM{w#n9Y@+5HZrp_k7+TqM#5#eHor2YILn{!XP@;UP zsR96RImLx2lvo%u@>^#^;C}6ewe<0u{foTN9#aa=kda5z3dm@==V6Quax!2B4ha)L+TL)vNPC=nh}|h?7EgO#X`pGq=v9sv zdozAjvZ}PpcKy@K3vSmDa2@b(X5jOUR#Ivwwa*pb!I_kmB9{VmyZy)Rz9e0Od%R7Yj@tD{7M2A1z09W4 z#qb~E3xYhRW9az49NmingT-(b_wxcDGbb+;hQ=*R&ot9jgGKp9?qWs3~C-rs5G_xqLSdM%2|^%pmJUv9o>F+1sL{rHLkvGcP@8(ARt zu9d|Q>9p>I9PFd^t415^%VNE`P^K*n@lE;bs>2fo&C z&-idg)S(3K>t{wvlEJ!DgPBr8UMHPOU16BXhv+{q+OfR5R|p%@P5IyM+KlM{w(>HF z95u8Gw;G;28S> zlME1jhPoOyfAohej;oRAx}vvehfSH)Pw5MpiK-)*PGUOHetNf ze<1&*cwv6wAd(w}Y#aHh9>sPv3po($3R`D0UqAJrc_Stl-hSCeaoL@o6G^(x`E_AS zYo2vWDw@3KId1obFuYMU4%;_0wHDz~kW8l-mhw|&aPLjDO(V9l_yKyTRUqHE>H)vH zVSs3ojfNbS{d`^uLX$p%A}kA$RjMT#dXQ?m4D7TVhzUNGTsG^Ks4m;kXlFD&sEX$d zt}Mo7Fk3^Wa&g6}1om4WAkcC_5+x;YO!G=&&(zNX#2_+Tds!qlakGZWC^-LIQZWgg zu4Z`*zohLo+9<}5G*dR)d&^*&N=BZARhwlXvHJoQQdJ&W{z#YhF8~v&UbI+|#LT@f z=p!&aIP1&3ehVJ^9+NsRBD-(vEQRSp=*(^T{^G%bhI6PQsmfKpb=>0jyQJ zlbb+2c@QP0%0S(`ejW~nT#D+p5(#ti9dorIjd|c}&OvjN#-&y9cm zUVGXvTx|twf&QSzXAL>5EH*rGr`&XaUL&5ceVY0>DbONrNtnY-TpVu9g4wZEZBs|a zV*_7vI{oA5EV=tf3ci0#Vs2J4=ZA+Dv$?rZ~=SU%Z6o2hr z@aQt;wDKNx8x*aPLW`mO-M3dz6@zt*XH)U6_+R-ef0pR_o PiUamG&Sh$~K5uQkuL!te52-`kE&MoXgQ+6$%% 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 diff --git a/apps/pastel/weather_icons.png b/apps/pastel/weather_icons.png new file mode 100644 index 0000000000000000000000000000000000000000..59d4f007f51ed9a607e3765edbf0c5fb525ee619 GIT binary patch literal 1506 zcmb7E`#;kQ0Nr;sn-Nx_&08uZ2}!19=CQehqGb_RM-ELDNc`9@cz2 zn4J^tmbFJdmv~6ttTcAR-0#08;QE}Ecc%y8N^ezi8vSyRRYCekHZD+eV?Qqfh37`r z1}S{fb<|Nu?eN`4we>lSvQ&y)Ip+~9?>ac^Y%0gaoa?>a9d@X=0U;8wH1D1_1mx zcD`##=gN7X{gxI|bMBDJ>5JC{%`d9cTX^y|`ImgWRKV7CAmjcZ23@k@GJsL1Ck3v3 zIb?sH-6;_*JTrXTd+u37A(BcT$Fo3@--_=^prRvw?S>NC;{z|)3JT?Jp^BBo!FaR) z8g$YhJ)G&PnP#aa$c{2RxLoqsj!F1hpgSISpM`=W3*QzCa#$V(vopO17t+$hPPUTx zNUQBhnD2C|Joi>F3yV5&TWTP9d2NDaX3q})60veR1<$TpgIQ3ds2GYFn--K20fzaT z*T+bf`X&?hm0D>xq_P5AHGh0pR&5Pjt&GdPL5ku!Db#RY#_grsx>`ggO2$e{x4isB z3kZ#xYlvrv!2>WBGGsz?eOQ7acp4LYhjrDNz3Cx<5jsYyc4iTjt`ZwFk2Cwp0a3aJ z_lEm8<*@dY4$A4)gEm~V?hMPR!{=-P!<`Fx6*mC(8II(#H|INWb#xj#Vv3WA(;_Mm zvCG=aqo0_%C|L!Rts1vk!`FQf@)hVn3mfK`&U?SQ+z z3ny&6AA&~RojcdD7L38y{Ym!dgpE@ydk#5uw^5=yN=q(%ay!`%dEQ*hIdFT9ni!Q) zrDkIrv0-DZxDvS*GZGnoz3BMF`*=e|@PwO|Q3J1&YUW}>HA@|_pLsZ=2$p%!hQT4% zorGefaU82OLDc0D!z$iBHoik0cwn^nsuNY=`nLP*YS#1DPZ)OV080V8GLp_&zd1p2-ouq(65%cB;arr`x1h8dPZKiwDJSHES>lN+WiYxY> zc63qWCnsHuG&jY?42KY+aV{x3+H`Pa9P~Xk`qxpve&M?5F)R^Yx0s; zQy5Ml&1-vi%*qiP0>JrV$%9jSGhPQgX^fdxcVK|xm04QKf2>6TrZAno04D>?uXK1L z&8`s4T0KIqgOK`Uruh!%Myguu{ErlMzC>ej z+oPJ*Kvk`ey$B10{|fgRhm@wd-r>6MgRO7oO-;KH!me;M@`E+KHUPgnu@>tAv8wuMv0zM(l`Z=b=dnNgclvheqyc}C zo-#Le$*(I~emXZ%LCWftQ55mh;xC)+9cM>2Ml-fd=4e>AP(dO4?UQC?gPlL>Kmmy1 z035ZpZk)AsGo9QtpZ*Oxwdy#A!2{eB#n6S&{}(-dM6aI-QY|w0@4G>s?mlj9_^_;h E0d)$;RR910 literal 0 HcmV?d00001 From 39adcc7fa6a5c399361b8ebfd347d4d5c558b815 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 24 Dec 2021 13:00:31 +0000 Subject: [PATCH 237/605] Pastel: updated README and screenshots --- apps.json | 2 +- apps/pastel/README.md | 12 +++++++++++- apps/pastel/screenshot_grid.png | Bin 0 -> 3921 bytes 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 apps/pastel/screenshot_grid.png diff --git a/apps.json b/apps.json index a3f2788ee..8a0d86b97 100644 --- a/apps.json +++ b/apps.json @@ -4211,7 +4211,7 @@ "name": "Pastel Clock", "shortName": "Pastel", "version": "0.10", - "description": "A Configurable clock with custom fonts and background. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", + "description": "A Configurable clock with custom fonts, background and weather display. Has a cyclic information line that includes, day, date, battery, sunrise and sunset times", "icon": "pastel.png", "dependencies": {"mylocation":"app", "widpedom":"app","weather":"app"}, "screenshots": [{"url":"screenshot_pastel.png"}, {"url":"weather_icons.png"}], diff --git a/apps/pastel/README.md b/apps/pastel/README.md index 7dbfbe9a1..b396386af 100644 --- a/apps/pastel/README.md +++ b/apps/pastel/README.md @@ -8,10 +8,13 @@ * Has a settings menu, change font, enable/disable the grid, weather icons * On Bangle 1 use BTN1,BTN3 to cycle through the info display (Date, ID, Batt %, Ram % etc) * On Bangle 2 touch the top right/top left to cycle through the info display (Date, ID, Batt %, Ram % etc) +* The information display will cycle on each screen update * Uses mylocation.json from MyLocation app to calculate sunrise and sunset times for your location * Uses pedometer widget to get latest step count -* Use the wesather widget to get weather status +* Use the weather widget to get weather status * Dependant apps are installed when Pastel installs +* The screen is updated every minute to save battery power +* The weather display will display temperature and wind speed on alternate screen refreshes I came up with the name Pastel due to the shade of the grid background. @@ -71,3 +74,10 @@ disable weather updates to pastel through the settings app. ### Orbitron ![](screenshot_orbitron.png) +### The Grid + +Setting the grid on provides a graph paper style background to the App. +The grid is not supported on a Bangle 1 due to flicker issues. + +![](screenshot_grid.png) + diff --git a/apps/pastel/screenshot_grid.png b/apps/pastel/screenshot_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..7b993353b533d4ceab374d6cd7272133aa740597 GIT binary patch literal 3921 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 Date: Sat, 25 Dec 2021 07:29:53 +0100 Subject: [PATCH 238/605] 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 239/605] 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 240/605] 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 241/605] 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 242/605] 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 243/605] 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 244/605] 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 245/605] 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 246/605] 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 247/605] 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 248/605] 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 249/605] 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 250/605] 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 251/605] 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 252/605] 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 253/605] 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 254/605] 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 255/605] 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 256/605] 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 257/605] 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 258/605] 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 259/605] 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 260/605] 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 261/605] 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 262/605] 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 263/605] 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 d03749ed92fd10fa690a7e79c6a5da857a826297 Mon Sep 17 00:00:00 2001 From: 7kasper <7kasper@users.noreply.github.com> Date: Sun, 26 Dec 2021 17:14:08 +0100 Subject: [PATCH 264/605] Initial release of presentor app. --- apps/presentor/app.js | 277 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 277 insertions(+) create mode 100644 apps/presentor/app.js diff --git a/apps/presentor/app.js b/apps/presentor/app.js new file mode 100644 index 000000000..d9b032bd0 --- /dev/null +++ b/apps/presentor/app.js @@ -0,0 +1,277 @@ +// Presentor by 7kasper +// Licensed under MIT. +// Version 2.1 + +const MouseReport = new Uint8Array([ + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x02, // USAGE (Mouse) + 0xa1, 0x01, // COLLECTION (Application) + 0x85, 0x01, // REPORT_ID (1) + 0x09, 0x01, // USAGE (Pointer) + 0xa1, 0x00, // COLLECTION (Physical) + 0x05, 0x09, // USAGE_PAGE (Button) + 0x19, 0x01, // USAGE_MINIMUM (Button 1) + 0x29, 0x05, // USAGE_MAXIMUM (Button 5) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x95, 0x05, // REPORT_COUNT (5) + 0x75, 0x01, // REPORT_SIZE (1) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x95, 0x01, // REPORT_COUNT (1) + 0x75, 0x03, // REPORT_SIZE (3) + 0x81, 0x03, // INPUT (Cnst,Var,Abs) + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x30, // USAGE (X) + 0x09, 0x31, // USAGE (Y) + 0x09, 0x38, // USAGE (Wheel) + 0x15, 0x81, // LOGICAL_MINIMUM (-127) + 0x25, 0x7f, // LOGICAL_MAXIMUM (127) + 0x75, 0x08, // REPORT_SIZE (8) + 0x95, 0x03, // REPORT_COUNT (3) + 0x81, 0x06, // INPUT (Data,Var,Rel) + 0x05, 0x0c, // USAGE_PAGE (Consumer Devices) + 0x0a, 0x38, 0x02, // USAGE (AC Pan) + 0x15, 0x81, // LOGICAL_MINIMUM (-127) + 0x25, 0x7f, // LOGICAL_MAXIMUM (127) + 0x75, 0x08, // REPORT_SIZE (8) + 0x95, 0x01, // REPORT_COUNT (1) + 0x81, 0x06, // INPUT (Data,Var,Rel) + 0xc0, // END_COLLECTION + 0xc0, // END_COLLECTION + 0x05, 0x01, // USAGE_PAGE (Generic Desktop) + 0x09, 0x06, // USAGE (Keyboard) + 0xa1, 0x01, // COLLECTION (Application) + 0x85, 0x02, // REPORT_ID (2) + 0x05, 0x07, // USAGE_PAGE (Keyboard) + 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) + 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x01, // LOGICAL_MAXIMUM (1) + 0x75, 0x01, // REPORT_SIZE (1) + 0x95, 0x08, // REPORT_COUNT (8) + 0x81, 0x02, // INPUT (Data,Var,Abs) + 0x75, 0x08, // REPORT_SIZE (8) + 0x95, 0x01, // REPORT_COUNT (1) + 0x81, 0x01, // INPUT (Cnst,Ary,Abs) + 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) + 0x29, 0x73, // USAGE_MAXIMUM (Keyboard F24) + 0x15, 0x00, // LOGICAL_MINIMUM (0) + 0x25, 0x73, // LOGICAL_MAXIMUM (115) + 0x95, 0x05, // REPORT_COUNT (5) + 0x75, 0x08, // REPORT_SIZE (8) + 0x81, 0x00, // INPUT (Data,Ary,Abs) + 0xc0 // END_COLLECTION +]); + +const MouseButton = { + NONE : 0, + LEFT : 1, + RIGHT : 2, + MIDDLE : 4, + BACK : 8, + FORWARD: 16 +}; + +const kb = require("ble_hid_keyboard"); + +function drawMain() { + g.clear(); + E.showMessage('Presentor'); +} + +let HIDenabled = true; +let lastx = 0; +let lasty = 0; +let timeoutId = -1; +let holding = false; +let timeoutHolding = -1; + +let homeRoll = 0; +let homePitch = 0; + +let trackPadMode = false; + +let mCal = 0; + +let clearToSend = true; +let mttl = 0; +let cttl = 0; + +NRF.setServices(undefined, { hid : MouseReport }); +NRF.on('HID', function() { + HIDenabled = true; +}); + +function moveMouse(x,y,b,wheel,hwheel,callback) { + if (!HIDenabled) return; + if (!b) b = 0; + if (!wheel) wheel = 0; + if (!hwheel) hwheel = 0; + NRF.sendHIDReport([1,b,x,y,wheel,hwheel,0,0], function() { + if (callback) callback(); + }); +} + +function getSign(x) { + return ((x > 0) - (x < 0)) || +x; +} + +function scroll(wheel,hwheel,callback) { + moveMouse(0,0,0,wheel,hwheel,callback); +} + +// Single click a certain button (immidiatly release). +function clickMouse(b, callback) { + if (!HIDenabled) return; + NRF.sendHIDReport([1,b,0,0,0,0,0,0], function() { + NRF.sendHIDReport([1,0,0,0,0,0,0,0], function() { + if (callback) callback(); + }); + }); +} + +function pressKey(keyCode, modifiers, callback) { + if (!HIDenabled) return; + if (!modifiers) modifiers = 0; + NRF.sendHIDReport([2, modifiers,0,keyCode,0,0,0,0], function() { + NRF.sendHIDReport([2,0,0,0,0,0,0,0], function() { + if (callback) callback(); + }); + }); +} + +function handleAcc(acc) { + let rRoll = acc.y * -50; + let rPitch = acc.x * -100; + if (mCal > 10) { + //console.log("x: " + (rRoll - homeRoll) + " y:" + (rPitch - homePitch)); + moveMouse(acc.y * -50 - homeRoll, acc.x * -100 - homePitch); + } else { + //console.log("homeroll: " +homeRoll +"homepitch: " + homePitch); + homeRoll = rRoll * 0.7 + homeRoll * 0.3; + homePitch = rPitch * 0.7 + homePitch * 0.3; + mCal = mCal + 1; + } +} +Bangle.on('lock', function(on) { + if (on && holding) { + Bangle.setLocked(false); + Bangle.setLCDPower(1); + } +}); + +function startHolding() { + pressKey(kb.KEY.F10); + holding = true; + Bangle.buzz(); + E.showMessage('Holding'); + Bangle.on('accel', handleAcc); + Bangle.setLCDPower(1); +} +function stopHolding() { + clearTimeout(timeoutId); + if (holding) { + pressKey(kb.KEY.F10); + homePitch = 0; + homeRoll = 0; + holding = false; + mCal = 0; + Bangle.removeListener('accel', handleAcc); + Bangle.buzz(); + drawMain(); + } else { + timeoutId = setTimeout(drawMain, 1000); + } + clearTimeout(timeoutHolding); + timeoutHolding = -1; +} + +Bangle.on('drag', function(e) { + if (cttl == 0) { cttl = getTime(); } + if (trackPadMode) { + if (lastx + lasty == 0) { + lastx = e.x; + lasty = e.y; + mttl = getTime(); + } + if (clearToSend) { + clearToSend = false; + let difX = e.x - lastx, difY = e.y - lasty; + let dT = getTime() - mttl; + let vX = difX / dT, vY = difY / dT; + //let qX = getSign(difX) * Math.pow(Math.abs(difX), 1.2); + //let qY = getSign(difY) * Math.pow(Math.abs(difY), 1.2); + let qX = difX + 0.02 * vX, qY = difY + 0.02 * vY; + moveMouse(qX, qY, 0, 0, 0, function() { + setTimeout(function() {clearToSend = true;}, 50); + }); + lastx = e.x; + lasty = e.y; + mttl = getTime(); + console.log("Dx: " + (qX) + " Dy: " + (qY)); + } + if (!e.b) { + // short press + if (getTime() - cttl < 0.2) { + clickMouse(MouseButton.LEFT); + console.log("click left"); + } + // longer press in center + else if (getTime() - cttl < 0.6 && e.x > g.getWidth()/4 && e.x < 3 * g.getWidth()/4 && e.y > g.getHeight() / 4 && e.y < 3 * g.getHeight() / 4) { + clickMouse(MouseButton.RIGHT); + console.log("click right"); + } + cttl = 0; + lastx = 0; + lasty = 0; + } + } else { + if(!e.b){ + Bangle.buzz(100); + if(lasty > 40){ + E.showMessage('down'); + scroll(0,1); + } else if(lasty < -40){ + E.showMessage(kb.KEY.A); + pressKey(kb.KEY.A); + } else if(lastx > 40){ + E.showMessage('right'); + //kb.tap(kb.KEY.RIGHT, 0); + scroll(-1); + } else if(lastx < -40){ + E.showMessage('left'); + //kb.tap(kb.KEY.LEFT, 0); + scroll(1); + } else if(lastx==0 && lasty==0 && holding == false){ + E.showMessage('press'); + clickMouse(MouseButton.LEFT); + } + stopHolding(); + lastx = 0; + lasty = 0; + } else{ + lastx = lastx + e.dx; + lasty = lasty + e.dy; + if (timeoutHolding == -1) { + timeoutHolding = setTimeout(startHolding, 500); + } + } + } +}); + + +function onBtn() { + if (trackPadMode) { + trackPadMode = false; + stopHolding(); + drawMain(); + } else { + clearToSend = true; + trackPadMode = true; + E.showMessage('Mouse'); + } + Bangle.buzz(); +} +setWatch(onBtn, (process.env.HWVERSION==2) ? BTN1 : BTN2, {repeat: true}); + +drawMain(); From 5f5b32eb148af5d44c15247576c010d5ea2691cc Mon Sep 17 00:00:00 2001 From: 7kasper <7kasper@users.noreply.github.com> Date: Sun, 26 Dec 2021 17:28:22 +0100 Subject: [PATCH 265/605] Add app image. --- apps/presentor/app.png | Bin 0 -> 2208 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/presentor/app.png diff --git a/apps/presentor/app.png b/apps/presentor/app.png new file mode 100644 index 0000000000000000000000000000000000000000..d29cf7be6f4ce71b2de84afbb97cc8c3085dc3bb GIT binary patch literal 2208 zcmV;R2w(S!P)VL{@Xy-X{om%s;f+QiB#6t8QqDST47r zc@(s*wfJf0zFqH4?{~@U!1NgUv~?mLYi+BnkM2^*pic;~r=q6rR6N%9;ko@TnH^ZU z`CgyT@He9w5%7^AvTq!1*>h^DeQje?qkvb0(2pEzY5vR9_m|8L4BvaJs^}T3LQst0 zdrHeE!qJ9E@v5s14t2Ms6S3ADaQl@iL=bL+C0PD9jJ*qW7?kG>x^76~BTq^i=Tbgcm4b>Vl z-Mfms?sfz5?%Hdc?#kD{eczw|+fkmlL2KTTj`@$(TYp{*AeSYcLW|(qMED+9q7+)w z_`p^ncs=6F8YMo5vXGaMUm7Dex0ct`cPC=4AJ=WWKTxu~;osqC{Y@1s8^+^3t;cC^ z*YSqvKf|_vyWy%0@mTBL)9vkUc};yrz`gNU>$8h4U`^u#Tcyx%M0{Bz7Ey+HM%2q+YOHW3>24w}o)@(S@OS{I)kq-D2Os(8T#|xHyBjcO|>7prt;~OPBl$^Hp=4eE@&N?4)68(8A(aTGlEgu0YC~tk>8-$ zrzs1}T)(lDq9?AhO6Z?-w(NRwuHRfR0n_14kDvZ=Nx>O8N8k4I&p33sb^9LCm zA7fcy=A4C!xL^V6wlv)gycY3ijgU2&^MfgY&l}*c4{gDef>;03%?m9Z45YGLQRL;m z8^2ED#%df_air%Id){ixIro^Y=^1n~uI8G2*NzK1#JS)N%VgMwrt3Fi8Ir#pIL?c2 zw)5NSa^BpqoO^Vdov*a=_R&5}LsGY@imI}robwm?1>umiOvEqpG0a;)E_l;2$vB#f zquI1Nf~z#owj5(;^fJCv5+pP>M5D~`Gb_uUy+_Z^<@NaU{*KaUjdmAQKt6Z?M`?l{ z6R%~^Ka#{%ny-btlWpk~0JWB;cQ}dTDjZkw#^IA>b07}en!yR>xLQBCU;@@OKCl&d zE#jLA4`2w%M8?5!6_Mh}mHoudOtyJE033HAQsl)nB#H49XpJ$AWW-kVCY-EN;?Ayp z%|{kQKp_>@XMrUJZQZA_49WMuRl{Skem=1?_{+i^)do*xJpAa|bpRYXK0tB6kER?fZ&;yW7MyXaNi9Z0r+zu>r>jN2AkLpqfzc<@kCAwyvrc05k7dNqmhFSjo?Jb?V{{Xf_Ow?3IQ z`c5Z3IN2;I+XkSs-(fVB-^+ynHmCBo;=|L8t9mKq-N7|wh|Tnu=a#WBxE#KnS#IV`^r5f>943aDALiMZJCP+-x` zB_fUYqQk>^{JFdSn)|DyM;tN?ak(X2k<1#77HnV4B2`G7*V}OU)xY!?1(H7mQSJ)y iO4q-h?p`dgLgW8Yi`ZcrY`y>h0000 Date: Sun, 26 Dec 2021 17:31:16 +0100 Subject: [PATCH 266/605] Add app icon file. --- apps/presentor/app-icon.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/presentor/app-icon.js diff --git a/apps/presentor/app-icon.js b/apps/presentor/app-icon.js new file mode 100644 index 000000000..76939d548 --- /dev/null +++ b/apps/presentor/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwxH+AH4ASlgADGmIxwLV4wqGQowfWZQwjKw4wJF7ghBmVWmQlELYoweFwYABGAwrHF7IuFGAwrIF7AuHMJADGF0AwHAYovWFxaSHADQuDEgIADYZYucAQOB1fQ1eBmQwiFwlX6AAE1gqBGD6MEmQqBwIICwIGB0rDeWYksFAIuBz+fvQHC6D0dcQssEwIuB4fC4V0M4VXF7YuFDYLqBlnDF4WeHAYugL5N6L4I4BF0IvB0vQvdQGAJeBY4YucmQxEAgJgBvYOBdwYQDFzUzmZ/EllXFIKKBAYVXBwSMaller7fFAoKSBAAOBFQK7dPoJfFEoYADRjgmEeIzFFdUQAOdUIumdRLtDAAIufdRQKCr8zCQjqmE4NeF4YudWxpqCFyovBK5LqiF6DqdR6D0BdTYwJGg5sBdTQwKEAIwHdTQwMSpQueYaAufGBouiGBYukGBIumGA4uoGAouqGAYABF1QAl")) From 1bac672658ea5b37a6220729a1bf429768893657 Mon Sep 17 00:00:00 2001 From: 7kasper <7kasper@users.noreply.github.com> Date: Sun, 26 Dec 2021 17:35:12 +0100 Subject: [PATCH 267/605] Create ChangeLog --- apps/presentor/ChangeLog | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 apps/presentor/ChangeLog diff --git a/apps/presentor/ChangeLog b/apps/presentor/ChangeLog new file mode 100644 index 000000000..a7d747684 --- /dev/null +++ b/apps/presentor/ChangeLog @@ -0,0 +1,6 @@ +0.1: Start of app. +0.5: BLE keyboard functionality. +1.0: BLE mouse functionality to scroll back/forward. +1.5: Added accelerator style mouse. +2.0: Added touchpad style mouse. +2.1: Initial internal git(hub) release. Added icon and such. From 6a25e7901fd1e9a90359fb30bc3b1f9baedebcfa Mon Sep 17 00:00:00 2001 From: 7kasper <7kasper@users.noreply.github.com> Date: Sun, 26 Dec 2021 17:57:56 +0100 Subject: [PATCH 268/605] Add presentor to the banglejs app repository. --- apps.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/apps.json b/apps.json index e5e9f8f02..e4e53470d 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": "presentor", + "name": "Presentor", + "version": "2.1", + "description": "Use your Bangle to present!", + "icon": "app.png", + "type": "app", + "tags": "tool,outdoors", + "interface": "interface.html", + "readme":"README.md", + "supports": ["BANGLEJS", "BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"presentor.app.js","url":"app.js"}, + {"name":"presentor.img","url":"app-icon.js","evaluate":true} + ] } ] From 3b4cfe038d305974e4333ff6a940acd05bb5b2d1 Mon Sep 17 00:00:00 2001 From: 7kasper <7kasper@users.noreply.github.com> Date: Sun, 26 Dec 2021 18:03:55 +0100 Subject: [PATCH 269/605] Changed outdoor to bluetooth catagory >.< --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index e4e53470d..97cd97e4d 100644 --- a/apps.json +++ b/apps.json @@ -5070,7 +5070,7 @@ "description": "Use your Bangle to present!", "icon": "app.png", "type": "app", - "tags": "tool,outdoors", + "tags": "tool,bluetooth", "interface": "interface.html", "readme":"README.md", "supports": ["BANGLEJS", "BANGLEJS2"], From 2bf23bb5dc1eae3f0724e422fa683c3d15468763 Mon Sep 17 00:00:00 2001 From: Alain Saas Date: Mon, 27 Dec 2021 05:00:22 +0900 Subject: [PATCH 270/605] 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 271/605] 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 272/605] 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 273/605] 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 276/605] 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 277/605] 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 efd6e531c5023a645331ab9f72eb22b6f7e8b2d7 Mon Sep 17 00:00:00 2001 From: 7kasper <7kasper@users.noreply.github.com> Date: Sun, 26 Dec 2021 23:29:31 +0100 Subject: [PATCH 278/605] Test gestures on BS2.. :F --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 97cd97e4d..317b809dd 100644 --- a/apps.json +++ b/apps.json @@ -1324,7 +1324,7 @@ "icon": "gesture.png", "type": "app", "tags": "gesture,ai", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS", "BANGLEJS2"], "storage": [ {"name":"gesture.app.js","url":"gesture.js"}, {"name":".tfnames","url":"gesture-tfnames.js","evaluate":true}, 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 279/605] 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 280/605] 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 281/605] 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 283/605] 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 284/605] 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 285/605] 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 286/605] 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 287/605] 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 288/605] 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 289/605] 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 290/605] 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 291/605] 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 293/605] 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 294/605] 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 295/605] 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 296/605] 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 297/605] 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 298/605] 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 299/605] 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 300/605] 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 301/605] 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 302/605] 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 303/605] 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 304/605] 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 305/605] 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 306/605] 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 zcmbVMc|6oxA3n1+jCGii!L894%UGHjTeR517$)YYkd|vVLn8C)RZRcPI z5C{Zd!9Otl48^kD!w&#}!vQn^fCP|20Dy)O+{rb-yg4j&A0Y>jvkU-)2>Dqo36FCS zDgg7H4@3yn1ze8M2B_IM+#(pWe0g{*MlfeF0mh9;#W@bVTOxmcFVGEt1G~IKc13It z1g;$Yb!H}XyP4Sb%K)H;=KG!A{O#ce+x^4IMh1okMu16YGRzrFbEYYovBI2gW==N- zKqD?^UK27k?$iR#PFgm%H|#1&>pMnR0+0>>7TyX?XEN#OsCli(+;sE;t`Z==a}Y=r zd>8-+^I-?bW+8H6{kuZcLcB|eUci3{F$;n8btGR zXE5?_Z6eeU7(K5OMH6A>;wmtI(GMJnAMg(zMYtd0LEQKv&;CDas^ydnkylBiKtOP6?Ce*-B8i7I~(I^ZC4L^Fs{+Z-P z<1q^A468+oTyN~MPy#bna9V<5ec>7rYJaO?=o1zviBnpvOj4n0YH91xjEqf8SD2aG zthKeXXF0H4*Kcrh_t@y^>*pU3$m0j?3Xj+wxo2-w{Gr1MiAl*R!i>zU?4!qy=M)r* zii%50%g$6)i)$`ks;#?x{YGO`^UYf=tsM_KA9g+J?&*E@ynkTu#mk{r!|(ojKmK82 z^5dte8DDUgez&#Y>_2?rVP8lz8imHr_(C8f;flheG3ty(3RYaKcc|hrW~>CkT5$Tp zHA#vg^p@xo){axsFnUIPH)Czq*?(s&?*DSOVC-*Sy+9fTryd@K2NvK_?`q6SRL9i^ zFRcq|??hd3!H&ta#hbCZW3-Bx$h12`H{ZGhxpk5R{gh2|4yvPX zR58yG=!j-#qUsiwR@MQR(_O|>g3iybm7P{^4y;8D1_o?t^xJope`L>Vbkoi|$+af* zHJP8-Ts^H^)@~H`=lfFN)~<^|wL-LgDfG9;GLrTuwXx zrc<`9_1Ps?w4OVoUOJ1Hd@{Fy7!Qs(MkuS4=emU8ogLjJTGul(TEKqSXI#ZePh zr-U(`U+jX=VC{10+yk4xTnV$FZS=k5AjSHq_k7*eCbyz3X`A+ZsgxJAcs*&}YozMZ zetA`DYd_ZLoLXad6X6h*01}G`?JQxos8Kr~DU3b-=5S|4Po9=so>hk^Z}O<}Q*Fyg z`Yj9ggR=dJy$5ew#m97GFZ9>QzYqFMI+1;C^{xzu*jyXOVDZ87RC@kFrEf3JwMsJ$ zWfBisFq+q7_Ux#94PJ+Q?insRs8SOez6s@T(rosO|qn2W_ zmltkpyIl7LOuEb!sVk2N6#=SmFcw^U@zN@vubERRYg!N1Yfr?EcuzrG>rNs^#q-Dp}`tKu?aDUj!{=F0rFk`LGuuP~aJDdi##O z`PJmCc|4dOSK zvrDiRrrUK4403cD9Td$T*Y?*K%WUi3HRQO1(kiO=HyaA_Ox9gVICUR_l$T_>Dry!~ zYn&~U`*`%;&9^H11}aWuJxyv^n&sIOC7kqM<*3&+M5Rfqp6GkGVc+Z65dCZE*{Ph^ zXuMzxo*U(n@W;R-xt){SN}D#U_wCDx7IpMpKSI$OYuOex08K(R53}p*X^X$q=p{&hYlrwfnW9D$bt0rEvF%bU&$JL{A;`Q&yM} z#L~fbX}3!)xa)fBcdmFfYTI3I+VYDT`fR|?U`<(bX&pijO&b-uxU$8)$EUfR9(ZKIH1RHsMGtq-C$qaWxpY;=m46M$K>VB=Y%{xje7I59`0tpZ~b$l8W zIE;&`r$HL)TV7XMmBoek9I!$RN6GHBPWS8kaYWgu5%GNzE#)MlkY9aC_6D^4#Mxz5^>7iO{bW|4Vs zpJmC(>Ifs#qJ)=Y-MNK13_X99A|88pq;3meFNHXWUe0!W8reX2`Vu^RViH2q?9g)b z@!v?@-xP&Ax-G#aQYJS`rZ`|QjB9I!au8{j3Je``ywnSgnyFOAVFD1>iID9qjEMK} zmLAidy=YA)B>&8oh0oxe)o|(vI7Te4Pc`Xfw)Nq{-MP0LR_w6ZaQpQ6>fLoFeC5OF zTp+UI)SzV!K{vWe5(YItC+4wB6dfS`=J0Agow~ai_r*^yXK^jSP z&Xy16iU&HH$^txm-MrTAr|CY@ychQF3PEUiD8eb?Bu_tmltj@yOOzj`QJ$&<2tw+X zIexe!$o?Ex92wuTGG+8;5aukq(UTXF8l|&p!?1H$&_3&q6d|Srmkuky<3+|i0nP09 z&X#YlzHMLyhh04Jt!x_nQ5>|N@+Ii-<{;Q}Ww`lRdCL{gY&rE^AjfW_E`%T9L-#K)eoX%0%6 z5aPA1WfFWJV)&HhC9VzeW7pb*qUecPT1I6%^r{kTSIItf-*igt-N)>~U(!r@e?`5_ zaZkGw@B4w0S3xoAs2*PLah{^;^42`OOuu5I#(RG=Uye9fr}^#^2LmrdZQUEo+2_3L zLu*dNKPr+uZ5?{C=n4;w?=M@;aiVQvW?ZQiLkPYtS;Ld2obs}Q%1f5jE`~F~+rbi} z&p514mWH0kEG9r`LP4yMN|d&BTh-y`Rw}S6`l18s+uO*pe6!*N!T}>7E{IJf)QS)( zY@ov Date: Mon, 27 Dec 2021 19:08:05 +0100 Subject: [PATCH 307/605] 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 zcmbVMc|6oxA3n1+jCGii!L894%UGHjTeR517$)YYkd|vVLn8C)RZRcPI z5C{Zd!9Otl48^kD!w&#}!vQn^fCP|20Dy)O+{rb-yg4j&A0Y>jvkU-)2>Dqo36FCS zDgg7H4@3yn1ze8M2B_IM+#(pWe0g{*MlfeF0mh9;#W@bVTOxmcFVGEt1G~IKc13It z1g;$Yb!H}XyP4Sb%K)H;=KG!A{O#ce+x^4IMh1okMu16YGRzrFbEYYovBI2gW==N- zKqD?^UK27k?$iR#PFgm%H|#1&>pMnR0+0>>7TyX?XEN#OsCli(+;sE;t`Z==a}Y=r zd>8-+^I-?bW+8H6{kuZcLcB|eUci3{F$;n8btGR zXE5?_Z6eeU7(K5OMH6A>;wmtI(GMJnAMg(zMYtd0LEQKv&;CDas^ydnkylBiKtOP6?Ce*-B8i7I~(I^ZC4L^Fs{+Z-P z<1q^A468+oTyN~MPy#bna9V<5ec>7rYJaO?=o1zviBnpvOj4n0YH91xjEqf8SD2aG zthKeXXF0H4*Kcrh_t@y^>*pU3$m0j?3Xj+wxo2-w{Gr1MiAl*R!i>zU?4!qy=M)r* zii%50%g$6)i)$`ks;#?x{YGO`^UYf=tsM_KA9g+J?&*E@ynkTu#mk{r!|(ojKmK82 z^5dte8DDUgez&#Y>_2?rVP8lz8imHr_(C8f;flheG3ty(3RYaKcc|hrW~>CkT5$Tp zHA#vg^p@xo){axsFnUIPH)Czq*?(s&?*DSOVC-*Sy+9fTryd@K2NvK_?`q6SRL9i^ zFRcq|??hd3!H&ta#hbCZW3-Bx$h12`H{ZGhxpk5R{gh2|4yvPX zR58yG=!j-#qUsiwR@MQR(_O|>g3iybm7P{^4y;8D1_o?t^xJope`L>Vbkoi|$+af* zHJP8-Ts^H^)@~H`=lfFN)~<^|wL-LgDfG9;GLrTuwXx zrc<`9_1Ps?w4OVoUOJ1Hd@{Fy7!Qs(MkuS4=emU8ogLjJTGul(TEKqSXI#ZePh zr-U(`U+jX=VC{10+yk4xTnV$FZS=k5AjSHq_k7*eCbyz3X`A+ZsgxJAcs*&}YozMZ zetA`DYd_ZLoLXad6X6h*01}G`?JQxos8Kr~DU3b-=5S|4Po9=so>hk^Z}O<}Q*Fyg z`Yj9ggR=dJy$5ew#m97GFZ9>QzYqFMI+1;C^{xzu*jyXOVDZ87RC@kFrEf3JwMsJ$ zWfBisFq+q7_Ux#94PJ+Q?insRs8SOez6s@T(rosO|qn2W_ zmltkpyIl7LOuEb!sVk2N6#=SmFcw^U@zN@vubERRYg!N1Yfr?EcuzrG>rNs^#q-Dp}`tKu?aDUj!{=F0rFk`LGuuP~aJDdi##O z`PJmCc|4dOSK zvrDiRrrUK4403cD9Td$T*Y?*K%WUi3HRQO1(kiO=HyaA_Ox9gVICUR_l$T_>Dry!~ zYn&~U`*`%;&9^H11}aWuJxyv^n&sIOC7kqM<*3&+M5Rfqp6GkGVc+Z65dCZE*{Ph^ zXuMzxo*U(n@W;R-xt){SN}D#U_wCDx7IpMpKSI$OYuOex08K(R53}p*X^X$q=p{&hYlrwfnW9D$bt0rEvF%bU&$JL{A;`Q&yM} z#L~fbX}3!)xa)fBcdmFfYTI3I+VYDT`fR|?U`<(bX&pijO&b-uxU$8)$EUfR9(ZKIH1RHsMGtq-C$qaWxpY;=m46M$K>VB=Y%{xje7I59`0tpZ~b$l8W zIE;&`r$HL)TV7XMmBoek9I!$RN6GHBPWS8kaYWgu5%GNzE#)MlkY9aC_6D^4#Mxz5^>7iO{bW|4Vs zpJmC(>Ifs#qJ)=Y-MNK13_X99A|88pq;3meFNHXWUe0!W8reX2`Vu^RViH2q?9g)b z@!v?@-xP&Ax-G#aQYJS`rZ`|QjB9I!au8{j3Je``ywnSgnyFOAVFD1>iID9qjEMK} zmLAidy=YA)B>&8oh0oxe)o|(vI7Te4Pc`Xfw)Nq{-MP0LR_w6ZaQpQ6>fLoFeC5OF zTp+UI)SzV!K{vWe5(YItC+4wB6dfS`=J0Agow~ai_r*^yXK^jSP z&Xy16iU&HH$^txm-MrTAr|CY@ychQF3PEUiD8eb?Bu_tmltj@yOOzj`QJ$&<2tw+X zIexe!$o?Ex92wuTGG+8;5aukq(UTXF8l|&p!?1H$&_3&q6d|Srmkuky<3+|i0nP09 z&X#YlzHMLyhh04Jt!x_nQ5>|N@+Ii-<{;Q}Ww`lRdCL{gY&rE^AjfW_E`%T9L-#K)eoX%0%6 z5aPA1WfFWJV)&HhC9VzeW7pb*qUecPT1I6%^r{kTSIItf-*igt-N)>~U(!r@e?`5_ zaZkGw@B4w0S3xoAs2*PLah{^;^42`OOuu5I#(RG=Uye9fr}^#^2LmrdZQUEo+2_3L zLu*dNKPr+uZ5?{C=n4;w?=M@;aiVQvW?ZQiLkPYtS;Ld2obs}Q%1f5jE`~F~+rbi} z&p514mWH0kEG9r`LP4yMN|d&BTh-y`Rw}S6`l18s+uO*pe6!*N!T}>7E{IJf)QS)( zY@ov Date: Mon, 27 Dec 2021 21:08:27 +0000 Subject: [PATCH 308/605] 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 309/605] 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 310/605] 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 311/605] 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 312/605] 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 313/605] 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 314/605] 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 315/605] 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 316/605] 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 317/605] 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 318/605] 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 319/605] 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 320/605] 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 321/605] 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 zcmV;q5=QN$CB7w)F@JbTL_t(|UhQ33mg67{oZSD=Juluuu$B^t%~Ai%bQ>^8MNx>w zuYdpk{r%H^{{H^`dmSm`-`!#>*@(tic z8?ziUb^-6(wE%$M#_Lrd$M@U;9N=9`9zb9K0KBN*zX9C35q}U9Xj(0vhXpN5K4LkTKuu$Noz@DeeLClqtz83}gmpx~Q1GmzSeVl*S zy(vg*J7t$P2n?JvE621s_&A0>|4x;Yj|AGt@UHeS27g9}T`Oayy|at+iHX~C06vC) ziGfc>O_?-Jk1}w|%qNI*P;v2Sev7+7M?Eqk^Y zrZMpG$}jC544il-0F2N7b0+*6#WHXQ10U9*SgBSoBJyF=O-?acw7ySgU`vz&(ZERb z;fm_aw0{=@1%$>enmkznz`fd#4*!S-rlrm&ih(jT7jonBb3PxYflOCML|d1%0cG9~By2@Q(s; zNqdF>m^c%OFzy8&Vk;)HEG%^nY0G8m_s0TQ+E8O*^_sp~3*cUDkXF*PEsop-P?HDR z#7>G6KN7$a%Z^}RZXv=lf$Rlft&?gSb$_({EuTMzfmZ;q#{9Fjp(XIV%6?1~VkYO8 zu&);G8!?J_fvjaYkBCBO&efiK8@N{cQqh;zZJ@L+ax6$%k)swXH0`VHeaLlWZkuszNPUN6wDl4>=I;2g@ zGcW>9Bn@ILDNRfEZ4TfAq0+%k%Su`>aDtSY(9=h|eec_~#A2xl6$Ru{_C>+jvJ+Yu z7&%p(E<#8eSWAbH%HtRqX>^(<2Y+)35Np_%0&r~`tof16=2iyIwX${uU)s_swdZjf z*y_Ai0M zaOP!{Ffg|v2f1bnZ9_0{)c?4?F=h?Rsi)(Kc?hiuykzcp~_GBLvBTJ*wj zf^73jXyDEO)-?5yQ6$sAwSRjdG-gE@A9YJGFls3#ot1&71aNXD?hQWfG_ba74GFbT z41Dw-@iPaUn}UG@z}t#0^|8y?4_pb3$llKawei?~HT`~*9|No3lNr^-c<+-fFx8>X zCmTB2*2V$>;5K$$s#NJ_o^*m``Mz6zAs;%yvl=b{Y_-?}(`#E9(SPUzcUF#yG9cGR zA*K!hBUXBN8su&?%UL+&ZZxgape7#%U}+Qh`HZ@mhP$m1jju{8TBWO9wPhmjrEG#a zSxYB@sRWGL**GrFtksix{`%X))-FFULnLAZfRT6RhR~LNYs*AVbEIjs`jj{lVPMOR z>>B93zJW|kKr2yQf|m#;Lq;0VBiBCh%TmP@0JNpKC?%n0ow4)l_^Pxv`i`5uo?ru8JChB zp@9#pcmp^c&QDNTIz*noL{|?3a6}yS7P9Z z0|T+)8i&?`jenk`eAa_F$spBvD1ZS5MsB5~Zs^fIp#|~-tKNPp3PBC?)^HXI-jWDI zIwEM3MNN-eo+B%9$X*D`?UrtPA%1Bkjsg`2Y74`ov0F5q)Jd$m904-5+f18)QH)#* za-^;|iT8^uaXHf=l7cg?W#T18S0wi3I$nvx$#l&mp* z3kjitWaj5nGH|X-PXkI{uGEHLu1t#MQ-^7QkrqIZ#StV;YY8zkK()FJXJD;@p3gO~ z7q+A)o~k04GuG$}@5vXPvf1p>fQdS z`+r8Ghr}r7Dn^bpono}3KABmwLr3&$B%gf zytQtL{HO(v?UVst)L@ZrE(`1cb`tu*ymLAC7i#m`j$=6OphRZHzhKm8V?PV*XX1i^ z`&m5RSGrxZ9;l))RUd7UVLp+1E`jIDhB3e0E9YS;P)1Obpz!HEpr+W^)T1P4c9M{20%X>OFk@ii=z+7BdTJ1s_Tbf1#7|Q%B z0QgTTg!?7@WkNiRke#b4^8`-dwjI*`8U(VE-SA^djh~Mth!K{pJD$1 z>oqZ}i$?U)!~x)iz&5I?sejDKzeZ$Xw)*>H(levfsT1B@R0=>=sGd57ZZ19U@l-UtwvGLs4bZ(JZcvL z(1itUc{pXPw0>y$GeCZ;>%P>cuC(n}^b(&fPV%3f$D?gs8Q2QacYg!(qeVF&xH8YY zB}PJ*cGGm)xxTbMX!#{|*YYG-+%egialIEix-u}gr$F1JgX|;F?wZgXOR=MN299HV zt)1F)OI=%}{fauI%n2~?PQVER7v#6JX$S*zz(^aff%?{6$!Y0H^A|9?!pvH|GwU*%%Q;~1Fg1Xe(6fRor7dB3InQowrVeZ}Gmvt-Gq48YQVEeawidiO`*N}e?Qruk zu=8#+CYqo#_T&OU`-3Aps5L?l^R3TaM?}qc}JA$tF^ng2EHvLpCPX-6h@KF z%|@@6sDHhEaU-gpUn$}oNwJeBfNKHr$S6cX{P)_JbE1e?9%fheIEJp26H_qoYyj36 zGi3p5r=)asZ3nAmx!VMbSftqALG5ukUcN;$5|Cc)1b_EXl(wO(2DUm|8m5tFmNZsS za%F1()t;9+(wdKrIta{sW8nM5G*T0&$?>h zT}FKyfPagRYTFZg09fj1l03=V_?h$U9aVc?>P&0Cd?oDk%ti8*M(PkZpBJqY`=f=kK->>D0l%9#)*V41YG-U^t19AEm!*;_t)l76z_0U3U#! zTj9uGZh@QTJ-0##iwwnY%T8kCyWDD{57)fnJ*OzHWMo{%0$kjcj|V5$N`ad90@Zs_ zLybn%?E?+~F9SWlidwZNd&1aMrMtW^Wmgi%%{-pgoVcu-)5l!1Zi^Pg0ZuInQfsmR zaDS}@7tEjUMmw8O6ZgHF;eggDKaM?<6+0(MOLqgX6uhVQ2T(@U7B}8`ye0=yoEBM# zpwf8Nt)|Z)+7#XMKuyfF@@wi&<$WB0JwU7hwD!5T6HCjZWJPINS3Y7o^<#}^Ki?|z2wq#44gZeV=t*A)Nb_A0ITWS6#=Yi*V5;3 zM<`6#eI-s~;1s~fL<*4=wQL{(GPS!VIc8_zbmDx4$TCfvZ{YFVm{Wq`sTp{70DtFk z(5C?Slw%f+Yh5HM0V^4Wm`wwhGH|Pj5>+lLF>0CL%gIkJXL$xDdu7c<14)5sr_ccX zWB`qB+f*7j9g=U$l-VMM7K`;TtR!L5@&mvg)-Ee!DhB32i$omCnvdn8-fso)D2<4< zaNShXGVp2AoR!m=vNo&NfQPzGV}DrmxmI7aK9TNYfk!iNDS%NxYEg&$c>vhI>jeW7 zHq{m)N&y}KZUNxG_oDW3E~D~aWb%*b*?jho3`0^w(5;b zjmChv8rJ3?*YdUA+&v1hmU*JKvs)k-cy}uC2tdj-4j@5gD*o)Dl9G{W#sdl{G3lSjp zlT%Lx%}nhgFE$Af2Z(0^sWKE`5O3!3icYLzjHu^&as|FxD!{y+b3H<%vv=zM-#ovW 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 322/605] 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 323/605] 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 324/605] 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 325/605] 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 326/605] 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 327/605] 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 328/605] 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 329/605] 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 330/605] 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 331/605] 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 332/605] 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 333/605] 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 334/605] 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 335/605] 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 336/605] 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 337/605] 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 338/605] 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 339/605] 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 340/605] 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 341/605] 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 342/605] 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 343/605] 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 344/605] 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 345/605] 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 346/605] 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 347/605] 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 348/605] 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 349/605] 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 350/605] 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 351/605] 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 352/605] 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 353/605] 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 354/605] 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 355/605] 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 356/605] 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 357/605] 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 358/605] 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 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 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 359/605] 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 360/605] 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 361/605] 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 362/605] 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 363/605] 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 364/605] 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 365/605] 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 366/605] 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 367/605] 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 368/605] 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 369/605] 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 370/605] 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 371/605] 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 372/605] 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 373/605] 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 374/605] 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 375/605] 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 376/605] 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 377/605] 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 378/605] 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 379/605] 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 380/605] 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 381/605] 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 382/605] 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 383/605] 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 384/605] 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 385/605] 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 386/605] 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 387/605] 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 388/605] 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 389/605] 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 390/605] 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 391/605] 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 392/605] 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 393/605] 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 394/605] 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 395/605] 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 zcmbuC_fykL7skH{31X0ZOH9M?fT)03is{RS*=U2E0H(id--hDNBR(4AYPFZhdc%TJL`N_nP~+o0!A3xs!$J8RzV>E*vF^Es#aQ7KUaTb=Z z<94aJ+LJsK?QWU1Rj0at5um|L%8^$Awl7bSI%qtMY^sO`#>yLN)VlGYsmW}@Y(s&5 z%25^$2}!&+@K;q0s>N%RfJ%Y~ae*8Uwge4U&j{PGOz@#PDhZNFwTvxZ{ODzHdpD`R z9-S%u7$b4+>yR>K8i>u~47SHTZyESqU1$BW4#ndobz)+|E-D}Js|b>+-!JGnGr^I9 z`qFvidjfxYkth{V9V5CHg{OL_%m~mY4>isxdCS(Y&d?)Y8a(xf?r5P`22!Rgd#)?5 zc3)dAEPA|AHf5sMnK$PX?{SC@QwykCM_rGMx!&`lCu3mLC7~1YJd+8A9Tx3PF0hbQ63o zGXG3rxEsKQFrOX)eUR!;G*81NO6;3Vl&a=RLE{AZ=_WEss^xe9 zdrb$%t9TBdiV%1H7uLWKL5W-XfNYFrb2S(oJino!U5p2eU|wNfY-R`NZTw6?phUsJ zok2F`B|}B57htfcV)0su(1`gpn60mADnsH7B~)vrZYL^?#1as)!r2Y zSW#Ty*{$F%?!Qmoe`3ZxfT2u(sb)$Hd|4yFzAcQa?|-lbmZLDC_F_I(_TXpVw*XoF zfjR?a&k%KbMSBM3ywiZTV45aBz1TW23plbd1w`7qtGUn!tdP=_R{p)nd34kZR2f@t z11KJh?y;}IaQ%n2I z1h}=Wug&3nK6&zlk(J^OrE+@NN@f-I^tsCTX^XJ7#*4oc@uu*mP~0H=o*Z5=YtIOM zo_OEF=>4OWb!vFwu-nh%GMR+OZW6ni_AIP4G0Sn7FPYHpm{#AxklB^;Kv^hzKj6$X zt@16_CxXG+=3cueZS;Y-&N5RfTYI!wmlc6sMxrdUOYlJNEldQ0U6!fx9#nxs{D_0U z1PbXjK*f%=&ILnm%MXP!-&c%$;2~Q>vKyyekrO)MMv)MSf`-|>(SvjOhR$!QwIfGs zu!-s%Ykjo?Bc3yhx_aR){gNmBe3sGqT%}iI7VKs7T>#n2e(f`cK&=2)Sv+GiahXdl zotoCZ#Oc(UJ~P}6TikeVi*Jw_&nOF{VNMbi6fNJTYl63Q0OnL0ui{L z($2eU!7*Zv1o?7|*akt;pcV|_T?^2NEfUntu~>dRIzDFbZd_O_$0EECm;sXeC0pG< zX|x-CLwzeU>Dh+j=TKFU$FO{RC)K+bOS=t6R!dDcmsS!uHkk+5x;V>q`V_*T4M;HtR$&!gl`+58#yb@^np zKbjg=7~$u3b0)i6i?~L5y`PZ%3grH$%2~x1|BVGaz?*89=FV;t)O2D#KN}GODO;0m zd^si62Y)C~;B;l(+kAibBhtukpN=#P^c&}RN=);Fw-LzFV%r;68;(#1o>}~Rl3>;Yzr2Ln4N?eD{Mcw)n zWG`y;vfklbDIhxsQ5$=rH)Vst%uE*@`s|wEQ%#DT`St3-&XmTZjNO=^azEtUkqJI4 zgDF$#GX<{0_Si+WOxk~LuHDM_c+^fyMG$K>0s+ZU37StKuYWgZt*2Kd&ASNZs1W;y z(LZJ2_uxpODrUZ@r`^DHB-b^`fBI{NWRmUY79gyB(;Q$qlH_H2Go46$3SX026Z|LQ z8rg0+HH~W5ITVWP3Sj*@g$uvy@+Evapw4t7S3Wjr{wqsp=>Jy!9Ny6FOEH>l1u7-e@<PNt>ZR4i*~OST-?qO zZm(y6wPk8mGD%K|PKWxp^Qdr*6pu}(X?YW|th;nKU-BKRVRDTeu{IE&Wo+oXDhBlK z;aG0ISpS@|@yoy@2i#yOsRyyqyC9~Ge)ULF-rHWCE?hYbO9UgQRv`YvSGeWPL)YmK;NFhoN`tdZ7PVZI;@zC&{alIj`Dj&s8uqNA~&0F%1&klo|E7%}OO+M~=dq+3{{;*}E`kq6p zINv)RKb}7^*2LVTF~UCCs6ir0BZx2<8?;SPn7r7(KPux3((RrRoA=O%nRzYbDnNy>RLG5MaNiI@1w+-~ zOBpU!lgsZ*$R4Rb;})X(erkj^@jN>uiG{P+-EY0~&~5Gch>xp=G-l^UQ=dg*vmkw6 w1)ZvE2?8BdCrZ~~L1A|g`85*%bCz=q^e1c$-l#OKVE Date: Thu, 30 Dec 2021 11:01:31 +0100 Subject: [PATCH 396/605] 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 397/605] 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 398/605] 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 399/605] 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 400/605] 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 401/605] 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 402/605] 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 403/605] 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 404/605] 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 405/605] 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 406/605] 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 407/605] 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 408/605] 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 409/605] 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 410/605] 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 411/605] 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 412/605] Fixed Italian localization I am providing small fixes for the Italian localization. 1. using : to separate hours from minutes, instead of . 2. datePattern: changed to the more usual way of representing dates in Italian. 3. datePattern: fixed so that clocks such as Anton Clock work fine 4. day: removed an extra space before. --- apps/locale/locales.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/locale/locales.js b/apps/locale/locales.js index b607998a0..599ae1491 100644 --- a/apps/locale/locales.js +++ b/apps/locale/locales.js @@ -80,7 +80,7 @@ timePattern / datePattern: %S second (00..60) %p locale's equivalent of either AM or PM; blank if not known %P like %p, but lower case -*/ +*/ var locales = { "en_GB": { // this is default @@ -457,12 +457,12 @@ var locales = { distance: { "0": "m", "1": "km" }, temperature: '°C', ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH.%MM.%SS ", 1: "%HH.%MM" }, // 17.00.00 // 17.00 - datePattern: { 0: "%A %B %d %Y", "1": "%d/%m/%Y" }, // sunnuntai 1. maaliskuuta 2020 // 1.3.2020 + timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 + datePattern: { 0: "%d %b %Y", "1": "%d/%m/%Y" }, // 1 marzo 2020 // 01/03/2020 abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic", month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre", abday: "dom,lun,mar,mer,gio,ven,sab", - day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì, sabato", + day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì,sabato", trans: { yes: "sì", Yes: "Sì", no: "no", No: "No", ok: "ok", on: "on", off: "off" } }, "it_IT": { @@ -475,12 +475,12 @@ var locales = { distance: { "0": "m", "1": "km" }, temperature: '°C', ampm: { 0: "", 1: "" }, - timePattern: { 0: "%HH.%MM.%SS ", 1: "%HH.%MM" }, // 17.00.00 // 17.00 - datePattern: { 0: "%A %B %d %Y", "1": "%d/%m/%Y" }, // sunnuntai 1. maaliskuuta 2020 // 1.3.2020 + timePattern: { 0: "%HH:%MM.%SS ", 1: "%HH:%MM" }, // 17:00.00 // 17:00 + datePattern: { 0: "%d %b %Y", "1": "%d/%m/%Y" }, // 1 marzo 2020 // 01/03/2020 abmonth: "gen,feb,mar,apr,mag,giu,lug,ago,set,ott,nov,dic", month: "gennaio,febbraio,marzo,aprile,maggio,giugno,luglio,agosto,settembre,ottobre,novembre,dicembre", abday: "dom,lun,mar,mer,gio,ven,sab", - day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì, sabato", + day: "domenica,lunedì,martedì,mercoledì,giovedì,venerdì,sabato", trans: { yes: "sì", Yes: "Sì", no: "no", No: "No", ok: "ok", on: "on", off: "off" } }, "wae_CH": { From c6f43446906e873a226a93e766cdcd8999d30a41 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 31 Dec 2021 22:14:24 +0000 Subject: [PATCH 414/605] Pebble: foxed icon to 48x48 --- apps.json | 2 +- apps/pebble/ChangeLog | 1 + apps/pebble/pebble.icon.js | 2 +- apps/pebble/pebble.png | Bin 1213 -> 1365 bytes 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 8a0d86b97..f78098b3a 100644 --- a/apps.json +++ b/apps.json @@ -4725,7 +4725,7 @@ "id": "pebble", "name": "Pebble Clock", "shortName": "Pebble", - "version": "0.06", + "version": "0.07", "description": "A pebble style clock to keep the rebellion going", "dependencies": {"widpedom":"app"}, "readme": "README.md", diff --git a/apps/pebble/ChangeLog b/apps/pebble/ChangeLog index d92be5e9c..0cba5a2b2 100644 --- a/apps/pebble/ChangeLog +++ b/apps/pebble/ChangeLog @@ -4,3 +4,4 @@ 0.04: Fix widget hiding code (fix #1046) 0.05: Fix typo in settings - Purple 0.06: Added dependancy on Pedometer Widget +0.07: Fixed icon and ong file to 48x48 diff --git a/apps/pebble/pebble.icon.js b/apps/pebble/pebble.icon.js index ecd7feb7f..1c1166156 100644 --- a/apps/pebble/pebble.icon.js +++ b/apps/pebble/pebble.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("oFAwgNKiIAIFqofegIf/DAUzAAMyAwUQD60T/4ACD7Q/cPxIf/YCofcDhYiSXYYfuUZgf/D/4f/D6USkUgD/4fuogAID6vtDw/UD6vu6geF73kb6vuEAtN9wfYMIneD7JADDwIfaIAJdBD7YgBHwQfbAAgfkf6Qf/D/4feogAID6oAND/4f/iAdJD/4f/D/4fUDxYABD74iODiAftTZgfnYYczAAMyD7UT/4ACH/S+bD8DAKD9Y=")) +require("heatshrink").decompress(atob("mEw4UA///ssp4XthFCBwUBqoABqAaGBZcFBZdX1W1qgLHrwLKqv/6oLJAAILHioLJn5qBAAYLEBQoLeHQQABv4LjGAgLYq2qAAOlBbBHFBdPAKcQLdWcb7jAAoLcn4LKgEVHQVUBQsAgoLLq//6oLIr2q2oXJBZQvCqALGgILTA=")) diff --git a/apps/pebble/pebble.png b/apps/pebble/pebble.png index 10f5adb56b224f3e4d037c4d195fbd9efc81b959..368e08750d5ede99497d54b310fe9b91e03d9c10 100644 GIT binary patch literal 1365 zcmV-b1*-aqP)Px)4@pEpRA@upn$J%oWf;f5@65Ech+x zv{2{Lr1SoGKJW9q@AEwGGXxf&j*gBFO6h${sg)5nRaJf3O2^bb#OfezZEaUYQ5<26 zhgpeNqlqU<|a5!MM+tXy)-`__( z9#8#$LlA_fU@-V^J`k4nfTAcL1GvSlA&<$o1wnW%7!2OaV+?Bo$g<3Zznss+0AlfY z{JrJnjL8}`p4TwIc*HA2YF(Z&`TV|N3A zz$du?84BR>cxDJ8uUk3qa}k8M36YTEp zVrM5|vZwa&)vv9sO$dJk(C_#AZ`$UZ?XIgKO%tB)k~ zeOsM?$OPbWxe^*+jQ#2LdS5(s4KNT?RZs-3hq1m%@Nml*fG*HbV6|8N+4QG#d;Sbsoppz&lSeLBj3C!9cC9YdJ} zgjOVc_*FUp_XC8G&!(rRuMH0mI|MRySs0P!{IVQ$id*?;AX)$vDvuA$b@u1 zkaUa|#*v-02h4zE(?HQ2+5ZCIsS1i;M#9*O7@ow(6eEcYp%ok6|03NF6iov>l&Ekr zd~>M?YqU0q$(nx@?Wa7n*j z*EFq$Qd)@X_31z$&}T~Wqeg}RnFecZZM`K3LTMB@G65)x@)3aBW^T8$tmZbQ^wp)M zrTe+8cxqcq8c-DFO#r+!bgan7E0wm?91_5}EAq9pv^*zC(r>9{)}f&xw70jXm02ey zCNMfWn!0$4s;a({&*~>qSE~akin0peS-pR@Lign4Bp$&|E$>&@`<(6bhZ)rv|btUl9c1rWOBiEEs&!V)H@V+` XI5?_a++oDw00000NkvXXu0mjfkw}hY literal 1213 zcmV;u1Va0XP)POM$%3@Whhhyn@nYhxDeg-e<-cZ zYFr2k?%buN)IY$D3u)c7&`lO@rMoJkr~#QIf+Nxtsa1-};Ey=&+{^zdH@zOnM{mX zvjtWIh=|(&%XQtCm^E8qH2}cN%z6O8ZE6bK^H45MbUEA#JEV9`wMn*=ov6V^% zySuwkO0~5~DF?#<%d&1sDYbW0Hk-xj>T1XM!^1;VDwVeD28LA&YzBCqmmwl;+y4GO zgb;{C^xd7DoZ$HQ*iU*PlgY#ig+iSt(^m8u_dq(G-UG14rPmA*y;>|5zciuESp-cK zzzd8G0~P~16+jM57D5&SEX%sZrKQ7UAq-RlmX?-oDy4Ra==sOnq?EQ&YLqXv|L}5|Ola!1|954-`%Wb(F@@^;gu`v9KmHh$=b zz?A|0PN3hg)_~-=MDC3mBG9he1EGlU<1aQo_~dDZ%=}?Bz_u0A^B$@-pn9+O6{;nG zYf}<`Kd>0H)5AUs5CP97fT*MJ>ls1HVDZr?Fg>Z@^Z2lhdcFPy5q)~`|M@n#Ym7~U z@i=f}MB(%|LZi#=!uS}FOsYUTu4=XV)%yDS`#mKI!$r`xf!P^_vHy8YA_Oo!r7#)r z!*gJK77zlsHtGN2E=(GYo6bbfrL6?V#{kEEG$bCJKfoG|15-%_#@%gTE_Ep!jRH5W zKPrx~n8GvTm)X0XOWzAv5#aiC_;mso1HT!XnVETOb91x#hsS?5Ha6yc10G}G4G==a z0W_D;`+?$l(-}Oj4Cr?P{buM5U@d|Tm+;LG`eQJ?aQA2PHJY`D-~SMJ@1qG$N#hLt z5V$g+-wE`afj8jn?CfJ9#B)u53qj%sekt5&H16ecxu1HCANV^UEJJTVs3G8Y_SYob z=a51f;5ZH($KlGQF9aO|PtK#9bBHKZPJs*{qGFiNOdzGa6DB^;5D-GVDW%+j=2&bW z4obR2luslQ`(eacDoQGqdX0!a=g{)uPN`Hf^6CuNH258Wo{y_`LBW(Tivi_w`7Z!> zIka>rrJig9&iR&6s|Cxlj2XbW7bpP8>Kf+e=CHQ52Fud_-hX;}itX)f?MqVtJlnQI zRr*e_8K9IZ_^r}bR#vdQyxcMV;NU>}(iDKQsrQ8d-aFu;5Vn2IdwY9OO8KrDkB*Ky zy)$y0J8xG=4+z` b5C9$mizYm;5j?(%00000NkvXXu0mjfggZkP From 0516b13669b272d9e48169e17b996e05ad4a85ec Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 31 Dec 2021 22:29:02 +0000 Subject: [PATCH 415/605] Rebble: fixed icon to 48x48 --- apps.json | 2 +- apps/rebble/ChangeLog | 1 + apps/rebble/README.md | 1 + apps/rebble/rebble.icon.js | 2 +- apps/rebble/rebble.png | Bin 4570 -> 4067 bytes 5 files changed, 4 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index f78098b3a..e4f280a0b 100644 --- a/apps.json +++ b/apps.json @@ -4879,7 +4879,7 @@ "id": "rebble", "name": "Rebble Clock", "shortName": "Rebble", - "version": "0.03", + "version": "0.04", "description": "A Pebble style clock, with configurable background, three sidebars including steps, day, date, sunrise, sunset, long live the rebellion", "readme": "README.md", "icon": "rebble.png", diff --git a/apps/rebble/ChangeLog b/apps/rebble/ChangeLog index 16e65d4f9..b9c26b4e3 100644 --- a/apps/rebble/ChangeLog +++ b/apps/rebble/ChangeLog @@ -1,3 +1,4 @@ 0.01: First release 0.02: Fix typo to Purple 0.03: Added dependancy on Pedometer Widget +0.04: Fixed icon and png to 48x48 pixels diff --git a/apps/rebble/README.md b/apps/rebble/README.md index 712fa4e9b..0ecb51d7a 100644 --- a/apps/rebble/README.md +++ b/apps/rebble/README.md @@ -11,6 +11,7 @@ * Uses pedometer widget to get latest step count * Dependant apps are installed when Rebble installs * Uses the whole screen, widgets are made invisible but still run in the background +* The icon is James Dean - 'Rebel Without a Cause' ![](screenshot_rebble.png) ![](screenshot_rebble2.png) diff --git a/apps/rebble/rebble.icon.js b/apps/rebble/rebble.icon.js index 4c898974e..3fc45b820 100644 --- a/apps/rebble/rebble.icon.js +++ b/apps/rebble/rebble.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("oFA4X/AAIHBw3Aiv3HmE/HQQAF/gPEnWqAAOpy2VqoFB3gPIBoIABtQPJ1PVqv1q3qB5OlrNVEIQPK2tlBwOptQPIyvdH4VtrQPI3tbqtdB4OaB5FVH4NV0pgBB5F13//MIIPJ1O2TgWV/o/I1fbB4WpqoPI1NvB4REBJ5APD/wPBD5JOBB4WVqwPH0oPE0oPJ/NX//6AoNVF5HZq3pq2qSYIPI6tX+pNBB5Ol6v6B4IABH5P7//b1oPBN5GlLwPr9IPK1IPC/SvK1QPCOAIPL6te//5B5lW/5ABL5APB/wPB3IPJ1Y/C/yuBF5APC9X+yo/K34LB3QPBtQPJ//23SPB1QPI3eVs2qJwIPJ1flqyeBtQPJtZPBLwIPKzf/1ROCB5OWAQJOBB5QsBAAQGBf5FlB5tVvoPMNQO9B4daB5O+B4aPIqtX35tBB5M1qtbB4i/HB4WvOAjvGB4IpBIQIADB46aBB4t8B49VB54AFB6zrB1Wm1RTBywPI0oPCeQOaB4+ltOlq2V02VqwPOrQPIF5w/PFQIvPB71pH4uqX8g")) +require("heatshrink").decompress(atob("mEw4X/AoOG4EV+/I+dVAAVUCgcFBIYABpIJBgcFoIKEqkQgEH6EH0ILEqAhCgkBqEVBYdAhUBBoU9GAlAlw5CgERgILDIocEgEGoALDlEHwEAlkUg8EBYfAFwVA+BgEqmQjWrBgMQhgvDqmA9Wq1WsNoMALweDBQIAB4E8BYdTpwLD/kA4AXDjwKC1f/IAILDnQLC1//4ALEHQQLCKgILDFwYLB6EATgVABYe///MNgdA3kQEoILGqCNBlfQh//4NAPAVQ+YLBQYM/ocABYfAiEqgE0g6DBF4eAlFrYQZHDoOu1Xo8lgBYtCKIOo9aOBAAJrCBYWv9X/+gXEqSZC/f//4LHz/6DQIjEBYOhgG6BY1a1WggDCB3ojErYTBoEOa4QLF1X9jWrXwILGKYOvBYtfKYX+17iBHYdX1WQgf/34LBUwQLB1cLWIJqCBYdV9W+1+//oLBWQVVqnuD4M/KQoAB/+kBYJGBCwYLCI4P/DQILFnwLCEQ1Vp+q/46CBYtDXgJ1FAAVwfI4ABqAUCBY8A9gLIqEA9ALEKYYLB9YLERwQ=")) diff --git a/apps/rebble/rebble.png b/apps/rebble/rebble.png index 69653015cfec75e34382125a56c258c7e9074f5b..acfd37400804494014976eea6bf456b1bdc2fcf6 100644 GIT binary patch literal 4067 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 Voil!`qIv)T002ovPDHLkV1j)J*pL7K literal 4570 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 Date: Fri, 31 Dec 2021 22:52:28 +0000 Subject: [PATCH 416/605] GPStouch: enhanced icon image, it was a but wishy washy --- apps.json | 2 +- apps/gpstouch/Changelog | 1 + apps/gpstouch/gpstouch.icon.js | 2 +- apps/gpstouch/gpstouch.png | Bin 1571 -> 1443 bytes 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index e4f280a0b..b4364166e 100644 --- a/apps.json +++ b/apps.json @@ -4382,7 +4382,7 @@ { "id": "gpstouch", "name": "GPS Touch", - "version": "0.01", + "version": "0.02", "description": "A touch based GPS watch, shows OS map reference", "icon": "gpstouch.png", "screenshots": [{"url":"screenshot4.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"},{"url":"screenshot1.png"}], diff --git a/apps/gpstouch/Changelog b/apps/gpstouch/Changelog index 7f837e50e..e4a0bdfe8 100644 --- a/apps/gpstouch/Changelog +++ b/apps/gpstouch/Changelog @@ -1 +1,2 @@ 0.01: First version +0.02: Enchanced contrast of icon image diff --git a/apps/gpstouch/gpstouch.icon.js b/apps/gpstouch/gpstouch.icon.js index c4cf85676..3e05da0ff 100644 --- a/apps/gpstouch/gpstouch.icon.js +++ b/apps/gpstouch/gpstouch.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEw4UA///j+EAYO/uYDB//wCYcPBA4AFh/ABZMDBbkX6gLIgtX6tQBY9VBYNVBY0BBYdABYsFqoACEgQLDitVtWpqtUBYtVq2q1WVGAQLErQLB0oLFHQNqBYIkBHgMDIwYKBAAJIDIweqz/2BYJtDBYI6Bv/9HgILHYwILGh4gBBYWfbooLF6AjPBYW//wLGL4Wv/RfGNZaDIBYibEBYizIBYjLDBYzXBd4TXCBZ60BBYRqEBZpUBBYRSFJAQLCA4b7BHgQLFgYLGIwYLEgoLBHQYLEgILBHQYLEgALBAoYLFi/UBZMHBZUD6ALKApQAFBbHwBZMP/4ABBwgIDA=")) +require("heatshrink").decompress(atob("mEw4UA///iADCn+EqoAWqAuJgoLcn/8BZENGwNwBY/VBYNXBY0DJ4fABYoiCEggLDmtX1Wq6tcBYvVrQLB0owCBYdVtQLB1NVBYg6BBQIABHgQLCgIuCGAVABYcNqwtBGIOVJAILFyoCCBY5eBBdo7IgIIB1t6BYJfENZaDB9QKB1aDFBYKbEBYizBrwLB2qnFdwSmCX401cYdUBZTjGfYgHCBZB2BBYhUBAARSBBYhICAAIGCBYkVBQJSCBYpICIwQLFHgQ6CBYo8CHQQLFHgQFDBYsVQIQLHgo6DBY0BHQYLGgY6DBYwAFBbCjDACY")) diff --git a/apps/gpstouch/gpstouch.png b/apps/gpstouch/gpstouch.png index c411356ae69347a83882fe195782df211aa629e9..a40419a3f15ca9a07e80397db537ca307fba02a1 100644 GIT binary patch delta 1425 zcmV;C1#bGI45JH>B!3BTNLh0L01m_e01m_fl`9S#000G5Nkl93g^E$p2PSi7 zxZt%9rL|&hEGG71Olz$eL1GIPvv^sXozsUg>dwq&XJ$8*^nZgu=0E@C`M(OF%@B{P98T4;p&=mZhtW(#d98x}3iK?pH7q# ziN@0iCNxwpdnsoQr&`(IWfG6K8YWE0e7<`xg@2ZlXRL0IaOlJt+`FI3uuYuku2wd< z7SPkvJJV__D$0ER<9at*_N24sXxZJ1D_!0F<^X_XvbW4FFV_MB0lJsVCm6_`t|$<2 zQ|qofRvrWlA0GJ4YP)|w^LfhTQdF-Wnl(qw`k|OIxwPLL05EJ=;Idm@Ugp5BR>QSx znSakk!64SYxiD*jwW}8)7|eVFSFbv{4v2s@tKs5ByVI-lXXDiOE3jtc$Vaw!J{*Z} zTi?JdFWA@2jt+YcB6mwD;9(inG@P>9E?ok;yMb}zGVL!u{~Q*~E5o);w*Ua+o*A97 z{`cYLO`x;WUdu3W)-^A;j-e1;V3rv#JbxV4kw^fkl--|*P&#%DO2>|IB>&(6kVu$0 zo&>Y}(=gClZ~+f-$ZDvs*U{YUEFv3HDd6BiVBI?VjugOQce_y&UIpxCmbT=zwL13g z1Fm1souI1=*t-{~t8*j|rO@bwkf%ev5OgILQzrl{v5wW(n}nL0B&JUXCQUN8&VPV; z2I%TC=S*#_GjRZ5mOltV=e=<9b1Na4Wu*|h;|AL4pyB~>uK}LV#E}S{2XM@5TrM!n z^WiX#c#ZRQs86Ty0kiZlZF55@Z1i(S*i9*#a zXp1Qvro&3%y=>$0xD-Orr-iIp@E%ztLVMzIDXey8`B6Abp7%N~5LE-w>}FP*`*O$Q z>Jz0@f!nxd?z~z|xv*)|KPQP0*txUFSM#EOn7j+xrLB!32COGiWi{{a60|De66lK=n(*hxe|RA_7!JOvVz*38;=4<&H5LVRE7i!wE@)hpWulvKu;xEMTMGS7!-*xS1GdF+PWqH zWMt@9fSV%xV1F1K_Il;lRORe<0ZJ+H`*{N>Hw-36Y&~rc-Ex6krC2C}-|tuTfY zVCqyDJ^B&7QgHJoT)YT%bjfX}Bi;4>gAwr#=$ShEJ^ z&+ifc2qKV^0}B>FX(_l8KlPc0!QSp1reV!lVdR3nB_eoZ?JgHAUL5(C%|Zm0EP?Uk6E^$IaA>H@AVJe<0|Aw< z6v5s$U5Anq7&FDfA%F)r$N#l)Xawm>^ zXn%7$Ar$JQz5S7&rb(_@U8W0gIOKs+40J3k*K$|rpbM?x=a@^WQd~y znBCjf-X6IVJ#dZ7CL?_?ZT}?BpP4=w*SPE`TYEdCrRk)lMVYUd)n%m*T#hwdzaD+< z)OA+9xiBfgsuhdS_2@fr?OHL`;oEdC*?{%IT{%Cw1@$^tOu3pZ| z&rgr@zj!g8L&V$=3KkwAP2;3tMBD1?p}84Gjf%FvIC~m%XXVn|atDA>BZftd|2?>M z3oa#?0~iKpOzSf1SXLuwwDL8ZpLZNtn5g~izaI!}ZPbj{lBND6P*JFPg27hPG z>aw~XsE#$NAj*U#60ovLk!t3iJ#Xbf>k4G$RS=!l^ z*b2NtlHwa1BR_!F*2r5qGt+dMfPYmnme<5yubcypSdBA*b8a_>tp?dz)Q7`-09fd@ zeM2eM+u0+sRe;YYe<;Prc4CuYpVuq#b8Qo_y)TrNg%?t?&EBGEyl*$yb^+_wNl4Rp z7wE9d(T&w*Wpc}IuvSo787wNV7k4FyJ2`nnvzNDbEGJmLvBHutJ z*;O!U65B=i)@qzmTuMu0z1_S9GD#Hq{XQQkE|zdt7t4W03t@M3ou!*LNn3yOr{sXc z=aauQjb*?+6YgQd;O#A2q#+f#Q+7gARwloR@D32}!*%V}t#T|?c~g4C?hRGq%ec01E&B07*qoM6N<$ Ef*6AFy8r+H From 9f1e978822d5f4321ba9414114de89993f987b99 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Fri, 31 Dec 2021 23:02:01 +0000 Subject: [PATCH 417/605] MyLocation: enhanced icon image, it was a but wishy washy --- apps.json | 2 +- apps/mylocation/ChangeLog | 1 + apps/mylocation/mylocation.icon.js | 2 +- apps/mylocation/mylocation.png | Bin 1909 -> 1664 bytes 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index b4364166e..427b86fbb 100644 --- a/apps.json +++ b/apps.json @@ -4708,7 +4708,7 @@ "icon": "mylocation.png", "type": "app", "screenshots": [{"url":"screenshot_1.png"}], - "version":"0.01", + "version":"0.02", "description": "Sets and stores the lat and long of your preferred City or it can be set from the GPS. mylocation.json can be used by other apps that need your main location lat and lon. See README", "readme": "README.md", "tags": "tool,utility", diff --git a/apps/mylocation/ChangeLog b/apps/mylocation/ChangeLog index 7b83706bf..653f859ae 100644 --- a/apps/mylocation/ChangeLog +++ b/apps/mylocation/ChangeLog @@ -1 +1,2 @@ 0.01: First release +0.02: Enhanced icon, make it bolder diff --git a/apps/mylocation/mylocation.icon.js b/apps/mylocation/mylocation.icon.js index bfb38d5ac..b79f5875f 100644 --- a/apps/mylocation/mylocation.icon.js +++ b/apps/mylocation/mylocation.icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEw4UA///t/7j/P3/vB4cBqtVoAbHBQIABBQ0FBYdQBYsVBYdUERIkGHIQADHoguEGAwuEGAwKFBZg8DHQw8EBYNf/1Vq3/8oLDIwNf/Wpv//0oLG9Wq3/qBYJUCBYuqBaBqBBYW+BepHEBbybCBYP+BYSnErYLDyoLFAANq/r8Ga5T7MBZZUBAAhSCfhA6DBZhIGBQg8FHQg8GHQgwGFwowFBQwwDFwwLMlS7Bqta1AKEn2q1K1C1WgBYf/1WqBYIDB1QKCgYLC0taBYoXB/QICBY0//7vBAAQ8EEgIABCwwME9QVEA")) +require("heatshrink").decompress(atob("mEw4UA///gH4AYPO/QPDgNVqtADY/1BYNfBQ0PBQIAB+ALFmoLDrgLF6oLDq4KEgYKDBYPABYcNBYlVuAuIGAwuEAANUBYYKFHgg6Bq4ZCr4DBHgQLBvWq2te1WlBYZGBBYOr1Wq1qSDBYNqBIILDKgQLLgoLHqBqDBfJHLBZBrOgKPCBYiPCU4NaBYe1WYrABBQLCCfgYGCrwVBa4kAirvKNgIAErgLDKgIAEKQQ8EAAY6DBZhIDIww8GHQg8GHQgwGFwowEFwx5EOog8GHQ0AlWpBYNq1AKFWIILBAYOgBYbICytWAgQKCgTgDcwYXGAAgvGAAY8EEgYWGBgoVEA==")) diff --git a/apps/mylocation/mylocation.png b/apps/mylocation/mylocation.png index 7148990a42a1c8858d933d2a4cb35b80123a5505..038ee177e660e3bf643c74bbaa5f549b382fd5f8 100644 GIT binary patch delta 1647 zcmV-#29Wvn4uB1iB!3BTNLh0L01m_e01m_fl`9S#000IuNkl@VZEXpa*ivG=AYh3x2EhdI$|X`njXdCkmyi%brALOq-o4Du%-;ukg_-Hj?soenCx4qgm;d>F=bV`{=KxU> zIlo*-0ELuxR;`Lwzbqo?qRLbx3I`Bpdl!!UcuS2d_jwTr)B|3TIi3CCGK6J-oK6mG z#y3ca--H5@54UpwKuw*BA^$9Od*7gnWE(o^wK;w6Z6`!27i>UU1 z{>bE)kn3(Ab^D0AeMFsJjqbU9)N<-FbshYPf(2y{wF#8%BhR@eaw>uPQlOt$97>yu5M8vGXu7?`#+-sO2sI@ScUD(nLvHc=0KT?p&u4w&*^3B8z43-{GN;z(YG>Ds$RCf0gl-s=_{7fH=t?07;}Uz zgC&HH7;{W6#<}&f^$i5Ib5jZvme>`&Tzvy`Q_oB(i&cq|4;?pJ^on#1u+5u;*jaTm z(tmz=j)OfeqKl7V(FJz&sH#_D{59I$S7lUWb9YVLkPH}86L~zHZr3jy4o)3S|Z0PMw9^*^5BW0ODQuz{>%>j=^-y@c}<(xb7nPRtwUuU&T|$ zegL=k3w;hz^1-kDV#sMG5~V{{4j}&0T7T+1R8KelxJG}s2dL?`OdcrauqDl!J!jYC@E1rrbbYakUkuknctT0Ip^Sa*Iz`YGXxt((g!%E1t6W z06<%cQc0Blor0xvgSHgu9$KPrBEMuFiBeA#;rnT8>B5-6kDACUT1}!PM*&_Yv1nyX z;YUs6N*hU(!oPMGC5`eNA5IJWsDBAj+7W?)&!!drs+*E7-I1RkEI-g_6@I9^?%3tq zfkjRCC@~TSOQ(&dcK?&aaXC!GQes#F;Qnq&gsihCk^b@ekm9%x|BCk4R*(PIZXw_= z2K>qM>hTvIPiTvpfhMB3S$*2qc7c7+?bQ;80tUA`M94aG66v3qo9H@JkAGXMa`X=h zW4Z)JwJ&Da8W>}y*GZ;PTtw+KNZ0KGO9cSWpo(6%XF|@5*i}uC~2s$c9vt>sm+8QsS zZROg~;Q@eAP7*JhPN`|Mn}2=5)hTiO37(DhsuIvMq+&3jK_!#MM6mVu0}PNKNwx+) z7NmpcwWVgy#H3MMduWASpd;}D%Y1+jz97LXYw#-sStXE}A!||?@T0~lj>Q>?x6LYs zJS;8l;Bq03-)*-)Zt&hObD1x)u;vlTxeoIqr#MiC7FpK z9V5fKv}q-ZN4NSm&#`5Uv4xC776+v8982UFY>a_p02l)sk~O&c)qVgfz=i{s$=F#a@%Xstf=C002ovPDHLkV1l2V6!8E6 delta 1894 zcmV-s2buVQ4fPI?B!32COGiWi{{a60|De66lK=n*DoI2^RA_AsG@S#b$cuP-3VG$dGK&`PKY(kne zs5N3l1xZZX*iyvOh*i1M%Pza@_3XLLnR%an*kyOm?wr{(=YK4T{U;}9=6x>j|3B}% zGtc{uFh$VRFTVr&05N+hmOTqw5{SsKRq^~hp6S9jhcVu7mJ0i>}op)z!;xQ{&^&`R#GVw zH9WEaeQfJ>B!3g{l8DW&jG%%sfDUzMTOa}57Thk3yHXzC@XsiGA_>sPw%$c!{Y%&( zSKW0XlOOtbi^Jr{bs4iE9)o1v(9g1lOup}vDcmDZtoy^13(!>CeN1cEGdeNH8WqwR z7|cM?t2E^>1A)2(v@}612F57u9m{3=Q->=GuZaBPPk*nZq3#g2ZA~y{bI{ulo*#|) z1ST>x8Zie3GUpMqOm=L(FlpFi4!WVOnd!-PVotKeU=+H0hXh<6yhl2ItGt-XhdE8W zqT|uvygq@v@569!-`IrL&=BU8#Mqm{9LkP>rnX(rwB#|yR0DMN zKrRoK#fA0jh|g#Oz*nU>SRntwM>L&1Mf0goadO#`eC`!jFnH59D1Pw^Sks%ZV>U9J zw*OB@S-9`za#UQ5&Xe6+x`T{PS!tI1qU42>$$t%z2MP=3kB|pQ=anAUMi(und(mRV z7+O9)PRobKFmvbPee)(_Gnx?~K1@36D!HN|S5(~V7IWpn{S!nFBaT@20KbkVz;V7k za%>d(M#~j{+-=jB^-&!?SIeSj(PB=tUQ5!kSUh92Ov)9N&a{tbv?PbILn;!{`^pIj zoPPtFN;MI4MsLpaVCbaPvX)X5eWiWCn?Sw-EYnmf@L~r~Vo9zkxqZ@sLmL@=Ia4xH z5s;v}@TDL_nWvE4IC7YG!H-xTl!5D2#~uKYuLd;-3s4!YG_zB4^#LN+%44D064V?l zz>@gLv0JRA+slq%0mh8h2>+J?ly+d~$$wMjtebL()fv1pVZ6WL_XDVL{Nn$U!JAveQlhfaa_0~HSmVYck z9hX94mEa8syO5`@w;MZOz{%&Bb?kjCuk6b*N8Y?zmS$N2fUbSy1>nIj zpRp)RZz0{fke)9uV&L;vBO)xE83Tc0cR$XX2WdQeigXk8A+i zs_A_SuwHg<-WKLC`J%q##516Wri@bM_#-pp+b46XY+vZ7kIu)_zXP*srd1hwu>7xw zE#@y_@(}=J`&0ix`2m%$U21`%`amV*p+W%wvTO5x;F+pvRoszmlU-Y0tAEtJVgUej zoOl?OHzJd&6v6>!#2$?n5)t~7jV(CVUx90)#!iAy@yv30uB|spP_z*MVt<`HyXCjFaHvVZ@lI{{+lJJE%-nhVqQ++De(u$y>wkXW z$bYrI77me~LPyT$uU5-iBZd_!EC*TvP^I;q{meO9(N`flm)ywtTkjZKYoAv5i@?O2{@t}o851ACmgxICu{06g)+CiDy;|iGv|YF5f`t&fq%2NuL)i#jN&k& z+m_Cczak=`b1XDVhw2<1)Q=O6v;cGu`t;>P@~Lvw+pjbG*!zLzuCFcS+^Rb#BR?je z>>Ko*d%v|%%6?`FoddZ(^YkV108L4YfX{rR5aHZyt2w{wPKphUBh79@Bj;AF=G<+o zD<=;ix~9Q)?+SGZGk>1!FW%7{v){1Cd|LGtdNV$Q1rxsOqDp*V00i8|rf9@RleF8m zSrIlTCe3=LS63z+-Bahtf^q!F6_u=O$a{+G>s0Q6c>=#TmiO?o`St$_bFBEXobD{% z;>7Hq#T{;TET&slX{Z98uXqMLqxi%Bc~>b^wn3H#4hy{IiC_21@&)z(t|X|cO`9{S zb@ce(wJo_>M7|;xtrj%fmegB9Tm(x15hUXpItKg!zz4~Ic7a|%rBjd-ia9C5@zV?9 gAKfbw`P1kB0CUi}Aa6C17XSbN07*qoM6N<$f-G^U(f|Me From d356d6e482e8a5c12ebc2bb1de8556d1fdb6debf Mon Sep 17 00:00:00 2001 From: Grant Stankaitis <36576510+grantukas@users.noreply.github.com> Date: Fri, 31 Dec 2021 16:08:55 -1000 Subject: [PATCH 418/605] 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 419/605] 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 420/605] 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 421/605] 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 422/605] 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 423/605] 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 424/605] 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 425/605] 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 426/605] 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 427/605] 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 428/605] 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 429/605] 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 430/605] 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 431/605] 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 432/605] 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 433/605] 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 434/605] 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 435/605] 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 436/605] 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 437/605] 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 438/605] Update app-icon.png --- apps/minimal_clock/app-icon.png | Bin 1312 -> 1581 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/minimal_clock/app-icon.png b/apps/minimal_clock/app-icon.png index 32e1a342590fa03cb75adb0b00f12491b3b0c264..69788442a39c7ba8ccb99355a5ee68877e3873d7 100644 GIT binary patch delta 1124 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 fCE#;_tD64 Date: Sat, 1 Jan 2022 09:24:43 +0100 Subject: [PATCH 439/605] 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 440/605] 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 441/605] 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 442/605] 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 54475bf5e6123ca4c5983556948400c45b65e8f0 Mon Sep 17 00:00:00 2001 From: 7kasper <7kasper@users.noreply.github.com> Date: Sat, 1 Jan 2022 16:27:31 +0100 Subject: [PATCH 443/605] Create template.html --- apps/presentor/template.html | 73 ++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 apps/presentor/template.html diff --git a/apps/presentor/template.html b/apps/presentor/template.html new file mode 100644 index 000000000..e3a5f71ef --- /dev/null +++ b/apps/presentor/template.html @@ -0,0 +1,73 @@ + + + + + + + +
+ + + + + + + From cfcf7908decd1cd661749bd6836b6414cc3c7bac Mon Sep 17 00:00:00 2001 From: 7kasper Date: Sat, 1 Jan 2022 20:00:08 +0100 Subject: [PATCH 444/605] Create basic UI for adding subjects. --- apps/presentor/template.html | 281 ++++++++++++++++++++++++++++------- 1 file changed, 225 insertions(+), 56 deletions(-) diff --git a/apps/presentor/template.html b/apps/presentor/template.html index e3a5f71ef..2b0ddc1ec 100644 --- a/apps/presentor/template.html +++ b/apps/presentor/template.html @@ -2,71 +2,240 @@ + + -
- - +
+

Presentor

+
+
+
+
+
+
#
+
Subject
+
Time
+
Notes
+
+
Loading...
+
+
+
+
+ + +
From aec3df87450e68418f7064002115f31cfec95def Mon Sep 17 00:00:00 2001 From: 7kasper Date: Sat, 1 Jan 2022 20:11:25 +0100 Subject: [PATCH 445/605] Hehe oops --- apps/presentor/{template.html => interface.html} | 8 ++++++++ 1 file changed, 8 insertions(+) rename apps/presentor/{template.html => interface.html} (97%) diff --git a/apps/presentor/template.html b/apps/presentor/interface.html similarity index 97% rename from apps/presentor/template.html rename to apps/presentor/interface.html index 2b0ddc1ec..a3c0fd890 100644 --- a/apps/presentor/template.html +++ b/apps/presentor/interface.html @@ -72,6 +72,14 @@ } .icon-cross { color: #e85600; + cursor: pointer; + transition: transform 0.2s ease-in-out; + } + .icon-cross:hover { + transform: scale(1.1); + } + .draghandle { + cursor: grab; } From b82b65198b3912d79393840c884026ed88a478bb Mon Sep 17 00:00:00 2001 From: 7kasper Date: Sat, 1 Jan 2022 20:18:19 +0100 Subject: [PATCH 446/605] Add actual watch interface --- apps/presentor/interface.html | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/apps/presentor/interface.html b/apps/presentor/interface.html index a3c0fd890..ac748a9f9 100644 --- a/apps/presentor/interface.html +++ b/apps/presentor/interface.html @@ -135,7 +135,12 @@ } function save() { - cmpStr = getJSON(); + let savestr = getJSON(); + Util.showModal('Saving...'); + Puck.write(`\x10require('Storage').writeJSON(${JSON.stringify('presentor.json')},${savestr})\n`,()=>{ + Util.hideModal(); + }); + cmpStr = savestr; } function loadJSON(str) { @@ -146,6 +151,14 @@ } } + function load() { + Util.showModal('Loading...'); + Puck.eval(`require('Storage').readJSON(${JSON.stringify('presentor.json')})`,data => { + Util.hideModal(); + loadJSON(data); + }); + } + function addFormPPart(partData = {}) { let part = document.createElement('div'); part.classList.add('ppartrow'); @@ -241,8 +254,9 @@ document.getElementById('loader').style.display = 'none'; // load from watch first. - let qq = `[{"subject":"Hello","minutes":55,"seconds":4,"notes":""},{"subject":"dsfafds","minutes":4,"seconds":33,"notes":"fdasdfsafasfsd"},{"subject":"dsadsf","minutes":0,"seconds":4,"notes":""},{"subject":"sdasf","minutes":0,"seconds":0,"notes":""}]`; - loadJSON(qq); + // let qq = `[{"subject":"Hello","minutes":55,"seconds":4,"notes":""},{"subject":"dsfafds","minutes":4,"seconds":33,"notes":"fdasdfsafasfsd"},{"subject":"dsadsf","minutes":0,"seconds":4,"notes":""},{"subject":"sdasf","minutes":0,"seconds":0,"notes":""}]`; + // loadJSON(qq); + load(); addFormPPart(); // load empty element on startup From 02c432124f78745b6f1920b258af789223cc9b8e Mon Sep 17 00:00:00 2001 From: 7kasper Date: Sat, 1 Jan 2022 20:22:13 +0100 Subject: [PATCH 447/605] Bit more spacing for the drag thing. --- apps/presentor/interface.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/presentor/interface.html b/apps/presentor/interface.html index ac748a9f9..aefbdf2c2 100644 --- a/apps/presentor/interface.html +++ b/apps/presentor/interface.html @@ -49,7 +49,7 @@ width: 45%; } .pp-order { - width: calc(50% / 14); + width: calc(100% / 14); display: flex; justify-content: space-between; align-items: center; @@ -65,7 +65,7 @@ width: calc(200% / 14); } .pp-notes { - width: calc(800% / 14); + width: calc(750% / 14); } input { height: 1.5rem; From ce6d4d76fdc1f83035e1e457793a2ddd4c6c2b1a Mon Sep 17 00:00:00 2001 From: 7kasper Date: Sat, 1 Jan 2022 20:23:43 +0100 Subject: [PATCH 448/605] Add readme --- apps/presentor/README.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 apps/presentor/README.md diff --git a/apps/presentor/README.md b/apps/presentor/README.md new file mode 100644 index 000000000..8b22eb228 --- /dev/null +++ b/apps/presentor/README.md @@ -0,0 +1,2 @@ +# Presentor +Use your Bangle to present! From aa55094e227082dc9aebdbcaeca27ded82516a96 Mon Sep 17 00:00:00 2001 From: 7kasper Date: Sat, 1 Jan 2022 21:46:40 +0100 Subject: [PATCH 449/605] rrr --- apps/presentor/interface.html | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/presentor/interface.html b/apps/presentor/interface.html index aefbdf2c2..ed265e2f6 100644 --- a/apps/presentor/interface.html +++ b/apps/presentor/interface.html @@ -49,7 +49,7 @@ width: 45%; } .pp-order { - width: calc(100% / 14); + width: calc(150% / 14); display: flex; justify-content: space-between; align-items: center; @@ -65,7 +65,7 @@ width: calc(200% / 14); } .pp-notes { - width: calc(750% / 14); + width: calc(700% / 14); } input { height: 1.5rem; @@ -253,11 +253,15 @@ document.getElementById('loader').style.display = 'none'; + function onInit() { + load(); + addFormPPart(); // add empty element on startup + } // load from watch first. // let qq = `[{"subject":"Hello","minutes":55,"seconds":4,"notes":""},{"subject":"dsfafds","minutes":4,"seconds":33,"notes":"fdasdfsafasfsd"},{"subject":"dsadsf","minutes":0,"seconds":4,"notes":""},{"subject":"sdasf","minutes":0,"seconds":0,"notes":""}]`; // loadJSON(qq); - load(); - addFormPPart(); // load empty element on startup + + From 6eed1b5760f303b8b76117cc0d72236dd50c9888 Mon Sep 17 00:00:00 2001 From: 7kasper Date: Sat, 1 Jan 2022 21:59:58 +0100 Subject: [PATCH 450/605] No double json parse >.< --- apps/presentor/interface.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/presentor/interface.html b/apps/presentor/interface.html index ed265e2f6..9b79221d3 100644 --- a/apps/presentor/interface.html +++ b/apps/presentor/interface.html @@ -153,7 +153,7 @@ function load() { Util.showModal('Loading...'); - Puck.eval(`require('Storage').readJSON(${JSON.stringify('presentor.json')})`,data => { + Puck.eval(`require('Storage').read(${JSON.stringify('presentor.json')})`,data => { Util.hideModal(); loadJSON(data); }); From d3a2bb4375aa938946280077a071ca17ebdda894 Mon Sep 17 00:00:00 2001 From: 7kasper Date: Sat, 1 Jan 2022 22:06:17 +0100 Subject: [PATCH 451/605] Fix the empty element being loaded in wrongly. --- apps/presentor/interface.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/presentor/interface.html b/apps/presentor/interface.html index 9b79221d3..82bb85f57 100644 --- a/apps/presentor/interface.html +++ b/apps/presentor/interface.html @@ -149,6 +149,7 @@ for (let i = 0; i < jparts.length; i++) { addFormPPart(jparts[i]); } + addFormPPart(); // add empty element on startup } function load() { @@ -255,7 +256,6 @@ function onInit() { load(); - addFormPPart(); // add empty element on startup } // load from watch first. // let qq = `[{"subject":"Hello","minutes":55,"seconds":4,"notes":""},{"subject":"dsfafds","minutes":4,"seconds":33,"notes":"fdasdfsafasfsd"},{"subject":"dsadsf","minutes":0,"seconds":4,"notes":""},{"subject":"sdasf","minutes":0,"seconds":0,"notes":""}]`; From b279d3bf69ef3d1a27d0f9720129b0588ac6a560 Mon Sep 17 00:00:00 2001 From: 7kasper Date: Sat, 1 Jan 2022 22:07:45 +0100 Subject: [PATCH 452/605] Bit more time for timer. --- apps/presentor/interface.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/presentor/interface.html b/apps/presentor/interface.html index 82bb85f57..460102388 100644 --- a/apps/presentor/interface.html +++ b/apps/presentor/interface.html @@ -59,10 +59,10 @@ padding-right: 0.25rem; } .pp-subject { - width: calc(350% / 14); + width: calc(300% / 14); } .pp-timer { - width: calc(200% / 14); + width: calc(250% / 14); } .pp-notes { width: calc(700% / 14); From c1fdac99929285a603078e67ef1c381a8625de7e Mon Sep 17 00:00:00 2001 From: 7kasper Date: Sat, 1 Jan 2022 22:28:30 +0100 Subject: [PATCH 453/605] Futureproof the settings format. --- apps.json | 5 +++-- apps/presentor/ChangeLog | 1 + apps/presentor/interface.html | 12 +++++++++--- apps/presentor/settings.json | 17 +++++++++++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 apps/presentor/settings.json diff --git a/apps.json b/apps.json index 317b809dd..74a24d290 100644 --- a/apps.json +++ b/apps.json @@ -5066,7 +5066,7 @@ { "id": "presentor", "name": "Presentor", - "version": "2.1", + "version": "2.2", "description": "Use your Bangle to present!", "icon": "app.png", "type": "app", @@ -5077,7 +5077,8 @@ "allow_emulator": true, "storage": [ {"name":"presentor.app.js","url":"app.js"}, - {"name":"presentor.img","url":"app-icon.js","evaluate":true} + {"name":"presentor.img","url":"app-icon.js","evaluate":true}, + {"name":"presentor.json","url":"settings.json"} ] } ] diff --git a/apps/presentor/ChangeLog b/apps/presentor/ChangeLog index a7d747684..2e3409855 100644 --- a/apps/presentor/ChangeLog +++ b/apps/presentor/ChangeLog @@ -4,3 +4,4 @@ 1.5: Added accelerator style mouse. 2.0: Added touchpad style mouse. 2.1: Initial internal git(hub) release. Added icon and such. +2.2: Begin work on presentation parts. diff --git a/apps/presentor/interface.html b/apps/presentor/interface.html index 460102388..1af0041fb 100644 --- a/apps/presentor/interface.html +++ b/apps/presentor/interface.html @@ -119,7 +119,11 @@ } function getJSON() { - let ret = []; + let ret = { + pparts: [], + sversion: 2.2 + } + let jparts = []; let pparts = subber.children; for (let i = 0; i < pparts.length; i++) { let rpart = {}; @@ -129,8 +133,9 @@ rpart.minutes = ppart.getElementsByClassName('pp-timer')[0].children[0].value | 0; rpart.seconds = ppart.getElementsByClassName('pp-timer')[0].children[2].value | 0; rpart.notes = ppart.getElementsByClassName('pp-notes')[0].value; - ret.push(rpart); + jparts.push(rpart); } + ret.pparts = jparts; return JSON.stringify(ret); } @@ -145,7 +150,8 @@ function loadJSON(str) { cmpStr = str; - let jparts = JSON.parse(str); + let settings = JSON.parse(str); + let jparts = settings.pparts; for (let i = 0; i < jparts.length; i++) { addFormPPart(jparts[i]); } diff --git a/apps/presentor/settings.json b/apps/presentor/settings.json new file mode 100644 index 000000000..7e8d29876 --- /dev/null +++ b/apps/presentor/settings.json @@ -0,0 +1,17 @@ +{ + "pparts": [ + { + "subject":"#1", + "minutes":10, + "seconds":0, + "notes":"This is a note." + }, + { + "subject":"#2", + "minutes":2, + "seconds":50, + "notes":"Change in the app!" + } + ], + "sversion": 2.2 +} \ No newline at end of file From b5ae5c291ee0d1fc62adcd47f3b75a4721c33e4a Mon Sep 17 00:00:00 2001 From: 7kasper Date: Sat, 1 Jan 2022 22:35:48 +0100 Subject: [PATCH 454/605] Add small credits on the page. --- apps/presentor/interface.html | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/apps/presentor/interface.html b/apps/presentor/interface.html index 1af0041fb..377703898 100644 --- a/apps/presentor/interface.html +++ b/apps/presentor/interface.html @@ -1,6 +1,9 @@ + + + @@ -81,6 +84,13 @@ .draghandle { cursor: grab; } + footer { + display: inline-block; + width: 100%; + text-align: center; + font-size: 0.6rem; + color: grey; + } @@ -104,6 +114,7 @@ +