From 3595fab079eb6a91596bc994c7d744109ed5c4fc Mon Sep 17 00:00:00 2001 From: Richard de Boer Date: Fri, 26 Nov 2021 20:05:40 +0100 Subject: [PATCH] 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