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 000000000..a0139e4ca Binary files /dev/null and b/apps/ncrclk/app.png differ 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 000000000..85543d860 Binary files /dev/null and b/apps/widncr/widget.png differ