Permalink
Cannot retrieve contributors at this time
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
138 lines (126 sloc)
4.48 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var hour_hand = { | |
width : 61, height : 8, bpp : 1, | |
transparent : 0, | |
buffer : E.toArrayBuffer(atob("/////////////////////////////////////////////////////////////////////////////////w==")) | |
}; | |
var minute_hand = { | |
width : 110, height : 4, bpp : 1, | |
transparent : 0, | |
buffer : E.toArrayBuffer(atob("/////////////////////////////////////////////////////////////////////////w==")) | |
}; | |
//g.fillRect(0,24,239,239); // Apps area | |
let intervalRef = null; | |
const p180 = Math.PI/180; | |
const clock_center = {x:Math.floor((g.getWidth()-1)/2), y:24+Math.floor((g.getHeight()-25)/2)}; | |
// ={ x: 119, y: 131 } | |
const radius = Math.floor((g.getWidth()-24+1)/2); // =108 | |
let tick0 = Graphics.createArrayBuffer(30,8,1,{msb:true}); | |
tick0.fillRect(0,0,tick0.getWidth()-1, tick0.getHeight()-1); | |
let tick5 = Graphics.createArrayBuffer(20,6,1,{msb:true}); | |
tick5.fillRect(0,0,tick5.getWidth()-1, tick5.getHeight()-1); | |
let tick1 = Graphics.createArrayBuffer(8,4,1,{msb:true}); | |
tick1.fillRect(0,0,tick1.getWidth()-1, tick1.getHeight()-1); | |
// Adjust hand lengths to be within 'tick' points | |
minute_hand.width=radius-tick1.getWidth()-6; | |
hour_hand.width=radius-tick5.getWidth()-6; | |
function big_wheel_x(angle){ | |
return clock_center.x + radius * Math.cos(angle*p180); | |
} | |
function big_wheel_y(angle){ | |
return clock_center.y + radius * Math.sin(angle*p180); | |
} | |
function rotate_around_x(center_x, angle, tick){ | |
return center_x + Math.cos(angle*p180) * tick.getWidth()/2; | |
} | |
function rotate_around_y(center_y, angle, tick){ | |
return center_y + Math.sin(angle*p180) * tick.getWidth()/2; | |
} | |
function hour_pos_x(angle){ | |
return clock_center.x + Math.cos(angle*p180) * hour_hand.width/2; | |
} | |
function hour_pos_y(angle){ | |
return clock_center.y + Math.sin(angle*p180) * hour_hand.width/2; | |
} | |
function minute_pos_x(angle){ | |
return clock_center.x + Math.cos(angle*p180) * minute_hand.width/2; | |
} | |
function minute_pos_y(angle){ | |
return clock_center.y + Math.sin(angle*p180) * minute_hand.width/2; | |
} | |
function minute_angle(date){ | |
//let minutes = date.getMinutes() + date.getSeconds()/60; | |
let minutes = date.getMinutes(); | |
return 6*minutes - 90; | |
} | |
function hour_angle(date){ | |
let hours= date.getHours() + date.getMinutes()/60; | |
return 30*hours - 90; | |
} | |
function draw_clock(){ | |
//console.log("draw_clock"); | |
let date = new Date(); | |
g.reset(); | |
g.clearRect(0,24,239,239); // clear app area | |
// draw cross lines for testing | |
// g.setColor(1,0,0); | |
// g.drawLine(clock_center.x - radius, clock_center.y, clock_center.x + radius, clock_center.y); | |
// g.drawLine(clock_center.x, clock_center.y - radius, clock_center.x, clock_center.y + radius); | |
g.setColor(g.theme.fg); | |
let ticks = [0, 90, 180, 270]; | |
ticks.forEach((item)=>{ | |
let agl = item+180; | |
g.drawImage(tick0.asImage(), rotate_around_x(big_wheel_x(item), agl, tick0), rotate_around_y(big_wheel_y(item), agl, tick0), {rotate:agl*p180}); | |
}); | |
ticks = [30, 60, 120, 150, 210, 240, 300, 330]; | |
ticks.forEach((item)=>{ | |
let agl = item+180; | |
g.drawImage(tick5.asImage(), rotate_around_x(big_wheel_x(item), agl, tick5), rotate_around_y(big_wheel_y(item), agl, tick5), {rotate:agl*p180}); | |
}); | |
let hour_agl = hour_angle(date); | |
let minute_agl = minute_angle(date); | |
g.drawImage(hour_hand, hour_pos_x(hour_agl), hour_pos_y(hour_agl), {rotate:hour_agl*p180}); // | |
g.drawImage(minute_hand, minute_pos_x(minute_agl), minute_pos_y(minute_agl), {rotate:minute_agl*p180}); // | |
g.setColor(g.theme.fg); | |
g.fillCircle(clock_center.x, clock_center.y, 6); | |
g.setColor(g.theme.bg); | |
g.fillCircle(clock_center.x, clock_center.y, 3); | |
// draw minute ticks. Takes long time to draw! | |
g.setColor(g.theme.fg); | |
for (var i=0; i<60; i++){ | |
let agl = i*6+180; | |
g.drawImage(tick1.asImage(), rotate_around_x(big_wheel_x(i*6), agl, tick1), rotate_around_y(big_wheel_y(i*6), agl, tick1), {rotate:agl*p180}); | |
} | |
g.flip(); | |
//console.log(date); | |
} | |
function clearTimers(){ | |
//console.log("clearTimers"); | |
if(intervalRef) { | |
clearInterval(intervalRef); | |
intervalRef = null; | |
//console.log("interval is cleared"); | |
} | |
} | |
function startTimers(){ | |
//console.log("startTimers"); | |
if(intervalRef) clearTimers(); | |
intervalRef = setInterval(draw_clock, 60*1000); | |
//console.log("interval is set"); | |
draw_clock(); | |
} | |
Bangle.on('lcdPower', (on) => { | |
if (on) { | |
//console.log("lcdPower: on"); | |
Bangle.drawWidgets(); | |
startTimers(); | |
} else { | |
//console.log("lcdPower: off"); | |
clearTimers(); | |
} | |
}); | |
g.clear(); | |
Bangle.loadWidgets(); | |
Bangle.drawWidgets(); | |
startTimers(); | |
// Show launcher when button pressed | |
Bangle.setUI("clock"); |