update mtimer
parent
92b704797d
commit
798cc2a044
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
// Bangle.loadWidgets();
|
||||
// Bangle.drawWidgets();
|
||||
Bangle.loadWidgets();
|
||||
require("widget_utils").hide();
|
||||
|
||||
const resetImg = require("heatshrink").decompress(atob("kkkwIJGgwCBhkP/4EB4f//gIB/8P+EA/+Ah4BB8EAvkA/EAgPgh4EBh4RCgFwDAUHAwIABnADCgPAAgUcBBY9BAYUOuAEC8YDChgkCgPDFoUcBA88EgUDwJUBgF4hwDBg8AJYICBJoUegE+BgPAgPwgJkC+CCCn//J4X/DgUAsCbFA=="));
|
||||
const deleteImg = require("heatshrink").decompress(atob("mUywIROgP/8AGD//8AocwgYFDhkA4AFCBQMwAgMH/4ACwAjBAAQmBjAVCsEAgwFCBIMBwAFBBIQOBBIYYssEBwIYCjkA8AYCgeAuAYDuE4DAcOjgxDgPOGIk/GIkHwAYDgPgJQihBDAdzwAYDnFwDAcchwYDAgPADAUHgE4DARaBgyV1DBTzD/AIBAoRxBABgA=="));
|
||||
|
|
@ -27,43 +27,7 @@
|
|||
let numActiveAlarms = 0;
|
||||
let mode = "timer"; // "timer" or "alarm"
|
||||
|
||||
const loadAlarmsAndTimers = function() {
|
||||
sched.reload();
|
||||
alarms = sched.getAlarms();
|
||||
timerIndexes = [];
|
||||
alarmIndexes = [];
|
||||
numActiveTimers = 0;
|
||||
numActiveAlarms = 0;
|
||||
if (alarms.length > 0) {
|
||||
for (let i = alarms.length - 1; i >= 0; i--) {
|
||||
if (alarms[i].appid === appId) {
|
||||
if (alarms[i].timer != undefined) {
|
||||
timerIndexes.push(i);
|
||||
if (alarms[i].on === true) numActiveTimers++;
|
||||
} else {
|
||||
alarmIndexes.push(i);
|
||||
if (alarms[i].on === true) numActiveAlarms++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
loadAlarmsAndTimers();
|
||||
|
||||
const saveAlarms = function() {
|
||||
sched.setAlarms(alarms);
|
||||
sched.reload();
|
||||
};
|
||||
|
||||
const getTimer = function(idx) {
|
||||
return alarms[timerIndexes[idx]];
|
||||
};
|
||||
|
||||
const getAlarm = function(idx) {
|
||||
return alarms[alarmIndexes[idx]];
|
||||
};
|
||||
|
||||
const hms2ms = function(hms) {
|
||||
const hms2ms = function(hms) {
|
||||
let t = (hms.h * 3600000) + (hms.m * 60000) + (hms.s * 1000);
|
||||
if (hms.meridiem === "PM") {
|
||||
t += (3600000 * 12); // add 12 hours if we are p.m.
|
||||
|
|
@ -102,7 +66,38 @@
|
|||
}
|
||||
};
|
||||
|
||||
const getCurrentTime = function() {
|
||||
// Common:
|
||||
const loadAlarmsAndTimers = function() {
|
||||
sched.reload();
|
||||
alarms = sched.getAlarms();
|
||||
timerIndexes = [];
|
||||
alarmIndexes = [];
|
||||
numActiveTimers = 0;
|
||||
numActiveAlarms = 0;
|
||||
if (alarms.length > 0) {
|
||||
for (let i = alarms.length - 1; i >= 0; i--) {
|
||||
if (alarms[i].appid === appId) {
|
||||
if (alarms[i].timer != undefined) {
|
||||
timerIndexes.push(i);
|
||||
if (alarms[i].on === true) numActiveTimers++;
|
||||
} else {
|
||||
alarmIndexes.push(i);
|
||||
if (alarms[i].on === true) numActiveAlarms++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
loadAlarmsAndTimers();
|
||||
|
||||
const saveAlarms = function() {
|
||||
sched.setAlarms(alarms);
|
||||
sched.reload();
|
||||
};
|
||||
|
||||
|
||||
|
||||
const getCurrentTime = function() {
|
||||
const time = new Date();
|
||||
return (time.getHours() * 3600000) + (time.getMinutes() * 60000) + (time.getSeconds() * 1000);
|
||||
};
|
||||
|
|
@ -113,283 +108,7 @@
|
|||
showScroller(s);
|
||||
};
|
||||
|
||||
const timerTimePicker = new TimePicker({
|
||||
meridiem: undefined,
|
||||
start: (hms) => setTimer(hms2ms(hms)),
|
||||
cancel: cancel,
|
||||
});
|
||||
|
||||
const newAlarmTimePicker = new TimePicker({
|
||||
meridiem: "AM",
|
||||
start: (hms) => setAlarm(hms2ms(hms)),
|
||||
cancel: cancel
|
||||
});
|
||||
|
||||
const changeAlarmTime = function(alarm) {
|
||||
const hms = ms2hms(alarm.t, "alarm");
|
||||
const tp = new TimePicker({
|
||||
meridiem: hms.meridiem,
|
||||
h: hms.h,
|
||||
m: hms.m,
|
||||
s: 0,
|
||||
start: (hms) => {
|
||||
alarm.t = hms2ms(hms);
|
||||
saveAlarms();
|
||||
loadAlarmsAndTimers();
|
||||
g.clearRect(Bangle.appRect);
|
||||
//showScroller(alarmScroller);
|
||||
showDowPicker(alarm);
|
||||
},
|
||||
cancel: cancel
|
||||
})
|
||||
tp.draw();
|
||||
};
|
||||
|
||||
const drawButton1 = function(r) {
|
||||
const midX = (r.x + r.x2) / 2;
|
||||
const midY = (r.y + r.y2) / 2;
|
||||
const halfImg = 25;
|
||||
g.setColor(1, 0, 0).fillRect({ x: r.x, y: r.y + 4, x2: r.x2 - 3, y2: r.y2 - 3}).setColor(g.theme.fg);
|
||||
g.drawImage(deleteImg, midX - halfImg, midY - halfImg);
|
||||
};
|
||||
|
||||
const drawButton2 = function(r) {
|
||||
const midX = (r.x + r.x2) / 2;
|
||||
const midY = (r.y + r.y2) / 2;
|
||||
const halfImg = 16;
|
||||
g.setColor(0, 0, 1).fillRect({ x: r.x, y: r.y + 4, x2: r.x2 - 3, y2: r.y2 - 3}).setColor(g.theme.fg);
|
||||
g.drawImage(resetImg, midX - halfImg, midY - halfImg);
|
||||
};
|
||||
|
||||
const drawTimerStart = function(x, y) {
|
||||
g.drawImage(playImg, x - 24, y - 24);
|
||||
};
|
||||
|
||||
const drawTimerPause = function(x, y) {
|
||||
g.drawImage(pauseImg, x - 24, y - 24);
|
||||
};
|
||||
|
||||
const drawTimerProgress = function(value, maxValue, x, y) {
|
||||
const len = 115;
|
||||
const t = 16;
|
||||
const x2 = x + len;
|
||||
const y2 = y + t;
|
||||
const progLen = ((len - 4) / maxValue) * value;
|
||||
g.setColor(0, 1, 1).fillRect({ x: x, y: y, x2: x2, y2: y2, r: t });
|
||||
g.setColor(g.theme.bg).fillRect({ x: x + 2, y: y + 2, x2: x2 - 2, y2: y2 - 2, r: t - 2 }).setColor(g.theme.fg);
|
||||
g.setColor(0, 1, 1).fillRect({ x: x + 4, y: y + 4, x2: x + progLen, y2: y2 - 4, r: t - 4 });
|
||||
g.setColor(g.theme.fg);
|
||||
};
|
||||
|
||||
const drawTimer = function(idx, r, dragging) {
|
||||
const timer = getTimer(idx);
|
||||
if (timer.timer === 0) {
|
||||
drawTimeUp(timer, r);
|
||||
return;
|
||||
}
|
||||
const midY = r.y + (r.h / 2);
|
||||
g.clearRect(r.x, r.y, r.x2, r.y2);
|
||||
g.setColor(g.theme.bg2).fillRect(r.x + 3, r.y + 4, r.x2 - 3, r.y2 - 3).setColor(g.theme.fg);
|
||||
let time;
|
||||
if (timer.on) {
|
||||
drawTimerPause(r.x2 - 25, midY);
|
||||
time = sched.getTimeToAlarm(timer);
|
||||
} else {
|
||||
drawTimerStart(r.x2 - 25, midY);
|
||||
time = timer.timer;
|
||||
}
|
||||
const str = ms2String(time, "timer");
|
||||
g.setColor(0, 0, 1);
|
||||
drawTimerProgress(time, timer.data.ot, r.x + 4, r.y2 - 30);
|
||||
g.setColor(g.theme.fg);
|
||||
g.setFontAlign(-1, -1).setFont("Vector:27").drawString(str.time, r.x + 4, r.y + 10);
|
||||
};
|
||||
|
||||
const drawAlarm = function(idx, r, dragging) {
|
||||
const alarm = getAlarm(idx);
|
||||
g.setColor(g.theme.bg2).fillRect(r.x + 3, r.y + 4, r.x2 - 3, r.y2 - 3).setColor(g.theme.fg);
|
||||
|
||||
let timeToAlarm;
|
||||
if (alarm.on) {
|
||||
g.setColor(0, 1, 0.5).drawImage(alarmOnImg, r.x2 - 50, r.y + 5).setColor(-1);
|
||||
timeToAlarm = sched.getTimeToAlarm(alarm);
|
||||
} else {
|
||||
g.setColor(0.5, 0.5, 0.5).drawImage(alarmOffImg, r.x2 - 50, r.y + 5).setColor(-1);
|
||||
timeToAlarm = 0;
|
||||
}
|
||||
const timeStr = ms2String(alarm.t, "alarm");
|
||||
g.setColor(g.theme.fg).setFontAlign(-1, 1).setFont("Vector:35");
|
||||
const sw = g.stringWidth(timeStr.time);
|
||||
g.drawString(timeStr.time, r.x + 4, r.y + 40);
|
||||
g.setFont("Vector:18").drawString(timeStr.meridiem, r.x + 4 + sw, r.y + 35);
|
||||
if (!dragging) {
|
||||
const timeToAlarmStr = timeToAlarm > 0 ? "In " + ms2String(timeToAlarm, "timeto", false).time : "";
|
||||
g.setFont("Vector:20");
|
||||
g.drawString(timeToAlarmStr, r.x + 4, r.y + 55);
|
||||
if (alarm.rp) {
|
||||
const dow = ["S", "M", "T", "W", "T", "F", "S"];
|
||||
g.setFontAlign(0, 1);
|
||||
g.setColor(-1);
|
||||
for (let i = 0, x = 13; i <= 6; i++, x += 25) {
|
||||
if ((alarm.dow >> i) & 1) { // check bit
|
||||
g.setColor(-1);
|
||||
} else {
|
||||
g.setColor(0.25, 0.5, 0.5);
|
||||
}
|
||||
g.drawString(dow[i], r.x + x, r.y2-5);
|
||||
}
|
||||
}
|
||||
}
|
||||
g.setBgColor(g.theme.bg).setColor(g.theme.fg);
|
||||
};
|
||||
|
||||
const drawEmpty = function(r, mode) {
|
||||
const midX = (r.x2 + r.x) / 2;
|
||||
const midY = (r.y2 + r.y) / 2;
|
||||
g.setColor(0.25, 0.25, 0.25);
|
||||
// g.setFontAlign(0, 0).setFont("Vector:80");
|
||||
// g.drawString("o", midX, midY);
|
||||
// g.drawString("/", midX, midY);
|
||||
// g.drawImage(nullImg, midX, midY);
|
||||
g.setColor(-1);
|
||||
g.drawCircle(midX, midY - 20, 30);
|
||||
g.drawLine(midX + 30, midY - 50, midX - 30, midY + 10);
|
||||
let str;
|
||||
if (mode === "timer") str = "No Timers";
|
||||
else if (mode === "alarm") str = "No Alarms";
|
||||
g.setColor(0.5, 0.5, 0.5).setFont("Vector:20").drawString(str, midX, r.y2 - 30);
|
||||
}
|
||||
|
||||
const drawTimeUp = function(timer, r) {
|
||||
const midY = r.y + (r.h / 2);
|
||||
g.clearRect(r.x, r.y, r.x2, r.y2);
|
||||
g.setColor(0, 0.5, 0.5).fillRect({ x: r.x, y: r.y, x2: r.x2, y2: r.y2, r: 12 });
|
||||
g.setColor(g.theme.bg).fillRect({ x: r.x + 5, y: r.y + 6, x2: r.x2 - 5, y2: r.y2 - 6, r: 7 }).setColor(g.theme.fg);
|
||||
g.drawImage(okImg, r.x2 - 51, midY - 24);
|
||||
const time = getCurrentTime() - timer.t;
|
||||
const timeStr = ms2String(time, "timer");
|
||||
const timerStr = ms2String(timer.data.ot, "timer");
|
||||
g.setFontAlign(-1, -1).setFont("Vector:20").drawString(timerStr.time, r.x + 6, r.y + 7);
|
||||
g.setFontAlign(-1, 1).setFont("Vector:27").drawString(timeStr.time, r.x + 6, r.y2 - 3);
|
||||
g.setBgColor(g.theme.bg).setColor(g.theme.fg);
|
||||
};
|
||||
|
||||
const playPauseTimer = function(timer) {
|
||||
if (timer.on) {
|
||||
changeTimerTime(timer);
|
||||
timer.on = false;
|
||||
numActiveTimers--;
|
||||
} else {
|
||||
changeTimerTime(timer);
|
||||
timer.on = true;
|
||||
numActiveTimers++;
|
||||
}
|
||||
saveAlarms();
|
||||
showScroller(timerScroller);
|
||||
};
|
||||
|
||||
const changeTimerTime = function(timer, newTime) {
|
||||
const currentTime = getCurrentTime();
|
||||
const timerTime = sched.getTimeToAlarm(timer);
|
||||
if (timerTime) {
|
||||
timer.timer = newTime === undefined ? timerTime : newTime;
|
||||
}
|
||||
timer.t = (currentTime + timer.timer) % 86400000;
|
||||
};
|
||||
|
||||
const timerTouchHandler = function(idx, r, x) {
|
||||
const timer = getTimer(idx);
|
||||
if (x > r.x2 - 40) {
|
||||
if (timer.timer === 0) dismissTimer(timer);
|
||||
else playPauseTimer(timer);
|
||||
}
|
||||
if (timer.on === false) {
|
||||
if (x < r.x + 40) {
|
||||
editTimer(timer);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const showDowPicker = function(alarm) {
|
||||
dowPicker(alarm, () => {
|
||||
saveAlarms();
|
||||
loadAlarmsAndTimers();
|
||||
g.clearRect(Bangle.appRect);
|
||||
showScroller(alarmScroller);
|
||||
},
|
||||
() => changeAlarmTime(alarm)
|
||||
)
|
||||
}
|
||||
|
||||
const alarmTouchHandler = function(idx, r, x) {
|
||||
if (x < r.x2 - 40) {
|
||||
stopRedraws();
|
||||
Bangle.setUI();
|
||||
removeScroller(alarmScroller);
|
||||
showDowPicker(alarms[alarmIndexes[idx]])
|
||||
} else if (x > r.x2 - 40) {
|
||||
alarms[alarmIndexes[idx]].on = !alarms[alarmIndexes[idx]].on;
|
||||
saveAlarms();
|
||||
loadAlarmsAndTimers();
|
||||
showScroller(alarmScroller);
|
||||
}
|
||||
}
|
||||
|
||||
const setAlarm = function(t) {
|
||||
const id = Math.round(Date.now());
|
||||
sched.setAlarm(id, {
|
||||
appid: appId, t: t, on: true, rp: false, del: false,
|
||||
dow: 0b1111111,
|
||||
as: settings.defaultAutoSnooze,
|
||||
vibrate: settings.defaultAlarmPattern,
|
||||
last: 0,
|
||||
js: `try {
|
||||
if (__FILE__ === 'mtimer.app.js') {
|
||||
Bangle.emit("timeup");
|
||||
} else {
|
||||
load("sched.js");
|
||||
}
|
||||
} catch {
|
||||
load("sched.js");
|
||||
}`
|
||||
}); //ot: original time
|
||||
loadAlarmsAndTimers();
|
||||
reMakeScroller(alarmScroller);
|
||||
showScroller(alarmScroller);
|
||||
};
|
||||
|
||||
const setTimer = function(t) {
|
||||
if (t > 1000) { // don't make timers less than 1 second
|
||||
const id = Math.round(Date.now());
|
||||
sched.setAlarm(id, {
|
||||
appid: appId, timer: t, on: true,
|
||||
del: settings.defaultDeleteExpiredTimers,
|
||||
rp: false, as: false, dow: 0b1111111, last: 0,
|
||||
data: { ot: t },
|
||||
js: `try {
|
||||
if (__FILE__ === 'mtimer.app.js') {
|
||||
Bangle.emit("timeup");
|
||||
} else {
|
||||
load("sched.js");
|
||||
}
|
||||
} catch {
|
||||
load("sched.js");
|
||||
}`
|
||||
}); //ot: original time
|
||||
}
|
||||
loadAlarmsAndTimers();
|
||||
reMakeScroller(timerScroller);
|
||||
showScroller(timerScroller);
|
||||
}
|
||||
|
||||
const resetTimer = function(timer) {
|
||||
changeTimerTime(timer, timer.data.ot);
|
||||
if (timer.on) playPauseTimer(timer);
|
||||
saveAlarms();
|
||||
showScroller(timerScroller);
|
||||
}
|
||||
|
||||
const remove = function(idx) {
|
||||
const remove = function(idx) {
|
||||
let alarm;
|
||||
if (mode === "timer") {
|
||||
removeScroller(timerScroller);
|
||||
|
|
@ -407,13 +126,72 @@
|
|||
reMakeScroller(alarmScroller);
|
||||
showScroller(alarmScroller);
|
||||
}
|
||||
};
|
||||
|
||||
const timeup = function() {
|
||||
currentTime = getCurrentTime();
|
||||
for (let i = 0; i < timerIndexes.length; i++) {
|
||||
timer = getTimer(i);
|
||||
if (timer.on && timer.t <= currentTime) {
|
||||
//timer.on = false;
|
||||
timer.timer = 0;
|
||||
timer.on = false;
|
||||
s.scrollToCenter(i + 1);
|
||||
buzz();
|
||||
}
|
||||
}
|
||||
sched.setAlarms(alarms);
|
||||
sched.reload();
|
||||
};
|
||||
|
||||
const startRedraws = function(s) {
|
||||
if (intID) clearTimeout(intID);
|
||||
const redraw = function() {
|
||||
g.clearRect(Bangle.appRect);
|
||||
s.drawAll();
|
||||
intID = setTimeout(redraw, 1000);
|
||||
}
|
||||
redraw();
|
||||
};
|
||||
|
||||
const stopRedraws = function() {
|
||||
if (intID) clearTimeout(intID);
|
||||
intID = undefined;
|
||||
};
|
||||
|
||||
const showScroller = function(s) {
|
||||
stopRedraws();
|
||||
if ((mode === "timer" && timerIndexes.length > 0) ||
|
||||
(mode === "alarm" && alarmIndexes.length > 0)) {
|
||||
startRedraws(s);
|
||||
}
|
||||
s.reload();
|
||||
s.drawAll();
|
||||
}
|
||||
|
||||
const editTimer = function(timer) {
|
||||
console.log("edit function, timer: " + timer);
|
||||
}
|
||||
const removeScroller = function(s) {
|
||||
//if (mode === "timer") {
|
||||
stopRedraws();
|
||||
//}
|
||||
s.remove();
|
||||
g.reset();
|
||||
g.clearRect(Bangle.appRect);
|
||||
};
|
||||
|
||||
const drawTbMin = function(r) {
|
||||
const reMakeScroller = function(s) {
|
||||
s.c = mode === "timer" ? timerIndexes.length : alarmIndexes.length;
|
||||
s.reload();
|
||||
};
|
||||
|
||||
const topBar = {
|
||||
minH: 24,
|
||||
maxH: 54,
|
||||
drawMin: (r) => drawTbMin(r),
|
||||
drawMax: (r) => drawTbMax(r),
|
||||
handler: (d, r) => topBarHandler(d, r),
|
||||
};
|
||||
|
||||
const drawTbMin = function(r) {
|
||||
g.clearRect(r.x, r.y, r.x2, r.y2);
|
||||
const h = r.y2 - r.y;
|
||||
g.setFont("Vector:" + h).setFontAlign(-1, -1).drawString(mode === "timer" ? "Timers" : "Alarms");
|
||||
|
|
@ -468,101 +246,54 @@
|
|||
}
|
||||
};
|
||||
|
||||
const topBar = {
|
||||
minH: 24,
|
||||
maxH: 54,
|
||||
drawMin: (r) => drawTbMin(r),
|
||||
drawMax: (r) => drawTbMax(r),
|
||||
handler: (d, r) => topBarHandler(d, r),
|
||||
const drawButton1 = function(r) {
|
||||
const midX = (r.x + r.x2) / 2;
|
||||
const midY = (r.y + r.y2) / 2;
|
||||
const halfImg = 25;
|
||||
g.setColor(1, 0, 0).fillRect({ x: r.x, y: r.y + 4, x2: r.x2 - 3, y2: r.y2 - 3}).setColor(g.theme.fg);
|
||||
g.drawImage(deleteImg, midX - halfImg, midY - halfImg);
|
||||
};
|
||||
|
||||
const timerScroller = new Scroller({
|
||||
h: 75, c: timerIndexes.length,
|
||||
draw: (i, r, d) => drawTimer(i, r, d),
|
||||
drawEmpty: (r) => drawEmpty(r, "timer"),
|
||||
select: (i, r, x) => timerTouchHandler(i, r, x),
|
||||
button1: (i) => remove(i),
|
||||
button2: (i) => resetTimer(i),
|
||||
drawButton1: (r) => drawButton1(r),
|
||||
drawButton2: (r) => drawButton2(r),
|
||||
topBar: topBar,
|
||||
});
|
||||
|
||||
const alarmScroller = new Scroller({
|
||||
h: 95, c: alarmIndexes.length,
|
||||
draw: (i, r, d) => drawAlarm(i, r, d),
|
||||
drawEmpty: (r) => drawEmpty(r, "alarm"),
|
||||
select: (i, r, x) => alarmTouchHandler(i, r, x),
|
||||
button1: (i) => remove(i),
|
||||
button2: undefined,
|
||||
drawButton1: (r) => drawButton1(r),
|
||||
drawButton2: undefined,
|
||||
topBar: topBar,
|
||||
});
|
||||
|
||||
const reMakeScroller = function(s) {
|
||||
s.c = mode === "timer" ? timerIndexes.length : alarmIndexes.length;
|
||||
s.reload();
|
||||
}
|
||||
|
||||
const startRedraws = function(s) {
|
||||
if (intID) clearTimeout(intID);
|
||||
const redraw = function() {
|
||||
g.clearRect(Bangle.appRect);
|
||||
s.drawAll();
|
||||
intID = setTimeout(redraw, 1000);
|
||||
}
|
||||
redraw();
|
||||
const drawButton2 = function(r) {
|
||||
const midX = (r.x + r.x2) / 2;
|
||||
const midY = (r.y + r.y2) / 2;
|
||||
const halfImg = 16;
|
||||
g.setColor(0, 0, 1).fillRect({ x: r.x, y: r.y + 4, x2: r.x2 - 3, y2: r.y2 - 3}).setColor(g.theme.fg);
|
||||
g.drawImage(resetImg, midX - halfImg, midY - halfImg);
|
||||
};
|
||||
|
||||
const stopRedraws = function() {
|
||||
if (intID) clearTimeout(intID);
|
||||
intID = undefined;
|
||||
const drawEmpty = function(r, mode) {
|
||||
const midX = (r.x2 + r.x) / 2;
|
||||
const midY = (r.y2 + r.y) / 2;
|
||||
g.setColor(0.25, 0.25, 0.25);
|
||||
// g.setFontAlign(0, 0).setFont("Vector:80");
|
||||
// g.drawString("o", midX, midY);
|
||||
// g.drawString("/", midX, midY);
|
||||
// g.drawImage(nullImg, midX, midY);
|
||||
g.setColor(-1);
|
||||
g.drawCircle(midX, midY - 20, 30);
|
||||
g.drawLine(midX + 30, midY - 50, midX - 30, midY + 10);
|
||||
let str;
|
||||
if (mode === "timer") str = "No Timers";
|
||||
else if (mode === "alarm") str = "No Alarms";
|
||||
g.setColor(0.5, 0.5, 0.5).setFont("Vector:20").drawString(str, midX, r.y2 - 30);
|
||||
};
|
||||
|
||||
const showScroller = function(s) {
|
||||
stopRedraws();
|
||||
if ((mode === "timer" && timerIndexes.length > 0) ||
|
||||
(mode === "alarm" && alarmIndexes.length > 0)) {
|
||||
startRedraws(s);
|
||||
}
|
||||
s.reload();
|
||||
s.drawAll();
|
||||
}
|
||||
|
||||
const removeScroller = function(s) {
|
||||
//if (mode === "timer") {
|
||||
stopRedraws();
|
||||
//}
|
||||
s.remove();
|
||||
g.reset();
|
||||
g.clearRect(Bangle.appRect);
|
||||
}
|
||||
|
||||
const timeup = function() {
|
||||
currentTime = getCurrentTime();
|
||||
for (let i = 0; i < timerIndexes.length; i++) {
|
||||
timer = getTimer(i);
|
||||
if (timer.on && timer.t <= currentTime) {
|
||||
//timer.on = false;
|
||||
timer.timer = 0;
|
||||
timer.on = false;
|
||||
s.scrollToCenter(i + 1);
|
||||
buzz();
|
||||
}
|
||||
}
|
||||
sched.setAlarms(alarms);
|
||||
sched.reload();
|
||||
const drawTimeUp = function(timer, r) {
|
||||
const midY = r.y + (r.h / 2);
|
||||
g.clearRect(r.x, r.y, r.x2, r.y2);
|
||||
g.setColor(0, 0.5, 0.5).fillRect({ x: r.x, y: r.y, x2: r.x2, y2: r.y2, r: 12 });
|
||||
g.setColor(g.theme.bg).fillRect({ x: r.x + 5, y: r.y + 6, x2: r.x2 - 5, y2: r.y2 - 6, r: 7 }).setColor(g.theme.fg);
|
||||
g.drawImage(okImg, r.x2 - 51, midY - 24);
|
||||
const time = getCurrentTime() - timer.t;
|
||||
const timeStr = ms2String(time, "timer");
|
||||
const timerStr = ms2String(timer.data.ot, "timer");
|
||||
g.setFontAlign(-1, -1).setFont("Vector:20").drawString(timerStr.time, r.x + 6, r.y + 7);
|
||||
g.setFontAlign(-1, 1).setFont("Vector:27").drawString(timeStr.time, r.x + 6, r.y2 - 3);
|
||||
g.setBgColor(g.theme.bg).setColor(g.theme.fg);
|
||||
};
|
||||
|
||||
const dismissTimer = function(timer) {
|
||||
stopBuzz();
|
||||
timer.timer = timer.data.ot;
|
||||
sched.setAlarms(alarms);
|
||||
sched.reload();
|
||||
};
|
||||
|
||||
const buzz = function() {
|
||||
const buzz = function() {
|
||||
if (settings.unlockAtBuzz) Bangle.setLocked(false);
|
||||
const pattern = settings.defaultAlarmPattern;
|
||||
Bangle.buzzCount = settings.buzzCount;
|
||||
|
|
@ -591,6 +322,281 @@
|
|||
return;
|
||||
};
|
||||
|
||||
Bangle.on("timeup", timeup);
|
||||
// Timers:
|
||||
const getTimer = function(idx) {
|
||||
return alarms[timerIndexes[idx]];
|
||||
};
|
||||
|
||||
const timerTimePicker = new TimePicker({
|
||||
meridiem: undefined,
|
||||
start: (hms) => setTimer(hms2ms(hms)),
|
||||
cancel: cancel,
|
||||
});
|
||||
|
||||
const drawTimerStart = function(x, y) {
|
||||
g.drawImage(playImg, x - 24, y - 24);
|
||||
};
|
||||
|
||||
const drawTimerPause = function(x, y) {
|
||||
g.drawImage(pauseImg, x - 24, y - 24);
|
||||
};
|
||||
|
||||
const drawTimerProgress = function(value, maxValue, x, y) {
|
||||
const len = 115;
|
||||
const t = 16;
|
||||
const x2 = x + len;
|
||||
const y2 = y + t;
|
||||
const progLen = ((len - 4) / maxValue) * value;
|
||||
g.setColor(0, 1, 1).fillRect({ x: x, y: y, x2: x2, y2: y2, r: t });
|
||||
g.setColor(g.theme.bg).fillRect({ x: x + 2, y: y + 2, x2: x2 - 2, y2: y2 - 2, r: t - 2 }).setColor(g.theme.fg);
|
||||
g.setColor(0, 1, 1).fillRect({ x: x + 4, y: y + 4, x2: x + progLen, y2: y2 - 4, r: t - 4 });
|
||||
g.setColor(g.theme.fg);
|
||||
};
|
||||
|
||||
const drawTimer = function(idx, r, dragging) {
|
||||
const timer = getTimer(idx);
|
||||
if (timer.timer === 0) {
|
||||
drawTimeUp(timer, r);
|
||||
return;
|
||||
}
|
||||
const midY = r.y + (r.h / 2);
|
||||
g.clearRect(r.x, r.y, r.x2, r.y2);
|
||||
g.setColor(g.theme.bg2).fillRect(r.x + 3, r.y + 4, r.x2 - 3, r.y2 - 3).setColor(g.theme.fg);
|
||||
let time;
|
||||
if (timer.on) {
|
||||
drawTimerPause(r.x2 - 25, midY);
|
||||
time = sched.getTimeToAlarm(timer);
|
||||
} else {
|
||||
drawTimerStart(r.x2 - 25, midY);
|
||||
time = timer.timer;
|
||||
}
|
||||
const str = ms2String(time, "timer");
|
||||
g.setColor(0, 0, 1);
|
||||
drawTimerProgress(time, timer.data.ot, r.x + 4, r.y2 - 30);
|
||||
g.setColor(g.theme.fg);
|
||||
g.setFontAlign(-1, -1).setFont("Vector:27").drawString(str.time, r.x + 4, r.y + 10);
|
||||
};
|
||||
|
||||
const playPauseTimer = function(timer) {
|
||||
if (timer.on) {
|
||||
changeTimerTime(timer);
|
||||
timer.on = false;
|
||||
numActiveTimers--;
|
||||
} else {
|
||||
changeTimerTime(timer);
|
||||
timer.on = true;
|
||||
numActiveTimers++;
|
||||
}
|
||||
saveAlarms();
|
||||
showScroller(timerScroller);
|
||||
};
|
||||
|
||||
const changeTimerTime = function(timer, newTime) {
|
||||
const currentTime = getCurrentTime();
|
||||
const timerTime = sched.getTimeToAlarm(timer);
|
||||
if (timerTime) {
|
||||
timer.timer = newTime === undefined ? timerTime : newTime;
|
||||
}
|
||||
timer.t = (currentTime + timer.timer) % 86400000;
|
||||
};
|
||||
|
||||
const timerTouchHandler = function(idx, r, x) {
|
||||
const timer = getTimer(idx);
|
||||
if (x > r.x2 - 40) {
|
||||
if (timer.timer === 0) dismissTimer(timer);
|
||||
else playPauseTimer(timer);
|
||||
}
|
||||
if (timer.on === false) {
|
||||
if (x < r.x + 40) {
|
||||
editTimer(timer);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const setTimer = function(t) {
|
||||
if (t > 1000) { // don't make timers less than 1 second
|
||||
const id = Math.round(Date.now());
|
||||
sched.setAlarm(id, {
|
||||
appid: appId, timer: t, on: true,
|
||||
del: settings.defaultDeleteExpiredTimers,
|
||||
rp: false, as: false, dow: 0b1111111, last: 0,
|
||||
data: { ot: t },
|
||||
js: `try {
|
||||
if (__FILE__ === 'mtimer.app.js') {
|
||||
Bangle.emit("timeup");
|
||||
} else {
|
||||
load("sched.js");
|
||||
}
|
||||
} catch {
|
||||
load("sched.js");
|
||||
}`
|
||||
}); //ot: original time
|
||||
}
|
||||
loadAlarmsAndTimers();
|
||||
reMakeScroller(timerScroller);
|
||||
showScroller(timerScroller);
|
||||
};
|
||||
|
||||
const resetTimer = function(timer) {
|
||||
changeTimerTime(timer, timer.data.ot);
|
||||
if (timer.on) playPauseTimer(timer);
|
||||
saveAlarms();
|
||||
showScroller(timerScroller);
|
||||
};
|
||||
|
||||
const editTimer = function(timer) {
|
||||
console.log("edit function, timer: " + timer);
|
||||
};
|
||||
|
||||
const timerScroller = new Scroller({
|
||||
h: 75, c: timerIndexes.length,
|
||||
draw: (i, r, d) => drawTimer(i, r, d),
|
||||
drawEmpty: (r) => drawEmpty(r, "timer"),
|
||||
select: (i, r, x) => timerTouchHandler(i, r, x),
|
||||
button1: (i) => remove(i),
|
||||
button2: (i) => resetTimer(i),
|
||||
drawButton1: (r) => drawButton1(r),
|
||||
drawButton2: (r) => drawButton2(r),
|
||||
topBar: topBar,
|
||||
});
|
||||
|
||||
const dismissTimer = function(timer) {
|
||||
stopBuzz();
|
||||
timer.timer = timer.data.ot;
|
||||
sched.setAlarms(alarms);
|
||||
sched.reload();
|
||||
};
|
||||
|
||||
// Alarms:
|
||||
const getAlarm = function(idx) {
|
||||
return alarms[alarmIndexes[idx]];
|
||||
};
|
||||
|
||||
const newAlarmTimePicker = new TimePicker({
|
||||
meridiem: "AM",
|
||||
start: (hms) => setAlarm(hms2ms(hms)),
|
||||
cancel: cancel
|
||||
});
|
||||
|
||||
const changeAlarmTime = function(alarm) {
|
||||
const hms = ms2hms(alarm.t, "alarm");
|
||||
const tp = new TimePicker({
|
||||
meridiem: hms.meridiem,
|
||||
h: hms.h,
|
||||
m: hms.m,
|
||||
s: 0,
|
||||
start: (hms) => {
|
||||
alarm.t = hms2ms(hms);
|
||||
saveAlarms();
|
||||
loadAlarmsAndTimers();
|
||||
g.clearRect(Bangle.appRect);
|
||||
//showScroller(alarmScroller);
|
||||
showDowPicker(alarm);
|
||||
},
|
||||
cancel: cancel
|
||||
})
|
||||
tp.draw();
|
||||
};
|
||||
|
||||
const drawAlarm = function(idx, r, dragging) {
|
||||
const alarm = getAlarm(idx);
|
||||
g.setColor(g.theme.bg2).fillRect(r.x + 3, r.y + 4, r.x2 - 3, r.y2 - 3).setColor(g.theme.fg);
|
||||
|
||||
let timeToAlarm;
|
||||
if (alarm.on) {
|
||||
g.setColor(0, 1, 0.5).drawImage(alarmOnImg, r.x2 - 50, r.y + 5).setColor(-1);
|
||||
timeToAlarm = sched.getTimeToAlarm(alarm);
|
||||
} else {
|
||||
g.setColor(0.5, 0.5, 0.5).drawImage(alarmOffImg, r.x2 - 50, r.y + 5).setColor(-1);
|
||||
timeToAlarm = 0;
|
||||
}
|
||||
const timeStr = ms2String(alarm.t, "alarm");
|
||||
g.setColor(g.theme.fg).setFontAlign(-1, 1).setFont("Vector:35");
|
||||
const sw = g.stringWidth(timeStr.time);
|
||||
g.drawString(timeStr.time, r.x + 4, r.y + 40);
|
||||
g.setFont("Vector:18").drawString(timeStr.meridiem, r.x + 4 + sw, r.y + 35);
|
||||
if (!dragging) {
|
||||
const timeToAlarmStr = timeToAlarm > 0 ? "In " + ms2String(timeToAlarm, "timeto", false).time : "";
|
||||
g.setFont("Vector:20");
|
||||
g.drawString(timeToAlarmStr, r.x + 4, r.y + 55);
|
||||
if (alarm.rp) {
|
||||
const dow = ["S", "M", "T", "W", "T", "F", "S"];
|
||||
g.setFontAlign(0, 1);
|
||||
g.setColor(-1);
|
||||
for (let i = 0, x = 13; i <= 6; i++, x += 25) {
|
||||
if ((alarm.dow >> i) & 1) { // check bit
|
||||
g.setColor(-1);
|
||||
} else {
|
||||
g.setColor(0.25, 0.5, 0.5);
|
||||
}
|
||||
g.drawString(dow[i], r.x + x, r.y2-5);
|
||||
}
|
||||
}
|
||||
}
|
||||
g.setBgColor(g.theme.bg).setColor(g.theme.fg);
|
||||
};
|
||||
|
||||
const showDowPicker = function(alarm) {
|
||||
dowPicker(alarm, () => {
|
||||
saveAlarms();
|
||||
loadAlarmsAndTimers();
|
||||
g.clearRect(Bangle.appRect);
|
||||
showScroller(alarmScroller);
|
||||
},
|
||||
() => changeAlarmTime(alarm)
|
||||
)
|
||||
};
|
||||
|
||||
const alarmTouchHandler = function(idx, r, x) {
|
||||
if (x < r.x2 - 40) {
|
||||
stopRedraws();
|
||||
Bangle.setUI();
|
||||
removeScroller(alarmScroller);
|
||||
showDowPicker(alarms[alarmIndexes[idx]])
|
||||
} else if (x > r.x2 - 40) {
|
||||
alarms[alarmIndexes[idx]].on = !alarms[alarmIndexes[idx]].on;
|
||||
saveAlarms();
|
||||
loadAlarmsAndTimers();
|
||||
showScroller(alarmScroller);
|
||||
}
|
||||
};
|
||||
|
||||
const setAlarm = function(t) {
|
||||
const id = Math.round(Date.now());
|
||||
sched.setAlarm(id, {
|
||||
appid: appId, t: t, on: true, rp: false, del: false,
|
||||
dow: 0b1111111,
|
||||
as: settings.defaultAutoSnooze,
|
||||
vibrate: settings.defaultAlarmPattern,
|
||||
last: 0,
|
||||
js: `try {
|
||||
if (__FILE__ === 'mtimer.app.js') {
|
||||
Bangle.emit("timeup");
|
||||
} else {
|
||||
load("sched.js");
|
||||
}
|
||||
} catch {
|
||||
load("sched.js");
|
||||
}`
|
||||
}); //ot: original time
|
||||
loadAlarmsAndTimers();
|
||||
reMakeScroller(alarmScroller);
|
||||
showScroller(alarmScroller);
|
||||
};
|
||||
|
||||
const alarmScroller = new Scroller({
|
||||
h: 95, c: alarmIndexes.length,
|
||||
draw: (i, r, d) => drawAlarm(i, r, d),
|
||||
drawEmpty: (r) => drawEmpty(r, "alarm"),
|
||||
select: (i, r, x) => alarmTouchHandler(i, r, x),
|
||||
button1: (i) => remove(i),
|
||||
button2: undefined,
|
||||
drawButton1: (r) => drawButton1(r),
|
||||
drawButton2: undefined,
|
||||
topBar: topBar,
|
||||
});
|
||||
|
||||
// Start
|
||||
Bangle.on("timeup", timeup);
|
||||
showScroller(timerScroller);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue