2023-01-09 17:57:51 +00:00
|
|
|
// timeout used to update every minute
|
|
|
|
let drawTimeout;
|
|
|
|
{
|
2020-05-23 16:42:52 +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
|
2020-05-24 11:54:32 +00:00
|
|
|
const fields = [4, 4, 11, 4];
|
2021-10-21 08:13:17 +00:00
|
|
|
const offset = 24;
|
2020-05-24 11:54:32 +00:00
|
|
|
const width = g.getWidth() - 2 * offset;
|
|
|
|
const height = g.getHeight() - 2 * offset;
|
|
|
|
const rowHeight = height / 4;
|
2020-05-23 16:42:52 +00:00
|
|
|
|
2023-01-09 17:57:51 +00:00
|
|
|
let show_date = false;
|
|
|
|
let show_time = false;
|
|
|
|
let yy = 0;
|
2019-12-09 21:06:47 +00:00
|
|
|
|
2023-01-09 17:57:51 +00:00
|
|
|
let rowlights = [];
|
|
|
|
let time_digit = [];
|
2021-10-21 08:13:17 +00:00
|
|
|
|
|
|
|
// schedule a draw for the next minute
|
2023-01-09 17:57:51 +00:00
|
|
|
let queueDraw = () => {
|
2021-10-21 08:13:17 +00:00
|
|
|
if (drawTimeout) clearTimeout(drawTimeout);
|
|
|
|
drawTimeout = setTimeout(function() {
|
|
|
|
drawTimeout = undefined;
|
|
|
|
draw();
|
|
|
|
}, 60000 - (Date.now() % 60000));
|
|
|
|
}
|
|
|
|
|
2023-01-09 17:57:51 +00:00
|
|
|
let draw = () => {
|
2021-10-21 08:13:17 +00:00
|
|
|
g.reset().clearRect(0,24,g.getWidth(),g.getHeight());
|
2020-05-24 11:54:32 +00:00
|
|
|
var now = new Date();
|
2021-06-24 12:12:59 +00:00
|
|
|
|
2020-05-24 16:22:44 +00:00
|
|
|
// show date below the clock
|
2020-05-24 11:54:32 +00:00
|
|
|
if (show_date) {
|
|
|
|
var yr = now.getFullYear();
|
|
|
|
var month = now.getMonth() + 1;
|
|
|
|
var day = now.getDate();
|
2020-05-24 12:11:42 +00:00
|
|
|
var dateString = `${yr}-${month < 10 ? '0' : ''}${month}-${day < 10 ? '0' : ''}${day}`;
|
2020-05-24 11:54:32 +00:00
|
|
|
var strWidth = g.stringWidth(dateString);
|
2021-10-21 08:13:17 +00:00
|
|
|
g.setColor(g.theme.fg).setFontAlign(-1,-1);
|
2020-05-24 16:22:44 +00:00
|
|
|
g.drawString(dateString, ( g.getWidth() - strWidth ) / 2, height + offset + 4);
|
2020-05-24 11:54:32 +00:00
|
|
|
}
|
2021-06-24 12:12:59 +00:00
|
|
|
|
2020-05-24 11:54:32 +00:00
|
|
|
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-01-17 11:43:26 +00:00
|
|
|
|
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;
|
|
|
|
|
2020-05-24 11:54:32 +00:00
|
|
|
g.drawRect(offset, offset, width + offset, height + offset);
|
|
|
|
for (row = 0; row < 4; row++) {
|
|
|
|
nfields = fields[row];
|
|
|
|
boxWidth = width / nfields;
|
2020-01-17 11:43:26 +00:00
|
|
|
|
2020-05-24 11:54:32 +00:00
|
|
|
for (col = 0; col < nfields; col++) {
|
|
|
|
x1 = col * boxWidth + offset;
|
|
|
|
y1 = row * rowHeight + offset;
|
|
|
|
x2 = (col + 1) * boxWidth + offset;
|
|
|
|
y2 = (row + 1) * rowHeight + offset;
|
2020-01-17 11:43:26 +00:00
|
|
|
|
2021-10-21 08:13:17 +00:00
|
|
|
g.setColor(g.theme.fg).drawRect(x1, y1, x2, y2);
|
2020-05-24 11:54:32 +00:00
|
|
|
if (col < rowlights[row]) {
|
|
|
|
if (row === 2) {
|
|
|
|
if (((col + 1) % 3) === 0) {
|
|
|
|
g.setColor(1, 0, 0);
|
2020-01-17 11:43:26 +00:00
|
|
|
} else {
|
2020-05-24 11:54:32 +00:00
|
|
|
g.setColor(1, 1, 0);
|
2019-12-09 21:06:47 +00:00
|
|
|
}
|
2020-05-24 11:54:32 +00:00
|
|
|
} else {
|
|
|
|
g.setColor(1, 0, 0);
|
2019-12-09 21:06:47 +00:00
|
|
|
}
|
2021-06-24 12:12:59 +00:00
|
|
|
g.fillRect(x1 + 2, y1 + 2, x2 - 2, y2 - 2);
|
2020-05-24 16:22:44 +00:00
|
|
|
}
|
|
|
|
if (row == 3 && show_time) {
|
2021-10-21 08:13:17 +00:00
|
|
|
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);
|
2020-01-17 11:43:26 +00:00
|
|
|
}
|
2019-12-09 21:06:47 +00:00
|
|
|
}
|
2020-05-24 11:54:32 +00:00
|
|
|
}
|
2021-10-21 08:13:17 +00:00
|
|
|
|
|
|
|
queueDraw();
|
2020-01-17 11:43:26 +00:00
|
|
|
}
|
2019-12-09 21:06:47 +00:00
|
|
|
|
2023-01-09 17:57:51 +00:00
|
|
|
let toggleDate = () => {
|
2020-05-24 16:22:44 +00:00
|
|
|
show_date = ! show_date;
|
2021-10-21 08:13:17 +00:00
|
|
|
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;
|
2021-10-21 08:13:17 +00:00
|
|
|
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 (global.drawTimeout) clearTimeout(global.drawTimeout);
|
|
|
|
delete global.drawTimeout;
|
|
|
|
}
|
|
|
|
|
2021-10-21 08:13:17 +00:00
|
|
|
// Stop updates when LCD is off, restart when on
|
|
|
|
Bangle.on('lcdPower',on=>{
|
2020-01-17 11:43:26 +00:00
|
|
|
if (on) {
|
2021-10-21 08:13:17 +00:00
|
|
|
draw(); // draw immediately, queue redraw
|
|
|
|
} else { // stop draw timer
|
2023-01-09 17:57:51 +00:00
|
|
|
clear();
|
2020-05-24 11:54:32 +00:00
|
|
|
}
|
|
|
|
});
|
2019-12-09 21:06:47 +00:00
|
|
|
|
2021-10-21 08:13:17 +00:00
|
|
|
// Show launcher when button pressed, handle up/down
|
2023-01-09 17:57:51 +00:00
|
|
|
Bangle.setUI({mode: "clockupdown", remove: clear}, dir=> {
|
2021-10-21 08:13:17 +00:00
|
|
|
if (dir<0) toggleTime();
|
|
|
|
if (dir>0) toggleDate();
|
|
|
|
});
|
2019-12-09 21:06:47 +00:00
|
|
|
|
2020-01-17 11:43:26 +00:00
|
|
|
g.clear();
|
|
|
|
Bangle.loadWidgets();
|
|
|
|
Bangle.drawWidgets();
|
2021-10-21 08:13:17 +00:00
|
|
|
draw();
|
2023-01-09 17:57:51 +00:00
|
|
|
}
|