Merge branch 'espruino:master' into master
13
apps.json
|
@ -16,7 +16,7 @@
|
||||||
{
|
{
|
||||||
"id": "boot",
|
"id": "boot",
|
||||||
"name": "Bootloader",
|
"name": "Bootloader",
|
||||||
"version": "0.36",
|
"version": "0.37",
|
||||||
"description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings",
|
"description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings",
|
||||||
"icon": "bootloader.png",
|
"icon": "bootloader.png",
|
||||||
"type": "bootloader",
|
"type": "bootloader",
|
||||||
|
@ -119,7 +119,7 @@
|
||||||
{
|
{
|
||||||
"id": "setting",
|
"id": "setting",
|
||||||
"name": "Settings",
|
"name": "Settings",
|
||||||
"version": "0.33",
|
"version": "0.34",
|
||||||
"description": "A menu for setting up Bangle.js",
|
"description": "A menu for setting up Bangle.js",
|
||||||
"icon": "settings.png",
|
"icon": "settings.png",
|
||||||
"tags": "tool,system",
|
"tags": "tool,system",
|
||||||
|
@ -3797,10 +3797,11 @@
|
||||||
"id": "qmsched",
|
"id": "qmsched",
|
||||||
"name": "Quiet Mode Schedule and Widget",
|
"name": "Quiet Mode Schedule and Widget",
|
||||||
"shortName": "Quiet Mode",
|
"shortName": "Quiet Mode",
|
||||||
"version": "0.03",
|
"version": "0.04",
|
||||||
"description": "Automatically turn Quiet Mode on or off at set times",
|
"description": "Automatically turn Quiet Mode on or off at set times, and change LCD options while Quiet Mode is active.",
|
||||||
"icon": "app.png",
|
"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",
|
"tags": "tool,widget",
|
||||||
"supports": ["BANGLEJS","BANGLEJS2"],
|
"supports": ["BANGLEJS","BANGLEJS2"],
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
|
@ -4628,7 +4629,7 @@
|
||||||
"id": "pebble",
|
"id": "pebble",
|
||||||
"name": "Pebble Clock",
|
"name": "Pebble Clock",
|
||||||
"shortName": "Pebble",
|
"shortName": "Pebble",
|
||||||
"version": "0.02",
|
"version": "0.03",
|
||||||
"description": "A pebble style clock to keep the rebellion going",
|
"description": "A pebble style clock to keep the rebellion going",
|
||||||
"readme": "README.md",
|
"readme": "README.md",
|
||||||
"icon": "pebble.png",
|
"icon": "pebble.png",
|
||||||
|
|
|
@ -40,3 +40,4 @@
|
||||||
0.35: Add Bangle.appRect polyfill
|
0.35: Add Bangle.appRect polyfill
|
||||||
Don't set beep vibration up on Bangle.js 2 (built in)
|
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.36: Add comments to .boot0 to make debugging a bit easier
|
||||||
|
0.37: Remove Quiet Mode settings: now handled by Quiet Mode Schedule app
|
||||||
|
|
|
@ -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`;
|
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
|
// Apply any settings-specific stuff
|
||||||
if (s.options) boot+=`Bangle.setOptions(${E.toJS(s.options)});\n`;
|
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.brightness && s.brightness!=1) boot+=`Bangle.setLCDBrightness(${s.brightness});\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.passkey!==undefined && s.passkey.length==6) boot+=`NRF.setSecurity({passkey:${s.passkey}, mitm:1, display:1});\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`;
|
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
|
// Pre-2v10 firmwares without a theme/setUI
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
0.01: first release
|
0.01: first release
|
||||||
0.02: included deployment of pebble.settings.js in apps.json
|
0.02: included deployment of pebble.settings.js in apps.json
|
||||||
|
0.03: Changed time+calendar font to LECO1976Regular, changed to slanting boot
|
||||||
|
|
Before Width: | Height: | Size: 2.5 KiB |
|
@ -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) {
|
Graphics.prototype.setFontLECO1976Regular22 = function(scale) {
|
||||||
// Actual height 60 (60 - 1)
|
// Actual height 22 (21 - 0)
|
||||||
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));
|
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";
|
const SETTINGS_FILE = "pebble.json";
|
||||||
|
@ -11,11 +15,11 @@ function loadSettings() {
|
||||||
settings = require("Storage").readJSON(SETTINGS_FILE,1)|| {'bg': '#0f0', 'color': 'Green'};
|
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 h = g.getHeight();
|
||||||
const w = g.getWidth();
|
const w = g.getWidth();
|
||||||
const ha = 2*h/5 - 8;
|
const ha = 2*h/5 - 4;
|
||||||
const h2 = 3*h/5 - 10;
|
const h2 = 3*h/5 - 10;
|
||||||
const h3 = 7*h/8;
|
const h3 = 7*h/8;
|
||||||
|
|
||||||
|
@ -24,7 +28,6 @@ let batteryWarning = false;
|
||||||
function draw() {
|
function draw() {
|
||||||
let date = new Date();
|
let date = new Date();
|
||||||
let da = date.toString().split(" ");
|
let da = date.toString().split(" ");
|
||||||
//let timeStr = require("locale").time(date,1); // causes screen corruption ???
|
|
||||||
let timeStr = da[4].substr(0,5);
|
let timeStr = da[4].substr(0,5);
|
||||||
const t = 6;
|
const t = 6;
|
||||||
|
|
||||||
|
@ -50,19 +53,20 @@ function draw() {
|
||||||
else
|
else
|
||||||
g.setColor('#000'); // otherwise black regardless of theme
|
g.setColor('#000'); // otherwise black regardless of theme
|
||||||
|
|
||||||
g.setFont('Vector', 22);
|
g.setFontLECO1976Regular22();
|
||||||
g.setFontAlign(0, -1);
|
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);
|
g.drawString(getSteps(), 3*w/4, ha);
|
||||||
|
|
||||||
// time
|
// time
|
||||||
// white on red for battery warning
|
// white on red for battery warning
|
||||||
g.setColor(!batteryWarning ? g.theme.bg : '#f00');
|
g.setColor(!batteryWarning ? g.theme.bg : '#f00');
|
||||||
g.fillRect(0, h2, w, h3);
|
g.fillRect(0, h2, w, h3);
|
||||||
g.setFontQahiri();
|
|
||||||
|
g.setFontLECO1976Regular42();
|
||||||
g.setFontAlign(0, -1);
|
g.setFontAlign(0, -1);
|
||||||
g.setColor(!batteryWarning ? g.theme.fg : '#fff');
|
g.setColor(!batteryWarning ? g.theme.fg : '#fff');
|
||||||
g.drawString(timeStr, w/2, h2 - 8);
|
g.drawString(timeStr, w/2, h2 + 8);
|
||||||
|
|
||||||
// contrast bar
|
// contrast bar
|
||||||
g.setColor(g.theme.fg);
|
g.setColor(g.theme.fg);
|
||||||
|
@ -73,8 +77,8 @@ function draw() {
|
||||||
g.fillRect(0, h3 + t, w, h);
|
g.fillRect(0, h3 + t, w, h);
|
||||||
|
|
||||||
g.setColor(settings.bg);
|
g.setColor(settings.bg);
|
||||||
g.drawImage(img, w/2 + ((w/2) - 64)/2, 10, { scale: 1 });
|
g.drawImage(img, w/2 + ((w/2) - 64)/2, 1, { scale: 1 });
|
||||||
drawCalendar(((w/2) - 48)/2, 10, 48, 4, da[2]);
|
drawCalendar(((w/2) - 42)/2, 14, 42, 4, da[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// at x,y width:wi thicknes:th
|
// at x,y width:wi thicknes:th
|
||||||
|
@ -91,9 +95,9 @@ function drawCalendar(x,y,wi,th,str) {
|
||||||
// second calendar hook, two thirds in
|
// 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.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.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() {
|
function getSteps() {
|
||||||
|
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.3 KiB |
|
@ -1,3 +1,4 @@
|
||||||
0.01: First version
|
0.01: First version
|
||||||
0.02: Add widget
|
0.02: Add widget
|
||||||
0.03: Bangle.js 2 support
|
0.03: Bangle.js 2 support
|
||||||
|
0.04: Move Quiet Mode LCD options from global settings to this app
|
||||||
|
|
|
@ -1,9 +1,14 @@
|
||||||
# Quiet Mode Schedule and Widget
|
# 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:
|
| Bangle.js 1 | Bangle.js 2 |
|
||||||
 
|
|:---------------------------------------------:|:---------------------------------------------:|
|
||||||
|
| (widget: Silent mode) | (widget: Alarms mode) |
|
||||||
|
|  |  |
|
||||||
|
|  |  |
|
||||||
|
|  |  |
|
||||||
|
|
||||||
### Widget:
|
### LCD Settings:
|
||||||
 
|
|
||||||
|
If set, these override the default LCD settings while Quiet Mode is active.
|
|
@ -2,27 +2,74 @@ Bangle.loadWidgets();
|
||||||
Bangle.drawWidgets();
|
Bangle.drawWidgets();
|
||||||
|
|
||||||
const modeNames = ["Off", "Alarms", "Silent"];
|
const modeNames = ["Off", "Alarms", "Silent"];
|
||||||
let scheds = require("Storage").readJSON("qmsched.json", 1);
|
|
||||||
/*scheds = [
|
// load global brightness setting
|
||||||
{ hr : 6.5, // hours + minutes/60
|
let bSettings = require('Storage').readJSON('setting.json',true)||{};
|
||||||
mode : 1, // quiet mode (0/1/2)
|
let current = 0|bSettings.quiet;
|
||||||
}
|
delete bSettings; // we don't need any other global settings
|
||||||
];*/
|
|
||||||
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);
|
* Save settings to qmsched.json
|
||||||
|
*/
|
||||||
|
function save() {
|
||||||
|
require('Storage').writeJSON('qmsched.json', settings);
|
||||||
}
|
}
|
||||||
if (scheds.length && scheds.some(s => "last" in s)) {
|
function get(key, def) {
|
||||||
// cleanup: remove "last" values (used by old versions)
|
return (key in settings) ? settings[key] : def;
|
||||||
scheds = scheds.map(s => {
|
}
|
||||||
delete s.last;
|
function set(key, val) {
|
||||||
return s;
|
settings[key] = val; save();
|
||||||
});
|
scheds = settings.scheds; options = settings.options; // update references
|
||||||
require("Storage").writeJSON("qmsched.json", scheds);
|
}
|
||||||
|
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) {
|
function formatTime(t) {
|
||||||
|
@ -32,29 +79,35 @@ function formatTime(t) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function showMainMenu() {
|
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
|
// "Current Mode""Silent" won't fit on Bangle.js 2
|
||||||
menu["Current" + ((process.env.HWVERSION===2)?"":" Mode")]= {
|
menu["Current"+((process.env.HWVERSION===2) ? "" : " Mode")] = {
|
||||||
value: (require("Storage").readJSON("setting.json", 1) || {}).quiet|0,
|
value: current,
|
||||||
format: v => modeNames[v],
|
format: v => modeNames[v],
|
||||||
onchange: function(v) {
|
onchange: function(v) {
|
||||||
if (v<0) {v = 2;}
|
if (v<0) {v = 2;}
|
||||||
if (v>2) {v = 0;}
|
if (v>2) {v = 0;}
|
||||||
require("qmsched").setMode(v);
|
require("qmsched").setMode(v);
|
||||||
|
current = v;
|
||||||
this.value = v;
|
this.value = v;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
scheds.sort((a, b) => (a.hr-b.hr));
|
scheds.sort((a, b) => (a.hr-b.hr));
|
||||||
scheds.forEach((sched, idx) => {
|
scheds.forEach((sched, idx) => {
|
||||||
const name = modeNames[sched.mode];
|
menu[formatTime(sched.hr)] = {
|
||||||
const txt = formatTime(sched.hr)+" ".repeat(14-name.length)+name;
|
format: () => modeNames[sched.mode], // abuse format to right-align text
|
||||||
menu[txt] = function() {
|
onchange: function() {
|
||||||
showEditMenu(idx);
|
_m.draw = ()=> {}; // prevent redraw of main menu over edit menu
|
||||||
|
showEditMenu(idx);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
menu["Add Schedule"] = () => showEditMenu(-1);
|
menu["Add Schedule"] = () => showEditMenu(-1);
|
||||||
menu["< Back"] = () => {load();};
|
menu["LCD Settings"] = () => showOptionsMenu();
|
||||||
return E.showMenu(menu);
|
_m = E.showMenu(menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
function showEditMenu(index) {
|
function showEditMenu(index) {
|
||||||
|
@ -69,6 +122,7 @@ function showEditMenu(index) {
|
||||||
}
|
}
|
||||||
const menu = {
|
const menu = {
|
||||||
"": {"title": (isNew ? "Add" : "Edit")+" Schedule"},
|
"": {"title": (isNew ? "Add" : "Edit")+" Schedule"},
|
||||||
|
"< Cancel": () => showMainMenu(),
|
||||||
"Hours": {
|
"Hours": {
|
||||||
value: hrs,
|
value: hrs,
|
||||||
onchange: function(v) {
|
onchange: function(v) {
|
||||||
|
@ -110,18 +164,88 @@ function showEditMenu(index) {
|
||||||
} else {
|
} else {
|
||||||
scheds[index] = getSched();
|
scheds[index] = getSched();
|
||||||
}
|
}
|
||||||
require("Storage").writeJSON("qmsched.json", scheds);
|
save();
|
||||||
showMainMenu();
|
showMainMenu();
|
||||||
};
|
};
|
||||||
if (!isNew) {
|
if (!isNew) {
|
||||||
menu["> Delete"] = function() {
|
menu["> Delete"] = function() {
|
||||||
scheds.splice(index, 1);
|
scheds.splice(index, 1);
|
||||||
require("Storage").writeJSON("qmsched.json", scheds);
|
save();
|
||||||
showMainMenu();
|
showMainMenu();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
menu["< Cancel"] = showMainMenu;
|
|
||||||
return E.showMenu(menu);
|
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();
|
showMainMenu();
|
||||||
|
|
|
@ -1,7 +1,13 @@
|
||||||
// apply Quiet Mode schedules
|
// apply Quiet Mode schedules
|
||||||
(function qm() {
|
(function qm() {
|
||||||
let scheds = require("Storage").readJSON("qmsched.json", 1) || [];
|
let bSettings = require('Storage').readJSON('setting.json',true)||{};
|
||||||
if (!scheds.length) { return;}
|
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(),
|
const now = new Date(),
|
||||||
hr = now.getHours()+(now.getMinutes()/60)+(now.getSeconds()/3600); // current (decimal) hour
|
hr = now.getHours()+(now.getMinutes()/60)+(now.getSeconds()/3600); // current (decimal) hour
|
||||||
scheds.sort((a, b) => a.hr-b.hr);
|
scheds.sort((a, b) => a.hr-b.hr);
|
||||||
|
|
|
@ -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
|
* Set new Quiet Mode and apply Bangle options
|
||||||
* @param {int} mode Quiet Mode
|
* @param {int} mode Quiet Mode
|
||||||
*/
|
*/
|
||||||
exports.setMode = function(mode) {
|
exports.setMode = function(mode) {
|
||||||
let s = require("Storage").readJSON("setting.json", 1) || {};
|
require("Storage").writeJSON("setting.json", Object.assign(
|
||||||
s.quiet = mode;
|
require("Storage").readJSON("setting.json", 1) || {},
|
||||||
require("Storage").writeJSON("setting.json", s);
|
{quiet:mode}
|
||||||
if (s.options) Bangle.setOptions(s.options);
|
));
|
||||||
if (mode && s.qmOptions) Bangle.setOptions(s.qmOptions);
|
exports.applyOptions(mode);
|
||||||
if (mode && s.qmBrightness) {
|
if (WIDGETS && "qmsched" in WIDGETS) WIDGETS["qmsched"].draw();
|
||||||
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();}
|
|
||||||
};
|
|
||||||
|
|
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 4.1 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.6 KiB |
Before Width: | Height: | Size: 3.9 KiB |
Before Width: | Height: | Size: 3.8 KiB |
|
@ -16,9 +16,9 @@ WIDGETS["qmsched"] = {
|
||||||
}
|
}
|
||||||
let x = this.x, y = this.y;
|
let x = this.x, y = this.y;
|
||||||
g.clearRect(x, y, x+23, y+23);
|
g.clearRect(x, y, x+23, y+23);
|
||||||
// quiet mode: draw dim red one-way-street sign
|
// quiet mode: draw red one-way-street sign (dim red on Bangle.js 1)
|
||||||
x = this.x+11;y = this.y+11; // center of widget
|
x = this.x+11;y = this.y+11; // center of widget
|
||||||
g.setColor(0.8, 0, 0).fillCircle(x, y, 8);
|
g.setColor(process.env.HWVERSION===2 ? 1 : 0.8, 0, 0).fillCircle(x, y, 8);
|
||||||
g.setColor(g.theme.bg).fillRect(x-6, y-2, x+6, y+2);
|
g.setColor(g.theme.bg).fillRect(x-6, y-2, x+6, y+2);
|
||||||
if (mode>1) {return;} // no alarms
|
if (mode>1) {return;} // no alarms
|
||||||
// alarms still on: draw alarm icon in bottom-right corner
|
// alarms still on: draw alarm icon in bottom-right corner
|
||||||
|
|
|
@ -36,3 +36,4 @@
|
||||||
0.31: Remove Bangle 1 settings when running on Bangle 2
|
0.31: Remove Bangle 1 settings when running on Bangle 2
|
||||||
0.32: Fix 'beep' menu on Bangle.js 2
|
0.32: Fix 'beep' menu on Bangle.js 2
|
||||||
0.33: Really fix 'beep' menu on Bangle.js 2 this time
|
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
|
||||||
|
|
|
@ -44,6 +44,4 @@ The exact effects depend on the app. In general the watch will not wake up by i
|
||||||
- Off: Normal operation
|
- Off: Normal operation
|
||||||
- Alarms: Stops notifications, but "alarm" apps will still work
|
- Alarms: Stops notifications, but "alarm" apps will still work
|
||||||
- Silent: Blocks even alarms
|
- Silent: Blocks even alarms
|
||||||
* **LCD Brightness**, **LCD Timeout**, **Wake on X**:
|
|
||||||
Override default settings while Quit Mode is active (either as *Alarms* or *Silent*)
|
|
||||||
|
|
|
@ -7,17 +7,12 @@ let settings;
|
||||||
|
|
||||||
function updateSettings() {
|
function updateSettings() {
|
||||||
//storage.erase('setting.json'); // - not needed, just causes extra writes if settings were the same
|
//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);
|
storage.write('setting.json', settings);
|
||||||
if (!('qmOptions' in settings)) settings.qmOptions = {}; // easier if this always exists in this file
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateOptions() {
|
function updateOptions() {
|
||||||
updateSettings();
|
updateSettings();
|
||||||
Bangle.setOptions(settings.options)
|
Bangle.setOptions(settings.options)
|
||||||
if (settings.quiet) {
|
|
||||||
Bangle.setOptions(settings.qmOptions)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function gToInternal(g) {
|
function gToInternal(g) {
|
||||||
|
@ -56,18 +51,12 @@ function resetSettings() {
|
||||||
twistMaxY: -800,
|
twistMaxY: -800,
|
||||||
twistTimeout: 1000
|
twistTimeout: 1000
|
||||||
},
|
},
|
||||||
// Quiet Mode options:
|
|
||||||
// we only set these if we want to override the default value
|
|
||||||
// qmOptions: {},
|
|
||||||
// qmBrightness: undefined,
|
|
||||||
// qmTimeout: undefined,
|
|
||||||
};
|
};
|
||||||
updateSettings();
|
updateSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
settings = storage.readJSON('setting.json', 1);
|
settings = storage.readJSON('setting.json', 1);
|
||||||
if (!settings) resetSettings();
|
if (!settings) resetSettings();
|
||||||
if (!('qmOptions' in settings)) settings.qmOptions = {}; // easier if this always exists in here
|
|
||||||
|
|
||||||
const boolFormat = v => v ? "On" : "Off";
|
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(),
|
'Locale': ()=>showLocaleMenu(),
|
||||||
'Select Clock': ()=>showClockMenu(),
|
'Select Clock': ()=>showClockMenu(),
|
||||||
'Set Time': ()=>showSetTimeMenu(),
|
'Set Time': ()=>showSetTimeMenu(),
|
||||||
|
@ -352,9 +350,7 @@ function showLCDMenu() {
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
settings.brightness = v || 1;
|
settings.brightness = v || 1;
|
||||||
updateSettings();
|
updateSettings();
|
||||||
if (!(settings.quiet && "qmBrightness" in settings)) {
|
Bangle.setLCDBrightness(settings.brightness);
|
||||||
Bangle.setLCDBrightness(settings.brightness);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'LCD Timeout': {
|
'LCD Timeout': {
|
||||||
|
@ -365,9 +361,7 @@ function showLCDMenu() {
|
||||||
onchange: v => {
|
onchange: v => {
|
||||||
settings.timeout = 0 | v;
|
settings.timeout = 0 | v;
|
||||||
updateSettings();
|
updateSettings();
|
||||||
if (!(settings.quiet && "qmTimeout" in settings)) {
|
Bangle.setLCDTimeout(settings.timeout);
|
||||||
Bangle.setLCDTimeout(settings.timeout);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'Wake on BTN1': {
|
'Wake on BTN1': {
|
||||||
|
@ -455,105 +449,6 @@ function showLCDMenu() {
|
||||||
});
|
});
|
||||||
return E.showMenu(lcdMenu)
|
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() {
|
function showLocaleMenu() {
|
||||||
const localemenu = {
|
const localemenu = {
|
||||||
|
|