From a110a30ad526a4a85e01d424e7ee308115dd7210 Mon Sep 17 00:00:00 2001 From: storm64 Date: Wed, 16 Feb 2022 12:52:00 +0100 Subject: [PATCH] sleeplog: Fix logfile disabling, add status icons Update app.js - adjust label position to improve readability on light themes - add icons to display service states Update ChangeLog - compact old and add new changes Update lib.js - fix logfile correction in `setEnabled(...)` to make disable logging possible - simplify logfile checks Update README.md - add icons of the service states Update settings.js - fix error on reading a non string logfile value Add icons: disabled.png, nolog.png and powersaving.png --- apps/sleeplog/ChangeLog | 16 +++++++++++++++- apps/sleeplog/README.md | 3 +++ apps/sleeplog/app.js | 24 +++++++++++++++++------- apps/sleeplog/disabled.png | Bin 0 -> 8670 bytes apps/sleeplog/lib.js | 15 +++++++++------ apps/sleeplog/nolog.png | Bin 0 -> 10229 bytes apps/sleeplog/powersaving.png | Bin 0 -> 9751 bytes apps/sleeplog/settings.js | 2 +- 8 files changed, 45 insertions(+), 15 deletions(-) create mode 100644 apps/sleeplog/disabled.png create mode 100644 apps/sleeplog/nolog.png create mode 100644 apps/sleeplog/powersaving.png diff --git a/apps/sleeplog/ChangeLog b/apps/sleeplog/ChangeLog index e37283f09..0b7f686ee 100644 --- a/apps/sleeplog/ChangeLog +++ b/apps/sleeplog/ChangeLog @@ -1,4 +1,18 @@ 0.01: New App! 0.02: Fix crash on start #1423 0.03: Added power saving mode, move all read/write log actions into lib/module -0.04: Fix #1445, display loading info while calculating sleep data +0.04: Fix #1445, display loading info, add icons to display service states + +Update app.js + - adjust label position to improve readability on light themes + - add icons to display service states +Update ChangeLog + - compact old and add new changes +Update lib.js + - fix logfile correction in `setEnabled(...)` to make disable logging possible + - simplify logfile checks +Update README.md + - add icons of the service states +Update settings.js + - fix error on reading a non string logfile value +Add icons: disabled.png, nolog.png and powersaving.png diff --git a/apps/sleeplog/README.md b/apps/sleeplog/README.md index 4cb136c71..10d9a6b0b 100644 --- a/apps/sleeplog/README.md +++ b/apps/sleeplog/README.md @@ -49,6 +49,7 @@ also provides a power saving mode using the built in movement calculation. The i * __Power Saving__ _on_ / __off__ En-/Disable power saving mode. _Saves battery, but might decrease accurracy._ + In the app the following icon on the right indicates that power saving mode is enabled: ![](powersaving.png) * __Max Move__ | maximal movement threshold (only available when on power saving mode) _50_ / _51_ / _..._ / __100__ / _..._ / _200_ @@ -65,10 +66,12 @@ also provides a power saving mode using the built in movement calculation. The i * __Enabled__ __on__ / _off_ En-/Disable the service (all background activities). _Saves the most battery, but might make this app useless._ + In the app the following icon on the left indicates that the service is disabled: ![](disabled.png) * __Logfile__ __default__ / _off_ En-/Disable logging by setting the logfile to _sleeplog.log_ / _undefined_. If the logfile has been customized it is displayed with _custom_. + In the app the following icon on the left indicates that logging is disabled: ![](nolog.png) --- ### Global Object and Module Functions diff --git a/apps/sleeplog/app.js b/apps/sleeplog/app.js index cf4ecc415..8077b4d62 100644 --- a/apps/sleeplog/app.js +++ b/apps/sleeplog/app.js @@ -64,7 +64,7 @@ function drawLog(topY, viewUntil) { for (var x = 0; x < hours; x++) { g.fillRect(x * stepwidth, y + 2, x * stepwidth, y + 4); g.setFontAlign(-1, -1).setFont("6x8") - .drawString((startHour + x) % 24, x * stepwidth, y + 6); + .drawString((startHour + x) % 24, x * stepwidth + 1, y + 6); } // define variables for sleep calculation @@ -143,7 +143,7 @@ function drawAnalysis(toDate) { // draw log graphs and read outputs drawLog(110, toDate).forEach( (value, index) => outputs[index] += value); - drawLog(145, Date(toDate.valueOf() - 432E5)).forEach( + drawLog(144, Date(toDate.valueOf() - 432E5)).forEach( (value, index) => outputs[index] += value); // draw outputs @@ -176,12 +176,22 @@ function drawNightTo(prevDays) { // clear heading area g.clearRect(0, 24, width, 70); - // display service statuses: service, loggging and powersaving - g.setColor(global.sleeplog && sleeplog.enabled && sleeplog.logfile ? sleeplog.powersaving ? 2016 : g.theme.bg : 63488); - g.fillRect(0, 30, width, 66).reset(); + // display service states: service, loggging and powersaving + if (!sleeplog.enabled) { + // draw disabled service icon + g.setColor(1, 0, 0) + .drawImage(atob("FBSBAAH4AH/gH/+D//w/n8f5/nud7znP85z/f+/3/v8/z/P895+efGPj4Hw//8H/+Af+AB+A"), 2, 36); + } else if (!sleeplog.logfile) { + // draw disabled log icon + g.reset().drawImage(atob("EA6BAM//z/8AAAAAz//P/wAAAADP/8//AAAAAM//z/8="), 4, 40) + .setColor(1, 0, 0).fillPoly([2, 38, 4, 36, 22, 54, 20, 56]); + } + // draw power saving icon + if (sleeplog.powersaving) g.setColor(0, 1, 0) + .drawImage(atob("FBSBAAAAcAD/AH/wP/4P/+H//h//4//+fv/nj/7x/88//Of/jH/4j/8I/+Af+AH+AD8AA4AA"), width - 22, 36); // draw headline - g.setFont("12x20").setFontAlign(0, -1); + g.reset().setFont("12x20").setFontAlign(0, -1); g.drawString("Night to " + require('locale').dow(toDate, 1) + "\n" + require('locale').date(toDate, 1), center, 30); @@ -195,7 +205,7 @@ function drawNightTo(prevDays) { // calculate and draw analysis after timeout for faster feedback if (ATID) ATID = clearTimeout(ATID); - ATID = setTimeout(drawAnalysis, 50, toDate); + ATID = setTimeout(drawAnalysis, 100, toDate); } // define function to draw and setup UI diff --git a/apps/sleeplog/disabled.png b/apps/sleeplog/disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..ea487b48c1277fd748fca990ed7b1b53ab9a8f63 GIT binary patch literal 8670 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 literal 0 HcmV?d00001 diff --git a/apps/sleeplog/lib.js b/apps/sleeplog/lib.js index 1fbd3d2cb..7b35d8a85 100644 --- a/apps/sleeplog/lib.js +++ b/apps/sleeplog/lib.js @@ -5,8 +5,8 @@ exports = { if (typeof global.sleeplog !== "object") return; // set default logfile - logfile = (typeof logfile === "string" && logfile.endsWith(".log")) ? logfile : - logfile === false ? undefined : "sleeplog.log"; + if ((typeof logfile !== "string" || !logfile.endsWith(".log")) && + logfile !== false) logfile = "sleeplog.log"; // stop if enabled if (global.sleeplog.enabled) global.sleeplog.stop(); @@ -40,8 +40,9 @@ exports = { // - string // additional information readLog: function(logfile, since, until) { // check/set logfile - logfile = typeof logfile === "string" && logfile.endsWith(".log") ? logfile : - (global.sleeplog || {}).logfile || "sleeplog.log"; + if (typeof logfile !== "string" || !logfile.endsWith(".log")) { + logfile = (global.sleeplog || {}).logfile || "sleeplog.log"; + } // check if since is in the future if (since > Date()) return []; @@ -73,8 +74,10 @@ exports = { // replace log with input if at least one entry like above is inside another array writeLog: function(logfile, input) { // check/set logfile - logfile = typeof logfile === "string" && logfile.endsWith(".log") ? logfile : - (global.sleeplog || {}).logfile || "sleeplog.log"; + if (typeof logfile !== "string" || !logfile.endsWith(".log")) { + if (!global.sleeplog || sleeplog.logfile === false) return; + logfile = sleeplog.logfile || "sleeplog.log"; + } // check if input is an array if (typeof input !== "object" || typeof input.length !== "number") return; diff --git a/apps/sleeplog/nolog.png b/apps/sleeplog/nolog.png new file mode 100644 index 0000000000000000000000000000000000000000..b153b57698f1d4d747e0112d1d7755db26ebf524 GIT binary patch literal 10229 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 literal 0 HcmV?d00001 diff --git a/apps/sleeplog/settings.js b/apps/sleeplog/settings.js index ffc014337..11c7c0adb 100644 --- a/apps/sleeplog/settings.js +++ b/apps/sleeplog/settings.js @@ -127,7 +127,7 @@ } }, "Logfile ": { - value: settings.logfile === "sleeplog.log" ? true : settings.logfile.endsWith(".log") ? "custom" : false, + value: settings.logfile === "sleeplog.log" ? true : (settings.logfile || "").endsWith(".log") ? "custom" : false, format: v => v === true ? "default" : v ? "custom" : "off", onchange: function(v) { if (v !== "custom") {