From 0ef8ad6d5ec30ff936c0c2bd26876fcf0dd485d5 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Wed, 23 Feb 2022 12:10:14 +0000 Subject: [PATCH] add simple interlaced font clock --- apps/intclock/ChangeLog | 12 +++++++ apps/intclock/README.md | 4 +++ apps/intclock/app-icon.js | 1 + apps/intclock/app.js | 60 +++++++++++++++++++++++++++++++++++ apps/intclock/app.png | Bin 0 -> 3480 bytes apps/intclock/metadata.json | 16 ++++++++++ apps/intclock/screenshot.png | Bin 0 -> 2101 bytes 7 files changed, 93 insertions(+) create mode 100644 apps/intclock/ChangeLog create mode 100644 apps/intclock/README.md create mode 100644 apps/intclock/app-icon.js create mode 100644 apps/intclock/app.js create mode 100644 apps/intclock/app.png create mode 100644 apps/intclock/metadata.json create mode 100644 apps/intclock/screenshot.png diff --git a/apps/intclock/ChangeLog b/apps/intclock/ChangeLog new file mode 100644 index 000000000..aa910b6f6 --- /dev/null +++ b/apps/intclock/ChangeLog @@ -0,0 +1,12 @@ +0.02: Modified for use with new bootloader and firmware +0.03: add hour ticks, remove timers +0.04: add day-date display +0.07: make date and face bigger +0.08: make dots bigger and date more readable +0.09: center date, remove box around it, internal refactor to remove redundant code. +0.10: remove debug, refactor seconds to show elapsed secs each time app is displayed +0.11: shift face down for widget area, maximize face size, 0 pad single digit date, use locale for date +0.12: Fix regression after 0.11 +0.13: Fix broken date padding (fix #376) +0.14: Remove hardcoded hour buzz (you can install widchime if you miss it) +0.15: Add color scheme support diff --git a/apps/intclock/README.md b/apps/intclock/README.md new file mode 100644 index 000000000..7d31cdae2 --- /dev/null +++ b/apps/intclock/README.md @@ -0,0 +1,4 @@ +# Analogue Clock + +![](screenshot_analog.png) + diff --git a/apps/intclock/app-icon.js b/apps/intclock/app-icon.js new file mode 100644 index 000000000..8c62a192e --- /dev/null +++ b/apps/intclock/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwgP/AH4Aq+GEkPh4E/BZMAh4LGw/h8MPBZHggIXJ/EB4ALI//h/4LHwk/BagA/ACY=")) diff --git a/apps/intclock/app.js b/apps/intclock/app.js new file mode 100644 index 000000000..1324a422c --- /dev/null +++ b/apps/intclock/app.js @@ -0,0 +1,60 @@ +Graphics.prototype.setFontUndo = function(scale) { + // Actual height 19 (20 - 2) + this.setFontCustom(atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKqKAqooCqigKqKAAAACgAAKAAAoAACgAAAAAAAAACgAAKAAAoAACgAAAAAAKCgAoKAKqqAqqoCqqgKqqAKCgAoKAKqqAqqoCqqgKqqAKCgAoKAAAAAKgoAqCgKqKAqooKiioqKKiooqKiioKKqAoqoCgqAKCoAAAACoCgKgKAiCoCIKgKioAqKgACoAAKgACoAAKgACoqAKioCoIgKgiAoCoCgKgAAAAKqgAqqAKqqAqqoKiioqKKiooqKiioKAKAoAoCgCgKAKAAAACgAAKAAAoAACgAAAAAAKqgAqqAKqqAqqoCgCgKAKAAAACgCgKAKAqqoCqqgCqoAKqgAAAACigAKKAAqoACqgAqoACqgAKqAAqoAAqoACqgAKKAAooAAAAAAoAACgAAKAAAoAAqqACqoAKqgAqqAAKAAAoAACgAAKAAAAAAACoAAKgAAqAACoAAAAAoAACgAAKAAAoAACgAAKAAAoAACgAAKAAAoAACgAAKAAAAAAACgAAKAAAoAACgAAAAAAoAACgAAqAACoAAqAACoAAqAACoAAqAACoAAqAACoAAqAACoAAKAAAoAAAAAACqoAKqgCqqgKqqAoAoCgCgKAKAoAoCqqgKqqAKqgAqqAAAAAqqoCqqgKqqAqqoAAAAKCqAoKoCiqgKKqAoooCiigKKKAoooCqigKqKAKgoAqCgAAAAoAoCgCgKAKAoAoCiigKKKAoooCiigKqqAqqoAqqACqoAAAACqAAKoAAqoACqgAAKAAAoAACgAAKAAqqoCqqgKqqAqqoAAAAKoKAqgoCqigKqKAoooCiigKKKAoooCiqgKKqAoKgCgqAAAAAKqgAqqAKqqAqqoCiigKKKAoooCiigKKqAoqoCgqAKCoAAAACgAAKAAAoAACgAAKAAAoAACgAAKAAAqqoCqqgCqqAKqoAAAACqoAKqgCqqgKqqAoooCiigKKKAoooCqqgKqqAKqgAqqAAAAAKgAAqAAKqAAqoACigAKKAAooACigAKqqAqqoAqqgCqqAAAACgCgKAKAoAoCgCgAAAAoAqCgCoKAKgoAqAAAAAKAAAoAAKoAAqgAKqgAqqAKgqAqCoCgCgKAKAAAAAoKACgoAKCgAoKACgoAKCgAoKACgoAKCgAoKACgoAKCgAAAAKAKAoAoCoKgKgqAKqgAqqAAqgACqAACgAAKAAAAACgAAKAAAoAACgAAKKKAoooCiigKKKAqoACqgACoAAKgAAAAACqqAKqoCqqgKqqAoAACgAAKCoAoKgCiqgKKqAoooCiigKqqAqqoAqqACqoAAAAAqqgCqqAqqoCqqgKKAAooACigAKKAAqqoCqqgCqqAKqoAAAAKqqAqqoCqqgKqqAoooCiigKKKAoooCqqgKqqAKCgAoKAAAAAKqgAqqAKqqAqqoCgCgKAKAoAoCgCgKAKAoAoCgCgKAKAAAACqqgKqqAqqoCqqgKAKAoAoCoKgKgqAKqgAqqAAqgACqAAAAACqoAKqgCqqgKqqAoooCiigKKKAoooCgCgKAKAoAoCgCgAAAAKqoAqqgKqqAqqoCigAKKAAooACigAKAAAoAACgAAKAAAAAAAqqACqoAqqoCqqgKAKAoAoCiigKKKAoqoCiqgKKqAoqoAAAAKqqAqqoCqqgKqqAAoAACgAAKAAAoACqqgKqqAqqoCqqgAAAAoAoCgCgKAKAoAoCqqgKqqAqqoCqqgKAKAoAoCgCgKAKAAAAAAKAAAoAACoAAKgAAKAAAoAACgAAKAqqoCqqgKqoAqqgAAAAKqqAqqoCqqgKqqACqAAKoACqoAKqgCoKgKgqAoAoCgCgAAAAqqgCqqAKqqAqqoAACgAAKAAAoAACgAAKAAAoAACgAAKAAAACqqgKqqAqqoCqqgCoAAKgAAKgAAqAAKgAAqAAKqqAqqoCqqgKqqAAAACqqgKqqAqqoCqqgCoAAKgAAKgAAqAAqqoCqqgKqqAqqoAAAACqoAKqgCqqgKqqAoAoCgCgKAKAoAoCqqgKqqAKqgAqqAAAAAqqoCqqgKqqAqqoCigAKKAAooACigAKqAAqoAAqAACoAAAAAAqqACqoAqqoCqqgKAKAoAoCgKgKAqAqqoCqqgCqqAKqoAAAAKqqAqqoCqqgKqqAooACigAKKgAoqACqqgKqqAKioAqKgAAAAKgoAqCgKqKAqooCiigKKKAoooCiigKKqAoqoCgqAKCoAAAACgAAKAAAoAACgAAKqqAqqoCqqgKqqAoAACgAAKAAAoAAAAAAKqoAqqgCqqgKqqAAAoAACgAAKAAAoCqqgKqqAqqgCqqAAAAAqqACqoAKqoAqqgAAKgAAqAACoAAKgKqoAqqgCqoAKqgAAAACqqgKqqAqqoCqqgACoAAKgACoAAKgAAKgAAqAKqqAqqoCqqgKqqAAAACoKgKgqAqqoCqqgAqgACqAAKoAAqgAqqoCqqgKgqAqCoAAAAKoAAqgACqgAKqAAAqoACqgAKqAAqoCqgAKqAAqgACqAAAAAAoCoCgKgKCqAoKoCiqgKKqAqooCqigKoKAqgoCoCgKgKAAAACqqgKqqAqqoCqqgKAKAoAoAAAAKAAAoAACoAAKgAAKgAAqAAAqAACoAACoAAKgAAKgAAqAAAqAACoAACgAAKAAAACgCgKAKAqqoCqqgKqqAqqoAAA"), 32, atob("DQULDw0RDQUHBw0NBQ0FEQ0FDQ0NDQ0NDQ0FBQsNCw0RDQ0NDQ0NDQ0NDQ0NDw0NDQ0NDQ0NDQ8NDQ0HEQc="), 22+(scale<<8)+(1<<16)); + return this; +} + +// timeout used to update every minute +var drawTimeout; + +// schedule a draw for the next minute +function queueDraw() { + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = setTimeout(function() { + drawTimeout = undefined; + draw(); + }, 60000 - (Date.now() % 60000)); +} + + +function draw() { + var x = g.getWidth()/2; + var y = g.getHeight()/2 - 10; + g.reset(); + // work out locale-friendly date/time + var date = new Date(); + var timeStr = require("locale").time(date,1).trim(); + var dateStr = require("locale").date(date).toUpperCase(); + + + // draw time + g.setFontAlign(0,0).setFont("Undo:3"); + g.clearRect(0,y-30,g.getWidth(),y+30); // clear the background + g.drawString(timeStr,x,y); + // draw date + y += 40; + g.setFontAlign(0,0).setFont("Undo"); + g.clearRect(0,y-10,g.getWidth(),y+20); // clear the background + g.drawString(dateStr,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) { + draw(); // draw immediately, queue redraw + } else { // stop draw timer + if (drawTimeout) clearTimeout(drawTimeout); + drawTimeout = undefined; + } +}); +// Show launcher when middle button pressed +Bangle.setUI("clock"); +// Load widgets +Bangle.loadWidgets(); +Bangle.drawWidgets(); \ No newline at end of file diff --git a/apps/intclock/app.png b/apps/intclock/app.png new file mode 100644 index 0000000000000000000000000000000000000000..dacbceb733035cae976a896ffdb648fe7c578234 GIT binary patch literal 3480 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 Bg0lbs literal 0 HcmV?d00001 diff --git a/apps/intclock/metadata.json b/apps/intclock/metadata.json new file mode 100644 index 000000000..fff4c58b0 --- /dev/null +++ b/apps/intclock/metadata.json @@ -0,0 +1,16 @@ +{ + "id": "intclock", + "name": "Interlaced Clock", + "version": "0.01", + "description": "A lightweight digital clock using an 'interlaced' font", + "icon": "app.png", + "screenshots": [{"url":"screenshot.png"}], + "type": "clock", + "tags": "clock", + "supports": ["BANGLEJS","BANGLEJS2"], + "allow_emulator": true, + "storage": [ + {"name":"intclock.app.js","url":"app.js"}, + {"name":"intclock.img","url":"app-icon.js","evaluate":true} + ] +} diff --git a/apps/intclock/screenshot.png b/apps/intclock/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..33a459f1f768a3421412409d86188397e04fa723 GIT binary patch literal 2101 zcmeHJ{ZrEU7XBcOAgR|oWmyW9Jw{{qK#xyx622d~C+^H}#*hUvK<>uYmb}u;n=H#n4f8{UfF=s9e(fDZWro)F z)yjt=Lzl7two^eP8dsXZp#JO63*Vm0w&TQ_5>Y2DVI+pWs{8r_Y_R)w2 zUg7Xz)DJXX065UPM9=QOOEA;-Gwz4b!)%!(akiLavx5F06`vpLCOacDb@Z^0nH-zL z!)-x{%8wG>F8EQi^{i-~n>{3MAuY`=2uH{6ak|N4@4eE~zlAlOvs_c1+r)Uj<=Qn` zsmA#1))V{=e%{=WMB--+^qeOEkE*Ln3fzQyi@dVRKq%{eVn1lv39S$>PjE#~u+*uJ z!wM$bEB^HG0BCtO>wZ-2=6TZILcj1^*;c7s+TK$){-#2Q6llB)^(%1*Lhb1 zXP&7F)sClV$4K4ilxR$^51V==SN-K zZ09&F?5#IgK-C9aF$ha*MQZjz!%G_n3Joy1GZFeYYXyp`8Hl??W7 zww;zW;Q##d?ab|&C>XSB7qEoFxe?1~oMbO*4C26rI!Kfc@3sci`f^#LoD~d9Xr8*6 zit1KTOkeE$DsF|WYMNfr9 zkdNYd-~e>+PAe-oar`Xq#?2~+-!+o^(}|Vxa+0Yj--ZxQa0}e=9Y#uAF^BLu_Yavv z0pHj$;Tfiro9kkK7{KXk;lR?CbOb;oF>xMP!v6@`p!n}Q+3L|WhICH0_=_q?j8)f+ zWQI1jgxn*g((8Ih+r2YKJ+_AV?v}h@VGv%RL3eb;NnhiRp-*|X6g9T{D*S}(17U^C<7k_;Tr%c*d#5Q5zU5pvIWplWD`ANlC=D<9=F5nN;=YnWR_SEtv_L&XnSuO6`aT!jhVMC|-xo23Ero+( p7yrH9V889vqjmqs|Eq%$wtH_rNf=6*H2nd<$NQ@jHC|!Y{{!gi${GLw literal 0 HcmV?d00001