From b4a355cfe1bea7b6c0b4f169314b429a0c8065ca Mon Sep 17 00:00:00 2001 From: David Peer Date: Fri, 19 Nov 2021 18:19:16 +0100 Subject: [PATCH] Added alarm via swipe left/right. --- apps.json | 5 +- apps/lcars/ChangeLog | 1 + apps/lcars/README.md | 16 +++++-- apps/lcars/lcars.app.js | 94 ++++++++++++++++++++++++++++++++------ apps/lcars/screenshot.png | Bin 0 -> 2118 bytes 5 files changed, 94 insertions(+), 22 deletions(-) create mode 100644 apps/lcars/screenshot.png diff --git a/apps.json b/apps.json index 7fe259899..18dff1079 100644 --- a/apps.json +++ b/apps.json @@ -547,7 +547,7 @@ "description": "A random scramble generator for the 3x3 Rubik's cube", "icon": "cube-scramble.png", "tags": "", - "supports" : ["BANGLEJS","BANGLEJS2"], + "supports" : ["BANGLEJS","BANGLEJS2"], "readme": "README.md", "allow_emulator": true, "storage": [ @@ -4278,7 +4278,7 @@ {"name":"a_battery_widget.wid.js","url":"widget.js"} ] }, - { + { "id": "lcars", "name": "LCARS Clock", "shortName":"LCARS", @@ -4288,6 +4288,7 @@ "description": "Library Computer Access Retrieval System (LCARS) clock.", "type": "clock", "tags": "clock", + "screenshots": [{"url":"screenshot.png"}], "storage": [ {"name":"lcars.app.js","url":"lcars.app.js"}, {"name":"lcars.img","url":"lcars.icon.js","evaluate":true} diff --git a/apps/lcars/ChangeLog b/apps/lcars/ChangeLog index c7ec09d30..750e7ddfc 100644 --- a/apps/lcars/ChangeLog +++ b/apps/lcars/ChangeLog @@ -1 +1,2 @@ 0.01: Launch app +0.02: Swipe left/right to set an alarm. diff --git a/apps/lcars/README.md b/apps/lcars/README.md index fdce30c1b..7d2d19687 100644 --- a/apps/lcars/README.md +++ b/apps/lcars/README.md @@ -1,8 +1,14 @@ # LCARS clock -A simple LCARS inspired clock that shows: - * Current time - * Current date - * Battery level - * Steps +A simple LCARS inspired clock +## Features + * Shows the time + * Shows the date + * Shows the current battery level in % + * Shows the number of daily steps + * Swipe left/right to activate an alarm + + +## Creator +Made by [David Peer](https://github.com/peerdavid) \ No newline at end of file diff --git a/apps/lcars/lcars.app.js b/apps/lcars/lcars.app.js index cf884a6b7..2e001643b 100644 --- a/apps/lcars/lcars.app.js +++ b/apps/lcars/lcars.app.js @@ -1,9 +1,9 @@ -const locale = require('locale'); - - /* - * Assets: Images, fonts etc. + * Requirements and globals */ +const locale = require('locale'); +var alarm = -1; + var img = { width : 176, height : 151, bpp : 3, transparent : 0, @@ -22,7 +22,7 @@ Graphics.prototype.setFontMinaLarge = function(scale) { /* - * Queue drawing every minute + * Draw watch face */ var drawTimeout; function queueDraw() { @@ -34,9 +34,6 @@ function queueDraw() { } -/* - * Draw watch face - */ function draw(){ g.reset(); g.clearRect(0, 24, g.getWidth(), g.getHeight()); @@ -66,22 +63,89 @@ function draw(){ g.drawString(bat+"%", 100, 127); // Draw steps - var steps = Bangle.getStepCount(); - g.drawString("STEP:", 40, 147); - g.drawString(steps, 100, 147); + if(alarm < 0){ + var steps = Bangle.getStepCount(); + g.drawString("STEP:", 40, 147); + g.drawString(steps, 100, 147); + } else { + g.drawString("ALRM:", 40, 147); + g.drawString("T-" + alarm, 100, 147); + } // Queue draw in one minute queueDraw(); } -// Clear the screen once, at startup -g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); -// draw immediately at first, queue update +/* + * Handle alarm + */ +var alarmTimeout; +function queueAlarm() { + if (alarmTimeout) clearTimeout(alarmTimeout); + alarmTimeout = setTimeout(function() { + alarmTimeout = undefined; + handleAlarm(); + }, 60000 - (Date.now() % 60000)); +} + +function handleAlarm(){ + + // If alarm is zero, inform the user. + if(alarm == 0){ + alarm = -1; + + var t = 300; + Bangle.buzz(t, 1) + .then(() => new Promise(resolve => setTimeout(resolve, t))) + .then(() => Bangle.buzz(t, 1)) + .then(() => new Promise(resolve => setTimeout(resolve, t))) + .then(() => Bangle.buzz(t, 1)) + .then(() => new Promise(resolve => setTimeout(resolve, t))) + .then(() => Bangle.buzz(t, 1)); + + // Draw watch face again to show data instead of alarm. + draw(); + + // If we still have to wait, queue alarm again. + } else if(alarm > 0){ + alarm--; + queueAlarm(); + draw(); + } +} + + +/* + * Swipe to set an alarm + */ +Bangle.on('swipe',function(dir) { + // Increase alarm + if(dir == -1){ + alarm = alarm < 0 ? 0 : alarm; + alarm += 5; + + queueAlarm(); + } + + // Decrease alarm + if(dir == +1){ + alarm -= 5; + alarm = alarm <= 0 ? -1 : alarm; + } + + draw(); +}); + + +// Clear the screen once, at startup and draw clock +g.setTheme({bg:"#000",fg:"#fff",dark:true}).clear(); draw(); -// Stop updates when LCD is off, restart when on +/* + * Stop updates when LCD is off, restart when on + */ Bangle.on('lcdPower',on=>{ if (on) { draw(); // draw immediately, queue redraw diff --git a/apps/lcars/screenshot.png b/apps/lcars/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..6cb48387d1b1bfb9192d5fa3dc17f2a19b8d51ac GIT binary patch literal 2118 zcmV-M2)Xx(P)(UPMe5JlUq{r_KPAF?VYhzJezZSJX>VJc&yLUYn0>LwyV zh=1Z%-ZHO&@n`l15Yocm*&9IY5`wKS=WYA_nxKKfu@+>bp@G3kS?S;|wo|WX^5N_{ z29WEdG_Vs^H8BI&2}3Mtu#Yf+K`1rsY9?j?gHUSN+4<^d7{FlM8Fn@E?r;Xmk%4Ps8>~Mt2L`3sz~BG=j(4zt{e}Sy zMhGDpw0Ez2f|Ge1u<|HG3I?z-p`;GiUHaTqvA`24lM0$Q$mMru{g95{%`w&9m# zDQI8<4Gm17p@9iBG%$gN1}4zZzyul^_<_`9nWuHsOt7&yn=H3Ynv;lH_MHa4A%sxX zNVN@HyS|doo$=mL>!E?aD5=c5b!auXmW_LEk9Kg^?(;dJ{V-X;E*sFcRY{}tvRv)< zq~4pl;<=@hrEU>b3l03AT!WWXcx$7?@7FM}=Jsf9Q;*L+0+^&tv%enmv`kHdl)V3q zRW&+jgw(Tbn ztxf9j2o01kgP8d#0mhT68xRltshIdBIUkmI0% z4dP{3t#|q$LIV?UXkY>jMp%%!5s5CV4`F)n=@?jF!=+z|E8Wy1r(q!9+9m<;1`S^fOr( zpoLc9aC2uK1~I`Pb89IEF|p6Xz0nxN#5Re8xD*}^?DpLyo+!LK z5><(wfW6E=pKD>5JRHCf-R``5shb6*-*w;oZ;h>L*{>?=Y8)4=E7=^S`= z52Jze`#8J)XO|II1B3Kz8n~d69CL5r**%K}rh!Y!h{M1r`L75KOaq^Pp9bD5PXNjs zv&~5ZPcrc2Uj5W&grqQ$12cF@Ez=Clpd}g%HSo5bKZIy7%)ks<(t{xeX7G|;bT=@A zm-M8off>A{H{A@(;H~HBVU3^L+CDGy{dpx%F^xa>d->ctXFVbHdS8e=oEu99Z#}sH z8oBN_|C`A*fP+%0$Q#q--ha1TNyF^#ZQYhPlzvufxe$VU9tH7!d!F`Hdws3+$$++IPAfP%5VX@6n1F7^N>dnEH2G+jSbaP-sSgYu_v;<&};Qc;UNF6)OKzAJ2F#F(t z>u}F#<2^AWkSu+xxioOkhP2dp-)MDGBy>k146-*UdP+gkxHRw+Jq%P` zU_x@h8}YjbXzZxFiUX#%Q0m zH5ahng0lpexez_Bi7P#WH{&ean{SPH+0;EFyxLd9fr0NpvhG_v@7r5+uZc5=#`SQ> z*SUGNuL!V#tsa0`#B)8stAASFlbA zxzURKe;ztCYz|z)s&jQy2X1$NqvL)Q;+vXaUbQ120G|WLta3eE%jt7(z~sO)gU{N0 zh$o(|_w&+`MI7Y7Z-Q&&P5x>r8CAIB?Ys~VmNq{djgTDh1}1Am0~2UyU;+&dOrW8G z2{aG}F1db@h*^7F@Gkm$C$0Oano$T2W7z^K2aazrV&Tb{WIhlEwvOc!Bi?~BF!{hvaspxCUPt{}`D~AX;z&ms z@CL349?Q>sYq=(FMIdIQ5poB-fyvs?zyul^m_S1V6KH5)0u2pJprL^YG&C@Q<}#Bv z?7v#)1+%OwV*z|lbAQA#zl_gZ+N!5(0Q2VoY$bpZZB`l|v w5wn9fE`KmoPltgm^sLpPfy=l}AqYX^A5N@bvKGGx^#A|>07*qoM6N<$f^h`#=>Px# literal 0 HcmV?d00001