BangleApps/apps/qalarm/app.js

272 lines
6.7 KiB
JavaScript

Bangle.loadWidgets();
Bangle.drawWidgets();
let alarms = require("Storage").readJSON("qalarm.json", 1) || [];
/*
Alarm format:
{
on : true,
t : 23400000, // Time of day since midnight in ms
msg : "Eat chocolate", // (optional) Must be set manually from the IDE
last : 0, // Last day of the month we alarmed on - so we don't alarm twice in one day!
rp : true, // Repeat
as : false, // Auto snooze
hard: true, // Whether the alarm will be like HardAlarm or not
timer : 300, // (optional) If set, this is a timer and it's the time in seconds
daysOfWeek: [true,true,true,true,true,true,true] // What days of the week the alarm is on. First item is Sunday, 2nd is Monday, etc.
}
*/
function formatTime(t) {
mins = 0 | (t / 60000) % 60;
hrs = 0 | (t / 3600000);
return hrs + ":" + ("0" + mins).substr(-2);
}
function formatTimer(t) {
mins = 0 | (t / 60) % 60;
hrs = 0 | (t / 3600);
return hrs + ":" + ("0" + mins).substr(-2);
}
function getCurrentTime() {
let time = new Date();
return (
time.getHours() * 3600000 +
time.getMinutes() * 60000 +
time.getSeconds() * 1000
);
}
function showMainMenu() {
const menu = {
"": { title: "Alarms" },
"< Back" : () => load(),
"New Alarm": () => showEditAlarmMenu(-1),
"New Timer": () => showEditTimerMenu(-1),
};
alarms.forEach((alarm, idx) => {
let txt =
(alarm.timer ? "TIMER " : "ALARM ") +
(alarm.on ? "on " : "off ") +
(alarm.timer ? formatTimer(alarm.timer) : formatTime(alarm.t));
menu[txt] = function () {
if (alarm.timer) showEditTimerMenu(idx);
else showEditAlarmMenu(idx);
};
});
menu
if (WIDGETS["qalarm"]) WIDGETS["qalarm"].reload();
return E.showMenu(menu);
}
function showEditAlarmMenu(alarmIndex, alarm) {
const newAlarm = alarmIndex < 0;
if (!alarm) {
if (newAlarm) {
alarm = {
t: 43200000,
on: true,
rp: true,
as: false,
hard: false,
daysOfWeek: new Array(7).fill(true),
};
} else {
alarm = Object.assign({}, alarms[alarmIndex]); // Copy object in case we don't save it
}
}
let hrs = 0 | (alarm.t / 3600000);
let mins = 0 | (alarm.t / 60000) % 60;
let secs = 0 | (alarm.t / 1000) % 60;
const menu = {
"": { title: alarm.msg ? alarm.msg : "Alarms" },
"< Back" : showMainMenu,
Hours: {
value: hrs,
onchange: function (v) {
if (v < 0) v = 23;
if (v > 23) v = 0;
hrs = v;
this.value = v;
}, // no arrow fn -> preserve 'this'
},
Minutes: {
value: mins,
onchange: function (v) {
if (v < 0) v = 59;
if (v > 59) v = 0;
mins = v;
this.value = v;
}, // no arrow fn -> preserve 'this'
},
Seconds: {
value: secs,
onchange: function (v) {
if (v < 0) v = 59;
if (v > 59) v = 0;
secs = v;
this.value = v;
}, // no arrow fn -> preserve 'this'
},
Enabled: {
value: alarm.on,
format: (v) => (v ? "On" : "Off"),
onchange: (v) => (alarm.on = v),
},
Repeat: {
value: alarm.rp,
format: (v) => (v ? "Yes" : "No"),
onchange: (v) => (alarm.rp = v),
},
"Auto snooze": {
value: alarm.as,
format: (v) => (v ? "Yes" : "No"),
onchange: (v) => (alarm.as = v),
},
Hard: {
value: alarm.hard,
format: (v) => (v ? "Yes" : "No"),
onchange: (v) => (alarm.hard = v),
},
"Days of week": () => showDaysMenu(alarmIndex, getAlarm()),
};
function getAlarm() {
alarm.t = hrs * 3600000 + mins * 60000 + secs * 1000;
alarm.last = 0;
// If alarm is for tomorrow not today (eg, in the past), set day
if (alarm.t < getCurrentTime()) alarm.last = new Date().getDate();
return alarm;
}
menu["> Save"] = function () {
if (newAlarm) alarms.push(getAlarm());
else alarms[alarmIndex] = getAlarm();
require("Storage").write("qalarm.json", JSON.stringify(alarms));
eval(require("Storage").read("qalarmcheck.js"));
showMainMenu();
};
if (!newAlarm) {
menu["> Delete"] = function () {
alarms.splice(alarmIndex, 1);
require("Storage").write("qalarm.json", JSON.stringify(alarms));
eval(require("Storage").read("qalarmcheck.js"));
showMainMenu();
};
}
return E.showMenu(menu);
}
function showDaysMenu(alarmIndex, alarm) {
const menu = {
"": { title: alarm.msg ? alarm.msg : "Alarms" },
"< Back": () => showEditAlarmMenu(alarmIndex, alarm),
};
for (let i = 0; i < 7; i++) {
let dayOfWeek = require("locale").dow({ getDay: () => i });
menu[dayOfWeek] = {
value: alarm.daysOfWeek[i],
format: (v) => (v ? "Yes" : "No"),
onchange: (v) => (alarm.daysOfWeek[i] = v),
};
}
return E.showMenu(menu);
}
function showEditTimerMenu(timerIndex) {
var newAlarm = timerIndex < 0;
let alarm;
if (newAlarm) {
alarm = {
timer: 300,
on: true,
rp: false,
as: false,
hard: false,
};
} else {
alarm = alarms[timerIndex];
}
let hrs = 0 | (alarm.timer / 3600);
let mins = 0 | (alarm.timer / 60) % 60;
let secs = (0 | alarm.timer) % 60;
const menu = {
"": { title: "Timer" },
"< Back" : showMainMenu,
Hours: {
value: hrs,
onchange: function (v) {
if (v < 0) v = 23;
if (v > 23) v = 0;
hrs = v;
this.value = v;
}, // no arrow fn -> preserve 'this'
},
Minutes: {
value: mins,
onchange: function (v) {
if (v < 0) v = 59;
if (v > 59) v = 0;
mins = v;
this.value = v;
}, // no arrow fn -> preserve 'this'
},
Seconds: {
value: secs,
onchange: function (v) {
if (v < 0) v = 59;
if (v > 59) v = 0;
secs = v;
this.value = v;
}, // no arrow fn -> preserve 'this'
},
Enabled: {
value: alarm.on,
format: (v) => (v ? "On" : "Off"),
onchange: (v) => (alarm.on = v),
},
Hard: {
value: alarm.hard,
format: (v) => (v ? "On" : "Off"),
onchange: (v) => (alarm.hard = v),
},
};
function getTimer() {
alarm.timer = hrs * 3600 + mins * 60 + secs;
alarm.t = (getCurrentTime() + alarm.timer * 1000) % 86400000;
return alarm;
}
menu["> Save"] = function () {
if (newAlarm) alarms.push(getTimer());
else alarms[timerIndex] = getTimer();
require("Storage").write("qalarm.json", JSON.stringify(alarms));
eval(require("Storage").read("qalarmcheck.js"));
showMainMenu();
};
if (!newAlarm) {
menu["> Delete"] = function () {
alarms.splice(timerIndex, 1);
require("Storage").write("qalarm.json", JSON.stringify(alarms));
eval(require("Storage").read("qalarmcheck.js"));
showMainMenu();
};
}
return E.showMenu(menu);
}
showMainMenu();