From f6a2a03448f2d68fd6c533e2d8a126fb7d49f916 Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 22 Feb 2022 15:15:18 +0100 Subject: [PATCH 01/29] New color option: foreground --- apps/circlesclock/app.js | 3 +++ apps/circlesclock/settings.js | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 903c7bdb2..ba7ab474e 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -248,6 +248,9 @@ function getGradientColor(color, percent) { const colorList = [ '#00FF00', '#80FF00', '#FFFF00', '#FF8000', '#FF0000' ]; + if (color == "fg") { + color = colorFg; + } if (color == "green-red") { const colorIndex = Math.round(colorList.length * percent); return colorList[Math.min(colorIndex, colorList.length) - 1] || "#00ff00"; diff --git a/apps/circlesclock/settings.js b/apps/circlesclock/settings.js index bec539376..0b9e94aca 100644 --- a/apps/circlesclock/settings.js +++ b/apps/circlesclock/settings.js @@ -14,8 +14,10 @@ const valuesCircleTypes = ["empty", "steps", "stepsDist", "hr", "battery", "weather", "sunprogress", "temperature", "pressure", "altitude"]; const namesCircleTypes = ["empty", "steps", "distance", "heart", "battery", "weather", "sun", "temperature", "pressure", "altitude"]; - const valuesColors = ["", "#ff0000", "#00ff00", "#0000ff", "#ffff00", "#ff00ff", "#00ffff", "#fff", "#000", "green-red", "red-green"]; - const namesColors = ["default", "red", "green", "blue", "yellow", "magenta", "cyan", "white", "black", "green->red", "red->green"]; + const valuesColors = ["", "#ff0000", "#00ff00", "#0000ff", "#ffff00", "#ff00ff", + "#00ffff", "#fff", "#000", "green-red", "red-green", "fg"]; + const namesColors = ["default", "red", "green", "blue", "yellow", "magenta", + "cyan", "white", "black", "green->red", "red->green", "foreground"]; const weatherData = ["empty", "humidity", "wind"]; From 9977460d1f41f15058fba03359e6099f560bb6f0 Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 22 Feb 2022 15:16:40 +0100 Subject: [PATCH 02/29] Draw the circles a little bit delayed so we decrease the blocking time --- apps/circlesclock/app.js | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index ba7ab474e..1e713c2e6 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -138,10 +138,19 @@ function draw() { g.drawString(locale.date(new Date()), w / 2, h2); g.drawString(locale.dow(new Date()), w / 2, h2 + dowOffset); - drawCircle(1); - drawCircle(2); - drawCircle(3); - if (circleCount >= 4) drawCircle(4); + // draw the circles a little bit delayed so we decrease the blocking time + setTimeout(function() { + drawCircle(1); + }, 1); + setTimeout(function() { + drawCircle(2); + }, 1); + setTimeout(function() { + drawCircle(3); + }, 1); + setTimeout(function() { + if (circleCount >= 4) drawCircle(4); + }, 1); } function drawCircle(index) { From 0eb5cd9292622a4057b4a87c7cd8a121625aa2da Mon Sep 17 00:00:00 2001 From: Marco H Date: Tue, 22 Feb 2022 15:17:09 +0100 Subject: [PATCH 03/29] Move icons to the functions which use them to reduce memory usage --- apps/circlesclock/app.js | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index 1e713c2e6..d5df2fe44 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -3,23 +3,8 @@ const storage = require("Storage"); const SunCalc = require("https://raw.githubusercontent.com/mourner/suncalc/master/suncalc.js"); const shoesIcon = atob("EBCBAAAACAAcAB4AHgAeABwwADgGeAZ4AHgAMAAAAHAAIAAA"); -const heartIcon = atob("EBCBAAAAAAAeeD/8P/x//n/+P/w//B/4D/AH4APAAYAAAAAA"); -const powerIcon = atob("EBCBAAAAA8ADwA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AH4AAA"); const temperatureIcon = atob("EBCBAAAAAYADwAJAAkADwAPAA8ADwAfgB+AH4AfgA8ABgAAA"); -const weatherCloudy = atob("EBCBAAAAAAAAAAfgD/Af8H/4//7///////9//z/+AAAAAAAA"); -const weatherSunny = atob("EBCBAAAAAYAQCBAIA8AH4A/wb/YP8A/gB+ARiBAIAYABgAAA"); -const weatherMoon = atob("EBCBAAAAAYAP8B/4P/w//D/8f/5//j/8P/w//B/4D/ABgAAA"); -const weatherPartlyCloudy = atob("EBCBAAAAAAAYQAMAD8AIQBhoW+AOYBwwOBBgHGAGP/wf+AAA"); -const weatherRainy = atob("EBCBAAAAAYAH4AwwOBBgGEAOQAJBgjPOEkgGYAZgA8ABgAAA"); -const weatherPartlyRainy = atob("EBCBAAAAEEAQAAeADMAYaFvoTmAMMDgQIBxhhiGGG9wDwAGA"); -const weatherSnowy = atob("EBCBAAAAAAADwAGAEYg73C50BCAEIC50O9wRiAGAA8AAAAAA"); -const weatherFoggy = atob("EBCBAAAAAAADwAZgDDA4EGAcQAZAAgAAf74AAAAAd/4AAAAA"); -const weatherStormy = atob("EBCBAAAAAYAH4AwwOBBgGEAOQMJAgjmOGcgAgACAAAAAAAAA"); - -const sunSetDown = atob("EBCBAAAAAAABgAAAAAATyAZoBCB//gAAAAAGYAPAAYAAAAAA"); -const sunSetUp = atob("EBCBAAAAAAABgAAAAAATyAZoBCB//gAAAAABgAPABmAAAAAA"); - Graphics.prototype.setFontRobotoRegular50NumericOnly = function(scale) { // Actual height 39 (40 - 2) this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAB8AAAAAAAfAAAAAAAPwAAAAAAB8AAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAA4AAAAAAB+AAAAAAD/gAAAAAD/4AAAAAH/4AAAAAP/wAAAAAP/gAAAAAf/gAAAAAf/AAAAAA/+AAAAAB/+AAAAAB/8AAAAAD/4AAAAAH/4AAAAAD/wAAAAAA/wAAAAAAPgAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///wAAAB////gAAA////8AAA/////gAAP////8AAH8AAA/gAB8AAAD4AA+AAAAfAAPAAAADwADwAAAA8AA8AAAAPAAPAAAADwADwAAAA8AA8AAAAPAAPgAAAHwAB8AAAD4AAfwAAD+AAD/////AAA/////wAAH////4AAAf///4AAAB///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAPgAAAAAADwAAAAAAB8AAAAAAAfAAAAAAAHgAAAAAAD4AAAAAAA+AAAAAAAPAAAAAAAH/////wAB/////8AA//////AAP/////wAD/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAfgAADwAAP4AAB8AAH+AAA/AAD/gAAfwAB/AAAf8AAfAAAP/AAPgAAH7wAD4AAD88AA8AAB+PAAPAAA/DwADwAAfg8AA8AAPwPAAPAAH4DwADwAH8A8AA+AD+APAAPwB/ADwAB/D/gA8AAf//gAPAAD//wADwAAf/wAA8AAD/4AAPAAAHwAADwAAAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAADgAAAHwAA+AAAD8AAP4AAB/AAD/AAA/wAA/wAAf4AAD+AAHwAAAPgAD4APAB8AA+ADwAPAAPAA8ADwADwAPAA8AA8ADwAPAAPAA8ADwADwAfAA8AA8AH4APAAPgD+AHwAB8B/wD4AAf7/+B+AAD//v//AAA//x//wAAD/4P/4AAAf8B/4AAAAYAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAHwAAAAAAH8AAAAAAD/AAAAAAD/wAAAAAD/8AAAAAB/vAAAAAB/jwAAAAA/g8AAAAA/wPAAAAAfwDwAAAAf4A8AAAAf4APAAAAP8ADwAAAP8AA8AAAH8AAPAAAD/////8AA//////AAP/////wAD/////8AA//////AAAAAAPAAAAAAADwAAAAAAA8AAAAAAAPAAAAAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AAAAB/APwAAH//wD+AAD//8A/wAA///AH+AAP//wAPgAD/B4AB8AA8A+AAfAAPAPAADwADwDwAA8AA8A8AAPAAPAPAADwADwD4AA8AA8A+AAPAAPAPwAHwADwD8AD4AA8AfwD+AAPAH///AADwA///wAA8AH//4AAPAAf/4AAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAD//+AAAAD///4AAAD////AAAB////4AAA/78D/AAAfw8AH4AAPweAA+AAD4PgAHwAB8DwAA8AAfA8AAPAAHgPAADwAD4DwAA8AA+A8AAPAAPAPgAHwADwD4AB8AA8AfgA+AAPAH+B/gAAAA///wAAAAH//4AAAAA//8AAAAAH/8AAAAAAP4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAAAAAA8AAAAAAAPAAAAAAADwAAAAAAA8AAAABAAPAAAABwADwAAAB8AA8AAAB/AAPAAAB/wADwAAD/8AA8AAD/8AAPAAD/4AADwAD/4AAA8AD/4AAAPAH/wAAADwH/wAAAA8H/wAAAAPH/wAAAAD3/gAAAAA//gAAAAAP/gAAAAAD/gAAAAAA/AAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwA/4AAAH/Af/AAAH/8P/4AAD//n//AAA//7//4AAfx/+A+AAHwD+AHwAD4AfgB8AA8AHwAPAAPAA8ADwADwAPAA8AA8ADwAPAAPAA8ADwADwAfAA8AA+AH4AfAAHwD+AHwAB/D/4D4AAP/+/n+AAD//n//AAAf/w//gAAB/wH/wAAAHwA/4AAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAD/8AAAAAD//wAAAAB//+AAAAA///wAAAAf4H+APAAH4AfgDwAD8AB8A8AA+AAfAPAAPAADwDwADwAA8B8AA8AAPAfAAPAADwHgADwAA8D4AA+AAeB+AAHwAHg/AAB+ADwfgAAP8D4/4AAD////8AAAf///8AAAB///+AAAAP//+AAAAAP/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAOAAAB8AAHwAAAfgAD8AAAH4AA/AAAB8AAHwAAAOAAA4AAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("DRUcHBwcHBwcHBwcDA=="), 50+(scale<<8)+(1<<16)); @@ -337,6 +322,8 @@ function drawStepsDistance(w) { function drawHeartRate(w) { if (!w) w = getCircleXPosition("hr"); + const heartIcon = atob("EBCBAAAAAAAeeD/8P/x//n/+P/w//B/4D/AH4APAAYAAAAAA"); + drawCircleBackground(w); const color = getCircleColor("hr"); @@ -361,6 +348,8 @@ function drawBattery(w) { if (!w) w = getCircleXPosition("battery"); const battery = E.getBattery(); + const powerIcon = atob("EBCBAAAAA8ADwA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AH4AAA"); + drawCircleBackground(w); let color = getCircleColor("battery"); @@ -438,6 +427,10 @@ function drawSunProgress(w) { if (!w) w = getCircleXPosition("sunprogress"); const percent = getSunProgress(); + // sunset icons: + const sunSetDown = atob("EBCBAAAAAAABgAAAAAATyAZoBCB//gAAAAAGYAPAAYAAAAAA"); + const sunSetUp = atob("EBCBAAAAAAABgAAAAAATyAZoBCB//gAAAAABgAPABmAAAAAA"); + drawCircleBackground(w); const color = getCircleColor("sunprogress"); @@ -571,6 +564,18 @@ function windAsBeaufort(windInKmh) { */ function getWeatherIconByCode(code) { const codeGroup = Math.round(code / 100); + + // weather icons: + const weatherCloudy = atob("EBCBAAAAAAAAAAfgD/Af8H/4//7///////9//z/+AAAAAAAA"); + const weatherSunny = atob("EBCBAAAAAYAQCBAIA8AH4A/wb/YP8A/gB+ARiBAIAYABgAAA"); + const weatherMoon = atob("EBCBAAAAAYAP8B/4P/w//D/8f/5//j/8P/w//B/4D/ABgAAA"); + const weatherPartlyCloudy = atob("EBCBAAAAAAAYQAMAD8AIQBhoW+AOYBwwOBBgHGAGP/wf+AAA"); + const weatherRainy = atob("EBCBAAAAAYAH4AwwOBBgGEAOQAJBgjPOEkgGYAZgA8ABgAAA"); + const weatherPartlyRainy = atob("EBCBAAAAEEAQAAeADMAYaFvoTmAMMDgQIBxhhiGGG9wDwAGA"); + const weatherSnowy = atob("EBCBAAAAAAADwAGAEYg73C50BCAEIC50O9wRiAGAA8AAAAAA"); + const weatherFoggy = atob("EBCBAAAAAAADwAZgDDA4EGAcQAZAAgAAf74AAAAAd/4AAAAA"); + const weatherStormy = atob("EBCBAAAAAYAH4AwwOBBgGEAOQMJAgjmOGcgAgACAAAAAAAAA"); + switch (codeGroup) { case 2: return weatherStormy; From 792d9a316681c31657b69aaf5f947ee3340924b6 Mon Sep 17 00:00:00 2001 From: copoer Date: Wed, 23 Feb 2022 13:18:12 -0400 Subject: [PATCH 04/29] Local for time in contour clock --- apps/contourclock/lib.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/contourclock/lib.js b/apps/contourclock/lib.js index 65a4622f4..aa83fca26 100644 --- a/apps/contourclock/lib.js +++ b/apps/contourclock/lib.js @@ -13,13 +13,15 @@ exports.drawClock = function(fontIndex) { if (n!=10) return (false); //font file seems to be invalid var x=0; var y = g.getHeight()/2-digits[0].height/2; - var date = new Date(); + var date = require('locale').time(new Date(),1); + var hours = date.split(":")[0]; + var minutes = date.split(":")[1]; g.clearRect(0,38,g.getWidth()-1,138); - d1=parseInt(date.getHours()/10); - d2=parseInt(date.getHours()%10); + d1=parseInt(hours/10); + d2=parseInt(hours%10); d3=10; - d4=parseInt(date.getMinutes()/10); - d5=parseInt(date.getMinutes()%10); + d4=parseInt(minutes/10); + d5=parseInt(minutes%10); w1=digits[d1].width; w2=digits[d2].width; w3=digits[d3].width; From da25e418058e5b85c6dfd85d91847d34ecdf7acc Mon Sep 17 00:00:00 2001 From: copoer Date: Wed, 23 Feb 2022 13:24:59 -0400 Subject: [PATCH 05/29] Change log --- apps/contourclock/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/contourclock/ChangeLog b/apps/contourclock/ChangeLog index 9c62e637b..aed7baf64 100644 --- a/apps/contourclock/ChangeLog +++ b/apps/contourclock/ChangeLog @@ -5,3 +5,4 @@ 0.23: Customizer! Unused fonts no longer take up precious memory. 0.24: Added previews to the customizer. 0.25: Fixed a bug that would let widgets change the color of the clock. +0.26: Time now works with locale formatting From 0e850f38028a29d994406f719caad56722f29ff2 Mon Sep 17 00:00:00 2001 From: Marco H Date: Fri, 25 Feb 2022 09:46:03 +0100 Subject: [PATCH 06/29] Bump version to 0.11 --- apps/circlesclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/circlesclock/metadata.json b/apps/circlesclock/metadata.json index 3279ec2cf..b16f14c06 100644 --- a/apps/circlesclock/metadata.json +++ b/apps/circlesclock/metadata.json @@ -1,7 +1,7 @@ { "id": "circlesclock", "name": "Circles clock", "shortName":"Circles clock", - "version":"0.10", + "version":"0.11", "description": "A clock with three or four circles for different data at the bottom in a probably familiar style", "icon": "app.png", "screenshots": [{"url":"screenshot-dark.png"}, {"url":"screenshot-light.png"}, {"url":"screenshot-dark-4.png"}, {"url":"screenshot-light-4.png"}], From bef3c32a9abd4030fa7b3d65e093e83d721c8759 Mon Sep 17 00:00:00 2001 From: Markus Laire Date: Fri, 25 Feb 2022 17:51:31 +0200 Subject: [PATCH 07/29] widadjust: add metadata.json --- apps/widadjust/metadata.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 apps/widadjust/metadata.json diff --git a/apps/widadjust/metadata.json b/apps/widadjust/metadata.json new file mode 100644 index 000000000..30670fd83 --- /dev/null +++ b/apps/widadjust/metadata.json @@ -0,0 +1,18 @@ +{ + "id": "widadjust", + "name": "Adjust Clock", + "version": "0.01", + "description": "Adjusts clock continually in the background to counter clock drift", + "type": "widget", + "tags": "widget", + "supports": [ "BANGLEJS", "BANGLEJS2" ], + "readme": "README.md", + "storage": [ + { "name": "widadjust.wid.js", "url": "widget.js" }, + { "name": "widadjust.settings.js", "url": "settings.js" } + ], + "data": [ + { "name": "widadjust.json" }, + { "name": "widadjust.state" } + ] +} From 38d6a95303cd72e56f9e041d4da1f571b1198851 Mon Sep 17 00:00:00 2001 From: Markus Laire Date: Fri, 25 Feb 2022 17:53:04 +0200 Subject: [PATCH 08/29] widadjust: add other files for v0.01 --- apps/widadjust/README.md | 52 ++++++++ apps/widadjust/settings.js | 120 ++++++++++++++++++ apps/widadjust/widget.js | 244 +++++++++++++++++++++++++++++++++++++ 3 files changed, 416 insertions(+) create mode 100644 apps/widadjust/README.md create mode 100644 apps/widadjust/settings.js create mode 100644 apps/widadjust/widget.js diff --git a/apps/widadjust/README.md b/apps/widadjust/README.md new file mode 100644 index 000000000..1b51440f5 --- /dev/null +++ b/apps/widadjust/README.md @@ -0,0 +1,52 @@ +# Adjust Clock + +Adjusts clock continually in the background to counter clock drift. + +## Usage + +First you need to determine the clock drift of your watch in PPM (parts per million). + +For example if you measure that your watch clock is too fast by 5 seconds in 24 hours, +then PPM is `5 / (24*60*60) * 1000000 = 57.9`. + +Then set PPM in settings and this widget will continually adjust the clock by that amount. + +## Settings + +See **Basic logic** below for more details. + +- **PPM x 10** - change PPM in steps of 10 +- **PPM x 1** - change PPM in steps of 1 +- **PPM x 0.1** - change PPM in steps of 0.1 +- **Update Interval** - How often to update widget and clock error. +- **Threshold** - Threshold for adjusting clock. + When clock error exceeds this threshold, clock is adjusted with `setTime`. +- **Save State** - If `On` clock error state is saved to file when widget exits, if needed. + That is recommended and default setting. + If `Off` clock error state is forgotten and reset to 0 whenever widget is restarted, + for example when going to Launcher. This can cause significant inaccuracy especially + with large **Update Interval** or **Threshold**. +- **Debug Log** - If `On` some debug information is logged to file `widadjust.log`. + +## Display + +Widget shows clock error in milliseconds and PPM. + +## Basic logic + +- When widget starts, clock error state is loaded from file `widadjust.state`. +- While widget is running, widget display and clock error is updated + periodically (**Update Interval**) according to **PPM**. +- When clock error exceeds **Threshold** clock is adjusted with `setTime`. +- When widget exists, clock error state is saved to file `widadjust.state` if needed. + +## Services + +Other apps/widgets can use `WIDGETS.adjust.now()` to request current adjusted time. +To support also case where this widget isn't present, the following code can be used: + +``` +function adjustedNow() { + return WIDGETS.adjust ? WIDGETS.adjust.now() : Date.now(); +} +``` diff --git a/apps/widadjust/settings.js b/apps/widadjust/settings.js new file mode 100644 index 000000000..5791d763b --- /dev/null +++ b/apps/widadjust/settings.js @@ -0,0 +1,120 @@ +(function(back) { + const SETTINGS_FILE = 'widadjust.json'; + const STATE_FILE = 'widadjust.state'; + + const DEFAULT_ADJUST_THRESHOLD = 100; + let thresholdV = [ 10, 25, 50, 100, 250, 500, 1000 ]; + + const DEFAULT_UPDATE_INTERVAL = 60000; + let intervalV = [ 10000, 30000, 60000, 180000, 600000, 1800000, 3600000 ]; + let intervalN = [ "10 s", "30 s", "1 m", "3 m", "10 m", "30 m", "1 h" ]; + + let stateFileErased = false; + + let settings = Object.assign({ + advanced: false, + saveState: true, + debugLog: false, + ppm: 0, + adjustThreshold: DEFAULT_ADJUST_THRESHOLD, + updateInterval: DEFAULT_UPDATE_INTERVAL, + }, require('Storage').readJSON(SETTINGS_FILE, true) || {}); + + if (thresholdV.indexOf(settings.adjustThreshold) == -1) { + settings.adjustThreshold = DEFAULT_ADJUST_THRESHOLD; + } + + if (intervalV.indexOf(settings.updateInterval) == -1) { + settings.updateInterval = DEFAULT_UPDATE_INTERVAL; + } + + function onPpmChange(v) { + settings.ppm = v; + mainMenu['PPM x 10' ].value = v; + mainMenu['PPM x 1' ].value = v; + mainMenu['PPM x 0.1'].value = v; + } + + let mainMenu = { + '': { 'title' : 'Adjust Clock' }, + + '< Back': () => { + require('Storage').writeJSON(SETTINGS_FILE, settings); + back(); + }, + + /* + // NOT FULLY WORKING YET + 'Mode': { + value: settings.advanced, + format: v => v ? 'Advanced' : 'Basic', + onchange: () => { + settings.advanced = !settings.advanced; + } + }, + */ + + 'PPM x 10' : { + value: settings.ppm, + format: v => v.toFixed(1), + step: 10, + onchange : onPpmChange, + }, + + 'PPM x 1' : { + value: settings.ppm, + format: v => v.toFixed(1), + step: 1, + onchange : onPpmChange, + }, + + 'PPM x 0.1' : { + value: settings.ppm, + format: v => v.toFixed(1), + step: 0.1, + onchange : onPpmChange, + }, + + 'Update Interval': { + value: intervalV.indexOf(settings.updateInterval), + min: 0, + max: intervalV.length - 1, + format: v => intervalN[v], + onchange: v => { + settings.updateInterval = intervalV[v]; + }, + }, + + 'Threshold': { + value: thresholdV.indexOf(settings.adjustThreshold), + min: 0, + max: thresholdV.length - 1, + format: v => thresholdV[v] + " ms", + onchange: v => { + settings.adjustThreshold = thresholdV[v]; + }, + }, + + 'Save State': { + value: settings.saveState, + format: v => v ? 'On' : 'Off', + onchange: () => { + settings.saveState = !settings.saveState; + if (!settings.saveState && !stateFileErased) { + stateFileErased = true; + require("Storage").erase(STATE_FILE); + } + }, + }, + + 'Debug Log': { + value: settings.debugLog, + format: v => v ? 'On' : 'Off', + onchange: () => { + settings.debugLog = !settings.debugLog; + }, + }, + }; + + E.showMenu(mainMenu); +}) diff --git a/apps/widadjust/widget.js b/apps/widadjust/widget.js new file mode 100644 index 000000000..ce1fee022 --- /dev/null +++ b/apps/widadjust/widget.js @@ -0,0 +1,244 @@ +(() => { + // ====================================================================== + // CONST + + const DEBUG_LOG_FILE = 'widadjust.log'; + const SETTINGS_FILE = 'widadjust.json'; + const STATE_FILE = 'widadjust.state'; + + const DEFAULT_ADJUST_THRESHOLD = 100; + const DEFAULT_UPDATE_INTERVAL = 60 * 1000; + const MIN_INTERVAL = 10 * 1000; + + const MAX_CLOCK_ERROR_FROM_SAVED_STATE = 2000; + + const SAVE_STATE_CLOCK_ERROR_DELTA_THRESHOLD = 1; + const SAVE_STATE_CLOCK_ERROR_DELTA_IN_PPM_THRESHOLD = 1; + const SAVE_STATE_PPM_DELTA_THRESHOLD = 1; + + // Widget width. + const WIDTH = 22; + + // ====================================================================== + // VARIABLES + + let settings; + let saved; + + let lastClockCheckTime = Date.now();; + let lastClockErrorUpdateTime; + + let clockError; + let currentUpdateInterval; + let lastPpm = null; + + let debugLogFile = null; + + // ====================================================================== + // FUNCTIONS + + function clockCheck() { + let now = Date.now(); + let elapsed = now - lastClockCheckTime; + lastClockCheckTime = now; + + let prevUpdateInterval = currentUpdateInterval; + currentUpdateInterval = settings.updateInterval; + setTimeout(clockCheck, lastClockCheckTime + currentUpdateInterval - Date.now()); + + // If elapsed time differs a lot from expected, + // some other app probably used setTime to change clock significantly. + // -> reset clock error since elapsed time can't be trusted + if (Math.abs(elapsed - prevUpdateInterval) > 10 * 1000) { + // RESET CLOCK ERROR + + clockError = 0; + lastClockErrorUpdateTime = now; + + debug( + 'Looks like some other app used setTime, so reset clockError. (elapsed = ' + + elapsed.toFixed(0) + ')' + ); + WIDGETS.adjust.draw(); + + } else if (!settings.advanced) { + // UPDATE CLOCK ERROR WITHOUT TEMPERATURE COMPENSATION + + updateClockError(settings.ppm); + } else { + // UPDATE CLOCK ERROR WITH TEMPERATURE COMPENSATION + + Bangle.getPressure().then(d => { + let temp = d.temperature; + updateClockError(settings.ppm0 + settings.ppm1 * temp + settings.ppm2 * temp * temp); + }).catch(e => { + WIDGETS.adjust.draw(); + }); + } + } + + function debug(line) { + console.log(line); + if (debugLogFile !== null) { + debugLogFile.write(line + '\n'); + } + } + + function draw() { + g.reset().setFont('6x8').setFontAlign(0, 0); + g.clearRect(this.x, this.y, this.x + WIDTH - 1, this.y + 23); + g.drawString(Math.round(clockError), this.x + WIDTH/2, this.y + 9); + + if (lastPpm !== null) { + g.setFont('4x6').setFontAlign(0, 1); + g.drawString(lastPpm.toFixed(1), this.x + WIDTH/2, this.y + 23); + } + } + + function loadSettings() { + settings = Object.assign({ + advanced: false, + saveState: true, + debugLog: false, + ppm: 0, + ppm0: 0, + ppm1: 0, + ppm2: 0, + adjustThreshold: DEFAULT_ADJUST_THRESHOLD, + updateInterval: DEFAULT_UPDATE_INTERVAL, + }, require('Storage').readJSON(SETTINGS_FILE, true) || {}); + + if (settings.debugLog) { + if (debugLogFile === null) { + debugLogFile = require('Storage').open(DEBUG_LOG_FILE, 'a'); + } + } else { + debugLogFile = null; + } + + settings.updateInterval = Math.max(settings.updateInterval, MIN_INTERVAL); + } + + function onQuit() { + let now = Date.now(); + // WIP + let ppm = (lastPpm !== null) ? lastPpm : settings.ppm; + let updatedClockError = clockError + (now - lastClockErrorUpdateTime) * ppm / 1000000; + let save = false; + + if (! settings.saveState) { + debug(new Date(now).toISOString() + ' QUIT'); + + } else if (saved === undefined) { + save = true; + debug(new Date(now).toISOString() + ' QUIT & SAVE STATE'); + + } else { + let elapsedSaved = now - saved.time; + let estimatedClockError = saved.clockError + elapsedSaved * saved.ppm / 1000000; + + let clockErrorDelta = updatedClockError - estimatedClockError; + let clockErrorDeltaInPpm = clockErrorDelta / elapsedSaved * 1000000; + let ppmDelta = ppm - saved.ppm; + + let debugA = new Date(now).toISOString() + ' QUIT'; + let debugB = + '\n> ' + updatedClockError.toFixed(2) + ' - ' + estimatedClockError.toFixed(2) + ' = ' + + clockErrorDelta.toFixed(2) + ' (' + + clockErrorDeltaInPpm.toFixed(1) + ' PPM) ; ' + + ppm.toFixed(1) + ' - ' + saved.ppm.toFixed(1) + ' = ' + ppmDelta.toFixed(1); + + if ((Math.abs(clockErrorDelta) >= SAVE_STATE_CLOCK_ERROR_DELTA_THRESHOLD + && Math.abs(clockErrorDeltaInPpm) >= SAVE_STATE_CLOCK_ERROR_DELTA_IN_PPM_THRESHOLD + ) || Math.abs(ppmDelta) >= SAVE_STATE_PPM_DELTA_THRESHOLD + ) + { + save = true; + debug(debugA + ' & SAVE STATE' + debugB); + } else { + debug(debugA + debugB); + } + } + + if (save) { + require('Storage').writeJSON(STATE_FILE, { + counter: (saved === undefined) ? 1 : saved.counter + 1, + time: Math.round(now), + clockError: Math.round(updatedClockError * 1000) / 1000, + ppm: Math.round(ppm * 1000) / 1000, + }); + } + } + + function updateClockError(ppm) { + let now = Date.now(); + let elapsed = now - lastClockErrorUpdateTime; + let drift = elapsed * ppm / 1000000; + clockError += drift; + lastClockErrorUpdateTime = now; + lastPpm = ppm; + + if (Math.abs(clockError) >= settings.adjustThreshold) { + let now = Date.now(); + // Shorter variables are faster to look up and this part is time sensitive. + let e = clockError / 1000; + setTime(getTime() - e); + debug( + new Date(now).toISOString() + ' -> ' + ((now / 1000 - e) % 60).toFixed(3) + + ' SET TIME (' + clockError.toFixed(2) + ')' + ); + clockError = 0; + } + + WIDGETS.adjust.draw(); + } + + // ====================================================================== + // MAIN + + loadSettings(); + + WIDGETS.adjust = { + area: 'tr', + draw: draw, + now: () => { + let now = Date.now(); + // WIP + let ppm = (lastPpm !== null) ? lastPpm : settings.ppm; + let updatedClockError = clockError + (now - lastClockErrorUpdateTime) * ppm / 1000000; + return now - updatedClockError; + }, + width: WIDTH, + }; + + if (settings.saveState) { + saved = require('Storage').readJSON(STATE_FILE, true); + } + + let now = Date.now(); + lastClockErrorUpdateTime = now; + if (saved === undefined) { + clockError = 0; + debug(new Date().toISOString() + ' START'); + } else { + clockError = saved.clockError + (now - saved.time) * saved.ppm / 1000000; + + if (Math.abs(clockError) <= MAX_CLOCK_ERROR_FROM_SAVED_STATE) { + debug( + new Date().toISOString() + ' START & LOAD STATE (' + + clockError.toFixed(2) + ')' + ); + } else { + debug( + new Date().toISOString() + ' START & IGNORE STATE (' + + clockError.toFixed(2) + ')' + ); + clockError = 0; + } + } + + clockCheck(); + + E.on('kill', onQuit); + +})() From 76363b8dc6c860f125c0e2e1c76c51f8de786ccd Mon Sep 17 00:00:00 2001 From: Markus Laire Date: Fri, 25 Feb 2022 18:43:48 +0200 Subject: [PATCH 09/29] widadjust: add icon --- apps/widadjust/README.md | 5 +++++ apps/widadjust/icon.png | Bin 0 -> 1430 bytes apps/widadjust/metadata.json | 1 + 3 files changed, 6 insertions(+) create mode 100644 apps/widadjust/icon.png diff --git a/apps/widadjust/README.md b/apps/widadjust/README.md index 1b51440f5..4f89af54b 100644 --- a/apps/widadjust/README.md +++ b/apps/widadjust/README.md @@ -50,3 +50,8 @@ function adjustedNow() { return WIDGETS.adjust ? WIDGETS.adjust.now() : Date.now(); } ``` + +## Acknowledgment + +Uses [Clock Settings](https://icons8.com/icon/tQvI71EfIWy3/clock-settings) +icon by [Icons8](https://icons8.com). diff --git a/apps/widadjust/icon.png b/apps/widadjust/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f97394618038813954dd332a92bcec1d7eb2a620 GIT binary patch literal 1430 zcmV;H1!?+;P)ZCf45&BTELc~!J-LK5hZlhsKHPXAqokP7!wyL z#ZaRmEQp$Fal^)ilCY4tP*O1_KB5URnh-VwG>Q>HN=&VfY84CwdhrFRTH0Ga7w1f7 z?$`VH9@DP;CzE@>nKNh3nK@_X%o+F}7169^%8>KKXCAN;SO&BKw*j*wG=BhtKtJ#) za0oc(Y5Y{E2Q~qRfe9dV$~ce*hP33h&ZU_^l;{NNrc>|$*b4mW2y-5I9oPumjwlyJ zJ+Me=_5#CB|I@%0&}!SFi)w0n^>f*kNPa9IcX3b;E) zznipFLkG~Oye|XW@aLb@0&ghuF`%3HOMMnN6O%Roda%CIn_!%>s0BVyhQq*;g#G{4 zk_1Z;rw@UBWKbf9o%vJ1ttoh&I>uHcy0e}U_?iM0GkqCDn z&NN1HvvH9{0T6Q<14c=(I|bMsp*zFikX-=~$2L1(EPvRVv_l2>P$0mbJx^96uE(CR zarXIY@Sy;}J=o2pV%V_>d&2sFF9kqit`G@DsuHd7G^kGn)>CD2=OGc|dD6u;rQlP6 zI%G?q0Op#?8i!z|e(whgo(A=aao_+V;|f#hDzHp{Kb}URlH#!bE;kjf0&V(xV%o$> z4kO#*QjNbO%T($zk_MX*Q!Ef;|Bi_U<#!?4Py<{+B2FLJO!4(G1fKB3+c>goJzS%M z{N!nnBTQD{s3+b-%5N4#wD5>he0|-pOn8%X2O7cADkGYa6^)|T18;z95m`r~4Zo4y ziJO7rIzT`08So|X?SD3Kvs30o+Uv0?n@RXW2VRs^YDE(wtjR94q~NiKV!wI21kGJ# z>ggp$uv7-_%pW6OIxz>Vrr0-*Dvxim6JZbl_v`OWm*J0uZbFT2mQwVR$FtUY*!1qemuit}+f4cN#l`vVd zwJ{ZVIic_Xs~kbrA@*#(2Y|y!eIO}`ZeSNhfyfKd%*bIp|Tpt16LJr-6ww1*;Y-(|# zM+F9fTPQxj9@Dnnkv<=3{c@-7Y9!5ai7E=@u&48BvMXT}Fy#_9=h==`&IE!tASP1) zuGhMqh*h|JDk4Da)T~4nbD9Y}hh)5skNt>UiFdT_EHd-P-gjyHEZ`#cuzMGHHqO8S zb|uCU$IiMt)gTWaA@G3KH3F|-A2>#V7qHQBx7L51X22Y>+~$etBw~kY(Sd|5W5~Ok zizeiua7LuQ3mbN{k`nFMF zfMgj?VHL>(Zz8$X#U%s*YYHo{@5((Czk23@r<86dVn(Lz2=J2geQ#O?4C;VKk=cko zbQh2aatPVMMiARJn?P5j&w%o|g0=B8PTRQ%|E%v8lQ0)KWcDDZ?S;sIW_I7lE`1l` z11}<{EWpo5cwz3ne Date: Fri, 25 Feb 2022 18:49:13 +0200 Subject: [PATCH 10/29] fix(widadjust): remove extra semicolon --- apps/widadjust/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/widadjust/widget.js b/apps/widadjust/widget.js index ce1fee022..138833783 100644 --- a/apps/widadjust/widget.js +++ b/apps/widadjust/widget.js @@ -25,7 +25,7 @@ let settings; let saved; - let lastClockCheckTime = Date.now();; + let lastClockCheckTime = Date.now(); let lastClockErrorUpdateTime; let clockError; From b7035afa2f6790636766d2235fa8574007ac3d8c Mon Sep 17 00:00:00 2001 From: Andreas Holley Date: Fri, 25 Feb 2022 21:10:11 +0000 Subject: [PATCH 11/29] Fix Daisy Clock `"type": "clock"` was missing from metadata.json so the app couldn't be set as the clock through settings --- apps/daisy/metadata.json | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/daisy/metadata.json b/apps/daisy/metadata.json index c35bfefa3..1fd95806d 100644 --- a/apps/daisy/metadata.json +++ b/apps/daisy/metadata.json @@ -4,6 +4,7 @@ "dependencies": {"mylocation":"app"}, "description": "A clock based on the Pastel clock with large ring guage for steps", "icon": "app.png", + "type": "clock", "tags": "clock", "supports" : ["BANGLEJS2"], "screenshots": [{"url":"screenshot_daisy2.jpg"}], From 1af14f3f2c9d7f76c09f38e273e0045eda3366a6 Mon Sep 17 00:00:00 2001 From: copoer Date: Fri, 25 Feb 2022 17:11:08 -0400 Subject: [PATCH 12/29] Updated to use suggested function --- apps/contourclock/ChangeLog | 2 +- apps/contourclock/lib.js | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/apps/contourclock/ChangeLog b/apps/contourclock/ChangeLog index aed7baf64..032edc9b5 100644 --- a/apps/contourclock/ChangeLog +++ b/apps/contourclock/ChangeLog @@ -5,4 +5,4 @@ 0.23: Customizer! Unused fonts no longer take up precious memory. 0.24: Added previews to the customizer. 0.25: Fixed a bug that would let widgets change the color of the clock. -0.26: Time now works with locale formatting +0.26: Time formatted to locale diff --git a/apps/contourclock/lib.js b/apps/contourclock/lib.js index aa83fca26..c4f927953 100644 --- a/apps/contourclock/lib.js +++ b/apps/contourclock/lib.js @@ -1,3 +1,11 @@ +var is12; +function getHours(d) { + var h = d.getHours(); + if (is12===undefined) is12 = (require('Storage').readJSON('setting.json',1)||{})["12hour"]; + if (!is12) return h; + return (h%12==0) ? 12 : h%12; +} + exports.drawClock = function(fontIndex) { var digits = []; fontFile=require("Storage").read("contourclock-"+Math.abs(parseInt(fontIndex+0.5))+".json"); @@ -13,15 +21,13 @@ exports.drawClock = function(fontIndex) { if (n!=10) return (false); //font file seems to be invalid var x=0; var y = g.getHeight()/2-digits[0].height/2; - var date = require('locale').time(new Date(),1); - var hours = date.split(":")[0]; - var minutes = date.split(":")[1]; + var date = new Date(); g.clearRect(0,38,g.getWidth()-1,138); - d1=parseInt(hours/10); - d2=parseInt(hours%10); + d1=parseInt(getHours(date)/10); + d2=parseInt(getHours(date)%10); d3=10; - d4=parseInt(minutes/10); - d5=parseInt(minutes%10); + d4=parseInt(date.getMinutes()/10); + d5=parseInt(date.getMinutes()%10); w1=digits[d1].width; w2=digits[d2].width; w3=digits[d3].width; From b31bc88351d69d2b5ceadfd6d89f103eb983be06 Mon Sep 17 00:00:00 2001 From: Andreas Holley Date: Fri, 25 Feb 2022 21:11:59 +0000 Subject: [PATCH 13/29] Bump version --- apps/daisy/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/daisy/metadata.json b/apps/daisy/metadata.json index 1fd95806d..f4a9fcbbe 100644 --- a/apps/daisy/metadata.json +++ b/apps/daisy/metadata.json @@ -1,6 +1,6 @@ { "id": "daisy", "name": "Daisy", - "version":"0.02", + "version":"0.03", "dependencies": {"mylocation":"app"}, "description": "A clock based on the Pastel clock with large ring guage for steps", "icon": "app.png", From faf7cb8d6c815ab8ac2a2e0821429ba2fff3fcc2 Mon Sep 17 00:00:00 2001 From: Andreas Holley Date: Fri, 25 Feb 2022 21:13:17 +0000 Subject: [PATCH 14/29] Update changelog --- apps/daisy/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog index 4fdf333e4..254124d4e 100644 --- a/apps/daisy/ChangeLog +++ b/apps/daisy/ChangeLog @@ -1,2 +1,3 @@ 0.01: first release 0.02: added settings menu to change color +0.03: fix metadata.json to allow setting as clock From fc740bbb1ce4f3d6011ffab1e5b665d547623207 Mon Sep 17 00:00:00 2001 From: copoer Date: Fri, 25 Feb 2022 17:14:20 -0400 Subject: [PATCH 15/29] Added version --- apps/contourclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/contourclock/metadata.json b/apps/contourclock/metadata.json index 54d799127..ec29c390b 100644 --- a/apps/contourclock/metadata.json +++ b/apps/contourclock/metadata.json @@ -1,7 +1,7 @@ { "id": "contourclock", "name": "Contour Clock", "shortName" : "Contour Clock", - "version":"0.25", + "version":"0.26", "icon": "app.png", "description": "A Minimalist clockface with large Digits. Now with more fonts!", "screenshots" : [{"url":"cc-screenshot-1.png"},{"url":"cc-screenshot-2.png"}], From f2f2a271ec6b29cb7748fb4f02a083cb78832681 Mon Sep 17 00:00:00 2001 From: tjsilver Date: Sat, 26 Feb 2022 14:56:05 +0000 Subject: [PATCH 16/29] fix typo in Time and Life shortName --- apps/timeandlife/metadata.json | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/apps/timeandlife/metadata.json b/apps/timeandlife/metadata.json index 86800f16f..acd6b0086 100644 --- a/apps/timeandlife/metadata.json +++ b/apps/timeandlife/metadata.json @@ -1,18 +1,26 @@ { "id": "timeandlife", "name": "Time and Life", - "shortName":"Time and Lfie", + "shortName": "Time and Life", "icon": "app.png", - "version":"0.01", + "version": "0.01", "description": "A simple watchface which displays the time when the screen is tapped and decay according to the rules of Conway's game of life.", "type": "clock", "tags": "clock", - "supports": ["BANGLEJS2"], - "allow_emulator":true, + "supports": [ + "BANGLEJS2" + ], + "allow_emulator": true, "readme": "README.md", "storage": [ - {"name":"timeandlife.app.js","url":"app.js"}, - {"name":"timeandlife.img","url":"app-icon.js","evaluate":true} + { + "name": "timeandlife.app.js", + "url": "app.js" + }, + { + "name": "timeandlife.img", + "url": "app-icon.js", + "evaluate": true + } ] -} - +} \ No newline at end of file From d09e3c2ce13e69548cfc667fd5baba0a50a263fc Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sat, 26 Feb 2022 19:45:35 +0100 Subject: [PATCH 17/29] Use Bangle.appRect --- apps/terminalclock/app.js | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/apps/terminalclock/app.js b/apps/terminalclock/app.js index fb7bd16cc..012aab5d5 100644 --- a/apps/terminalclock/app.js +++ b/apps/terminalclock/app.js @@ -1,6 +1,5 @@ -var locale = require("locale"); +​var locale = require("locale"); var fontColor = g.theme.dark ? "#0f0" : "#000"; -var startY = 24; var paddingY = 2; var font6x8At4Size = 32; var font6x8At2Size = 18; @@ -15,25 +14,25 @@ function setFontSize(pos){ } function clearField(pos){ - var yStartPos = startY + + var yStartPos = Bangle.appRect.y + paddingY * (pos - 1) + font6x8At4Size * Math.min(1, pos-1) + font6x8At2Size * Math.max(0, pos-2); - var yEndPos = startY + + var yEndPos = Bangle.appRect.y + paddingY * (pos - 1) + font6x8At4Size * Math.min(1, pos) + font6x8At2Size * Math.max(0, pos-1); - g.clearRect(0, yStartPos, 240, yEndPos); + g.clearRect(Bangle.appRect.x, yStartPos, Bangle.appRect.x2, yEndPos); } function clearWatchIfNeeded(now){ if(now.getMinutes() % 10 == 0) - g.clearRect(0, startY, 240, 240); + g.clearRect(Bangle.appRect.x, Bangle.appRect.y, Bangle.appRect.x2, Bangle.appRect.y2); } function drawLine(line, pos){ setFontSize(pos); - var yPos = startY + + var yPos = Bangle.appRect.y + paddingY * (pos - 1) + font6x8At4Size * Math.min(1, pos-1) + font6x8At2Size * Math.max(0, pos-2); @@ -127,12 +126,12 @@ var settings = Object.assign({ showActivity: true, showStepCount: true, }, require('Storage').readJSON("terminalclock.json", true) || {}); -// draw immediately at first -draw(); // Show launcher when middle button pressed Bangle.setUI("clock"); // Load widgets Bangle.loadWidgets(); Bangle.drawWidgets(); +// draw immediately at first +draw(); var secondInterval = setInterval(draw, 10000); From 31277cd20a802bab3cbb448ba3e27ca559a36007 Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sat, 26 Feb 2022 19:51:43 +0100 Subject: [PATCH 18/29] Replace 'Activity' with 'Motion' to be able to display motion true values --- apps/terminalclock/app.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/apps/terminalclock/app.js b/apps/terminalclock/app.js index 012aab5d5..ab83a696f 100644 --- a/apps/terminalclock/app.js +++ b/apps/terminalclock/app.js @@ -1,4 +1,4 @@ -​var locale = require("locale"); +var locale = require("locale"); var fontColor = g.theme.dark ? "#0f0" : "#000"; var paddingY = 2; var font6x8At4Size = 32; @@ -75,11 +75,10 @@ function drawHRM(pos){ function drawActivity(pos){ clearField(pos); var health = Bangle.getHealthStatus('last'); - var steps_formated = ">Activity: " + parseInt(health.movement/10); + var steps_formated = ">Motion: " + parseInt(health.movement); drawLine(steps_formated, pos); } - function draw(){ var curPos = 1; g.reset(); @@ -108,7 +107,6 @@ function draw(){ drawInput(now, curPos); } - Bangle.on('HRM',function(hrmInfo) { if(hrmInfo.confidence >= settings.HRMinConfidence) heartRate = hrmInfo.bpm; From 35cad73a9c742b3093590053a12f8ef95d1e0c2a Mon Sep 17 00:00:00 2001 From: Stiralbios Date: Sat, 26 Feb 2022 20:01:53 +0100 Subject: [PATCH 19/29] Update terminalclock version --- apps/terminalclock/ChangeLog | 1 + apps/terminalclock/README.md | 2 +- apps/terminalclock/screenshot1.png | Bin 2938 -> 2878 bytes apps/terminalclock/screenshot2.png | Bin 3072 -> 2935 bytes 4 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/terminalclock/ChangeLog b/apps/terminalclock/ChangeLog index 5560f00bc..6515ab627 100644 --- a/apps/terminalclock/ChangeLog +++ b/apps/terminalclock/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Rename "Activity" in "Motion" and display the true values for it diff --git a/apps/terminalclock/README.md b/apps/terminalclock/README.md index 2a2bc1204..5a54583d2 100644 --- a/apps/terminalclock/README.md +++ b/apps/terminalclock/README.md @@ -5,5 +5,5 @@ It can display : - time - date - hrm -- activity +- motion - steps diff --git a/apps/terminalclock/screenshot1.png b/apps/terminalclock/screenshot1.png index a0d41f4957fa8bd96572d2e126ed2aba38d68250..c0f472102e693991580127d67665cf9774a69440 100644 GIT binary patch literal 2878 zcmd5;_gjxZnP8pXdGw_lI-lIWzM-bLPxD@0nZ|EJj*FLjnK* z>66Y5Zjhw>v&2!*-az{+01~iRH;g?{&(xX$0Evy04#(XS0_KZYk7oBtWf3QK%FlEX z3dXWbO4Lu{oq2vLy1A@^j7Hi-U|?Wc$JT%Zfy|)6#+zfXLJSPiW+t8{s#`;BZg1ON z_}CdVuX;p!>4}fS8#PX6U)*jH(nx{8m&xBq#+FPkihCy3)f_9fL%{VBe%vOkfqxWA5t%SZbT$LSU&HXIbjcJ*2%1WsEqHqeKk3V=KdXcfxN`ie#79 z^PU`n=~VKP=DZKmON^MmZ=RH&4LEXn5k>GZfE4H70~RM1rb8NTU+4g&xyvWt5R89b z>-*4=yJ|Aps)hUcm)P#)Ea364TNMXpYxbq#EIGo)OB7uhyU z$9>6w79Lb{eQZ@R>Dp{cP4?|ym`s#fZo=w@2jF=rj+I#8f};Ce5k4k^uo44WChi~} ztW~CV)<~#vYGN$CsBp;a`ak9OSI~nAz)Z{;Yv@kjZ6Plyw^`$-@LM! zneCmDaW1(XwfL5`t5QlT>Rhj+Uq0`+GYh?Ox{i>(P+|zk{n}q|sPvO`8+MFgfgOY8 zG3(g2%iihZmpiUM^pX9`ws!wYsoD<<3heVa=p@9rg>n~<**-S>7|Wr<#=ooBZzEmO z-RH&NHLb@OsEzd>kNMfIH3yqbp#uV_7v=VL7+fwtfj*I+vsEq=LkkEOu{ZamNW5*4 z@oTqJ)^EnU8<}XYK4F92hji3A)9@tK1svM=k*egyqdU{> z<~{|F3c@FnGly#*@B^u#vp<80DU#(GrWWVimq5VqY{jM~Cw8hbNg}Sz#-75U#J8g- zMCm(~bC&fB@Ep^|!$^+ZEf%J=?5}@3P&F#Vr;(@Lrsts^&ksGV|L?yWKO=yp_d>`T=(7@?X6h$K0YjcZKYZ})Y9m2TC*NmgiC&b zMbRsj4knnCiR&Z2I=uptpYbkR%B<+$`x3mm1k$6simo-K4iQ04RPU!;;0W=$BomZxiKVb6VRns0SV zx8%?rfHPFMp0W``k4;_t4%P0vf+fQls;_h0d@>!5N}zYi7`ed^R&M@6?RvX@6OGpU zGbwo$9SpU@Zzq7cTEDxpNpG(5lC=!*;K1Hr8FEE9sql`g*W&R%ubW$F<5ZtNh-g2^Hi@imdz%c;ZCr21# z5%MzlD}oc~Mxx{qVcyumJCAG)OjmMv$weNJ2a!XT4goI$&$G1{)w}uh@QHebeox$S zk;e|w^^4F+fHM1-j^j*-KV;vZywv>sQuB-7roHh65CzIzL3a-JQjPrTPg{TDVh z6iS%Mj$N?b5t?1ekNl&K(F8q3$SH1@8dA!r^7iHX(3K2*HTL)DQ&bt#Nc+fcR$^Yp zixwOVL8{%7DZ!QTG^FFqjxy^j`eZdDJuN+|#8fxtT6<%b0hb<`v~<&JFcn{dr-wmGy;4ov?4V(>;zsWKPn+JZ28k8A)4v zA3NcW))mgCslSojO55`#UEYq2 zCtF`H$hy{J%xLJlpcCL)4CiVwY5{O%dKbv6;gYwf^|JW3k2^ICfqjnQ`R=mms{jhFKjJuGQJ-7rb5`O~yAb)q&M`?;U=R z%a`{N2~@^3A!+0B(}G87uRD0Sm_0BEkLpONC@1TIc7ND{?tGhN5d)jeGJ7Z9+<= zp$EK4odbq_s;agl3nImgUhZbsQx^-t0M?7uVb3RT+v;|Xr7Ed4D~@9SOx4SnOI~}I zDm?OAfnqz4B*{8Rhjlm&1C@ucqKN||=>v?y*n+{98mI?N%1RRp#UifiUc; zFfpP*nSbTCKWc(}(-k4kZ~QOkx517fe4#&`cDVG8DdPhE5^{W19yklRH2>&On91zqNZN}D-Kcz6I<^tBAdrVXY#PhkmRDrdo21}dSk z$-MXkOa@O3P<&nuF%avu*&!?}urk_WB-|Bh)QYRoK1J}zzIWHSWx9OZ-!4v~c@f_^2M5JPx-YJRo{H$Zl@<|1j?W?;^!dr?pZ(LIW{y M(h=)WZ;#LT50cG;Bme*a literal 2938 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 diff --git a/apps/terminalclock/screenshot2.png b/apps/terminalclock/screenshot2.png index 21d7aadbf31906cf0316459a9b21bc3ae32e0bc8..8bd552a730e49cc84db62211d36b351a26ee6b60 100644 GIT binary patch literal 2935 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 literal 3072 zcmd5;c{JNu8~#NkC8g9(5xSsK%e311ip1KeE)pdvT4JmfYptymob%rMJoi543R)Vb1_J;< z`hvZ!lPJFWXG%atE3NUHhbVv|oY2<5%a7`F0IDi|Lr{w@tzR@`g#Hl28fFjRX%caO?+yaDno7`yh}9BkaAt|1em(4_BCAA zQ*!c>%e7f5P;mAjI){JG;FND?gH+hwv5p__UgMIb!;(x@WgNv#efN8jR9km`+*V`q zizRks@uT2SS@NdfX8g-E4uBjzQ^y~4J5x+!$(B?0evjRFvh4yOTMWIK$oL*yt4j6T z`!=Mf|1GBit-iA_(g!C7OI^OL_Ko4cGz$MF(izJ8cA#F)>w)Uif+)CuLH2ES3&FD@ z(+Ul#!aM6_ag`2Fd6#hu0@{WG-sl9kghSZx<$lD5R7}g_`A*X94!qL6V$-8jW19$2 zNiExTdT%`9&}7g^aA>8N;PRL~gNL{Q0+$$8OJ_MVfo$i|x1SV^nRB_^NqdOY@_*oD z8&VIom}O*eo)7046}2zKa;VKL^O8AVQd`nxzToOczFcHp>q4w_7`;+qs$M?z{UM%A zdkVLH>NL|n{I!LdRo7lXlAb2JOk;@$7(#lLq(+QJ>)~^HUf86OJHDONjshOs0Q0Q0 z`5s31h4?ZjhHm+0&-Z)222IVgAt_>Q*JKhi$BSyL1&mNa*eQRh$ zDdw%@Cd2e{=J@QswG&qQa8bJL_Za@I%`DZ{SZ=Q8ERN*8T zNzUuDTLG;B@pOxGDBo7lA|^RsoW5>H(k>R|G`9PL&N89H?h^E$If}}Rsw_O8y4Jl2 z&s5ILZt(B_(d%&)a$f$y6|KNFb$F&OzsyX{F*IQyo-81*eaSw{OfAx@7)iq@I4Nk+ znJiJ7wJYLsiE>XakhI-)7TskK^%FDoI&|wsWsl3`0*Q6x0b#y219ojGU6n(mBWv0y z6M>0;q%{Rt%NnyJ?I1i0)M=!mUL|~$wqvu2F)!q?m7d1jCCjJ7xN(Vr@%k8h)HlzK zw1tY;lcUmMY09cBNQKxvk|ncRkYl0X=*Q1RQTt2EgU3ZrK7MI;A~71ewR!yQ4{_<` zH*0bH5o}u1D0NcO11Ew<*#BBKf*49JNAv1GMO_iE;>^^$ng4Y*{NcBCmAGTch1;|< zPdHy6f^fP_k5tcRKi93%`ie_+SIJyFzku*UNrthNE$CG$vJd{+rCof@rz*zGOxOZS znW_DV=Y7c?`fOobG%%CH!+-C8d&ig0kXT93(h^n>O+49Ikq444cBWd4Vh#V-Ls~VQ1EVEW{?xD>FHrdi^&o}sjLsD0g>ura3*y~-$ z^nID3qGZ;~P;+C9x6ImnuQFGG{FaHKGk#(ARmWoahG%yC zGEQ`Ksdw*ip{7#calh3VMEaoAP~4sBO^zT)Ak!Go3Vr)3kGeNv&H|{`XtCJ$!<_Z&24xc9sHC@%za*Yl^C?Cs<~nOMsgm}B+}q2U**}E z7S>SAe0vMGElvr(zy#pCc@hREz^xzCRaXscYsKnO*yGdIiYRvv&J!-mY(jVB6w|iB zMT;Y_l~{DblFogoNTp;uv*EmCthwt5ZjZ88|24i&100{5plHt!K6=+vWCmHDdGS~) zuW7*|Z15W~dLZ6!sXMM;=&&ihY}FvO93}f4I4|ik$`O$DHPeaC>O=4R6Dy&y1z@l_ z-2SwfCs~z{U-)e25CPn(kP~QpoR;fSwHOMiQ!r+_I&eQKKqxk2d0h)^m@G_%V0|>k z6)*C-kPvm%3KB@i_EtfZVv_=MKI50mn}gv&+-v+G)F6$2V?jovL2Te$79^F?zv;c# z>QOuI|COx{Y)n>wgRN$N|a zme1NGMklLG3SmBm#`8*dqq+pEcNs&?#_VvtvVfKy+l(EXseD+BxH|Dk!uy()1^ywz z)5GPd717|`tbiXj*MsfKZC@h}jNIISYjh&5*f5mZq`jSY$J1TA(L$BP)4l@siDCe} zd%MQM;YCe^-?2yK+uP*X5r5b*s3hTND>rKgjkt-s=QGv2h&M}pycP(dK=K+Bsz68q zb=Llxk^*?_xzQ)ocS%-JCwa^1B@1J@a5~S;3zHOmQ68e%j;*I<^@#ln$xo0A+8h4f z-&>mvLU!r6<>?Yuo$5?aaB;W{!Waz# zo1h-@4>3VANp>w!Pk$MFlHkU(#}oSv9GV-rm_xSfhy>Zfu2 zZf&3LtdB~bDSNoTOJsfS>+NFRB*gnV#atf#Ev$B0-Ua6Dim@hdUKGyn9_;MW4D_Eu zL|HeNhiVKUB2AVaZ)$(BW{aO@cEYqQu`M7&1p>qye%trhd4%$|$l&rqPk91WHzhZ{dqeM>}o_8e*DCf=`-0@(4g!77rUxLF+xT%z-9PI~%RTb@3> z%cE8!)5g&>az7S1=e9q?3_%-Q~OHpBhG19;u;E$Fp_asG8_0r^RG)n${Vtee9+z9{ft@ghNg< zVOYGbS!L3iu;qCV|&*iekW3CeS!HgU!$* zkd!Z^{_(%}VLe2;9X(0~ENUUxwjm=CR{7RpQTe%nd$Kn~>Q#3WU5u^$k>+PqI_17E zloVPz!FS9Oi+%Jie@kF_J@^;sR-kG`YbXo@w5%2txrn5T>emsDg>9*2=609jT$li@ zNVU`M_$0nN@6sZ@MhqIu=`}TU0L{yyU2o|kjIBgh$ttp?SH$@5n>R1Yi+IS}Huji{ jM6c{|gUSB|JP8lDilHZiwbMjjdf Date: Sun, 27 Feb 2022 12:15:35 +0100 Subject: [PATCH 20/29] Better usage of available space --- apps/circlesclock/app.js | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/apps/circlesclock/app.js b/apps/circlesclock/app.js index d5df2fe44..a6aa1a8b1 100644 --- a/apps/circlesclock/app.js +++ b/apps/circlesclock/app.js @@ -52,7 +52,7 @@ const colorGreen = '#008000'; const colorBlue = '#0000ff'; const colorYellow = '#ffff00'; const widgetOffset = showWidgets ? 24 : 0; -const dowOffset = circleCount == 3 ? 22 : 24; // dow offset relative to date +const dowOffset = circleCount == 3 ? 20 : 22; // dow offset relative to date const h = g.getHeight() - widgetOffset; const w = g.getWidth(); const hOffset = (circleCount == 3 ? 34 : 30) - widgetOffset; @@ -88,21 +88,24 @@ const circleFontBig = circleCount == 3 ? "Vector:16" : "Vector:12"; const iconOffset = circleCount == 3 ? 6 : 8; const defaultCircleTypes = ["steps", "hr", "battery", "weather"]; +function hideWidgets() { + /* + * we are not drawing the widgets as we are taking over the whole screen + * so we will blank out the draw() functions of each widget and change the + * area to the top bar doesn't get cleared. + */ + if (WIDGETS && typeof WIDGETS === "object") { + for (let wd of WIDGETS) { + wd.draw = () => {}; + wd.area = ""; + } + } +} function draw() { g.clear(true); if (!showWidgets) { - /* - * we are not drawing the widgets as we are taking over the whole screen - * so we will blank out the draw() functions of each widget and change the - * area to the top bar doesn't get cleared. - */ - if (WIDGETS && typeof WIDGETS === "object") { - for (let wd of WIDGETS) { - wd.draw = () => {}; - wd.area = ""; - } - } + hideWidgets(); } else { Bangle.drawWidgets(); } @@ -114,7 +117,7 @@ function draw() { g.setFontRobotoRegular50NumericOnly(); g.setFontAlign(0, -1); g.setColor(colorFg); - g.drawString(locale.time(new Date(), 1), w / 2, h1 + 8); + g.drawString(locale.time(new Date(), 1), w / 2, h1 + 6); now = Math.round(new Date().getTime() / 1000); // date & dow @@ -840,7 +843,6 @@ if (isCircleEnabled("hr")) { enableHRMSensor(); } - Bangle.setUI("clock"); Bangle.loadWidgets(); From 73aac6feabb7fe06c0f0447370588c8b9f7473ba Mon Sep 17 00:00:00 2001 From: copoer Date: Sun, 27 Feb 2022 09:36:36 -0400 Subject: [PATCH 21/29] Updated Edisons ball app to work on Bangle JS 2 --- apps/edisonsball/ChangeLog | 2 ++ apps/edisonsball/README.md | 2 +- apps/edisonsball/app.js | 21 +++++++++++++++++---- apps/edisonsball/metadata.json | 6 +++--- 4 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 apps/edisonsball/ChangeLog diff --git a/apps/edisonsball/ChangeLog b/apps/edisonsball/ChangeLog new file mode 100644 index 000000000..b71b8bb0d --- /dev/null +++ b/apps/edisonsball/ChangeLog @@ -0,0 +1,2 @@ +0.01: Initial version +0.02: Added BangleJS Two diff --git a/apps/edisonsball/README.md b/apps/edisonsball/README.md index b8e9ec106..a3b013b6d 100644 --- a/apps/edisonsball/README.md +++ b/apps/edisonsball/README.md @@ -1,4 +1,4 @@ -The application is based on a technique that Thomas Edison used to prevent falling asleep using a steel ball. Essentially the app starts with a display that shows the current HR value that the watch alarm is set to and this can be adjusted with buttons 1 and 3. This HR settng should be the approximate value you want the alarm to trigger and so you should ideally know both what your HR is currently and what your heartrate normally is during sleep. For your current HR according to the watch, you can simply use the HR monitor available in the Espruino app loader, and then from that you can choose a lower value as the target for the alarm and adjust as required. +The application is based on a technique that Thomas Edison used to prevent falling asleep using a steel ball. Essentially the app starts with a display that shows the current HR value that the watch alarm is set to and this can be adjusted with buttons 1 and 3 (Mapped to top touch and bottom touch on Bangle 2). This HR settng should be the approximate value you want the alarm to trigger and so you should ideally know both what your HR is currently and what your heartrate normally is during sleep. For your current HR according to the watch, you can simply use the HR monitor available in the Espruino app loader, and then from that you can choose a lower value as the target for the alarm and adjust as required. When you press the middle button on the side, the HR monitor starts, the alarm will trigger when your heart rate average drops to the limit you’ve set and has a certain level of steadiness that is determined by a assessing the variance over several readings - the sensitivity of this variance can be adjusted in a variable in the app's code under 'ADVANCED SETTINGS' if needed. The code also has a basic logging function which shows, in a CSV file, when you started the HR tracker and when the alarm was triggered. diff --git a/apps/edisonsball/app.js b/apps/edisonsball/app.js index 557155c9a..ab5def2f6 100644 --- a/apps/edisonsball/app.js +++ b/apps/edisonsball/app.js @@ -130,10 +130,23 @@ function checkHR() { } update_target_HR(); - -setWatch(btn1Pressed, BTN1, {repeat:true}); -setWatch(btn2Pressed, BTN2, {repeat:true}); -setWatch(btn3Pressed, BTN3, {repeat:true}); +if (process.env.HWVERSION==1) { + // Bangle 1 + setWatch(btn1Pressed, BTN1, {repeat:true}); + setWatch(btn2Pressed, BTN2, {repeat:true}); + setWatch(btn3Pressed, BTN3, {repeat:true}); +} else { + setWatch(btn2Pressed, BTN2, { repeat: true }); + // Bangle 2 + Bangle.on('touch', function(zone, e) { + if (e.y < g.getHeight() / 2) { + btn1Pressed(); + } + if (e.y > g.getHeight() / 2) { + btn3Pressed(); + } + }); +} Bangle.on('HRM',function(hrm) { diff --git a/apps/edisonsball/metadata.json b/apps/edisonsball/metadata.json index f429c7b67..dfeb4451e 100644 --- a/apps/edisonsball/metadata.json +++ b/apps/edisonsball/metadata.json @@ -2,11 +2,11 @@ "id": "edisonsball", "name": "Edison's Ball", "shortName": "Edison's Ball", - "version": "0.01", + "version": "0.02", "description": "Hypnagogia/Micro-Sleep alarm for experimental use in exploring sleep transition and combating drowsiness", "icon": "app-icon.png", - "tags": "", - "supports": ["BANGLEJS"], + "tags": "sleep,hyponagogia,quick,nap", + "supports": ["BANGLEJS", "BANGLEJS2"], "readme": "README.md", "storage": [ {"name":"edisonsball.app.js","url":"app.js"}, From 505872f0b84c86a4e45051a5625c11d7cbd6745c Mon Sep 17 00:00:00 2001 From: copoer Date: Sun, 27 Feb 2022 10:10:28 -0400 Subject: [PATCH 22/29] Fixed graphics --- apps/edisonsball/app.js | 66 +++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 22 deletions(-) diff --git a/apps/edisonsball/app.js b/apps/edisonsball/app.js index ab5def2f6..c0a4d27c6 100644 --- a/apps/edisonsball/app.js +++ b/apps/edisonsball/app.js @@ -3,6 +3,8 @@ var lower_limit_BPM = 49; var upper_limit_BPM = 140; var deviation_threshold = 3; +var ISBANGLEJS1 = process.env.HWVERSION==1; + var target_heartrate = 70; var heartrate_set; @@ -33,25 +35,39 @@ function btn2Pressed() { } function update_target_HR(){ - g.clear(); - g.setColor("#00ff7f"); - g.setFont("6x8", 4); - g.setFontAlign(0,0); // center font + if (process.env.HWVERSION==1) { + g.setColor("#00ff7f"); + g.setFont("6x8", 4); + g.setFontAlign(0,0); // center font - g.drawString(target_heartrate, 120,120); - g.setFont("6x8", 2); - g.setFontAlign(-1,-1); - g.drawString("-", 220, 200); - g.drawString("+", 220, 40); - g.drawString("GO", 210, 120); - - g.setColor("#ffffff"); - g.setFontAlign(0,0); // center font - g.drawString("target HR", 120,90); - - g.setFont("6x8", 1); - g.drawString("if unsure, start with 7-10%\n less than waking average and\n adjust as required", 120,170); + g.drawString(target_heartrate, 120,120); + g.setFont("6x8", 2); + g.setFontAlign(-1,-1); + g.drawString("-", 220, 200); + g.drawString("+", 220, 40); + g.drawString("GO", 210, 120); + + g.setColor("#ffffff"); + g.setFontAlign(0,0); // center font + g.drawString("target HR", 120,90); + + g.setFont("6x8", 1); + g.drawString("if unsure, start with 7-10%\n less than waking average and\n adjust as required", 120,170); + } else { + g.setFont("6x8", 4); + g.setFontAlign(0,0); // center font + g.drawString(target_heartrate, 88,88); + g.setFont("6x8", 2); + g.setFontAlign(-1,-1); + g.drawString("-", 160, 160); + g.drawString("+", 160, 10); + g.drawString("GO", 150, 88); + g.setFontAlign(0,0); // center font + g.drawString("target HR", 88,120); + g.setFont("6x8", 1); + g.drawString("if unsure, start with 7-10%\n less than waking average and\n adjust as required", 88,150); + } g.setFont("6x8",3); g.flip(); @@ -105,8 +121,13 @@ function checkHR() { average_HR = average(HR_samples).toFixed(0); stdev_HR = getStandardDeviation (HR_samples).toFixed(1); - g.drawString("HR: " + average_HR, 120,100); - g.drawString("STDEV: " + stdev_HR, 120,160); + if (ISBANGLEJS1) { + g.drawString("HR: " + average_HR, 120,100); + g.drawString("STDEV: " + stdev_HR, 120,160); + } else { + g.drawString("HR: " + average_HR, 60,70); + g.drawString("STDEV: " + stdev_HR, 80,70); + } HR_samples = []; if(average_HR < target_heartrate && stdev_HR < deviation_threshold){ @@ -130,14 +151,15 @@ function checkHR() { } update_target_HR(); -if (process.env.HWVERSION==1) { + +if (ISBANGLEJS1) { // Bangle 1 setWatch(btn1Pressed, BTN1, {repeat:true}); setWatch(btn2Pressed, BTN2, {repeat:true}); setWatch(btn3Pressed, BTN3, {repeat:true}); } else { - setWatch(btn2Pressed, BTN2, { repeat: true }); // Bangle 2 + setWatch(btn2Pressed, BTN1, { repeat: true }); Bangle.on('touch', function(zone, e) { if (e.y < g.getHeight() / 2) { btn1Pressed(); @@ -148,8 +170,8 @@ if (process.env.HWVERSION==1) { }); } -Bangle.on('HRM',function(hrm) { +Bangle.on('HRM',function(hrm) { if(trigger_count < 2){ if (firstBPM) firstBPM=false; // ignore the first one as it's usually rubbish From 866cfb8c6bbb3aa82e919108e724f33f5cd7ed61 Mon Sep 17 00:00:00 2001 From: copoer Date: Sun, 27 Feb 2022 10:13:07 -0400 Subject: [PATCH 23/29] Fixed graphics --- apps/edisonsball/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/edisonsball/app.js b/apps/edisonsball/app.js index c0a4d27c6..a600d8fc8 100644 --- a/apps/edisonsball/app.js +++ b/apps/edisonsball/app.js @@ -64,7 +64,7 @@ function update_target_HR(){ g.drawString("+", 160, 10); g.drawString("GO", 150, 88); g.setFontAlign(0,0); // center font - g.drawString("target HR", 88,120); + g.drawString("target HR", 88,70); g.setFont("6x8", 1); g.drawString("if unsure, start with 7-10%\n less than waking average and\n adjust as required", 88,150); } From 21dc7a074db98c9b8bfabde67873316ba863771a Mon Sep 17 00:00:00 2001 From: copoer Date: Sun, 27 Feb 2022 10:19:07 -0400 Subject: [PATCH 24/29] Fixed graphics --- apps/edisonsball/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/edisonsball/app.js b/apps/edisonsball/app.js index a600d8fc8..2aa317829 100644 --- a/apps/edisonsball/app.js +++ b/apps/edisonsball/app.js @@ -64,7 +64,7 @@ function update_target_HR(){ g.drawString("+", 160, 10); g.drawString("GO", 150, 88); g.setFontAlign(0,0); // center font - g.drawString("target HR", 88,70); + g.drawString("target HR", 88,65); g.setFont("6x8", 1); g.drawString("if unsure, start with 7-10%\n less than waking average and\n adjust as required", 88,150); } @@ -125,8 +125,8 @@ function checkHR() { g.drawString("HR: " + average_HR, 120,100); g.drawString("STDEV: " + stdev_HR, 120,160); } else { - g.drawString("HR: " + average_HR, 60,70); - g.drawString("STDEV: " + stdev_HR, 80,70); + g.drawString("HR: " + average_HR, 88,60); + g.drawString("STDEV: " + stdev_HR, 88,90); } HR_samples = []; if(average_HR < target_heartrate && stdev_HR < deviation_threshold){ From 8513f34f2ac81550b4c1dbd8211fd986fc900202 Mon Sep 17 00:00:00 2001 From: Marco H Date: Sun, 27 Feb 2022 18:23:47 +0100 Subject: [PATCH 25/29] Update changelog for v0.11 --- apps/circlesclock/ChangeLog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/circlesclock/ChangeLog b/apps/circlesclock/ChangeLog index 7165f8521..46eddd32b 100644 --- a/apps/circlesclock/ChangeLog +++ b/apps/circlesclock/ChangeLog @@ -20,3 +20,6 @@ Color depending on value (green -> red, red -> green) option Good HRM value will not be overwritten so fast anymore 0.10: Use roboto font for time, date and day of week and center align them +0.11: New color option: foreground color + Improve performance, reduce memory usage + Small optical adjustments From 4cff0792f604e19b710605d9cc4d3507c42eeee2 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Wed, 16 Feb 2022 22:44:36 +0100 Subject: [PATCH 26/29] Buzz on every measurement and longer if all are done --- apps/bthrv/ChangeLog | 1 + apps/bthrv/app.js | 6 +++++- apps/bthrv/metadata.json | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/bthrv/ChangeLog b/apps/bthrv/ChangeLog index e144fd8f9..eefadac78 100644 --- a/apps/bthrv/ChangeLog +++ b/apps/bthrv/ChangeLog @@ -1,2 +1,3 @@ 0.01: New App! 0.02: Write available data on reset or kill +0.03: Buzz short on every finished measurement and longer if all are done diff --git a/apps/bthrv/app.js b/apps/bthrv/app.js index 067c84f56..fbd0e2d05 100644 --- a/apps/bthrv/app.js +++ b/apps/bthrv/app.js @@ -75,7 +75,6 @@ function write(){ data += "," + rrMax + "," + rrMin + ","+rrNumberOfValues; data += "\n"; file.write(data); - Bangle.buzz(500); } function onBtHrm(e) { @@ -87,6 +86,11 @@ function onBtHrm(e) { if (currentSlot <= hrvSlots.length && (Date.now() - startingTime) > (hrvSlots[currentSlot] * 1000) && !hrvValues[hrvSlots[currentSlot]]){ hrvValues[hrvSlots[currentSlot]] = hrv; currentSlot++; + if (currentSlot == hrvSlots.length){ + Bangle.buzz(500) + } else { + Bangle.buzz(50); + } } } diff --git a/apps/bthrv/metadata.json b/apps/bthrv/metadata.json index 183008034..7c57be682 100644 --- a/apps/bthrv/metadata.json +++ b/apps/bthrv/metadata.json @@ -2,7 +2,7 @@ "id": "bthrv", "name": "Bluetooth Heart Rate variance calculator", "shortName": "BT HRV", - "version": "0.02", + "version": "0.03", "description": "Calculates HRV from a a BT HRM with interval data", "icon": "app.png", "type": "app", From 48d8fae37c04b19dfae172316b4a721e7c881463 Mon Sep 17 00:00:00 2001 From: DC959 Date: Mon, 28 Feb 2022 22:07:33 +1300 Subject: [PATCH 27/29] Fix date alignment and change font to closer match Rolex --- apps/rolex/ChangeLog | 3 ++- apps/rolex/README.md | 4 +++- apps/rolex/app.js | 17 +++++++++++------ apps/rolex/app.js:Zone.Identifier | 3 +++ apps/rolex/screenshot1.png | Bin 0 -> 3905 bytes apps/rolex/screenshot1.png:Zone.Identifier | 3 +++ 6 files changed, 22 insertions(+), 8 deletions(-) create mode 100644 apps/rolex/app.js:Zone.Identifier create mode 100644 apps/rolex/screenshot1.png create mode 100644 apps/rolex/screenshot1.png:Zone.Identifier diff --git a/apps/rolex/ChangeLog b/apps/rolex/ChangeLog index 3bfed4a4e..a1e2cee0a 100644 --- a/apps/rolex/ChangeLog +++ b/apps/rolex/ChangeLog @@ -1,3 +1,4 @@ 0.01: Initial Release 0.02: Minor tweaks for light theme -0.03: Made images 2 bit and fixed theme honoring \ No newline at end of file +0.03: Made images 2 bit and fixed theme honoring +0.04: Fixed date font alignment and changed date font to match a real Rolex diff --git a/apps/rolex/README.md b/apps/rolex/README.md index 4c24aad0c..5339f1d0e 100644 --- a/apps/rolex/README.md +++ b/apps/rolex/README.md @@ -1,11 +1,13 @@ # Rolex -![](screenshot.png) +![](screenshot.png) ![](screenshot1.png) Created with the aid of the Espruino documentation and looking through many of the wonderful exising watchfaces that have been made. This has not been tested on a watch yet as I haven't aquired one but has been tested in the emulator. The hands don't rotate dead on center but they're as close as I could get them to. +Colour switches based on watch theme so if you want a white on black change your watch theme to dark, and for black on white change it to light. + Special thanks to: * rozek (for his updated widget draw code for utilization with background images) * Gordon Williams (Bangle.js, watchapps for reference code and documentation) diff --git a/apps/rolex/app.js b/apps/rolex/app.js index e409704fc..124cb6fee 100644 --- a/apps/rolex/app.js +++ b/apps/rolex/app.js @@ -28,6 +28,14 @@ var imgSec = { buffer : E.toArrayBuffer(atob("v/q//r/+v/qv+q/qq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qv+v/6/D/wD8PDw8PwD/w///6v+qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqr+r//v///X/1X/Vf9V/1X/1///+//q/qq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq+qr6qvqq6qrqg==")) }; +/* use font closer to Rolex */ + +Graphics.prototype.setFontRolexFont = function(scale) { + // Actual height 12 (12 - 1) + this.setFontCustom(atob("AAAABAACAAAAAYAHgA4AOABgAAAAA/gD/gMBgQBAwGA/4A/gAAAAAAIBAQCB/8D/4AAQAAAAAAAAAwEDAYEBQIEgYxA/CA4MAAAAAAAAgIBAhCBCEDOYHvgCOAAAAAAABgANAAyAHEAf/A/+AAgABAAAAAAADBAcCBsECYIEYgIeAAAAAAAHwAfwB5wGggZBAjGBH4CDgAAACAAYAAgABAMCDwE+APgAYAAAAAAABxwH3wJwgRhA3iB54AhgAAAAAAPhA/iBDMCCQGHgH+AHwAAAAAAAQIAgQAAAAAA="), 46, atob("BAUJCQkJCQkJCQkJBQ=="), 17+(scale<<8)+(1<<16)); + return this; +}; + /* Set variables to get screen width, height and center points */ let W = g.getWidth(); @@ -36,10 +44,6 @@ let cx = W/2; let cy = H/2; let Timeout; -/* set font */ - -require("Font4x5Numeric").add(Graphics); - Bangle.loadWidgets(); /* Custom version of Bangle.drawWidgets (does not clear the widget areas) Thanks to rozek */ @@ -106,9 +110,10 @@ function drawHands() { g.drawImage(imgHour,cx-22*hourSin,cy+22*hourCos,{rotate:hourAngle}); g.drawImage(imgMin,cx-34*minSin,cy+34*minCos,{rotate:minAngle}); g.drawImage(imgSec,cx-25*secSin,cy+25*secCos,{rotate:secAngle}); - g.setFont("4x5Numeric:3"); + g.setFontRolexFont(); g.setColor(g.theme.bg); - g.drawString(d.getDate(),157,81); + g.setFontAlign(0,0,0); + g.drawString(d.getDate(),165,89); } function drawBackground() { diff --git a/apps/rolex/app.js:Zone.Identifier b/apps/rolex/app.js:Zone.Identifier new file mode 100644 index 000000000..053d1127c --- /dev/null +++ b/apps/rolex/app.js:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +HostUrl=about:internet diff --git a/apps/rolex/screenshot1.png b/apps/rolex/screenshot1.png new file mode 100644 index 0000000000000000000000000000000000000000..f84b0ef5c3ef50356dc790e36e51d0a99cabe16f GIT binary patch literal 3905 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 literal 0 HcmV?d00001 diff --git a/apps/rolex/screenshot1.png:Zone.Identifier b/apps/rolex/screenshot1.png:Zone.Identifier new file mode 100644 index 000000000..053d1127c --- /dev/null +++ b/apps/rolex/screenshot1.png:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +ZoneId=3 +HostUrl=about:internet From 08c9e519b99982c57a3f53c16693b33f503a6f4b Mon Sep 17 00:00:00 2001 From: DC959 Date: Mon, 28 Feb 2022 22:11:19 +1300 Subject: [PATCH 28/29] Fix date alignment and change font to closer match Rolex --- apps/rolex/app.js:Zone.Identifier | 3 --- apps/rolex/screenshot1.png:Zone.Identifier | 3 --- 2 files changed, 6 deletions(-) delete mode 100644 apps/rolex/app.js:Zone.Identifier delete mode 100644 apps/rolex/screenshot1.png:Zone.Identifier diff --git a/apps/rolex/app.js:Zone.Identifier b/apps/rolex/app.js:Zone.Identifier deleted file mode 100644 index 053d1127c..000000000 --- a/apps/rolex/app.js:Zone.Identifier +++ /dev/null @@ -1,3 +0,0 @@ -[ZoneTransfer] -ZoneId=3 -HostUrl=about:internet diff --git a/apps/rolex/screenshot1.png:Zone.Identifier b/apps/rolex/screenshot1.png:Zone.Identifier deleted file mode 100644 index 053d1127c..000000000 --- a/apps/rolex/screenshot1.png:Zone.Identifier +++ /dev/null @@ -1,3 +0,0 @@ -[ZoneTransfer] -ZoneId=3 -HostUrl=about:internet From 6ed617949b1317274aefe7e5bcc8e58003c3792f Mon Sep 17 00:00:00 2001 From: Daniel Cox Date: Mon, 28 Feb 2022 22:22:26 +1300 Subject: [PATCH 29/29] Update metadata.json --- apps/rolex/metadata.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/rolex/metadata.json b/apps/rolex/metadata.json index e24344dad..f307e60c4 100644 --- a/apps/rolex/metadata.json +++ b/apps/rolex/metadata.json @@ -2,8 +2,8 @@ "name": "rolex", "shortName":"rolex", "icon": "rolex.png", - "screenshots": [{"url":"screenshot.png"}], - "version":"0.03", + "screenshots": [{"url":"screenshot1.png"}], + "version":"0.04", "description": "A rolex like watch face", "tags": "clock", "type": "clock", @@ -14,4 +14,4 @@ {"name":"rolex.app.js","url":"app.js"}, {"name":"rolex.img","url":"app-icon.js","evaluate":true} ] - } \ No newline at end of file + }