2021-12-22 20:18:55 +00:00
|
|
|
// Clock with large digits using the "Anton" bold font
|
|
|
|
|
2021-12-25 20:55:23 +00:00
|
|
|
var SETTINGSFILE = "antonclk.json";
|
2021-12-22 20:18:55 +00:00
|
|
|
|
2021-09-23 10:42:58 +00:00
|
|
|
Graphics.prototype.setFontAnton = function(scale) {
|
|
|
|
// Actual height 69 (68 - 0)
|
|
|
|
g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAA/gAAAAAAAAAAP/gAAAAAAAAAH//gAAAAAAAAB///gAAAAAAAAf///gAAAAAAAP////gAAAAAAD/////gAAAAAA//////gAAAAAP//////gAAAAH///////gAAAB////////gAAAf////////gAAP/////////gAD//////////AA//////////gAA/////////4AAA////////+AAAA////////gAAAA///////wAAAAA//////8AAAAAA//////AAAAAAA/////gAAAAAAA////4AAAAAAAA///+AAAAAAAAA///gAAAAAAAAA//wAAAAAAAAAA/8AAAAAAAAAAA/AAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////AAAAAB///////8AAAAH////////AAAAf////////wAAA/////////4AAB/////////8AAD/////////+AAH//////////AAP//////////gAP//////////gAP//////////gAf//////////wAf//////////wAf//////////wAf//////////wA//8AAAAAB//4A//wAAAAAAf/4A//gAAAAAAP/4A//gAAAAAAP/4A//gAAAAAAP/4A//wAAAAAAf/4A///////////4Af//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH//////////AAD/////////+AAB/////////8AAA/////////4AAAP////////gAAAD///////+AAAAAf//////4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAP/gAAAAAAAAAAf/gAAAAAAAAAAf/gAAAAAAAAAAf/AAAAAAAAAAA//AAAAAAAAAAA/+AAAAAAAAAAB/8AAAAAAAAAAD//////////gAH//////////gAP//////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAAB/gAAD//4AAAAf/gAAP//4AAAB//gAA///4AAAH//gAB///4AAAf//gAD///4AAA///gAH///4AAD///gAP///4AAH///gAP///4AAP///gAf///4AAf///gAf///4AB////gAf///4AD////gA////4AH////gA////4Af////gA////4A/////gA//wAAB/////gA//gAAH/////gA//gAAP/////gA//gAA///8//gA//gAD///w//gA//wA////g//gA////////A//gA///////8A//gA///////4A//gAf//////wA//gAf//////gA//gAf/////+AA//gAP/////8AA//gAP/////4AA//gAH/////gAA//gAD/////AAA//gAB////8AAA//gAA////wAAA//gAAP///AAAA//gAAD//8AAAA//gAAAP+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/+AAAAAD/wAAB//8AAAAP/wAAB///AAAA//wAAB///wAAB//wAAB///4AAD//wAAB///8AAH//wAAB///+AAP//wAAB///+AAP//wAAB////AAf//wAAB////AAf//wAAB////gAf//wAAB////gA///wAAB////gA///wAAB////gA///w//AAf//wA//4A//AAA//wA//gA//AAAf/wA//gB//gAAf/wA//gB//gAAf/wA//gD//wAA//wA//wH//8AB//wA///////////gA///////////gA///////////gA///////////gAf//////////AAf//////////AAP//////////AAP/////////+AAH/////////8AAH///+/////4AAD///+f////wAAA///8P////gAAAf//4H///+AAAAH//gB///wAAAAAP4AAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAAAAAA//wAAAAAAAAAP//wAAAAAAAAB///wAAAAAAAAf///wAAAAAAAH////wAAAAAAA/////wAAAAAAP/////wAAAAAB//////wAAAAAf//////wAAAAH///////wAAAA////////wAAAP////////wAAA///////H/wAAA//////wH/wAAA/////8AH/wAAA/////AAH/wAAA////gAAH/wAAA///4AAAH/wAAA//+AAAAH/wAAA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gA///////////gAAAAAAAAH/4AAAAAAAAAAH/wAAAAAAAAAAH/wAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//8AAA/////+B///AAA/////+B///wAA/////+B///4AA/////+B///8AA/////+B///8AA/////+B///+AA/////+B////AA/////+B////AA/////+B////AA/////+B////gA/////+B////gA/////+B////gA/////+A////gA//gP/gAAB//wA//gf/AAAA//wA//gf/AAAAf/wA//g//AAAAf/wA//g//AAAA//wA//g//gAAA//wA//g//+AAP//wA//g////////gA//g////////gA//g////////gA//g////////gA//g////////AA//gf///////AA//gf//////+AA//gP//////+AA//gH//////8AA//gD//////4AA//gB//////wAA//gA//////AAAAAAAH////8AAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////gAAAAB///////+AAAAH////////gAAAf////////4AAB/////////8AAD/////////+AAH//////////AAH//////////gAP//////////gAP//////////gAf//////////wAf//////////wAf//////////wAf//////////wAf//////////4A//wAD/4AAf/4A//gAH/wAAP/4A//gAH/wAAP/4A//gAP/wAAP/4A//gAP/4AAf/4A//wAP/+AD//4A///wP//////4Af//4P//////wAf//4P//////wAf//4P//////wAf//4P//////wAP//4P//////gAP//4H//////gAH//4H//////AAH//4D/////+AAD//4D/////8AAB//4B/////4AAA//4A/////wAAAP/4AP////AAAAB/4AD///4AAAAAAAAAH/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//AAAAAAAAAAA//
|
2021-12-22 20:18:55 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// variables defined from settings
|
|
|
|
var secondsOnUnlock;
|
|
|
|
var secondsAlways;
|
2021-12-25 20:55:23 +00:00
|
|
|
var secondsColoured;
|
2021-12-22 20:18:55 +00:00
|
|
|
var dateAsISO;
|
2021-12-25 20:55:23 +00:00
|
|
|
var dateOnSecs;
|
2021-12-22 20:18:55 +00:00
|
|
|
var longDate;
|
|
|
|
var weekDay;
|
|
|
|
var upperCase;
|
2021-12-26 18:42:04 +00:00
|
|
|
var vectorFont;
|
2021-09-23 10:42:58 +00:00
|
|
|
|
2021-12-22 20:18:55 +00:00
|
|
|
// dynamic variables
|
2021-09-23 10:42:58 +00:00
|
|
|
var drawTimeout;
|
2021-12-25 20:55:23 +00:00
|
|
|
var queueMillis = 1000;
|
|
|
|
var secondsScreen = true;
|
2021-12-22 20:18:55 +00:00
|
|
|
|
2021-12-25 20:55:23 +00:00
|
|
|
var isBangle1 = (g.getWidth() == 240);
|
2021-12-22 20:18:55 +00:00
|
|
|
|
|
|
|
/* For development purposes
|
|
|
|
require('Storage').writeJSON(SETTINGSFILE, {
|
|
|
|
secondsOnUnlock: false,
|
|
|
|
secondsAlways: false,
|
2021-12-25 20:55:23 +00:00
|
|
|
secondsColoured: true,
|
2021-12-22 20:18:55 +00:00
|
|
|
dateAsISO: false,
|
2021-12-25 20:55:23 +00:00
|
|
|
dateOnSecs: true,
|
2021-12-22 20:18:55 +00:00
|
|
|
longDate: true,
|
|
|
|
weekDay: true,
|
2021-12-25 20:55:23 +00:00
|
|
|
upperCase: false,
|
2021-12-26 18:42:04 +00:00
|
|
|
vectorFont: false,
|
2021-12-22 20:18:55 +00:00
|
|
|
});
|
2021-12-25 20:55:23 +00:00
|
|
|
/* */
|
2021-12-22 20:18:55 +00:00
|
|
|
|
2021-12-25 20:55:23 +00:00
|
|
|
/* OR (also for development purposes)
|
|
|
|
require('Storage').erase(SETTINGSFILE);
|
|
|
|
/* */
|
|
|
|
|
|
|
|
// Helper method for loading the settings
|
|
|
|
function def(value, def) {
|
|
|
|
return (value !== undefined ? value : def);
|
2021-12-22 20:18:55 +00:00
|
|
|
}
|
|
|
|
|
2021-12-25 20:55:23 +00:00
|
|
|
// Load settings
|
2021-12-22 20:18:55 +00:00
|
|
|
function loadSettings() {
|
|
|
|
var settings = require('Storage').readJSON(SETTINGSFILE, true) || {};
|
2021-12-25 20:55:23 +00:00
|
|
|
secondsOnUnlock = def(settings.secondsOnUnlock, false);
|
|
|
|
secondsAlways = def(settings.secondsAlways, false);
|
|
|
|
secondsColoured = def(settings.secondsColoured, false);
|
|
|
|
dateAsISO = def(settings.dateAsISO, false);
|
|
|
|
dateOnSecs = def(settings.dateOnSecs, true);
|
|
|
|
longDate = def(settings.longDate, true);
|
|
|
|
weekDay = def(settings.weekDay, true);
|
|
|
|
upperCase = def(settings.upperCase, true);
|
2021-12-26 18:42:04 +00:00
|
|
|
vectorFont = def(settings.vectorFont, false);
|
2021-12-22 20:18:55 +00:00
|
|
|
}
|
2021-09-23 10:42:58 +00:00
|
|
|
|
2021-12-25 20:55:23 +00:00
|
|
|
// schedule a draw for the next second or minute
|
2021-09-23 10:42:58 +00:00
|
|
|
function queueDraw() {
|
|
|
|
if (drawTimeout) clearTimeout(drawTimeout);
|
|
|
|
drawTimeout = setTimeout(function() {
|
|
|
|
drawTimeout = undefined;
|
|
|
|
draw();
|
2021-12-22 20:18:55 +00:00
|
|
|
}, queueMillis - (Date.now() % queueMillis));
|
2021-09-23 10:42:58 +00:00
|
|
|
}
|
|
|
|
|
2021-12-22 20:18:55 +00:00
|
|
|
function updateState() {
|
|
|
|
if (Bangle.isLCDOn()) {
|
|
|
|
if ((secondsOnUnlock && !Bangle.isLocked()) || secondsAlways) {
|
2021-12-25 20:55:23 +00:00
|
|
|
secondsScreen = true;
|
|
|
|
queueMillis = 1000;
|
2021-12-22 20:18:55 +00:00
|
|
|
} else {
|
2021-12-25 20:55:23 +00:00
|
|
|
secondsScreen = false;
|
|
|
|
queueMillis = 60000;
|
2021-12-22 20:18:55 +00:00
|
|
|
}
|
|
|
|
draw(); // draw immediately, queue redraw
|
|
|
|
} else { // stop draw timer
|
|
|
|
if (drawTimeout) clearTimeout(drawTimeout);
|
|
|
|
drawTimeout = undefined;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function isoStr(date) {
|
2021-12-25 20:55:23 +00:00
|
|
|
return date.getFullYear() + "-" + ("0" + (date.getMonth() + 1)).substr(-2) + "-" + ("0" + date.getDate()).substr(-2);
|
2021-12-22 20:18:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function doColor() {
|
2021-12-25 20:55:23 +00:00
|
|
|
return !isBangle1 && !Bangle.isLocked() && secondsColoured;
|
2021-12-22 20:18:55 +00:00
|
|
|
}
|
2021-09-23 10:42:58 +00:00
|
|
|
|
2021-12-26 18:42:04 +00:00
|
|
|
// Actually draw the watch face
|
2021-09-23 10:42:58 +00:00
|
|
|
function draw() {
|
2021-12-25 20:55:23 +00:00
|
|
|
var x = g.getWidth() / 2;
|
2021-12-26 18:42:04 +00:00
|
|
|
var y = g.getHeight() / 2 - (secondsOnUnlock || secondsAlways ? 24 : (vectorFont ? 12 : 0));
|
2021-10-06 09:15:16 +00:00
|
|
|
g.reset();
|
2021-12-25 20:55:23 +00:00
|
|
|
g.clearRect(0, 24, g.getWidth(), g.getHeight()); // clear whole background
|
2021-12-26 18:42:04 +00:00
|
|
|
var date = new Date(); // Actually the current date, this one is shown
|
|
|
|
var timeStr = require("locale").time(date, 1); // Hour and minute
|
|
|
|
g.setFontAlign(0, 0).setFont("Anton").drawString(timeStr, x, y); // draw time
|
2021-12-25 20:55:23 +00:00
|
|
|
if (secondsScreen) {
|
|
|
|
y += 76;
|
|
|
|
var secStr = ":" + ("0" + date.getSeconds()).substr(-2);
|
2021-12-22 20:18:55 +00:00
|
|
|
if (doColor())
|
2021-12-25 20:55:23 +00:00
|
|
|
g.setColor(0, 0, 1);
|
|
|
|
g.setFont("Anton");
|
2021-12-26 18:42:04 +00:00
|
|
|
if (dateOnSecs) { // A bit of a complex drawing with seconds on the right and date on the left
|
|
|
|
g.setFontAlign(1, 0).drawString(secStr, g.getWidth() - (isBangle1 ? 32 : 2), y); // seconds
|
|
|
|
y -= (vectorFont ? 20 : 16);
|
|
|
|
x = g.getWidth() / 4 + (isBangle1 ? 12 : -6);
|
2021-12-25 20:55:23 +00:00
|
|
|
var dateStr2 = (dateAsISO ? isoStr(date) : require("locale").date(date, 1));
|
|
|
|
var year;
|
|
|
|
var md;
|
|
|
|
var yearfirst;
|
2021-12-26 18:42:04 +00:00
|
|
|
if (dateStr2.match(/\d\d\d\d$/)) { // formatted date ends with year
|
2021-12-25 20:55:23 +00:00
|
|
|
year = dateStr2.slice(-4);
|
|
|
|
md = dateStr2.slice(0, -4);
|
2021-12-26 18:42:04 +00:00
|
|
|
if (!md.endsWith(".")) // keep separator before the year only if it is a dot (31.12. but 31/12)
|
2021-12-25 20:55:23 +00:00
|
|
|
md = md.slice(0, -1);
|
|
|
|
yearfirst = false;
|
2021-12-26 18:42:04 +00:00
|
|
|
} else { // formatted date begins with year
|
|
|
|
if (!dateStr2.match(/^\d\d\d\d/)) // if year position cannot be detected...
|
|
|
|
dateStr2 = isoStr(date); // ...use ISO date format instead
|
2021-12-25 20:55:23 +00:00
|
|
|
year = dateStr2.slice(0, 4);
|
2021-12-26 18:42:04 +00:00
|
|
|
md = dateStr2.slice(5); // never keep separator directly after year
|
2021-12-25 20:55:23 +00:00
|
|
|
yearfirst = true;
|
|
|
|
}
|
2021-12-26 18:42:04 +00:00
|
|
|
g.setFontAlign(0, 0);
|
|
|
|
if (vectorFont)
|
|
|
|
g.setFont("Vector", 24);
|
|
|
|
else
|
|
|
|
g.setFont("6x8", 2);
|
2021-12-25 20:55:23 +00:00
|
|
|
if (doColor())
|
|
|
|
g.setColor(1, 0, 0);
|
2021-12-26 18:42:04 +00:00
|
|
|
g.drawString(md, x, (yearfirst ? y + (vectorFont ? 26 : 16) : y));
|
|
|
|
g.drawString(year, x, (yearfirst ? y : y + (vectorFont ? 26 : 16)));
|
2021-12-25 20:55:23 +00:00
|
|
|
} else {
|
2021-12-26 18:42:04 +00:00
|
|
|
g.setFontAlign(0, 0).drawString(secStr, x, y); // Just the seconds centered
|
2021-12-22 20:18:55 +00:00
|
|
|
}
|
2021-12-26 18:42:04 +00:00
|
|
|
} else { // No seconds screen: Show date and optionally day of week
|
|
|
|
y += (vectorFont ? 50 : (secondsOnUnlock || secondsAlways) ? 52 : 40);
|
2021-12-25 20:55:23 +00:00
|
|
|
var dateStr = (dateAsISO ? isoStr(date) : require("locale").date(date, (longDate ? 0 : 1)));
|
2021-12-22 20:18:55 +00:00
|
|
|
if (upperCase)
|
2021-12-25 20:55:23 +00:00
|
|
|
dateStr = dateStr.toUpperCase();
|
2021-12-26 18:42:04 +00:00
|
|
|
g.setFontAlign(0, 0);
|
|
|
|
if (vectorFont)
|
|
|
|
g.setFont("Vector", 24);
|
|
|
|
else
|
|
|
|
g.setFont("6x8", 2);
|
2021-12-25 20:55:23 +00:00
|
|
|
g.drawString(dateStr, x, y);
|
2021-12-22 20:18:55 +00:00
|
|
|
if (weekDay) {
|
|
|
|
var dowStr = require("locale").dow(date);
|
|
|
|
if (upperCase)
|
2021-12-25 20:55:23 +00:00
|
|
|
dowStr = dowStr.toUpperCase();
|
2021-12-26 18:42:04 +00:00
|
|
|
g.drawString(dowStr, x, y + (vectorFont ? 26 : 16));
|
2021-12-22 20:18:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// queue next draw
|
2021-10-06 09:15:16 +00:00
|
|
|
queueDraw();
|
2021-09-23 10:42:58 +00:00
|
|
|
}
|
|
|
|
|
2021-12-22 20:18:55 +00:00
|
|
|
// Init the settings of the app
|
|
|
|
loadSettings();
|
2021-09-23 10:42:58 +00:00
|
|
|
// Clear the screen once, at startup
|
|
|
|
g.clear();
|
2021-12-22 20:18:55 +00:00
|
|
|
// Set dynamic state and perform initial drawing
|
|
|
|
updateState();
|
|
|
|
// Register hooks for LCD on/off event and screen lock on/off event
|
2021-12-25 20:55:23 +00:00
|
|
|
Bangle.on('lcdPower', on => {
|
|
|
|
updateState();
|
|
|
|
});
|
|
|
|
Bangle.on('lock', on => {
|
|
|
|
updateState();
|
|
|
|
});
|
2021-10-06 09:15:16 +00:00
|
|
|
// Show launcher when middle button pressed
|
|
|
|
Bangle.setUI("clock");
|
2021-09-23 10:42:58 +00:00
|
|
|
// Load widgets
|
|
|
|
Bangle.loadWidgets();
|
|
|
|
Bangle.drawWidgets();
|
2021-12-22 20:18:55 +00:00
|
|
|
|
2021-12-26 18:42:04 +00:00
|
|
|
// end of file
|