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-04-20 12:23:13 +00:00
|
|
|
let alarms = require("sched").getAlarms();
|
2020-02-12 10:48:14 +00:00
|
|
|
|
2022-03-31 12:48:45 +00:00
|
|
|
function getCurrentTime() {
|
2022-04-20 12:23:13 +00:00
|
|
|
let time = new Date();
|
2022-03-31 12:48:45 +00:00
|
|
|
return (
|
|
|
|
time.getHours() * 3600000 +
|
|
|
|
time.getMinutes() * 60000 +
|
|
|
|
time.getSeconds() * 1000
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function saveAndReload() {
|
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' },
|
2021-12-15 10:11:02 +00:00
|
|
|
/*LANG*/'< Back' : ()=>{load();},
|
|
|
|
/*LANG*/'New Alarm': ()=>editAlarm(-1),
|
|
|
|
/*LANG*/'New Timer': ()=>editTimer(-1)
|
2020-02-12 10:48:14 +00:00
|
|
|
};
|
|
|
|
alarms.forEach((alarm,idx)=>{
|
2022-04-07 13:21:36 +00:00
|
|
|
var type,txt; // a leading space is currently required (JS error in Espruino 2v12)
|
|
|
|
if (alarm.timer) {
|
|
|
|
type = /*LANG*/"Timer";
|
2022-04-20 17:32:23 +00:00
|
|
|
txt = " "+require("sched").formatTime(alarm.timer);
|
2022-04-07 13:21:36 +00:00
|
|
|
} else {
|
|
|
|
type = /*LANG*/"Alarm";
|
2022-04-20 17:32:23 +00:00
|
|
|
txt = " "+require("sched").formatTime(alarm.t);
|
2022-04-07 13:21:36 +00:00
|
|
|
}
|
2022-03-31 12:48:45 +00:00
|
|
|
if (alarm.rp) txt += "\0"+atob("FBaBAAABgAAcAAHn//////wAHsABzAAYwAAMAADAAAAAAwAAMAADGAAzgAN4AD//////54AAOAABgAA=");
|
2022-04-07 13:21:36 +00:00
|
|
|
// rename duplicate alarms
|
|
|
|
if (menu[type+txt]) {
|
|
|
|
var n = 2;
|
|
|
|
while (menu[type+" "+n+txt]) n++;
|
|
|
|
txt = type+" "+n+txt;
|
|
|
|
} else txt = type+txt;
|
|
|
|
// add to menu
|
2022-03-31 12:48:45 +00:00
|
|
|
menu[txt] = {
|
2022-04-28 00:11:08 +00:00
|
|
|
value : alarm.on,
|
2022-03-31 12:48:45 +00:00
|
|
|
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-04-20 12:18:11 +00:00
|
|
|
/*LANG*/'< Back' : () => onchange(dow)
|
2022-03-31 12:48:45 +00:00
|
|
|
};
|
2022-04-20 12:23:13 +00:00
|
|
|
for (let i = 0; i < 7; i++) (i => {
|
|
|
|
let dayOfWeek = require("locale").dow({ getDay: () => i });
|
2022-03-31 12:48:45 +00:00
|
|
|
menu[dayOfWeek] = {
|
|
|
|
value: !!(dow&(1<<i)),
|
|
|
|
onchange: v => v ? dow |= 1<<i : dow &= ~(1<<i),
|
|
|
|
};
|
|
|
|
})(i);
|
|
|
|
E.showMenu(menu);
|
|
|
|
}
|
|
|
|
|
|
|
|
function editAlarm(alarmIndex, alarm) {
|
2022-04-20 12:23:13 +00:00
|
|
|
let newAlarm = alarmIndex < 0;
|
|
|
|
let a = require("sched").newDefaultAlarm();
|
2022-03-31 12:48:45 +00:00
|
|
|
if (!newAlarm) Object.assign(a, alarms[alarmIndex]);
|
|
|
|
if (alarm) Object.assign(a,alarm);
|
2022-04-20 17:32:23 +00:00
|
|
|
let 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-03-31 12:48:45 +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-03-31 12:48:45 +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,
|
|
|
|
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-20 12:18:11 +00:00
|
|
|
onchange: v => a.rp = v
|
2022-03-31 12:48:45 +00:00
|
|
|
},
|
|
|
|
/*LANG*/'Days': {
|
|
|
|
value: "SMTWTFS".split("").map((d,n)=>a.dow&(1<<n)?d:".").join(""),
|
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-04-01 12:27:37 +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-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-04-20 12:23:13 +00:00
|
|
|
let newAlarm = alarmIndex < 0;
|
|
|
|
let a = require("sched").newDefaultTimer();
|
2022-03-31 12:48:45 +00:00
|
|
|
if (!newAlarm) Object.assign(a, alarms[alarmIndex]);
|
|
|
|
if (alarm) Object.assign(a,alarm);
|
2022-04-20 17:32:23 +00:00
|
|
|
let 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-03-31 12:48:45 +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-03-31 12:48:45 +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-20 12:18:11 +00:00
|
|
|
onchange: v => a.on = v
|
2022-04-01 12:27:37 +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-03-31 12:48:45 +00:00
|
|
|
menu[/*LANG*/"Delete"] = function() {
|
2021-10-06 08:47:37 +00:00
|
|
|
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-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();
|