Skip to content

Commit

Permalink
Added analog clock with image background
Browse files Browse the repository at this point in the history
  • Loading branch information
gfwilliams committed Jun 4, 2020
1 parent f18c9c6 commit 50a2df6
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 0 deletions.
14 changes: 14 additions & 0 deletions apps.json
Expand Up @@ -1826,6 +1826,20 @@
{"name":"animclk.img","url":"app-icon.js","evaluate":true}
]
},
{ "id": "analogimgclk",
"name": "Analog Clock (Image background)",
"shortName":"Analog Clock",
"icon": "app.png",
"version":"0.01",
"description": "An analog clock with an image background",
"tags": "clock",
"type": "clock",
"storage": [
{"name":"analogimgclk.app.js","url":"app.js"},
{"name":"analogimgclk.bg.img","url":"bg.img"},
{"name":"analogimgclk.img","url":"app-icon.js","evaluate":true}
]
},
{
"id": "verticalface",
"name": "Vertical watch face",
Expand Down
1 change: 1 addition & 0 deletions apps/analogimgclk/ChangeLog
@@ -0,0 +1 @@
0.01: New App!
1 change: 1 addition & 0 deletions apps/analogimgclk/app-icon.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

115 changes: 115 additions & 0 deletions apps/analogimgclk/app.js
@@ -0,0 +1,115 @@
var bgimg = require("Storage").read("analogimgclk.bg.img");

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 = 90;
var handSizeHr = 60;
var handSizeSec = 96;
var gmin = Graphics.createArrayBuffer(12,handSizeMin*2,1,{msb:true});
var gminimg = getImg(gmin, 0xFFFF);
var ghr = Graphics.createArrayBuffer(16,handSizeHr*2,1,{msb:true});
var ghrimg = getImg(ghr, g.setColor("#E0E0E0").getColor());
var gsec = Graphics.createArrayBuffer(6,handSizeSec*2,1,{msb:true});
var gsecimg = getImg(gsec, g.setColor("#FF0000").getColor());

// create hand images
var c = gmin.getHeight()/2;
var o = 16; // overhang
gmin.fillCircle(6,6,6);
gmin.fillCircle(6,c+o,6);
gmin.fillRect(0,6,11,c+o);
c = ghr.getHeight()/2;
ghr.fillCircle(8,8,8);
ghr.fillCircle(8,c+o,8);
ghr.fillRect(0,8,15,c+o);
c = gsec.getHeight()/2;
gsec.fillCircle(3,3,3);
gsec.fillCircle(3,c+o,3);
gsec.fillRect(0,3,5,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;
var x2 = (g.getWidth()/2)+10;
var y2 = (g.getHeight()/2)+10;
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;
//g.setColor("#ff0000").fillRect(x-2,y-2,x+2,y+2);
if (x<x1)x1=x;
if (y<y1)y1=y;
if (x>x2)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,8);addPt(r,handSizeMin,-8);
addPt(r,-(o+8),8);addPt(r,-(o+8),-8);
}
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:24,y:24},
{image:ghrimg,x:120,y:120,center:true,rotate:rhr},
{image:gminimg,x:120,y:120,center:true,rotate:rmin},
{image:gsecimg,x:120,y:120,center:true,rotate:rsec}
],bounds);
lastrsec = rsec;
lastrmin = rmin;
lastrhr = rhr;
}

if (g.drawImages) {
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();
drawHands(true);
} else {
E.showMessage("Please update\nBangle.js firmware\nto use this clock","analogimgclk");
}
Binary file added apps/analogimgclk/app.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/analogimgclk/bg.img
Binary file not shown.

0 comments on commit 50a2df6

Please sign in to comment.