BangleApps/apps/berlinc/berlin-clock.js

145 lines
3.6 KiB
JavaScript
Raw Normal View History

2023-01-09 17:57:51 +00:00
{
// Berlin Clock see https://en.wikipedia.org/wiki/Mengenlehreuhr
2020-05-24 16:22:44 +00:00
// https://github.com/eska-muc/BangleApps
2023-01-14 22:08:57 +00:00
var settings = require('Storage').readJSON("berlinc.json", true) || {};
const fields = [4, 4, 11, 4];
2023-01-14 22:08:57 +00:00
let fullscreen = !!settings.fullscreen;
2023-01-09 17:57:51 +00:00
let show_date = false;
let show_time = false;
2023-01-09 17:57:51 +00:00
let rowlights = [];
let time_digit = [];
// timeout used to update every minute
let drawTimeout;
// schedule a draw for the next minute
2023-01-09 17:57:51 +00:00
let queueDraw = () => {
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() {
drawTimeout = undefined;
draw();
}, 60000 - (Date.now() % 60000));
2023-01-14 22:08:57 +00:00
};
2023-01-09 17:57:51 +00:00
let draw = () => {
2023-01-14 22:08:57 +00:00
let width = Math.min(Bangle.appRect.w,Bangle.appRect.h);
let height = width;
let offset = g.getHeight() - height;
let x = Math.floor((g.getWidth() - width)/2);
2023-01-14 22:08:57 +00:00
if (show_date) height -= 8;
let rowHeight = (height - 1) / 4;
g.setBgColor(g.theme.bg);
2023-01-14 22:08:57 +00:00
g.reset().clearRect(Bangle.appRect);
var now = new Date();
2020-05-24 16:22:44 +00:00
// show date below the clock
if (show_date) {
var yr = now.getFullYear();
var month = now.getMonth() + 1;
var day = now.getDate();
var dateString = `${yr}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day}`;
var strWidth = g.stringWidth(dateString);
g.setColor(g.theme.fg).setFontAlign(-1,-1);
2023-01-14 22:08:57 +00:00
g.drawString(dateString, ( Bangle.appRect.x + Bangle.appRect.w - strWidth ) / 2, Bangle.appRect.y2 - 5);
}
rowlights[0] = Math.floor(now.getHours() / 5);
rowlights[1] = now.getHours() % 5;
rowlights[2] = Math.floor(now.getMinutes() / 5);
rowlights[3] = now.getMinutes() % 5;
2020-05-24 16:22:44 +00:00
time_digit[0] = Math.floor(now.getHours() / 10);
time_digit[1] = now.getHours() % 10;
time_digit[2] = Math.floor(now.getMinutes() / 10);
time_digit[3] = now.getMinutes() % 10;
g.setColor(g.theme.fg);
g.drawRect(x, offset, x + width - 1, height + offset - 1);
for (row = 0; row < 4; row++) {
nfields = fields[row];
boxWidth = (width - 1) / nfields;
for (col = 0; col < nfields; col++) {
2023-01-14 22:08:57 +00:00
x1 = col * boxWidth + x;
y1 = row * rowHeight + offset;
2023-01-14 22:08:57 +00:00
x2 = (col + 1) * boxWidth + x;
y2 = (row + 1) * rowHeight + offset;
g.setColor(g.theme.fg).drawRect(x1, y1, x2, y2);
if (col < rowlights[row]) {
if (row === 2) {
if (((col + 1) % 3) === 0) {
g.setColor(1, 0, 0);
} else {
g.setColor(1, 1, 0);
}
} else {
g.setColor(1, 0, 0);
}
g.fillRect(x1 + 2, y1 + 2, x2 - 2, y2 - 2);
2020-05-24 16:22:44 +00:00
}
if (row == 3 && show_time) {
g.setColor(g.theme.fg).setFontAlign(0,0);
2020-05-24 16:22:44 +00:00
g.drawString(time_digit[col],(x1+x2)/2,(y1+y2)/2);
}
}
}
queueDraw();
}
2023-01-09 17:57:51 +00:00
let toggleDate = () => {
2020-05-24 16:22:44 +00:00
show_date = ! show_date;
draw();
2020-05-24 16:22:44 +00:00
}
2023-01-09 17:57:51 +00:00
let toggleTime = () => {
2020-05-24 16:22:44 +00:00
show_time = ! show_time;
draw();
2020-05-24 16:22:44 +00:00
}
2020-05-24 13:05:11 +00:00
2023-01-09 17:57:51 +00:00
let clear = () => {
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = undefined;
2023-01-09 17:57:51 +00:00
}
2023-01-09 22:56:51 +00:00
let onLcdPower = on => {
if (on) {
draw(); // draw immediately, queue redraw
} else { // stop draw timer
2023-01-09 17:57:51 +00:00
clear();
}
2023-01-09 22:56:51 +00:00
}
let cleanup = () => {
clear();
Bangle.removeListener("lcdPower", onLcdPower);
2023-01-14 22:08:57 +00:00
require("widget_utils").show();
2023-01-09 22:56:51 +00:00
}
// Stop updates when LCD is off, restart when on
Bangle.on('lcdPower',onLcdPower);
// Show launcher when button pressed, handle up/down
2023-01-09 22:56:51 +00:00
Bangle.setUI({mode: "clockupdown", remove: cleanup}, dir=> {
if (dir<0) toggleTime();
if (dir>0) toggleDate();
});
g.clear();
Bangle.loadWidgets();
if (fullscreen){
if (process.env.HWVERSION == 2) require("widget_utils").swipeOn();
else require("widget_utils").hide();
}
Bangle.drawWidgets();
draw();
2023-01-09 17:57:51 +00:00
}