mirror of https://github.com/espruino/BangleApps
262 lines
9.0 KiB
JavaScript
262 lines
9.0 KiB
JavaScript
// Initailize Variables
|
|
|
|
var is12Hour = (require("Storage").readJSON("setting.json", 1) || {})["12hour"];
|
|
var locale = require("locale");
|
|
var CHARW = 9; // how tall are digits?
|
|
var CHARP = 1; // how chunky are digits?
|
|
var Y = 105; // start height
|
|
|
|
// Offscreen buffer
|
|
var buf = Graphics.createArrayBuffer(CHARW + CHARP * 2, CHARW * 2 + CHARP * 2, 1, {
|
|
msb: true
|
|
});
|
|
var bufimg = {
|
|
width: buf.getWidth(),
|
|
height: buf.getHeight(),
|
|
buffer: buf.buffer
|
|
};
|
|
|
|
// The last time that we displayed
|
|
var lastTime = "-----";
|
|
|
|
// If animating, this is the interval's id
|
|
var animInterval;
|
|
var timeInterval;
|
|
|
|
// Background Image
|
|
const bg_crack = require("heatshrink").decompress(atob("+HwgJC/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/gEIDrkYDrkwDrlgDrnADvMBwAdcLDkCBhcQDp8EfdMMDrkGDrkHDrkDCB8wDpj8PuD8M4AdO8ANaFp/wgEIDrV4gEEQ5gtBDprhN/wOMngCBLRcEj7EMj5qBBxcMgamMFYWEBAgzFjEA/AdMUgMGDpUQgEeDA0gAgd/DoNCDpUwS4J4GhgED/ZnBkIdKsACBaYxRDgPxBgMRDpVAYogADgJUBfoPgQoQYEwECAoYSCKQgACuD9CwE4d4ISCEQ0BdpRDCh4ECghOCDoUEAgUDZpQaBgEcYIUCRQQdGLogAGgZHBK4MfCQLaEKYj6FAAzNBPQMPwEBiAdEhDkHAA84WwUfGgOYDopCCEIYAIjxbCj4gBCYhZEjAdLg/GAYMfLwNMDogZDmAdLgP8AYM/+EAkgdEPoafEABF8AQP/DoMWDpDbEPBJcB//4bIJ3IQYJPBDpMPOwPPLoMLDo8BAgQqEAAqzBv8H/wUEDpEGSxXB/kD/4ZFAYY3Dgh4KOoIdBC4JuCDog3Dhg7K//gAQIbBVQYdDhwDChA7Kv/AEAUMDo8ejgDBvBZLwBZB+0cmAdGn+eFYL+BAAj9DAAscBQYdDnw3KDpMYDo1uDqiJDDofGDqceYo0BwwdTh0EHYsBd4YdRgQHFgQlDDqIHGggdUh4HGhB/GDqK2DgAdUg4dESwMQDqqvCHYcgIAgdXoEQDqcDDoQAD4EYDq47DwEwDqcCDoTqCgMA+AdTKQICBg04IQMD8AdXAAUGg4dXLAUAh0PDijKBgMeAoUeAgYASsEBx4EBkEengdViEAw4dCn14DqsMgHHDoUzuAdVgOAsYEBmF3WSoABvExDoeADq0P/ADBjH8DiwABDIUPeoIA/AH4A/AAUgDvVgC60DAonwDq0MAgcBDq84OYn4DisB8EAg4CBgF+DqsHwADB/+DwE8DqseEIf/8AdWvAEDn/wDqsfOYR8C//+Oqn/OwQACh//DqcPGY8DDqZwBRqodG4AdcDjcAcywAGsAdcAH4A/AH4A/AH4AnmBA/AEUBw//+Adaj///AOLFRsD//vCBk8DpkH85ZBg/ABxGAjwdMBoP/8JbJgeAg4dMsEAv49COxHAgfQQpeAAQOD//gBo4dBgCjLggED/53HgcAE4N8ap5tBBA0PDoSWNW4eAGgKiGDoIMBDp0GKQQAEjkAuAKBbxIdHAIIAE/gdDUQ4AHjEAhiyFV4M4DoLeIAAwSBDosAvAKCgU8Dp1gHoQADiEwDoS0JoBQFQ4IUCIYkAj/+WgL8IaA0AGgJYFDoJ6BWg8IAwsPDoJbBDo0PDQMBWgwTFgE/BI4dDAwpvDGYIAEvYCBGIMQBAV8NQMOAwS0Fgh+GEoInCMod8KgIdDH4bACDpbxDvkA/gGDg6WELAwICXgQWCiFmQQIdDgPwDA4ACjACBgQCBKQQdCj/8CIbVBABLrCg0AoEHBAViKgIdEnwdKZoQdCUQUQscAgYdEh5zIZoZ0CoClDsIDBvymE8AdJFAUcDovhKg94LRQdDcIngFAMeBIk8Dpi2CDofADoK6CAAQFFDp6fDAAcHSxQdICYUDBIkBE4QAJiAjFDoUBCAq0KDpAQJnAdQggdKYgodIhAdNg4dNhgdNga0LC4IsDDpUAWhaEBcIYdLuALKmDnEDpYpRVBaHCABD8EiAdLgSDMaIUYchgAJgKSBJIUYNZYAKSQQdDH4QATgwdFDisAggCBG4R2WHA0fTYIAUDQQ7CDq8wdgQdZkAdFa4IAUoAFEDoqhCABxSFjIdVgJSFd4odRXJAACgz1WDosCDv4dYgYdWhiiLDv4dSgGADv4dYoAdzgitWDpkgLLgddACwd/Dv4d/Dv4drADsIDv6z/LOQA/AH4A/AH4A/AGw"));
|
|
const batman = require("heatshrink").decompress(atob("+HwwJC/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4Ash//AA/gCQ8BCRH8DrsHDrf4BRIdSCQN/BQ/wDqOAgEfDqEDCI/+BYJ4IDqP4BZQdRCIYdMgYdPSw5HCgFwDpnABgSWHDoqmBRJJMDDpcwDocPWRIqJ/gLCvA7LCAZmIBgZZEHY6mEgI7Lg4dK8AdLMwd5DoaIHDojSHDoYFBDpQKCAAU/YBLjEB5TSKFYQdLaAiFJDo5pGaAjfJQoQdDUo/4DorwHb4QdDBxQdLNAQdDQw4dGJQ54CDoZ2GDo4TCB458CJI6GDDpn/DIXwdo69DAAhLHABrgCAAguIABgcGDrzDHABjfCDscPDqf8DssHDqf4DssDDuPwDssBHePgHbgdIgAdx4Ad/Dv4dywBZ/Dv6z/aP4d/Dv4drgIdT8Adm/gDBh4ZLB4YdIAAkfDhP+DBhePGxoAFn4dIDiUAg4cH/AdTepDpIABlfSbAADagzOCACcDDovwDqp4GOyodHoAdWeIocWSwqUWAAMHDof4Dq8BDofgDq6WEWS4ABv4dCwAd2j4cB/wcYaQbQYaQjQYAAMDDoPwDrjuZgEBDrkADoPADvF/Dr2ADrU//4caDoP+DrcfDrkPDrv8DvMH/Ad5gfwDv4AXgIdd8Ad/ADHADv4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AH4A/AHY"));
|
|
|
|
|
|
/* Get array of lines from digit d to d+1.
|
|
n is the amount (0..1)
|
|
maxFive is true is this digit only counts 0..5 */
|
|
const DIGITS = {
|
|
" ": n => [],
|
|
"0": n => [
|
|
[n, 0, 1, 0],
|
|
[1, 0, 1, 1],
|
|
[1, 1, 1, 2],
|
|
[n, 2, 1, 2],
|
|
[n, 1, n, 2],
|
|
[n, 0, n, 1]
|
|
],
|
|
"1": n => [
|
|
[1 - n, 0, 1, 0],
|
|
[1, 0, 1, 1],
|
|
[1 - n, 1, 1, 1],
|
|
[1 - n, 1, 1 - n, 2],
|
|
[1 - n, 2, 1, 2]
|
|
],
|
|
"2": n => [
|
|
[0, 0, 1, 0],
|
|
[1, 0, 1, 1],
|
|
[0, 1, 1, 1],
|
|
[0, 1 + n, 0, 2],
|
|
[1, 2 - n, 1, 2],
|
|
[0, 2, 1, 2]
|
|
],
|
|
"3": n => [
|
|
[0, 0, 1 - n, 0],
|
|
[0, 0, 0, n],
|
|
[1, 0, 1, 1],
|
|
[0, 1, 1, 1],
|
|
[1, 1, 1, 2],
|
|
[n, 2, 1, 2]
|
|
],
|
|
"4": n => [
|
|
[0, 0, 0, 1],
|
|
[1, 0, 1 - n, 0],
|
|
[1, 0, 1, 1 - n],
|
|
[0, 1, 1, 1],
|
|
[1, 1, 1, 2],
|
|
[1 - n, 2, 1, 2]
|
|
],
|
|
"5to0": n => [ // 5 -> 0
|
|
[0, 0, 0, 1],
|
|
[0, 0, 1, 0],
|
|
[n, 1, 1, 1],
|
|
[1, 1, 1, 2],
|
|
[0, 2, 1, 2],
|
|
[0, 2, 0, 2],
|
|
[1, 1 - n, 1, 1],
|
|
[0, 1, 0, 1 + n]
|
|
],
|
|
"5to6": n => [ // 5 -> 6
|
|
[0, 0, 0, 1],
|
|
[0, 0, 1, 0],
|
|
[0, 1, 1, 1],
|
|
[1, 1, 1, 2],
|
|
[0, 2, 1, 2],
|
|
[0, 2 - n, 0, 2]
|
|
],
|
|
"6": n => [
|
|
[0, 0, 0, 1 - n],
|
|
[0, 0, 1, 0],
|
|
[n, 1, 1, 1],
|
|
[1, 1 - n, 1, 1],
|
|
[1, 1, 1, 2],
|
|
[n, 2, 1, 2],
|
|
[0, 1 - n, 0, 2 - 2 * n]
|
|
],
|
|
"7": n => [
|
|
[0, 0, 0, n],
|
|
[0, 0, 1, 0],
|
|
[1, 0, 1, 1],
|
|
[1 - n, 1, 1, 1],
|
|
[1, 1, 1, 2],
|
|
[1 - n, 2, 1, 2],
|
|
[1 - n, 1, 1 - n, 2]
|
|
],
|
|
"8": n => [
|
|
[0, 0, 0, 1],
|
|
[0, 0, 1, 0],
|
|
[1, 0, 1, 1],
|
|
[0, 1, 1, 1],
|
|
[1, 1, 1, 2],
|
|
[0, 2, 1, 2],
|
|
[0, 1, 0, 2 - n]
|
|
],
|
|
"9": n => [
|
|
[0, 0, 0, 1],
|
|
[0, 0, 1, 0],
|
|
[1, 0, 1, 1],
|
|
[0, 1, 1 - n, 1],
|
|
[0, 1, 0, 1 + n],
|
|
[1, 1, 1, 2],
|
|
[0, 2, 1, 2]
|
|
],
|
|
":": n => [
|
|
[0.4, 0.4, 0.6, 0.4],
|
|
[0.6, 0.4, 0.6, 0.6],
|
|
[0.6, 0.6, 0.4, 0.6],
|
|
[0.4, 0.4, 0.4, 0.6],
|
|
[0.4, 1.4, 0.6, 1.4],
|
|
[0.6, 1.4, 0.6, 1.6],
|
|
[0.6, 1.6, 0.4, 1.6],
|
|
[0.4, 1.4, 0.4, 1.6]
|
|
]
|
|
};
|
|
|
|
/* Draw a transition between lastText and thisText.
|
|
'n' is the amount - 0..1 */
|
|
function drawDigits(lastText, thisText, n) {
|
|
"ram"
|
|
const p = CHARP; // padding around digits
|
|
const s = CHARW; // character size
|
|
var x = 80; // x offset
|
|
g.reset();
|
|
g.setColor(0, 0, 0);
|
|
g.setBgColor(1, 1, 1);
|
|
for (var i = 0; i < lastText.length; i++) {
|
|
var lastCh = lastText[i];
|
|
var thisCh = thisText[i];
|
|
if (thisCh == ":") x -= 4;
|
|
if (lastCh != thisCh) {
|
|
var ch, chn = n;
|
|
if ((thisCh - 1 == lastCh ||
|
|
(thisCh == 0 && lastCh == 5) ||
|
|
(thisCh == 0 && lastCh == 9)))
|
|
ch = lastCh;
|
|
else {
|
|
ch = thisCh;
|
|
chn = 0;
|
|
}
|
|
buf.clear();
|
|
if (ch == "5") ch = (lastCh == 5 && thisCh == 0) ? "5to0" : "5to6";
|
|
var l = DIGITS[ch](chn);
|
|
l.forEach(c => {
|
|
if (c[0] != c[2]) // horiz
|
|
buf.fillRect(p + c[0] * s, c[1] * s, p + c[2] * s, 2 * p + c[3] * s);
|
|
else if (c[1] != c[3]) // vert
|
|
buf.fillRect(c[0] * s, p + c[1] * s, 2 * p + c[2] * s, p + c[3] * s);
|
|
});
|
|
g.drawImage(bufimg, x, Y);
|
|
}
|
|
if (thisCh == ":") x -= 4;
|
|
x += s + p + 7;
|
|
}
|
|
}
|
|
|
|
function drawEverythingElse() {
|
|
var x = (CHARW + CHARP + 6) * 5 + 80;
|
|
var y = Y + 2 * CHARW + CHARP;
|
|
var d = new Date();
|
|
g.reset();
|
|
g.setBgColor(1, 1, 1);
|
|
g.setColor(1, 0, 0);
|
|
g.setFont("6x8");
|
|
g.setFontAlign(-1, -1);
|
|
g.drawString(("0" + d.getSeconds()).substr(-2), x, y - 8, true);
|
|
// meridian
|
|
if (is12Hour) g.drawString((d.getHours() < 12) ? "AM" : "PM", x,
|
|
+4, true);
|
|
// date
|
|
g.setFontAlign(0, -1);
|
|
var date = locale.date(d, false);
|
|
g.drawString(date, g.getWidth() / 2, y + 8, true);
|
|
}
|
|
|
|
/* Show the current time, and animate if needed */
|
|
function showTime() {
|
|
if (animInterval) return; // in animation - quit
|
|
var d = new Date();
|
|
var hours = d.getHours();
|
|
if (is12Hour) hours = ((hours + 11) % 12) + 1;
|
|
var t = (" " + hours).substr(-2) + ":" +
|
|
("0" + d.getMinutes()).substr(-2);
|
|
var l = lastTime;
|
|
// same - don't animate
|
|
if (t == l || l == "-----") {
|
|
drawDigits(l, t, 0);
|
|
drawEverythingElse();
|
|
lastTime = t;
|
|
return;
|
|
}
|
|
var n = 0;
|
|
animInterval = setInterval(function () {
|
|
n += 1 / 10;
|
|
if (n >= 1) {
|
|
n = 1;
|
|
clearInterval(animInterval);
|
|
animInterval = undefined;
|
|
}
|
|
drawDigits(l, t, n);
|
|
}, 20);
|
|
lastTime = t;
|
|
}
|
|
|
|
Bangle.on('lcdPower', function (on) {
|
|
if (animInterval) {
|
|
clearInterval(animInterval);
|
|
animInterval = undefined;
|
|
}
|
|
if (timeInterval) {
|
|
clearInterval(timeInterval);
|
|
timeInterval = undefined;
|
|
}
|
|
if (on) {
|
|
showTime();
|
|
timeInterval = setInterval(showTime, 1000);
|
|
} else {
|
|
lastTime = "-----";
|
|
}
|
|
});
|
|
|
|
g.clear();
|
|
|
|
// Draw Backgound before displaying time
|
|
g.setColor(0, 0.5, 0).drawImage(bg_crack);
|
|
g.setColor(1, 1, 1).drawImage(batman);
|
|
|
|
// Show launcher when button pressed
|
|
Bangle.setUI("clock");
|
|
|
|
Bangle.loadWidgets();
|
|
Bangle.drawWidgets();
|
|
|
|
// Update time once a second
|
|
timeInterval = setInterval(showTime, 1000);
|
|
showTime();
|
|
|