2020-04-07 21:03:30 +00:00
|
|
|
Bangle.loadWidgets();
|
|
|
|
Bangle.drawWidgets();
|
|
|
|
|
|
|
|
var settings = require("Storage").readJSON("tabata.json",1)||{};
|
|
|
|
settings.pause = settings.pause || 10;
|
|
|
|
settings.training = settings.training || 20;
|
|
|
|
settings.rounds = settings.rounds || 8;
|
|
|
|
|
|
|
|
const MAX_SECONDS = 100;
|
|
|
|
|
|
|
|
function debounce(callback, ms) {
|
|
|
|
var timer;
|
|
|
|
return () => {
|
|
|
|
if (timer) clearTimeout(timer);
|
|
|
|
timer = setTimeout(callback, ms);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function saveSettings() {
|
|
|
|
require("Storage").write("tabata.json",JSON.stringify(settings));
|
|
|
|
}
|
|
|
|
|
|
|
|
var saveSettingsDebounce = debounce(saveSettings, 250);
|
|
|
|
|
|
|
|
function showMainMenu() {
|
|
|
|
const menu = {
|
|
|
|
'': { 'title': 'Tabata Training' },
|
|
|
|
'>> Start >>': ()=> {
|
|
|
|
startTabata();
|
|
|
|
},
|
|
|
|
'Pause sec.': {
|
|
|
|
value: settings.pause,
|
2022-02-23 16:11:34 +00:00
|
|
|
min : 0, max : MAX_SECONDS, wrap : true,
|
|
|
|
onchange: v => {
|
2020-04-07 21:03:30 +00:00
|
|
|
settings.pause=v;
|
|
|
|
saveSettingsDebounce();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'Trainig sec.': {
|
|
|
|
value: settings.training,
|
2022-02-23 16:11:34 +00:00
|
|
|
min : 0, max : MAX_SECONDS, wrap : true,
|
|
|
|
onchange: v => {
|
|
|
|
settings.training=v;
|
2020-04-07 21:03:30 +00:00
|
|
|
saveSettingsDebounce();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'Rounds': {
|
|
|
|
value: settings.rounds,
|
|
|
|
onchange: function(v){if (v<0)v=MAX_SECONDS;if (v>MAX_SECONDS)v=0;settings.rounds=v;this.value=v;
|
|
|
|
saveSettingsDebounce();
|
|
|
|
}
|
|
|
|
},
|
|
|
|
'< Back': () => load()
|
|
|
|
};
|
|
|
|
menu['< Back'] = ()=>{load();};
|
|
|
|
return E.showMenu(menu);
|
|
|
|
}
|
|
|
|
|
|
|
|
function startTabata() {
|
|
|
|
g.clear();
|
|
|
|
Bangle.setLCDMode("doublebuffered");
|
|
|
|
g.flip();
|
2022-02-23 16:11:34 +00:00
|
|
|
var pause = settings.pause,
|
|
|
|
training = settings.training,
|
2020-04-07 21:03:30 +00:00
|
|
|
round = 1,
|
|
|
|
active = true,
|
|
|
|
clearBtn1, clearBtn2, clearBtn3, timer;
|
|
|
|
Bangle.buzz(1000, 1);
|
|
|
|
|
|
|
|
function exitTraining() {
|
|
|
|
clearTimeout(timer);
|
|
|
|
clearWatch(clearBtn1);
|
|
|
|
clearWatch(clearBtn2);
|
2024-03-04 20:34:50 +00:00
|
|
|
clearWatch(clearBtn2); // TODO: Should it be Btn3 here?
|
2020-04-07 21:03:30 +00:00
|
|
|
showMainMenu();
|
|
|
|
}
|
|
|
|
|
|
|
|
clearBtn1 = setWatch(exitTraining, BTN1);
|
|
|
|
clearBtn2 = setWatch(exitTraining, BTN2);
|
|
|
|
clearBtn3 = setWatch(exitTraining, BTN3);
|
|
|
|
|
|
|
|
|
|
|
|
timer = setInterval(function() {
|
|
|
|
if (round > settings.rounds) {
|
|
|
|
exitTraining();
|
|
|
|
return;
|
|
|
|
}
|
2022-02-23 16:11:34 +00:00
|
|
|
|
2020-04-07 21:03:30 +00:00
|
|
|
if (active) {
|
|
|
|
drawCountDown(round, training, active);
|
|
|
|
training--;
|
|
|
|
} else {
|
|
|
|
drawCountDown(round, pause, active);
|
|
|
|
pause--;
|
|
|
|
if (pause !== 0) {
|
|
|
|
Bangle.buzz(50, 0.2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (training === 0) {
|
|
|
|
training = settings.training;
|
|
|
|
active = false;
|
|
|
|
Bangle.buzz(500, 1);
|
|
|
|
}
|
|
|
|
if (pause === 0) {
|
|
|
|
round++;
|
|
|
|
pause = settings.pause;
|
|
|
|
active = true;
|
|
|
|
Bangle.buzz(1000, 1);
|
|
|
|
}
|
|
|
|
}, 1000);
|
|
|
|
}
|
|
|
|
|
|
|
|
function drawCountDown(round, count, active) {
|
|
|
|
g.clear();
|
|
|
|
|
|
|
|
g.setFontAlign(0,0);
|
|
|
|
g.setFont("6x8", 2);
|
2022-02-23 16:11:34 +00:00
|
|
|
g.drawString("Round " + round + "/" + settings.rounds,120,6);
|
2020-04-07 21:03:30 +00:00
|
|
|
|
|
|
|
g.setFont("6x8", 6);
|
|
|
|
g.drawString("" + count,120,80);
|
|
|
|
|
|
|
|
g.setFont("6x8",2);
|
|
|
|
g.drawString(active ? "Training" : "Pause", 120,45);
|
|
|
|
g.flip();
|
|
|
|
}
|
|
|
|
|
|
|
|
showMainMenu();
|