From 43a68fb908f7eca0adf27079b5be3cbfa2236fac Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 2 Dec 2021 19:01:40 +0000 Subject: [PATCH 1/6] Pebble: 0.03 changed font to Leco1976, updated screenshots --- apps.json | 2 +- apps/pebble/ChangeLog | 1 + apps/pebble/pebble.app.js | 23 ++++++++++++++--------- apps/pebble/pebble_screenshot.png | Bin 2799 -> 2560 bytes apps/pebble/pebble_screenshot2.png | Bin 2736 -> 2531 bytes apps/pebble/pebble_screenshot3.png | Bin 2788 -> 2617 bytes 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/apps.json b/apps.json index 877218135..8e0de6827 100644 --- a/apps.json +++ b/apps.json @@ -4628,7 +4628,7 @@ "id": "pebble", "name": "Pebble Clock", "shortName": "Pebble", - "version": "0.02", + "version": "0.03", "description": "A pebble style clock to keep the rebellion going", "readme": "README.md", "icon": "pebble.png", diff --git a/apps/pebble/ChangeLog b/apps/pebble/ChangeLog index d352d98b6..54f2e7452 100644 --- a/apps/pebble/ChangeLog +++ b/apps/pebble/ChangeLog @@ -1,2 +1,3 @@ 0.01: first release 0.02: included deployment of pebble.settings.js in apps.json +0.03: Changed time font to LECO1976Regular42 diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index 62159055d..45cce90e4 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -1,7 +1,11 @@ +Graphics.prototype.setFontLECO1976Regular42 = function(scale) { + // Actual height 42 (41 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAAA/AAAAAAAAH/AAAAAAAA//AAAAAAAP//AAAAAAB///AAAAAAP///AAAAAB////AAAAAf////AAAAD////4AAAAf////AAAAH////4AAAA////+AAAAA////wAAAAA///+AAAAAA///gAAAAAA//8AAAAAAA//gAAAAAAA/4AAAAAAAA/AAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAH/AAAAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA//h////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////gD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4AAAH/AAA/4B/gH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAA////wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA////x//AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/4B////AAA/wB////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA//gAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA/4AAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA////wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA/4B/wH/AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAA///////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAP+AAH/AAAAH+AAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), 46, atob("ERkmHyYmJiYmJCYmEQ=="), 60+(scale<<8)+(1<<16)); +} -Graphics.prototype.setFontQahiri = function(scale) { - // Actual height 60 (60 - 1) - g.setFontCustom(atob("AAAAAAAAfAAAAAAAAAAAAP4AAAAAAAAAAAD/AAAAAAAAAAAB/wAAAAAAAAAAAf8AAAAAAAAAAAH/AAAAAAAAAAAA/wAAAAAAAAAAAH4AAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAB8AAAAAAAAAAAD/gAAAAAAAAAAH/4AAAAAAAAAAP/8AAAAAAAAAAP/4AAAAAAAAAAf/4AAAAAAAAAA//wAAAAAAAAAB//gAAAAAAAAAD//AAAAAAAAAAD//AAAAAAAAAAH/+AAAAAAAAAAP/8AAAAAAAAAAf/4AAAAAAAAAAf/4AAAAAAAAAA//wAAAAAAAAAB//gAAAAAAAAAD//AAAAAAAAAAH/+AAAAAAAAAAH/+AAAAAAAAAAP/8AAAAAAAAAAH/4AAAAAAAAAAB/wAAAAAAAAAAAPwAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD/AAAD/AAAAAAA/wAAA/wAAAAAAP8AAAP8AAAAAAD/AAAD/AAAAAAA/wAAA/wAAAAAAP8AAAP8AAAAAAD/AAAD/AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af///AAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af///AAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA///+A/wAAAAAAP///gP8AAAAAAD///4D/AAAAAAA///+A/wAAAAAAP///gP8AAAAAAD///4D/AAAAAAA///+A/wAAAAAAH///gH8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///AAAAAAAAAAP//wAAAAAAAAAD//8AAAAAAAAAA///AAAAAAAAAAP//wAAAAAAAAAD//8AAAAAAAAAA///AAAAAAAAAAP//wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+A/wAAAAAAP///gP8AAAAAAD///4D/AAAAAAA///+A/wAAAAAAP///gP8AAAAAAD///4D/AAAAAAA///+A/wAAAAAAP///gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af///AAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af///AAAAAAA/wH///wAAAAAAH8A///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af///AAAAAAA/wH///wAAAAAAP8B///8AAAAAAD/Af///AAAAAAA/wH///wAAAAAAH8A///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA/wAAAAAAAAAAAP8AAAAAAAAAAAD/AAAAAAAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA///+A/wAAAAAAP///gP8AAAAAAD///4D/AAAAAAA///+A/wAAAAAAP///gP8AAAAAAD///4D/AAAAAAA///+A/wAAAAAAP///gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA/wH+A/wAAAAAAP8B/gP8AAAAAAD/Af4D/AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAP/////8AAAAAAD//////AAAAAAA//////wAAAAAAH/////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAfAAAAAAAAAfwAP4AAAAAAAAP8AD/AAAAAAAAD/gB/wAAAAAAAA/4Af8AAAAAAAAP+AH/AAAAAAAAD/AA/wAAAAAAAAfgAH4AAAAAAAABwAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DR0bDBsbGxsbGxsbDQ=="), 80+(scale<<8)+(1<<16)); +Graphics.prototype.setFontLECO1976Regular22 = function(scale) { + // Actual height 22 (21 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/nA/+cD/5wP/nAAAAAAAAPwAA/gAD+AAPwAAAAAD+AAP4AA/gAAAAAAAAAAAAAcOAP//A//8D//wP//AHDgAcOAP//A//8D//wP//AHDgAAAAAAAAH/jgf+OB/44H/jj8OP/w4//Dj/8OPxw/4HD/gcP+Bw/4AAAAAAAP+AA/8AD/wQOHHA4c8D//wP/8A//gAD4AAfAAH/8A//wP//A84cDjhwIP/AA/8AB/wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8ABwAAAAAAAAD8AAP4AA/gAD8AAAAAAAAAAAEAAD+AB//A///v/D//gB/wABwAAAAAADgAA/wAf/4P8///wf/4AP8AAOAAAAAAAAAyAAHcAAPwAD/gAP/AA/8AA/AAH8AAMwAAAAAAAAAAAAADgAAOAAA4AAf8AD/wAP/AA/8AAOAAA4AADgAAAAAAAAAAD8AAfwAB/AAD8AAAAAAAADgAAOAAA4AADgAAOAAA4AADgAAAAAAAAAADgAAOAAA4AADgAAAAAAAAABwAB/AA/8A//gP/gA/wADwAAIAAAAAAD//wP//A//8D//wOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA4AcDgBwOAHA//8D//wP//A//8AABwAAHAAAcAAAAAAAA+f8D5/wPn/A+f8DhxwOHHA4ccDhxwP/HA/8cD/xwP/HAAAAAAAAOAHA4AcDhxwOHHA4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/wAP/AA/8AD/wAAHAAAcAABwAAHAA//8D//wP//A//8AAAAAAAA/98D/3wP/fA/98DhxwOHHA4ccDhxwOH/A4f8Dh/wOH/AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccDh/wOH/A4f8Dh/wAAAAAAAD4AAPgAA+AADgAAOAAA4AADgAAP//A//8D//wP//AAAAAAAAP//A//8D//wP//A4ccDhxwOHHA4ccD//wP//A//8D//wAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA//8D//wP//A//8AAAAAAAAOA4A4DgDgOAOA4AAAAAAAAOA/A4H8DgfwOA/AAAAAAAAB4AAPwAA/AAD8AAf4ABzgAPPAA8cAHh4AAAAAAAAAAAAHHAAccABxwAHHAAccABxwAHHAAccABxwAHHAAAAAAAAAOHAA4cADzwAPPAAf4AB/gAD8AAPwAAeAAB4AAAAAAAAA+AAD4AAPgAA+ecDh9wOH3A4fcDhwAP/AA/8AD/wAP/AAAAAAAAAP//4///j//+P//44ADjn/OOf845/zjnHOP8c4//zj//OP/84AAAAAAAP//A//8D//wP//A4cADhwAOHAA4cAD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA//8D//wP9/A/j8AAAAAAAA//8D//wP//A//8DgBwOAHA4AcDgBwOAHA4AcDgBwOAHAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA8A8D//wH/+AP/wAf+AAAAAAAAD//wP//A//8D//wOHHA4ccDhxwOHHA4ccDhxwOAHA4AcAAAAAAAA//8D//wP//A//8DhwAOHAA4cADhwAOHAA4cADgAAOAAAAAAD//wP//A//8D//wOAHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA//8D//wP//A//8ABwAAHAAAcAABwAP//A//8D//wP//AAAAAAAAP//A//8D//wP//AAAAAAAAOAHA4AcDgBwOAHA4AcDgBwOAHA//8D//wP//A//8AAAAAAAA//8D//wP//A//8AHwAA/AAP8AB/wAPn/A8f8DB/wIH/AAAAAAAAP//A//8D//wP//AAAcAABwAAHAAAcAABwAAHAAAAAAAAP//A//8D//wP//Af8AAP+AAH/AAD8AAHwAD/AB/wAf8AP+AA//8D//wP//AAAAAAAAP//A//8D//wP//AfwAAfwAAfwAAfwAAfwP//A//8D//wAAAAAAAAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//wP//A//8D//wAAAAAAAD//wP//A//8D//wOHAA4cADhwAOHAA/8AD/wAP/AA/8AAAAAP//A//8D//wP//A4AcDgBwOAHA4AcD//+P//4///j//+AAA4AADgAAAP//A//8D//wP//A4eADh+AOH8A4f4D/3wP/HA/8MD/wQAAAAAAAD/xwP/HA/8cD/xwOHHA4ccDhxwOHHA4f8Dh/wOH/A4f8AAAAAAAA4AADgAAOAAA//8D//wP//A//8DgAAOAAA4AADgAAAAAA//8D//wP//A//8AABwAAHAAAcAABwP//A//8D//wP//AAAADAAAPgAA/wAD/4AB/8AA/8AAfwAB/AA/8Af+AP/AA/wAD4AAMAAA4AAD+AAP/gA//8AH/wAB/AAf8Af/wP/4A/4AD/gAP/4AH/8AB/wAB/AB/8D//wP/gA/gADgAAIABA4AcDwDwPw/Afn4Af+AA/wAD/AA//AH5+A/D8DwDwOAHAgAEAAAAP/AA/8AD/wAP/AAAf8AB/wAH/AAf8D/wAP/AA/8AD/wAAAAAAAADh/wOH/A4f8Dh/wOHHA4ccDhxwOHHA/8cD/xwP/HA/8cAAAAAAAAf//9///3///f//9wAA3AADcAAMAAAOAAA/gAD/wAH/8AB/8AA/wAAPAAAEAAAAHAADcAANwAB3///f//9///wAA"), 32, atob("BwYLDg4UDwYJCQwMBgkGCQ4MDg4ODg4NDg4GBgwMDA4PDg4ODg4NDg4GDQ4MEg8ODQ8ODgwODhQODg4ICQg="), 22+(scale<<8)+(1<<16)); } const SETTINGS_FILE = "pebble.json"; @@ -15,7 +19,7 @@ var img = require("heatshrink").decompress(atob("oFAwkGswA/AH4A/AH4A/AH4A/AFEAD7 const h = g.getHeight(); const w = g.getWidth(); -const ha = 2*h/5 - 8; +const ha = 2*h/5 - 4; const h2 = 3*h/5 - 10; const h3 = 7*h/8; @@ -24,7 +28,6 @@ let batteryWarning = false; function draw() { let date = new Date(); let da = date.toString().split(" "); - //let timeStr = require("locale").time(date,1); // causes screen corruption ??? let timeStr = da[4].substr(0,5); const t = 6; @@ -50,19 +53,21 @@ function draw() { else g.setColor('#000'); // otherwise black regardless of theme - g.setFont('Vector', 22); + g.setFontLECO1976Regular22(); g.setFontAlign(0, -1); - g.drawString(da[0], w/4, ha); // day of week + g.drawString(da[0].toUpperCase(), w/4, ha); // day of week g.drawString(getSteps(), 3*w/4, ha); // time // white on red for battery warning g.setColor(!batteryWarning ? g.theme.bg : '#f00'); g.fillRect(0, h2, w, h3); - g.setFontQahiri(); + + g.setFontLECO1976Regular42(); g.setFontAlign(0, -1); g.setColor(!batteryWarning ? g.theme.fg : '#fff'); - g.drawString(timeStr, w/2, h2 - 8); + //g.drawString(timeStr, w/2, h2 - 8); + g.drawString(timeStr, w/2, h2 + 8); // contrast bar g.setColor(g.theme.fg); diff --git a/apps/pebble/pebble_screenshot.png b/apps/pebble/pebble_screenshot.png index d618368db84657fdc60e478c4507fac2bb9c931f..f0bd2dd53a98fbbcca1e0198ad8c77d73ffe4fde 100644 GIT binary patch literal 2560 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 From c24f67b06bbb5417355398149b8e4ad12f8d0c19 Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 23 Nov 2021 21:25:26 +0100 Subject: [PATCH 2/6] settings: remove Quiet Mode LCD options Updating these will be handled by the Quiet Mode Schedule app (qmsched) --- apps.json | 2 +- apps/setting/ChangeLog | 1 + apps/setting/README.md | 2 - apps/setting/settings.js | 129 ++++----------------------------------- 4 files changed, 14 insertions(+), 120 deletions(-) diff --git a/apps.json b/apps.json index 877218135..26dfd1704 100644 --- a/apps.json +++ b/apps.json @@ -119,7 +119,7 @@ { "id": "setting", "name": "Settings", - "version": "0.33", + "version": "0.34", "description": "A menu for setting up Bangle.js", "icon": "settings.png", "tags": "tool,system", diff --git a/apps/setting/ChangeLog b/apps/setting/ChangeLog index faa50405f..d840654fe 100644 --- a/apps/setting/ChangeLog +++ b/apps/setting/ChangeLog @@ -36,3 +36,4 @@ 0.31: Remove Bangle 1 settings when running on Bangle 2 0.32: Fix 'beep' menu on Bangle.js 2 0.33: Really fix 'beep' menu on Bangle.js 2 this time +0.34: Remove Quiet Mode LCD settings: now handled by Quiet Mode Schedule app diff --git a/apps/setting/README.md b/apps/setting/README.md index 1875fc3b0..fb567030f 100644 --- a/apps/setting/README.md +++ b/apps/setting/README.md @@ -44,6 +44,4 @@ The exact effects depend on the app. In general the watch will not wake up by i - Off: Normal operation - Alarms: Stops notifications, but "alarm" apps will still work - Silent: Blocks even alarms -* **LCD Brightness**, **LCD Timeout**, **Wake on X**: - Override default settings while Quit Mode is active (either as *Alarms* or *Silent*) \ No newline at end of file diff --git a/apps/setting/settings.js b/apps/setting/settings.js index fcf651b6f..9432d0a38 100644 --- a/apps/setting/settings.js +++ b/apps/setting/settings.js @@ -7,17 +7,12 @@ let settings; function updateSettings() { //storage.erase('setting.json'); // - not needed, just causes extra writes if settings were the same - if (Object.keys(settings.qmOptions).length === 0) delete settings.qmOptions; storage.write('setting.json', settings); - if (!('qmOptions' in settings)) settings.qmOptions = {}; // easier if this always exists in this file } function updateOptions() { updateSettings(); Bangle.setOptions(settings.options) - if (settings.quiet) { - Bangle.setOptions(settings.qmOptions) - } } function gToInternal(g) { @@ -56,18 +51,12 @@ function resetSettings() { twistMaxY: -800, twistTimeout: 1000 }, - // Quiet Mode options: - // we only set these if we want to override the default value - // qmOptions: {}, - // qmBrightness: undefined, - // qmTimeout: undefined, }; updateSettings(); } settings = storage.readJSON('setting.json', 1); if (!settings) resetSettings(); -if (!('qmOptions' in settings)) settings.qmOptions = {}; // easier if this always exists in here const boolFormat = v => v ? "On" : "Off"; @@ -130,7 +119,16 @@ function showMainMenu() { } } }, - "Quiet Mode": ()=>showQuietModeMenu(), + "Quiet Mode": { + value: settings.quiet|0, + format: v => ["Off", "Alarms", "Silent"][v%3], + onchange: v => { + settings.quiet = v%3; + updateSettings(); + updateOptions(); + if ("qmsched" in WIDGETS) WIDGETS["qmsched"].draw(); + }, + }, 'Locale': ()=>showLocaleMenu(), 'Select Clock': ()=>showClockMenu(), 'Set Time': ()=>showSetTimeMenu(), @@ -352,9 +350,7 @@ function showLCDMenu() { onchange: v => { settings.brightness = v || 1; updateSettings(); - if (!(settings.quiet && "qmBrightness" in settings)) { - Bangle.setLCDBrightness(settings.brightness); - } + Bangle.setLCDBrightness(settings.brightness); } }, 'LCD Timeout': { @@ -365,9 +361,7 @@ function showLCDMenu() { onchange: v => { settings.timeout = 0 | v; updateSettings(); - if (!(settings.quiet && "qmTimeout" in settings)) { - Bangle.setLCDTimeout(settings.timeout); - } + Bangle.setLCDTimeout(settings.timeout); } }, 'Wake on BTN1': { @@ -455,105 +449,6 @@ function showLCDMenu() { }); return E.showMenu(lcdMenu) } -function showQuietModeMenu() { - // we always keep settings.quiet and settings.qmOptions - // other qm values are deleted when not set - const modes = ["Off", "Alarms", "Silent"]; - const qmDisabledFormat = v => v ? "Off" : "-"; - const qmMenu = { - "": {"title": "Quiet Mode"}, - "< Back": () => showMainMenu(), - "Quiet Mode": { - value: settings.quiet|0, - format: v => modes[v%3], - onchange: v => { - settings.quiet = v%3; - updateSettings(); - updateOptions(); - if ("qmsched" in WIDGETS) {WIDGETS["qmsched"].draw();} - }, - }, - "LCD Brightness": { - value: settings.qmBrightness || 0, - min: 0, // 0 = use default - max: 1, - step: 0.1, - format: v => (v>0.05) ? v : "-", - onchange: v => { - if (v>0.05) { // prevent v=0.000000000000001 bugs - settings.qmBrightness = v; - } else { - delete settings.qmBrightness; - } - updateSettings(); - if (settings.qmBrightness) { // show result, even if not quiet right now - Bangle.setLCDBrightness(v); - } else { - Bangle.setLCDBrightness(settings.brightness); - } - }, - }, - "LCD Timeout": { - value: settings.qmTimeout || 0, - min: 0, // 0 = use default (no constant on for quiet mode) - max: 60, - step: 5, - format: v => v>1 ? v : "-", - onchange: v => { - if (v>1) { - settings.qmTimeout = v; - } else { - delete settings.qmTimeout; - } - updateSettings(); - if (settings.quiet && v>1) { - Bangle.setLCDTimeout(v); - } else { - Bangle.setLCDTimeout(settings.timeout); - } - }, - }, - // we disable wakeOn* events by overwriting them as false in qmOptions - // not disabled = not present in qmOptions at all - "Wake on FaceUp": { - value: "wakeOnFaceUp" in settings.qmOptions, - format: qmDisabledFormat, - onchange: () => { - if ("wakeOnFaceUp" in settings.qmOptions) { - delete settings.qmOptions.wakeOnFaceUp; - } else { - settings.qmOptions.wakeOnFaceUp = false; - } - updateOptions(); - }, - }, - "Wake on Touch": { - value: "wakeOnTouch" in settings.qmOptions, - format: qmDisabledFormat, - onchange: () => { - if ("wakeOnTouch" in settings.qmOptions) { - delete settings.qmOptions.wakeOnTouch; - } else { - settings.qmOptions.wakeOnTouch = false; - } - updateOptions(); - }, - }, - "Wake on Twist": { - value: "wakeOnTwist" in settings.qmOptions, - format: qmDisabledFormat, - onchange: () => { - if ("wakeOnTwist" in settings.qmOptions) { - delete settings.qmOptions.wakeOnTwist; - } else { - settings.qmOptions.wakeOnTwist = false; - } - updateOptions(); - }, - }, - }; - return E.showMenu(qmMenu); -} function showLocaleMenu() { const localemenu = { From d743b2266abf069297de59248cb366d6b04ec63c Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Tue, 23 Nov 2021 21:27:37 +0100 Subject: [PATCH 3/6] boot: remove Quiet Mode options Updating these will be handled by the Quiet Mode Schedule app (qmsched) --- apps.json | 2 +- apps/boot/ChangeLog | 1 + apps/boot/bootupdate.js | 8 +------- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/apps.json b/apps.json index 26dfd1704..505412e2f 100644 --- a/apps.json +++ b/apps.json @@ -16,7 +16,7 @@ { "id": "boot", "name": "Bootloader", - "version": "0.36", + "version": "0.37", "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", "icon": "bootloader.png", "type": "bootloader", diff --git a/apps/boot/ChangeLog b/apps/boot/ChangeLog index 98f80efd9..ffc2be495 100644 --- a/apps/boot/ChangeLog +++ b/apps/boot/ChangeLog @@ -40,3 +40,4 @@ 0.35: Add Bangle.appRect polyfill Don't set beep vibration up on Bangle.js 2 (built in) 0.36: Add comments to .boot0 to make debugging a bit easier +0.37: Remove Quiet Mode settings: now handled by Quiet Mode Schedule app diff --git a/apps/boot/bootupdate.js b/apps/boot/bootupdate.js index d642426c2..daf311fe6 100644 --- a/apps/boot/bootupdate.js +++ b/apps/boot/bootupdate.js @@ -78,13 +78,7 @@ boot += `E.on('errorFlag', function(errorFlags) { if (global.save) boot += `global.save = function() { throw new Error("You can't use save() on Bangle.js without overwriting the bootloader!"); }\n`; // Apply any settings-specific stuff if (s.options) boot+=`Bangle.setOptions(${E.toJS(s.options)});\n`; -if (s.quiet && s.qmOptions) boot+=`Bangle.setOptions(${E.toJS(s.qmOptions)});\n`; -if (s.quiet && s.qmBrightness) { - if (s.qmBrightness!=1) boot+=`Bangle.setLCDBrightness(${s.qmBrightness});\n`; -} else { - if (s.brightness && s.brightness!=1) boot+=`Bangle.setLCDBrightness(${s.brightness});\n`; -} -if (s.quiet && s.qmTimeout) boot+=`Bangle.setLCDTimeout(${s.qmTimeout});\n`; +if (s.brightness && s.brightness!=1) boot+=`Bangle.setLCDBrightness(${s.brightness});\n`; if (s.passkey!==undefined && s.passkey.length==6) boot+=`NRF.setSecurity({passkey:${s.passkey}, mitm:1, display:1});\n`; if (s.whitelist) boot+=`NRF.on('connect', function(addr) { if (!(require('Storage').readJSON('setting.json',1)||{}).whitelist.includes(addr)) NRF.disconnect(); });\n`; // Pre-2v10 firmwares without a theme/setUI From 3595fab079eb6a91596bc994c7d744109ed5c4fc Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Fri, 26 Nov 2021 20:05:40 +0100 Subject: [PATCH 4/6] qmsched: manage LCD options Also migrates old settings file: we now store options in qmsched.json, instead of in the global setting.json. --- apps.json | 7 +- apps/qmsched/ChangeLog | 1 + apps/qmsched/README.md | 15 +- apps/qmsched/app.js | 188 ++++++++++++++++++---- apps/qmsched/boot.js | 10 +- apps/qmsched/lib.js | 31 ++-- apps/qmsched/screenshot_b1_edit.png | Bin 0 -> 3610 bytes apps/qmsched/screenshot_b1_lcd.png | Bin 0 -> 4167 bytes apps/qmsched/screenshot_b1_main.png | Bin 0 -> 4050 bytes apps/qmsched/screenshot_b2_edit.png | Bin 0 -> 2946 bytes apps/qmsched/screenshot_b2_lcd.png | Bin 0 -> 3352 bytes apps/qmsched/screenshot_b2_main.png | Bin 0 -> 3226 bytes apps/qmsched/screenshot_edit.png | Bin 3644 -> 0 bytes apps/qmsched/screenshot_main.png | Bin 3661 -> 0 bytes apps/qmsched/screenshot_widget_alarms.png | Bin 3965 -> 0 bytes apps/qmsched/screenshot_widget_silent.png | Bin 3890 -> 0 bytes apps/qmsched/widget.js | 4 +- 17 files changed, 199 insertions(+), 57 deletions(-) create mode 100644 apps/qmsched/screenshot_b1_edit.png create mode 100644 apps/qmsched/screenshot_b1_lcd.png create mode 100644 apps/qmsched/screenshot_b1_main.png create mode 100644 apps/qmsched/screenshot_b2_edit.png create mode 100644 apps/qmsched/screenshot_b2_lcd.png create mode 100644 apps/qmsched/screenshot_b2_main.png delete mode 100644 apps/qmsched/screenshot_edit.png delete mode 100644 apps/qmsched/screenshot_main.png delete mode 100644 apps/qmsched/screenshot_widget_alarms.png delete mode 100644 apps/qmsched/screenshot_widget_silent.png diff --git a/apps.json b/apps.json index 505412e2f..5c6b78482 100644 --- a/apps.json +++ b/apps.json @@ -3797,10 +3797,11 @@ "id": "qmsched", "name": "Quiet Mode Schedule and Widget", "shortName": "Quiet Mode", - "version": "0.03", - "description": "Automatically turn Quiet Mode on or off at set times", + "version": "0.04", + "description": "Automatically turn Quiet Mode on or off at set times, and change LCD options while Quiet Mode is active.", "icon": "app.png", - "screenshots": [{"url":"screenshot_edit.png"},{"url":"screenshot_main.png"},{"url":"screenshot_widget_alarms.png"},{"url":"screenshot_widget_silent.png"}], + "screenshots": [{"url":"screenshot_b1_main.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_lcd.png"}, + {"url":"screenshot_b2_main.png"},{"url":"screenshot_b2_edit.png"},{"url":"screenshot_b2_lcd.png"}], "tags": "tool,widget", "supports": ["BANGLEJS","BANGLEJS2"], "readme": "README.md", diff --git a/apps/qmsched/ChangeLog b/apps/qmsched/ChangeLog index 27b5421e8..0b8d67e76 100644 --- a/apps/qmsched/ChangeLog +++ b/apps/qmsched/ChangeLog @@ -1,3 +1,4 @@ 0.01: First version 0.02: Add widget 0.03: Bangle.js 2 support +0.04: Move Quiet Mode LCD options from global settings to this app diff --git a/apps/qmsched/README.md b/apps/qmsched/README.md index 033014789..535ae56e4 100644 --- a/apps/qmsched/README.md +++ b/apps/qmsched/README.md @@ -1,9 +1,14 @@ # Quiet Mode Schedule and Widget -Automatically turn Quiet Mode on or off at set times, and display a widget when enabled. +Automatically turn Quiet Mode on or off at set times, and display a widget when Quiet Mode is active. -### Edit Schedule: -![Main menu](screenshot_main.png) ![Edit Schedule menu](screenshot_edit.png) +| Bangle.js 1 | Bangle.js 2 | +|:---------------------------------------------:|:---------------------------------------------:| +| (widget: Silent mode) | (widget: Alarms mode) | +| ![Main menu](screenshot_b1_main.png) | ![Main menu](screenshot_b2_main.png) | +| ![Edit Schedule menu](screenshot_b1_edit.png) | ![Edit Schedule menu](screenshot_b2_edit.png) | +| ![LCD Options menu](screenshot_b1_lcd.png) | ![LCD Options menu](screenshot_b2_lcd.png) | -### Widget: -![Widget, quiet mode: silent](screenshot_widget_silent.png) ![Widget, quiet mode: alarms](screenshot_widget_alarms.png) +### LCD Settings: + +If set, these override the default LCD settings while Quiet Mode is active. \ No newline at end of file diff --git a/apps/qmsched/app.js b/apps/qmsched/app.js index c6377d4ba..7be3339fb 100644 --- a/apps/qmsched/app.js +++ b/apps/qmsched/app.js @@ -2,27 +2,74 @@ Bangle.loadWidgets(); Bangle.drawWidgets(); const modeNames = ["Off", "Alarms", "Silent"]; -let scheds = require("Storage").readJSON("qmsched.json", 1); -/*scheds = [ - { hr : 6.5, // hours + minutes/60 - mode : 1, // quiet mode (0/1/2) - } -];*/ -if (!scheds) { - // set default schedule on first load of app - scheds = [ - {"hr": 8, "mode": 0}, - {"hr": 22, "mode": 1}, - ]; - require("Storage").writeJSON("qmsched.json", scheds); + +// load global brightness setting +let bSettings = require('Storage').readJSON('setting.json',true)||{}; +let current = 0|bSettings.quiet; +delete bSettings; // we don't need any other global settings + + + + + + +/** + * Save settings to qmsched.json + */ +function save() { + require('Storage').writeJSON('qmsched.json', settings); } -if (scheds.length && scheds.some(s => "last" in s)) { - // cleanup: remove "last" values (used by old versions) - scheds = scheds.map(s => { - delete s.last; - return s; - }); - require("Storage").writeJSON("qmsched.json", scheds); +function get(key, def) { + return (key in settings) ? settings[key] : def; +} +function set(key, val) { + settings[key] = val; save(); + scheds = settings.scheds; options = settings.options; // update references +} +function unset(key) { + delete settings[key]; save(); +} + +let settings, + scheds, options; // references for convenience +/** + * Load settings file, check if we need to migrate old setting formats to new + */ +function loadSettings() { + settings = require('Storage').readJSON("qmsched.json", true) || {}; + + if (Array.isArray(settings)) { + // migrate old file (plain array of schedules, qmOptions stored in global settings file) + require("Storage").erase("qmsched.json"); // need to erase old file, or Things Break, somehow... + let bOptions = require('Storage').readJSON('setting.json',true)||{}; + settings = { + options: bOptions.qmOptions || {}, + scheds: settings, + }; + // store new format + save(); + // and clean up qmOptions from global settings file + delete bOptions.qmOptions; + require('Storage').writeJSON('setting.json',bOptions); + } + // apply defaults + settings = Object.assign({ + options: {}, // Bangle options to override during quiet mode, default = none + scheds: [ + // default schedule: + {"hr": 8, "mode": 0}, + {"hr": 22, "mode": 1}, + ], + }, settings); + scheds = settings.scheds; options = settings.options; + + if (scheds.length && scheds.some(s => "last" in s)) { + // cleanup: remove "last" values (used by older versions) + set('scheds', scheds.map(s => { + delete s.last; + return s; + })); + } } function formatTime(t) { @@ -32,29 +79,35 @@ function formatTime(t) { } function showMainMenu() { - let menu = {"": {"title": "Quiet Mode"}}; + let _m, menu = { + "": {"title": "Quiet Mode"}, + "< Exit": () => load() + }; // "Current Mode""Silent" won't fit on Bangle.js 2 - menu["Current" + ((process.env.HWVERSION===2)?"":" Mode")]= { - value: (require("Storage").readJSON("setting.json", 1) || {}).quiet|0, + menu["Current"+((process.env.HWVERSION===2) ? "" : " Mode")] = { + value: current, format: v => modeNames[v], onchange: function(v) { if (v<0) {v = 2;} if (v>2) {v = 0;} require("qmsched").setMode(v); + current = v; this.value = v; }, }; scheds.sort((a, b) => (a.hr-b.hr)); scheds.forEach((sched, idx) => { - const name = modeNames[sched.mode]; - const txt = formatTime(sched.hr)+" ".repeat(14-name.length)+name; - menu[txt] = function() { - showEditMenu(idx); + menu[formatTime(sched.hr)] = { + format: () => modeNames[sched.mode], // abuse format to right-align text + onchange: function() { + _m.draw = ()=> {}; // prevent redraw of main menu over edit menu + showEditMenu(idx); + } }; }); menu["Add Schedule"] = () => showEditMenu(-1); - menu["< Back"] = () => {load();}; - return E.showMenu(menu); + menu["LCD Settings"] = () => showOptionsMenu(); + _m = E.showMenu(menu); } function showEditMenu(index) { @@ -69,6 +122,7 @@ function showEditMenu(index) { } const menu = { "": {"title": (isNew ? "Add" : "Edit")+" Schedule"}, + "< Cancel": () => showMainMenu(), "Hours": { value: hrs, onchange: function(v) { @@ -110,18 +164,88 @@ function showEditMenu(index) { } else { scheds[index] = getSched(); } - require("Storage").writeJSON("qmsched.json", scheds); + save(); showMainMenu(); }; if (!isNew) { menu["> Delete"] = function() { scheds.splice(index, 1); - require("Storage").writeJSON("qmsched.json", scheds); + save(); showMainMenu(); }; } - menu["< Cancel"] = showMainMenu; return E.showMenu(menu); } +function showOptionsMenu() { + const disabledFormat = v => v ? "Off" : "-"; + function toggle(option) { + // we disable wakeOn* events by setting them to `false` in options + // not disabled = not present in options at all + if (option in options) { + delete options[option]; + } else { + options[option] = false; + } + save(); + } + let resetTimeout; + const oMenu = { + "": {"title": "LCD Settings"}, + "< Back": () => showMainMenu(), + "LCD Brightness": { + value: get("brightness", 0), + min: 0, // 0 = use default + max: 1, + step: 0.1, + format: v => (v>0.05) ? v : "-", + onchange: v => { + if (v>0.05) { // prevent v=0.000000000000001 bugs + set("brightness", v); + Bangle.setLCDBrightness(v); // show result, even if not quiet right now + // restore brightness after half a second + if (resetTimeout) clearTimeout(resetTimeout); + resetTimeout = setTimeout(() => { + resetTimeout = undefined; + require("qmsched").setMode(current); + }, 500); + } else { + unset("brightness"); + require("qmsched").setMode(current); + } + }, + }, + "LCD Timeout": { + value: get("timeout", 0), + min: 0, // 0 = use default (no constant on for quiet mode) + max: 60, + step: 5, + format: v => v>1 ? v : "-", + onchange: v => { + if (v>1) set("timeout", v); + else unset("timeout"); + }, + }, + // we disable wakeOn* events by overwriting them as false in options + // not disabled = not present in options at all + "Wake on FaceUp": { + value: "wakeOnFaceUp" in options, + format: disabledFormat, + onchange: () => {toggle("wakeOnFaceUp");}, + }, + "Wake on Touch": { + value: "wakeOnTouch" in options, + format: disabledFormat, + onchange: () => {toggle("wakeOnTouch");}, + }, + "Wake on Twist": { + value: "wakeOnTwist" in options, + format: disabledFormat, + onchange: () => {toggle("wakeOnTwist");}, + }, + }; + return E.showMenu(oMenu); +} + +loadSettings(); showMainMenu(); diff --git a/apps/qmsched/boot.js b/apps/qmsched/boot.js index 2712cab30..c3bc49b58 100644 --- a/apps/qmsched/boot.js +++ b/apps/qmsched/boot.js @@ -1,7 +1,13 @@ // apply Quiet Mode schedules (function qm() { - let scheds = require("Storage").readJSON("qmsched.json", 1) || []; - if (!scheds.length) { return;} + let bSettings = require('Storage').readJSON('setting.json',true)||{}; + const curr = 0|bSettings.quiet; + delete bSettings; + if (curr) require("qmsched").applyOptions(curr); // no need to re-apply default options + + let settings = require('Storage').readJSON('qmsched.json',true)||{}; + let scheds = settings.scheds||[]; + if (!scheds.length) {return;} const now = new Date(), hr = now.getHours()+(now.getMinutes()/60)+(now.getSeconds()/3600); // current (decimal) hour scheds.sort((a, b) => a.hr-b.hr); diff --git a/apps/qmsched/lib.js b/apps/qmsched/lib.js index a3d36ed34..9b307769a 100644 --- a/apps/qmsched/lib.js +++ b/apps/qmsched/lib.js @@ -1,18 +1,23 @@ +/** + * Apply LCD options for given mode + * @param {int} mode Quiet Mode + */ +exports.applyOptions = function(mode) { + const s = require("Storage").readJSON(mode ? "qmsched.json" : "setting.json", 1) || {}; + const get = (k, d) => k in s ? s[k] : d; + Bangle.setOptions(get("options", {})); + Bangle.setLCDBrightness(get("brightness", 1)); + Bangle.setLCDTimeout(get("timeout", 10)); +}; /** * Set new Quiet Mode and apply Bangle options * @param {int} mode Quiet Mode */ exports.setMode = function(mode) { - let s = require("Storage").readJSON("setting.json", 1) || {}; - s.quiet = mode; - require("Storage").writeJSON("setting.json", s); - if (s.options) Bangle.setOptions(s.options); - if (mode && s.qmOptions) Bangle.setOptions(s.qmOptions); - if (mode && s.qmBrightness) { - if (s.qmBrightness!=1) Bangle.setLCDBrightness(s.qmBrightness); - } else { - if (s.brightness && s.brightness!=1) Bangle.setLCDBrightness(s.brightness); - } - if (mode && s.qmTimeout) Bangle.setLCDTimeout(s.qmTimeout); - if (typeof (WIDGETS)!=="undefined" && "qmsched" in WIDGETS) {WIDGETS["qmsched"].draw();} -}; \ No newline at end of file + require("Storage").writeJSON("setting.json", Object.assign( + require("Storage").readJSON("setting.json", 1) || {}, + {quiet:mode} + )); + exports.applyOptions(mode); + if (WIDGETS && "qmsched" in WIDGETS) WIDGETS["qmsched"].draw(); +}; diff --git a/apps/qmsched/screenshot_b1_edit.png b/apps/qmsched/screenshot_b1_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..ec82e92e6d2de47b89b0f76f18bd1fa58f7a14a6 GIT binary patch literal 3610 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 literal 0 HcmV?d00001 diff --git a/apps/qmsched/screenshot_b1_lcd.png b/apps/qmsched/screenshot_b1_lcd.png new file mode 100644 index 0000000000000000000000000000000000000000..16f9356b89928349ae9a2c4af41dad3cb0c981b2 GIT binary patch literal 4167 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 literal 0 HcmV?d00001 diff --git a/apps/qmsched/screenshot_b1_main.png b/apps/qmsched/screenshot_b1_main.png new file mode 100644 index 0000000000000000000000000000000000000000..803ca69d5607ef9ee696fe121749d49243e70467 GIT binary patch literal 4050 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 literal 0 HcmV?d00001 diff --git a/apps/qmsched/screenshot_b2_lcd.png b/apps/qmsched/screenshot_b2_lcd.png new file mode 100644 index 0000000000000000000000000000000000000000..3f06488c39c6741575b4223b811533352dc5f046 GIT binary patch literal 3352 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 JuhBzC{|gbmTl)Y2 literal 0 HcmV?d00001 diff --git a/apps/qmsched/screenshot_b2_main.png b/apps/qmsched/screenshot_b2_main.png new file mode 100644 index 0000000000000000000000000000000000000000..f6d22a8b8184cce576295a1376f11da88bb96f73 GIT binary patch literal 3226 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 VS$oi8ar|rmS4^yptBvq6{|2w$^<@A6 literal 0 HcmV?d00001 diff --git a/apps/qmsched/screenshot_edit.png b/apps/qmsched/screenshot_edit.png deleted file mode 100644 index 88b7fcad4ac9df533f69b14675f1dcf3d9c25b1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3644 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 diff --git a/apps/qmsched/screenshot_widget_alarms.png b/apps/qmsched/screenshot_widget_alarms.png deleted file mode 100644 index 52dbe246463d0e7d9567d37683f8ecd9535f5414..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3965 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 E52Ui~sQ>@~ diff --git a/apps/qmsched/screenshot_widget_silent.png b/apps/qmsched/screenshot_widget_silent.png deleted file mode 100644 index 38b133650f7f83ee1ca429652f9177f95af5159d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3890 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 {return;} // no alarms // alarms still on: draw alarm icon in bottom-right corner From b595e603334f701cc5feb7e29a2eae804e4b250c Mon Sep 17 00:00:00 2001 From: hughbarney Date: Thu, 2 Dec 2021 22:17:00 +0000 Subject: [PATCH 5/6] Pebble: switched to LECO1976 font and slanting boot icon --- apps/pebble/ChangeLog | 2 +- apps/pebble/LECO 1976-Regular.otf | Bin 0 -> 26432 bytes apps/pebble/icons8-sport-shoes-64.png | Bin 2522 -> 0 bytes apps/pebble/pebble.app.js | 11 +++++------ apps/pebble/pebble_screenshot.png | Bin 2560 -> 2426 bytes apps/pebble/pebble_screenshot2.png | Bin 2531 -> 2549 bytes apps/pebble/pebble_screenshot3.png | Bin 2617 -> 2335 bytes 7 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 apps/pebble/LECO 1976-Regular.otf delete mode 100644 apps/pebble/icons8-sport-shoes-64.png diff --git a/apps/pebble/ChangeLog b/apps/pebble/ChangeLog index 54f2e7452..fc3ff3ba4 100644 --- a/apps/pebble/ChangeLog +++ b/apps/pebble/ChangeLog @@ -1,3 +1,3 @@ 0.01: first release 0.02: included deployment of pebble.settings.js in apps.json -0.03: Changed time font to LECO1976Regular42 +0.03: Changed time+calendar font to LECO1976Regular, changed to slanting boot diff --git a/apps/pebble/LECO 1976-Regular.otf b/apps/pebble/LECO 1976-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..05a318224400bacae73f2529f448f780f61b414f GIT binary patch literal 26432 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 F{|A0DE;axF literal 0 HcmV?d00001 diff --git a/apps/pebble/icons8-sport-shoes-64.png b/apps/pebble/icons8-sport-shoes-64.png deleted file mode 100644 index 4ae00db96a02ace82a8f08eb43bbf32a0c08b255..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2522 zcmV<02_^Q4P)^p0K_gw z1`vtanBN840CC8$+eCW@$F4@i1Bt-#o7uUZkXtz34#08V!o^I#dk!{g4V4vT7!3Ns zfG6Mzd=HdcShvqu`WbBmNKHJ8T%jQN&dJz2IClNs7B~xh0VDv&EUe#aES&*yKy+1Q zxs{`nGwz;Vq$Zui*3OP4D;`CuR8mz@CKCj~5AXsUfq&C(+|57+oCGF!X-fd^1*-cP zb2;#_m6ej^k3NN~n|rq}KYo8ZmE~n!oAkg(KnQRNn9)bwJ|PFz1I}IAynxxjK0w=t znEAk5K`^W~QUnHh09Z1s(+yKoaKc=vU;J@7Plfr}vWU?pGxQUFtb z8PHLn>;oe1d2Ah_5m9K2ZM?HOnv(onfQ!It-~?BUZ~>;Zw@(3(D-?vxyq7skAI5uR zK&OBpn20;{B{3hqOJ#8Z08Y-Xj2Rn@w~sGQPA*s}m7V7o7hWXx`@@tL7j`t2051c( z0Aqg{unPF+=oxcZ_}pf^U7TocsAuaF4^ohwaoqrFJ9}nCEN0f?Xk0wJu6drxWF-EZ z1Ko`1C3Qe@mm>wp;|8$J7$_}xDrB&O^ z9V7g??RFo&-nW;wHXZXO4`F7=Kvr&!qe*LE+_YItoIM|aps8VWZ>aFa_2ud`uV@CL{Z!dxB+XyycqHY7~&rYK%2?pGtE`RA3i`qRyy_$ zj!c*`oz%p$RF;=A*j>ZArK8w&=sbxzwYYkCF>l4=*NxTCswb-LfSa$CO_Uno^7tW`G53cnAN(Mask!vJh~Vmx}I zz>7PQ09dkSJ=Q84i|GbU4ddY#Hh28H9nf5r>{`76qaavJv?p%&9?shJn;7ov$H`;g z(W2EdHOPa7(}(fO&SYvEb&MQ8fzZ3dEv|jn{QL14GY-sq6AyOIcN=F0p;Xym=jz7r zG2@vrHv<2Vi5BmGNw23e*E|qcS5=U7_D2-*0c`tI2$>ff*s(tsxm?ae&up}~b_ZdR zOUX@100{4v0eW34b)`j|KKKQjS4Hviib$$Ui!CO+?dd=A^t>tPTg(;p_lFK32m+7X z=Yzku6Kl4g!Dtc)yMGyjhx=Mg_ow)d4e9t8&}o1^W;zXfrjqbhFdL(8!`)FyPSRPP zdteTEsfjl%diuyg5@L_ga``eMke!iAQNaaV9aX&ea3K4R7jh!05_>0SA|G3G!+O`l z*2$&gqg%HO(5U2$9%jq)k;BM*FO)w_bf=~HGOs-u-PigZFqhQ3-!u z?Lh!GJrabq)c~IT`#As>t$qfLy+fb1u8oLRZy>Lvn9p{;*U@f;M28!Ad2ie zRn3l<|H?}{|I;Vw13TZNuCg2tuR#Qi4d&#rBQ#xVB*@2w=Jk)}2S*=b3f{&FuFvEO0Tcg}Ri>lXb3WHR1=+?TklMsgC*aPq`)0zxLB zQdpso%aF@{zGA8_E#}~^4?rekR`>!gHP&+`E*6;#-uiPWMU~CG`B?@snT+MnZbCMo z_f?o6iU^{JNf6PSjOa}QI)jl*&CR68e#^P9KBugG;FZZ_xVYXzU2P3O;m@vm95o77 z%^t|6Jq4UT9D}>x=w5Yh@0JZ1^lf!*SMx&9X(>$2q-pazQXVK|R1k4Oa z@El5RO0fEs`p1yBpP#%DJ& zafD-!LBq$nvT08NrP=Ad>P&vZkL1K3$4aRrFmy8IC54m}T)zXg4Z*8Huv7Y+UVrokYDalHuI5QQ4?#h;;*PtN;1y8_t%(P_UV~T#b?scf)PDzQ^_)_Ibc&x?Fe%T?fH(z^l5V z3^&h#m;?cNA4cSUM- diff --git a/apps/pebble/pebble.app.js b/apps/pebble/pebble.app.js index 45cce90e4..ce9ab3340 100644 --- a/apps/pebble/pebble.app.js +++ b/apps/pebble/pebble.app.js @@ -15,7 +15,7 @@ function loadSettings() { settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green'}; } -var img = require("heatshrink").decompress(atob("oFAwkGswA/AH4A/AH4A/AH4A/AFEAD74gdsAfBELlggMhD70iILsAiUAIKQRBgxAHgUiIKQQJUAMSD4JBQsBVBIAq/DEAJBCJ45VHkAxEDwKfDIIUREBq2BmcQCAQeCkczmRBEiAgND4MxSoYGBAAQgCAAohKDARhBG4IeDEAQ8BAA5fJABgpBgFDgEiQgJEHT4IeMmMBkMFAYJJDEQaYDiYfMkECiEEoEDBAX//8ykJsBD4MAWwIALiBeCqAyDn//BoYgBgAeMYAMhgE0CRIOBD58BkEEmCRKkEGD5szkUQqdASJUxD4MAgKBKmUigFEGJZgBAATODFw0CkEBmoOJAAQdB7owBOBDdCgbdED5fd6pRIgDdCeBkxD4fdeAgNEkMFmheLdgIfE6BgGmDdCoDdKDwYfD6gzGiBeBrpLHXYUQXIMgD4NND4SAFZgMRgAKBPwroBBYIeBIAL/CADESL4VmsAcWgMRkQeDAAMAkQAWMAQeCD4MSDqqdBDwgfBAC8GDwiAXDowA/AH4A/AH4A/AH4A/AEA")); +var img = require("heatshrink").decompress(atob("oFAwkEogA/AH4A/AH4A/AH4A/AE8AAAoeXoAfeDQUBmcyD7A+Dh///8QD649CiAfaHwUvD4sEHy0DDYIfEICg+Cn4fHICY+DD4nxcgojOHwgfEIAYfRCIQaDD4ZAFD5r7DH4//kAfRCIZ/GAAnwD5p9DX44fTHgYSBf4ofVDAQEBl4fFUAgfOXoQzBgIfFBAIfPP4RAEAoYAB+cRiK/SG4h/WIBAfXIA7CBAAswD55AHn6fUIBMCD65AHl4gCmcziAfQQJqfQQJpiDgk0IDXxQLRAEECaBM+QgRYRYgUIA0CD4ggSQJiDCiAKBICszAAswD55AHABKBVD7BAFABIqBD5pAFABPxD55AOD6BADiIAJQAyxLABwf/gaAPAH4A/AH4ARA==")); const h = g.getHeight(); const w = g.getWidth(); @@ -66,7 +66,6 @@ function draw() { g.setFontLECO1976Regular42(); g.setFontAlign(0, -1); g.setColor(!batteryWarning ? g.theme.fg : '#fff'); - //g.drawString(timeStr, w/2, h2 - 8); g.drawString(timeStr, w/2, h2 + 8); // contrast bar @@ -78,8 +77,8 @@ function draw() { g.fillRect(0, h3 + t, w, h); g.setColor(settings.bg); - g.drawImage(img, w/2 + ((w/2) - 64)/2, 10, { scale: 1 }); - drawCalendar(((w/2) - 48)/2, 10, 48, 4, da[2]); + g.drawImage(img, w/2 + ((w/2) - 64)/2, 1, { scale: 1 }); + drawCalendar(((w/2) - 42)/2, 14, 42, 4, da[2]); } // at x,y width:wi thicknes:th @@ -96,9 +95,9 @@ function drawCalendar(x,y,wi,th,str) { // second calendar hook, two thirds in g.fillRect(x + (2*wi/3) -(th/2), y - hook_t, x + 2*wi/3 + th - (th/2), y + hook_t); - g.setFont('Vector', 22); + g.setFontLECO1976Regular22(); g.setFontAlign(0, 0); - g.drawString(str, x + wi/2 + th/2, y + wi/2 + th/2); + g.drawString(str, x + wi/2, y + wi/2 + th); } function getSteps() { diff --git a/apps/pebble/pebble_screenshot.png b/apps/pebble/pebble_screenshot.png index f0bd2dd53a98fbbcca1e0198ad8c77d73ffe4fde..169df2d22cf0abf143620b2698393b8bed9f6706 100644 GIT binary patch literal 2426 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 REZoNda}z7$azoeq{{h`>onrt1 literal 2531 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 u#YLbJDL`Tpgvv?)aOj3KpZ@ Date: Fri, 3 Dec 2021 08:24:12 +0000 Subject: [PATCH 6/6] tweak for lint errors - still some assignment warnings --- apps/pooqroman/app.js | 835 ++++++++++++++++++------------------ apps/pooqroman/resourcer.js | 56 +-- 2 files changed, 445 insertions(+), 446 deletions(-) diff --git a/apps/pooqroman/app.js b/apps/pooqroman/app.js index 0628196a1..d25fcf1a8 100644 --- a/apps/pooqroman/app.js +++ b/apps/pooqroman/app.js @@ -51,47 +51,46 @@ class Options { // Protocol: subclasses must have static id and defaults fields. // Only fields named in the defaults will be saved. constructor() { - this.id = this.constructor.id; - this.file = `${this.id}.json`; - this.backing = storage.readJSON(this.file, true) || {}; - this.defaults = this.constructor.defaults; - Object.keys(this.defaults).forEach(k => this.bless(k)); + this.id = this.constructor.id; + this.file = `${this.id}.json`; + this.backing = storage.readJSON(this.file, true) || {}; + this.defaults = this.constructor.defaults; + Object.keys(this.defaults).forEach(k => this.bless(k)); } writeBack(delay) { - if (this.timeout) clearTimeout(this.timeout); - this.timeout = setTimeout( - () => { - this.timeout = null; - storage.writeJSON(this.file, this.backing); - }, - delay - ); + if (this.timeout) clearTimeout(this.timeout); + this.timeout = setTimeout( + () => { + this.timeout = null; + storage.writeJSON(this.file, this.backing); + }, + delay + ); } bless(k) { - Object.defineProperty(this, k, { - get: () => this.backing[k] == null ? this.defaults[k] : this.backing[k], - set: v => { - this.backing[k] = v; - // Ten second writeback delay, since the user will roll values up and down. - this.writeBack(10000); - return v; - } - }); - } + Object.defineProperty(this, k, { + get: () => this.backing[k] == null ? this.defaults[k] : this.backing[k], + set: v => { + this.backing[k] = v; + // Ten second writeback delay, since the user will roll values up and down. + this.writeBack(10000); + } + }); + } showMenu(m) { - if (m) { - for (const k in m) if ('init' in m[k]) m[k].value = m[k].init(); - m[''].selected = -1; // Workaround for self-selection bug. - } - E.showMenu(m); + if (m) { + for (const k in m) if ('init' in m[k]) m[k].value = m[k].init(); + m[''].selected = -1; // Workaround for self-selection bug. + } + E.showMenu(m); } reset() { - this.backing = {}; - this.writeBack(0); + this.backing = {}; + this.writeBack(0); } interact() {this.showMenu(this.menu);} @@ -99,34 +98,34 @@ class Options { class RomanOptions extends Options { constructor() { - super(); - this.menu = { - '': {title: '* face options *'}, - '< Back': _ => {this.showMenu(); this.emit('done');}, - Ticks: { - init: _ => this.resolution, - min: 0, max: 3, - onchange: x => this.resolution = x, - format: x => ['seconds', 'seconds (up)', 'minutes', 'hours'][x] - }, - 'Display': { - init: _ => this.o24h == null ? 0 : 1 + this.o24h, - min: 0, max: 2, - onchange: x => this.o24h = [null, 0, 1][x], - format: x => ['system', '12h', '24h'][x] - }, - 'Day of Week': { - init: _ => this.dow, - onchange: x => this.dow = x - }, - Calendar: { - init: _ => this.calendric, - min: 0, max: 2, - onchange: x => this.calendric = x, - format: x => ['none', 'day', 'date'][x] - }, - Defaults: _ => {this.reset();} - }; + super(); + this.menu = { + '': {title: '* face options *'}, + '< Back': _ => {this.showMenu(); this.emit('done');}, + Ticks: { + init: _ => this.resolution, + min: 0, max: 3, + onchange: x => this.resolution = x, + format: x => ['seconds', 'seconds (up)', 'minutes', 'hours'][x] + }, + 'Display': { + init: _ => this.o24h == null ? 0 : 1 + this.o24h, + min: 0, max: 2, + onchange: x => this.o24h = [null, 0, 1][x], + format: x => ['system', '12h', '24h'][x] + }, + 'Day of Week': { + init: _ => this.dow, + onchange: x => this.dow = x + }, + Calendar: { + init: _ => this.calendric, + min: 0, max: 2, + onchange: x => this.calendric = x, + format: x => ['none', 'day', 'date'][x] + }, + Defaults: _ => {this.reset();} + }; } } @@ -196,24 +195,24 @@ class Formattable { class Fixed extends Formattable { constructor(text) { - super(); - this.text = text; + super(); + this.text = text; } squeeze() {return false;} } class Squeezable extends Formattable { constructor(named, index) { - super(); - this.named = named; - this.index = index; - this.end = index + named.forms; + super(); + this.named = named; + this.index = index; + this.end = index + named.forms; } squeeze() { - if (this.index >= this.end) return false; - this.index++; - this.w = null; - return true; + if (this.index >= this.end) return false; + this.index++; + this.w = null; + return true; } get text() {return this.named.table[this.index];} } @@ -319,82 +318,82 @@ const events = { wall: [{time: Number.POSITIVE_INFINITY}], // indexed by nominal ms + TZ ms clean: function(now, l) { - let o = now.getTimezoneOffset() * 60000; - let tf = now.getTime() + l, tw = tf - o; - // Discard stale events: - while (this.wall[0].time <= tw) this.wall.shift(); - while (this.fixed[0].time <= tf) this.fixed.shift(); + let o = now.getTimezoneOffset() * 60000; + let tf = now.getTime() + l, tw = tf - o; + // Discard stale events: + while (this.wall[0].time <= tw) this.wall.shift(); + while (this.fixed[0].time <= tf) this.fixed.shift(); }, scan: function(now, from, to, f) { - result = Infinity; - let o = now.getTimezoneOffset() * 60000; - let t = now.getTime() - o; - let c, p, i, l = from - o, h = to - o; - for (i = 0; (c = this.wall[i]).time < l; i++) ; - for (; (c = this.wall[i]).time < h; i++) { - if ((p = c.time < t) ? c.past : c.future) - result = Math.min(result, f(c, new Date(c.time + o), p)); - } - l += o; h += o; t += o; - for (i = 0; (c = this.fixed[i]).time < l; i++) ; - for (; (c = this.fixed[i]).time < h; i++) { - if ((p = c.time < t) ? c.past : c.future) - result = Math.min(f(c, new Date(c.time), p)); - } - return result; + result = Infinity; + let o = now.getTimezoneOffset() * 60000; + let t = now.getTime() - o; + let c, p, i, l = from - o, h = to - o; + for (i = 0; (c = this.wall[i]).time < l; i++) ; + for (; (c = this.wall[i]).time < h; i++) { + if ((p = c.time < t) ? c.past : c.future) + result = Math.min(result, f(c, new Date(c.time + o), p)); + } + l += o; h += o; t += o; + for (i = 0; (c = this.fixed[i]).time < l; i++) ; + for (; (c = this.fixed[i]).time < h; i++) { + if ((p = c.time < t) ? c.past : c.future) + result = Math.min(f(c, new Date(c.time), p)); + } + return result; }, span: function(now, from, to, width) { - let o = now.getTimezoneOffset() * 60000; - let t = now.getTime() - o; - let lfence = [], rfence = []; - this.scan(now, from, to, (e, d, p) => { - if (p) { - for (let j = 0; j <= e.priority; j++) { - if (d < (lfence[e.priority] || t)) lfence[e.priority] = d; - } - } else { - for (let j = 0; j <= e.priority; j++) { - if (d > (rfence[e.priority] || t)) rfence[e.priority] = d; - } - } - }); - for (let j = 0; ; j += 0.5) { - if ((rfence[Math.ceil(j)] - lfence[Math.floor(j)] || 0) <= width) { - return [lfence[Math.floor(j)] || now, rfence[Math.ceil(j)] || now]; - } - } + let o = now.getTimezoneOffset() * 60000; + let t = now.getTime() - o; + let lfence = [], rfence = []; + this.scan(now, from, to, (e, d, p) => { + if (p) { + for (let j = 0; j <= e.priority; j++) { + if (d < (lfence[e.priority] || t)) lfence[e.priority] = d; + } + } else { + for (let j = 0; j <= e.priority; j++) { + if (d > (rfence[e.priority] || t)) rfence[e.priority] = d; + } + } + }); + for (let j = 0; ; j += 0.5) { + if ((rfence[Math.ceil(j)] - lfence[Math.floor(j)] || 0) <= width) { + return [lfence[Math.floor(j)] || now, rfence[Math.ceil(j)] || now]; + } + } }, insert: function(t, wall, e) { - let v = wall ? this.wall : this.fixed; - e.time = t = t - (wall ? t.getTimezoneOffset() * 60000 : 0); - v.splice(v.findIndex(x => x.time > t), 0, e); + let v = wall ? this.wall : this.fixed; + e.time = t = t - (wall ? t.getTimezoneOffset() * 60000 : 0); + v.splice(v.findIndex(x => x.time > t), 0, e); }, loadFromSystem: function(options) { - alarms.forEach(x => { - if (x.on) { - const t = new Date(); - let h = x.hr; - let m = h % 1 * 60; - let s = m % 1 * 60; - let ms = s % 1 * 1000; - t.setHours(h - h % 1, m - m % 1, s - s % 1, ms); - // There's a race condition here, but I'm not sure what we can do about it. - if (t < Date.now() || x.last === t.getDate()) t.setDate(t.getDate() + 1); - this.insert(t, true, { - priority: 0, - past: false, // System alarms seem uninteresting if past? - future: true, - precision: x.timer ? 1000 : 60000, - colour: x.timer ? options.timerFg : options.alarmFg, - event: x - }); - } - }); - return this; + alarms.forEach(x => { + if (x.on) { + const t = new Date(); + let h = x.hr; + let m = h % 1 * 60; + let s = m % 1 * 60; + let ms = s % 1 * 1000; + t.setHours(h - h % 1, m - m % 1, s - s % 1, ms); + // There's a race condition here, but I'm not sure what we can do about it. + if (t < Date.now() || x.last === t.getDate()) t.setDate(t.getDate() + 1); + this.insert(t, true, { + priority: 0, + past: false, // System alarms seem uninteresting if past? + future: true, + precision: x.timer ? 1000 : 60000, + colour: x.timer ? options.timerFg : options.alarmFg, + event: x + }); + } + }); + return this; }, }; @@ -403,82 +402,82 @@ const events = { class Sidebar { constructor(g, x, y, w, h, options) { - this.g = g; - this.options = options; - this.x = x; - this.y = this.initY = y; - this.h = h; - this.rate = Infinity; - this.doLocked = Sidebar.status(_ => Bangle.isLocked(), lockI); - this.doHRM = Sidebar.status(_ => Bangle.isHRMOn(), HRMI); - this.doGPS = Sidebar.status(_ => Bangle.isGPSOn(), GPSI, Sidebar.gpsColour(options)); + this.g = g; + this.options = options; + this.x = x; + this.y = this.initY = y; + this.h = h; + this.rate = Infinity; + this.doLocked = Sidebar.status(_ => Bangle.isLocked(), lockI); + this.doHRM = Sidebar.status(_ => Bangle.isHRMOn(), HRMI); + this.doGPS = Sidebar.status(_ => Bangle.isGPSOn(), GPSI, Sidebar.gpsColour(options)); } reset(rate) {this.y = this.initY; this.rate = rate; return this;} print(t) { - this.y += 4 + t.print( - this.g.setColor(this.options.barFg).setFontAlign(-1, 1, 1), - this.x + 3, this.y + 4 - ); - return this; + this.y += 4 + t.print( + this.g.setColor(this.options.barFg).setFontAlign(-1, 1, 1), + this.x + 3, this.y + 4 + ); + return this; } pad(n) {this.y += n; return this;} free() {return this.h - this.y;} static status(p, i, c) { - return function() { - if (p()) { - this.g.setColor(c ? c() : this.options.barFg) - .drawImage(i, this.x + 4, this.y += 4); - this.y += imageHeight(i); - } - return this; - }; + return function() { + if (p()) { + this.g.setColor(c ? c() : this.options.barFg) + .drawImage(i, this.x + 4, this.y += 4); + this.y += imageHeight(i); + } + return this; + }; } static gpsColour(o) { - const fix = Bangle.getGPSFix(); - return fix && fix.fix ? o.active : o.barFg; + const fix = Bangle.getGPSFix(); + return fix && fix.fix ? o.active : o.barFg; } doPower() { - const c = Bangle.isCharging(); - const b = E.getBattery(); - if (c || b < 50) { - let g = this.g, x = this.x, y = this.y, options = this.options; - g.setColor(options.barFg).drawImage(batteryI, x + 4, y + 4); - g.setColor(b <= 10 ? '#f00' : b <= 30 ? '#ff0' : '#0f0'); - const h = 13 * (100 - b) / 100; - g.fillRect(x + 8, y + 7 + h, x + 17, y + 20); - // Espruino disallows blank leading rows in icons, for some reason. - if (c) g.setColor(options.barBg).drawImage(chargeI, x + 4, y + 8); - this.y = y + imageHeight(batteryI) + 4; - } - return this; + const c = Bangle.isCharging(); + const b = E.getBattery(); + if (c || b < 50) { + let g = this.g, x = this.x, y = this.y, options = this.options; + g.setColor(options.barFg).drawImage(batteryI, x + 4, y + 4); + g.setColor(b <= 10 ? '#f00' : b <= 30 ? '#ff0' : '#0f0'); + const h = 13 * (100 - b) / 100; + g.fillRect(x + 8, y + 7 + h, x + 17, y + 20); + // Espruino disallows blank leading rows in icons, for some reason. + if (c) g.setColor(options.barBg).drawImage(chargeI, x + 4, y + 8); + this.y = y + imageHeight(batteryI) + 4; + } + return this; } doCompass() { - if (Bangle.isCompassOn()) { - const c = Bangle.getCompass(); - const a = c && this.rate <= 1000; - this.g.setColor(a ? this.options.active : this.options.barFg).drawImage( - compassI, - this.x + 4 + imageWidth(compassI) / 2, - this.y + 4 + imageHeight(compassI) / 2, - a ? {rotate: c.heading / 180 * Math.PI} : undefined - ); - this.y += 4 + imageHeight(compassI); - } - return this; + if (Bangle.isCompassOn()) { + const c = Bangle.getCompass(); + const a = c && this.rate <= 1000; + this.g.setColor(a ? this.options.active : this.options.barFg).drawImage( + compassI, + this.x + 4 + imageWidth(compassI) / 2, + this.y + 4 + imageHeight(compassI) / 2, + a ? {rotate: c.heading / 180 * Math.PI} : undefined + ); + this.y += 4 + imageHeight(compassI); + } + return this; } } class Roman { constructor(g, events) { - this.g = g; - this.state = {}; - const options = this.options = new RomanOptions(); - this.events = events.loadFromSystem(this.options); - this.timescales = [1000, [1000, 60000], 60000, 3600000]; - this.sidebar = new Sidebar(g, barX, barY, barW, barH, options); - this.hours = Roman.hand(g, 3, 0.5, 12, _ => options.hourFg); - this.minutes = Roman.hand(g, 2, 0.9, 60, _ => options.minuteFg); - this.seconds = Roman.hand(g, 1, 0.9, 60, _ => options.secondFg); + this.g = g; + this.state = {}; + const options = this.options = new RomanOptions(); + this.events = events.loadFromSystem(this.options); + this.timescales = [1000, [1000, 60000], 60000, 3600000]; + this.sidebar = new Sidebar(g, barX, barY, barW, barH, options); + this.hours = Roman.hand(g, 3, 0.5, 12, _ => options.hourFg); + this.minutes = Roman.hand(g, 2, 0.9, 60, _ => options.minuteFg); + this.seconds = Roman.hand(g, 1, 0.9, 60, _ => options.secondFg); } reset() {this.state = {}; this.g.clear(true);} @@ -488,150 +487,150 @@ class Roman { // Watch hands. These could be improved, graphically. // If we restricted them to 60 positions, we could feasibly hand-draw them? static hand(g, w, l, d, c) { - return p => { - g.setColor(c()); - p = ((12 * p / d) + 1) % 12; - let h = l * rectW / 2; - let v = l * rectH / 2; - let poly = - p <= 2 ? [faceCX + w, faceCY, faceCX - w, faceCY, - faceCX + h * (p - 1), faceCY - v, - faceCX + h * (p - 1) + 1, faceCY - v] - : p < 6 ? [faceCX + 1, faceCY + w, faceCX + 1, faceCY - w, - faceCX + h, faceCY + v / 2 * (p - 4), - faceCX + h, faceCY + v / 2 * (p - 4) + 1] - : p <= 8 ? [faceCX - w, faceCY + 1, faceCX + w, faceCY + 1, - faceCX - h * (p - 7), faceCY + v, - faceCX - h * (p - 7) - 1, faceCY + v] - : [faceCX, faceCY - w, faceCX, faceCY + w, - faceCX - h, faceCY - v / 2 * (p - 10), - faceCX - h, faceCY - v / 2 * (p - 10) - 1]; - g.fillPoly(poly); - }; + return p => { + g.setColor(c()); + p = ((12 * p / d) + 1) % 12; + let h = l * rectW / 2; + let v = l * rectH / 2; + let poly = + p <= 2 ? [faceCX + w, faceCY, faceCX - w, faceCY, + faceCX + h * (p - 1), faceCY - v, + faceCX + h * (p - 1) + 1, faceCY - v] + : p < 6 ? [faceCX + 1, faceCY + w, faceCX + 1, faceCY - w, + faceCX + h, faceCY + v / 2 * (p - 4), + faceCX + h, faceCY + v / 2 * (p - 4) + 1] + : p <= 8 ? [faceCX - w, faceCY + 1, faceCX + w, faceCY + 1, + faceCX - h * (p - 7), faceCY + v, + faceCX - h * (p - 7) - 1, faceCY + v] + : [faceCX, faceCY - w, faceCX, faceCY + w, + faceCX - h, faceCY - v / 2 * (p - 10), + faceCX - h, faceCY - v / 2 * (p - 10) - 1]; + g.fillPoly(poly); + }; } static pos(p, r) { - let h = r * rectW / 2; - let v = r * rectH / 2; - p = (p + 1) % 12; - return p <= 2 ? [faceCX + h * (p - 1), faceCY - v] - : p < 6 ? [faceCX + h, faceCY + v / 2 * (p - 4)] - : p <= 8 ? [faceCX - h * (p - 7), faceCY + v] - : [faceCX - h, faceCY - v / 2 * (p - 10)]; + let h = r * rectW / 2; + let v = r * rectH / 2; + p = (p + 1) % 12; + return p <= 2 ? [faceCX + h * (p - 1), faceCY - v] + : p < 6 ? [faceCX + h, faceCY + v / 2 * (p - 4)] + : p <= 8 ? [faceCX - h * (p - 7), faceCY + v] + : [faceCX - h, faceCY - v / 2 * (p - 10)]; } alert(e, date, now, past) { - const g = this.g; - g.setColor(e.colour); - const dt = date - now; - if (e.precision < 60000 && dt >= 0 && e.future && dt <= 59000) { // Seconds away - const p = Roman.pos(date.getSeconds() / 5, 0.95); - g.drawLine(faceCX, faceCY, p[0], p[1]); - return 1000; - } else if (e.precision < 3600000 && dt >= 0 && e.future && dt <= 3540000) { // Minutes away - const p = Roman.pos(date.getMinutes() / 5 + date.getSeconds() / 300, 0.8); - g.drawLine(p[0] - 5, p[1], p[0] + 5, p[1]); - g.drawLine(p[0], p[1] - 5, p[0], p[1] + 5); - return dt < 119000 ? 1000 : 60000; // Turn on second hand two minutes up. - } else if (e.precision < 43200000 && dt >= 0 ? e.future : e.past) { // Hours away - const p = Roman.pos(date.getHours() + date.getMinutes() / 60, 0.6); - const poly = [p[0] - 4, p[1], p[0], p[1] - 4, p[0] + 4, p[1], p[0], p[1] + 4]; - if (date >= now) g.fillPoly(poly); - else g.drawPoly(poly, true); - return 3600000; - } - return Infinity; + const g = this.g; + g.setColor(e.colour); + const dt = date - now; + if (e.precision < 60000 && dt >= 0 && e.future && dt <= 59000) { // Seconds away + const p = Roman.pos(date.getSeconds() / 5, 0.95); + g.drawLine(faceCX, faceCY, p[0], p[1]); + return 1000; + } else if (e.precision < 3600000 && dt >= 0 && e.future && dt <= 3540000) { // Minutes away + const p = Roman.pos(date.getMinutes() / 5 + date.getSeconds() / 300, 0.8); + g.drawLine(p[0] - 5, p[1], p[0] + 5, p[1]); + g.drawLine(p[0], p[1] - 5, p[0], p[1] + 5); + return dt < 119000 ? 1000 : 60000; // Turn on second hand two minutes up. + } else if (e.precision < 43200000 && dt >= 0 ? e.future : e.past) { // Hours away + const p = Roman.pos(date.getHours() + date.getMinutes() / 60, 0.6); + const poly = [p[0] - 4, p[1], p[0], p[1] - 4, p[0] + 4, p[1], p[0], p[1] + 4]; + if (date >= now) g.fillPoly(poly); + else g.drawPoly(poly, true); + return 3600000; + } + return Infinity; } render(d, rate) { - const g = this.g; - const state = this.state; - const options = this.options; - const events = this.events; - events.clean(d, -39600000); // 11h + const g = this.g; + const state = this.state; + const options = this.options; + const events = this.events; + events.clean(d, -39600000); // 11h - // Sidebar: icons and date - if (d.getDate() !== state.date || !state.iconsOk) { - const sidebar = this.sidebar; - state.date = d.getDate(); - state.iconsOk = true; - g.setColor(options.barBg).fillRect(barX, barY, barX + barW, barY + barH); + // Sidebar: icons and date + if (d.getDate() !== state.date || !state.iconsOk) { + const sidebar = this.sidebar; + state.date = d.getDate(); + state.iconsOk = true; + g.setColor(options.barBg).fillRect(barX, barY, barX + barW, barY + barH); - sidebar.reset(rate).doLocked().doPower().doGPS().doHRM().doCompass(); - g.setFontCustom.apply(g, fontF); - let formatters = []; - let month, dom, dow; - if (options.calendric > 1) { - formatters.push(month = formatMonth.on(d.getMonth())); - } - if (options.calendric > 0) { - formatters.push(dom = formatDom.on(d.getDate())); - } - if (options.dow) { - formatters.push(dow = formatDow.on(d.getDay())); - } - // Obnoxiously inefficient iterative method :( - let ava = sidebar.free() - 3, use, i = 0, j = 0; - while ((use = formatters.reduce((l, f) => l + f.width(g) + 4, 0)) > ava && - j < formatters.length) - for (j = 0; - !formatters[i++ % formatters.length].squeeze() && - j < formatters.length; - j++) ; - if (dow) sidebar.print(dow); - sidebar.pad(ava - use); - if (month) sidebar.print(month); - if (dom) sidebar.print(dom); - } + sidebar.reset(rate).doLocked().doPower().doGPS().doHRM().doCompass(); + g.setFontCustom.apply(g, fontF); + let formatters = []; + let month, dom, dow; + if (options.calendric > 1) { + formatters.push(month = formatMonth.on(d.getMonth())); + } + if (options.calendric > 0) { + formatters.push(dom = formatDom.on(d.getDate())); + } + if (options.dow) { + formatters.push(dow = formatDow.on(d.getDay())); + } + // Obnoxiously inefficient iterative method :( + let ava = sidebar.free() - 3, use, i = 0, j = 0; + while ((use = formatters.reduce((l, f) => l + f.width(g) + 4, 0)) > ava && + j < formatters.length) + for (j = 0; + !formatters[i++ % formatters.length].squeeze() && + j < formatters.length; + j++) ; + if (dow) sidebar.print(dow); + sidebar.pad(ava - use); + if (month) sidebar.print(month); + if (dom) sidebar.print(dom); + } - // Hour labels and (purely aesthetic) box; clear inner face. - let keyHour = d.getHours() < 12 ? 1 : 13; - let alertSpan = events.span(d, hceil(d) - 39600000, hfloor(d) + 39600000, 39600000); - let l = alertSpan[0].getHours(), h = alertSpan[1].getHours(); - if ((l - keyHour + 24) % 24 >= 12 || (h - keyHour + 24) % 24 >= 12) keyHour = l; - if (keyHour !== state.keyHour) { - state.keyHour = keyHour; - g.setColor(options.bg) - .fillRect(faceX, faceY, faceX + faceW, faceY + faceH) - .setFontCustom.apply(g, romanPartsF) - .setFontAlign(0, 1) - .setColor(options.fg); - // In order to deal with timezone changes more logic will be required, - // since the labels may be in unusual locations (even offset when - // a non-integral zone is involved). The value of keyHour can be - // anything in [hr-12, hr] mod 24. - for (let h = keyHour; h < keyHour + 12; h++) { - g.drawString( - numeral(h % 24, options), - faceX + layout[h % 12 * 2], - faceY + layout[h % 12 * 2 + 1] - ); - } - g.setColor(options.rectFg) - .drawRect(rectX, rectY, rectX + rectW - 1, rectY + rectH - 1); - } else { - g.setColor(options.bg) - .fillRect(rectX + 1, rectY + 1, rectX + rectW - 2, rectY + rectH - 2) - .setColor(options.fg); - } + // Hour labels and (purely aesthetic) box; clear inner face. + let keyHour = d.getHours() < 12 ? 1 : 13; + let alertSpan = events.span(d, hceil(d) - 39600000, hfloor(d) + 39600000, 39600000); + let l = alertSpan[0].getHours(), h = alertSpan[1].getHours(); + if ((l - keyHour + 24) % 24 >= 12 || (h - keyHour + 24) % 24 >= 12) keyHour = l; + if (keyHour !== state.keyHour) { + state.keyHour = keyHour; + g.setColor(options.bg) + .fillRect(faceX, faceY, faceX + faceW, faceY + faceH) + .setFontCustom.apply(g, romanPartsF) + .setFontAlign(0, 1) + .setColor(options.fg); + // In order to deal with timezone changes more logic will be required, + // since the labels may be in unusual locations (even offset when + // a non-integral zone is involved). The value of keyHour can be + // anything in [hr-12, hr] mod 24. + for (let h = keyHour; h < keyHour + 12; h++) { + g.drawString( + numeral(h % 24, options), + faceX + layout[h % 12 * 2], + faceY + layout[h % 12 * 2 + 1] + ); + } + g.setColor(options.rectFg) + .drawRect(rectX, rectY, rectX + rectW - 1, rectY + rectH - 1); + } else { + g.setColor(options.bg) + .fillRect(rectX + 1, rectY + 1, rectX + rectW - 2, rectY + rectH - 2) + .setColor(options.fg); + } - // Alerts - let requestedRate = events.scan( - d, hfloor(alertSpan[0] + 0), hceil(alertSpan[1] + 0) + 1, - (e, t, p) => this.alert(e, t, d, p) - ); - if (rate > requestedRate) rate = requestedRate; - - // Hands - // Here we are using incremental hands for hours and minutes. - // If we quantised, we could use hand-crafted bitmaps, though. - this.hours(d.getHours() + d.getMinutes() / 60); - if (rate < 3600000) { - this.minutes(d.getMinutes() + d.getSeconds() / 60); - } - if (rate < 60000) this.seconds(d.getSeconds()); - g.setColor(options.hubFg).fillCircle(faceCX, faceCY, 3); - return requestedRate; + // Alerts + let requestedRate = events.scan( + d, hfloor(alertSpan[0] + 0), hceil(alertSpan[1] + 0) + 1, + (e, t, p) => this.alert(e, t, d, p) + ); + if (rate > requestedRate) rate = requestedRate; + + // Hands + // Here we are using incremental hands for hours and minutes. + // If we quantised, we could use hand-crafted bitmaps, though. + this.hours(d.getHours() + d.getMinutes() / 60); + if (rate < 3600000) { + this.minutes(d.getMinutes() + d.getSeconds() / 60); + } + if (rate < 60000) this.seconds(d.getSeconds()); + g.setColor(options.hubFg).fillCircle(faceCX, faceCY, 3); + return requestedRate; } } @@ -640,119 +639,119 @@ class Roman { class Clock { constructor(face) { - this.face = face; - this.timescales = face.timescales; - this.options = face.options; - this.rates = {}; + this.face = face; + this.timescales = face.timescales; + this.options = face.options; + this.rates = {}; - this.options.on('done', () => this.start()); - - this.listeners = { - lcdPower: on => on ? this.active() : this.inactive(), - charging: () => {face.doIcons('charging'); this.active();}, - lock: () => {face.doIcons('locked'); this.active();}, - faceUp: up => {this.conservative = !up; this.active();}, - drag: e => { - if (this.t0) { - if (e.b) { - e.x > this.xN && (this.xN = e.x) || e.x > this.xX && (this.xX = e.x); - e.y > this.yN && (this.yN = e.y) || e.y > this.yX && (this.xY = e.y); - } else if (this.xX - this.xN < 20) { - if (e.y - this.e0.y < -50) { - this.options.resolution > 0 && this.options.resolution--; - this.rates.clock = this.timescales[this.options.resolution]; - this.active(); - } else if (e.y - this.e0.y > 50) { - this.options.resolution < this.timescales.length - 1 && - this.options.resolution++; - this.rates.clock = this.timescales[this.options.resolution]; - this.active(); - } else if (this.yX - this.yN < 20 && Date.now() - this.t0 > 500) { - this.stop(); - this.options.interact(); - } - this.t0 = null; - } - } else if (e.b) { - this.t0 = Date.now(); this.e0 = e; - this.xN = this.xX = e.x; this.yN = this.yX = e.y; - } - } - }; + this.options.on('done', () => this.start()); + + this.listeners = { + lcdPower: on => on ? this.active() : this.inactive(), + charging: () => {face.doIcons('charging'); this.active();}, + lock: () => {face.doIcons('locked'); this.active();}, + faceUp: up => {this.conservative = !up; this.active();}, + drag: e => { + if (this.t0) { + if (e.b) { + e.x > this.xN && (this.xN = e.x) || e.x > this.xX && (this.xX = e.x); + e.y > this.yN && (this.yN = e.y) || e.y > this.yX && (this.xY = e.y); + } else if (this.xX - this.xN < 20) { + if (e.y - this.e0.y < -50) { + this.options.resolution > 0 && this.options.resolution--; + this.rates.clock = this.timescales[this.options.resolution]; + this.active(); + } else if (e.y - this.e0.y > 50) { + this.options.resolution < this.timescales.length - 1 && + this.options.resolution++; + this.rates.clock = this.timescales[this.options.resolution]; + this.active(); + } else if (this.yX - this.yN < 20 && Date.now() - this.t0 > 500) { + this.stop(); + this.options.interact(); + } + this.t0 = null; + } + } else if (e.b) { + this.t0 = Date.now(); this.e0 = e; + this.xN = this.xX = e.x; this.yN = this.yX = e.y; + } + } + }; } redraw(rate) { - const now = this.updated = new Date(); - if (this.refresh) this.face.reset(); - this.refresh = false; - rate = this.face.render(now, rate); - if (rate !== this.rates.face) { - this.rates.face = rate; - this.active(); - } - return this; + const now = this.updated = new Date(); + if (this.refresh) this.face.reset(); + this.refresh = false; + rate = this.face.render(now, rate); + if (rate !== this.rates.face) { + this.rates.face = rate; + this.active(); + } + return this; } inactive() { - this.timeout && clearTimeout(this.timeout); - this.exception && clearTimeout(this.exception); - this.interval && clearInterval(this.interval); - this.timeout = this.exception = this.interval = this.rate = null; - return this; + this.timeout && clearTimeout(this.timeout); + this.exception && clearTimeout(this.exception); + this.interval && clearInterval(this.interval); + this.timeout = this.exception = this.interval = this.rate = null; + return this; } active() { - const prev = this.rate; - const now = Date.now(); - let rate = Infinity; - for (const k in this.rates) { - let r = this.rates[k]; - r === +r || (r = r[+this.conservative]) - r < rate && (rate = r); - } - const delay = rate - now % rate + 1; - this.refresh = true; - - if (rate !== prev) { - this.inactive(); - this.redraw(rate); - if (rate < 31622400000) { // A year! - this.timeout = setTimeout( - () => { - this.inactive(); - this.interval = setInterval(() => this.redraw(rate), rate); - if (delay > 1000) this.redraw(rate); - this.rate = rate; - }, delay - ); - } - } else if (rate > 1000) { - if (!this.exception) this.exception = setTimeout(() => { - this.redraw(rate); - this.exception = null; - }, this.updated + 1000 - Date.now()); - } - return this; + const prev = this.rate; + const now = Date.now(); + let rate = Infinity; + for (const k in this.rates) { + let r = this.rates[k]; + r === +r || (r = r[+this.conservative]) + r < rate && (rate = r); + } + const delay = rate - now % rate + 1; + this.refresh = true; + + if (rate !== prev) { + this.inactive(); + this.redraw(rate); + if (rate < 31622400000) { // A year! + this.timeout = setTimeout( + () => { + this.inactive(); + this.interval = setInterval(() => this.redraw(rate), rate); + if (delay > 1000) this.redraw(rate); + this.rate = rate; + }, delay + ); + } + } else if (rate > 1000) { + if (!this.exception) this.exception = setTimeout(() => { + this.redraw(rate); + this.exception = null; + }, this.updated + 1000 - Date.now()); + } + return this; } stop() { - this.inactive(); - for (const l in this.listeners) { - Bangle.removeListener(l, this.listeners[l]); - } - return this; + this.inactive(); + for (const l in this.listeners) { + Bangle.removeListener(l, this.listeners[l]); + } + return this; } start() { - this.inactive(); // Reset to known state. - this.conservative = false; - this.rates.clock = this.timescales[this.options.resolution]; - this.active(); - for (const l in this.listeners) { - Bangle.on(l, this.listeners[l]); - } - Bangle.setUI('clock'); - return this; + this.inactive(); // Reset to known state. + this.conservative = false; + this.rates.clock = this.timescales[this.options.resolution]; + this.active(); + for (const l in this.listeners) { + Bangle.on(l, this.listeners[l]); + } + Bangle.setUI('clock'); + return this; } } diff --git a/apps/pooqroman/resourcer.js b/apps/pooqroman/resourcer.js index c172812c7..69365018e 100644 --- a/apps/pooqroman/resourcer.js +++ b/apps/pooqroman/resourcer.js @@ -63,27 +63,27 @@ const prepFont = (name, data) => { if (m = /^(<*)(=)([*\d]*)(=*)(>*)$/.exec(line) || /^(<*)(-)(.)(-*)(>*)$/.exec(line)) { const h = m[2] == '='; if (m[1].length > desc || h && m[1].length != desc) - throw new Error('Invalid descender height at ' + l); - if (m[2].length + m[3].length + m[4].length != body) - throw new Error('Invalid body height at ' + l); - if (m[5].length > asc || h && m[5].length != asc) - throw new Error('Invalid ascender height at ' + l); - if (c != null) { - lengths[c] = l - o; - if (width !== null && width !== lengths[c]) - throw new Error( - `Character has width ${lengths[c]} != ${width} at ${offsets[c]}` - ); - c = null - } - if (!h) { - c = m[3].charCodeAt(0); - if (c < min) min = c; - if (c > max) max = c; - o = l + 1; - offsets[c] = l; - adjustments[c] = m[1].length - } + throw new Error('Invalid descender height at ' + l); + if (m[2].length + m[3].length + m[4].length != body) + throw new Error('Invalid body height at ' + l); + if (m[5].length > asc || h && m[5].length != asc) + throw new Error('Invalid ascender height at ' + l); + if (c != null) { + lengths[c] = l - o; + if (width !== null && width !== lengths[c]) + throw new Error( + `Character has width ${lengths[c]} != ${width} at ${offsets[c]}` + ); + c = null + } + if (!h) { + c = m[3].charCodeAt(0); + if (c < min) min = c; + if (c > max) max = c; + o = l + 1; + offsets[c] = l; + adjustments[c] = m[1].length + } } }); const xoffs = Uint8Array(lines.length); @@ -92,16 +92,16 @@ const prepFont = (name, data) => { const w0 = lengths[min]; let widths = ''; for (c = min, o = 0; c <= max; c++) { - for (i = 0, j = offsets[c]; i < lengths[c]; i++) { - xoffs[j] = asc + body + adjustments[c] - 1; - ypos[j++] = o++; - } - widths += String.fromCharCode(lengths[c]); + for (i = 0, j = offsets[c]; i < lengths[c]; i++) { + xoffs[j] = asc + body + adjustments[c] - 1; + ypos[j++] = o++; + } + widths += String.fromCharCode(lengths[c]); } const raster = Graphics.createArrayBuffer(h, o, 1, {msb: true}); const writer = Graphics.createCallback( - image.width, image.height, 1, - (x, y, col) => raster.setPixel(xoffs[y] - x, ypos[y], col) + image.width, image.height, 1, + (x, y, col) => raster.setPixel(xoffs[y] - x, ypos[y], col) ); writer.drawImage(image); if (width === null) width = `dec(${enc(widths)})`;