BangleApps/apps/henkinen/app.js

128 lines
2.8 KiB
JavaScript

// Henkinen
//
// Bangle.js 2 breathing helper
// by Jukio Kallio
// www.jukiokallio.com
require("FontHaxorNarrow7x17").add(Graphics);
// settings
const breath = {
theme: "default",
x:0, y:0, w:0, h:0,
size: 60,
bgcolor: g.theme.bg,
incolor: g.theme.fg,
keepcolor: g.theme.fg,
outcolor: g.theme.fg,
font: "HaxorNarrow7x17", fontsize: 1,
textcolor: g.theme.fg,
texty: 18,
in: 4000,
keep: 7000,
out: 8000
};
// set some additional settings
breath.w = g.getWidth(); // size of the background
breath.h = g.getHeight();
breath.x = breath.w * 0.5; // position of the circles
breath.y = breath.h * 0.45;
breath.texty = breath.y + breath.size + breath.texty; // text position
var wait = 100; // wait time, normally a minute
var time = 0; // for time keeping
// timeout used to update every minute
var drawTimeout;
// schedule a draw for the next minute
function queueDraw() {
if (drawTimeout) clearTimeout(drawTimeout);
drawTimeout = setTimeout(function() {
drawTimeout = undefined;
draw();
}, wait - (Date.now() % wait));
}
// main function
function draw() {
// make date object
//var date = new Date();
// update current time
time += wait - (Date.now() % wait);
if (time > breath.in + breath.keep + breath.out) time = 0; // reset time
// Reset the state of the graphics library
g.reset();
// Clear the area where we want to draw the time
g.setColor(breath.bgcolor);
g.fillRect(0, 0, breath.w, breath.h);
// calculate circle size
var circle = 0;
if (time < breath.in) {
// breath in
circle = time / breath.in;
g.setColor(breath.incolor);
} else if (time < breath.in + breath.keep) {
// keep breath
circle = 1;
g.setColor(breath.keepcolor);
} else if (time < breath.in + breath.keep + breath.out) {
// breath out
circle = ((breath.in + breath.keep + breath.out) - time) / breath.out;
g.setColor(breath.outcolor);
}
// draw breath circle
g.fillCircle(breath.x, breath.y, breath.size * circle);
// breath area
g.setColor(breath.textcolor);
g.drawCircle(breath.x, breath.y, breath.size);
// draw text
g.setFontAlign(0,0).setFont(breath.font, breath.fontsize).setColor(breath.textcolor);
if (time < breath.in) {
// breath in
g.drawString("Breath in", breath.x, breath.texty);
} else if (time < breath.in + breath.keep) {
// keep breath
g.drawString("Keep it in", breath.x, breath.texty);
} else if (time < breath.in + breath.keep + breath.out) {
// breath out
g.drawString("Breath out", breath.x, breath.texty);
}
// queue draw
queueDraw();
}
// Clear the screen once, at startup
g.clear();
// draw immediately at first
draw();
// keep LCD on
Bangle.setLCDPower(1);
// Show launcher when middle button pressed
Bangle.setUI("clock");