BangleApps/apps/qalarm/qalarm.js

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]);
}