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 01/13] 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 02/13] 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 03/13] 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 04/13] 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 05/13] 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 06/13] 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 07/13] 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 08/13] 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 09/13] 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 10/13] 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 11/13] 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 12/13] 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 From 73b493bb86891d572c05260c54be8a24b105b1f1 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Mon, 7 Mar 2022 15:54:53 +0000 Subject: [PATCH 13/13] recorder 0.12: Fix 'Back' label positioning on track/graph display, make translateable --- apps/recorder/ChangeLog | 1 + apps/recorder/app.js | 52 +++++++++++++++++++------------------ apps/recorder/metadata.json | 2 +- 3 files changed, 29 insertions(+), 26 deletions(-) diff --git a/apps/recorder/ChangeLog b/apps/recorder/ChangeLog index 60477ae97..963944144 100644 --- a/apps/recorder/ChangeLog +++ b/apps/recorder/ChangeLog @@ -15,3 +15,4 @@ 0.09: Show correct number for log in overwrite prompt 0.10: Fix broken recorder settings (when launched from settings app) 0.11: Fix KML and GPX export when there is no GPS data +0.12: Fix 'Back' label positioning on track/graph display, make translateable diff --git a/apps/recorder/app.js b/apps/recorder/app.js index 7075563aa..d900c12c1 100644 --- a/apps/recorder/app.js +++ b/apps/recorder/app.js @@ -49,11 +49,11 @@ function showMainMenu() { }; } const mainmenu = { - '': { 'title': 'Recorder' }, + '': { 'title': /*LANG*/'Recorder' }, '< Back': ()=>{load();}, - 'RECORD': { + /*LANG*/'RECORD': { value: !!settings.recording, - format: v=>v?"On":"Off", + format: v=>v?/*LANG*/"On":/*LANG*/"Off", onchange: v => { setTimeout(function() { E.showMenu(); @@ -66,7 +66,7 @@ function showMainMenu() { }, 1); } }, - 'File #': { + /*LANG*/'File #': { value: getTrackNumber(settings.file), min: 0, max: 99, @@ -77,8 +77,8 @@ function showMainMenu() { updateSettings(); } }, - 'View Tracks': ()=>{viewTracks();}, - 'Time Period': { + /*LANG*/'View Tracks': ()=>{viewTracks();}, + /*LANG*/'Time Period': { value: settings.period||10, min: 1, max: 120, @@ -103,15 +103,15 @@ function showMainMenu() { function viewTracks() { const menu = { - '': { 'title': 'Tracks' } + '': { 'title': /*LANG*/'Tracks' } }; var found = false; require("Storage").list(/^recorder\.log.*\.csv$/,{sf:true}).forEach(filename=>{ found = true; - menu["Track "+getTrackNumber(filename)] = ()=>viewTrack(filename,false); + menu[/*LANG*/"Track "+getTrackNumber(filename)] = ()=>viewTrack(filename,false); }); if (!found) - menu["No Tracks found"] = function(){}; + menu[/*LANG*/"No Tracks found"] = function(){}; menu['< Back'] = () => { showMainMenu(); }; return E.showMenu(menu); } @@ -175,38 +175,38 @@ function asTime(v){ function viewTrack(filename, info) { if (!info) { - E.showMessage("Loading...","Track "+getTrackNumber(filename)); + E.showMessage(/*LANG*/"Loading...",/*LANG*/"Track "+getTrackNumber(filename)); info = getTrackInfo(filename); } //console.log(info); const menu = { - '': { 'title': 'Track '+info.fn } + '': { 'title': /*LANG*/'Track '+info.fn } }; if (info.time) menu[info.time.toISOString().substr(0,16).replace("T"," ")] = function(){}; menu["Duration"] = { value : asTime(info.duration)}; menu["Records"] = { value : ""+info.records }; if (info.fields.includes("Latitude")) - menu['Plot Map'] = function() { + menu[/*LANG*/'Plot Map'] = function() { info.qOSTM = false; plotTrack(info); }; if (osm && info.fields.includes("Latitude")) - menu['Plot OpenStMap'] = function() { + menu[/*LANG*/'Plot OpenStMap'] = function() { info.qOSTM = true; plotTrack(info); } if (info.fields.includes("Altitude")) - menu['Plot Alt.'] = function() { + menu[/*LANG*/'Plot Alt.'] = function() { plotGraph(info, "Altitude"); }; if (info.fields.includes("Latitude")) - menu['Plot Speed'] = function() { + menu[/*LANG*/'Plot Speed'] = function() { plotGraph(info, "Speed"); }; // TODO: steps, heart rate? - menu['Erase'] = function() { - E.showPrompt("Delete Track?").then(function(v) { + menu[/*LANG*/'Erase'] = function() { + E.showPrompt(/*LANG*/"Delete Track?").then(function(v) { if (v) { settings.recording = false; updateSettings(); @@ -238,7 +238,7 @@ function viewTrack(filename, info) { } E.showMenu(); // remove menu - E.showMessage("Drawing...","Track "+info.fn); + E.showMessage(/*LANG*/"Drawing...",/*LANG*/"Track "+info.fn); g.flip(); // on buffered screens, draw a not saying we're busy g.clear(1); var s = require("Storage"); @@ -305,17 +305,18 @@ function viewTrack(filename, info) { g.drawString(require("locale").distance(dist),g.getWidth() / 2, g.getHeight() - 20); g.setFont("6x8",2); g.setFontAlign(0,0,3); - g.drawString("Back",g.getWidth() - 10, g.getHeight() - 40); + var isBTN3 = "BTN3" in global; + g.drawString(/*LANG*/"Back",g.getWidth() - 10, isBTN3 ? (g.getHeight() - 40) : (g.getHeight()/2)); setWatch(function() { viewTrack(info.fn, info); - }, global.BTN3||BTN1); + }, isBTN3?BTN3:BTN1); Bangle.drawWidgets(); g.flip(); } function plotGraph(info, style) { "ram" E.showMenu(); // remove menu - E.showMessage("Calculating...","Track "+info.fn); + E.showMessage(/*LANG*/"Calculating...",/*LANG*/"Track "+info.fn); var filename = info.filename; var infn = new Float32Array(80); var infc = new Uint16Array(80); @@ -334,7 +335,7 @@ function viewTrack(filename, info) { strt = c[timeIdx]; } if (style=="Altitude") { - title = "Altitude (m)"; + title = /*LANG*/"Altitude (m)"; var altIdx = info.fields.indexOf("Altitude"); while(l!==undefined) { ++nl;c=l.split(",");l = f.readLine(f); @@ -344,7 +345,7 @@ function viewTrack(filename, info) { infc[i]++; } } else if (style=="Speed") { - title = "Speed (m/s)"; + title = /*LANG*/"Speed (m/s)"; var latIdx = info.fields.indexOf("Latitude"); var lonIdx = info.fields.indexOf("Longitude"); // skip until we find our first data @@ -404,10 +405,11 @@ function viewTrack(filename, info) { }); g.setFont("6x8",2); g.setFontAlign(0,0,3); - g.drawString("Back",g.getWidth() - 10, g.getHeight() - 40); + var isBTN3 = "BTN3" in global; + g.drawString(/*LANG*/"Back",g.getWidth() - 10, isBTN3 ? (g.getHeight() - 40) : (g.getHeight()/2)); setWatch(function() { viewTrack(info.filename, info); - }, global.BTN3||BTN1); + }, isBTN3?BTN3:BTN1); g.flip(); } diff --git a/apps/recorder/metadata.json b/apps/recorder/metadata.json index 56865e885..09873dada 100644 --- a/apps/recorder/metadata.json +++ b/apps/recorder/metadata.json @@ -2,7 +2,7 @@ "id": "recorder", "name": "Recorder", "shortName": "Recorder", - "version": "0.11", + "version": "0.12", "description": "Record GPS position, heart rate and more in the background, then download to your PC.", "icon": "app.png", "tags": "tool,outdoors,gps,widget",