2020-02-12 10:48:14 +00:00
|
|
|
Bangle.loadWidgets();
|
|
|
|
Bangle.drawWidgets();
|
|
|
|
|
2022-04-04 15:58:17 +00:00
|
|
|
// An array of alarm objects (see sched/README.md)
|
2022-05-03 19:34:03 +00:00
|
|
|
var alarms = require("sched").getAlarms();
|
|
|
|
|
|
|
|
// 0 = Sunday
|
|
|
|
// 1 = Monday
|
|
|
|
var firstDayOfWeek = (require("Storage").readJSON("setting.json", true) || {}).firstDayOfWeek || 0;
|
2020-02-12 10:48:14 +00:00
|
|
|
|
2022-03-31 12:48:45 +00:00
|
|
|
function getCurrentTime() {
|
2022-05-03 19:34:03 +00:00
|
|
|
var time = new Date();
|
2022-03-31 12:48:45 +00:00
|
|
|
return (
|
|
|
|
time.getHours() * 3600000 +
|
|
|
|
time.getMinutes() * 60000 +
|
|
|
|
time.getSeconds() * 1000
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function saveAndReload() {
|
2022-05-03 19:34:03 +00:00
|
|
|
// Before saving revert the dow to the standard format
|
|
|
|
alarms.forEach(a => a.dow = handleFirstDayOfWeek(a.dow, firstDayOfWeek));
|
|
|
|
|
2022-04-04 15:58:17 +00:00
|
|
|
require("sched").setAlarms(alarms);
|
2022-04-04 14:49:45 +00:00
|
|
|
require("sched").reload();
|
2020-02-12 10:48:14 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function showMainMenu() {
|
2022-03-31 12:48:45 +00:00
|
|
|
// Timer img "\0"+atob("DhKBAP////MDDAwwMGGBzgPwB4AeAPwHOBhgwMMzDez////w")
|
|
|
|
// Alarm img "\0"+atob("FBSBAABgA4YcMPDGP8Zn/mx/48//PP/zD/8A//AP/wD/8A//AP/wH/+D//w//8AAAADwAAYA")
|
2020-02-12 10:48:14 +00:00
|
|
|
const menu = {
|
2022-04-20 12:18:11 +00:00
|
|
|
'': { 'title': /*LANG*/'Alarms&Timers' },
|
2022-05-03 19:34:03 +00:00
|
|
|
/*LANG*/'< Back': () => { load(); },
|
|
|
|
/*LANG*/'New Alarm': () => editAlarm(-1),
|
|
|
|
/*LANG*/'New Timer': () => editTimer(-1)
|
2020-02-12 10:48:14 +00:00
|
|
|
};
|
2022-05-03 19:34:03 +00:00
|
|
|
alarms.forEach((alarm, idx) => {
|
|
|
|
alarm.dow = handleFirstDayOfWeek(alarm.dow, firstDayOfWeek);
|
|
|
|
|
|
|
|
var type, txt; // a leading space is currently required (JS error in Espruino 2v12)
|
2022-04-07 13:21:36 +00:00
|
|
|
if (alarm.timer) {
|
|
|
|
type = /*LANG*/"Timer";
|
2022-05-03 19:34:03 +00:00
|
|
|
txt = " " + require("sched").formatTime(alarm.timer);
|
2022-04-07 13:21:36 +00:00
|
|
|
} else {
|
|
|
|
type = /*LANG*/"Alarm";
|
2022-05-03 19:34:03 +00:00
|
|
|
txt = " " + require("sched").formatTime(alarm.t);
|
2022-04-07 13:21:36 +00:00
|
|
|
}
|
2022-05-03 19:34:03 +00:00
|
|
|
if (alarm.rp) txt += "\0" + atob("FBaBAAABgAAcAAHn//////wAHsABzAAYwAAMAADAAAAAAwAAMAADGAAzgAN4AD//////54AAOAABgAA=");
|
2022-04-07 13:21:36 +00:00
|
|
|
// rename duplicate alarms
|
2022-05-03 19:34:03 +00:00
|
|
|
if (menu[type + txt]) {
|
2022-04-07 13:21:36 +00:00
|
|
|
var n = 2;
|
2022-05-03 19:34:03 +00:00
|
|
|
while (menu[type + " " + n + txt]) n++;
|
|
|
|
txt = type + " " + n + txt;
|
|
|
|
} else txt = type + txt;
|
2022-04-07 13:21:36 +00:00
|
|
|
// add to menu
|
2022-03-31 12:48:45 +00:00
|
|
|
menu[txt] = {
|
2022-05-03 19:34:03 +00:00
|
|
|
value: "\0" + atob(alarm.on ? "EhKBAH//v/////////////5//x//j//H+eP+Mf/A//h//z//////////3//g" : "EhKBAH//v//8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA8AA///3//g"),
|
|
|
|
onchange: function () {
|
2022-04-28 00:11:08 +00:00
|
|
|
setTimeout(alarm.timer ? editTimer : editAlarm, 10, idx, alarm);
|
2022-03-31 12:48:45 +00:00
|
|
|
}
|
2020-02-12 10:48:14 +00:00
|
|
|
};
|
|
|
|
});
|
2022-04-25 13:23:18 +00:00
|
|
|
|
|
|
|
if (alarms.some(e => !e.on)) {
|
|
|
|
menu[/*LANG*/"Enable All"] = () => enableAll(true);
|
|
|
|
}
|
|
|
|
if (alarms.some(e => e.on)) {
|
|
|
|
menu[/*LANG*/"Disable All"] = () => enableAll(false);
|
|
|
|
}
|
|
|
|
if (alarms.length > 0) {
|
|
|
|
menu[/*LANG*/"Delete All"] = () => deleteAll();
|
|
|
|
}
|
|
|
|
|
2021-10-06 09:05:15 +00:00
|
|
|
if (WIDGETS["alarm"]) WIDGETS["alarm"].reload();
|
2020-02-12 10:48:14 +00:00
|
|
|
return E.showMenu(menu);
|
|
|
|
}
|
|
|
|
|
2022-03-31 12:48:45 +00:00
|
|
|
function editDOW(dow, onchange) {
|
|
|
|
const menu = {
|
|
|
|
'': { 'title': /*LANG*/'Days of Week' },
|
2022-05-03 19:34:03 +00:00
|
|
|
/*LANG*/'< Back': () => onchange(dow)
|
2022-03-31 12:48:45 +00:00
|
|
|
};
|
2022-05-04 08:34:34 +00:00
|
|
|
|
2022-05-04 08:42:27 +00:00
|
|
|
require("date_utils").dows(firstDayOfWeek).forEach((day, i) => {
|
2022-05-04 08:34:34 +00:00
|
|
|
menu[day] = {
|
2022-05-03 19:34:03 +00:00
|
|
|
value: !!(dow & (1 << (i + firstDayOfWeek))),
|
2022-04-28 07:28:57 +00:00
|
|
|
format: v => v ? /*LANG*/"Yes" : /*LANG*/"No",
|
2022-05-03 19:34:03 +00:00
|
|
|
onchange: v => v ? (dow |= 1 << (i + firstDayOfWeek)) : (dow &= ~(1 << (i + firstDayOfWeek)))
|
2022-03-31 12:48:45 +00:00
|
|
|
};
|
2022-05-04 08:42:27 +00:00
|
|
|
});
|
2022-05-04 08:34:34 +00:00
|
|
|
|
2022-03-31 12:48:45 +00:00
|
|
|
E.showMenu(menu);
|
|
|
|
}
|
|
|
|
|
|
|
|
function editAlarm(alarmIndex, alarm) {
|
2022-05-03 19:34:03 +00:00
|
|
|
var newAlarm = alarmIndex < 0;
|
|
|
|
var a = require("sched").newDefaultAlarm();
|
|
|
|
a.dow = handleFirstDayOfWeek(a.dow, firstDayOfWeek);
|
|
|
|
|
2022-03-31 12:48:45 +00:00
|
|
|
if (!newAlarm) Object.assign(a, alarms[alarmIndex]);
|
2022-05-03 19:34:03 +00:00
|
|
|
if (alarm) Object.assign(a, alarm);
|
|
|
|
var t = require("sched").decodeTime(a.t);
|
2022-03-31 12:48:45 +00:00
|
|
|
|
2020-02-12 10:48:14 +00:00
|
|
|
const menu = {
|
2021-12-15 10:11:02 +00:00
|
|
|
'': { 'title': /*LANG*/'Alarm' },
|
2022-04-25 13:24:05 +00:00
|
|
|
/*LANG*/'< Back': () => {
|
|
|
|
saveAlarm(newAlarm, alarmIndex, a, t);
|
|
|
|
showMainMenu();
|
|
|
|
},
|
2021-12-15 10:11:02 +00:00
|
|
|
/*LANG*/'Hours': {
|
2022-05-03 19:34:03 +00:00
|
|
|
value: t.hrs, min: 0, max: 23, wrap: true,
|
|
|
|
onchange: v => t.hrs = v
|
2020-02-12 10:48:14 +00:00
|
|
|
},
|
2021-12-15 10:11:02 +00:00
|
|
|
/*LANG*/'Minutes': {
|
2022-05-03 19:34:03 +00:00
|
|
|
value: t.mins, min: 0, max: 59, wrap: true,
|
|
|
|
onchange: v => t.mins = v
|
2020-02-12 10:48:14 +00:00
|
|
|
},
|
2021-12-15 10:11:02 +00:00
|
|
|
/*LANG*/'Enabled': {
|
2022-03-31 12:48:45 +00:00
|
|
|
value: a.on,
|
2022-04-28 07:28:57 +00:00
|
|
|
format: v => v ? /*LANG*/"On" : /*LANG*/"Off",
|
2022-05-03 19:34:03 +00:00
|
|
|
onchange: v => a.on = v
|
2020-02-12 10:48:14 +00:00
|
|
|
},
|
2021-12-15 10:11:02 +00:00
|
|
|
/*LANG*/'Repeat': {
|
2022-03-31 12:48:45 +00:00
|
|
|
value: a.rp,
|
2022-04-28 07:28:57 +00:00
|
|
|
format: v => v ? /*LANG*/"Yes" : /*LANG*/"No",
|
2022-04-20 12:18:11 +00:00
|
|
|
onchange: v => a.rp = v
|
2022-03-31 12:48:45 +00:00
|
|
|
},
|
|
|
|
/*LANG*/'Days': {
|
2022-05-03 19:34:03 +00:00
|
|
|
value: decodeDOW(a.dow),
|
2022-04-28 00:24:17 +00:00
|
|
|
onchange: () => setTimeout(editDOW, 100, a.dow, d => {
|
2022-04-21 09:15:49 +00:00
|
|
|
a.dow = d;
|
2022-04-24 19:36:17 +00:00
|
|
|
a.t = require("sched").encodeTime(t);
|
2022-04-21 09:15:49 +00:00
|
|
|
editAlarm(alarmIndex, a);
|
|
|
|
})
|
2020-06-01 17:12:14 +00:00
|
|
|
},
|
2022-05-03 19:34:03 +00:00
|
|
|
/*LANG*/'Vibrate': require("buzz_menu").pattern(a.vibrate, v => a.vibrate = v),
|
2022-04-20 12:18:11 +00:00
|
|
|
/*LANG*/'Auto Snooze': {
|
2022-03-31 12:48:45 +00:00
|
|
|
value: a.as,
|
2022-04-28 07:28:57 +00:00
|
|
|
format: v => v ? /*LANG*/"Yes" : /*LANG*/"No",
|
2022-04-20 12:18:11 +00:00
|
|
|
onchange: v => a.as = v
|
2020-02-12 10:48:14 +00:00
|
|
|
}
|
|
|
|
};
|
2022-04-25 13:24:05 +00:00
|
|
|
|
|
|
|
menu[/*LANG*/"Cancel"] = () => showMainMenu();
|
|
|
|
|
2020-04-08 08:35:38 +00:00
|
|
|
if (!newAlarm) {
|
2022-04-25 13:24:05 +00:00
|
|
|
menu[/*LANG*/"Delete"] = function () {
|
|
|
|
alarms.splice(alarmIndex, 1);
|
2022-03-31 12:48:45 +00:00
|
|
|
saveAndReload();
|
2020-02-12 10:48:14 +00:00
|
|
|
showMainMenu();
|
|
|
|
};
|
|
|
|
}
|
2022-04-25 13:24:05 +00:00
|
|
|
|
2020-02-12 10:48:14 +00:00
|
|
|
return E.showMenu(menu);
|
|
|
|
}
|
|
|
|
|
2022-04-25 13:24:05 +00:00
|
|
|
function saveAlarm(newAlarm, alarmIndex, a, t) {
|
|
|
|
a.t = require("sched").encodeTime(t);
|
|
|
|
a.last = (a.t < getCurrentTime()) ? (new Date()).getDate() : 0;
|
|
|
|
|
|
|
|
if (newAlarm) {
|
|
|
|
alarms.push(a);
|
|
|
|
} else {
|
|
|
|
alarms[alarmIndex] = a;
|
|
|
|
}
|
|
|
|
|
|
|
|
saveAndReload();
|
|
|
|
}
|
|
|
|
|
2022-03-31 12:48:45 +00:00
|
|
|
function editTimer(alarmIndex, alarm) {
|
2022-05-03 19:34:03 +00:00
|
|
|
var newAlarm = alarmIndex < 0;
|
|
|
|
var a = require("sched").newDefaultTimer();
|
2022-03-31 12:48:45 +00:00
|
|
|
if (!newAlarm) Object.assign(a, alarms[alarmIndex]);
|
2022-05-03 19:34:03 +00:00
|
|
|
if (alarm) Object.assign(a, alarm);
|
|
|
|
var t = require("sched").decodeTime(a.timer);
|
2022-03-31 12:48:45 +00:00
|
|
|
|
2021-10-06 08:47:37 +00:00
|
|
|
const menu = {
|
2021-12-15 10:11:02 +00:00
|
|
|
'': { 'title': /*LANG*/'Timer' },
|
2022-04-25 13:24:05 +00:00
|
|
|
/*LANG*/'< Back': () => {
|
|
|
|
saveTimer(newAlarm, alarmIndex, a, t);
|
|
|
|
showMainMenu();
|
|
|
|
},
|
2021-12-15 10:11:02 +00:00
|
|
|
/*LANG*/'Hours': {
|
2022-05-03 19:34:03 +00:00
|
|
|
value: t.hrs, min: 0, max: 23, wrap: true,
|
|
|
|
onchange: v => t.hrs = v
|
2021-10-06 08:47:37 +00:00
|
|
|
},
|
2021-12-15 10:11:02 +00:00
|
|
|
/*LANG*/'Minutes': {
|
2022-05-03 19:34:03 +00:00
|
|
|
value: t.mins, min: 0, max: 59, wrap: true,
|
|
|
|
onchange: v => t.mins = v
|
2021-10-06 08:47:37 +00:00
|
|
|
},
|
2021-12-15 10:11:02 +00:00
|
|
|
/*LANG*/'Enabled': {
|
2022-03-31 12:48:45 +00:00
|
|
|
value: a.on,
|
2022-04-28 07:28:57 +00:00
|
|
|
format: v => v ? /*LANG*/"On" : /*LANG*/"Off",
|
2022-04-20 12:18:11 +00:00
|
|
|
onchange: v => a.on = v
|
2022-04-01 12:27:37 +00:00
|
|
|
},
|
2022-05-03 19:34:03 +00:00
|
|
|
/*LANG*/'Vibrate': require("buzz_menu").pattern(a.vibrate, v => a.vibrate = v),
|
2021-10-06 08:47:37 +00:00
|
|
|
};
|
2022-04-25 13:24:05 +00:00
|
|
|
|
|
|
|
menu[/*LANG*/"Cancel"] = () => showMainMenu();
|
|
|
|
|
2021-10-06 08:47:37 +00:00
|
|
|
if (!newAlarm) {
|
2022-05-03 19:34:03 +00:00
|
|
|
menu[/*LANG*/"Delete"] = function () {
|
|
|
|
alarms.splice(alarmIndex, 1);
|
2022-03-31 12:48:45 +00:00
|
|
|
saveAndReload();
|
2021-10-06 08:47:37 +00:00
|
|
|
showMainMenu();
|
|
|
|
};
|
|
|
|
}
|
|
|
|
return E.showMenu(menu);
|
|
|
|
}
|
|
|
|
|
2022-04-25 13:24:05 +00:00
|
|
|
function saveTimer(newAlarm, alarmIndex, a, t) {
|
|
|
|
a.timer = require("sched").encodeTime(t);
|
|
|
|
a.t = getCurrentTime() + a.timer;
|
|
|
|
a.last = 0;
|
|
|
|
|
|
|
|
if (newAlarm) {
|
|
|
|
alarms.push(a);
|
|
|
|
} else {
|
|
|
|
alarms[alarmIndex] = a;
|
|
|
|
}
|
|
|
|
|
|
|
|
saveAndReload();
|
|
|
|
}
|
|
|
|
|
2022-05-03 19:34:03 +00:00
|
|
|
function handleFirstDayOfWeek(dow, firstDayOfWeek) {
|
|
|
|
if (firstDayOfWeek == 1) {
|
|
|
|
if ((dow & 1) == 1) {
|
|
|
|
// By default 1 = Sunday.
|
|
|
|
// Here the week starts on Monday and Sunday is ON so move Sunday to 128.
|
|
|
|
dow += 127;
|
|
|
|
} else if ((dow & 128) == 128) {
|
|
|
|
dow -= 127;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return dow;
|
|
|
|
}
|
|
|
|
|
|
|
|
function decodeDOW(dow) {
|
|
|
|
return require("date_utils")
|
|
|
|
.dows(firstDayOfWeek, 2)
|
|
|
|
.map((day, index) => dow & (1 << (index + firstDayOfWeek)) ? day : "_")
|
|
|
|
.join("");
|
|
|
|
}
|
|
|
|
|
2022-04-25 13:23:18 +00:00
|
|
|
function enableAll(on) {
|
|
|
|
E.showPrompt(/*LANG*/"Are you sure?", {
|
|
|
|
title: on ? /*LANG*/"Enable All" : /*LANG*/"Disable All"
|
|
|
|
}).then((confirm) => {
|
|
|
|
if (confirm) {
|
|
|
|
alarms.forEach(alarm => alarm.on = on);
|
|
|
|
saveAndReload();
|
|
|
|
}
|
|
|
|
|
|
|
|
showMainMenu();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function deleteAll() {
|
|
|
|
E.showPrompt(/*LANG*/"Are you sure?", {
|
|
|
|
title: /*LANG*/"Delete All"
|
|
|
|
}).then((confirm) => {
|
|
|
|
if (confirm) {
|
|
|
|
alarms = [];
|
|
|
|
saveAndReload();
|
|
|
|
}
|
|
|
|
|
|
|
|
showMainMenu();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2020-02-28 15:34:31 +00:00
|
|
|
showMainMenu();
|