mirror of https://github.com/espruino/BangleApps
223 lines
6.0 KiB
JavaScript
223 lines
6.0 KiB
JavaScript
var angle = -90;
|
|
var origin = angle * (Math.PI / 180);
|
|
var max_radius = 70;
|
|
var direction = 1;
|
|
var display_HR = "--";
|
|
var first_signal = true;
|
|
var interval;
|
|
var timeout;
|
|
var settings;
|
|
var status = 0;
|
|
|
|
var colours = {
|
|
green: ["#00ff7f", "green"],
|
|
white: ["#ffffff", "white"],
|
|
blue: ["#00abff", "blue"],
|
|
red: ["#ff3329", "red"],
|
|
yellow: ["#fdff00", "yellow"]
|
|
};
|
|
|
|
var settings_file = require("Storage").open("breath.settings.json", "r");
|
|
|
|
var test = settings_file.read(settings_file.getLength());
|
|
|
|
if(test!== undefined)
|
|
settings = JSON.parse(test);
|
|
|
|
if (settings === undefined) {
|
|
settings = {
|
|
period: 2,
|
|
exhale_pause: 1,
|
|
inhale_pause: 1,
|
|
colour: colours.green,
|
|
vibrate: "forward",
|
|
ex_in_ratio: "1:1"
|
|
};
|
|
}
|
|
|
|
var selection = ["speed", "exhale pause", "inhale pause", "colour", "vibrate",
|
|
"ex_in_ratio", "in_progress", "paused"];
|
|
|
|
var colours = {
|
|
green: ["#00ff7f", "green"],
|
|
white: ["#ffffff", "white"],
|
|
blue: ["#00abff", "blue"],
|
|
red: ["#ff3329", "red"],
|
|
yellow: ["#fdff00", "yellow"]
|
|
};
|
|
|
|
g.setFont("6x8", 2);
|
|
|
|
function circle() {
|
|
|
|
g.clear();
|
|
adjusted_radius = max_radius * Math.abs(origin);
|
|
g.drawCircle(120, 120, adjusted_radius);
|
|
radius = Math.abs(Math.sin(origin));
|
|
angle += 2;
|
|
origin = angle * (Math.PI / 180);
|
|
if (angle >= 0 && angle < 90) {
|
|
if (angle == 2) {
|
|
clearInterval();
|
|
g.setFontAlign(-1, -1);
|
|
g.drawString("<<", 220, 40);
|
|
status = 7;
|
|
timeout = setTimeout(function () {
|
|
interval = restart_interval();
|
|
}, settings.exhale_pause * 1000);
|
|
}
|
|
direction = 0;
|
|
}
|
|
else {
|
|
if (angle == 90)
|
|
angle = -90;
|
|
if (angle == -90) {
|
|
clearInterval();
|
|
g.setFontAlign(-1, -1);
|
|
g.drawString("<<", 220, 40);
|
|
status = 7;
|
|
timeout = setTimeout(function () {
|
|
interval = restart_interval();
|
|
}, settings.inhale_pause * 1000);
|
|
}
|
|
direction = 1;
|
|
}
|
|
g.drawString(display_HR, 20, 200);
|
|
|
|
g.flip();
|
|
|
|
if (settings.vibrate == "forward")
|
|
Bangle.buzz(50, Math.abs(origin)/1.5);
|
|
else if (settings.vibrate == "backward")
|
|
Bangle.buzz(50, (1.6 - (Math.abs(origin))));
|
|
}
|
|
|
|
function restart_interval() {
|
|
status = 6;
|
|
var calc = 5 - settings.period;
|
|
calc *= 15;
|
|
calc += 120;
|
|
if(direction == 1 && settings.ex_in_ratio == "5:6"){
|
|
calc -= calc*0.2;
|
|
}
|
|
interval = setInterval(circle, calc);
|
|
}
|
|
|
|
function update_menu() {
|
|
g.clear();
|
|
g.setColor(settings.colour[0]);
|
|
g.setFontAlign(-1, -1);
|
|
g.drawString("+/-", 200, 200);
|
|
g.drawString("<>", 220, 40);
|
|
g.drawString("GO", 210, 120);
|
|
g.setFontAlign(-1, -1);
|
|
var cursor = 60;
|
|
|
|
while (cursor < 180) {
|
|
var key = Object.keys(settings)[(cursor - 60) / 20];
|
|
var value = settings[key];
|
|
|
|
if (status == ((cursor - 60) / 20)) {
|
|
g.setColor(colours.white[0]);
|
|
}
|
|
else
|
|
g.setColor(settings.colour[0]);
|
|
|
|
var display_txt = selection[(cursor - 60) / 20] + ": " + value;
|
|
|
|
if(((cursor - 60) / 20) == 3)
|
|
display_txt = selection[(cursor - 60) / 20] + ": " + value[1];
|
|
|
|
g.drawString(display_txt, 10, cursor);
|
|
cursor += 20;
|
|
}
|
|
}
|
|
|
|
function btn1Pressed() {
|
|
if (status < 6) {
|
|
status += 1;
|
|
if (status == 6)
|
|
status = 0;
|
|
|
|
update_menu();
|
|
}
|
|
else if (status == 7) {
|
|
clearTimeout(timeout);
|
|
clearInterval();
|
|
status = 0;
|
|
update_menu();
|
|
}
|
|
}
|
|
|
|
function btn2Pressed() {
|
|
if (status < 6) {
|
|
settings_file = require("Storage").open("breath.settings.json", "w");
|
|
settings_file.write(JSON.stringify(settings));
|
|
Bangle.setHRMPower(1);
|
|
g.setColor(settings.colour[0]);
|
|
restart_interval();
|
|
}
|
|
}
|
|
|
|
function btn3Pressed() {
|
|
if (status < 6) {
|
|
if (status == 0) {
|
|
settings.period += 1;
|
|
if (settings.period > 6)
|
|
settings.period = 1;
|
|
}
|
|
else if (status == 1) {
|
|
settings.exhale_pause += 1;
|
|
if (settings.exhale_pause > 4)
|
|
settings.exhale_pause = 1;
|
|
}
|
|
else if (status == 2) {
|
|
settings.inhale_pause += 1;
|
|
if (settings.inhale_pause > 4)
|
|
settings.inhale_pause = 1;
|
|
}
|
|
else if (status == 3) {
|
|
if (settings.colour[0] == colours.green[0]) {
|
|
settings.colour = colours.blue;
|
|
}
|
|
else if (settings.colour[0] == colours.blue[0])
|
|
settings.colour = colours.red;
|
|
else if (settings.colour[0] == colours.red[0])
|
|
settings.colour = colours.yellow;
|
|
else if (settings.colour[0] == colours.yellow[0])
|
|
settings.colour = colours.green;
|
|
}
|
|
else if (status == 4) {
|
|
if (settings.vibrate == "forward")
|
|
settings.vibrate = "backward";
|
|
else if (settings.vibrate == "backward")
|
|
settings.vibrate = "off";
|
|
else if (settings.vibrate == "off")
|
|
settings.vibrate = "forward";
|
|
}
|
|
else if(status == 5){
|
|
if(settings.ex_in_ratio == "1:1")
|
|
settings.ex_in_ratio = "5:6";
|
|
else
|
|
settings.ex_in_ratio = "1:1";
|
|
}
|
|
update_menu();
|
|
}
|
|
}
|
|
|
|
update_menu();
|
|
|
|
setWatch(btn1Pressed, BTN1, { repeat: true });
|
|
setWatch(btn2Pressed, BTN2, { repeat: true });
|
|
setWatch(btn3Pressed, BTN3, { repeat: true });
|
|
|
|
Bangle.on('HRM', function (hrm) {
|
|
if (first_signal)
|
|
first_signal = false;
|
|
else{
|
|
var signal = hrm.bpm;
|
|
if(signal > 50 && signal < 180)
|
|
display_HR = signal;
|
|
}
|
|
});
|