From 29432bb9f83aad7cb38b9f3a3feb3620f8d1e205 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Wed, 23 Feb 2022 09:24:33 +0100 Subject: [PATCH 01/46] Add screenshot --- apps/smclock/metadata.json | 1 + apps/smclock/screenshot.png | Bin 0 -> 2845 bytes 2 files changed, 1 insertion(+) create mode 100644 apps/smclock/screenshot.png diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index 1783ca7bf..febbdd01c 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -3,6 +3,7 @@ "name":"Monogram Watch Face", "shortName":"MonoClock", "icon":"app.png", + "screenshots": [{"url":"screenshot.png"}], "version":"0.02", "description": "A simple watchface based on my stylised monogram.", "tags":"clock", diff --git a/apps/smclock/screenshot.png b/apps/smclock/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..c0e0bd0eed06e2c77e0ad737b1ecd4814a8e4f65 GIT binary patch literal 2845 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 YUdx_>rDxQ4@7%ip9M&0AYD0|sC!%XI-v9sr literal 0 HcmV?d00001 From 812c8ba7c1a228ca33eb162b80f7ed85b22acc01 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Fri, 25 Feb 2022 21:54:38 +0100 Subject: [PATCH 02/46] Introduce settings --- apps/smclock/README.md | 18 +++++++ apps/smclock/app.js | 20 ++++--- apps/smclock/metadata.json | 1 + apps/smclock/settings.js | 108 +++++++++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 8 deletions(-) create mode 100644 apps/smclock/settings.js diff --git a/apps/smclock/README.md b/apps/smclock/README.md index 7b5613147..635292d0c 100644 --- a/apps/smclock/README.md +++ b/apps/smclock/README.md @@ -3,3 +3,21 @@ Just a simple watch face for the Banglejs2. It shows battery level in the upper left corner, date information in the upper right, and time information in the bottom. + +![](screenshot.png) + +## Settings + +**Analog Clock:** + +**Human Readable Date:** When the setting is on, the date is shown in a more human-friendly format (e.g. "Oct 2"), otherwise the date is shown in a standard format (e.g. "02/10"). Default is off. + +**Show Week Info:** When the setting is on, the weekday and week number are shown in the upper right box. When the setting is off, the full year is shown instead. Default is off. + +**Vector Font:** When the setting is on, the app uses Espruino's vector font, otherwise it uses the default font. Default is off. + +## Using the app + +Monogram Watch Face can be selected as the default clock or it can be run manually from the launcher. Its settings can be accessed and changed via the relevant menu. + +Tapping on the "Alerts" area will replace the current time display with the time of the most immediate alert. diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 6aff72a46..9b0ec85d0 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -1,13 +1,17 @@ +const SETTINGSFILE = "smclock.json"; const background = { - width : 176, height : 176, bpp : 3, - transparent : 1, + width : 176, height : 176, bpp : 3, transparent : 1, buffer : require("heatshrink").decompress(atob("/4A/AH4ACUb8H9MkyVJAThB/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/INP/AH4A/AAX8Yz4Afn5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/INI=")) }; - +const monthName = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; const weekday = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]; -var level = -1; -function ISO8601_week_no(date) { //copied from: https://gist.github.com/IamSilviu/5899269#gistcomment-3035480 +// dynamic variables +var batLevel = -1; +var batColor = [0,0,0]; + +// copied from: https://gist.github.com/IamSilviu/5899269#gistcomment-3035480 +function ISO8601_week_no(date) { var tdt = new Date(date.valueOf()); var dayn = (date.getDay() + 6) % 7; tdt.setDate(tdt.getDate() - dayn + 3); @@ -24,8 +28,8 @@ function d02(value) { } function pollBattery() { - level = E.getBattery(); - return level; + batLevel = E.getBattery(); + return batLevel; } function getBatteryColor(level) { @@ -100,7 +104,7 @@ Bangle.on('lcdPower',on=>{ drawInterval = setInterval(draw, 10000); pollBattery(); - draw(); // draw immediately + draw(); } }); diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index febbdd01c..79d996f2c 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -12,6 +12,7 @@ "allow_emulator": true, "storage": [ {"name":"smclock.app.js","url":"app.js"}, + {"name":"smclock.settings.js","url":"settings.js"}, {"name":"smclock.img","url":"app-icon.js","evaluate":true} ] } diff --git a/apps/smclock/settings.js b/apps/smclock/settings.js new file mode 100644 index 000000000..bfc738e19 --- /dev/null +++ b/apps/smclock/settings.js @@ -0,0 +1,108 @@ +// Settings menu for Monogram Watch Face +// Anton Clock settings were used as template + +(function(back) { + var FILE = "smclock.json"; + // Load settings + var settings = Object.assign({ + secondsOnUnlock: false, + }, require('Storage').readJSON(FILE, true) || {}); + + function writeSettings() { + require('Storage').writeJSON(FILE, settings); + } + + // Helper method which uses int-based menu item for set of string values + function stringItems(startvalue, writer, values) { + return { + value: (startvalue === undefined ? 0 : values.indexOf(startvalue)), + format: v => values[v], + min: 0, + max: values.length - 1, + wrap: true, + step: 1, + onchange: v => { + writer(values[v]); + writeSettings(); + } + }; + } + + // Helper method which breaks string set settings down to local settings object + function stringInSettings(name, values) { + return stringItems(settings[name], v => settings[name] = v, values); + } + + var mainmenu = { + "": { + "title": "Monogram Clock" + }, + "< Back": () => back(), + "Seconds...": () => E.showMenu(secmenu), + "Date": stringInSettings("dateOnMain", ["Long", "Short", "ISO8601"]), + "Show Weekday": { + value: (settings.weekDay !== undefined ? settings.weekDay : true), + format: v => v ? "On" : "Off", + onchange: v => { + settings.weekDay = v; + writeSettings(); + } + }, + "Show CalWeek": { + value: (settings.calWeek !== undefined ? settings.calWeek : false), + format: v => v ? "On" : "Off", + onchange: v => { + settings.calWeek = v; + writeSettings(); + } + }, + "Uppercase": { + value: (settings.upperCase !== undefined ? settings.upperCase : true), + format: v => v ? "On" : "Off", + onchange: v => { + settings.upperCase = v; + writeSettings(); + } + }, + "Vector font": { + value: (settings.vectorFont !== undefined ? settings.vectorFont : false), + format: v => v ? "On" : "Off", + onchange: v => { + settings.vectorFont = v; + writeSettings(); + } + }, + }; + + // Submenu + var secmenu = { + "": { + "title": "Show seconds..." + }, + "< Back": () => E.showMenu(mainmenu), + "Show": stringInSettings("secondsMode", ["Never", "Unlocked", "Always"]), + "With \":\"": { + value: (settings.secondsWithColon !== undefined ? settings.secondsWithColon : true), + format: v => v ? "On" : "Off", + onchange: v => { + settings.secondsWithColon = v; + writeSettings(); + } + }, + "Color": { + value: (settings.secondsColoured !== undefined ? settings.secondsColoured : true), + format: v => v ? "On" : "Off", + onchange: v => { + settings.secondsColoured = v; + writeSettings(); + } + }, + "Date": stringInSettings("dateOnSecs", ["Year", "Weekday", "No"]) + }; + + // Actually display the menu + E.showMenu(mainmenu); + +}); + +// end of file From ac29a4f5a54aad523f8cf68047103dd46be1f17a Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Sun, 27 Feb 2022 23:22:32 +0100 Subject: [PATCH 03/46] Fix battery color --- apps/smclock/app.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 9b0ec85d0..b900e4d9e 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -29,13 +29,13 @@ function d02(value) { function pollBattery() { batLevel = E.getBattery(); - return batLevel; } function getBatteryColor(level) { var color; if (level < 0) { - level = pollBattery(); + pollBattery(); + level = batLevel; } if(level>80) { color = [0,0,1]; @@ -54,7 +54,7 @@ function getBatteryColor(level) { function draw() { g.drawImage(background); - const color = getBatteryColor(); + const color = getBatteryColor(batLevel); const bat = d02(E.getBattery()) + "%"; const d = new Date(); const day = d.getDate(); From 955acf2696634490ca200930c02a919d57530dc7 Mon Sep 17 00:00:00 2001 From: Erik Andresen Date: Mon, 28 Feb 2022 22:10:00 +0100 Subject: [PATCH 04/46] gpsautotime: Set Bangle.js 2 compatible --- apps/gpsautotime/ChangeLog | 1 + apps/gpsautotime/metadata.json | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/gpsautotime/ChangeLog b/apps/gpsautotime/ChangeLog index 5560f00bc..2827c9e5c 100644 --- a/apps/gpsautotime/ChangeLog +++ b/apps/gpsautotime/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Set Bangle.js 2 compatible diff --git a/apps/gpsautotime/metadata.json b/apps/gpsautotime/metadata.json index a64a45f6d..766961276 100644 --- a/apps/gpsautotime/metadata.json +++ b/apps/gpsautotime/metadata.json @@ -2,12 +2,12 @@ "id": "gpsautotime", "name": "GPS auto time", "shortName": "GPS auto time", - "version": "0.01", + "version": "0.02", "description": "A widget that automatically updates the Bangle.js time to the GPS time whenever there is a valid GPS fix.", "icon": "widget.png", "type": "widget", "tags": "widget,gps", - "supports": ["BANGLEJS"], + "supports": ["BANGLEJS","BANGLEJS2"], "storage": [ {"name":"gpsautotime.wid.js","url":"widget.js"} ] From dd906e076f9fbdf382248c493b780245eedc3b93 Mon Sep 17 00:00:00 2001 From: Rarder44 Date: Tue, 1 Mar 2022 19:03:09 +0100 Subject: [PATCH 05/46] added clear for fix the trasparent widget bar if there are no widgets --- apps/dtlaunch/app-b2.js | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/dtlaunch/app-b2.js b/apps/dtlaunch/app-b2.js index 96e562add..35cec3da9 100644 --- a/apps/dtlaunch/app-b2.js +++ b/apps/dtlaunch/app-b2.js @@ -125,5 +125,6 @@ Bangle.on("touch",(_,p)=>{ }); Bangle.loadWidgets(); +g.clear(); Bangle.drawWidgets(); drawPage(0); From ef815f230c7df50d9e4541253866b34aac2cb0bd Mon Sep 17 00:00:00 2001 From: Rarder44 Date: Tue, 1 Mar 2022 19:13:49 +0100 Subject: [PATCH 06/46] added option to exit the launcher with one click --- apps/dtlaunch/app-b2.js | 4 ++++ apps/dtlaunch/settings-b2.js | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/apps/dtlaunch/app-b2.js b/apps/dtlaunch/app-b2.js index 35cec3da9..e0f7f825f 100644 --- a/apps/dtlaunch/app-b2.js +++ b/apps/dtlaunch/app-b2.js @@ -6,8 +6,12 @@ var settings = Object.assign({ showClocks: true, showLaunchers: true, direct: false, + oneClickExit:false }, require('Storage').readJSON("dtlaunch.json", true) || {}); +if( settings.oneClickExit) + setWatch(_=> load(), BTN1); + var s = require("Storage"); var apps = s.list(/\.info$/).map(app=>{ var a=s.readJSON(app,1); diff --git a/apps/dtlaunch/settings-b2.js b/apps/dtlaunch/settings-b2.js index 7f667d213..8eca46a7e 100644 --- a/apps/dtlaunch/settings-b2.js +++ b/apps/dtlaunch/settings-b2.js @@ -4,7 +4,8 @@ var settings = Object.assign({ showClocks: true, showLaunchers: true, - direct: false + direct: false, + oneClickExit:false }, require('Storage').readJSON(FILE, true) || {}); function writeSettings() { @@ -37,6 +38,14 @@ settings.direct = v; writeSettings(); } + }, + 'One click exit': { + value: settings.oneClickExit, + format: v => v?"On":"Off", + onchange: v => { + settings.oneClickExit = v; + writeSettings(); + } } }); }) From f0e6190c16550be503b8ab38ae346542b0a7a21d Mon Sep 17 00:00:00 2001 From: Rarder44 Date: Wed, 2 Mar 2022 11:23:18 +0100 Subject: [PATCH 07/46] edit version and changelog --- apps/dtlaunch/ChangeLog | 2 ++ apps/dtlaunch/metadata.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/dtlaunch/ChangeLog b/apps/dtlaunch/ChangeLog index 556472eaa..811784b39 100644 --- a/apps/dtlaunch/ChangeLog +++ b/apps/dtlaunch/ChangeLog @@ -6,3 +6,5 @@ 0.06: Adds settings page (hide clocks or launchers) 0.07: Adds setting for directly launching app on touch for Bangle 2 0.08: Optimize line wrapping for Bangle 2 +0.09: fix the trasparent widget bar if there are no widgets for Bangle 2 +0.10: added "one click exit" setting for Bangle 2 diff --git a/apps/dtlaunch/metadata.json b/apps/dtlaunch/metadata.json index 6cd1dbe73..7a4094e54 100644 --- a/apps/dtlaunch/metadata.json +++ b/apps/dtlaunch/metadata.json @@ -1,7 +1,7 @@ { "id": "dtlaunch", "name": "Desktop Launcher", - "version": "0.08", + "version": "0.10", "description": "Desktop style App Launcher with six (four for Bangle 2) apps per page - fast access if you have lots of apps installed.", "screenshots": [{"url":"shot1.png"},{"url":"shot2.png"},{"url":"shot3.png"}], "icon": "icon.png", From 4150874534ee5830e713d86855726793567b6255 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Wed, 2 Mar 2022 16:34:35 +0100 Subject: [PATCH 08/46] Write settings file --- apps/smclock/settings.js | 117 ++++++++++++++++----------------------- 1 file changed, 47 insertions(+), 70 deletions(-) diff --git a/apps/smclock/settings.js b/apps/smclock/settings.js index bfc738e19..9d747a910 100644 --- a/apps/smclock/settings.js +++ b/apps/smclock/settings.js @@ -1,108 +1,85 @@ -// Settings menu for Monogram Watch Face +// settings menu for Monogram Watch Face // Anton Clock settings were used as template +// helper functions taken from Anton Clock -(function(back) { +(function (back) { var FILE = "smclock.json"; - // Load settings - var settings = Object.assign({ - secondsOnUnlock: false, - }, require('Storage').readJSON(FILE, true) || {}); + // load settings from the file + // assign default values if it doesn't exist + var settings = Object.assign( + { + dateFormat: "short", + showAnalogFace: false, + showWeekInfo: false, + useVectorFont: true, + }, + require("Storage").readJSON(FILE, true) || {} + ); + // write the new settings to the file function writeSettings() { - require('Storage').writeJSON(FILE, settings); + require("Storage").writeJSON(FILE, settings); } - // Helper method which uses int-based menu item for set of string values + // helper method which uses int-based menu item for set of string values function stringItems(startvalue, writer, values) { return { - value: (startvalue === undefined ? 0 : values.indexOf(startvalue)), - format: v => values[v], + value: startvalue === undefined ? 0 : values.indexOf(startvalue), + format: (v) => values[v], min: 0, max: values.length - 1, wrap: true, step: 1, - onchange: v => { + onchange: (v) => { writer(values[v]); writeSettings(); - } + }, }; } - // Helper method which breaks string set settings down to local settings object + // helper method which breaks string set settings down to local settings object function stringInSettings(name, values) { - return stringItems(settings[name], v => settings[name] = v, values); + return stringItems(settings[name], (v) => (settings[name] = v), values); } + // settings menu var mainmenu = { "": { - "title": "Monogram Clock" + title: "Monogram Clock", }, "< Back": () => back(), - "Seconds...": () => E.showMenu(secmenu), - "Date": stringInSettings("dateOnMain", ["Long", "Short", "ISO8601"]), - "Show Weekday": { - value: (settings.weekDay !== undefined ? settings.weekDay : true), - format: v => v ? "On" : "Off", - onchange: v => { - settings.weekDay = v; + "Analog Face": { + value: + settings.showAnalogFace !== undefined ? settings.showAnalogFace : false, + format: (v) => (v ? "On" : "Off"), + onchange: (v) => { + settings.showAnalogFace = v; writeSettings(); - } + }, }, - "Show CalWeek": { - value: (settings.calWeek !== undefined ? settings.calWeek : false), - format: v => v ? "On" : "Off", - onchange: v => { - settings.calWeek = v; + Date: stringInSettings("dateOnMain", ["Long", "Short", "ISO8601"]), + "Week Info": { + value: + settings.showWeekInfo !== undefined ? settings.showWeekInfo : false, + format: (v) => (v ? "On" : "Off"), + onchange: (v) => { + settings.showWeekInfo = v; writeSettings(); - } + }, }, - "Uppercase": { - value: (settings.upperCase !== undefined ? settings.upperCase : true), - format: v => v ? "On" : "Off", - onchange: v => { - settings.upperCase = v; + "Vector Font": { + value: + settings.useVectorFont !== undefined ? settings.useVectorFont : false, + format: (v) => (v ? "On" : "Off"), + onchange: (v) => { + settings.useVectorFont = v; writeSettings(); - } + }, }, - "Vector font": { - value: (settings.vectorFont !== undefined ? settings.vectorFont : false), - format: v => v ? "On" : "Off", - onchange: v => { - settings.vectorFont = v; - writeSettings(); - } - }, - }; - - // Submenu - var secmenu = { - "": { - "title": "Show seconds..." - }, - "< Back": () => E.showMenu(mainmenu), - "Show": stringInSettings("secondsMode", ["Never", "Unlocked", "Always"]), - "With \":\"": { - value: (settings.secondsWithColon !== undefined ? settings.secondsWithColon : true), - format: v => v ? "On" : "Off", - onchange: v => { - settings.secondsWithColon = v; - writeSettings(); - } - }, - "Color": { - value: (settings.secondsColoured !== undefined ? settings.secondsColoured : true), - format: v => v ? "On" : "Off", - onchange: v => { - settings.secondsColoured = v; - writeSettings(); - } - }, - "Date": stringInSettings("dateOnSecs", ["Year", "Weekday", "No"]) }; // Actually display the menu E.showMenu(mainmenu); - }); // end of file From 4ddf8a94fbb36bd663fbc018c5f92c9e0d2e2e8b Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Mar 2022 09:36:11 -0800 Subject: [PATCH 09/46] Update ChangeLog --- apps/smclock/ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/smclock/ChangeLog b/apps/smclock/ChangeLog index b029d805d..77098b0ad 100644 --- a/apps/smclock/ChangeLog +++ b/apps/smclock/ChangeLog @@ -1,2 +1,3 @@ 0.01: Initial version 0.02: Add battery level +0.03: fix battery level displaying From d64f945eff1ecbdc4507dfdcef4c6039cc2f1e75 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Mar 2022 09:36:31 -0800 Subject: [PATCH 10/46] Update app.js --- apps/smclock/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 6aff72a46..84942e0ef 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -51,7 +51,7 @@ function draw() { g.drawImage(background); const color = getBatteryColor(); - const bat = d02(E.getBattery()) + "%"; + const bat = E.getBattery() + "%"; const d = new Date(); const day = d.getDate(); const month = (d.getMonth() + 1); @@ -78,7 +78,7 @@ function draw() { g.setFont("Vector", 16); g.drawString("Bat:", 12, 22, false); g.setColor(color[0], color[1], color[2]); - g.drawString(bat, 52, 22, false); + g.drawString(bat, 46, 22, false); } g.clear(); From 136cbe28e12b78f4a45b838ecfc3c357784c2d53 Mon Sep 17 00:00:00 2001 From: Ronin0000 <89286474+Ronin0000@users.noreply.github.com> Date: Wed, 2 Mar 2022 09:36:46 -0800 Subject: [PATCH 11/46] Update metadata.json --- apps/smclock/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index 1783ca7bf..e2fbeace1 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -3,7 +3,7 @@ "name":"Monogram Watch Face", "shortName":"MonoClock", "icon":"app.png", - "version":"0.02", + "version":"0.03", "description": "A simple watchface based on my stylised monogram.", "tags":"clock", "readme":"README.md", From 4521873a53e65a51699fc3dbfb9d533690c48ff6 Mon Sep 17 00:00:00 2001 From: hughbarney Date: Wed, 2 Mar 2022 19:21:41 +0000 Subject: [PATCH 12/46] Daisy: added heart rate, update steps on each step --- apps/daisy/ChangeLog | 1 + apps/daisy/README.md | 15 +-- apps/daisy/app.js | 198 ++++++++++++++++++++++++++------------- apps/daisy/metadata.json | 2 +- 4 files changed, 142 insertions(+), 74 deletions(-) diff --git a/apps/daisy/ChangeLog b/apps/daisy/ChangeLog index 4fdf333e4..989704054 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: added heart rate which is switched on when cycled to it through up/down touch on rhs diff --git a/apps/daisy/README.md b/apps/daisy/README.md index 3f22f5dd9..12a55ddfd 100644 --- a/apps/daisy/README.md +++ b/apps/daisy/README.md @@ -1,4 +1,4 @@ -# Daisy +# Daisy ![](app.png) *A beautiful digital clock with large ring guage, idle timer and a cyclic information line that includes, day, date, steps, battery, @@ -8,15 +8,20 @@ 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/) -* Derived from `The Ring` proof of concept and the [Pastel clock](https://banglejs.com/apps/?q=pastel) +* Derived from [The Ring](https://banglejs.com/apps/?id=thering) proof of concept and the [Pastel clock](https://banglejs.com/apps/?q=pastel) * Includes the [Lazybones](https://banglejs.com/apps/?q=lazybones) Idle warning timer -* Touch the top right/top left to cycle through the info display (Day, Date, Steps, Sunrise, Sunset) +* Touch the top right/top left to cycle through the info display (Day, Date, Steps, Sunrise, Sunset, Heart Rate) +* The heart rate monitor is turned on only when Heart rate is selected and will take a few seconds to settle +* The heart value is displayed in RED if the confidence value is less than 50% +* NOTE: The heart rate monitor of Bangle JS 2 is not very accurate when moving about. +See [#1248](https://github.com/espruino/BangleApps/issues/1248) * Uses mylocation.json from MyLocation app to calculate sunrise and sunset times for your location +* If your Sunrise, Sunset times look odd make sure you have setup your location using +[MyLocation](https://banglejs.com/apps/?id=mylocation) * The screen is updated every minute to save battery power * Uses the [BloggerSansLight](https://www.1001fonts.com/rounded-fonts.html?page=3) font, which if free for commercial use ## Future Development -* Add a heart rate option in the information line that turns on when selected * Use mini icons in the information line rather that text * Add weather icons as per Pastel clock * Add a lock icon to the screen @@ -25,5 +30,3 @@ Forum](http://forum.espruino.com/microcosms/1424/) ![](screenshot_daisy1.png) It is worth looking at the real thing though as the screenshot does not do it justice. -(Though I need to redo this photo at some point) -![](screenshot_daisy2.jpg) diff --git a/apps/daisy/app.js b/apps/daisy/app.js index 2717f94db..01d177a32 100644 --- a/apps/daisy/app.js +++ b/apps/daisy/app.js @@ -14,16 +14,19 @@ let warned = 0; let idle = false; let IDLE_MINUTES = 26; -var pal1; // palette for 0-40% -var pal2; // palette for 50-100% -const infoWidth = 50; -const infoHeight = 14; +let pal1; // palette for 0-40% +let pal2; // palette for 50-100% +const infoLine = (3*h/4) - 6; +const infoWidth = 56; +const infoHeight = 11; var drawingSteps = false; function log_debug(o) { //print(o); } +var hrmImg = require("heatshrink").decompress(atob("i0WgIKHgPh8Ef5/g///44CBz///1///5A4PnBQk///wA4PBA4MDA4MH/+Ah/8gEP4EAjw0GA")); + // https://www.1001fonts.com/rounded-fonts.html?page=3 Graphics.prototype.setFontBloggerSansLight46 = function(scale) { // Actual height 46 (45 - 0) @@ -109,7 +112,8 @@ const infoData = { ID_SR: { calc: () => 'Sunrise: ' + sunRise }, ID_SS: { calc: () => 'Sunset: ' + sunSet }, ID_STEP: { calc: () => 'Steps: ' + getSteps() }, - ID_BATT: { calc: () => 'Battery: ' + E.getBattery() + '%' } + ID_BATT: { calc: () => 'Battery: ' + E.getBattery() + '%' }, + ID_HRM: { calc: () => hrmCurrent } }; const infoList = Object.keys(infoData).sort(); @@ -121,6 +125,9 @@ function nextInfo() { if (idx === infoList.length - 1) infoMode = infoList[0]; else infoMode = infoList[idx + 1]; } + // power HRM on/off accordingly + Bangle.setHRMPower(infoMode == "ID_HRM" ? 1 : 0); + resetHrm(); } function prevInfo() { @@ -129,8 +136,125 @@ function prevInfo() { if (idx === 0) infoMode = infoList[infoList.length - 1]; else infoMode = infoList[idx - 1]; } + // power HRM on/off accordingly + Bangle.setHRMPower(infoMode == "ID_HRM" ? 1 : 0); + resetHrm(); } +function clearInfo() { + g.setColor(g.theme.bg); + //g.setColor(g.theme.fg); + g.fillRect((w/2) - infoWidth, infoLine - infoHeight, (w/2) + infoWidth, infoLine + infoHeight); +} + +function drawInfo() { + clearInfo(); + g.setColor(g.theme.fg); + setSmallFont(); + g.setFontAlign(0,0); + + if (infoMode == "ID_HRM") { + clearInfo(); + g.setColor('#f00'); // red + drawHeartIcon(); + } else { + g.drawString((infoData[infoMode].calc()), w/2, infoLine); + } +} + +function drawHeartIcon() { + g.drawImage(hrmImg, (w/2) - infoHeight - 20, infoLine - infoHeight); +} + +function drawHrm() { + if (idle) return; // dont draw while prompting + var d = new Date(); + clearInfo(); + g.setColor(d.getSeconds()&1 ? '#f00' : g.theme.bg); + drawHeartIcon(); + setSmallFont(); + g.setFontAlign(-1,0); // left + g.setColor(hrmConfidence >= 50 ? g.theme.fg : '#f00'); + g.drawString(hrmCurrent, (w/2) + 10, infoLine); +} + +function draw() { + if (!idle) + drawClock(); + else + drawIdle(); + queueDraw(); +} + +function drawClock() { + var date = new Date(); + var timeStr = require("locale").time(date,1); + var da = date.toString().split(" "); + var time = da[4].substr(0,5); + var hh = da[4].substr(0,2); + var mm = da[4].substr(3,2); + var steps = getSteps(); + var p_steps = Math.round(100*(steps/10000)); + + g.reset(); + g.setColor(g.theme.bg); + g.fillRect(0, 0, w, h); + g.drawImage(getGaugeImage(p_steps), 0, 0); + setLargeFont(); + + g.setColor(settings.fg); + g.setFontAlign(1,0); // right aligned + g.drawString(hh, (w/2) - 1, h/2); + + g.setColor(g.theme.fg); + g.setFontAlign(-1,0); // left aligned + g.drawString(mm, (w/2) + 1, h/2); + + drawInfo(); + + // recalc sunrise / sunset every hour + if (drawCount % 60 == 0) + updateSunRiseSunSet(new Date(), location.lat, location.lon); + drawCount++; +} + +function drawSteps() { + if (drawingSteps) return; + drawingSteps = true; + clearInfo(); + setSmallFont(); + g.setFontAlign(0,0); + g.setColor(g.theme.fg); + g.drawString('Steps ' + getSteps(), w/2, (3*h/4) - 4); + drawingSteps = false; +} + +///////////////// GAUGE images ///////////////////////////////////// + +var hrmCurrent = "--"; +var hrmConfidence = 0; + +function resetHrm() { + hrmCurrent = "--"; + hrmConfidence = 0; + if (infoMode == "ID_HRM") { + clearInfo(); + g.setColor('#f00'); // red + drawHeartIcon(); + } +} + +Bangle.on('HRM', function(hrm) { + hrmCurrent = hrm.bpm; + hrmConfidence = hrm.confidence; + log_debug("HRM=" + hrm.bpm + " (" + hrm.confidence + ")"); + if (infoMode == "ID_HRM" ) drawHrm(); +}); + + +///////////////// GAUGE images ///////////////////////////////////// + + // putting into 1 function like this, rather than individual variables // reduces ram usage from 70%-13% function getGaugeImage(p) { @@ -247,68 +371,6 @@ function getGaugeImage(p) { }; } -function draw() { - if (!idle) - drawClock(); - else - drawIdle(); - queueDraw(); -} - -function drawClock() { - var date = new Date(); - var timeStr = require("locale").time(date,1); - var da = date.toString().split(" "); - var time = da[4].substr(0,5); - var hh = da[4].substr(0,2); - var mm = da[4].substr(3,2); - var steps = getSteps(); - var p_steps = Math.round(100*(steps/10000)); - - g.reset(); - g.setColor(g.theme.bg); - g.fillRect(0, 0, w, h); - g.drawImage(getGaugeImage(p_steps), 0, 0); - setLargeFont(); - - g.setColor(settings.fg); - g.setFontAlign(1,0); // right aligned - g.drawString(hh, (w/2) - 1, h/2); - - g.setColor(g.theme.fg); - g.setFontAlign(-1,0); // left aligned - g.drawString(mm, (w/2) + 1, h/2); - - setSmallFont(); - g.setFontAlign(0,0); // left aligned - g.drawString((infoData[infoMode].calc()), w/2, (3*h/4) - 4); - - // recalc sunrise / sunset every hour - if (drawCount % 60 == 0) - updateSunRiseSunSet(new Date(), location.lat, location.lon); - drawCount++; -} - -function drawSteps() { - if (drawingSteps) return; - drawingSteps = true; - setSmallFont(); - g.setFontAlign(0,0); - var steps = getSteps(); - g.setColor(g.theme.bg); - g.fillRect((w/2) - infoWidth, (3*h/4) - infoHeight, (w/2) + infoWidth, (3*h/4) + infoHeight); - g.setColor(g.theme.fg); - g.drawString('Steps ' + steps, w/2, (3*h/4) - 4); - drawingSteps = false; -} - -/* -Bangle.on('step', s => { - drawSteps(); -}); -*/ - - ///////////////// IDLE TIMER ///////////////////////////////////// function drawIdle() { @@ -392,6 +454,8 @@ Bangle.on('step', s => { } idle = false; warned = 0; + + if (infoMode == "ID_STEP") drawSteps(); }); function checkIdle() { diff --git a/apps/daisy/metadata.json b/apps/daisy/metadata.json index c35bfefa3..695e4a85e 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 e124aa91c0b47e041619a0ac288eb3ea408daca8 Mon Sep 17 00:00:00 2001 From: Jeroen Peters Date: Thu, 3 Mar 2022 09:29:47 +0100 Subject: [PATCH 13/46] Dutch translations --- lang/nl_NL.json | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/lang/nl_NL.json b/lang/nl_NL.json index 0a39fefb2..117d4feeb 100644 --- a/lang/nl_NL.json +++ b/lang/nl_NL.json @@ -11,10 +11,10 @@ "Back": "Terug", "Repeat": "Herhalen", "Delete": "Verwijderen", - "ALARM!": "ALARV.", - "Sleep": "Stand-by", + "ALARM!": "ALARM!", + "Sleep": "Standby", "New Timer": "Nieuwe Timer", - "(repeat)": "(herhaling)", + "(repeat)": "(herhaal)", "music": "muziek", "week": "week", "Auto snooze": "Auto snooze", @@ -31,7 +31,7 @@ "minimum": "minimum", "valid period": "geldige periode", "heartrate": "hartslag", - "battery warn": "batterijwaarschuwing", + "battery warn": "batterijwaarsch.", "data": "gegevens", "step length": "staplengte", "min. confidence": "min. vertrouwen", @@ -47,7 +47,7 @@ "Yes\ndefinitely": "Ja\nzeker", "STEPS": "STAPPEN", "Show clocks": "Toon klokken", - "Record Run": "Record run", + "Record Run": "Rondje opnemen", "No Messages": "Geen berichten.", "View Message": "Bekijk bericht", "Piezo": "Piƫzo", @@ -63,7 +63,7 @@ "Make Connectable": "Maak Verbindbaar", "Quiet Mode": "Rustige modus", "BLE": "BLE", - "Dark BW": "Donker BW", + "Dark BW": "Donkere modus", "Apps": "Apps", "Programmable": "Programmeerbaar", "Vibration": "Trilling", @@ -82,32 +82,32 @@ "Remove": "Verwijder", "Add Device": "Apparaat toevoegen", "Connect device\nto add to\nwhitelist": "Apparaat aansluiten\ntoe te voegen aan\nwhitelist", - "Wake on Twist": "Wake on Twist", - "Wake on BTN2": "Wake op BTN2", - "Wake on BTN1": "Wake op BTN1", - "Wake on FaceUp": "Wakker worden op FaceUp", + "Wake on Twist": "Aangaan bij draaien", + "Wake on BTN2": "Aangaan bij BTN2", + "Wake on BTN1": "Aangaan bij BTN1", + "Wake on FaceUp": "Aangaan bij FaceUp", "Log": "Log", "Debug Info": "Debug info", - "Wake on BTN3": "Wake op BTN3", - "Flatten Battery": "Batterij plat maken", + "Wake on BTN3": "Aangaan bij BTN3", + "Flatten Battery": "Batterij leegmaken", "Rewrite Settings": "Instellingen herschrijven", - "Compact Storage": "Compacte opslag", - "Utilities": "Nutsbedrijven", + "Compact Storage": "Comprimeer opslag", + "Utilities": "Gereedschap", "Clock Style": "Klok Stijl", "Time Zone": "Tijdzone", - "Twist Timeout": "Time-out draaien", - "Twist Max Y": "Twist Max Y", - "Twist Threshold": "Twist Drempel", - "Wake on Touch": "Wakker worden bij aanraking", - "Compacting...\nTakes approx\n1 minute": "Verdichten...\nDuurt ongeveer\n1 minuut", - "Reset to Defaults": "Terugzetten op standaardwaarden", + "Twist Timeout": "Draaien time-out", + "Twist Max Y": "Draaien Max Y", + "Twist Threshold": "Draaien vanaf", + "Wake on Touch": "Aangaan bij aanraking", + "Compacting...\nTakes approx\n1 minute": "Comprimeren...\nDuurt ongeveer\n1 minuut", + "Reset to Defaults": "Terug naar standaardwaarden", "No Clocks Found": "Geen klokken gevonden", "Month": "Maand", - "Minute": "Minuutje", + "Minute": "Minuut", "Flattening battery - this can take hours.\nLong-press button to cancel": "Batterij leegmaken - dit kan uren duren.\nDruk lang op de knop om te annuleren", "Sleep Phase Alarm": "Slaapfase alarm", "Second": "Tweede", - "Turn Off": "Zet uit.", + "Turn Off": "Uitzetten", "Hour": "Uur", "Storage": "Opslag", "Date": "Datum", @@ -144,7 +144,7 @@ "Hide": "Verberg", "Messages": "Berichten", "Error in settings": "Fout in instellingen", - "BACK": "ACHTER", + "BACK": "TERUG", "Whitelist": "Whitelist", "Set Time": "Tijd instellen", "Disable": "Uitschakelen", @@ -162,7 +162,7 @@ "Loading": "Laden", "Music": "Muziek", "color": "kleur", - "off": "van", + "off": "uit", "Off": "Uit", "Theme": "Thema" }, From 9bf6f1f20b8fd5b83b767aedc3f75634311bf3dc Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 3 Mar 2022 13:36:56 +0100 Subject: [PATCH 14/46] Add testing variables --- apps/smclock/app.js | 107 +++++++++++++++++++++++++++++---------- apps/smclock/settings.js | 28 ++++++++-- 2 files changed, 103 insertions(+), 32 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index b900e4d9e..19044883e 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -1,30 +1,74 @@ const SETTINGSFILE = "smclock.json"; const background = { - width : 176, height : 176, bpp : 3, transparent : 1, - buffer : require("heatshrink").decompress(atob("/4A/AH4ACUb8H9MkyVJAThB/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/INP/AH4A/AAX8Yz4Afn5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/INI=")) + width: 176, + height: 176, + bpp: 3, + transparent: 1, + buffer: require("heatshrink").decompress( + atob( + "/4A/AH4ACUb8H9MkyVJAThB/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/INP/AH4A/AAX8Yz4Afn5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/IP5B/INI=" + ) + ), }; -const monthName = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; -const weekday = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]; +const monthName = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", +]; +const weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; // dynamic variables var batLevel = -1; -var batColor = [0,0,0]; +var batColor = [0, 0, 0]; + +// settings variables +var dateFormat; +var drawInterval; +var pollInterval; +var showAnalogFace; +var showWeekInfo; +var useVectorFont; + +// load settings +function loadSettings() { + // Helper function default setting + function def(value, def) { + return value !== undefined ? value : def; + } + var settings = require("Storage").readJSON(SETTINGSFILE, true) || {}; + + dateFormat = def(settings.dateFormat, "Short"); + drawInterval = def(settings.drawInterval, 10); + pollInterval = def(settings.pollInterval, 60); + showAnalogFace = def(settings.showAnalogFace, false); + showWeekInfo = def(settings.showWeekInfo, false); + useVectorFont = def(settings.useVectorFont, false); +} // copied from: https://gist.github.com/IamSilviu/5899269#gistcomment-3035480 function ISO8601_week_no(date) { - var tdt = new Date(date.valueOf()); - var dayn = (date.getDay() + 6) % 7; - tdt.setDate(tdt.getDate() - dayn + 3); - var firstThursday = tdt.valueOf(); - tdt.setMonth(0, 1); - if (tdt.getDay() !== 4) { - tdt.setMonth(0, 1 + ((4 - tdt.getDay()) + 7) % 7); - } - return 1 + Math.ceil((firstThursday - tdt) / 604800000); + var tdt = new Date(date.valueOf()); + var dayn = (date.getDay() + 6) % 7; + tdt.setDate(tdt.getDate() - dayn + 3); + var firstThursday = tdt.valueOf(); + tdt.setMonth(0, 1); + if (tdt.getDay() !== 4) { + tdt.setMonth(0, 1 + ((4 - tdt.getDay() + 7) % 7)); + } + return 1 + Math.ceil((firstThursday - tdt) / 604800000); } function d02(value) { - return ('0' + value).substr(-2); + return ("0" + value).substr(-2); } function pollBattery() { @@ -37,16 +81,16 @@ function getBatteryColor(level) { pollBattery(); level = batLevel; } - if(level>80) { - color = [0,0,1]; - } else if(level>60) { - color = [0,1,1]; - } else if(level>40) { - color = [0,1,0]; - } else if(level>20) { - color = [1,1,0]; + if (level > 80) { + color = [0, 0, 1]; + } else if (level > 60) { + color = [0, 1, 1]; + } else if (level > 40) { + color = [0, 1, 0]; + } else if (level > 20) { + color = [1, 1, 0]; } else { - color = [1,0,0]; + color = [1, 0, 0]; } return color; } @@ -58,7 +102,7 @@ function draw() { const bat = d02(E.getBattery()) + "%"; const d = new Date(); const day = d.getDate(); - const month = (d.getMonth() + 1); + const month = d.getMonth() + 1; const week = d02(ISO8601_week_no(d)); const date1 = d02(day) + "/" + d02(month); const date2 = weekday[d.getDay()] + " " + d02(week); @@ -69,7 +113,12 @@ function draw() { g.reset(); g.setColor(0, 0, 0); - g.setFont("Vector", 20); + console.log(useVectorFont, dateFormat); + if (useVectorFont == true && dateFormat == "Short") { + g.setFont("Vector", 20); + } else { + g.setFont("6x8", 2); + } g.drawString(date1, 105, 20, false); g.setFont("Vector", 16); g.drawString(date2, 105, 55, false); @@ -85,6 +134,8 @@ function draw() { g.drawString(bat, 52, 22, false); } +loadSettings(); + g.clear(); pollBattery(); @@ -94,7 +145,7 @@ var batInterval = setInterval(pollBattery, 60000); var drawInterval = setInterval(draw, 10000); // Stop updates when LCD is off, restart when on -Bangle.on('lcdPower',on=>{ +Bangle.on("lcdPower", (on) => { if (batInterval) clearInterval(batInterval); batInterval = undefined; if (drawInterval) clearInterval(drawInterval); @@ -102,7 +153,7 @@ Bangle.on('lcdPower',on=>{ if (on) { batInterval = setInterval(pollBattery, 60000); drawInterval = setInterval(draw, 10000); - + pollBattery(); draw(); } diff --git a/apps/smclock/settings.js b/apps/smclock/settings.js index 9d747a910..22314b764 100644 --- a/apps/smclock/settings.js +++ b/apps/smclock/settings.js @@ -8,10 +8,12 @@ // assign default values if it doesn't exist var settings = Object.assign( { - dateFormat: "short", + dateFormat: "Short", + drawInterval: 10, + pollInterval: 60, showAnalogFace: false, showWeekInfo: false, - useVectorFont: true, + useVectorFont: false, }, require("Storage").readJSON(FILE, true) || {} ); @@ -57,7 +59,21 @@ writeSettings(); }, }, - Date: stringInSettings("dateOnMain", ["Long", "Short", "ISO8601"]), + Date: stringInSettings("dateFormat", ["Long", "Short", "ISO8601"]), + "Draw Interval": { + value: settings.drawInterval, + onchange: (v) => { + settings.drawInterval = v; + writeSettings(); + }, + }, + "Poll Interval": { + value: settings.pollInterval, + onchange: (v) => { + settings.pollInterval = v; + writeSettings(); + }, + }, "Week Info": { value: settings.showWeekInfo !== undefined ? settings.showWeekInfo : false, @@ -72,7 +88,11 @@ settings.useVectorFont !== undefined ? settings.useVectorFont : false, format: (v) => (v ? "On" : "Off"), onchange: (v) => { - settings.useVectorFont = v; + if (v == "On") { + settings.useVectorFont = true; + } else { + settings.useVectorFont = false; + } writeSettings(); }, }, From 3486dc6401ecbe4dd8040e79e5c3657d105674f1 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 3 Mar 2022 16:38:29 +0100 Subject: [PATCH 15/46] Add true/false values for toggles --- apps/smclock/settings.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/apps/smclock/settings.js b/apps/smclock/settings.js index 22314b764..0fa0340d5 100644 --- a/apps/smclock/settings.js +++ b/apps/smclock/settings.js @@ -55,11 +55,15 @@ settings.showAnalogFace !== undefined ? settings.showAnalogFace : false, format: (v) => (v ? "On" : "Off"), onchange: (v) => { - settings.showAnalogFace = v; + if (v == "On") { + settings.showAnalogFace = true; + } else { + settings.showAnalogFace = false; + } writeSettings(); }, }, - Date: stringInSettings("dateFormat", ["Long", "Short", "ISO8601"]), + Date: stringInSettings("dateFormat", ["Long", "Short"]), "Draw Interval": { value: settings.drawInterval, onchange: (v) => { @@ -79,7 +83,11 @@ settings.showWeekInfo !== undefined ? settings.showWeekInfo : false, format: (v) => (v ? "On" : "Off"), onchange: (v) => { - settings.showWeekInfo = v; + if (v == "On") { + settings.showWeekInfo = true; + } else { + settings.showWeekInfo = false; + } writeSettings(); }, }, From cdb4ed5f16600316abae23878c12087c6daa7c42 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 3 Mar 2022 16:38:56 +0100 Subject: [PATCH 16/46] Fix battery display when full --- apps/smclock/app.js | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 19044883e..0294f070b 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -99,7 +99,7 @@ function draw() { g.drawImage(background); const color = getBatteryColor(batLevel); - const bat = d02(E.getBattery()) + "%"; + const bat; const d = new Date(); const day = d.getDate(); const month = d.getMonth() + 1; @@ -110,6 +110,12 @@ function draw() { const m = d.getMinutes(); const time = d02(h) + ":" + d02(m); + if (E.getBattery() < 100) { + bat = d02(E.getBattery()) + "%" + } else { + bat = E.getBattery() + "%" + } + g.reset(); g.setColor(0, 0, 0); @@ -131,7 +137,11 @@ function draw() { g.setFont("Vector", 16); g.drawString("Bat:", 12, 22, false); g.setColor(color[0], color[1], color[2]); - g.drawString(bat, 52, 22, false); + if (batLevel < 100) { + g.drawString(bat, 52, 22, false); + } else { + g.drawString(bat, 46, 22, false); + } } loadSettings(); From 9abde22f8e1276c74929e378956e067d246bcad3 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Wed, 23 Feb 2022 09:24:33 +0100 Subject: [PATCH 17/46] Add screenshot --- apps/smclock/metadata.json | 5 +++++ apps/smclock/screenshot.png | Bin 0 -> 2845 bytes 2 files changed, 5 insertions(+) create mode 100644 apps/smclock/screenshot.png diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index e2fbeace1..0cbf0b261 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -3,7 +3,12 @@ "name":"Monogram Watch Face", "shortName":"MonoClock", "icon":"app.png", +<<<<<<< HEAD "version":"0.03", +======= + "screenshots": [{"url":"screenshot.png"}], + "version":"0.02", +>>>>>>> 29432bb9 (Add screenshot) "description": "A simple watchface based on my stylised monogram.", "tags":"clock", "readme":"README.md", diff --git a/apps/smclock/screenshot.png b/apps/smclock/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..c0e0bd0eed06e2c77e0ad737b1ecd4814a8e4f65 GIT binary patch literal 2845 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 YUdx_>rDxQ4@7%ip9M&0AYD0|sC!%XI-v9sr literal 0 HcmV?d00001 From 4f5fb38d73989c2a6867b61260f9d311b6724b0e Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 3 Mar 2022 19:59:20 +0100 Subject: [PATCH 18/46] Update changelog --- apps/smclock/ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/smclock/ChangeLog b/apps/smclock/ChangeLog index b029d805d..ec7e245ac 100644 --- a/apps/smclock/ChangeLog +++ b/apps/smclock/ChangeLog @@ -1,2 +1,4 @@ 0.01: Initial version 0.02: Add battery level +0.03: Fix battery display when full +0.04: Add support for settings \ No newline at end of file From 95884d4df8407f893124001b181231277be708eb Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 3 Mar 2022 20:09:56 +0100 Subject: [PATCH 19/46] Update changelog --- apps/smclock/ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/smclock/ChangeLog b/apps/smclock/ChangeLog index ec7e245ac..0300d5ceb 100644 --- a/apps/smclock/ChangeLog +++ b/apps/smclock/ChangeLog @@ -1,4 +1,4 @@ 0.01: Initial version 0.02: Add battery level 0.03: Fix battery display when full -0.04: Add support for settings \ No newline at end of file +0.04: Add support for settings From 7a8f3d9bd985fe65e14f12f62ff2845333dff57b Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 3 Mar 2022 20:12:40 +0100 Subject: [PATCH 20/46] Update metadata file --- apps/smclock/metadata.json | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index 79d996f2c..4a3effe71 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -1,18 +1,18 @@ { - "id":"smclock", - "name":"Monogram Watch Face", - "shortName":"MonoClock", - "icon":"app.png", - "screenshots": [{"url":"screenshot.png"}], - "version":"0.02", + "id": "smclock", + "name": "Monogram Watch Face", + "shortName": "MonoClock", + "icon": "app.png", + "screenshots": [{ "url": "screenshot.png" }], + "version": "0.04", "description": "A simple watchface based on my stylised monogram.", - "tags":"clock", - "readme":"README.md", - "supports" : ["BANGLEJS2"], + "tags": "clock", + "readme": "README.md", + "supports": ["BANGLEJS2"], "allow_emulator": true, "storage": [ - {"name":"smclock.app.js","url":"app.js"}, - {"name":"smclock.settings.js","url":"settings.js"}, - {"name":"smclock.img","url":"app-icon.js","evaluate":true} + { "name": "smclock.app.js", "url": "app.js" }, + { "name": "smclock.settings.js", "url": "settings.js" }, + { "name": "smclock.img", "url": "app-icon.js", "evaluate": true } ] } From fd9fb6cba4014ec1cd4f68bb72e7746a452fab21 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 3 Mar 2022 20:15:32 +0100 Subject: [PATCH 21/46] Fix battery ...again --- apps/smclock/app.js | 8 +++++--- apps/smclock/settings.js | 12 +----------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 0294f070b..9309cf508 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -99,7 +99,7 @@ function draw() { g.drawImage(background); const color = getBatteryColor(batLevel); - const bat; + const bat = ""; const d = new Date(); const day = d.getDate(); const month = d.getMonth() + 1; @@ -111,9 +111,9 @@ function draw() { const time = d02(h) + ":" + d02(m); if (E.getBattery() < 100) { - bat = d02(E.getBattery()) + "%" + bat = d02(E.getBattery()) + "%"; } else { - bat = E.getBattery() + "%" + bat = E.getBattery() + "%"; } g.reset(); @@ -146,6 +146,8 @@ function draw() { loadSettings(); +console.log(settings); + g.clear(); pollBattery(); diff --git a/apps/smclock/settings.js b/apps/smclock/settings.js index 0fa0340d5..6ff95c72e 100644 --- a/apps/smclock/settings.js +++ b/apps/smclock/settings.js @@ -6,17 +6,7 @@ var FILE = "smclock.json"; // load settings from the file // assign default values if it doesn't exist - var settings = Object.assign( - { - dateFormat: "Short", - drawInterval: 10, - pollInterval: 60, - showAnalogFace: false, - showWeekInfo: false, - useVectorFont: false, - }, - require("Storage").readJSON(FILE, true) || {} - ); + var settings = Object.assign(require("Storage").readJSON(FILE, true) || {}); // write the new settings to the file function writeSettings() { From 515d1ea229b46007f6da5f649813d6b6b31b8a61 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 3 Mar 2022 20:17:04 +0100 Subject: [PATCH 22/46] Fix battery ...again --- apps/smclock/app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 9309cf508..7fa5eae77 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -99,7 +99,7 @@ function draw() { g.drawImage(background); const color = getBatteryColor(batLevel); - const bat = ""; + let bat = ""; const d = new Date(); const day = d.getDate(); const month = d.getMonth() + 1; From 7b91d21bde19c398297ae881e9c34389191642fb Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 3 Mar 2022 21:46:26 +0100 Subject: [PATCH 23/46] Fix settings, hopefully --- apps/smclock/app.js | 20 +++++++++----------- apps/smclock/metadata.json | 3 ++- apps/smclock/settings.js | 14 ++++++++++++-- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 7fa5eae77..b417c6976 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -27,16 +27,16 @@ const monthName = [ const weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; // dynamic variables -var batLevel = -1; -var batColor = [0, 0, 0]; +let batLevel = -1; +let batColor = [0, 0, 0]; // settings variables -var dateFormat; -var drawInterval; -var pollInterval; -var showAnalogFace; -var showWeekInfo; -var useVectorFont; +let dateFormat; +let drawInterval; +let pollInterval; +let showAnalogFace; +let showWeekInfo; +let useVectorFont; // load settings function loadSettings() { @@ -44,7 +44,7 @@ function loadSettings() { function def(value, def) { return value !== undefined ? value : def; } - var settings = require("Storage").readJSON(SETTINGSFILE, true) || {}; + let settings = require("Storage").readJSON(SETTINGSFILE, true) || {}; dateFormat = def(settings.dateFormat, "Short"); drawInterval = def(settings.drawInterval, 10); @@ -146,8 +146,6 @@ function draw() { loadSettings(); -console.log(settings); - g.clear(); pollBattery(); diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index 4a3effe71..cce18a648 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -14,5 +14,6 @@ { "name": "smclock.app.js", "url": "app.js" }, { "name": "smclock.settings.js", "url": "settings.js" }, { "name": "smclock.img", "url": "app-icon.js", "evaluate": true } - ] + ], + "data": [{ "name": "smclock.json" }] } diff --git a/apps/smclock/settings.js b/apps/smclock/settings.js index 6ff95c72e..81c0a0af1 100644 --- a/apps/smclock/settings.js +++ b/apps/smclock/settings.js @@ -3,10 +3,20 @@ // helper functions taken from Anton Clock (function (back) { - var FILE = "smclock.json"; + const FILE = "smclock.json"; // load settings from the file // assign default values if it doesn't exist - var settings = Object.assign(require("Storage").readJSON(FILE, true) || {}); + let settings = Object.assign( + { + dateFormat: "Short", + drawInterval: 10, + pollInterval: 60, + showAnalogFace: false, + showWeekInfo: false, + useVectorFont: false, + }, + require("Storage").readJSON(FILE, true) || {} + ); // write the new settings to the file function writeSettings() { From 57f7d489209a9304076bf88b781d453b903fd3e2 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 3 Mar 2022 22:23:57 +0100 Subject: [PATCH 24/46] Fix drawInterval --- apps/smclock/app.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index b417c6976..223dd053a 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -152,17 +152,17 @@ pollBattery(); draw(); var batInterval = setInterval(pollBattery, 60000); -var drawInterval = setInterval(draw, 10000); +let actualDrawInterval = setInterval(draw, drawInterval * 1000); // Stop updates when LCD is off, restart when on Bangle.on("lcdPower", (on) => { if (batInterval) clearInterval(batInterval); batInterval = undefined; - if (drawInterval) clearInterval(drawInterval); - drawInterval = undefined; + if (actualDrawInterval) clearInterval(actualDrawInterval); + actualDrawInterval = undefined; if (on) { batInterval = setInterval(pollBattery, 60000); - drawInterval = setInterval(draw, 10000); + actualDrawInterval = setInterval(draw, drawInterval * 1000); pollBattery(); draw(); From 968707d76153151f07ed2414ea27e1f909023b09 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 3 Mar 2022 23:02:05 +0100 Subject: [PATCH 25/46] Update metajason file --- apps/smclock/metadata.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index cce18a648..cc995d587 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -6,9 +6,10 @@ "screenshots": [{ "url": "screenshot.png" }], "version": "0.04", "description": "A simple watchface based on my stylised monogram.", + "type": "clock", "tags": "clock", "readme": "README.md", - "supports": ["BANGLEJS2"], + "supports": ["BANGLEJS", "BANGLEJS2"], "allow_emulator": true, "storage": [ { "name": "smclock.app.js", "url": "app.js" }, From bd8c89b538e86096ab0ae093b55888265215ddfa Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Thu, 3 Mar 2022 23:30:34 +0100 Subject: [PATCH 26/46] Fix issue with evaluating arrow output --- apps/smclock/app.js | 26 +++++++++++------------- apps/smclock/settings.js | 43 +++++++++++++++------------------------- 2 files changed, 28 insertions(+), 41 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 223dd053a..4516ca9e5 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -27,24 +27,22 @@ const monthName = [ const weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; // dynamic variables -let batLevel = -1; -let batColor = [0, 0, 0]; +var batLevel = -1; +var batColor = [0, 0, 0]; // settings variables -let dateFormat; -let drawInterval; -let pollInterval; -let showAnalogFace; -let showWeekInfo; -let useVectorFont; +var dateFormat; +var drawInterval; +var pollInterval; +var showAnalogFace; +var showWeekInfo; +var useVectorFont; // load settings function loadSettings() { // Helper function default setting - function def(value, def) { - return value !== undefined ? value : def; - } - let settings = require("Storage").readJSON(SETTINGSFILE, true) || {}; + function def(value, def) {return value !== undefined ? value : def;} + var settings = require("Storage").readJSON(SETTINGSFILE, true) || {}; dateFormat = def(settings.dateFormat, "Short"); drawInterval = def(settings.drawInterval, 10); @@ -99,7 +97,7 @@ function draw() { g.drawImage(background); const color = getBatteryColor(batLevel); - let bat = ""; + var bat = ""; const d = new Date(); const day = d.getDate(); const month = d.getMonth() + 1; @@ -152,7 +150,7 @@ pollBattery(); draw(); var batInterval = setInterval(pollBattery, 60000); -let actualDrawInterval = setInterval(draw, drawInterval * 1000); +var actualDrawInterval = setInterval(draw, drawInterval * 1000); // Stop updates when LCD is off, restart when on Bangle.on("lcdPower", (on) => { diff --git a/apps/smclock/settings.js b/apps/smclock/settings.js index 81c0a0af1..53ff974f3 100644 --- a/apps/smclock/settings.js +++ b/apps/smclock/settings.js @@ -3,36 +3,31 @@ // helper functions taken from Anton Clock (function (back) { - const FILE = "smclock.json"; + var FILE = "smclock.json"; // load settings from the file // assign default values if it doesn't exist - let settings = Object.assign( - { + var settings = Object.assign({ dateFormat: "Short", drawInterval: 10, pollInterval: 60, showAnalogFace: false, showWeekInfo: false, useVectorFont: false, - }, - require("Storage").readJSON(FILE, true) || {} - ); + }, require("Storage").readJSON(FILE, true) || {}); // write the new settings to the file - function writeSettings() { - require("Storage").writeJSON(FILE, settings); - } + function writeSettings() {require("Storage").writeJSON(FILE, settings);} // helper method which uses int-based menu item for set of string values function stringItems(startvalue, writer, values) { return { value: startvalue === undefined ? 0 : values.indexOf(startvalue), - format: (v) => values[v], + format: v => values[v], min: 0, max: values.length - 1, wrap: true, step: 1, - onchange: (v) => { + onchange: v => { writer(values[v]); writeSettings(); }, @@ -46,15 +41,13 @@ // settings menu var mainmenu = { - "": { - title: "Monogram Clock", - }, + "": {title: "Monogram Clock",}, "< Back": () => back(), "Analog Face": { value: settings.showAnalogFace !== undefined ? settings.showAnalogFace : false, - format: (v) => (v ? "On" : "Off"), - onchange: (v) => { + format: v => v ? "On" : "Off", + onchange: v => { if (v == "On") { settings.showAnalogFace = true; } else { @@ -66,14 +59,14 @@ Date: stringInSettings("dateFormat", ["Long", "Short"]), "Draw Interval": { value: settings.drawInterval, - onchange: (v) => { + onchange: v => { settings.drawInterval = v; writeSettings(); }, }, "Poll Interval": { value: settings.pollInterval, - onchange: (v) => { + onchange: v => { settings.pollInterval = v; writeSettings(); }, @@ -81,8 +74,8 @@ "Week Info": { value: settings.showWeekInfo !== undefined ? settings.showWeekInfo : false, - format: (v) => (v ? "On" : "Off"), - onchange: (v) => { + format: v => v ? "On" : "Off", + onchange: v => { if (v == "On") { settings.showWeekInfo = true; } else { @@ -94,13 +87,9 @@ "Vector Font": { value: settings.useVectorFont !== undefined ? settings.useVectorFont : false, - format: (v) => (v ? "On" : "Off"), - onchange: (v) => { - if (v == "On") { - settings.useVectorFont = true; - } else { - settings.useVectorFont = false; - } + format: v => v ? "On" : "Off", + onchange: v => { + settings.useVectorFont = v; writeSettings(); }, }, From 46717acb3c1d764d3e2c4afde869434b442eeff6 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Fri, 4 Mar 2022 00:05:17 +0100 Subject: [PATCH 27/46] Add font support for battery info --- apps/smclock/app.js | 46 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 4516ca9e5..9630bb42e 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -10,20 +10,7 @@ const background = { ) ), }; -const monthName = [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec", -]; +const monthName = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; const weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; // dynamic variables @@ -116,8 +103,23 @@ function draw() { g.reset(); + // draw battery info + g.setColor(1, 1, 1); + if (useVectorFont == true) { + g.setFont("Vector", 16); + g.drawString("Bat:", 12, 22, false); + } else { + g.setFont("4x6", 2); + g.drawString("Bat:", 10, 22, false); + } + g.setColor(color[0], color[1], color[2]); + if (batLevel < 100) { + g.drawString(bat, 52, 22, false); + } else { + g.drawString(bat, 46, 22, false); + } + g.setColor(0, 0, 0); - console.log(useVectorFont, dateFormat); if (useVectorFont == true && dateFormat == "Short") { g.setFont("Vector", 20); } else { @@ -130,16 +132,6 @@ function draw() { g.setColor(1, 1, 1); g.setFont("Vector", 60); g.drawString(time, 10, 108, false); - - g.setColor(1, 1, 1); - g.setFont("Vector", 16); - g.drawString("Bat:", 12, 22, false); - g.setColor(color[0], color[1], color[2]); - if (batLevel < 100) { - g.drawString(bat, 52, 22, false); - } else { - g.drawString(bat, 46, 22, false); - } } loadSettings(); @@ -149,7 +141,7 @@ g.clear(); pollBattery(); draw(); -var batInterval = setInterval(pollBattery, 60000); +var batInterval = setInterval(pollBattery, pollInterval * 1000); var actualDrawInterval = setInterval(draw, drawInterval * 1000); // Stop updates when LCD is off, restart when on @@ -159,7 +151,7 @@ Bangle.on("lcdPower", (on) => { if (actualDrawInterval) clearInterval(actualDrawInterval); actualDrawInterval = undefined; if (on) { - batInterval = setInterval(pollBattery, 60000); + batInterval = setInterval(pollBattery, pollInterval * 1000); actualDrawInterval = setInterval(draw, drawInterval * 1000); pollBattery(); From 9664368caa3f76da80855cb2d67fc7416155d0f0 Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Fri, 4 Mar 2022 00:14:20 +0100 Subject: [PATCH 28/46] Add font support for time display --- apps/smclock/app.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 9630bb42e..cb7d2e3e9 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -129,9 +129,15 @@ function draw() { g.setFont("Vector", 16); g.drawString(date2, 105, 55, false); + // draw time g.setColor(1, 1, 1); - g.setFont("Vector", 60); - g.drawString(time, 10, 108, false); + if (useVectorFont == true) { + g.setFont("Vector", 60); + g.drawString(time, 10, 108, false); + } else { + g.setFont("6x8", 5); + g.drawString(time, 14, 112, false); + } } loadSettings(); From f89579ad6d98973e3daaf34a2a068ebd736c690b Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Fri, 4 Mar 2022 00:52:33 +0100 Subject: [PATCH 29/46] Add font support for date and week info --- apps/smclock/app.js | 37 +++++++++++++++++++++++++++++++------ apps/smclock/settings.js | 12 ++---------- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index cb7d2e3e9..099fcad74 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -89,8 +89,8 @@ function draw() { const day = d.getDate(); const month = d.getMonth() + 1; const week = d02(ISO8601_week_no(d)); - const date1 = d02(day) + "/" + d02(month); - const date2 = weekday[d.getDay()] + " " + d02(week); + const date1 = ""; + const date2 = ""; const h = d.getHours(); const m = d.getMinutes(); const time = d02(h) + ":" + d02(m); @@ -119,15 +119,40 @@ function draw() { g.drawString(bat, 46, 22, false); } + // draw date info g.setColor(0, 0, 0); - if (useVectorFont == true && dateFormat == "Short") { + if (useVectorFont == true) { g.setFont("Vector", 20); } else { g.setFont("6x8", 2); } - g.drawString(date1, 105, 20, false); - g.setFont("Vector", 16); - g.drawString(date2, 105, 55, false); + if (dateFormat == "Short") { + date1 = d02(day) + "/" + d02(month); + g.drawString(date1, 105, 20, false); + } else { + date1 = monthName[month - 1] + d02(day); + g.drawString(date1, 104, 20, false); + } + + // draw week info + if (showWeekInfo == true) { + date2 = weekday[d.getDay()] + " " + d02(week) + if (useVectorFont == true) { + g.setFont("Vector", 18); + } else { + g.setFont("6x8", 2); + } + g.drawString(date2, 105, 55, false); + } else { + date2 = d.getFullYear(); + if (useVectorFont == true) { + g.setFont("Vector", 22); + g.drawString(date2, 105, 55, false); + } else { + g.setFont("4x6", 3); + g.drawString(date2, 108, 55, false); + } + } // draw time g.setColor(1, 1, 1); diff --git a/apps/smclock/settings.js b/apps/smclock/settings.js index 53ff974f3..a6c7d1b98 100644 --- a/apps/smclock/settings.js +++ b/apps/smclock/settings.js @@ -48,11 +48,7 @@ settings.showAnalogFace !== undefined ? settings.showAnalogFace : false, format: v => v ? "On" : "Off", onchange: v => { - if (v == "On") { - settings.showAnalogFace = true; - } else { - settings.showAnalogFace = false; - } + settings.showAnalogFace = v; writeSettings(); }, }, @@ -76,11 +72,7 @@ settings.showWeekInfo !== undefined ? settings.showWeekInfo : false, format: v => v ? "On" : "Off", onchange: v => { - if (v == "On") { - settings.showWeekInfo = true; - } else { - settings.showWeekInfo = false; - } + settings.showWeekInfo = v; writeSettings(); }, }, From 0a798aa5e7e54403c417783ab11f3bb7b04837da Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Fri, 4 Mar 2022 01:03:49 +0100 Subject: [PATCH 30/46] Fix date variables --- apps/smclock/app.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index ebc3efde1..44037a7a7 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -94,8 +94,8 @@ function draw() { const day = d.getDate(); const month = d.getMonth() + 1; const week = d02(ISO8601_week_no(d)); - const date1 = ""; - const date2 = ""; + var date1 = ""; + var date2 = ""; const h = d.getHours(); const m = d.getMinutes(); const time = d02(h) + ":" + d02(m); From 7c46d95119a225302ed6cff17ae08e7e2819de7b Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Fri, 4 Mar 2022 01:06:14 +0100 Subject: [PATCH 31/46] Remove unnecessary merge info from changelog and metadata file --- apps/smclock/ChangeLog | 4 ---- apps/smclock/metadata.json | 13 ------------- 2 files changed, 17 deletions(-) diff --git a/apps/smclock/ChangeLog b/apps/smclock/ChangeLog index b09db0145..0300d5ceb 100644 --- a/apps/smclock/ChangeLog +++ b/apps/smclock/ChangeLog @@ -1,8 +1,4 @@ 0.01: Initial version 0.02: Add battery level -<<<<<<< HEAD -0.03: fix battery level displaying -======= 0.03: Fix battery display when full 0.04: Add support for settings ->>>>>>> feature/introduce_settings diff --git a/apps/smclock/metadata.json b/apps/smclock/metadata.json index 5918406d6..cc995d587 100644 --- a/apps/smclock/metadata.json +++ b/apps/smclock/metadata.json @@ -1,23 +1,10 @@ { -<<<<<<< HEAD - "id":"smclock", - "name":"Monogram Watch Face", - "shortName":"MonoClock", - "icon":"app.png", -<<<<<<< HEAD - "version":"0.03", -======= - "screenshots": [{"url":"screenshot.png"}], - "version":"0.02", ->>>>>>> 29432bb9 (Add screenshot) -======= "id": "smclock", "name": "Monogram Watch Face", "shortName": "MonoClock", "icon": "app.png", "screenshots": [{ "url": "screenshot.png" }], "version": "0.04", ->>>>>>> feature/introduce_settings "description": "A simple watchface based on my stylised monogram.", "type": "clock", "tags": "clock", From a4c76e3d3aaad674b35abe2efff809d7db2e612d Mon Sep 17 00:00:00 2001 From: Stergios Mekras Date: Fri, 4 Mar 2022 01:09:11 +0100 Subject: [PATCH 32/46] Remove unnecessary merge info from main app file --- apps/smclock/app.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/apps/smclock/app.js b/apps/smclock/app.js index 44037a7a7..350c0dd07 100644 --- a/apps/smclock/app.js +++ b/apps/smclock/app.js @@ -83,13 +83,8 @@ function getBatteryColor(level) { function draw() { g.drawImage(background); -<<<<<<< HEAD - const color = getBatteryColor(); - const bat = E.getBattery() + "%"; -======= const color = getBatteryColor(batLevel); var bat = ""; ->>>>>>> feature/introduce_settings const d = new Date(); const day = d.getDate(); const month = d.getMonth() + 1; @@ -118,9 +113,6 @@ function draw() { g.drawString("Bat:", 10, 22, false); } g.setColor(color[0], color[1], color[2]); -<<<<<<< HEAD - g.drawString(bat, 46, 22, false); -======= if (batLevel < 100) { g.drawString(bat, 52, 22, false); } else { @@ -171,7 +163,6 @@ function draw() { g.setFont("6x8", 5); g.drawString(time, 14, 112, false); } ->>>>>>> feature/introduce_settings } loadSettings(); From 8dc3e8f8fcad22e379c7d8b59959c0c55d3fc6ed Mon Sep 17 00:00:00 2001 From: Joseph Paul Date: Fri, 4 Mar 2022 10:16:32 +0100 Subject: [PATCH 33/46] Ratchet Launcher: Initial version --- apps/ratchet_launch/ChangeLog | 1 + apps/ratchet_launch/README.md | 15 ++++ apps/ratchet_launch/app.js | 123 ++++++++++++++++++++++++++++++ apps/ratchet_launch/app.png | Bin 0 -> 9788 bytes apps/ratchet_launch/metadata.json | 16 ++++ 5 files changed, 155 insertions(+) create mode 100644 apps/ratchet_launch/ChangeLog create mode 100644 apps/ratchet_launch/README.md create mode 100644 apps/ratchet_launch/app.js create mode 100644 apps/ratchet_launch/app.png create mode 100644 apps/ratchet_launch/metadata.json diff --git a/apps/ratchet_launch/ChangeLog b/apps/ratchet_launch/ChangeLog new file mode 100644 index 000000000..af7f83942 --- /dev/null +++ b/apps/ratchet_launch/ChangeLog @@ -0,0 +1 @@ +0.01: Initial release diff --git a/apps/ratchet_launch/README.md b/apps/ratchet_launch/README.md new file mode 100644 index 000000000..15df463d0 --- /dev/null +++ b/apps/ratchet_launch/README.md @@ -0,0 +1,15 @@ +# Rachet Launcher + +Ratchet Launcher is a fork of the default Launcher with modified user interaction. Instead of free scrolling, apps are selected by swiping up and down, but in discrete "ticks", just like in the settings menus. + +**WARNING: Untested on Bangle.js v1! Please test and give feedback.** + +## Usage +- Choose app: Swipe up/down (top/bottom button on Bangle.js v1) +- Launch app: Tap screen (center button on Bangle.js v1) +- Return to clock: Swipe three ticks beyond first/last app in list + +## Installation +1. Install Ratchet Launcher using App Loader +2. Uninstall default Launcher +3. Reload diff --git a/apps/ratchet_launch/app.js b/apps/ratchet_launch/app.js new file mode 100644 index 000000000..626b8e4f8 --- /dev/null +++ b/apps/ratchet_launch/app.js @@ -0,0 +1,123 @@ +var Storage = require("Storage"); +var Layout = require("Layout"); + +var font = "6x15"; +var largeFont = "12x20"; +var currentApp = 0; +var overscroll = 0; +var blankImage = Graphics.createImage(` `); +var rowHeight = g.getHeight()/3; + +// Load apps list +var apps = Storage.list(/\.info$/).map(app=>{ + var a=Storage.readJSON(app,1); + return a&&{ + name:a.name, + type:a.type, + icon:a.icon ? Storage.read(a.icon) : a.icon, + sortorder:a.sortorder, + src:a.src + }; +}).filter(app=>app && ( + app.type=="app" +// || (app.type=="clock" && settings.showClocks) + || !app.type +)); +apps.sort((a,b)=>{ + var n=(0|a.sortorder)-(0|b.sortorder); + if (n) return n; // do sortorder first + if (a.nameb.name) return 1; + return 0; +}); + +// Initialize layout +var layout = new Layout({ + type:"v", c:[ + // A row for the previous app + { type:"h", height:rowHeight, c:[ + {type: "img", id:"prev_icon", src:blankImage, width:48, height:48, scale:0.8, pad:8}, + {type: "txt", id:"prev_name", label:"", font:font, fillx:1, wrap:1}, + ]}, + // A row for the current app + { type:"h", height:rowHeight, c:[ + {type: "img", id:"cur_icon", src:apps[currentApp].icon, width:48, height:48}, + {type: "txt", id:"cur_name", label:apps[currentApp].name, font:largeFont, fillx:1, wrap:1}, + ]}, + // A row for the next app + { type:"h", height:rowHeight, c:[ + {type: "img", id:"next_icon", src:blankImage, width:48, height:48, scale:0.8, pad:8}, + {type: "txt", id:"next_name", label:"", font:font, fillx:1, wrap:1}, + ]}, + ] +}); + +// Drawing logic +function render() { + // Previous app + if (currentApp > 0) { + layout.prev_icon.src = apps[currentApp-1].icon; + layout.prev_name.label = apps[currentApp-1].name; + } else { + layout.prev_icon.src = blankImage; + layout.prev_name.label = ""; + } + + // Current app + layout.cur_icon.src = apps[currentApp].icon; + layout.cur_name.label = apps[currentApp].name; + + // Next app + if (currentApp < apps.length-1) { + layout.next_icon.src = apps[currentApp+1].icon; + layout.next_name.label = apps[currentApp+1].name; + } else { + layout.next_icon.src = blankImage; + layout.next_name.label = ""; + } + + g.clear(); + layout.render(); +} + +// Launch the currently selected app +function launch() { + var app = apps[currentApp]; + if (!app) return; + if (!app.src || Storage.read(app.src)===undefined) { + E.showMessage(/*LANG*/"App Source\nNot found"); + setTimeout(drawMenu, 2000); + } else { + E.showMessage(/*LANG*/"Loading..."); + load(app.src); + } +} + +// Select previous/next app +function move(step) { + if ((currentApp == 0 && step < 0) || (currentApp >= apps.length-1 && step > 0)) { + // When we hit the end of the list (top or bottom), the step is + // counted towards the overscroll value. When the overscroll + // threshold is exceeded, we return to the clock face. + overscroll += step; + } else { + // This is the default case: the step is countedf towards the currentApp index + currentApp += step; + overscroll = 0; + return render(); + } + + // Overscroll threshold reached, return to clock + if (Math.abs(overscroll) > 3) { + Bangle.buzz(500, 1); + return load(); + } +} + +// Wire up user input +Bangle.setUI('updown', dir => { + if (dir) move(-1*dir); + else launch(); +}); + +render(); diff --git a/apps/ratchet_launch/app.png b/apps/ratchet_launch/app.png new file mode 100644 index 0000000000000000000000000000000000000000..a27ab48eda4d78d88a5d958e540b9bc822e2131c GIT binary patch literal 9788 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 cggb Date: Fri, 4 Mar 2022 12:31:30 +0100 Subject: [PATCH 34/46] Ratchet Launcher: Fix fonts and scrolling behaviour on Bangle.js 1 --- apps/ratchet_launch/app.js | 40 +++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/apps/ratchet_launch/app.js b/apps/ratchet_launch/app.js index 626b8e4f8..11018080a 100644 --- a/apps/ratchet_launch/app.js +++ b/apps/ratchet_launch/app.js @@ -1,8 +1,8 @@ var Storage = require("Storage"); var Layout = require("Layout"); -var font = "6x15"; -var largeFont = "12x20"; +var font = g.getFonts().includes("6x15") ? "6x15" : "6x8:2"; +var largeFont = g.getFonts().includes("12x20") ? "12x20" : "6x8:3"; var currentApp = 0; var overscroll = 0; var blankImage = Graphics.createImage(` `); @@ -31,6 +31,24 @@ apps.sort((a,b)=>{ return 0; }); +// Uncomment for testing in the emulator without apps: +// apps = [ +// { +// name:"Test", +// type:"app", +// icon:blankImage, +// sortorder:undefined, +// src:"" +// }, +// { +// name:"Test 2", +// type:"app", +// icon:blankImage, +// sortorder:undefined, +// src:"" +// }, +// ]; + // Initialize layout var layout = new Layout({ type:"v", c:[ @@ -41,8 +59,8 @@ var layout = new Layout({ ]}, // A row for the current app { type:"h", height:rowHeight, c:[ - {type: "img", id:"cur_icon", src:apps[currentApp].icon, width:48, height:48}, - {type: "txt", id:"cur_name", label:apps[currentApp].name, font:largeFont, fillx:1, wrap:1}, + {type: "img", id:"cur_icon", src:blankImage, width:48, height:48}, + {type: "txt", id:"cur_name", label:"", font:largeFont, fillx:1, wrap:1}, ]}, // A row for the next app { type:"h", height:rowHeight, c:[ @@ -54,6 +72,11 @@ var layout = new Layout({ // Drawing logic function render() { + if (!apps.length) { + E.showMessage(/*LANG*/"No apps"); + return load(); + } + // Previous app if (currentApp > 0) { layout.prev_icon.src = apps[currentApp-1].icon; @@ -86,7 +109,7 @@ function launch() { if (!app) return; if (!app.src || Storage.read(app.src)===undefined) { E.showMessage(/*LANG*/"App Source\nNot found"); - setTimeout(drawMenu, 2000); + setTimeout(render, 2000); } else { E.showMessage(/*LANG*/"Loading..."); load(app.src); @@ -116,8 +139,11 @@ function move(step) { // Wire up user input Bangle.setUI('updown', dir => { - if (dir) move(-1*dir); - else launch(); + if (!dir) launch(); + else { + if (process.env.HWVERSION==2) dir *= -1; // "natural scrolling" on touch screen + move(dir); + } }); render(); From 371d78c49b18ac0e09c3734735f1c3dd97db8103 Mon Sep 17 00:00:00 2001 From: foostuff <97034053+foostuff@users.noreply.github.com> Date: Sat, 5 Mar 2022 09:24:59 +0100 Subject: [PATCH 35/46] Create ChangeLog --- apps/clockcal/ChangeLog | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/clockcal/ChangeLog diff --git a/apps/clockcal/ChangeLog b/apps/clockcal/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/clockcal/ChangeLog @@ -0,0 +1 @@ +0.01: New App! From 9ed37056234a169ed85aff0cf25891ae713b3807 Mon Sep 17 00:00:00 2001 From: foostuff <97034053+foostuff@users.noreply.github.com> Date: Sat, 5 Mar 2022 09:26:40 +0100 Subject: [PATCH 36/46] Add files via upload --- apps/clockcal/ChangeLog | 10 ++ apps/clockcal/README.md | 79 ++++++++++++ apps/clockcal/app-icon.js | 1 + apps/clockcal/app.js | 230 +++++++++++++++++++++++++++++++++++ apps/clockcal/app.png | Bin 0 -> 1989 bytes apps/clockcal/metadata.json | 19 +++ apps/clockcal/screenshot.png | Bin 0 -> 1617 bytes apps/clockcal/settings.js | 107 ++++++++++++++++ 8 files changed, 446 insertions(+) create mode 100644 apps/clockcal/README.md create mode 100644 apps/clockcal/app-icon.js create mode 100644 apps/clockcal/app.js create mode 100644 apps/clockcal/app.png create mode 100644 apps/clockcal/metadata.json create mode 100644 apps/clockcal/screenshot.png create mode 100644 apps/clockcal/settings.js diff --git a/apps/clockcal/ChangeLog b/apps/clockcal/ChangeLog index 5560f00bc..ac49dcbd7 100644 --- a/apps/clockcal/ChangeLog +++ b/apps/clockcal/ChangeLog @@ -1 +1,11 @@ 0.01: New App! +0.02: Load widgets after setUI so widclk knows when to hide +0.03: Clock now shows day of week under date. +0.04: Clock can optionally show seconds, date optionally in ISO-8601 format, weekdays and uppercase configurable, too. +0.05: Clock can optionally show ISO-8601 calendar weeknumber (default: Off) + when weekday name "Off": week #: + when weekday name "On": weekday name is cut at 6th position and .# is added +0.06: fixes #1271 - wrong settings name + when weekday name and calendar weeknumber are on then display is # + week is buffered until date or timezone changes +0.07: align default settings with app.js (otherwise the initial displayed settings will be confusing to users) \ No newline at end of file diff --git a/apps/clockcal/README.md b/apps/clockcal/README.md new file mode 100644 index 000000000..28a38f5fd --- /dev/null +++ b/apps/clockcal/README.md @@ -0,0 +1,79 @@ +# Anton Clock - Large font digital watch with seconds and date + +Anton clock uses the "Anton" bold font to show the time in a clear, easily readable manner. On the Bangle.js 2, the time can be read easily even if the screen is locked and unlit. + +## Features + +The basic time representation only shows hours and minutes of the current time. However, Anton clock can show additional information: + +* Seconds can be shown, either always or only if the screen is unlocked. +* To help easy recognition, the seconds can be coloured in blue on the Bangle.js 2. +* Date can be shown in three different formats: + * ISO-8601: 2021-12-19 + * short local format: 19/12/2021, 19.12.2021 + * long local format: DEC 19 2021 +* Weekday can be shown (on seconds screen only instead of year) + +## Usage + +Install Anton clock through the Bangle.js app loader. +Configure it through the default Bangle.js configuration mechanism +(Settings app, "Apps" menu, "Anton clock" submenu). +If you like it, make it your default watch face +(Settings app, "System" menu, "Clock" submenu, select "Anton clock"). + +## Configuration + +Anton clock is configured by the standard settings mechanism of Bangle.js's operating system: +Open the "Settings" app, then the "Apps" submenu and below it the "Anton clock" menu. +You configure Anton clock through several "on/off" switches in two menus. + +### The main menu + +The main menu contains several settings covering Anton clock in general. + +* **Seconds...** - Opens the submenu for configuring the presentation of the current time's seconds. +* **Date** - Format of the date representation. Possible values are + * **Long** - "Long" date format in the current locale. Usually with the month as name, not number. + * **Short** - "Short" date format in the current locale. Usually with the month as number. + * **ISO8601** - Show the date in ISO-8601 format (YYYY-MM-DD), irrespective of the current locale. +* **Show Weekday** - Weekday is shown in the time presentation without seconds. +Weekday name depends on the current locale. +If seconds are shown, the weekday is never shown as there is not enough space on the watch face. +* **Show CalWeek** - Week-number (ISO-8601) is shown. (default: Off) +If "Show Weekday" is "Off" displays the week-number as "week #". +If "Show Weekday" is "On" displays "weekday name short" with " #" . +If seconds are shown, the week number is never shown as there is not enough space on the watch face. +* **Vector font** - Use the built-in vector font for dates and weekday. +This can improve readability. +Otherwise, a scaled version of the built-in 6x8 pixels font is used. + +### The "Seconds" submenu + +The "Seconds" submenu configures how (and if) seconds are shown on the "Anton" watch face. + +* **Show** - Configure when the seconds should be shown at all: + * **Never** - Seconds are never shown. +In this case, hour and minute are a bit more centered on the screen and the clock will always only update every minute. +This saves battery power. + * **Unlocked** - Seconds are shown if the display is unlocked. +On locked displays, only hour, minutes, date and optionally the weekday are shown. +_This option is highly recommended on the Bangle.js 2!_ + * **Always** - Seconds are _always_ shown, irrespective of the display's unlock state. +_Enabling this option increases power consumption as the watch face will update once per second instead of once per minute._ +* **With ":"** - If enabled, a colon ":" is prepended to the seconds. +This resembles the usual time representation "hh:mm:ss", even though the seconds are printed on a separate line. +* **Color** - If enabled, seconds are shown in blue instead of black. +If the date is shown on the seconds screen, it is colored read instead of black. +This make the visual orientation much easier on the watch face. +* **Date** - It is possible to show the date together with the seconds: + * **No** - Date is _not_ shown in the seconds screen. +In this case, the seconds are centered below hour and minute. + * **Year** - Date is shown with day, month, and year. If "Date" in the main settings is configured to _ISO8601_, this is used here, too. Otherwise, the short local format is used. + * **Weekday** - Date is shown with day, month, and weekday. + +The date is coloured in red if the "Coloured" option is chosen. + +## Compatibility + +Anton clock makes use of core Bangle.js 2 features (coloured display, display lock state). It also runs on the Bangle.js 1 but these features are not available there due to hardware restrictions. diff --git a/apps/clockcal/app-icon.js b/apps/clockcal/app-icon.js new file mode 100644 index 000000000..fad03d50f --- /dev/null +++ b/apps/clockcal/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgX/AH4A/AAf+14BBAoPq/Wq1QFB+EP+kLAoNA+CdB3//yEP6ALB/sABYf8gEMgALB6ALJqoLB+tVgH//kQhkQhUABYImCIwPwh3whcA94UCgJHD+AXB/4LCcQQLCKYQLB+EDBZQFCBY/Qh4LJ4ALLl4LFioLCgE/KZMAv4XFBYimBC4/+BYw7DRwQLIV4ILWTQQLDOIUA/ALDAC+t1uv/263/6/Pq/YLC3vv//vM4Oq33rBYP6/u//2/C4Pr1YXC12vBwO+BYO69XmJDQA/ACIA==")) diff --git a/apps/clockcal/app.js b/apps/clockcal/app.js new file mode 100644 index 000000000..356e067f2 --- /dev/null +++ b/apps/clockcal/app.js @@ -0,0 +1,230 @@ +// Clock with large digits using the "Anton" bold font + +const SETTINGSFILE = "clockcal.json"; + +Graphics.prototype.setFontAnton = function(scale) { + // Actual height 69 (68 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAA/gAAAAAAAAAAP/gAAAAAAAAAH//gAAAAAAAAB///gAAAAAAAAf///gAAAAAAAP////gAAAAAAD/////gAAAAAA//////gAAAAAP//////gAAAAH///////gAAAB////////gAAAf////////gAAP/////////gAD//////////AA//////////gAA/////////4AAA////////+AAAA////////gAAAA///////wAAAAA//////8AAAAAA//////AAAAAAA/////gAAAAAAA////4AAAAAAAA///+AAAAAAAAA///gAAAAAAAAA//wAAAAAAAAAA/8AAAAAAAAAAA/AAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////AAAAAB///////8AAAAH////////AAAAf////////wAAA/////////4AAB/////////8AAD/////////+AAH//////////AAP//////////gAP//////////gAP//////////gAf//////////wAf//////////wAf//////////wAf//////////wA//8AAAAAB//4A//wAAAAAAf/4A//gAAAAAAP/4A//gAAAAAAP/4A//gAAAAAAP/4A//wAAAAAAf/4A///////////4Af//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH//////////AAD/////////+AAB/////////8AAA/////////4AAAP////////gAAAD///////+AAAAAf//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAP/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/AAAAAAAAAAA//AAAAAAAAAAA/+AAAAAAAAAAB/8AAAAAAAAAAD//////////gAH//////////gAP//////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAAB/gAAD//4AAAAf/gAAP//4AAAB//gAA///4AAAH//gAB///4AAAf//gAD///4AAA///gAH///4AAD///gAP///4AAH///gAP///4AAP///gAf///4AAf///gAf///4AB////gAf///4AD////gA////4AH////gA////4Af////gA////4A/////gA//wAAB/////gA//gAAH/////gA//gAAP/////gA//gAA///8//gA//gAD///w//gA//wA////g//gA////////A//gA///////8A//gA///////4A//gAf//////wA//gAf//////gA//gAf/////+AA//gAP/////8AA//gAP/////4AA//gAH/////gAA//gAD/////AAA//gAB////8AAA//gAA////wAAA//gAAP///AAAA//gAAD//8AAAA//gAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/+AAAAAD/wAAB//8AAAAP/wAAB///AAAA//wAAB///wAAB//wAAB///4AAD//wAAB///8AAH//wAAB///+AAP//wAAB///+AAP//wAAB////AAf//wAAB////AAf//wAAB////gAf//wAAB////gA///wAAB////gA///wAAB////gA///w//AAf//wA//4A//AAA//wA//gA//AAAf/wA//gB//gAAf/wA//gB//gAAf/wA//gD//wAA//wA//wH//8AB//wA///////////gA///////////gA///////////gA///////////gAf//////////AAf//////////AAP//////////AAP/////////+AAH/////////8AAH///+/////4AAD///+f////wAAA///8P////gAAAf//4H///+AAAAH//gB///wAAAAAP4AAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAAAAAA//wAAAAAAAAAP//wAAAAAAAAB///wAAAAAAAAf///wAAAAAAAH////wAAAAAAA/////wAAAAAAP/////wAAAAAB//////wAAAAAf//////wAAAAH///////wAAAA////////wAAAP////////wAAA///////H/wAAA//////wH/wAAA/////8AH/wAAA/////AAH/wAAA////gAAH/wAAA///4AAAH/wAAA//+AAAAH/wAAA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gAAAAAAAAH/4AAAAAAAAAAH/wAAAAAAAAAAH/wAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//8AAA/////+B///AAA/////+B///wAA/////+B///4AA/////+B///8AA/////+B///8AA/////+B///+AA/////+B////AA/////+B////AA/////+B////AA/////+B////gA/////+B////gA/////+B////gA/////+A////gA//gP/gAAB//wA//gf/AAAA//wA//gf/AAAAf/wA//g//AAAAf/wA//g//AAAA//wA//g//gAAA//wA//g//+AAP//wA//g////////gA//g////////gA//g////////gA//g////////gA//g////////AA//gf///////AA//gf//////+AA//gP//////+AA//gH//////8AA//gD//////4AA//gB//////wAA//gA//////AAAAAAAH////8AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAAAAB///////+AAAAH////////gAAAf////////4AAB/////////8AAD/////////+AAH//////////AAH//////////gAP//////////gAP//////////gAf//////////wAf//////////wAf//////////wAf//////////wAf//////////4A//wAD/4AAf/4A//gAH/wAAP/4A//gAH/wAAP/4A//gAP/wAAP/4A//gAP/4AAf/4A//wAP/+AD//4A///wP//////4Af//4P//////wAf//4P//////wAf//4P//////wAf//4P//////wAP//4P//////gAP//4H//////gAH//4H//////AAH//4D/////+AAD//4D/////8AAB//4B/////4AAA//4A/////wAAAP/4AP////AAAAB/4AD///4AAAAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAADgA//gAAAAAAP/gA//gAAAAAH//gA//gAAAAB///gA//gAAAAP///gA//gAAAD////gA//gAAAf////gA//gAAB/////gA//gAAP/////gA//gAB//////gA//gAH//////gA//gA///////gA//gD///////gA//gf///////gA//h////////gA//n////////gA//////////gAA/////////AAAA////////wAAAA///////4AAAAA///////AAAAAA//////4AAAAAA//////AAAAAAA/////4AAAAAAA/////AAAAAAAA////8AAAAAAAA////gAAAAAAAA///+AAAAAAAAA///4AAAAAAAAA///AAAAAAAAAA//4AAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gB///wAAAAP//4H///+AAAA///8P////gAAB///+f////4AAD///+/////8AAH/////////+AAH//////////AAP//////////gAP//////////gAf//////////gAf//////////wAf//////////wAf//////////wA///////////wA//4D//wAB//4A//wB//gAA//4A//gA//gAAf/4A//gA//AAAf/4A//gA//gAAf/4A//wB//gAA//4A///P//8AH//4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////gAP//////////gAP//////////AAH//////////AAD/////////+AAD///+/////8AAB///8f////wAAAf//4P////AAAAH//wD///8AAAAA/+AAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAAAAAAAAB///+AA/+AAAAP////gA//wAAAf////wA//4AAB/////4A//8AAD/////8A//+AAD/////+A///AAH/////+A///AAP//////A///gAP//////A///gAf//////A///wAf//////A///wAf//////A///wAf//////A///wA///////AB//4A//4AD//AAP/4A//gAB//AAP/4A//gAA//AAP/4A//gAA/+AAP/4A//gAB/8AAP/4A//wAB/8AAf/4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH/////////+AAD/////////8AAB/////////4AAAf////////wAAAP////////AAAAB///////4AAAAAD/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAB/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("EiAnGicnJycnJycnEw=="), 78 + (scale << 8) + (1 << 16)); +}; + +Graphics.prototype.setFontAntonSmall = function(scale) { + // Actual height 53 (52 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAAAAAAAAAAAAAMAAAAAAAAD8AAAAAAAA/8AAAAAAAf/8AAAAAAH//8AAAAAB///8AAAAA////8AAAAP////8AAAD/////8AAB//////8AAf//////8AH///////4A///////+AA///////AAA//////wAAA/////8AAAA////+AAAAA////gAAAAA///4AAAAAA//8AAAAAAA//AAAAAAAA/wAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////wAAA//////8AAB//////+AAH///////gAH///////gAP///////wAf///////4Af///////4A////////8A////////8A////////8A//AAAAD/8A/8AAAAA/8A/8AAAAA/8A/8AAAAA/8A/+AAAAB/8A////////8A////////8A////////8Af///////4Af///////4AP///////wAP///////wAH///////gAD///////AAA//////8AAAP/////wAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAA/4AAAAAAAA/4AAAAAAAB/wAAAAAAAB/wAAAAAAAD/wAAAAAAAD/gAAAAAAAH///////8AP///////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAP8AA//4AAA/8AB//4AAH/8AH//4AAP/8AP//4AA//8AP//4AB//8Af//4AD//8Af//4AP//8A///4Af//8A///4A///8A///4D///8A//AAH///8A/8AAP///8A/8AA//+/8A/8AD//8/8A/+Af//w/8A//////g/8A/////+A/8A/////8A/8Af////4A/8Af////wA/8AP////AA/8AP///+AA/8AH///8AA/8AD///wAA/8AA///AAA/8AAP/4AAA/8AAAAAAAAAAAAAAAAAAAAAAH4AAf/gAAA/4AAf/8AAD/4AAf//AAH/4AAf//gAP/4AAf//wAP/4AAf//wAf/4AAf//4Af/4AAf//4A//4AAf//8A//4AAf//8A//4AAP//8A//A/8AB/8A/8A/8AA/8A/8B/8AA/8A/8B/8AA/8A/+D//AB/8A////////8A////////8A////////8Af///////4Af///////4Af///////wAP///////gAH//9////gAD//4///+AAB//wf//4AAAP/AH//gAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAB//wAAAAAAP//wAAAAAD///wAAAAA////wAAAAH////wAAAB/////wAAAf/////wAAD//////wAA///////wAA/////h/wAA////wB/wAA///8AB/wAA///AAB/wAA//gAAB/wAA////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8AAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AA////4P/+AA////4P//AA////4P//gA////4P//wA////4P//wA////4P//4A////4P//4A////4P//8A////4P//8A////4P//8A/8H/AAB/8A/8H+AAA/8A/8P+AAA/8A/8P+AAA/8A/8P/gAD/8A/8P/////8A/8P/////8A/8P/////8A/8P/////4A/8H/////4A/8H/////wA/8D/////wA/8B/////gA/8A////+AA/8AP///4AAAAAB///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////wAAAf/////8AAB///////AAH///////gAP///////wAP///////wAf///////4Af///////4A////////8A////////8A////////8A/+AH/AB/8A/8AP+AA/8A/4Af+AA/8A/8Af+AA/8A/8Af/gH/8A//4f////8A//4f////8A//4f////8Af/4f////4Af/4f////4AP/4P////wAP/4P////gAH/4H////AAD/4D///+AAB/4B///4AAAP4AP//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAAAA/8AAAAAAAA/8AAAAAB8A/8AAAAB/8A/8AAAAf/8A/8AAAH//8A/8AAA///8A/8AAH///8A/8AA////8A/8AD////8A/8Af////8A/8B/////8A/8P/////8A/8//////8A////////AA///////AAA//////gAAA/////4AAAA/////AAAAA////4AAAAA////AAAAAA///8AAAAAA///gAAAAAA//+AAAAAAA//wAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/gD//gAAA//4P//8AAD//8f///AAH//+////gAH///////wAP///////4AP///////8Af///////8Af///////+Af///////+A////////+A//B//AB/+A/+A/+AA/+A/8Af+AA/+A/+Af+AA/+A//A//AB/+A////////+Af///////+Af///////+Af///////8Af///////8AP///////4AH///////4AH//+////wAD//+////AAA//4P//+AAAP/gH//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAfgAAA///8A/8AAB///+A//AAH////A//gAH////g//wAP////g//wAf////w//4Af////w//4A/////w//8A/////w//8A/////w//8A//gP/wA/8A/8AD/wA/8A/8AD/wAf8A/8AD/gA/8A/+AH/AB/8A////////8A////////8A////////8Af///////4Af///////4Af///////wAP///////wAH///////gAD//////+AAA//////4AAAP/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DhgeFB4eHh4eHh4eDw=="), 60 + (scale << 8) + (1 << 16)); +}; + +// variables defined from settings +var secondsMode; +var secondsColoured; +var secondsWithColon; +var dateOnMain; +var dateOnSecs; +var weekDay; +var calWeek; +var upperCase; +var vectorFont; + +// dynamic variables +var drawTimeout; +var queueMillis = 1000; +var secondsScreen = true; + +var isBangle1 = (process.env.HWVERSION == 1); + +//For development purposes +/* +require('Storage').writeJSON(SETTINGSFILE, { + secondsMode: "Unlocked", // "Never", "Unlocked", "Always" + secondsColoured: true, + secondsWithColon: true, + dateOnMain: "Long", // "Short", "Long", "ISO8601" + dateOnSecs: "Year", // "No", "Year", "Weekday", LEGACY: true/false + weekDay: true, + calWeek: true, + upperCase: true, + vectorFont: true, +}); +*/ + +// OR (also for development purposes) +/* +require('Storage').erase(SETTINGSFILE); +*/ + +// Load settings +function loadSettings() { + // Helper function default setting + function def (value, def) {return value !== undefined ? value : def;} + + var settings = require('Storage').readJSON(SETTINGSFILE, true) || {}; + secondsMode = def(settings.secondsMode, "Never"); + secondsColoured = def(settings.secondsColoured, true); + secondsWithColon = def(settings.secondsWithColon, true); + dateOnMain = def(settings.dateOnMain, "Long"); + dateOnSecs = def(settings.dateOnSecs, "Year"); + weekDay = def(settings.weekDay, true); + calWeek = def(settings.calWeek, false); + upperCase = def(settings.upperCase, true); + vectorFont = def(settings.vectorFont, false); + + // Legacy + if (dateOnSecs === true) + dateOnSecs = "Year"; + if (dateOnSecs === false) + dateOnSecs = "No"; +} + +// schedule a draw for the next second or minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, queueMillis - (Date.now() % queueMillis)); +} + +function updateState() { + if (Bangle.isLCDOn()) { + if ((secondsMode === "Unlocked" && !Bangle.isLocked()) || secondsMode === "Always") { + secondsScreen = true; + queueMillis = 1000; + } else { + secondsScreen = false; + queueMillis = 60000; + } + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +} + +function isoStr(date) { + return date.getFullYear() + "-" + ("0" + (date.getMonth() + 1)).substr(-2) + "-" + ("0" + date.getDate()).substr(-2); +} + +var calWeekBuffer = [false,false,false]; //buffer tz, date, week no (once calculated until other tz or date is requested) +function ISO8601calWeek(date) { //copied from: https://gist.github.com/IamSilviu/5899269#gistcomment-3035480 + dateNoTime = date; dateNoTime.setHours(0,0,0,0); + if (calWeekBuffer[0] === date.getTimezoneOffset() && calWeekBuffer[1] === dateNoTime) return calWeekBuffer[2]; + calWeekBuffer[0] = date.getTimezoneOffset(); + calWeekBuffer[1] = dateNoTime; + var tdt = new Date(date.valueOf()); + var dayn = (date.getDay() + 6) % 7; + tdt.setDate(tdt.getDate() - dayn + 3); + var firstThursday = tdt.valueOf(); + tdt.setMonth(0, 1); + if (tdt.getDay() !== 4) { + tdt.setMonth(0, 1 + ((4 - tdt.getDay()) + 7) % 7); + } + calWeekBuffer[2] = 1 + Math.ceil((firstThursday - tdt) / 604800000); + return calWeekBuffer[2]; +} + +function doColor() { + return !isBangle1 && !Bangle.isLocked() && secondsColoured; +} + +// Actually draw the watch face +function draw() { + var x = g.getWidth() / 2; + var y = g.getHeight() / 2 - (secondsMode !== "Never" ? 24 : (vectorFont ? 12 : 0)); + g.reset(); + /* This is to mark the widget areas during development. + g.setColor("#888") + .fillRect(0, 0, g.getWidth(), 23) + .fillRect(0, g.getHeight() - 23, g.getWidth(), g.getHeight()).reset(); + /* */ + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); // clear whole background (w/o widgets) + var date = new Date(); // Actually the current date, this one is shown + var timeStr = require("locale").time(date, 1); // Hour and minute + g.setFontAlign(0, 0).setFont("Anton").drawString(timeStr, x, y); // draw time + if (secondsScreen) { + y += 65; + var secStr = (secondsWithColon ? ":" : "") + ("0" + date.getSeconds()).substr(-2); + if (doColor()) + g.setColor(0, 0, 1); + g.setFont("AntonSmall"); + if (dateOnSecs !== "No") { // A bit of a complex drawing with seconds on the right and date on the left + g.setFontAlign(1, 0).drawString(secStr, g.getWidth() - (isBangle1 ? 32 : 2), y); // seconds + y -= (vectorFont ? 15 : 13); + x = g.getWidth() / 4 + (isBangle1 ? 12 : 4) + (secondsWithColon ? 0 : g.stringWidth(":") / 2); + var dateStr2 = (dateOnMain === "ISO8601" ? isoStr(date) : require("locale").date(date, 1)); + var year; + var md; + var yearfirst; + if (dateStr2.match(/\d\d\d\d$/)) { // formatted date ends with year + year = (dateOnSecs === "Year" ? dateStr2.slice(-4) : require("locale").dow(date, 1)); + md = dateStr2.slice(0, -4); + if (!md.endsWith(".")) // keep separator before the year only if it is a dot (31.12. but 31/12) + md = md.slice(0, -1); + yearfirst = false; + } else { // formatted date begins with year + if (!dateStr2.match(/^\d\d\d\d/)) // if year position cannot be detected... + dateStr2 = isoStr(date); // ...use ISO date format instead + year = (dateOnSecs === "Year" ? dateStr2.slice(0, 4) : require("locale").dow(date, 1)); + md = dateStr2.slice(5); // never keep separator directly after year + yearfirst = true; + } + if (dateOnSecs === "Weekday" && upperCase) + year = year.toUpperCase(); + g.setFontAlign(0, 0); + if (vectorFont) + g.setFont("Vector", 24); + else + g.setFont("6x8", 2); + if (doColor()) + g.setColor(1, 0, 0); + g.drawString(md, x, (yearfirst ? y + (vectorFont ? 26 : 16) : y)); + g.drawString(year, x, (yearfirst ? y : y + (vectorFont ? 26 : 16))); + } else { + g.setFontAlign(0, 0).drawString(secStr, x, y); // Just the seconds centered + } + } else { // No seconds screen: Show date and optionally day of week + y += (vectorFont ? 50 : (secondsMode !== "Never") ? 52 : 40); + var dateStr = (dateOnMain === "ISO8601" ? isoStr(date) : require("locale").date(date, (dateOnMain === "Long" ? 0 : 1))); + if (upperCase) + dateStr = dateStr.toUpperCase(); + g.setFontAlign(0, 0); + if (vectorFont) + g.setFont("Vector", 24); + else + g.setFont("6x8", 2); + g.drawString(dateStr, x, y); + if (calWeek || weekDay) { + var dowcwStr = ""; + if (calWeek) + dowcwStr = " #" + ("0" + ISO8601calWeek(date)).substring(-2); + if (weekDay) + dowcwStr = require("locale").dow(date, calWeek ? 1 : 0) + dowcwStr; //weekDay e.g. Monday or weekDayShort # e.g. Mon #01 + else //week #01 + dowcwStr = /*LANG*/"week" + dowcwStr; + if (upperCase) + dowcwStr = dowcwStr.toUpperCase(); + g.drawString(dowcwStr, x, y + (vectorFont ? 26 : 16)); + } + } + + // queue next draw + queueDraw(); +} + +// Init the settings of the app +loadSettings(); +// Clear the screen once, at startup +g.clear(); +// Set dynamic state and perform initial drawing +updateState(); +// Register hooks for LCD on/off event and screen lock on/off event +Bangle.on('lcdPower', on => { + updateState(); +}); +Bangle.on('lock', on => { + updateState(); +}); +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); + +// end of file \ No newline at end of file diff --git a/apps/clockcal/app.png b/apps/clockcal/app.png new file mode 100644 index 0000000000000000000000000000000000000000..a38093c5f3b6f88dbc9b75017422dbe237d4407f GIT binary patch literal 1989 zcmV;$2RitPP)jLx_$n|!#a_+a7!4?Zj*KoBI+mq8Z8#{*+o z7DHwNZgKLU(NGK;MJHm2(2Z3wlN9^G$Dl3PLZR*L$JxWF_g-#q5pXO%?4OgH|2gM( z&iUPY&i~`w2to*6Cz0Salm7|*Pv});Rk#kH&o?nKVKf?JV`CKxgR&1SYr2-&`UyG$k%PDI4SU@#m$e3%a_DJdBl84(40z238D&kClk zs;Y82oqX8o)29U(i^UQ;n+PGB&6b*)8u|?i3JT`t=0fr3&YhD;M7F-UxtYZ<46||L z#$^(^di83!ed+D(C4@{&Ojs-yi^VcGH|KCTl9H16n23l7R(HGIbWWX4$8TSNkjR^L zcXzY8Ua#-%?PaT@qoV@@0~H&dOV(ykrCQkT3X65OnG@Zi=UX7pvt31 zj}{pcL)2{nR~LU?!AoakWJE?r@;{iv;h@Tm8#ky@Q&Y1{D-)+L zk?;ux0)h4G*YjJ(#>Q^nzRiCh09LE@!i5U}3JVKgYOOCJ6uR+Sw{CU2-NC`D<_&Lc zZ7nJ)ve|63T3A>ZA0H23aBz^e?A^OJbi$<(>ged0o}Lzbr0D2qQLxA3VcF#5df&c%%k%pC z_wR3NYGVEE(W6Hhh8Y?fqAfC+OyD3EODH`({lS9=J9q8`AeBm6T3YzMGcz-7ZEYHj zMx)V~&1Q$gG4w*>jhws#}m#f8yXryC+C~U z`1tsuqP^K{Rw|XD3shHEi{?XpeSM+eoSYo1)w(dD#ik#GkY~@Hm6eqVUYB7Q5=Ndr zeOgynw`b2D8Znxin?>0WLatxGUQtm|QBiU7#}wE{v` zE79qQ-%ki34hQ+;590L_Ldfha>Fp)d!~y~G@F9PBpO089!Qyrkhl5){BH^9@$<8K( zknwSGHUObsMZ!iMoIj7rNmN(E>qSis+-{VX!tckAKO!Om1qJYW@$I*me+7H^5OR62 z3=ZN&Qctf5g8}2?{1^qN6CZvUtlqoFPd{WbR8}H06H+N04!rjsKKcl1 zHT-^*mm?zsDJcj9aOMowuALuH=N;9*{^ImQhp>7z6pDG^{(i2SkbpPdKwMlnD;pTV zci*9=hFgSsgt0MHSEIZfVy=i!h!F4{kf=Wi^-z~Cfu=;}wcszLg7?YD27=Y7B$L-n$w>wz2ZCjda2n2$gD3L&|#yjuu z2}MPrp#d%zrl%1bi`-l|95{0Zk&&pa4elc$u-j2t3A-JBKOHBPB04%)Buo62QdtSL z8t=akwHjq*n3-7tKg75Bwl+ctsi@#u^m@|L64uIo{WZ*0`actu3LkvHRe$=4-LlzP zG&h4@(OoVyHR0!>Q z7SEqkLVx}VyB!`6&AgGFjjSwOzRV5%{dYK>@c97X&K-RDB~&Whx&>fx5P5mX%|&i5 zES9AaijKycZ{po|gH^j7J|8vvUAr(f#a_qZa-p>qnVHb*(cO)YKgK7YfW2`_r7##U zGXuN*KZ*8JQ)q0&kt0Y?hs%Wn2Ovn)Km8PaeXKu8NC11$U9)D%%lmw+13^*}qN6FH z-+sfTOGr$_fdjDHVKCt4O^lA>^Up#50d{oY$`u$4$j*jDf}1ztbmFV80BqTUEnC3* z|HA1lEy&D-(a5<(Lh$z69KdWwOblM!|B#xBHEXEZd%eW%CT=(JdO4k+urdq>AVk>9 z6Q`5N<>FSIpHBh-Vlss_`<9lKNk2L}#ngwjPIdq7ye|T3ar}q0{vjtPwx88zODg-bLj7E4oP%5!@EeCk*lKg)F X^{k9p7{Urq00000NkvXXu0mjf6Vk;2 literal 0 HcmV?d00001 diff --git a/apps/clockcal/metadata.json b/apps/clockcal/metadata.json new file mode 100644 index 000000000..9c20dca22 --- /dev/null +++ b/apps/clockcal/metadata.json @@ -0,0 +1,19 @@ +{ + "id": "clockcal", + "name": "clockcal Clock", + "version": "0.07", + "description": "A clockcal.", + "readme":"README.md", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"clockcal.app.js","url":"app.js"}, + {"name":"clockcal.settings.js","url":"settings.js"}, + {"name":"clockcal.img","url":"app-icon.js","evaluate":true} + ], + "data": [{"name":"clockcal.json"}] +} diff --git a/apps/clockcal/screenshot.png b/apps/clockcal/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..e949b8a24a4eac5cbd8f8a01ffdd57b3660b939c GIT binary patch literal 1617 zcmV-X2Cn&uP)Q+S zK~#9!?VZUMqaYAPh2#JKvc1UZv~4tDs0p}l)q??3Tx$R!={SxJp})$Q0G+jC0!O8^ zZQJ(gqtoj@Omqnmc!(%iMD!3(V3KEOKA>AlTS_;6Lfh=O!<|dqR0_rLj7-Gw6Z=mp zp~2Trq^-sN$JXdw$RVuLh2YN@K!k`6Pvr(ctjI(h8vf-F??mA#V@N4cYlvqI5okD% z_;DP$JZ&Vq6!#OKe-2k=TnY^!SWV;*Zso@9p8;ZB8eWb#)U4Ef$av?E#0za2E;*)4 zGQr|jEE>MgPlWIg$fmf6shtWlvgg=3Rwde#%EB2ZCZ_CZaPtrhc0d|j{4_}=iN*gE z;u{bi0>vmhZ-Zhq7gZR!WpBGPT@bvP-QB*I3%vNK9g^4e^95YR9HNJMOGEc3^PP9= zeghUcMCX@GDcKZVBE6X1?T|^OpmnsZEZhDZOytNWR<$zI^OT+HG&D3DjmtcxmFGik zJRnpJL9i!eED?_aqL~>jBoBmvl^IAI?bAQ&EayfCLS!S5jl)pgvlP?kIp+`qJ-$`9 zI&Of=#-z_m07)eU0ze=`xV`)nKp=oXp~_BD#mLDJ9wK5fE z#1PK_NhKK)K)?h*keQkSK^pPXNsQt-Sls%7_-cz=S=@s2k+GEj%NkD=(Y+yF1hHNY zWjJb$33G_!II4DCYVYQgVzm5w4K066RQR$vmhmvwd4`4jP#6?u^o~J0xM5rioBqe!IzMMdoTw=&lVajkJ9GY z9%3vj6NW58##mMs+_FIqF^QG?w{A|BqPlI=31#Jm8=kdPNzu*-4r1ur+g_nwO_pDB zSt|nsBB?|GfdB#l1Of;I5C{PT`Vi+s2Euz_W#>-KgN-VUDq z#UUT`_r2FnJ@tTi{%rF%-L<}@?8QSJM06gQ<1o7S3rWrW=F(^C@-1(NO7CJ^d6bax zGyqiu-d<&OgG88Z zc)oUMn41Z;kO2*Z3{U_Fzw*!ML@7qRGi00};%0N+<~AZNBToysfdB#l1d`Ps5P#0|K}m9Y P00000NkvXXu0mjfUbx{% literal 0 HcmV?d00001 diff --git a/apps/clockcal/settings.js b/apps/clockcal/settings.js new file mode 100644 index 000000000..a69cab556 --- /dev/null +++ b/apps/clockcal/settings.js @@ -0,0 +1,107 @@ +// Settings menu for the enhanced Anton clock + +(function(back) { + var FILE = "clockcal.json"; + // Load settings + var settings = Object.assign({ + secondsOnUnlock: false, + }, require('Storage').readJSON(FILE, true) || {}); + + function writeSettings() { + require('Storage').writeJSON(FILE, settings); + } + + // Helper method which uses int-based menu item for set of string values + function stringItems(startvalue, writer, values) { + return { + value: (startvalue === undefined ? 0 : values.indexOf(startvalue)), + format: v => values[v], + min: 0, + max: values.length - 1, + wrap: true, + step: 1, + onchange: v => { + writer(values[v]); + writeSettings(); + } + }; + } + + // Helper method which breaks string set settings down to local settings object + function stringInSettings(name, values) { + return stringItems(settings[name], v => settings[name] = v, values); + } + + var mainmenu = { + "": { + "title": "clockcal clock" + }, + "< Back": () => back(), + "Seconds...": () => E.showMenu(secmenu), + "Date": stringInSettings("dateOnMain", ["Long", "Short", "ISO8601"]), + "Show Weekday": { + value: (settings.weekDay !== undefined ? settings.weekDay : true), + format: v => v ? "On" : "Off", + onchange: v => { + settings.weekDay = v; + writeSettings(); + } + }, + "Show CalWeek": { + value: (settings.calWeek !== undefined ? settings.calWeek : false), + format: v => v ? "On" : "Off", + onchange: v => { + settings.calWeek = v; + writeSettings(); + } + }, + "Uppercase": { + value: (settings.upperCase !== undefined ? settings.upperCase : true), + format: v => v ? "On" : "Off", + onchange: v => { + settings.upperCase = v; + writeSettings(); + } + }, + "Vector font": { + value: (settings.vectorFont !== undefined ? settings.vectorFont : false), + format: v => v ? "On" : "Off", + onchange: v => { + settings.vectorFont = v; + writeSettings(); + } + }, + }; + + // Submenu + var secmenu = { + "": { + "title": "Show seconds..." + }, + "< Back": () => E.showMenu(mainmenu), + "Show": stringInSettings("secondsMode", ["Never", "Unlocked", "Always"]), + "With \":\"": { + value: (settings.secondsWithColon !== undefined ? settings.secondsWithColon : true), + format: v => v ? "On" : "Off", + onchange: v => { + settings.secondsWithColon = v; + writeSettings(); + } + }, + "Color": { + value: (settings.secondsColoured !== undefined ? settings.secondsColoured : true), + format: v => v ? "On" : "Off", + onchange: v => { + settings.secondsColoured = v; + writeSettings(); + } + }, + "Date": stringInSettings("dateOnSecs", ["Year", "Weekday", "No"]) + }; + + // Actually display the menu + E.showMenu(mainmenu); + +}); + +// end of file From a9f857cd7f9b80729562d9af5f1b191bfe87b3eb Mon Sep 17 00:00:00 2001 From: foostuff <97034053+foostuff@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:37:35 +0100 Subject: [PATCH 37/46] Update app.js --- apps/clockcal/app.js | 345 +++++++++++++++---------------------------- 1 file changed, 117 insertions(+), 228 deletions(-) diff --git a/apps/clockcal/app.js b/apps/clockcal/app.js index 356e067f2..fc299912f 100644 --- a/apps/clockcal/app.js +++ b/apps/clockcal/app.js @@ -1,230 +1,119 @@ -// Clock with large digits using the "Anton" bold font - -const SETTINGSFILE = "clockcal.json"; - -Graphics.prototype.setFontAnton = function(scale) { - // Actual height 69 (68 - 0) - g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAA/gAAAAAAAAAAP/gAAAAAAAAAH//gAAAAAAAAB///gAAAAAAAAf///gAAAAAAAP////gAAAAAAD/////gAAAAAA//////gAAAAAP//////gAAAAH///////gAAAB////////gAAAf////////gAAP/////////gAD//////////AA//////////gAA/////////4AAA////////+AAAA////////gAAAA///////wAAAAA//////8AAAAAA//////AAAAAAA/////gAAAAAAA////4AAAAAAAA///+AAAAAAAAA///gAAAAAAAAA//wAAAAAAAAAA/8AAAAAAAAAAA/AAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////AAAAAB///////8AAAAH////////AAAAf////////wAAA/////////4AAB/////////8AAD/////////+AAH//////////AAP//////////gAP//////////gAP//////////gAf//////////wAf//////////wAf//////////wAf//////////wA//8AAAAAB//4A//wAAAAAAf/4A//gAAAAAAP/4A//gAAAAAAP/4A//gAAAAAAP/4A//wAAAAAAf/4A///////////4Af//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH//////////AAD/////////+AAB/////////8AAA/////////4AAAP////////gAAAD///////+AAAAAf//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAP/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/AAAAAAAAAAA//AAAAAAAAAAA/+AAAAAAAAAAB/8AAAAAAAAAAD//////////gAH//////////gAP//////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAAB/gAAD//4AAAAf/gAAP//4AAAB//gAA///4AAAH//gAB///4AAAf//gAD///4AAA///gAH///4AAD///gAP///4AAH///gAP///4AAP///gAf///4AAf///gAf///4AB////gAf///4AD////gA////4AH////gA////4Af////gA////4A/////gA//wAAB/////gA//gAAH/////gA//gAAP/////gA//gAA///8//gA//gAD///w//gA//wA////g//gA////////A//gA///////8A//gA///////4A//gAf//////wA//gAf//////gA//gAf/////+AA//gAP/////8AA//gAP/////4AA//gAH/////gAA//gAD/////AAA//gAB////8AAA//gAA////wAAA//gAAP///AAAA//gAAD//8AAAA//gAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/+AAAAAD/wAAB//8AAAAP/wAAB///AAAA//wAAB///wAAB//wAAB///4AAD//wAAB///8AAH//wAAB///+AAP//wAAB///+AAP//wAAB////AAf//wAAB////AAf//wAAB////gAf//wAAB////gA///wAAB////gA///wAAB////gA///w//AAf//wA//4A//AAA//wA//gA//AAAf/wA//gB//gAAf/wA//gB//gAAf/wA//gD//wAA//wA//wH//8AB//wA///////////gA///////////gA///////////gA///////////gAf//////////AAf//////////AAP//////////AAP/////////+AAH/////////8AAH///+/////4AAD///+f////wAAA///8P////gAAAf//4H///+AAAAH//gB///wAAAAAP4AAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAAAAAA//wAAAAAAAAAP//wAAAAAAAAB///wAAAAAAAAf///wAAAAAAAH////wAAAAAAA/////wAAAAAAP/////wAAAAAB//////wAAAAAf//////wAAAAH///////wAAAA////////wAAAP////////wAAA///////H/wAAA//////wH/wAAA/////8AH/wAAA/////AAH/wAAA////gAAH/wAAA///4AAAH/wAAA//+AAAAH/wAAA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gAAAAAAAAH/4AAAAAAAAAAH/wAAAAAAAAAAH/wAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//8AAA/////+B///AAA/////+B///wAA/////+B///4AA/////+B///8AA/////+B///8AA/////+B///+AA/////+B////AA/////+B////AA/////+B////AA/////+B////gA/////+B////gA/////+B////gA/////+A////gA//gP/gAAB//wA//gf/AAAA//wA//gf/AAAAf/wA//g//AAAAf/wA//g//AAAA//wA//g//gAAA//wA//g//+AAP//wA//g////////gA//g////////gA//g////////gA//g////////gA//g////////AA//gf///////AA//gf//////+AA//gP//////+AA//gH//////8AA//gD//////4AA//gB//////wAA//gA//////AAAAAAAH////8AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAAAAB///////+AAAAH////////gAAAf////////4AAB/////////8AAD/////////+AAH//////////AAH//////////gAP//////////gAP//////////gAf//////////wAf//////////wAf//////////wAf//////////wAf//////////4A//wAD/4AAf/4A//gAH/wAAP/4A//gAH/wAAP/4A//gAP/wAAP/4A//gAP/4AAf/4A//wAP/+AD//4A///wP//////4Af//4P//////wAf//4P//////wAf//4P//////wAf//4P//////wAP//4P//////gAP//4H//////gAH//4H//////AAH//4D/////+AAD//4D/////8AAB//4B/////4AAA//4A/////wAAAP/4AP////AAAAB/4AD///4AAAAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAADgA//gAAAAAAP/gA//gAAAAAH//gA//gAAAAB///gA//gAAAAP///gA//gAAAD////gA//gAAAf////gA//gAAB/////gA//gAAP/////gA//gAB//////gA//gAH//////gA//gA///////gA//gD///////gA//gf///////gA//h////////gA//n////////gA//////////gAA/////////AAAA////////wAAAA///////4AAAAA///////AAAAAA//////4AAAAAA//////AAAAAAA/////4AAAAAAA/////AAAAAAAA////8AAAAAAAA////gAAAAAAAA///+AAAAAAAAA///4AAAAAAAAA///AAAAAAAAAA//4AAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gB///wAAAAP//4H///+AAAA///8P////gAAB///+f////4AAD///+/////8AAH/////////+AAH//////////AAP//////////gAP//////////gAf//////////gAf//////////wAf//////////wAf//////////wA///////////wA//4D//wAB//4A//wB//gAA//4A//gA//gAAf/4A//gA//AAAf/4A//gA//gAAf/4A//wB//gAA//4A///P//8AH//4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////gAP//////////gAP//////////AAH//////////AAD/////////+AAD///+/////8AAB///8f////wAAAf//4P////AAAAH//wD///8AAAAA/+AAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAAAAAAAAB///+AA/+AAAAP////gA//wAAAf////wA//4AAB/////4A//8AAD/////8A//+AAD/////+A///AAH/////+A///AAP//////A///gAP//////A///gAf//////A///wAf//////A///wAf//////A///wAf//////A///wA///////AB//4A//4AD//AAP/4A//gAB//AAP/4A//gAA//AAP/4A//gAA/+AAP/4A//gAB/8AAP/4A//wAB/8AAf/4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH/////////+AAD/////////8AAB/////////4AAAf////////wAAAP////////AAAAB///////4AAAAAD/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAB/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("EiAnGicnJycnJycnEw=="), 78 + (scale << 8) + (1 << 16)); -}; - -Graphics.prototype.setFontAntonSmall = function(scale) { - // Actual height 53 (52 - 0) - g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAAAAAAAAAAAAAMAAAAAAAAD8AAAAAAAA/8AAAAAAAf/8AAAAAAH//8AAAAAB///8AAAAA////8AAAAP////8AAAD/////8AAB//////8AAf//////8AH///////4A///////+AA///////AAA//////wAAA/////8AAAA////+AAAAA////gAAAAA///4AAAAAA//8AAAAAAA//AAAAAAAA/wAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////wAAA//////8AAB//////+AAH///////gAH///////gAP///////wAf///////4Af///////4A////////8A////////8A////////8A//AAAAD/8A/8AAAAA/8A/8AAAAA/8A/8AAAAA/8A/+AAAAB/8A////////8A////////8A////////8Af///////4Af///////4AP///////wAP///////wAH///////gAD///////AAA//////8AAAP/////wAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAA/4AAAAAAAA/4AAAAAAAB/wAAAAAAAB/wAAAAAAAD/wAAAAAAAD/gAAAAAAAH///////8AP///////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAP8AA//4AAA/8AB//4AAH/8AH//4AAP/8AP//4AA//8AP//4AB//8Af//4AD//8Af//4AP//8A///4Af//8A///4A///8A///4D///8A//AAH///8A/8AAP///8A/8AA//+/8A/8AD//8/8A/+Af//w/8A//////g/8A/////+A/8A/////8A/8Af////4A/8Af////wA/8AP////AA/8AP///+AA/8AH///8AA/8AD///wAA/8AA///AAA/8AAP/4AAA/8AAAAAAAAAAAAAAAAAAAAAAH4AAf/gAAA/4AAf/8AAD/4AAf//AAH/4AAf//gAP/4AAf//wAP/4AAf//wAf/4AAf//4Af/4AAf//4A//4AAf//8A//4AAf//8A//4AAP//8A//A/8AB/8A/8A/8AA/8A/8B/8AA/8A/8B/8AA/8A/+D//AB/8A////////8A////////8A////////8Af///////4Af///////4Af///////wAP///////gAH//9////gAD//4///+AAB//wf//4AAAP/AH//gAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAB//wAAAAAAP//wAAAAAD///wAAAAA////wAAAAH////wAAAB/////wAAAf/////wAAD//////wAA///////wAA/////h/wAA////wB/wAA///8AB/wAA///AAB/wAA//gAAB/wAA////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8AAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AA////4P/+AA////4P//AA////4P//gA////4P//wA////4P//wA////4P//4A////4P//4A////4P//8A////4P//8A////4P//8A/8H/AAB/8A/8H+AAA/8A/8P+AAA/8A/8P+AAA/8A/8P/gAD/8A/8P/////8A/8P/////8A/8P/////8A/8P/////4A/8H/////4A/8H/////wA/8D/////wA/8B/////gA/8A////+AA/8AP///4AAAAAB///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////wAAAf/////8AAB///////AAH///////gAP///////wAP///////wAf///////4Af///////4A////////8A////////8A////////8A/+AH/AB/8A/8AP+AA/8A/4Af+AA/8A/8Af+AA/8A/8Af/gH/8A//4f////8A//4f////8A//4f////8Af/4f////4Af/4f////4AP/4P////wAP/4P////gAH/4H////AAD/4D///+AAB/4B///4AAAP4AP//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAAAA/8AAAAAAAA/8AAAAAB8A/8AAAAB/8A/8AAAAf/8A/8AAAH//8A/8AAA///8A/8AAH///8A/8AA////8A/8AD////8A/8Af////8A/8B/////8A/8P/////8A/8//////8A////////AA///////AAA//////gAAA/////4AAAA/////AAAAA////4AAAAA////AAAAAA///8AAAAAA///gAAAAAA//+AAAAAAA//wAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/gD//gAAA//4P//8AAD//8f///AAH//+////gAH///////wAP///////4AP///////8Af///////8Af///////+Af///////+A////////+A//B//AB/+A/+A/+AA/+A/8Af+AA/+A/+Af+AA/+A//A//AB/+A////////+Af///////+Af///////+Af///////8Af///////8AP///////4AH///////4AH//+////wAD//+////AAA//4P//+AAAP/gH//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAfgAAA///8A/8AAB///+A//AAH////A//gAH////g//wAP////g//wAf////w//4Af////w//4A/////w//8A/////w//8A/////w//8A//gP/wA/8A/8AD/wA/8A/8AD/wAf8A/8AD/gA/8A/+AH/AB/8A////////8A////////8A////////8Af///////4Af///////4Af///////wAP///////wAH///////gAD//////+AAA//////4AAAP/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DhgeFB4eHh4eHh4eDw=="), 60 + (scale << 8) + (1 << 16)); -}; - -// variables defined from settings -var secondsMode; -var secondsColoured; -var secondsWithColon; -var dateOnMain; -var dateOnSecs; -var weekDay; -var calWeek; -var upperCase; -var vectorFont; - -// dynamic variables -var drawTimeout; -var queueMillis = 1000; -var secondsScreen = true; - -var isBangle1 = (process.env.HWVERSION == 1); - -//For development purposes -/* -require('Storage').writeJSON(SETTINGSFILE, { - secondsMode: "Unlocked", // "Never", "Unlocked", "Always" - secondsColoured: true, - secondsWithColon: true, - dateOnMain: "Long", // "Short", "Long", "ISO8601" - dateOnSecs: "Year", // "No", "Year", "Weekday", LEGACY: true/false - weekDay: true, - calWeek: true, - upperCase: true, - vectorFont: true, -}); -*/ - -// OR (also for development purposes) -/* -require('Storage').erase(SETTINGSFILE); -*/ - -// Load settings -function loadSettings() { - // Helper function default setting - function def (value, def) {return value !== undefined ? value : def;} - - var settings = require('Storage').readJSON(SETTINGSFILE, true) || {}; - secondsMode = def(settings.secondsMode, "Never"); - secondsColoured = def(settings.secondsColoured, true); - secondsWithColon = def(settings.secondsWithColon, true); - dateOnMain = def(settings.dateOnMain, "Long"); - dateOnSecs = def(settings.dateOnSecs, "Year"); - weekDay = def(settings.weekDay, true); - calWeek = def(settings.calWeek, false); - upperCase = def(settings.upperCase, true); - vectorFont = def(settings.vectorFont, false); - - // Legacy - if (dateOnSecs === true) - dateOnSecs = "Year"; - if (dateOnSecs === false) - dateOnSecs = "No"; -} - -// schedule a draw for the next second or minute -function queueDraw() { - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = setTimeout(function() { - drawTimeout = undefined; - draw(); - }, queueMillis - (Date.now() % queueMillis)); -} - -function updateState() { - if (Bangle.isLCDOn()) { - if ((secondsMode === "Unlocked" && !Bangle.isLocked()) || secondsMode === "Always") { - secondsScreen = true; - queueMillis = 1000; - } else { - secondsScreen = false; - queueMillis = 60000; - } - draw(); // draw immediately, queue redraw - } else { // stop draw timer - if (drawTimeout) clearTimeout(drawTimeout); - drawTimeout = undefined; - } -} - -function isoStr(date) { - return date.getFullYear() + "-" + ("0" + (date.getMonth() + 1)).substr(-2) + "-" + ("0" + date.getDate()).substr(-2); -} - -var calWeekBuffer = [false,false,false]; //buffer tz, date, week no (once calculated until other tz or date is requested) -function ISO8601calWeek(date) { //copied from: https://gist.github.com/IamSilviu/5899269#gistcomment-3035480 - dateNoTime = date; dateNoTime.setHours(0,0,0,0); - if (calWeekBuffer[0] === date.getTimezoneOffset() && calWeekBuffer[1] === dateNoTime) return calWeekBuffer[2]; - calWeekBuffer[0] = date.getTimezoneOffset(); - calWeekBuffer[1] = dateNoTime; - var tdt = new Date(date.valueOf()); - var dayn = (date.getDay() + 6) % 7; - tdt.setDate(tdt.getDate() - dayn + 3); - var firstThursday = tdt.valueOf(); - tdt.setMonth(0, 1); - if (tdt.getDay() !== 4) { - tdt.setMonth(0, 1 + ((4 - tdt.getDay()) + 7) % 7); - } - calWeekBuffer[2] = 1 + Math.ceil((firstThursday - tdt) / 604800000); - return calWeekBuffer[2]; -} - -function doColor() { - return !isBangle1 && !Bangle.isLocked() && secondsColoured; -} - -// Actually draw the watch face -function draw() { - var x = g.getWidth() / 2; - var y = g.getHeight() / 2 - (secondsMode !== "Never" ? 24 : (vectorFont ? 12 : 0)); - g.reset(); - /* This is to mark the widget areas during development. - g.setColor("#888") - .fillRect(0, 0, g.getWidth(), 23) - .fillRect(0, g.getHeight() - 23, g.getWidth(), g.getHeight()).reset(); - /* */ - g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); // clear whole background (w/o widgets) - var date = new Date(); // Actually the current date, this one is shown - var timeStr = require("locale").time(date, 1); // Hour and minute - g.setFontAlign(0, 0).setFont("Anton").drawString(timeStr, x, y); // draw time - if (secondsScreen) { - y += 65; - var secStr = (secondsWithColon ? ":" : "") + ("0" + date.getSeconds()).substr(-2); - if (doColor()) - g.setColor(0, 0, 1); - g.setFont("AntonSmall"); - if (dateOnSecs !== "No") { // A bit of a complex drawing with seconds on the right and date on the left - g.setFontAlign(1, 0).drawString(secStr, g.getWidth() - (isBangle1 ? 32 : 2), y); // seconds - y -= (vectorFont ? 15 : 13); - x = g.getWidth() / 4 + (isBangle1 ? 12 : 4) + (secondsWithColon ? 0 : g.stringWidth(":") / 2); - var dateStr2 = (dateOnMain === "ISO8601" ? isoStr(date) : require("locale").date(date, 1)); - var year; - var md; - var yearfirst; - if (dateStr2.match(/\d\d\d\d$/)) { // formatted date ends with year - year = (dateOnSecs === "Year" ? dateStr2.slice(-4) : require("locale").dow(date, 1)); - md = dateStr2.slice(0, -4); - if (!md.endsWith(".")) // keep separator before the year only if it is a dot (31.12. but 31/12) - md = md.slice(0, -1); - yearfirst = false; - } else { // formatted date begins with year - if (!dateStr2.match(/^\d\d\d\d/)) // if year position cannot be detected... - dateStr2 = isoStr(date); // ...use ISO date format instead - year = (dateOnSecs === "Year" ? dateStr2.slice(0, 4) : require("locale").dow(date, 1)); - md = dateStr2.slice(5); // never keep separator directly after year - yearfirst = true; - } - if (dateOnSecs === "Weekday" && upperCase) - year = year.toUpperCase(); - g.setFontAlign(0, 0); - if (vectorFont) - g.setFont("Vector", 24); - else - g.setFont("6x8", 2); - if (doColor()) - g.setColor(1, 0, 0); - g.drawString(md, x, (yearfirst ? y + (vectorFont ? 26 : 16) : y)); - g.drawString(year, x, (yearfirst ? y : y + (vectorFont ? 26 : 16))); - } else { - g.setFontAlign(0, 0).drawString(secStr, x, y); // Just the seconds centered - } - } else { // No seconds screen: Show date and optionally day of week - y += (vectorFont ? 50 : (secondsMode !== "Never") ? 52 : 40); - var dateStr = (dateOnMain === "ISO8601" ? isoStr(date) : require("locale").date(date, (dateOnMain === "Long" ? 0 : 1))); - if (upperCase) - dateStr = dateStr.toUpperCase(); - g.setFontAlign(0, 0); - if (vectorFont) - g.setFont("Vector", 24); - else - g.setFont("6x8", 2); - g.drawString(dateStr, x, y); - if (calWeek || weekDay) { - var dowcwStr = ""; - if (calWeek) - dowcwStr = " #" + ("0" + ISO8601calWeek(date)).substring(-2); - if (weekDay) - dowcwStr = require("locale").dow(date, calWeek ? 1 : 0) + dowcwStr; //weekDay e.g. Monday or weekDayShort # e.g. Mon #01 - else //week #01 - dowcwStr = /*LANG*/"week" + dowcwStr; - if (upperCase) - dowcwStr = dowcwStr.toUpperCase(); - g.drawString(dowcwStr, x, y + (vectorFont ? 26 : 16)); - } - } - - // queue next draw - queueDraw(); -} - -// Init the settings of the app -loadSettings(); -// Clear the screen once, at startup -g.clear(); -// Set dynamic state and perform initial drawing -updateState(); -// Register hooks for LCD on/off event and screen lock on/off event -Bangle.on('lcdPower', on => { - updateState(); -}); -Bangle.on('lock', on => { - updateState(); -}); -// Show launcher when middle button pressed -Bangle.setUI("clock"); -// Load widgets Bangle.loadWidgets(); -Bangle.drawWidgets(); -// end of file \ No newline at end of file +var s = Object.assign({ + CAL_ROWS: 4, //number of calendar rows.(weeks) Shouldn't exceed 5 when using widgets. + BUZZ_ON_BT: true, //2x slow buzz on disconnect, 2x fast buzz on connect. Will be extra widget eventually + MODE24: true, //24h mode vs 12h mode + FIRSTDAYOFFSET: 6, //First day of the week: 0-6: Sun, Sat, Fri, Thu, Wed, Tue, Mon + REDSUN: true, // Use red color for sunday? + REDSAT: true, // Use red color for saturday? +}, require('Storage').readJSON("clockcal.json", true) || {}); + +const h = g.getHeight(); +const w = g.getWidth(); +const CELL_W = w / 7; +const CELL_H = 15; +const CAL_Y = h - s.CAL_ROWS * CELL_H; +const DEBUG = false; + +function drawMinutes() { + if (DEBUG) console.log("|-->minutes"); + var d = new Date(); + var hours = s.MODE24 ? d.getHours().toString().padStart(2, ' ') : ((d.getHours() + 24) % 12 || 12).toString().padStart(2, ' '); + var minutes = d.getMinutes().toString().padStart(2, '0'); + var textColor = NRF.getSecurityStatus().connected ? '#fff' : '#f00'; + var size = 50; + var clock_x = (w - 20) / 2; + if (dimSeconds) { + size = 65; + clock_x = 4 + (w / 2); + } + g.setBgColor(0); + g.setColor(textColor); + g.setFont("Vector", size); + g.setFontAlign(0, 1); + g.drawString(hours + ":" + minutes, clock_x, CAL_Y - 10, 1); + var nextminute = (61 - d.getSeconds()); + if (typeof minuteInterval !== "undefined") clearTimeout(minuteInterval); + minuteInterval = setTimeout(drawMinutes, nextminute * 1000); +} + +function drawSeconds() { + if (DEBUG) console.log("|--->seconds"); + var d = new Date(); + g.setColor(); + g.fillRect(w - 31, CAL_Y - 36, w - 3, CAL_Y - 19); + g.setBgColor(0); + g.setColor('#fff'); + g.setFont("Vector", 24); + g.setFontAlign(1, 1); + g.drawString(" " + d.getSeconds().toString().padStart(2, '0'), w, CAL_Y - 13); + if (typeof secondInterval !== "undefined") clearTimeout(secondInterval); + if (!dimSeconds) secondInterval = setTimeout(drawSeconds, 1000); +} + +function drawCalendar() { + if (DEBUG) console.log("CALENDAR"); + var d = new Date(); + g.reset(); + g.setBgColor(0); + g.clear(); + drawMinutes(); + if (!dimSeconds) drawSeconds(); + const dow = (s.FIRSTDAYOFFSET + d.getDay()) % 7; //MO=0, SU=6 + const today = d.getDate(); + var rD = new Date(d.getTime()); + rD.setDate(rD.getDate() - dow); + var rDate = rD.getDate(); + g.setFontAlign(1, 1); + for (var y = 1; y <= s.CAL_ROWS; y++) { + for (var x = 1; x <= 7; x++) { + bottomrightX = x * CELL_W - 2; + bottomrightY = y * CELL_H + CAL_Y; + g.setFont("Vector", 16); + var fg = ((s.REDSUN && rD.getDay() == 0) || (s.REDSAT && rD.getDay() == 6)) ? '#f00' : '#fff'; + if (y == 1 && today == rDate) { + g.setColor('#0f0'); + g.fillRect(bottomrightX - CELL_W + 1, bottomrightY - CELL_H - 1, bottomrightX, bottomrightY - 2); + g.setColor('#000'); + g.drawString(rDate, bottomrightX, bottomrightY); + } + else { + g.setColor(fg); + g.drawString(rDate, bottomrightX, bottomrightY); + } + rD.setDate(rDate + 1); + rDate = rD.getDate(); + } + } + Bangle.drawWidgets(); + + var nextday = (3600 * 24) - (d.getHours() * 3600 + d.getMinutes() * 60 + d.getSeconds() + 1); + if (DEBUG) console.log("Next Day:" + (nextday / 3600)); + if (typeof dayInterval !== "undefined") clearTimeout(dayInterval); + dayInterval = setTimeout(drawCalendar, nextday * 1000); +} + +function BTevent() { + drawMinutes(); + if (s.BUZZ_ON_BT) { + var interval = (NRF.getSecurityStatus().connected) ? 100 : 500; + Bangle.buzz(interval); + setTimeout(function () { Bangle.buzz(interval); }, interval * 3); + } +} + +//register events +Bangle.on('lock', locked => { + if (typeof secondInterval !== "undefined") clearTimeout(secondInterval); + dimSeconds = locked; //dim seconds if lock=on + drawCalendar(); +}); +NRF.on('connect', BTevent); +NRF.on('disconnect', BTevent); + + +dimSeconds = Bangle.isLocked(); +drawCalendar(); + +Bangle.setUI("clock"); From d1c6f59c28a1008ea0a62c9c5e54e798af2a635a Mon Sep 17 00:00:00 2001 From: foostuff <97034053+foostuff@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:39:09 +0100 Subject: [PATCH 38/46] Add files via upload --- apps/clockcal/app.png | Bin 1989 -> 3396 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/apps/clockcal/app.png b/apps/clockcal/app.png index a38093c5f3b6f88dbc9b75017422dbe237d4407f..2e2e4461e0ed2e9c7052ab5347e8cc771792b650 100644 GIT binary patch literal 3396 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 KMNUMnLSTaLT**rS From 6ccbe2e030d7ba58bce6019772dce0903a03b42e Mon Sep 17 00:00:00 2001 From: foostuff <97034053+foostuff@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:42:07 +0100 Subject: [PATCH 39/46] Add files via upload --- apps/clockcal/screenshot.png | Bin 1617 -> 2826 bytes apps/clockcal/screenshot2.png | Bin 0 -> 2811 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/clockcal/screenshot2.png diff --git a/apps/clockcal/screenshot.png b/apps/clockcal/screenshot.png index e949b8a24a4eac5cbd8f8a01ffdd57b3660b939c..fcfde0c4abced61bbca0643cedfb597925db3b34 100644 GIT binary patch literal 2826 zcmb`J_gfNb8^xK*aS+Pc0I_Q#~wXXLM-NG1PBSAy{N8Uc+82jJGW}iVzdN5 zw7vv@m%>tmjo$XY?=Tt-0F_0_7K?m7c=UNtxbo@j70K$hgh;n^faMWUXiH@C;SOV= zt3~Kf?#R}|JY~^kA$?=jHF)0#Lfmc5$uigELm9w}{2;#t0+|X3q`vxnc=i9?vJdcF zs!?3?C z?5NEBD={xWzhJZ#9uY~c{T6Vh(O_{fR?UC8=tlGd>4Dyfdt3tiM?Y$xYfG;&~YpQR43>=r_8eUTr=twbe2(qhpP;l{F zrUB>3ZEP{y{pK~LZG~$eLG>c-a%p z8@^H!4N_6WFSc*KA(?rlV|f8s>bV#_)nu5N^sJu?5uHqeFr<0DI-5DSC=xCSz-A4F z!Wdok&2#kfSP=-pv2FTc_I|^%oT)@%{w%I1J6ni%VubP7n(Z?x3V#@f#LhNo5hpMdYelbFk(~(~Q|jj{|_h ze1(KJ1pZGr|5G_p;+mKFJn4`={=;tL@druknD?QAwHm8$7hN_|hj8?0iPUQQ&uepN ze9*!Pw(5R3(MrHJ8zb2t-zycf?z6H$pKmL~_*%2ds8=^`UGs~&m%O|>n*_5W6+ih; z9k2hC&QDbyS@m*BYXr(*oPb#2L~>3$96SWt^xKfDY|GjycO)XLE%xgC?l8%nAG^S_ zr#tR1SBtiwU%%R8YpM)`>AXCjF6Q9ZAl!_9>2xiWwp*UlSG7M^*q!~ke=X65ByR6C zx+my7To9QheD%eBwCP4nX)H2JQp?P_j;s>~f0RJ^cFTwJPO)BdW7n1SdJa;(UcnZ# zbJVN-iUG|PjXlbw3}4)_E@R>>JwXQfHauL*pW@4MByHVq&1GMwm_v>Kv8t9UuDa>K zF0D7*=r{}~V^&uE1V_aNsJ(@1}74&$ab6tl6slOROp?w)9XVRqq{30Y0Y*&u+ycCH`PX#H&q{1bn9^5 z%^8g0Na#K(y4Z?JpWX2M5*~pHd645S)GpkR{wPB0G--i5_6m|o^1r}E?z@Qxd?9{6 zl_Hxj4bjMc;4$VtkWX^E@*Y}9Hm&-^9Mhh(J3c%yq&Pkz9Ml$x0gWNO{wOf0HN5cG z7;pzS(|&j~Jwl&gx5+D z8}gJPMRPtMH$1*djmlyoIp-a-PJ4tJN&$jVHCpNbCH`A(yLaT=;;Fz%+?$;+ln;j_ zQa*3_v~phH*4R~px85{|7F%7Ec$5~eS&c|m#R<MY zsdOkSRzp3M)^Rwf33sgzQ&&2D?_es{eSZo!)al1=@|Def`zFiR=%$Uw$204Mx(WU& zO+~e(I1ZGtP>sTp##+5DW_X)2m*<)d_Wim!->VLuE#VJ5LG%l*7GUf4U}*H~FWv~V zp4^wK(z^wHE?q`t zzdpM}fsRHSc6f5$u@oa+uqpZdq%G?NoZ=1hsd9mU-^cP(cg+d@i`FNt$qUikzhZYK#K3#6&8W}xxZxcebL&16|WoY(NffDJ} z9-IaBS{#1%tMc&Yl+vCmKZIFbH#rTVucy^=Ri$&rqM-mHO-ThE6sHQnD6SI9y{h}4 zn6JOEu;B;cYZd46c$u?5h|aLL_D3h>Ek~TTqeA+`w3sJ%dx{lM(6iqcU<9#s1GC|- zKT;b}amxx0q&)6}57XP(UwNK^%T#VqZ{`jtA+y-xSV*5#cVITNp~{5kyIQH6|7}=z z;0vJ)hm{ZvWox2IdCvlw4iqF+7uqnu#flc@=KeZV(qPKk?WDl?|5pIg+z!!TicR@1x`9ZN delta 1611 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 T<=j3=!wNvyyV}**;%@v0LX%Et literal 0 HcmV?d00001 From 9a451d2b5521492d565f0fb708a610de56aefb45 Mon Sep 17 00:00:00 2001 From: foostuff <97034053+foostuff@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:43:48 +0100 Subject: [PATCH 40/46] Add files via upload --- apps/clockcal/app-icon.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/clockcal/app-icon.js b/apps/clockcal/app-icon.js index fad03d50f..5bab7853e 100644 --- a/apps/clockcal/app-icon.js +++ b/apps/clockcal/app-icon.js @@ -1 +1 @@ -require("heatshrink").decompress(atob("mEwgX/AH4A/AAf+14BBAoPq/Wq1QFB+EP+kLAoNA+CdB3//yEP6ALB/sABYf8gEMgALB6ALJqoLB+tVgH//kQhkQhUABYImCIwPwh3whcA94UCgJHD+AXB/4LCcQQLCKYQLB+EDBZQFCBY/Qh4LJ4ALLl4LFioLCgE/KZMAv4XFBYimBC4/+BYw7DRwQLIV4ILWTQQLDOIUA/ALDAC+t1uv/263/6/Pq/YLC3vv//vM4Oq33rBYP6/u//2/C4Pr1YXC12vBwO+BYO69XmJDQA/ACIA==")) +require("heatshrink").decompress(atob("mEwwkECqMCkQACiEDkIXQuUnkUBkESiYXPgN/u8jgEx/8vC6E3k9xiH//8/C6BHCPQMSL6EDO4cgaf4A/ACEC+YFDl4FEAAM/+ISHbIIECh4FB+QWEA4PwCQsfC4gVBkYGDgP/mQ4CCQk/iAXEAQTiCgMiDQQSFiATDBgQXCgILBEQkQBwYrEC4sPLQRpCBwoXECgUCC4oSBAggXHNQRfDV4X/JgQXJBIIXFgYuDC5QKBiE/C4f/bwgXJmanGJgoSDiTQBmQMBE4JYBfwJ5BBYMiYQISEB4IAB+KdCAgfwAwTrCn4SDiczAAMwGwMTmR0CmECBgRSBCQwA/AGsBgEQAgYABAwcHu93s4GBqAXEmLrCiYICmICBj4XEgvABIMMqECiIXCgQXCegLYBC4NwF4VcAQNV4EPkEhF4REBgYXCiQvCu4UCAQMFJYRfKgxGBuxfGLgkjFgMCkMBmEjgEigZaBI4XFMYcRC4kBmRhBkMQgI5DF4MFgAXCLARfCFoIvDkZmBhnF4sA5gvDYghfEHIQJDAAhQBIAPwVQMTgQvCNIMhAwJfBR4MMU4JRB+RJBiUQgUDVwMgYwMBgcwX4amBqBQBiTqBgUQh8RmJhCL4IvC4HMR4ZaEAgIBBL4LBDL5EBmI5BkQvBXwIGBmMPMwMvkEFR4VcR4UgU4MSC4UQmIJBn7dBiQNBqoXBPYNQh8Q+MB+MvgEvG4JyBj8A+RkBhlQd4ZHBiBYCL4bBELxEAA==")) \ No newline at end of file From feb78c0704f1f9d7aa0a2b0ccf3e99d9c846a62d Mon Sep 17 00:00:00 2001 From: foostuff <97034053+foostuff@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:44:45 +0100 Subject: [PATCH 41/46] Update ChangeLog --- apps/clockcal/ChangeLog | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/apps/clockcal/ChangeLog b/apps/clockcal/ChangeLog index ac49dcbd7..e874c8c67 100644 --- a/apps/clockcal/ChangeLog +++ b/apps/clockcal/ChangeLog @@ -1,11 +1 @@ -0.01: New App! -0.02: Load widgets after setUI so widclk knows when to hide -0.03: Clock now shows day of week under date. -0.04: Clock can optionally show seconds, date optionally in ISO-8601 format, weekdays and uppercase configurable, too. -0.05: Clock can optionally show ISO-8601 calendar weeknumber (default: Off) - when weekday name "Off": week #: - when weekday name "On": weekday name is cut at 6th position and .# is added -0.06: fixes #1271 - wrong settings name - when weekday name and calendar weeknumber are on then display is # - week is buffered until date or timezone changes -0.07: align default settings with app.js (otherwise the initial displayed settings will be confusing to users) \ No newline at end of file +0.01: Initial upload From 7027baea542ddc3687f9a16c5f17ab5ee3a5b01c Mon Sep 17 00:00:00 2001 From: foostuff <97034053+foostuff@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:45:41 +0100 Subject: [PATCH 42/46] Update README.md --- apps/clockcal/README.md | 92 ++++++++--------------------------------- 1 file changed, 17 insertions(+), 75 deletions(-) diff --git a/apps/clockcal/README.md b/apps/clockcal/README.md index 28a38f5fd..cf6fa6ed9 100644 --- a/apps/clockcal/README.md +++ b/apps/clockcal/README.md @@ -1,79 +1,21 @@ -# Anton Clock - Large font digital watch with seconds and date +# Clock & Calendar by Michael -Anton clock uses the "Anton" bold font to show the time in a clear, easily readable manner. On the Bangle.js 2, the time can be read easily even if the screen is locked and unlit. +This is my "Hello World". I first made this watchface almost 10 years ago for my original Pebble and Pebble Time and I missed this so much, that I had to write it for the BangleJS2. +I know that it seems redundant because there already **is** a *time&cal*-app, but it didn't fit my style. -## Features +- locked screen with only one minimal update/minute +- ![locked screen](https://foostuff.github.io/BangleApps/apps/clockcal/screenshot.png) +- unlocked screen (twist?) with seconds +- ![unlocked screen](https://foostuff.github.io/BangleApps/apps/clockcal/screenshot2.png) -The basic time representation only shows hours and minutes of the current time. However, Anton clock can show additional information: +## Configurable Features +- Number of calendar rows (weeks) +- Buzz on connect/disconnect (I know, this should be an extra widget, but for now, it is a configurable setting) +- Clock Mode (24h/12h). Doesn't have an am/pm indicator, because I don't really care. It's configurable because it was easy. +- First day of the week +- Red Saturday +- Red Sunday -* Seconds can be shown, either always or only if the screen is unlocked. -* To help easy recognition, the seconds can be coloured in blue on the Bangle.js 2. -* Date can be shown in three different formats: - * ISO-8601: 2021-12-19 - * short local format: 19/12/2021, 19.12.2021 - * long local format: DEC 19 2021 -* Weekday can be shown (on seconds screen only instead of year) - -## Usage - -Install Anton clock through the Bangle.js app loader. -Configure it through the default Bangle.js configuration mechanism -(Settings app, "Apps" menu, "Anton clock" submenu). -If you like it, make it your default watch face -(Settings app, "System" menu, "Clock" submenu, select "Anton clock"). - -## Configuration - -Anton clock is configured by the standard settings mechanism of Bangle.js's operating system: -Open the "Settings" app, then the "Apps" submenu and below it the "Anton clock" menu. -You configure Anton clock through several "on/off" switches in two menus. - -### The main menu - -The main menu contains several settings covering Anton clock in general. - -* **Seconds...** - Opens the submenu for configuring the presentation of the current time's seconds. -* **Date** - Format of the date representation. Possible values are - * **Long** - "Long" date format in the current locale. Usually with the month as name, not number. - * **Short** - "Short" date format in the current locale. Usually with the month as number. - * **ISO8601** - Show the date in ISO-8601 format (YYYY-MM-DD), irrespective of the current locale. -* **Show Weekday** - Weekday is shown in the time presentation without seconds. -Weekday name depends on the current locale. -If seconds are shown, the weekday is never shown as there is not enough space on the watch face. -* **Show CalWeek** - Week-number (ISO-8601) is shown. (default: Off) -If "Show Weekday" is "Off" displays the week-number as "week #". -If "Show Weekday" is "On" displays "weekday name short" with " #" . -If seconds are shown, the week number is never shown as there is not enough space on the watch face. -* **Vector font** - Use the built-in vector font for dates and weekday. -This can improve readability. -Otherwise, a scaled version of the built-in 6x8 pixels font is used. - -### The "Seconds" submenu - -The "Seconds" submenu configures how (and if) seconds are shown on the "Anton" watch face. - -* **Show** - Configure when the seconds should be shown at all: - * **Never** - Seconds are never shown. -In this case, hour and minute are a bit more centered on the screen and the clock will always only update every minute. -This saves battery power. - * **Unlocked** - Seconds are shown if the display is unlocked. -On locked displays, only hour, minutes, date and optionally the weekday are shown. -_This option is highly recommended on the Bangle.js 2!_ - * **Always** - Seconds are _always_ shown, irrespective of the display's unlock state. -_Enabling this option increases power consumption as the watch face will update once per second instead of once per minute._ -* **With ":"** - If enabled, a colon ":" is prepended to the seconds. -This resembles the usual time representation "hh:mm:ss", even though the seconds are printed on a separate line. -* **Color** - If enabled, seconds are shown in blue instead of black. -If the date is shown on the seconds screen, it is colored read instead of black. -This make the visual orientation much easier on the watch face. -* **Date** - It is possible to show the date together with the seconds: - * **No** - Date is _not_ shown in the seconds screen. -In this case, the seconds are centered below hour and minute. - * **Year** - Date is shown with day, month, and year. If "Date" in the main settings is configured to _ISO8601_, this is used here, too. Otherwise, the short local format is used. - * **Weekday** - Date is shown with day, month, and weekday. - -The date is coloured in red if the "Coloured" option is chosen. - -## Compatibility - -Anton clock makes use of core Bangle.js 2 features (coloured display, display lock state). It also runs on the Bangle.js 1 but these features are not available there due to hardware restrictions. +## Feedback +The clock works for me in a 24h/MondayFirst/WeekendFree environment but is not well-tested with other settings. +So if something isn't working, please tell me. From ae221a9cd7cd890d00e33b0beb0b1b4828363f7b Mon Sep 17 00:00:00 2001 From: foostuff <97034053+foostuff@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:46:56 +0100 Subject: [PATCH 43/46] Update settings.js --- apps/clockcal/settings.js | 191 ++++++++++++++++++-------------------- 1 file changed, 88 insertions(+), 103 deletions(-) diff --git a/apps/clockcal/settings.js b/apps/clockcal/settings.js index a69cab556..cc2a78181 100644 --- a/apps/clockcal/settings.js +++ b/apps/clockcal/settings.js @@ -1,107 +1,92 @@ -// Settings menu for the enhanced Anton clock +(function (back) { + var FILE = "clockcal.json"; -(function(back) { - var FILE = "clockcal.json"; - // Load settings - var settings = Object.assign({ - secondsOnUnlock: false, - }, require('Storage').readJSON(FILE, true) || {}); + settings = Object.assign({ + CAL_ROWS: 4, //number of calendar rows.(weeks) Shouldn't exceed 5 when using widgets. + BUZZ_ON_BT: true, //2x slow buzz on disconnect, 2x fast buzz on connect. Will be extra widget eventually + MODE24: true, //24h mode vs 12h mode + FIRSTDAY: 6, //First day of the week: mo, tu, we, th, fr, sa, su + REDSUN: true, // Use red color for sunday? + REDSAT: true, // Use red color for saturday? + }, require('Storage').readJSON(FILE, true) || {}); - function writeSettings() { - require('Storage').writeJSON(FILE, settings); - } - // Helper method which uses int-based menu item for set of string values - function stringItems(startvalue, writer, values) { - return { - value: (startvalue === undefined ? 0 : values.indexOf(startvalue)), - format: v => values[v], - min: 0, - max: values.length - 1, - wrap: true, - step: 1, - onchange: v => { - writer(values[v]); - writeSettings(); - } - }; - } + function writeSettings() { + require('Storage').writeJSON(FILE, settings); + } - // Helper method which breaks string set settings down to local settings object - function stringInSettings(name, values) { - return stringItems(settings[name], v => settings[name] = v, values); - } - - var mainmenu = { - "": { - "title": "clockcal clock" - }, - "< Back": () => back(), - "Seconds...": () => E.showMenu(secmenu), - "Date": stringInSettings("dateOnMain", ["Long", "Short", "ISO8601"]), - "Show Weekday": { - value: (settings.weekDay !== undefined ? settings.weekDay : true), - format: v => v ? "On" : "Off", - onchange: v => { - settings.weekDay = v; - writeSettings(); - } - }, - "Show CalWeek": { - value: (settings.calWeek !== undefined ? settings.calWeek : false), - format: v => v ? "On" : "Off", - onchange: v => { - settings.calWeek = v; - writeSettings(); - } - }, - "Uppercase": { - value: (settings.upperCase !== undefined ? settings.upperCase : true), - format: v => v ? "On" : "Off", - onchange: v => { - settings.upperCase = v; - writeSettings(); - } - }, - "Vector font": { - value: (settings.vectorFont !== undefined ? settings.vectorFont : false), - format: v => v ? "On" : "Off", - onchange: v => { - settings.vectorFont = v; - writeSettings(); - } - }, - }; - - // Submenu - var secmenu = { - "": { - "title": "Show seconds..." - }, - "< Back": () => E.showMenu(mainmenu), - "Show": stringInSettings("secondsMode", ["Never", "Unlocked", "Always"]), - "With \":\"": { - value: (settings.secondsWithColon !== undefined ? settings.secondsWithColon : true), - format: v => v ? "On" : "Off", - onchange: v => { - settings.secondsWithColon = v; - writeSettings(); - } - }, - "Color": { - value: (settings.secondsColoured !== undefined ? settings.secondsColoured : true), - format: v => v ? "On" : "Off", - onchange: v => { - settings.secondsColoured = v; - writeSettings(); - } - }, - "Date": stringInSettings("dateOnSecs", ["Year", "Weekday", "No"]) - }; - - // Actually display the menu - E.showMenu(mainmenu); - -}); - -// end of file + menu = { + "": { "title": "Clock & Calendar" }, + "< Back": () => back(), + 'Buzz(dis)conn.?': { + value: settings.BUZZ_ON_BT, + format: v => v ? "On" : "Off", + onchange: v => { + settings.BUZZ_ON_BT = v; + writeSettings(); + } + }, + '#Calendar Rows': { + value: settings.CAL_ROWS, + min: 0, max: 6, + onchange: v => { + settings.CAL_ROWS = v; + writeSettings(); + } + }, + 'Clock mode': { + value: settings.MODE24, + format: v => v ? "24h" : "12h", + onchange: v => { + settings.MODE24 = v; + writeSettings(); + } + }, + 'First Day': { + value: settings.FIRSTDAY, + min: 0, max: 6, + format: v => ["Sun", "Sat", "Fri", "Thu", "Wed", "Tue", "Mon"][v], + onchange: v => { + settings.FIRSTDAY = v; + writeSettings(); + } + }, + 'Red Saturday?': { + value: settings.REDSAT, + format: v => v ? "On" : "Off", + onchange: v => { + settings.REDSAT = v; + writeSettings(); + } + }, + 'Red Sunday?': { + value: settings.REDSUN, + format: v => v ? "On" : "Off", + onchange: v => { + settings.REDSUN = v; + writeSettings(); + } + }, + 'Load deafauls?': { + value: 0, + min: 0, max: 1, + format: v => ["No", "Yes"][v], + onchange: v => { + if (v == 1) { + settings = { + CAL_ROWS: 4, //number of calendar rows.(weeks) Shouldn't exceed 5 when using widgets. + BUZZ_ON_BT: true, //2x slow buzz on disconnect, 2x fast buzz on connect. + MODE24: true, //24h mode vs 12h mode + FIRSTDAY: 6, //First day of the week: mo, tu, we, th, fr, sa, su + REDSUN: true, // Use red color for sunday? + REDSAT: true, // Use red color for saturday? + }; + writeSettings(); + load() + } + } + }, + } + // Show the menu + E.showMenu(menu); +}) From 2f47070e11d6ad5ee7213dae9b072348a3b25416 Mon Sep 17 00:00:00 2001 From: foostuff <97034053+foostuff@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:48:42 +0100 Subject: [PATCH 44/46] Update metadata.json --- apps/clockcal/metadata.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/clockcal/metadata.json b/apps/clockcal/metadata.json index 9c20dca22..ccc84a980 100644 --- a/apps/clockcal/metadata.json +++ b/apps/clockcal/metadata.json @@ -1,11 +1,11 @@ { "id": "clockcal", - "name": "clockcal Clock", - "version": "0.07", - "description": "A clockcal.", + "name": "Clock & Calendar", + "version": "0.01", + "description": "Clock with Calendar", "readme":"README.md", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"}], + "screenshots": [{"url":"screenshot.png"},{"url":"screenshot2.png"}], "type": "clock", "tags": "clock", "supports": ["BANGLEJS","BANGLEJS2"], From 6ae1498eac545d563e50ade6841d905cc73e160c Mon Sep 17 00:00:00 2001 From: foostuff <97034053+foostuff@users.noreply.github.com> Date: Sat, 5 Mar 2022 11:53:17 +0100 Subject: [PATCH 45/46] Update README.md --- apps/clockcal/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/clockcal/README.md b/apps/clockcal/README.md index cf6fa6ed9..b37fbeaa4 100644 --- a/apps/clockcal/README.md +++ b/apps/clockcal/README.md @@ -18,4 +18,4 @@ I know that it seems redundant because there already **is** a *time&cal*-app, bu ## Feedback The clock works for me in a 24h/MondayFirst/WeekendFree environment but is not well-tested with other settings. -So if something isn't working, please tell me. +So if something isn't working, please tell me: https://github.com/foostuff/BangleApps/issues From d91a7a68e44f57bdb7a39076f6d0913f82b7871d Mon Sep 17 00:00:00 2001 From: foostuff <97034053+foostuff@users.noreply.github.com> Date: Sat, 5 Mar 2022 12:04:47 +0100 Subject: [PATCH 46/46] Update README.md --- apps/clockcal/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/clockcal/README.md b/apps/clockcal/README.md index b37fbeaa4..c19ee54a6 100644 --- a/apps/clockcal/README.md +++ b/apps/clockcal/README.md @@ -10,8 +10,8 @@ I know that it seems redundant because there already **is** a *time&cal*-app, bu ## Configurable Features - Number of calendar rows (weeks) -- Buzz on connect/disconnect (I know, this should be an extra widget, but for now, it is a configurable setting) -- Clock Mode (24h/12h). Doesn't have an am/pm indicator, because I don't really care. It's configurable because it was easy. +- Buzz on connect/disconnect (I know, this should be an extra widget, but for now, it is included) +- Clock Mode (24h/12h). Doesn't have an am/pm indicator. It's only there because it was easy. - First day of the week - Red Saturday - Red Sunday