1
0
Fork 0
BangleApps/apps/alarm/app.js

205 lines
5.3 KiB
JavaScript
Raw Normal View History

2020-02-12 10:48:14 +00:00
Bangle.loadWidgets();
Bangle.drawWidgets();
var alarms = require("Storage").readJSON("alarm.json",1)||[];
2020-02-12 10:48:14 +00:00
/*alarms = [
{ on : true,
2022-03-31 12:48:45 +00:00
t : 23400000, // Time of day since midnight in ms
2020-02-12 10:48:14 +00:00
msg : "Eat chocolate",
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
2022-03-31 12:48:45 +00:00
timer : 5*60*1000, // OPTIONAL - if set, this is a timer and it's the time in ms
2020-02-12 10:48:14 +00:00
}
];*/
2022-03-31 12:48:45 +00:00
// time in ms -> { hrs, mins }
function decodeTime(t) {
t = 0|t; // sanitise
var hrs = 0|(t/3600000);
return { hrs : hrs, mins : Math.round((t-hrs*3600000)/60000) };
}
// time in { hrs, mins } -> ms
function encodeTime(o) {
return o.hrs*3600000 + o.mins*60000;
2020-02-12 10:48:14 +00:00
}
2022-03-31 12:48:45 +00:00
function formatTime(t) {
var o = decodeTime(t);
return o.hrs+":"+("0"+o.mins).substr(-2);
2021-10-06 08:47:37 +00:00
}
2022-03-31 12:48:45 +00:00
function getCurrentTime() {
2020-02-12 10:48:14 +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() {
require("Storage").write("alarm.json",JSON.stringify(alarms));
eval(require("Storage").read("alarm.boot.js"));
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 = {
2021-10-06 08:47:37 +00:00
'': { 'title': 'Alarm/Timer' },
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-03-31 12:48:45 +00:00
var txt; // a leading space is currently required (JS error in Espruino 2v12)
if (alarm.timer)
txt = /*LANG*/"Timer"+" "+formatTime(alarm.timer);
else
txt = /*LANG*/"Alarm"+" "+formatTime(alarm.t);
if (alarm.rp) txt += "\0"+atob("FBaBAAABgAAcAAHn//////wAHsABzAAYwAAMAADAAAAAAwAAMAADGAAzgAN4AD//////54AAOAABgAA=");
menu[txt] = {
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() {
if (alarm.timer) editTimer(idx, alarm);
else editAlarm(idx, alarm);
}
2020-02-12 10:48:14 +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' },
'< Back' : () => onchange(dow)
};
for (var i = 0; i < 7; i++) (i => {
var dayOfWeek = require("locale").dow({ getDay: () => i });
menu[dayOfWeek] = {
value: !!(dow&(1<<i)),
format: v => v ? "Yes" : "No",
onchange: v => v ? dow |= 1<<i : dow &= ~(1<<i),
};
})(i);
E.showMenu(menu);
}
function editAlarm(alarmIndex, alarm) {
2020-02-12 10:48:14 +00:00
var newAlarm = alarmIndex<0;
2022-03-31 12:48:45 +00:00
var a = {
t : 12*3600000, // 12 o clock default
on : true,
rp : true,
as : false,
dow : 0b1111111,
last : 0
2020-02-12 10:48:14 +00:00
}
2022-03-31 12:48:45 +00:00
if (!newAlarm) Object.assign(a, alarms[alarmIndex]);
if (alarm) Object.assign(a,alarm);
var t = decodeTime(a.t);
2020-02-12 10:48:14 +00:00
const menu = {
2021-12-15 10:11:02 +00:00
'': { 'title': /*LANG*/'Alarm' },
2022-03-31 12:48:45 +00:00
'< Back' : () => 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,
2020-02-12 10:48:14 +00:00
format: v=>v?"On":"Off",
2022-03-31 12:48:45 +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,
2020-02-12 10:48:14 +00:00
format: v=>v?"Yes":"No",
2022-03-31 12:48:45 +00:00
onchange: v=>a.rp=v
},
/*LANG*/'Days': {
value: "SMTWTFS".split("").map((d,n)=>a.dow&(1<<n)?d:".").join(""),
onchange: () => editDOW(a.dow, d=>{a.dow=d;editAlarm(alarmIndex,a)})
2020-06-01 17:12:14 +00:00
},
2021-12-15 10:11:02 +00:00
/*LANG*/'Auto snooze': {
2022-03-31 12:48:45 +00:00
value: a.as,
2020-06-01 17:12:14 +00:00
format: v=>v?"Yes":"No",
2022-03-31 12:48:45 +00:00
onchange: v=>a.as=v
2020-02-12 10:48:14 +00:00
}
};
2022-03-31 12:48:45 +00:00
menu[/*LANG*/"Save"] = function() {
a.t = encodeTime(t);
if (a.t < getCurrentTime())
a.day = (new Date()).getDate();
if (newAlarm) alarms.push(a);
else alarms[alarmIndex] = a;
saveAndReload();
showMainMenu();
};
if (!newAlarm) {
2022-03-31 12:48:45 +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();
};
}
return E.showMenu(menu);
}
2022-03-31 12:48:45 +00:00
function editTimer(alarmIndex, alarm) {
2021-10-06 08:47:37 +00:00
var newAlarm = alarmIndex<0;
2022-03-31 12:48:45 +00:00
var a = {
timer : 5*60*1000, // 5 minutes
on : true,
rp : false,
as : false,
dow : 0b1111111,
last : 0
2021-10-06 08:47:37 +00:00
}
2022-03-31 12:48:45 +00:00
if (!newAlarm) Object.assign(a, alarms[alarmIndex]);
if (alarm) Object.assign(a,alarm);
var t = decodeTime(a.timer);
2021-10-06 08:47:37 +00:00
const menu = {
2021-12-15 10:11:02 +00:00
'': { 'title': /*LANG*/'Timer' },
2022-03-31 12:48:45 +00:00
'< Back' : () => 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,
format: v=>v?"On":"Off",
onchange: v=>a.on=v
2021-10-06 08:47:37 +00:00
}
};
2022-03-31 12:48:45 +00:00
menu[/*LANG*/"Save"] = function() {
a.timer = encodeTime(t);
a.hr = getCurrentTime() + a.timer;
if (newAlarm) alarms.push(a);
else alarms[alarmIndex] = a;
saveAndReload();
2021-10-06 08:47:37 +00:00
showMainMenu();
};
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);
}
2020-02-28 15:34:31 +00:00
showMainMenu();