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

121 lines
3.5 KiB
JavaScript
Raw Normal View History

2022-11-11 16:17:07 +00:00
// load library
var sched = require("sched");
// find next active alarm in range
function getNextAlarm(allAlarms, from, to, withId) {
if (withId) allAlarms = allAlarms.map((a, idx) => {
a.idx = idx;
return a;
});
// return next
return sched.getActiveAlarms(
// filter for active alarms in range
allAlarms.filter(a => a.on && !a.timer && a.t >= from && a.t < to)
).map(a => {
// add time to alarm
a.tTo = sched.getTimeToAlarm(a);
return a;
// sort to get next alarm first
}).sort((a, b) => a.tTo - b.tTo)[0] || {};
}
exports = {
// function to read settings with defaults
getSettings: function() {
return Object.assign({
enabled: true,
hide: false,
drawTime: true,
color: g.theme.dark ? 65504 : 31, // yellow or blue
from: 4, // 0400
to: 8, // 0800
earlier: 30,
msgAsPrefix: true,
disableOnAlarm: false, // !!! not available if alarm is at the next day
msg: "...\n",
vibrate: "..",
as: true
}, require("Storage").readJSON("sleeplogalarm.settings.json", true) || {});
},
// widget reload function
widReload: function() {
// abort if onChange is not available
if (typeof (global.sleeplog || {}).onChange !== "object") return;
// read settings to calculate alarm range
var settings = this.getSettings();
// set the alarm time
this.time = getNextAlarm(sched.getAlarms(), settings.from * 36E5, settings.to * 36E5).t;
// abort if no alarm time could be found inside range
if (!this.time) return;
// set widget width if not hidden
if (!this.hidden) this.width = 8;
// insert sleeplogalarm function to onChange
sleeplog.onChange.sleeplogalarm = function (data) {
// abort if not changed from deep sleep to light sleep or awake
if (data.prevStatus !== 4 || !(data.status === 3 || data.status === 2)) return;
// get settings from widget, now and calculate time of now
var settings = WIDGETS.sleeplogalarm;
var now = new Date();
2022-11-11 23:16:39 +00:00
var tNow = ((now.getHours() * 60 + now.getMinutes()) * 60 + now.getSeconds()) * 1000;
2022-11-11 16:17:07 +00:00
// execute trigger function if inside the alarm range
if (tNow >= settings.time - settings.earlier * 6E4 &&
tNow < settings.time) require("sleeplogalarm").trigger(now, tNow);
};
},
// trigger function
trigger: function(now, tNow) {
2022-11-11 23:16:39 +00:00
// read settings
2022-11-11 16:17:07 +00:00
var settings = this.getSettings();
// read all alarms
var allAlarms = sched.getAlarms();
// find first active alarm
2022-11-11 23:16:39 +00:00
var alarm = getNextAlarm(sched.getAlarms(), settings.from * 36E5, settings.to * 36E5, settings.disableOnAlarm);
2022-11-11 16:17:07 +00:00
// return if no alarm is found
if (!alarm) return;
2022-11-11 23:16:39 +00:00
// get date of the alarm
var aDate = new Date(now + alarm.tTo).getDate();
// disable earlier triggered alarm if set and on the same day
if (settings.disableOnAlarm && now.getDate() === aDate) {
// set alarms last to today
allAlarms[alarm.idx].last = aDate;
2022-11-11 16:17:07 +00:00
// remove added indexes
allAlarms = allAlarms.map(a => {
delete a.idx;
return a;
});
}
// add new alarm for now with data from found alarm
allAlarms.push({
id: "sleeplog",
appid: "sleeplog",
on: true,
2022-11-11 23:16:39 +00:00
t: tNow,
2022-11-11 16:17:07 +00:00
dow: 127,
msg: settings.msg + (settings.msgAsPrefix ? alarm.msg || "" : ""),
vibrate: settings.vibrate || alarm.vibrate,
as: settings.as,
del: true
});
// write changes
sched.setAlarms(allAlarms);
// trigger sched.js
load("sched.js");
}
};