1
0
Fork 0
BangleApps/apps/sleeplog/lib.js

151 lines
4.6 KiB
JavaScript

exports = {
// define en-/disable function
setEnabled: function(enable, logfile) {
// check if sleeplog is available
if (typeof global.sleeplog !== "object") return;
// set default logfile
logfile = logfile.endsWith(".log") ? logfile :
logfile === false ? undefined :
"sleeplog.log";
// check if status needs to be changed
if (enable === global.sleeplog.enabled ||
logfile === global.sleeplog.logfile) return false;
// stop if enabled
if (global.sleeplog.enabled) global.sleeplog.stop();
// define storage and filename
var storage = require("Storage");
var filename = "sleeplog.json";
// change enabled value in settings
storage.writeJSON(filename, Object.assign(storage.readJSON(filename, true) || {}, {
enabled: enable,
logfile: logfile
}));
// force changes to take effect by executing the boot script
eval(storage.read("sleeplog.boot.js"));
// clear variables
storage = undefined;
filename = undefined;
return true;
},
// define read log function
// sorting: latest first, format:
// [[number, int, float, string], [...], ... ]
// - number // timestamp in ms
// - int // status: 0 = unknown, 1 = not worn, 2 = awake, 3 = sleeping
// - float // internal temperature
// - string // additional information
readLog: function(since, until) {
// set logfile
var logfile = (global.sleeplog || {}).logfile || "sleeplog.log";
// check if since is in the future
if (since > Date()) return [];
// read log json to array
var log = JSON.parse(atob(require("Storage").read(logfile)));
// search for latest entry befor since
since = (log.find(element => element[0] <= since) || [0])[0];
// filter selected time period
log = log.filter(element => (element[0] >= since) && (element[0] <= (until || 1E14)));
// output log
return log;
},
// define log to humanreadable string function
// sorting: latest last, format:
// "{substring of ISO date} - {status} for {duration}min\n..."
getReadableLog: function(printLog, since, until) {
// read log and check
var log = this.readLog(since, until);
if (!log.length) return;
// reverse array to set last timestamp to the end
log.reverse();
// define status description and log string
var statusText = ["unknown ", "not worn", "awake ", "sleeping"];
var logString = [];
// rewrite each entry
log.forEach((element, index) => {
logString[index] = "" +
Date(element[0] - Date().getTimezoneOffset() * 6E4).toISOString().substr(0, 19).replace("T", " ") + " - " +
statusText[element[1]] +
(index === log.length - 1 ? "" : " for " + Math.round((log[index + 1][0] - element[0]) / 60000) + "min") +
(element[2] ? " | Temp: " + element[2] + "°C" : "") +
(element[3] ? " | " + element[3] : "");
});
logString = logString.join("\n");
// if set print and return string
if (printLog) {
print(logString);
print("- first", Date(log[0][0]));
print("- last", Date(log[log.length - 1][0]));
var period = log[log.length - 1][0] - log[0][0];
print("- period= " + Math.floor(period / 864E5) + "d " + Math.floor(period % 864E5 / 36E5) + "h " + Math.floor(period % 36E5 / 6E4) + "min");
}
return logString;
},
// define function to eliminate some errors inside the log
restoreLog: function(logfile) {
// define storage
var storage = require("Storage");
// read log json to array
var log = JSON.parse(atob(storage.read(logfile)));
// define output variable to show number of changes
var output = log.length;
// remove non decremental entries
log = log.filter((element, index) => log[index][0] >= (log[index + 1] || [0])[0]);
// write log to storage
storage.write(logfile, btoa(JSON.stringify(log)));
// return difference in length
return output - log.length;
},
// define function to reinterpret worn status based on given temperature threshold
reinterpretTemp: function(logfile, tempthresh) {
// define storage
var storage = require("Storage");
// read log json to array
var log = JSON.parse(atob(storage.read(logfile)));
// define output variable to show number of changes
var output = 0;
// remove non decremental entries
log = log.map(element => {
if (element[2]) {
var tmp = element[1];
element[1] = element[2] > tempthresh ? 3 : 1;
if (tmp !== element[1]) output++;
}
return element;
});
// write log to storage
storage.write(logfile, btoa(JSON.stringify(log)));
// return output
return output;
}
};