mirror of https://github.com/espruino/BangleApps
272 lines
6.8 KiB
JavaScript
272 lines
6.8 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" },
|
|
"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["< Back"] = () => {
|
|
load();
|
|
};
|
|
|
|
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" },
|
|
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();
|
|
};
|
|
}
|
|
menu["< Back"] = 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" },
|
|
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();
|
|
};
|
|
}
|
|
menu["< Back"] = showMainMenu;
|
|
return E.showMenu(menu);
|
|
}
|
|
|
|
showMainMenu();
|