update mtimer

master
Bryan 2024-06-13 07:48:51 -06:00
parent 92b704797d
commit 798cc2a044
1 changed files with 415 additions and 409 deletions

View File

@ -1,6 +1,6 @@
{ {
// Bangle.loadWidgets(); Bangle.loadWidgets();
// Bangle.drawWidgets(); require("widget_utils").hide();
const resetImg = require("heatshrink").decompress(atob("kkkwIJGgwCBhkP/4EB4f//gIB/8P+EA/+Ah4BB8EAvkA/EAgPgh4EBh4RCgFwDAUHAwIABnADCgPAAgUcBBY9BAYUOuAEC8YDChgkCgPDFoUcBA88EgUDwJUBgF4hwDBg8AJYICBJoUegE+BgPAgPwgJkC+CCCn//J4X/DgUAsCbFA==")); 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==")); const deleteImg = require("heatshrink").decompress(atob("mUywIROgP/8AGD//8AocwgYFDhkA4AFCBQMwAgMH/4ACwAjBAAQmBjAVCsEAgwFCBIMBwAFBBIQOBBIYYssEBwIYCjkA8AYCgeAuAYDuE4DAcOjgxDgPOGIk/GIkHwAYDgPgJQihBDAdzwAYDnFwDAcchwYDAgPADAUHgE4DARaBgyV1DBTzD/AIBAoRxBABgA=="));
@ -27,42 +27,6 @@
let numActiveAlarms = 0; let numActiveAlarms = 0;
let mode = "timer"; // "timer" or "alarm" 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); let t = (hms.h * 3600000) + (hms.m * 60000) + (hms.s * 1000);
if (hms.meridiem === "PM") { if (hms.meridiem === "PM") {
@ -102,6 +66,37 @@
} }
}; };
// 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 getCurrentTime = function() {
const time = new Date(); const time = new Date();
return (time.getHours() * 3600000) + (time.getMinutes() * 60000) + (time.getSeconds() * 1000); return (time.getHours() * 3600000) + (time.getMinutes() * 60000) + (time.getSeconds() * 1000);
@ -113,282 +108,6 @@
showScroller(s); 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; let alarm;
if (mode === "timer") { if (mode === "timer") {
@ -407,11 +126,70 @@
reMakeScroller(alarmScroller); reMakeScroller(alarmScroller);
showScroller(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) { const removeScroller = function(s) {
console.log("edit function, timer: " + timer); //if (mode === "timer") {
} stopRedraws();
//}
s.remove();
g.reset();
g.clearRect(Bangle.appRect);
};
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) { const drawTbMin = function(r) {
g.clearRect(r.x, r.y, r.x2, r.y2); g.clearRect(r.x, r.y, r.x2, r.y2);
@ -468,98 +246,51 @@
} }
}; };
const topBar = { const drawButton1 = function(r) {
minH: 24, const midX = (r.x + r.x2) / 2;
maxH: 54, const midY = (r.y + r.y2) / 2;
drawMin: (r) => drawTbMin(r), const halfImg = 25;
drawMax: (r) => drawTbMax(r), 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);
handler: (d, r) => topBarHandler(d, r), g.drawImage(deleteImg, midX - halfImg, midY - halfImg);
}; };
const timerScroller = new Scroller({ const drawButton2 = function(r) {
h: 75, c: timerIndexes.length, const midX = (r.x + r.x2) / 2;
draw: (i, r, d) => drawTimer(i, r, d), const midY = (r.y + r.y2) / 2;
drawEmpty: (r) => drawEmpty(r, "timer"), const halfImg = 16;
select: (i, r, x) => timerTouchHandler(i, r, x), 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);
button1: (i) => remove(i), g.drawImage(resetImg, midX - halfImg, midY - halfImg);
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 stopRedraws = function() { const drawEmpty = function(r, mode) {
if (intID) clearTimeout(intID); const midX = (r.x2 + r.x) / 2;
intID = undefined; 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) { const drawTimeUp = function(timer, r) {
stopRedraws(); const midY = r.y + (r.h / 2);
if ((mode === "timer" && timerIndexes.length > 0) || g.clearRect(r.x, r.y, r.x2, r.y2);
(mode === "alarm" && alarmIndexes.length > 0)) { g.setColor(0, 0.5, 0.5).fillRect({ x: r.x, y: r.y, x2: r.x2, y2: r.y2, r: 12 });
startRedraws(s); 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);
s.reload(); const time = getCurrentTime() - timer.t;
s.drawAll(); 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);
const removeScroller = function(s) { g.setFontAlign(-1, 1).setFont("Vector:27").drawString(timeStr.time, r.x + 6, r.y2 - 3);
//if (mode === "timer") { g.setBgColor(g.theme.bg).setColor(g.theme.fg);
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 dismissTimer = function(timer) {
stopBuzz();
timer.timer = timer.data.ot;
sched.setAlarms(alarms);
sched.reload();
}; };
const buzz = function() { const buzz = function() {
@ -591,6 +322,281 @@
return; return;
}; };
// 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); Bangle.on("timeup", timeup);
showScroller(timerScroller); showScroller(timerScroller);
} }