sleepphasealarm

Add plot logged data to settings
pull/2563/head
Erik Andresen 2023-02-05 11:38:22 +01:00
parent 3ada593477
commit b0b1eefb01
2 changed files with 98 additions and 20 deletions

View File

@ -16,3 +16,4 @@
0.13: Fix dated events alarm on wrong date 0.13: Fix dated events alarm on wrong date
0.14: Reduce update interval of current time when seconds are not shown 0.14: Reduce update interval of current time when seconds are not shown
Limit logging on Bangle.js 1 to one day due to low memory Limit logging on Bangle.js 1 to one day due to low memory
Add plot logged data to settings

View File

@ -13,25 +13,102 @@
require('Storage').writeJSON(CONFIGFILE, config); require('Storage').writeJSON(CONFIGFILE, config);
} }
// Show the menu function draw(log) {
E.showMenu({ const step = 10*60*1000; // resolution 10min
"" : { "title" : "SleepPhaseAlarm" }, const yTicks = ["sleep", "awake", "alarm"];
'Keep alarm enabled': { const starttime = new Date(log[0].time);
value: !!config.settings.disableAlarm, const endtime = new Date(log[log.length-1].time);
format: v => v?"No":"Yes",
onchange: v => { let logidx = 0;
config.settings.disableAlarm = v; let curtime = starttime;
writeSettings(); const data = new Uint8Array(Math.ceil((endtime-curtime)/step) + 1);
let curval;
let logtime;
let i=0;
while(curtime < endtime) {
if (logtime === undefined || curtime > logtime) {
curval = yTicks.indexOf(log[logidx].type);
logidx++;
logtime = new Date(log[logidx].time);
} }
}, "< Back" : () => back(),
'Run before alarm': { data[i++] = curval;
format: v => v === 0 ? 'disabled' : v+'h', curtime = new Date(curtime + step);
value: config.settings.startBeforeAlarm, }
min: 0, max: 23, data[i] = 1; // always end with awake
onchange: v => {
config.settings.startBeforeAlarm = v; Bangle.setUI({
writeSettings(); mode: "custom",
} back: () => selectday(),
}, });
}); g.reset().setFont("6x8",1);
require("graph").drawLine(g, data, {
axes: true,
x: 4,
y: Bangle.appRect.y+8,
height: Bangle.appRect.h-20,
gridx: 1,
gridy: 1,
miny: -1,
maxy: 2,
title: /*LANG*/"Wakeup " + require("locale").date(endtime, 1),
ylabel: y => y >= 0 && y <= 1 ? yTicks[y] : "",
xlabel: x => {
if (x === Math.round(data.length/10)) {
return require("locale").time(starttime, 1);
} else if (x === (data.length-2)-Math.round(data.length/10)) {
return require("locale").time(endtime, 1);
}
return "";
},
});
}
function selectday() {
E.showMessage(/*LANG*/"Loading...");
const logs = config.logs.filter(log => log != null && log.filter(entry => entry.type === "alarm").length > 0);
logs.sort(function(a, b) { // sort by alarm date desc
const adate = new Date(a.filter(entry => entry.type === "alarm")[0].time);
const bdate = new Date(b.filter(entry => entry.type === "alarm")[0].time);
return bdate - adate;
});
const menu = {};
menu[""] = { title: /*LANG*/"Select day" };
menu["< Back"] = () => settingsmenu();
logs.forEach((log, i) => {
const date = new Date(log.filter(entry => entry.type === "alarm")[0].time);
menu[require("locale").date(date, 1)] = () => { E.showMenu(); draw(log); };
});
E.showMenu(menu);
}
function settingsmenu() {
// Show the menu
E.showMenu({
"" : { "title" : "SleepPhaseAlarm" },
'Keep alarm enabled': {
value: !!config.settings.disableAlarm,
format: v => v?"No":"Yes",
onchange: v => {
config.settings.disableAlarm = v;
writeSettings();
}
}, "< Back" : () => back(),
'Run before alarm': {
format: v => v === 0 ? 'disabled' : v+'h',
value: config.settings.startBeforeAlarm,
min: 0, max: 23,
onchange: v => {
config.settings.startBeforeAlarm = v;
writeSettings();
}
},
/*LANG*/'Select day': () => selectday(),
});
}
settingsmenu();
}) })