From feaf011beef6abe5223ea249e6bc9563c5b1540c Mon Sep 17 00:00:00 2001 From: Nico Kaiser Date: Mon, 2 Nov 2020 19:57:24 +0100 Subject: [PATCH] Add a watch face and a widget for NodeConf Remote --- apps.json | 24 ++++++++ apps/ncrclk/ChangeLog | 1 + apps/ncrclk/app-icon.js | 1 + apps/ncrclk/app.js | 129 ++++++++++++++++++++++++++++++++++++++++ apps/ncrclk/app.png | Bin 0 -> 5893 bytes apps/widncr/ChangeLog | 1 + apps/widncr/widget.js | 5 ++ apps/widncr/widget.png | Bin 0 -> 3915 bytes 8 files changed, 161 insertions(+) create mode 100644 apps/ncrclk/ChangeLog create mode 100644 apps/ncrclk/app-icon.js create mode 100644 apps/ncrclk/app.js create mode 100644 apps/ncrclk/app.png create mode 100644 apps/widncr/ChangeLog create mode 100644 apps/widncr/widget.js create mode 100644 apps/widncr/widget.png diff --git a/apps.json b/apps.json index e089a6b13..3c04f292a 100644 --- a/apps.json +++ b/apps.json @@ -2332,5 +2332,29 @@ {"name":"smartibot.app.js","url":"app.js"}, {"name":"smartibot.img","url":"app-icon.js","evaluate":true} ] + }, + { "id": "widncr", + "name": "NCR Logo Widget", + "icon": "widget.png", + "version":"0.01", + "description": "Show the NodeConf Remote logo in the top left", + "tags": "widget", + "type":"widget", + "storage": [ + {"name":"widncr.wid.js","url":"widget.js"} + ] + }, + { "id": "ncrclk", + "name": "NCR Clock", + "shortName":"NCR Clock", + "icon": "app.png", + "version":"0.01", + "description": "NodeConf Remote clock", + "tags": "clock", + "type": "clock", + "storage": [ + {"name":"ncrclk.app.js","url":"app.js"}, + {"name":"ncrclk.img","url":"app-icon.js","evaluate":true} + ] } ] diff --git a/apps/ncrclk/ChangeLog b/apps/ncrclk/ChangeLog new file mode 100644 index 000000000..68209352b --- /dev/null +++ b/apps/ncrclk/ChangeLog @@ -0,0 +1 @@ +0.01: A copy of the analogimgclk to work for NodeConf Remote diff --git a/apps/ncrclk/app-icon.js b/apps/ncrclk/app-icon.js new file mode 100644 index 000000000..e9c28da6b --- /dev/null +++ b/apps/ncrclk/app-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkGswA/AFEiAAMoCqcykWEDQQWW0YYNsQXCn8//8zDgMiwwWNmf/CwICCDAUmIpYWD+YYFkIuKkYTBCogGCmUhGBAuBn4QBF4wJBiR6IFwYRCFoYBCVZBGBRQIYFFwaUBkUWFw4XKBIUhGAwXBEwYXFmcTBIMxC4pGBUgQXCLYc/kMvAgKqBSIheGGInyiQGCn8SC43zCwouDHQfzF4x2DFAgFCCwbaBSAi9CAAPxiMTRIcvEQIYCeQIXI+chiMSn8zGgJeDn8yiQXHBoMzDAMRiEzCwgXBF5IPCCwMQCoZUDYAhHFCQUBgIHFF5YRDkMDCwpfKAAn074UDC5QOHC48xL4jvDF5kznFGC4ovOmciwwXFWwIACB4M0C48hC4x4EC44kB+UYI4h4DGIhHEBIUyjAWEC4JIEF4VPF4shlAXFJAYQD+gXBEAcziReEGAg/F74ECBIIuHC4UhCAIZC+UzOokhkIXHJAMTDAQCGmOEkwXHGASSDAQk4oUSCxAwCiUjC4sooUhFxIYCkMilEzCwMymIgBRg5JGiUiwoDBlUijFCCxgYDIQIXCRZAAJJQIWBCqIA/AC4=")) diff --git a/apps/ncrclk/app.js b/apps/ncrclk/app.js new file mode 100644 index 000000000..05c62530e --- /dev/null +++ b/apps/ncrclk/app.js @@ -0,0 +1,129 @@ +var locale = require("locale"); + +var bgimg = { + width : 100, height : 100, bpp : 4, + buffer : require("heatshrink").decompress(atob("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")) +} + +function getImg(g, col) { + return { + width:g.getWidth(), + height:g.getHeight(), + bpp:1,transparent:0, + buffer:g.buffer, + palette:new Uint16Array([0,col])}; +} + +var handSizeMin = 40; +var handSizeHr = 25; +var handSizeSec = 55; +var gmin = Graphics.createArrayBuffer(6,handSizeMin*2,1,{msb:true}); +var gminimg = getImg(gmin, 0xFFFF); +var ghr = Graphics.createArrayBuffer(8,handSizeHr*2,1,{msb:true}); +var ghrimg = getImg(ghr, g.setColor("#E0E0E0").getColor()); +var gsec = Graphics.createArrayBuffer(2,handSizeSec*2,1,{msb:true}); +var gsecimg = getImg(gsec, g.setColor("#FF0000").getColor()); +var lastDate; + +// create hand images +var c = gmin.getHeight()/2; +var o = 8; // overhang +gmin.fillCircle(2,2,2); +gmin.fillCircle(2,c+o,2); +gmin.fillRect(0,2,4,c+o); +c = ghr.getHeight()/2; +ghr.fillCircle(4,4,4); +ghr.fillCircle(4,c+o,4); +ghr.fillRect(0,4,7,c+o); +c = gsec.getHeight()/2; +gsec.fillRect(0,1,2,c+o); + +// last positions of hands (in radians) +var lastrmin=0, lastrhr=0, lastrsec=0; + +// draw hands - just the bit of the image that changed +function drawHands(full) { + var d = new Date(); + var rsec = d.getSeconds()*Math.PI/30; + var rmin = d.getMinutes()*Math.PI/30; + // hack so hour hand only moves every 10 minutes + var rhr = (d.getHours() + Math.round(d.getMinutes()/10)/6)*Math.PI/6; + var bounds = {}; + if (!full) { // work out the bounds of the hands + var x1 = (g.getWidth()/2)-10; + var y1 = (g.getHeight()/2)-10 - 36; + var x2 = (g.getWidth()/2)+10; + var y2 = (g.getHeight()/2)+10 - 36; + function addPt(ang, r, ry) { + var x = (g.getWidth()/2) + Math.sin(ang)*r + Math.cos(ang)*ry; + var y = (g.getHeight()/2) - Math.cos(ang)*r + Math.sin(ang)*ry - 36; + //g.setColor("#ff0000").fillRect(x-2,y-2,x+2,y+2); + if (xx2)x2=x; + if (y>y2)y2=y; + } + function addSec(r) { + addPt(r,handSizeSec,5);addPt(r,handSizeSec,-5); + addPt(r,-(o+8),5);addPt(r,-(o+8),-5); + } + function addMin(r) { + addPt(r,handSizeMin,5);addPt(r,handSizeMin,-5); + addPt(r,-(o+8),5);addPt(r,-(o+8),-5); + } + function addHr(r) { + addPt(r,handSizeHr,8);addPt(r,handSizeHr,-8); + addPt(r,-(o+8),8);addPt(r,-(o+8),-8); + } + if (rsec!=lastrsec) { + addSec(rsec);addSec(lastrsec); + } + if (rmin!=lastrmin) { + addMin(rmin);addMin(lastrmin); + } + if (rhr!=lastrhr) { + addHr(rhr);addHr(lastrhr); + } + bounds = {x:x1,y:y1,width:1+x2-x1,height:1+y2-y1}; + } + + g.drawImages([ + {image:bgimg,x:20,y:25,scale:2}, + {image:ghrimg,x:120,y:120-31,center:true,rotate:rhr}, + {image:gminimg,x:120,y:120-31,center:true,rotate:rmin}, + {image:gsecimg,x:120,y:120-31,center:true,rotate:rsec} + ],bounds); + lastrsec = rsec; + lastrmin = rmin; + lastrhr = rhr; + + // Date + var date = locale.date(new Date(),false); + if (date === lastDate) return; + lastDate = date; + g.reset(); + g.setFont("6x8"); + g.setFontAlign(0,-1); + g.drawString(date, g.getWidth()/2, 232, true); +} + +var secondInterval = setInterval(drawHands,1000); +// handle display switch on/off +Bangle.on('lcdPower', (on) => { + if (secondInterval) { + clearInterval(secondInterval); + secondInterval = undefined; + } + if (on) { + drawHands(); + secondInterval = setInterval(drawHands,1000); + } +}); + +g.clear(); +Bangle.loadWidgets(); +Bangle.drawWidgets(); +drawHands(true); + +// Show launcher when middle button pressed +setWatch(Bangle.showLauncher, BTN2, { repeat: false, edge: "falling" }); diff --git a/apps/ncrclk/app.png b/apps/ncrclk/app.png new file mode 100644 index 0000000000000000000000000000000000000000..a0139e4ca3364bfd02931c5321609d8b58a8b054 GIT binary patch literal 5893 zcmbVQc{r5&+keJPNTnf(kTIc>WsH3>G$F(e5HWF4gxJ4_lU#`uBH5Kl`lF)1 z4XhGeT1rYn>QBfB=ZnQ#spH(S1Tsx{ zCAg&Qe}LA12mcW6C$l~gLnD^>k@qL0t)^z=Np!~HX_zGrgN13L-MuI<6HV10fd@j$ zYrCUeuzFa63&r)1lm7&0S^v3z&>`OIz#`@Z98DACpIladVoGosB+Z-$#`(c!{f`js zuF31u?2SQF(CTOktxO~Wi4YMN7eOG+#AW0q5%S{5iwJRf#80Xp@k9*H+3){~KCm=Q zkruD7FRz6oQ;42^Kem4Q+!X8abMAyE9C6ADi zM@szOpx8f_^uu}owWOcu|D&XziGMHYubTf}lA_qbF!+~fiei70^=H7pO%GZtKlf-; zi8kKE{+MsH#UB$AOQ4NKPul!@*2%5{03dZ7&98s;DFB>La6+NhI<ppX;cTZI}XWKiJ5d}M?82rR&Kf!+!uO!ZYDMLJP>wlhUa=DDN-+zEz*qs z5WP>NdZcZnNhB*wf$?S7#d{nf?-^USy%|n#S}=-3v_wUO!jPO9v4_`Lobi2*C{opx z$GU6M;I>|GdU|`#@br0gdU|#R`beix;ElF<;dU|cEA3r$n51P*27n_c4lWRoN#y_l zC{$bhvYAyxgEfv~XX!OQOI4`%yKeY8;56R)4XQI0qu?92^qft1l5+xvQ!TSXdjUUoNT3@MzKgunw{c0V+8(~cvlUHrJOyI!becsGLl9j7&dAVQTg)old#C z7uOLvZ|j{*HhbB|lN*bzrf)g*Y&9jC(fmB3QgtItE;IU z7u5l%;5@zA73IT9$F=ffK`;npvO_24az-x)eWAy_O=Pt&j0cuK-}z}y;K(fR@+a$O zYee=(71!r1cg!u=^4D$^ZvpS)_jknvJ8flZR>x`-EXxRe{M+W&I7S~bzJK3bf8`nL zSqOks%`L(sIh>m1NZGjzGGHy2K<(zmJK_K%$6n>oqw^?lEmeD$lJQ$UF9zvrj0EOl zii0%$BabfyEM(s1lAZ{PC^jC#)2C}go_NHx&wQ~A-nwg3-n7-#5HP-|IQSMy*@-S2 z{=B4ba6RA0M(0AhMp38bhM|Zh8WL;FIju2%4I&Z!T%sQEh4EK>eRU?|!?7pcn)7;B z*KM?t49lyulT6PBG5Nbq^yW4Bz2D$f4lPY-o4OEkHB!9`Ax#E)L5vI?vK<^B{G1Z_ zRcFreZq=OKZ`@o?qf7u#8}xJDTvg8$*oNC)DS0j--J1A?aed=pd{~>maK>BwK{2}IaCeZ zU#+a~BNimPATyh~sePXg>AM#fx_Zd)C=RV3H&h&zLR1pJX6g6@7P_n?XGY^VJJLg5 z7O%-Se^3v^*gRrDdt@$t!!N;N!sS%$#FtREWn^74_dT2N$0cdrCXI8wS#L$~BRj*U z%oE=|B9;%&jjnHl6%?)~u(lhA|JE=@l@< zd9?Qn>BV^yU(S~+vT)h$wCh_6UwyLV(lqvUI@b`33@YjjPjn+4+I#d}LVmD!FqKrE z4!YYWw|zK%RAa?zJc?iNg#Lo`_02sdgLU&gU+vtkh1JmUMH%yFMoiO`==jv5oS#}f z9jg#`Jwb*{=qPHZ{{35c(V7~|H>T!Gaq*w1CoZ+D9bz7=U9I-P?@W|+-XwVJ%tYeH zowI^>Fe-FMo6+7~vJ9~UM9sC47q^nv>EpRQZ33N54-akXv+*DaD=+OO#AQ|3jUy%e zpIPJAbe*3gg`@(_vk0SBw>Jjv_F@FFsbw)-vm(R{nbbIMfmV8k8hjbq5+WQIS7cgT z3Jw7;u8*Z~+GCa-;PjA+^kR>X01J#3?Djm-?DY|A|u}RKPHl53em8K4W+0h9T z{7|i8JR)y1F21y=Y-sDdMCRq|tHYaRcHkks&vjX;Dl2m~9eJw_c3}gmSJYeK!Cv`2 z3aPqB3-WaMB6PU{$l_@|!$|Vsl;Ur~*<$n%fPPk~W}AImKep9O{8_`K^(S$$!|6R7 z3&~%fr$mQV%A%MunhBMJr`x6l0t?IA^KJfb2@xJ>CU$yx?PWJV#n@=F zX3Qr{T_o7Z>#Q>_@4JUcZv`CN@ z#E14at@HhUiLnz>63feF*f_*hB0Y6A3)9-1exbzI9inl?d!haQpyOj{5!b8LTm3}) zvDG@>kn-MjKee~xYefOee$#WBf_2BEA;S0c`S{X0O$F*1Sc(Qj*(d?RA+ z(8+EMFTZkIC|=0q4Z^SdR!JgztuVYT55&1FD?HFN_=)N1J3N%$A_+-^zA5-EkxHW*0VVRQv~Wd%h`d-oh?9)Xi#sy}na7 z#-mw+8@_|TsO%Auo!NR%U&%PR|&gH z&9s=x*ajg`aV{+)t4nCSXV~8uYCM+T7xuu3c|xOV4cwy{*nij=uQt~EVy2=&&i^0g>4aT7F+ zvDkCghyv4_?K?Oap4VU=B^KeMu5K1CTH$}2j0|bNGw9C#A=YA%`RmYbsu}&n!(Xm> zI1R=G)hTQ{)?SOM^}0Qn`vt4emQ;w*Q!kp(oAJ{V$c~%+Lb6|qS+{Xx3#kWK4^c41 z{o9eZ81L~?m_ebPss?b!x+X#H>`%wpkcH{5tEHY)VRLSs$WRYkrCnb@r_!vqqtN`JEYlyFQL|R zB-)DaF30-_oo2sY34<^ThAYnnMy^yEYxAsS0Fcvo&ukFD$Ak z4XcQM`%UI^Sfc@8X*(FNNw&B_w8Q2GwPb^y%W7IZtyu5@&z=9Mh}jr_LTXp*QR2QdS_)83-Xb=hHom!_bwlEM0g9E;J0$0MooYjLnJydEo={EvlRJ4 zSK}(jAw76k>+8G2Szq@T^VJ@V4}gWw@H|9S_HwSEM-qw>ZkUC`S_D~`sUTMID0S+2 zerAnxcB8h-!amWe^3r+@IX=u(j=kNaESd4z)ms*%9wo_?vy8*v%bBvYS;euleTz6| zkFbFep@qEIV;Ix6jH1N5pin`VejAJ6s{Nx^6{tvxI({@Y9Sw_#zKsHzu77YscN0oMVNPdqCH%cu07V5L|jrPT+7=)YL1iE`x;W z?wkk95r>?S`ex%95BV2`Yuy#OC8ap)$|oCRNjE?5j-CR{>;@^t2AT|P_l2(E9lt#3 zky%!(oL#R8E-r7}wXFCa7@k69f1wz#rEe~p71f7fY8z^uJ|e>X^!)p$ju87ePJBT{ z9{JuZ3-vxreeJrGtGjKC&K<`g zv;M<=*K?;&(($vhfaxyb%0Bo`U5+pbfBEG!mSXtxTVbH9)H+Knk%p-+yem+K2TrcW#yIo%Et*aCqo~? zhDAASp`;E(2v~J0q4LeeirnSO#>Rzs1N`=mLesZT!HtOD6c+iVsGc3~@E(UjGST6= z6Yqn3_83D4+nv}LhTsgTk4OVh2xrv8kGIQo7i{d_6sOty4gB)*T20uozO4@_>Zw~1 zOv9Q9zls_^xY8_l?%t>3FK43xx{h?7L-!cTDuOXWrz?LeSARa9 zKsD|KLEnuTluSsB51lB?eNc2wkb8A7@^u14A{N&O*ApGw`dIidicy{QMpzyE;p8S4 zhz$|~1$A2nEs@8IVGoY#zQ_J@<5ho=3qI0HaZJWm@1!u{oReA4jP8kOTj6}S`I|?g zc^%V|s;oO?!2pR~F|%Mc??Maz$`Q%ex=&v1zZGxbMt94(Kl5s<&w9hx&mzdna4c|< t5d@HWg_$o(_+D^mrrXkL-)-3p)($w<#%-CAfAH_MwuXUvxhg93e*hy5JL&)c literal 0 HcmV?d00001 diff --git a/apps/widncr/ChangeLog b/apps/widncr/ChangeLog new file mode 100644 index 000000000..4c21f3ace --- /dev/null +++ b/apps/widncr/ChangeLog @@ -0,0 +1 @@ +0.01: New Widget! diff --git a/apps/widncr/widget.js b/apps/widncr/widget.js new file mode 100644 index 000000000..7efa59273 --- /dev/null +++ b/apps/widncr/widget.js @@ -0,0 +1,5 @@ +WIDGETS["ncr"]={area:"tl",width:75,draw:function(){ + g.reset().setColor(1,0.2,0.5); + g.drawImage(atob("SxgCAAAAAAAAAAAAAAAAAAAAAAAAApAKAGpAGqgBqqQG+AAApAKBqq/APA//gP/9C//g//wAA/QPD///wPD//4P//S9VS9GRpA/wPD5V/4PH//9P//y4AD0AH/g/4PD4A99PL//+P//y//HwAL/w99PD+p8vPL//+P//2//LgAP/w9fPD/+9P/L//+P//y4AHwAL/w9P/D4A9D/H//9P//y4AD4AD/Q9D/D4A9B/D//4P//S//h+rQUA9B/D4A9AvA//gP/9C//gf/gAA9AvC0AAAAAGpAFVQAAAABpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaoCqkgAUC+BqpKqQAuAuQaQLggGDAA4A4NBwDAIAACRiQxw0kcgCTAA5DokAYDAIAAAAyAYAqQJgDDFQzGowAMDAIVAABqAMA3AGv5Dqgx8owAMDAOqAAHJAMCTAGgcDAAwUowAYDAIAAAcGAMJCAKgFDAAwAocAwDAIAABgDAk0BgMgDTqkwAoHrQDAOqQHqh7S60e0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"), this.x,this.y); + g.setColor(1,1,1); +}}; diff --git a/apps/widncr/widget.png b/apps/widncr/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..85543d860b73918b7429028831b87a5765be3bd0 GIT binary patch literal 3915 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 literal 0 HcmV?d00001