// 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");