mirror of https://github.com/espruino/BangleApps
154 lines
3.8 KiB
JavaScript
154 lines
3.8 KiB
JavaScript
// This file shows the alarm
|
|
|
|
function formatTime(t) {
|
|
let hrs = Math.floor(t / 3600000);
|
|
let mins = Math.round((t / 60000) % 60);
|
|
return hrs + ":" + ("0" + mins).substr(-2);
|
|
}
|
|
|
|
function getCurrentTime() {
|
|
let time = new Date();
|
|
return (
|
|
time.getHours() * 3600000 +
|
|
time.getMinutes() * 60000 +
|
|
time.getSeconds() * 1000
|
|
);
|
|
}
|
|
|
|
function getRandomInt(max) {
|
|
return Math.floor(Math.random() * Math.floor(max));
|
|
}
|
|
|
|
function getRandomFromRange(
|
|
lowerRangeMin,
|
|
lowerRangeMax,
|
|
higherRangeMin,
|
|
higherRangeMax
|
|
) {
|
|
let lowerRange = lowerRangeMax - lowerRangeMin;
|
|
let higherRange = higherRangeMax - higherRangeMin;
|
|
let fullRange = lowerRange + higherRange;
|
|
let randomNum = getRandomInt(fullRange);
|
|
if (randomNum <= lowerRangeMax - lowerRangeMin) {
|
|
return randomNum + lowerRangeMin;
|
|
} else {
|
|
return randomNum + (higherRangeMin - lowerRangeMax);
|
|
}
|
|
}
|
|
|
|
function showNumberPicker(currentGuess, randomNum) {
|
|
if (currentGuess == randomNum) {
|
|
E.showMessage("" + currentGuess + "\n PRESS ENTER", "Get to " + randomNum);
|
|
} else {
|
|
E.showMessage("" + currentGuess, "Get to " + randomNum);
|
|
}
|
|
}
|
|
|
|
function showPrompt(msg, buzzCount, alarm) {
|
|
E.showPrompt(msg, {
|
|
title: alarm.timer ? "TIMER!" : "ALARM!",
|
|
buttons: { Sleep: true, Ok: false }, // default is sleep so it'll come back in 10 mins
|
|
}).then(function (sleep) {
|
|
buzzCount = 0;
|
|
if (sleep) {
|
|
if (alarm.ohr === undefined) alarm.ohr = alarm.t;
|
|
alarm.t += 10 / 60; // 10 minutes
|
|
require("Storage").write("qalarm.json", JSON.stringify(alarms));
|
|
load();
|
|
} else {
|
|
alarm.last = new Date().getDate();
|
|
if (alarm.ohr !== undefined) {
|
|
alarm.t = alarm.ohr;
|
|
delete alarm.ohr;
|
|
}
|
|
if (!alarm.rp) alarm.on = false;
|
|
require("Storage").write("qalarm.json", JSON.stringify(alarms));
|
|
load();
|
|
}
|
|
});
|
|
}
|
|
|
|
function showAlarm(alarm) {
|
|
if ((require("Storage").readJSON("setting.json", 1) || {}).quiet > 1) return; // total silence
|
|
let msg = formatTime(alarm.t);
|
|
let buzzCount = 20;
|
|
if (alarm.msg) msg += "\n" + alarm.msg + "!";
|
|
|
|
if (alarm.hard) {
|
|
let okClicked = false;
|
|
let currentGuess = 10;
|
|
let randomNum = getRandomFromRange(0, 7, 13, 20);
|
|
showNumberPicker(currentGuess, randomNum);
|
|
setWatch(
|
|
(o) => {
|
|
if (!okClicked && currentGuess < 20) {
|
|
currentGuess = currentGuess + 1;
|
|
showNumberPicker(currentGuess, randomNum);
|
|
}
|
|
},
|
|
BTN1,
|
|
{ repeat: true, edge: "rising" }
|
|
);
|
|
|
|
setWatch(
|
|
(o) => {
|
|
if (currentGuess == randomNum) {
|
|
okClicked = true;
|
|
showPrompt(msg, buzzCount, alarm);
|
|
}
|
|
},
|
|
BTN2,
|
|
{ repeat: true, edge: "rising" }
|
|
);
|
|
|
|
setWatch(
|
|
(o) => {
|
|
if (!okClicked && currentGuess > 0) {
|
|
currentGuess = currentGuess - 1;
|
|
showNumberPicker(currentGuess, randomNum);
|
|
}
|
|
},
|
|
BTN3,
|
|
{ repeat: true, edge: "rising" }
|
|
);
|
|
} else {
|
|
showPrompt(msg, buzzCount, alarm);
|
|
}
|
|
|
|
function buzz() {
|
|
Bangle.buzz(500).then(() => {
|
|
setTimeout(() => {
|
|
Bangle.buzz(500).then(function () {
|
|
setTimeout(() => {
|
|
Bangle.buzz(2000).then(function () {
|
|
if (buzzCount--) setTimeout(buzz, 2000);
|
|
else if (alarm.as) {
|
|
// auto-snooze
|
|
buzzCount = 20;
|
|
setTimeout(buzz, 600000); // 10 minutes
|
|
}
|
|
});
|
|
}, 100);
|
|
});
|
|
}, 100);
|
|
});
|
|
}
|
|
buzz();
|
|
}
|
|
|
|
let time = new Date();
|
|
let t = getCurrentTime();
|
|
let alarms = require("Storage").readJSON("qalarm.json", 1) || [];
|
|
|
|
let active = alarms.filter(
|
|
(alarm) =>
|
|
alarm.on &&
|
|
alarm.t < t &&
|
|
alarm.last != time.getDate() &&
|
|
(alarm.timer || alarm.daysOfWeek[time.getDay()])
|
|
);
|
|
|
|
if (active.length) {
|
|
showAlarm(active.sort((a, b) => a.t - b.t)[0]);
|
|
}
|