From 0b34ffefd58ee58f5d0437b5c4ff568a95eb778d Mon Sep 17 00:00:00 2001 From: "Dirk Hillbrecht (home)" Date: Wed, 22 Dec 2021 21:18:55 +0100 Subject: [PATCH 1/5] Anton clock: Update with optional seconds and ISO-8601 date --- apps.json | 8 +- apps/antonclk/ChangeLog | 1 + apps/antonclk/app.js | 176 +++++++++++++++++++++++++++-------- apps/antonclk/app.png | Bin 759 -> 1989 bytes apps/antonclk/screenshot.png | Bin 696 -> 1617 bytes apps/antonclk/settings.js | 87 +++++++++++++++++ 6 files changed, 232 insertions(+), 40 deletions(-) create mode 100644 apps/antonclk/settings.js diff --git a/apps.json b/apps.json index 5cc311413..b0d74926b 100644 --- a/apps.json +++ b/apps.json @@ -4238,8 +4238,8 @@ { "id": "antonclk", "name": "Anton Clock", - "version": "0.03", - "description": "A simple clock using the bold Anton font.", + "version": "0.04", + "description": "A clock using the bold Anton font, optionally showing seconds and date in ISO-8601 format.", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], "type": "clock", @@ -4248,8 +4248,10 @@ "allow_emulator": true, "storage": [ {"name":"antonclk.app.js","url":"app.js"}, + {"name":"antonclk.settings.js","url":"settings.js"}, {"name":"antonclk.img","url":"app-icon.js","evaluate":true} - ] + ], + "data": [{"name":"antonclk.json"}] }, { "id": "waveclk", diff --git a/apps/antonclk/ChangeLog b/apps/antonclk/ChangeLog index f88276a90..668047d7a 100644 --- a/apps/antonclk/ChangeLog +++ b/apps/antonclk/ChangeLog @@ -1,3 +1,4 @@ 0.01: New App! 0.02: Load widgets after setUI so widclk knows when to hide 0.03: Clock now shows day of week under date. +0.04: Clock can optionally show seconds, date optionally in ISO-8601 format, weekdays and uppercase configurable, too. diff --git a/apps/antonclk/app.js b/apps/antonclk/app.js index 7912dfc0f..3b9c14c46 100644 --- a/apps/antonclk/app.js +++ b/apps/antonclk/app.js @@ -1,10 +1,51 @@ +// Clock with large digits using the "Anton" bold font + +var SETTINGSFILE="antonclk.json"; + 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//gAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAADgA//gAAAAAAP/gA//gAAAAAH//gA//gAAAAB///gA//gAAAAP///gA//gAAAD////gA//gAAAf////gA//gAAB/////gA//gAAP/////gA//gAB//////gA//gAH//////gA//gA///////gA//gD///////gA//gf///////gA//h////////gA//n////////gA//////////gAA/////////AAAA////////wAAAA///////4AAAAA///////AAAAAA//////4AAAAAA//////AAAAAAA/////4AAAAAAA/////AAAAAAAA////8AAAAAAAA////gAAAAAAAA///+AAAAAAAAA///4AAAAAAAAA///AAAAAAAAAA//4AAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gB///wAAAAP//4H///+AAAA///8P////gAAB///+f////4AAD///+/////8AAH/////////+AAH//////////AAP//////////gAP//////////gAf//////////gAf//////////wAf//////////wAf//////////wA///////////wA//4D//wAB//4A//wB//gAA//4A//gA//gAAf/4A//gA//AAAf/4A//gA//gAAf/4A//wB//gAA//4A///P//8AH//4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////gAP//////////gAP//////////AAH//////////AAD/////////+AAD///+/////8AAB///8f////wAAAf//4P////AAAAH//wD///8AAAAA/+AAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAAAAAAAAB///+AA/+AAAAP////gA//wAAAf////wA//4AAB/////4A//8AAD/////8A//+AAD/////+A///AAH/////+A///AAP//////A///gAP//////A///gAf//////A///wAf//////A///wAf//////A///wAf//////A///wA///////AB//4A//4AD//AAP/4A//gAB//AAP/4A//gAA//AAP/4A//gAA/+AAP/4A//gAB/8AAP/4A//wAB/8AAf/4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH/////////+AAD/////////8AAB/////////4AAAf////////wAAAP////////AAAAB///////4AAAAAD/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAB/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("EiAnGicnJycnJycnEw=="), 78+(scale<<8)+(1<<16)); +}; + +// variables defined from settings +var secondsOnUnlock; +var secondsAlways; +var dateAsISO; +var longDate; +var weekDay; +var upperCase; + +// dynamic variables +var drawTimeout; +var queueMillis=1000; +var withSeconds=true; + +var isBangle1=(g.getWidth()==240); + +/* For development purposes +require('Storage').writeJSON(SETTINGSFILE, { + secondsOnUnlock: false, + secondsAlways: false, + dateAsISO: false, + longDate: true, + weekDay: true, + upperCase: true +}); +*/ + +function def(value,def) { + return (value!==undefined?value:def); } -// timeout used to update every minute -var drawTimeout; +function loadSettings() { + var settings = require('Storage').readJSON(SETTINGSFILE, true) || {}; + secondsOnUnlock = def(settings.secondsOnUnlock,true); + secondsAlways = def(settings.secondsAlways,false); + dateAsISO = def(settings.dateAsISO,true); + longDate = def(settings.longDate,true); + weekDay = def(settings.weekDay,true); + upperCase = def(settings.upperCase,false); +} // schedule a draw for the next minute function queueDraw() { @@ -12,50 +53,111 @@ function queueDraw() { drawTimeout = setTimeout(function() { drawTimeout = undefined; draw(); - }, 60000 - (Date.now() % 60000)); + }, queueMillis - (Date.now() % queueMillis)); } - -function draw() { - var x = g.getWidth()/2; - var y = g.getHeight()/2; - g.reset(); - var date = new Date(); - var timeStr = require("locale").time(date,1); - var dateStr = require("locale").date(date).toUpperCase(); - var dowStr = require("locale").dow(date).toUpperCase(); - // draw time - g.setFontAlign(0,0).setFont("Anton"); - g.clearRect(0,y-40,g.getWidth(),y+35); // clear the background - g.drawString(timeStr,x,y); - // draw date - y += 40; - g.setFontAlign(0,0).setFont("6x8",2); - g.clearRect(0,y-8,g.getWidth(),y+8); // clear the background - g.drawString(dateStr,x,y); - //draw day of week - y += 16; - g.clearRect(0,y-8,g.getWidth(),y+8); // clear the background - g.drawString(dowStr,x,y); - // queue draw in one minute - queueDraw(); -} - -// Clear the screen once, at startup -g.clear(); -// draw immediately at first, queue update -draw(); -// Stop updates when LCD is off, restart when on -Bangle.on('lcdPower',on=>{ - if (on) { +function updateState() { + if (Bangle.isLCDOn()) { + if ((secondsOnUnlock && !Bangle.isLocked()) || secondsAlways) { + withSeconds=true; + queueMillis=1000; + } else { + withSeconds=false; + queueMillis=60000; + } draw(); // draw immediately, queue redraw } else { // stop draw timer if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = undefined; } -}); +} + +function isoStr(date) { + return date.getFullYear()+"-"+("0" + (date.getMonth()+1)).substr(-2)+"-"+("0" + date.getDate()).substr(-2); +} + +function doColor() { + return !isBangle1 && !Bangle.isLocked(); +} + +function draw() { + var x = g.getWidth()/2; + var y = g.getHeight()/2; + if (secondsOnUnlock || secondsAlways) + y-= 25; + g.reset(); + g.clearRect(0,24,g.getWidth(),g.getHeight()); // clear whole background + var date = new Date(); + var timeStr = require("locale").time(date,1); + // draw time + g.setFontAlign(0,0).setFont("Anton"); + g.drawString(timeStr,x,y); + if (withSeconds) { + y+=77; + var secStr = ":"+("0" + date.getSeconds()).substr(-2); + g.setFontAlign(1,0).setFont("Anton"); + if (doColor()) + g.setColor(0,0,1); + g.drawString(secStr,g.getWidth()-(isBangle1?32:2),y); + y-=77; + y+=60; + x=g.getWidth()/4+(isBangle1?12:-4); + var dateStr2=(dateAsISO?isoStr(date):require("locale").date(date,1)); + var year; + var md; + var yearfirst; + if (dateStr2.match(/\d\d\d\d$/)) { + year=dateStr2.slice(-4); + md=dateStr2.slice(0,-4); + if (!md.endsWith(".")) + md=md.slice(0,-1); + yearfirst=false; + } + else { + if (!dateStr2.match(/^\d\d\d\d/)) + dateStr2=isoStr(date); + year=dateStr2.slice(0,4); + md=dateStr2.slice(5); + yearfirst=true; + } + g.setFontAlign(0,0).setFont("Vector",24); + if (doColor()) + g.setColor(1,0,0); + g.drawString(md,x,(yearfirst?y+28:y)); + g.drawString(year,x,(yearfirst?y:y+28)); + } + else { + y+=52; + var dateStr = (dateAsISO?isoStr(date):require("locale").date(date,(longDate?0:1))); + if (upperCase) + dateStr=dateStr.toUpperCase(); + g.setFontAlign(0,0).setFont("Vector",24); + g.drawString(dateStr,x,y); + if (weekDay) { + var dowStr = require("locale").dow(date); + if (upperCase) + dowStr=dowStr.toUpperCase(); + g.drawString(dowStr,x,y+28); + } + } + + // queue next draw + queueDraw(); +} + +// Init the settings of the app +loadSettings(); +// Clear the screen once, at startup +g.clear(); +// Set dynamic state and perform initial drawing +updateState(); +// Register hooks for LCD on/off event and screen lock on/off event +Bangle.on('lcdPower',on=>{ updateState(); }); +Bangle.on('lock',on=>{ updateState(); }); // Show launcher when middle button pressed Bangle.setUI("clock"); // Load widgets Bangle.loadWidgets(); Bangle.drawWidgets(); + +// end of file diff --git a/apps/antonclk/app.png b/apps/antonclk/app.png index d96f1775886e280f46652131b7e8c747fd28bf39..a38093c5f3b6f88dbc9b75017422dbe237d4407f 100644 GIT binary patch delta 1986 zcmV;z2R-=r1;r1L8Gix*007uvZqNV#2aHKXK~z}7?O0t*Q&$}S(aJ|1h>ls;g4h+@ zB+AGl)8UNHxGbA|xTyGG;sOsoEFnM;B+-{a7Q@E_V_6nMW&&<;@}SXB3>rlzVu;X< zRWXwk`@zScE!aY#?d`|e!>RXPZf_BAEI#a?lbioJ=XcKe-G6(||Kr>ULI_?bk>E9x z{|Wt1=v8G^xDKDsH!(3`G#X=LV-*U8TrOXDqLGmilgUK&#Kc6EN+kdc4-cEoX0}QQ z*}i?dOePafM8w2kFdRO7m=7x{DH$0V5e0j_-m_=V3Z|{9s&YD=eAwyJrv(^`#S%K3 z2qBxzmYSLx`hN`y3JT`t=0fr3&YhD;M7F-UxtYZ<46||L#$^(^di83!ed+D(C4@{& zOjs-yi^VcGH|KCTl9H16n23l7R(HGIbWWX4$8TSNkjR^LcXzY8Ua#-%?PaT@qoV@@ z0~H&dOV(ykrCQkT3X65OnG@Zi=UX7pnuAvM~@a65=02q*VnUpQc}{o zb?ew_S63H*UcpOeWMo7}M)E(H!{MOHjT<+pQd3j2Oe+(oFOl#G1p(}#J#>U2O z-@eU%9{^UX^}>Y<0168WUuvx{Ar!jtTeog?yWPRTtL6=FZEYMVBWjNgS_V&)sPS%G}B_$%Z5oY6qtTenW{1Nu^g`m} z<4>G8QB+jKf{jMwlP6E8URztc{8*NimDSVJLv{8QshCWryu3WB-@kuHJ4%z_z)>FVmDx>~KaTCMyOIXO8QA0HnT74;HACXwg7ckH-_vDjOOaLMP{&$oTm9qN2UoY*s3j zp$k-3SBvIDeSLkQ;GCQstJS(Np~a>jgpg;?o|ToA30{|B7!pRFK7CqOSGQ-+9vU&4 zo0~=15JIkBzg|&MQBhHG^5n^>si{yvL^#7CggBi}n!+lT%5dRAkoEfg{-~&^mwyJV zg`(%{c5_{|Li5heVRRH03*>SnCSvt!A;4yX)rzSpC=^gC5figulK+bG%P%A?jR3)- zRuhee>z$q^RaIOsK(=io_wFrts9#0e+U70BmOFQXfFFJk2WYhdLRKr$>4@J?2q6v! z`Qs1b^%6qJ>@4Z+CDg1@L7z6pDG^{(i2SkbpPdKwMlnD;pTVci*9=hFgSs zgt0MHSEIZfVy=i!h!F4{kf=Wi^-z~Cfu=;}wcszLg7?YD27=M7%NyqKl1-Cm`wryLQYX}5_n<$Y$t;Rd=@Cijlp`igT z7pA8X8;jgrI2<^029c4dtqtxYA+Xy~SqZxxem@;2l_EMiSR_mQl~P#=wHoig549R) zWtf>+0YAjI`L;Gf2&t&xTJ(C-(h}Cne*HDfRr)^@l?oqxz*T?xiGSU)*;zC{H zE;Kda=byp9j!jSF`|t7mIj3K~jM-Uw_S)K@(Lke_XY-4Z^XGBv7Lt>LRjn4!pHo7A z{t3Gs9uLjDk)4gKEL^_K4gLLhIGynM0N~CYeEB6*D%`pSU~mw5dC1L0ZZ0gAr4fpb z#+z^A-FJgkyB$6sHGlhEyD&AyUdQ2bp|us6nb7Oe-Hnew#wVYEy>UvVFc>g11H1h{ ziS|=dXl%rhBS=q&%Y_36AV}0d{S^-&q4nIc68v%6&MW2&W1#Sn>XQf;(x2J0BqTUEnC3*|HA1l zEy&D-(a5<(Lh$z69KdWwOblM!|B#xBHEXEZd%eW%CT=(JdO4k+urdq>AVk>96Q`5N z<>FSIpHBh-Vlss_`<9lKNk2L}#ngwjPIXiTSuzz@0DyR1QVY3BO*tgz-R4N2842(v2JWwjJb}a{Z?UMX|0QIbl USs20!PXGV_07*qoM6N<$g0gzc;Q#;t delta 746 zcmV#Upe&?7suvS{7$`q%$XUdCYatL*UM&qYkz00_3gdZkp%IXiY3DTK~M*l*UhrGbOTH@s=dXV zf09G{s><3KAL0N6xR{=cL_nHCF0Qe5xz8(%f`4q@m5r`n_Xa#UzVHyArFz-Gc zKm+!|0~`-toKmZ@`fYBHXFhRJxmIAUji{nSriljb1AkP<@icA%+OjwZJs^29h?!Ef z-TemQ2C)dzr(Mf2wV1+4Ie;xTq4hl^_`-nK0TfEH`ypDS7J#jPXdpM>j2NN40NJq# z{&FFNH{#+t0W5K}=m5aZI0(+a83M-^4*{K7!lef}MT5(z_;g8nFi@MU!y9& z0D~Ga2Y=`lS%av@1!#4Vgg00wzKaaIJ2L@bNR#tpBy|nIlrv8rGG@(^FsdRJ-QP{XzCF~qci@anb7w@o;375x%BD_RYP}fDMfEo&3+L6^SSGaoh~4+ z$TC{G#j66=9oYBrc}77;VUgTDWelk_cCxHK`(vE&O}8IO0(v{XR&*Uo8wB1qJ*#jG z=4;wIwv|`|g31@bP&0h$WpisvZdEEkr`;hEFPcka7#vXBt?hE5xty{J^%m!07*qoM6N<$f`mLmfdBvi diff --git a/apps/antonclk/screenshot.png b/apps/antonclk/screenshot.png index c66f8bdd85c6c2acef19f20ff86dab7b1d9c6a3f..e949b8a24a4eac5cbd8f8a01ffdd57b3660b939c 100644 GIT binary patch delta 1612 zcmV-S2DACN1AlTS_;6Lfh=O!<|dqR0_rLj7-Gw6Z=mpp~2Trq^-sN$JXdw$RVuL zh2YN@K!k`6Pvr(ctjI(h8vf-F??mA#V@N4cYlvqI5okD%_;DP$JZ&Vq6!#OKe-2k= zTnY^!SWV;*Zhz&*?VkZ+T^e4FIMl4veaLv{kHiaY8ZJ4eOESUYRxBF6&rgK#5Xh#u zh^d_lGqUH{I#wmxlgh#wCnl!sX>jup40b>oT>LaiC5grV6yh5Y9s#T=rCdP_t1Cx7#uck6xw7CA)cmrN5Z z87(9agn^YANE_|bKkF>#Mh8M)8{$o5Cc8FRku2BfXl|D&q@GEB?SUN zAVavl{C^WbAb>!j%1%GIf&mFAH!(qn65YGTfB^eSxzyv^$ znVJGY8u8OfjN&<1-1>p|YKvQ0+=BCwv6TPI8h=j}(Y+yF1hHNYWjJb$33G_!II4DC zYVYQgVzm5w4K066RQR$ zvwt8Zm9^v%t&H@Hld&C=2LdZkV~V_>mBE*gfqO6qLeCZ&EsxUX*dAgmD-(t+LdIBD z7TmHy4l#+9`?qdRmZG|C)Cpzfh8v!>R7ug!2o7TC+uL5DUQL!?a#=z*HhC~Vr)qVlOVN{y2 zklNJprC*XtHyUc&5!~YRr73`LqoJxb@eOZJ4FZHG4SH=h_X`lCj+~MJ0@MHk_kf20 zxI*nMw_H*_2e}ycP|(HMkbBF0z5e<%9(or`Sg5dpWvA=*b`#zXp8drkAN2RV*MCku z^?-Q(Z1XqWwZ5h7#X}uLbRL-FFuL~(NzMJ{(r4=OEpLZP?_ykel#uZ>096FuUR>L< z9||t3+g@&Qkg^lU5FH4;+Rvk^M14T$`Lb1ilwhc`^UHwg1x(z7M3`-OzIJGsn+dg$ z0S$xGhm%5v`^6g?a>x^Jt{i4z;qd9(eZbJ6z7d?iIaz8J!^HVTx zo9(q;$U}H#Q@rsIJ!F{GjVOA^kfNdF-(`s*Uc>^z>^110uXiK=kikpwc!)Y0WD%jD z2nvLwW4P@LN&@8&;lso_aeu7&T&yhCt);PFdrdySbO84-x`!%T%P5Hpwfi}H`fc7s zO1ffKWuQBZ&3>p&s?%ZLn2L9trF-BI>6BmP3pBu=Lt)VGrBgx%c0I{@_ z`211;5uG+;5CLLcC&7UsL7Dj3re&u9;mm}_0Zcuu0fZ+LF6V67o<%|j6U86bJI}4B z1!gJ* literal 696 zcmeAS@N?(olHy`uVBq!ia0vp^8$g(e8Ax8b$#WJ+v7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaf5VPl)UP|Nj{nfCxnV zoVS%9$Y4zJc6VXuV3qX%a@b2eeO=j~a*A_n%Kez1upTJA($mE;B;xSfYk_%(6?oVZ znx=@`mzU45aNRCkV(xU;^}@Uf{u^iKUb%22k=ZHgn#betkjQJ(wHVdc3iO{Um?DvM z`p1?79g#H?tfriI+96!Z*U!BsRg8cA`*^+i+8-jC+ouPvJND@90YimZJatyS5s?c& zt+tgDzj5GhL5XDLnY<58YfnAMc=^fV))bq*ZM!#=oOaa8IaTDs-PyLkAzNAs4m9XOIF3zyu2a|McptHjh`Yyi=a@ZK4iEEpI(UHx3vIVCg!011y7eE back(), + "Seconds...": () => E.showMenu(secmenu), + "ISO8601 date": { + value: (settings.dateAsISO !== undefined ? settings.dateAsISO : false), + format: v => v ? "On" : "Off", + onchange: v => { + settings.dateAsISO = v; + writeSettings(); + } + }, + "Long date": { + value: (settings.longDate !== undefined ? settings.longDate : true), + format: v => v ? "On" : "Off", + onchange: v => { + settings.longDate = v; + writeSettings(); + } + }, + "Show Weekday": { + value: (settings.weekDay !== undefined ? settings.weekDay : true), + format: v => v ? "On" : "Off", + onchange: v => { + settings.weekDay = v; + writeSettings(); + } + }, + "Uppercase": { + value: (settings.upperCase !== undefined ? settings.upperCase : false), + format: v => v ? "On" : "Off", + onchange: v => { + settings.upperCase = v; + writeSettings(); + } + }, + }; + + // Submenu + var secmenu = { + "": { + "title": "Show seconds..." + }, + "< Back": () => E.showMenu(mainmenu), + "If unlocked": { + value: (settings.secondsOnUnlock !== undefined ? settings.secondsOnUnlock : true), + format: v => v ? "On" : "Off", + onchange: v => { + settings.secondsOnUnlock = v; + if (v) + settings.secondsAlways = false; + writeSettings(); + } + }, + "Always": { + value: (settings.secondsAlways !== undefined ? settings.secondsAlways : false), + format: v => v ? "On" : "Off", + onchange: v => { + settings.secondsAlways = v; + if (v) + settings.secondsOnUnlock = false; + writeSettings(); + } + } + }; + + // Actually display the menu + E.showMenu(mainmenu); + +}); + +// end of file From a245fa748d3bb4e8b06c0c298af9122262342914 Mon Sep 17 00:00:00 2001 From: "Dirk Hillbrecht (home)" Date: Sat, 25 Dec 2021 21:55:23 +0100 Subject: [PATCH 2/5] Anton clock: Coloured seconds, date format config, small enhancements Result of the feedback on the first version. --- apps/antonclk/app.js | 157 +++++++++++++++++++++----------------- apps/antonclk/settings.js | 38 +++++---- 2 files changed, 111 insertions(+), 84 deletions(-) diff --git a/apps/antonclk/app.js b/apps/antonclk/app.js index 3b9c14c46..31ba696b7 100644 --- a/apps/antonclk/app.js +++ b/apps/antonclk/app.js @@ -1,6 +1,6 @@ // Clock with large digits using the "Anton" bold font -var SETTINGSFILE="antonclk.json"; +var SETTINGSFILE = "antonclk.json"; Graphics.prototype.setFontAnton = function(scale) { // Actual height 69 (68 - 0) @@ -10,44 +10,56 @@ Graphics.prototype.setFontAnton = function(scale) { // variables defined from settings var secondsOnUnlock; var secondsAlways; +var secondsColoured; var dateAsISO; +var dateOnSecs; var longDate; var weekDay; var upperCase; // dynamic variables var drawTimeout; -var queueMillis=1000; -var withSeconds=true; +var queueMillis = 1000; +var secondsScreen = true; -var isBangle1=(g.getWidth()==240); +var isBangle1 = (g.getWidth() == 240); /* For development purposes require('Storage').writeJSON(SETTINGSFILE, { secondsOnUnlock: false, secondsAlways: false, + secondsColoured: true, dateAsISO: false, + dateOnSecs: true, longDate: true, weekDay: true, - upperCase: true + upperCase: false, }); -*/ +/* */ -function def(value,def) { - return (value!==undefined?value:def); +/* OR (also for development purposes) +require('Storage').erase(SETTINGSFILE); +/* */ + +// Helper method for loading the settings +function def(value, def) { + return (value !== undefined ? value : def); } +// Load settings function loadSettings() { var settings = require('Storage').readJSON(SETTINGSFILE, true) || {}; - secondsOnUnlock = def(settings.secondsOnUnlock,true); - secondsAlways = def(settings.secondsAlways,false); - dateAsISO = def(settings.dateAsISO,true); - longDate = def(settings.longDate,true); - weekDay = def(settings.weekDay,true); - upperCase = def(settings.upperCase,false); + 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); } -// schedule a draw for the next minute +// schedule a draw for the next second or minute function queueDraw() { if (drawTimeout) clearTimeout(drawTimeout); drawTimeout = setTimeout(function() { @@ -59,11 +71,11 @@ function queueDraw() { function updateState() { if (Bangle.isLCDOn()) { if ((secondsOnUnlock && !Bangle.isLocked()) || secondsAlways) { - withSeconds=true; - queueMillis=1000; + secondsScreen = true; + queueMillis = 1000; } else { - withSeconds=false; - queueMillis=60000; + secondsScreen = false; + queueMillis = 60000; } draw(); // draw immediately, queue redraw } else { // stop draw timer @@ -73,71 +85,70 @@ function updateState() { } function isoStr(date) { - return date.getFullYear()+"-"+("0" + (date.getMonth()+1)).substr(-2)+"-"+("0" + date.getDate()).substr(-2); + return date.getFullYear() + "-" + ("0" + (date.getMonth() + 1)).substr(-2) + "-" + ("0" + date.getDate()).substr(-2); } function doColor() { - return !isBangle1 && !Bangle.isLocked(); + return !isBangle1 && !Bangle.isLocked() && secondsColoured; } function draw() { - var x = g.getWidth()/2; - var y = g.getHeight()/2; - if (secondsOnUnlock || secondsAlways) - y-= 25; + var x = g.getWidth() / 2; + var y = g.getHeight() / 2 - (secondsOnUnlock || secondsAlways ? 24 : 12); g.reset(); - g.clearRect(0,24,g.getWidth(),g.getHeight()); // clear whole background + g.clearRect(0, 24, g.getWidth(), g.getHeight()); // clear whole background var date = new Date(); - var timeStr = require("locale").time(date,1); + var timeStr = require("locale").time(date, 1); // draw time - g.setFontAlign(0,0).setFont("Anton"); - g.drawString(timeStr,x,y); - if (withSeconds) { - y+=77; - var secStr = ":"+("0" + date.getSeconds()).substr(-2); - g.setFontAlign(1,0).setFont("Anton"); + g.setFontAlign(0, 0).setFont("Anton"); + g.drawString(timeStr, x, y); + if (secondsScreen) { + y += 76; + var secStr = ":" + ("0" + date.getSeconds()).substr(-2); if (doColor()) - g.setColor(0,0,1); - g.drawString(secStr,g.getWidth()-(isBangle1?32:2),y); - y-=77; - y+=60; - x=g.getWidth()/4+(isBangle1?12:-4); - var dateStr2=(dateAsISO?isoStr(date):require("locale").date(date,1)); - var year; - var md; - var yearfirst; - if (dateStr2.match(/\d\d\d\d$/)) { - year=dateStr2.slice(-4); - md=dateStr2.slice(0,-4); - if (!md.endsWith(".")) - md=md.slice(0,-1); - yearfirst=false; + g.setColor(0, 0, 1); + g.setFont("Anton"); + if (dateOnSecs) { + g.setFontAlign(1, 0).drawString(secStr, g.getWidth() - (isBangle1 ? 32 : 2), y); + y -= 16; + x = g.getWidth() / 4 + (isBangle1 ? 12 : -4); + var dateStr2 = (dateAsISO ? isoStr(date) : require("locale").date(date, 1)); + var year; + var md; + var yearfirst; + if (dateStr2.match(/\d\d\d\d$/)) { + year = dateStr2.slice(-4); + md = dateStr2.slice(0, -4); + if (!md.endsWith(".")) + md = md.slice(0, -1); + yearfirst = false; + } else { + if (!dateStr2.match(/^\d\d\d\d/)) + dateStr2 = isoStr(date); + year = dateStr2.slice(0, 4); + md = dateStr2.slice(5); + yearfirst = true; + } + g.setFontAlign(0, 0).setFont("Vector", 24); + if (doColor()) + g.setColor(1, 0, 0); + g.drawString(md, x, (yearfirst ? y + 28 : y)); + g.drawString(year, x, (yearfirst ? y : y + 28)); + } else { + g.setFontAlign(0, 0).drawString(secStr, x, y); } - else { - if (!dateStr2.match(/^\d\d\d\d/)) - dateStr2=isoStr(date); - year=dateStr2.slice(0,4); - md=dateStr2.slice(5); - yearfirst=true; - } - g.setFontAlign(0,0).setFont("Vector",24); - if (doColor()) - g.setColor(1,0,0); - g.drawString(md,x,(yearfirst?y+28:y)); - g.drawString(year,x,(yearfirst?y:y+28)); - } - else { - y+=52; - var dateStr = (dateAsISO?isoStr(date):require("locale").date(date,(longDate?0:1))); + } else { // No seconds screen + y += 50; + var dateStr = (dateAsISO ? isoStr(date) : require("locale").date(date, (longDate ? 0 : 1))); if (upperCase) - dateStr=dateStr.toUpperCase(); - g.setFontAlign(0,0).setFont("Vector",24); - g.drawString(dateStr,x,y); + dateStr = dateStr.toUpperCase(); + g.setFontAlign(0, 0).setFont("Vector", 24); + g.drawString(dateStr, x, y); if (weekDay) { var dowStr = require("locale").dow(date); if (upperCase) - dowStr=dowStr.toUpperCase(); - g.drawString(dowStr,x,y+28); + dowStr = dowStr.toUpperCase(); + g.drawString(dowStr, x, y + 26); } } @@ -152,8 +163,12 @@ g.clear(); // Set dynamic state and perform initial drawing updateState(); // Register hooks for LCD on/off event and screen lock on/off event -Bangle.on('lcdPower',on=>{ updateState(); }); -Bangle.on('lock',on=>{ updateState(); }); +Bangle.on('lcdPower', on => { + updateState(); +}); +Bangle.on('lock', on => { + updateState(); +}); // Show launcher when middle button pressed Bangle.setUI("clock"); // Load widgets diff --git a/apps/antonclk/settings.js b/apps/antonclk/settings.js index 22cae41fb..2bcc1d7ce 100644 --- a/apps/antonclk/settings.js +++ b/apps/antonclk/settings.js @@ -4,7 +4,7 @@ var FILE = "antonclk.json"; // Load settings var settings = Object.assign({ - secondsOnUnlock: true, + secondsOnUnlock: false, }, require('Storage').readJSON(FILE, true) || {}); function writeSettings() { @@ -57,23 +57,35 @@ "title": "Show seconds..." }, "< Back": () => E.showMenu(mainmenu), - "If unlocked": { - value: (settings.secondsOnUnlock !== undefined ? settings.secondsOnUnlock : true), - format: v => v ? "On" : "Off", - onchange: v => { - settings.secondsOnUnlock = v; - if (v) - settings.secondsAlways = false; - writeSettings(); - } - }, "Always": { value: (settings.secondsAlways !== undefined ? settings.secondsAlways : false), format: v => v ? "On" : "Off", onchange: v => { settings.secondsAlways = v; - if (v) - settings.secondsOnUnlock = false; + writeSettings(); + } + }, + "If unlocked": { + value: (settings.secondsOnUnlock !== undefined ? settings.secondsOnUnlock : false), + format: v => v ? "On" : "Off", + onchange: v => { + settings.secondsOnUnlock = v; + writeSettings(); + } + }, + "Coloured": { + value: (settings.secondsColoured !== undefined ? settings.secondsColoured : false), + format: v => v ? "On" : "Off", + onchange: v => { + settings.secondsColoured = v; + writeSettings(); + } + }, + "With date": { + value: (settings.dateOnSecs !== undefined ? settings.dateOnSecs : false), + format: v => v ? "On" : "Off", + onchange: v => { + settings.dateOnSecs = v; writeSettings(); } } From 322a3a0b5aed5a697347b966ebd7d1e8ccb1370b Mon Sep 17 00:00:00 2001 From: "Dirk Hillbrecht (home)" Date: Sat, 25 Dec 2021 21:55:30 +0100 Subject: [PATCH 3/5] Anton clock: README added --- apps.json | 1 + apps/antonclk/README.md | 66 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 apps/antonclk/README.md diff --git a/apps.json b/apps.json index b0d74926b..3411befc8 100644 --- a/apps.json +++ b/apps.json @@ -4240,6 +4240,7 @@ "name": "Anton Clock", "version": "0.04", "description": "A clock using the bold Anton font, optionally showing seconds and date in ISO-8601 format.", + "readme":"README.md", "icon": "app.png", "screenshots": [{"url":"screenshot.png"}], "type": "clock", diff --git a/apps/antonclk/README.md b/apps/antonclk/README.md new file mode 100644 index 000000000..40aa9d457 --- /dev/null +++ b/apps/antonclk/README.md @@ -0,0 +1,66 @@ +# Anton Clock - Large font digital watch with seconds and date + +Anton clock uses the "Anton" bold font to show the time in a clear, easily readable manner. On the Bangle.js 2, the time can be read easily even if the screen is locked and unlit. + +## Features + +The basic time representation only shows hours and minutes of the current time. However, Anton clock can show additional information: + +* Seconds can be shown, either always or only if the screen is unlocked. +* To help easy recognition, the seconds can be coloured in blue on the Bangle.js 2. +* Date can be shown in three different formats: + * ISO-8601: 2021-12-19 + * short local format: 19/12/2021, 19.12.2021 + * long local format (not together with seconds): DEC 19 2021 +* Weekday can be shown (not together with seconds) + +## Usage + +Install Anton clock through the Bangle.js app loader. +Configure it through the default Bangle.js configuration mechanism +(Settings app, "Apps" menu, "Anton clock" submenu). +If you like it, make it your default watch face +(Settings app, "System" menu, "Clock" submenu, select "Anton clock"). + +## Configuration + +Anton clock is configured by the standard settings mechanism of Bangle.js's operating system: +Open the "Settings" app, then the "Apps" submenu and below it the "Anton clock" menu. +You configure Anton clock through several "on/off" switches in two menus. + +### The main menu + +The main menu contains several settings covering Anton clock in general. + +* **Seconds...** - Opens the submenu for configuring the presentation of the current time's seconds. +* **ISO8601 date** - Show the date in ISO-8601 format, irrespective of the current locale. +* **Long date** - Show the date in long format (usually with month in letters instead of number). +Exact format depends on the current locale. _Only evaluated if ISO8601 date is not set._ +* **Show Weekday** - Weekday is shown in the time presentation without seconds. +Weekday name depends on the current locale. +If seconds are shown, the weekday is never shown as there is not enough space on the watch face. +* **Uppercase** - Weekday name and month name in the long format are converted to upper case letters. +This can improve readability. + +### The "Seconds" submenu + +The "Seconds" submenu configures how (and if) seconds are shown on the "Anton" watch face. + +* **Always** - Seconds are _always_ shown, irrespective of the display's unlock state. +If this is enabled, weekdays will never been shown. +_Enabling this option increases power consumption as the watch face will update once per second instead of once per minute._ +* **If unlocked** - Seconds are shown if the display is unlocked. +On a locked display, only hour, minutes, date and weekday are shown. +"Always" overrides this option. +_This option is highly recommended on the Bangle.js 2!_ +* **Coloured** - If enabled, seconds are shown in blue instead of black. +This make the visual orientation much easier on the watch face. +* **With date** - If enabled, the date is shown together with the seconds. +Depending on the "ISO8601 date" settings, ISO8601 or short local format is used. +The date is coloured in red if the "Coloured" option is chosen. + +If neither "Always" nor "If unlocked" is selected, Anton clock does _never_ show seconds. + +## Compatibility + +Anton clock makes use of core Bangle.js 2 features (coloured display, display lock state). It also runs on the Bangle.js 1 but these features are not available there due to the hardware features. From 7829af0ef29837e829d4c13ef9c63f89cfdbb82e Mon Sep 17 00:00:00 2001 From: "Dirk Hillbrecht (home)" Date: Sun, 26 Dec 2021 19:42:04 +0100 Subject: [PATCH 4/5] Anton clock: Switch between vector and 6x8 font for date and day of week --- apps/antonclk/README.md | 3 ++ apps/antonclk/app.js | 60 +++++++++++++++++++++++---------------- apps/antonclk/settings.js | 8 ++++++ 3 files changed, 46 insertions(+), 25 deletions(-) diff --git a/apps/antonclk/README.md b/apps/antonclk/README.md index 40aa9d457..cb37d566b 100644 --- a/apps/antonclk/README.md +++ b/apps/antonclk/README.md @@ -41,6 +41,9 @@ Weekday name depends on the current locale. If seconds are shown, the weekday is never shown as there is not enough space on the watch face. * **Uppercase** - Weekday name and month name in the long format are converted to upper case letters. This can improve readability. +* **Vector font** - Use the built-in vector font for dates and weekday. +This can improve readability. +Otherwise, a scaled version of the built-in 6x8 pixels font is used. ### The "Seconds" submenu diff --git a/apps/antonclk/app.js b/apps/antonclk/app.js index 31ba696b7..e772d679d 100644 --- a/apps/antonclk/app.js +++ b/apps/antonclk/app.js @@ -16,6 +16,7 @@ var dateOnSecs; var longDate; var weekDay; var upperCase; +var vectorFont; // dynamic variables var drawTimeout; @@ -34,6 +35,7 @@ require('Storage').writeJSON(SETTINGSFILE, { longDate: true, weekDay: true, upperCase: false, + vectorFont: false, }); /* */ @@ -57,6 +59,7 @@ function loadSettings() { longDate = def(settings.longDate, true); weekDay = def(settings.weekDay, true); upperCase = def(settings.upperCase, true); + vectorFont = def(settings.vectorFont, false); } // schedule a draw for the next second or minute @@ -92,63 +95,70 @@ function doColor() { return !isBangle1 && !Bangle.isLocked() && secondsColoured; } +// Actually draw the watch face function draw() { var x = g.getWidth() / 2; - var y = g.getHeight() / 2 - (secondsOnUnlock || secondsAlways ? 24 : 12); + var y = g.getHeight() / 2 - (secondsOnUnlock || secondsAlways ? 24 : (vectorFont ? 12 : 0)); g.reset(); g.clearRect(0, 24, g.getWidth(), g.getHeight()); // clear whole background - var date = new Date(); - var timeStr = require("locale").time(date, 1); - // draw time - g.setFontAlign(0, 0).setFont("Anton"); - g.drawString(timeStr, x, y); + 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 if (secondsScreen) { y += 76; var secStr = ":" + ("0" + date.getSeconds()).substr(-2); if (doColor()) g.setColor(0, 0, 1); g.setFont("Anton"); - if (dateOnSecs) { - g.setFontAlign(1, 0).drawString(secStr, g.getWidth() - (isBangle1 ? 32 : 2), y); - y -= 16; - x = g.getWidth() / 4 + (isBangle1 ? 12 : -4); + 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); var dateStr2 = (dateAsISO ? isoStr(date) : require("locale").date(date, 1)); var year; var md; var yearfirst; - if (dateStr2.match(/\d\d\d\d$/)) { + if (dateStr2.match(/\d\d\d\d$/)) { // formatted date ends with year year = dateStr2.slice(-4); md = dateStr2.slice(0, -4); - if (!md.endsWith(".")) + if (!md.endsWith(".")) // keep separator before the year only if it is a dot (31.12. but 31/12) md = md.slice(0, -1); yearfirst = false; - } else { - if (!dateStr2.match(/^\d\d\d\d/)) - dateStr2 = isoStr(date); + } 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 year = dateStr2.slice(0, 4); - md = dateStr2.slice(5); + md = dateStr2.slice(5); // never keep separator directly after year yearfirst = true; } - g.setFontAlign(0, 0).setFont("Vector", 24); + g.setFontAlign(0, 0); + if (vectorFont) + g.setFont("Vector", 24); + else + g.setFont("6x8", 2); if (doColor()) g.setColor(1, 0, 0); - g.drawString(md, x, (yearfirst ? y + 28 : y)); - g.drawString(year, x, (yearfirst ? y : y + 28)); + g.drawString(md, x, (yearfirst ? y + (vectorFont ? 26 : 16) : y)); + g.drawString(year, x, (yearfirst ? y : y + (vectorFont ? 26 : 16))); } else { - g.setFontAlign(0, 0).drawString(secStr, x, y); + g.setFontAlign(0, 0).drawString(secStr, x, y); // Just the seconds centered } - } else { // No seconds screen - y += 50; + } else { // No seconds screen: Show date and optionally day of week + y += (vectorFont ? 50 : (secondsOnUnlock || secondsAlways) ? 52 : 40); var dateStr = (dateAsISO ? isoStr(date) : require("locale").date(date, (longDate ? 0 : 1))); if (upperCase) dateStr = dateStr.toUpperCase(); - g.setFontAlign(0, 0).setFont("Vector", 24); + g.setFontAlign(0, 0); + if (vectorFont) + g.setFont("Vector", 24); + else + g.setFont("6x8", 2); g.drawString(dateStr, x, y); if (weekDay) { var dowStr = require("locale").dow(date); if (upperCase) dowStr = dowStr.toUpperCase(); - g.drawString(dowStr, x, y + 26); + g.drawString(dowStr, x, y + (vectorFont ? 26 : 16)); } } @@ -175,4 +185,4 @@ Bangle.setUI("clock"); Bangle.loadWidgets(); Bangle.drawWidgets(); -// end of file +// end of file \ No newline at end of file diff --git a/apps/antonclk/settings.js b/apps/antonclk/settings.js index 2bcc1d7ce..3af9df292 100644 --- a/apps/antonclk/settings.js +++ b/apps/antonclk/settings.js @@ -49,6 +49,14 @@ writeSettings(); } }, + "Vector font": { + value: (settings.vectorFont !== undefined ? settings.vectorFont : false), + format: v => v ? "On" : "Off", + onchange: v => { + settings.vectorFont = v; + writeSettings(); + } + }, }; // Submenu From d36743032c878bd73fdda87cf0b22d5b8e002b10 Mon Sep 17 00:00:00 2001 From: "Dirk Hillbrecht (home)" Date: Wed, 5 Jan 2022 22:21:55 +0100 Subject: [PATCH 5/5] Anton clock: Smaller seconds, weekday with seconds, seconds without colon, cleaner configuration --- apps/antonclk/README.md | 42 ++++++++++++-------- apps/antonclk/app.js | 81 +++++++++++++++++++++++---------------- apps/antonclk/settings.js | 64 ++++++++++++++----------------- 3 files changed, 101 insertions(+), 86 deletions(-) diff --git a/apps/antonclk/README.md b/apps/antonclk/README.md index cb37d566b..41d3e4559 100644 --- a/apps/antonclk/README.md +++ b/apps/antonclk/README.md @@ -11,8 +11,8 @@ The basic time representation only shows hours and minutes of the current time. * Date can be shown in three different formats: * ISO-8601: 2021-12-19 * short local format: 19/12/2021, 19.12.2021 - * long local format (not together with seconds): DEC 19 2021 -* Weekday can be shown (not together with seconds) + * long local format: DEC 19 2021 +* Weekday can be shown (on seconds screen only instead of year) ## Usage @@ -33,9 +33,10 @@ You configure Anton clock through several "on/off" switches in two menus. The main menu contains several settings covering Anton clock in general. * **Seconds...** - Opens the submenu for configuring the presentation of the current time's seconds. -* **ISO8601 date** - Show the date in ISO-8601 format, irrespective of the current locale. -* **Long date** - Show the date in long format (usually with month in letters instead of number). -Exact format depends on the current locale. _Only evaluated if ISO8601 date is not set._ +* **Date** - Format of the date representation. Possible values are + * **Long** - "Long" date format in the current locale. Usually with the month as name, not number. + * **Short** - "Short" date format in the current locale. Usually with the month as number. + * **ISO8601** - Show the date in ISO-8601 format (YYYY-MM-DD), irrespective of the current locale. * **Show Weekday** - Weekday is shown in the time presentation without seconds. Weekday name depends on the current locale. If seconds are shown, the weekday is never shown as there is not enough space on the watch face. @@ -49,21 +50,28 @@ Otherwise, a scaled version of the built-in 6x8 pixels font is used. The "Seconds" submenu configures how (and if) seconds are shown on the "Anton" watch face. -* **Always** - Seconds are _always_ shown, irrespective of the display's unlock state. -If this is enabled, weekdays will never been shown. -_Enabling this option increases power consumption as the watch face will update once per second instead of once per minute._ -* **If unlocked** - Seconds are shown if the display is unlocked. -On a locked display, only hour, minutes, date and weekday are shown. -"Always" overrides this option. +* **Show** - Configure when the seconds should be shown at all: + * **Never** - Seconds are never shown. +In this case, hour and minute are a bit more centered on the screen and the clock will always only update every minute. +This saves battery power. + * **Unlocked** - Seconds are shown if the display is unlocked. +On locked displays, only hour, minutes, date and optionally the weekday are shown. _This option is highly recommended on the Bangle.js 2!_ -* **Coloured** - If enabled, seconds are shown in blue instead of black. + * **Always** - Seconds are _always_ shown, irrespective of the display's unlock state. +_Enabling this option increases power consumption as the watch face will update once per second instead of once per minute._ +* **With ":"** - If enabled, a colon ":" is prepended to the seconds. +This resembles the usual time representation "hh:mm:ss", even though the seconds are printed on a separate line. +* **Color** - If enabled, seconds are shown in blue instead of black. +If the date is shown on the seconds screen, it is colored read instead of black. This make the visual orientation much easier on the watch face. -* **With date** - If enabled, the date is shown together with the seconds. -Depending on the "ISO8601 date" settings, ISO8601 or short local format is used. -The date is coloured in red if the "Coloured" option is chosen. +* **Date** - It is possible to show the date together with the seconds: + * **No** - Date is _not_ shown in the seconds screen. +In this case, the seconds are centered below hour and minute. + * **Year** - Date is shown with day, month, and year. If "Date" in the main settings is configured to _ISO8601_, this is used here, too. Otherwise, the short local format is used. + * **Weekday** - Date is shown with day, month, and weekday. -If neither "Always" nor "If unlocked" is selected, Anton clock does _never_ show seconds. +The date is coloured in red if the "Coloured" option is chosen. ## Compatibility -Anton clock makes use of core Bangle.js 2 features (coloured display, display lock state). It also runs on the Bangle.js 1 but these features are not available there due to the hardware features. +Anton clock makes use of core Bangle.js 2 features (coloured display, display lock state). It also runs on the Bangle.js 1 but these features are not available there due to hardware restrictions. diff --git a/apps/antonclk/app.js b/apps/antonclk/app.js index e772d679d..1f3e49792 100644 --- a/apps/antonclk/app.js +++ b/apps/antonclk/app.js @@ -3,17 +3,21 @@ var SETTINGSFILE = "antonclk.json"; 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//gAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAADgA//gAAAAAAP/gA//gAAAAAH//gA//gAAAAB///gA//gAAAAP///gA//gAAAD////gA//gAAAf////gA//gAAB/////gA//gAAP/////gA//gAB//////gA//gAH//////gA//gA///////gA//gD///////gA//gf///////gA//h////////gA//n////////gA//////////gAA/////////AAAA////////wAAAA///////4AAAAA///////AAAAAA//////4AAAAAA//////AAAAAAA/////4AAAAAAA/////AAAAAAAA////8AAAAAAAA////gAAAAAAAA///+AAAAAAAAA///4AAAAAAAAA///AAAAAAAAAA//4AAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gB///wAAAAP//4H///+AAAA///8P////gAAB///+f////4AAD///+/////8AAH/////////+AAH//////////AAP//////////gAP//////////gAf//////////gAf//////////wAf//////////wAf//////////wA///////////wA//4D//wAB//4A//wB//gAA//4A//gA//gAAf/4A//gA//AAAf/4A//gA//gAAf/4A//wB//gAA//4A///P//8AH//4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////gAP//////////gAP//////////AAH//////////AAD/////////+AAD///+/////8AAB///8f////wAAAf//4P////AAAAH//wD///8AAAAA/+AAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAAAAAAAAB///+AA/+AAAAP////gA//wAAAf////wA//4AAB/////4A//8AAD/////8A//+AAD/////+A///AAH/////+A///AAP//////A///gAP//////A///gAf//////A///wAf//////A///wAf//////A///wAf//////A///wA///////AB//4A//4AD//AAP/4A//gAB//AAP/4A//gAA//AAP/4A//gAA/+AAP/4A//gAB/8AAP/4A//wAB/8AAf/4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH/////////+AAD/////////8AAB/////////4AAAf////////wAAAP////////AAAAB///////4AAAAAD/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAB/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("EiAnGicnJycnJycnEw=="), 78+(scale<<8)+(1<<16)); + // 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//gAAAAAAAAAA//gAAAAAAAAAA//gAAAAAAADgA//gAAAAAAP/gA//gAAAAAH//gA//gAAAAB///gA//gAAAAP///gA//gAAAD////gA//gAAAf////gA//gAAB/////gA//gAAP/////gA//gAB//////gA//gAH//////gA//gA///////gA//gD///////gA//gf///////gA//h////////gA//n////////gA//////////gAA/////////AAAA////////wAAAA///////4AAAAA///////AAAAAA//////4AAAAAA//////AAAAAAA/////4AAAAAAA/////AAAAAAAA////8AAAAAAAA////gAAAAAAAA///+AAAAAAAAA///4AAAAAAAAA///AAAAAAAAAA//4AAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//gB///wAAAAP//4H///+AAAA///8P////gAAB///+f////4AAD///+/////8AAH/////////+AAH//////////AAP//////////gAP//////////gAf//////////gAf//////////wAf//////////wAf//////////wA///////////wA//4D//wAB//4A//wB//gAA//4A//gA//gAAf/4A//gA//AAAf/4A//gA//gAAf/4A//wB//gAA//4A///P//8AH//4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////gAP//////////gAP//////////AAH//////////AAD/////////+AAD///+/////8AAB///8f////wAAAf//4P////AAAAH//wD///8AAAAA/+AAf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAAAAAAAAB///+AA/+AAAAP////gA//wAAAf////wA//4AAB/////4A//8AAD/////8A//+AAD/////+A///AAH/////+A///AAP//////A///gAP//////A///gAf//////A///wAf//////A///wAf//////A///wAf//////A///wA///////AB//4A//4AD//AAP/4A//gAB//AAP/4A//gAA//AAP/4A//gAA/+AAP/4A//gAB/8AAP/4A//wAB/8AAf/4Af//////////wAf//////////wAf//////////wAf//////////wAf//////////wAP//////////gAP//////////gAH//////////AAH/////////+AAD/////////8AAB/////////4AAAf////////wAAAP////////AAAAB///////4AAAAAD/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/AAB/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAA//AAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("EiAnGicnJycnJycnEw=="), 78 + (scale << 8) + (1 << 16)); +}; + +Graphics.prototype.setFontAntonSmall = function(scale) { + // Actual height 53 (52 - 0) + g.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAf8AAAAAAAAAAAAAAAAAAAAMAAAAAAAAD8AAAAAAAA/8AAAAAAAf/8AAAAAAH//8AAAAAB///8AAAAA////8AAAAP////8AAAD/////8AAB//////8AAf//////8AH///////4A///////+AA///////AAA//////wAAA/////8AAAA////+AAAAA////gAAAAA///4AAAAAA//8AAAAAAA//AAAAAAAA/wAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/////wAAA//////8AAB//////+AAH///////gAH///////gAP///////wAf///////4Af///////4A////////8A////////8A////////8A//AAAAD/8A/8AAAAA/8A/8AAAAA/8A/8AAAAA/8A/+AAAAB/8A////////8A////////8A////////8Af///////4Af///////4AP///////wAP///////wAH///////gAD///////AAA//////8AAAP/////wAAAAAAAAAAAAAAAAAAAAAAAfwAAAAAAAA/4AAAAAAAA/4AAAAAAAB/wAAAAAAAB/wAAAAAAAD/wAAAAAAAD/gAAAAAAAH///////8AP///////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/4AAAP8AA//4AAA/8AB//4AAH/8AH//4AAP/8AP//4AA//8AP//4AB//8Af//4AD//8Af//4AP//8A///4Af//8A///4A///8A///4D///8A//AAH///8A/8AAP///8A/8AA//+/8A/8AD//8/8A/+Af//w/8A//////g/8A/////+A/8A/////8A/8Af////4A/8Af////wA/8AP////AA/8AP///+AA/8AH///8AA/8AD///wAA/8AA///AAA/8AAP/4AAA/8AAAAAAAAAAAAAAAAAAAAAAH4AAf/gAAA/4AAf/8AAD/4AAf//AAH/4AAf//gAP/4AAf//wAP/4AAf//wAf/4AAf//4Af/4AAf//4A//4AAf//8A//4AAf//8A//4AAP//8A//A/8AB/8A/8A/8AA/8A/8B/8AA/8A/8B/8AA/8A/+D//AB/8A////////8A////////8A////////8Af///////4Af///////4Af///////wAP///////gAH//9////gAD//4///+AAB//wf//4AAAP/AH//gAAAAAAAAAAAAAAAAAAAAAAAAAAAH/wAAAAAAB//wAAAAAAP//wAAAAAD///wAAAAA////wAAAAH////wAAAB/////wAAAf/////wAAD//////wAA///////wAA/////h/wAA////wB/wAA///8AB/wAA///AAB/wAA//gAAB/wAA////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8A////////8AAAAAAB/wAAAAAAAB/wAAAAAAAB/wAAAAAAAAAAAAAAAAAAAAAAAAAAAP/4AA////4P/+AA////4P//AA////4P//gA////4P//wA////4P//wA////4P//4A////4P//4A////4P//8A////4P//8A////4P//8A/8H/AAB/8A/8H+AAA/8A/8P+AAA/8A/8P+AAA/8A/8P/gAD/8A/8P/////8A/8P/////8A/8P/////8A/8P/////4A/8H/////4A/8H/////wA/8D/////wA/8B/////gA/8A////+AA/8AP///4AAAAAB///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////wAAAf/////8AAB///////AAH///////gAP///////wAP///////wAf///////4Af///////4A////////8A////////8A////////8A/+AH/AB/8A/8AP+AA/8A/4Af+AA/8A/8Af+AA/8A/8Af/gH/8A//4f////8A//4f////8A//4f////8Af/4f////4Af/4f////4AP/4P////wAP/4P////gAH/4H////AAD/4D///+AAB/4B///4AAAP4AP//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/8AAAAAAAA/8AAAAAAAA/8AAAAAB8A/8AAAAB/8A/8AAAAf/8A/8AAAH//8A/8AAA///8A/8AAH///8A/8AA////8A/8AD////8A/8Af////8A/8B/////8A/8P/////8A/8//////8A////////AA///////AAA//////gAAA/////4AAAA/////AAAAA////4AAAAA////AAAAAA///8AAAAAA///gAAAAAA//+AAAAAAA//wAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/gD//gAAA//4P//8AAD//8f///AAH//+////gAH///////wAP///////4AP///////8Af///////8Af///////+Af///////+A////////+A//B//AB/+A/+A/+AA/+A/8Af+AA/+A/+Af+AA/+A//A//AB/+A////////+Af///////+Af///////+Af///////8Af///////8AP///////4AH///////4AH//+////wAD//+////AAA//4P//+AAAP/gH//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//gAfgAAA///8A/8AAB///+A//AAH////A//gAH////g//wAP////g//wAf////w//4Af////w//4A/////w//8A/////w//8A/////w//8A//gP/wA/8A/8AD/wA/8A/8AD/wAf8A/8AD/gA/8A/+AH/AB/8A////////8A////////8A////////8Af///////4Af///////4Af///////wAP///////wAH///////gAD//////+AAA//////4AAAP/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAP+AA/4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="), 46, atob("DhgeFB4eHh4eHh4eDw=="), 60 + (scale << 8) + (1 << 16)); }; // variables defined from settings -var secondsOnUnlock; -var secondsAlways; +var secondsMode; var secondsColoured; -var dateAsISO; +var secondsWithColon; +var dateOnMain; var dateOnSecs; -var longDate; var weekDay; var upperCase; var vectorFont; @@ -27,15 +31,14 @@ var isBangle1 = (g.getWidth() == 240); /* For development purposes require('Storage').writeJSON(SETTINGSFILE, { - secondsOnUnlock: false, - secondsAlways: false, + secondsMode: "Always", // "Never", "Unlocked", "Always" secondsColoured: true, - dateAsISO: false, - dateOnSecs: true, - longDate: true, + secondsWithColon: true, + dateOnMain: "Long", // "Short", "Long", "ISO8601" + dateOnSecs: "Year", // "No", "Year", "Weekday", LEGACY: true/false weekDay: true, - upperCase: false, - vectorFont: false, + upperCase: true, + vectorFont: true, }); /* */ @@ -51,15 +54,20 @@ function def(value, def) { // Load settings function loadSettings() { var settings = require('Storage').readJSON(SETTINGSFILE, true) || {}; - 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); + secondsMode = def(settings.secondsMode, "Never"); + secondsColoured = def(settings.secondsColoured, true); + secondsWithColon = def(settings.secondsWithColon, true); + dateOnMain = def(settings.dateOnMain, "Long"); + dateOnSecs = def(settings.dateOnSecs, "Year"); weekDay = def(settings.weekDay, true); upperCase = def(settings.upperCase, true); vectorFont = def(settings.vectorFont, false); + + // Legacy + if (dateOnSecs === true) + dateOnSecs = "Year"; + if (dateOnSecs === false) + dateOnSecs = "No"; } // schedule a draw for the next second or minute @@ -73,7 +81,7 @@ function queueDraw() { function updateState() { if (Bangle.isLCDOn()) { - if ((secondsOnUnlock && !Bangle.isLocked()) || secondsAlways) { + if ((secondsMode === "Unlocked" && !Bangle.isLocked()) || secondsMode === "Always") { secondsScreen = true; queueMillis = 1000; } else { @@ -98,28 +106,33 @@ function doColor() { // Actually draw the watch face function draw() { var x = g.getWidth() / 2; - var y = g.getHeight() / 2 - (secondsOnUnlock || secondsAlways ? 24 : (vectorFont ? 12 : 0)); + var y = g.getHeight() / 2 - (secondsMode !== "Never" ? 24 : (vectorFont ? 12 : 0)); g.reset(); - g.clearRect(0, 24, g.getWidth(), g.getHeight()); // clear whole background + /* This is to mark the widget areas during development. + g.setColor("#888") + .fillRect(0, 0, g.getWidth(), 23) + .fillRect(0, g.getHeight() - 23, g.getWidth(), g.getHeight()).reset(); + /* */ + g.clearRect(0, 24, g.getWidth(), g.getHeight() - 24); // clear whole background (w/o widgets) 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 if (secondsScreen) { - y += 76; - var secStr = ":" + ("0" + date.getSeconds()).substr(-2); + y += 65; + var secStr = (secondsWithColon ? ":" : "") + ("0" + date.getSeconds()).substr(-2); if (doColor()) g.setColor(0, 0, 1); - g.setFont("Anton"); - if (dateOnSecs) { // A bit of a complex drawing with seconds on the right and date on the left + g.setFont("AntonSmall"); + if (dateOnSecs !== "No") { // 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); - var dateStr2 = (dateAsISO ? isoStr(date) : require("locale").date(date, 1)); + y -= (vectorFont ? 15 : 13); + x = g.getWidth() / 4 + (isBangle1 ? 12 : 4) + (secondsWithColon ? 0 : g.stringWidth(":") / 2); + var dateStr2 = (dateOnMain === "ISO8601" ? isoStr(date) : require("locale").date(date, 1)); var year; var md; var yearfirst; if (dateStr2.match(/\d\d\d\d$/)) { // formatted date ends with year - year = dateStr2.slice(-4); + year = (dateOnSecs === "Year" ? dateStr2.slice(-4) : require("locale").dow(date, 1)); md = dateStr2.slice(0, -4); if (!md.endsWith(".")) // keep separator before the year only if it is a dot (31.12. but 31/12) md = md.slice(0, -1); @@ -127,10 +140,12 @@ function draw() { } 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 - year = dateStr2.slice(0, 4); + year = (dateOnSecs === "Year" ? dateStr2.slice(0, 4) : require("locale").dow(date, 1)); md = dateStr2.slice(5); // never keep separator directly after year yearfirst = true; } + if (dateOnSecs === "Weekday" && upperCase) + year = year.toUpperCase(); g.setFontAlign(0, 0); if (vectorFont) g.setFont("Vector", 24); @@ -144,8 +159,8 @@ function draw() { g.setFontAlign(0, 0).drawString(secStr, x, y); // Just the seconds centered } } else { // No seconds screen: Show date and optionally day of week - y += (vectorFont ? 50 : (secondsOnUnlock || secondsAlways) ? 52 : 40); - var dateStr = (dateAsISO ? isoStr(date) : require("locale").date(date, (longDate ? 0 : 1))); + y += (vectorFont ? 50 : (secondsMode !== "Never") ? 52 : 40); + var dateStr = (dateOnMain === "ISO8601" ? isoStr(date) : require("locale").date(date, (dateOnMain === "Long" ? 0 : 1))); if (upperCase) dateStr = dateStr.toUpperCase(); g.setFontAlign(0, 0); diff --git a/apps/antonclk/settings.js b/apps/antonclk/settings.js index 3af9df292..08fde512e 100644 --- a/apps/antonclk/settings.js +++ b/apps/antonclk/settings.js @@ -11,28 +11,34 @@ require('Storage').writeJSON(FILE, settings); } + // Helper method which uses int-based menu item for set of string values + function stringItems(startvalue, writer, values) { + return { + value: (startvalue === undefined ? 0 : values.indexOf(startvalue)), + format: v => values[v], + min: 0, + max: values.length - 1, + wrap: true, + step: 1, + onchange: v => { + writer(values[v]); + writeSettings(); + } + }; + } + + // Helper method which breaks string set settings down to local settings object + function stringInSettings(name, values) { + return stringItems(settings[name], v => settings[name] = v, values); + } + var mainmenu = { "": { "title": "Anton clock" }, "< Back": () => back(), "Seconds...": () => E.showMenu(secmenu), - "ISO8601 date": { - value: (settings.dateAsISO !== undefined ? settings.dateAsISO : false), - format: v => v ? "On" : "Off", - onchange: v => { - settings.dateAsISO = v; - writeSettings(); - } - }, - "Long date": { - value: (settings.longDate !== undefined ? settings.longDate : true), - format: v => v ? "On" : "Off", - onchange: v => { - settings.longDate = v; - writeSettings(); - } - }, + "Date": stringInSettings("dateOnMain", ["Short", "Long", "ISO8601"]), "Show Weekday": { value: (settings.weekDay !== undefined ? settings.weekDay : true), format: v => v ? "On" : "Off", @@ -65,23 +71,16 @@ "title": "Show seconds..." }, "< Back": () => E.showMenu(mainmenu), - "Always": { - value: (settings.secondsAlways !== undefined ? settings.secondsAlways : false), + "Show": stringInSettings("secondsMode", ["Never", "Unlocked", "Always"]), + "With \":\"": { + value: (settings.secondsWithColon !== undefined ? settings.secondsWithColon : false), format: v => v ? "On" : "Off", onchange: v => { - settings.secondsAlways = v; + settings.secondsWithColon = v; writeSettings(); } }, - "If unlocked": { - value: (settings.secondsOnUnlock !== undefined ? settings.secondsOnUnlock : false), - format: v => v ? "On" : "Off", - onchange: v => { - settings.secondsOnUnlock = v; - writeSettings(); - } - }, - "Coloured": { + "Color": { value: (settings.secondsColoured !== undefined ? settings.secondsColoured : false), format: v => v ? "On" : "Off", onchange: v => { @@ -89,14 +88,7 @@ writeSettings(); } }, - "With date": { - value: (settings.dateOnSecs !== undefined ? settings.dateOnSecs : false), - format: v => v ? "On" : "Off", - onchange: v => { - settings.dateOnSecs = v; - writeSettings(); - } - } + "Date": stringInSettings("dateOnSecs", ["No", "Year", "Weekday"]) }; // Actually display the menu