mirror of https://github.com/espruino/BangleApps
Removed debug outputs, fixed rendering for upper limit, improved rendering for +/- icons, changelog version order fixed
parent
d4ab3c075d
commit
72d389e1da
|
@ -867,7 +867,7 @@
|
||||||
{ "id": "wohrm",
|
{ "id": "wohrm",
|
||||||
"name": "Workout HRM",
|
"name": "Workout HRM",
|
||||||
"icon": "app.png",
|
"icon": "app.png",
|
||||||
"version":"0.05",
|
"version":"0.06",
|
||||||
"description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.",
|
"description": "Workout heart rate monitor notifies you with a buzz if your heart rate goes above or below the set limits.",
|
||||||
"tags": "hrm,workout",
|
"tags": "hrm,workout",
|
||||||
"type": "app",
|
"type": "app",
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
0.05: Improved buzz timing and rendering
|
|
||||||
0.04: Only buzz on high confidence (>85%)
|
|
||||||
0.03: Optimized rendering for the background
|
|
||||||
0.02: Adapted to new App code layout
|
|
||||||
0.01: Only tested on the emulator.
|
0.01: Only tested on the emulator.
|
||||||
|
0.02: Adapted to new App code layout
|
||||||
|
0.03: Optimized rendering for the background
|
||||||
|
0.04: Only buzz on high confidence (>85%)
|
||||||
|
0.05: Improved buzz timing and rendering
|
||||||
|
0.06: Removed debug outputs, fixed rendering for upper limit, improved rendering for +/- icons, changelog version order fixed
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
/* eslint-disable no-undef */
|
/* eslint-disable no-undef */
|
||||||
const Setter = {
|
const Setter = {
|
||||||
NONE: "none",
|
NONE: "none",
|
||||||
UPPER: 'upper',
|
UPPER: 'upper',
|
||||||
LOWER: 'lower'
|
LOWER: 'lower'
|
||||||
};
|
};
|
||||||
|
|
||||||
const shortBuzzTimeInMs = 80;
|
const shortBuzzTimeInMs = 80;
|
||||||
const longBuzzTimeInMs = 400;
|
const longBuzzTimeInMs = 400;
|
||||||
|
|
||||||
|
@ -77,11 +77,11 @@ function drawTrainingHeartRate() {
|
||||||
//Only redraw if the display is on
|
//Only redraw if the display is on
|
||||||
if (Bangle.isLCDOn()) {
|
if (Bangle.isLCDOn()) {
|
||||||
renderUpperLimit();
|
renderUpperLimit();
|
||||||
|
|
||||||
renderCurrentHeartRate();
|
renderCurrentHeartRate();
|
||||||
|
|
||||||
renderLowerLimit();
|
renderLowerLimit();
|
||||||
|
|
||||||
renderConfidenceBars();
|
renderConfidenceBars();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -90,24 +90,24 @@ function drawTrainingHeartRate() {
|
||||||
|
|
||||||
function renderUpperLimit() {
|
function renderUpperLimit() {
|
||||||
if(!upperLimitChanged) { return; }
|
if(!upperLimitChanged) { return; }
|
||||||
|
|
||||||
g.setColor(1,0,0);
|
g.setColor(1,0,0);
|
||||||
g.fillRect(125,40, 210, 70);
|
g.fillRect(125,40, 210, 70);
|
||||||
|
|
||||||
if(limitSetter === Setter.UPPER){
|
if(limitSetter === Setter.UPPER){
|
||||||
g.setColor(255,255, 0);
|
g.setColor(255,255, 0);
|
||||||
} else {
|
} else {
|
||||||
g.setColor(255,255,255);
|
g.setColor(255,255,255);
|
||||||
}
|
}
|
||||||
g.setFontVector(13);
|
g.setFontVector(13);
|
||||||
g.drawString("Upper : " + upperLimit, 130,50);
|
g.drawString("Upper: " + upperLimit, 125, 50);
|
||||||
|
|
||||||
upperLimitChanged = false;
|
upperLimitChanged = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderCurrentHeartRate() {
|
function renderCurrentHeartRate() {
|
||||||
if(!hrChanged) { return; }
|
if(!hrChanged) { return; }
|
||||||
|
|
||||||
g.setColor(255,255,255);
|
g.setColor(255,255,255);
|
||||||
g.fillRect(55, 110, 165, 150);
|
g.fillRect(55, 110, 165, 150);
|
||||||
|
|
||||||
|
@ -121,27 +121,27 @@ function renderCurrentHeartRate() {
|
||||||
|
|
||||||
hrChanged = false;
|
hrChanged = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderLowerLimit() {
|
function renderLowerLimit() {
|
||||||
if(!lowerLimitChanged) { return; }
|
if(!lowerLimitChanged) { return; }
|
||||||
|
|
||||||
g.setColor(0,0,1);
|
g.setColor(0,0,1);
|
||||||
g.fillRect(10, 180, 100, 210);
|
g.fillRect(10, 180, 100, 210);
|
||||||
|
|
||||||
if(limitSetter === Setter.LOWER){
|
if(limitSetter === Setter.LOWER){
|
||||||
g.setColor(255,255, 0);
|
g.setColor(255,255, 0);
|
||||||
} else {
|
} else {
|
||||||
g.setColor(255,255,255);
|
g.setColor(255,255,255);
|
||||||
}
|
}
|
||||||
g.setFontVector(13);
|
g.setFontVector(13);
|
||||||
g.drawString("Lower : " + lowerLimit, 20,190);
|
g.drawString("Lower: " + lowerLimit, 20,190);
|
||||||
|
|
||||||
lowerLimitChanged = false;
|
lowerLimitChanged = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderConfidenceBars(){
|
function renderConfidenceBars(){
|
||||||
if(!confidenceChanged) { return; }
|
if(!confidenceChanged) { return; }
|
||||||
|
|
||||||
if(hrConfidence >= 85){
|
if(hrConfidence >= 85){
|
||||||
g.setColor(0, 255, 0);
|
g.setColor(0, 255, 0);
|
||||||
} else if (hrConfidence >= 50) {
|
} else if (hrConfidence >= 50) {
|
||||||
|
@ -157,42 +157,51 @@ function renderConfidenceBars(){
|
||||||
|
|
||||||
confidenceChanged = false;
|
confidenceChanged = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderButtonIcons() {
|
function renderPlusMinusIcons() {
|
||||||
g.setColor(255,255,255);
|
if (limitSetter === Setter.NONE) {
|
||||||
|
g.setColor(0, 0, 0);
|
||||||
|
} else {
|
||||||
|
g.setColor(1, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
g.setFontVector(14);
|
g.setFontVector(14);
|
||||||
|
|
||||||
//+ for Btn1
|
//+ for Btn1
|
||||||
g.drawString("+", 222,50);
|
g.drawString("+", 222, 50);
|
||||||
|
|
||||||
|
//- for Btn3
|
||||||
|
g.drawString("-", 222,165);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
function renderHomeIcon() {
|
||||||
//Home for Btn2
|
//Home for Btn2
|
||||||
|
g.setColor(1, 1, 1);
|
||||||
g.drawLine(220, 118, 227, 110);
|
g.drawLine(220, 118, 227, 110);
|
||||||
g.drawLine(227, 110, 234, 118);
|
g.drawLine(227, 110, 234, 118);
|
||||||
|
|
||||||
g.drawPoly([222,117,222,125,232,125,232,117], false);
|
g.drawPoly([222,117,222,125,232,125,232,117], false);
|
||||||
g.drawRect(226,120,229,125);
|
g.drawRect(226,120,229,125);
|
||||||
|
|
||||||
//- for Btn3
|
|
||||||
g.drawString("-", 222,165);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function buzz()
|
function buzz() {
|
||||||
{
|
|
||||||
// Do not buzz if not confident
|
// Do not buzz if not confident
|
||||||
if(hrConfidence < 85) { return; }
|
if(hrConfidence < 85) { return; }
|
||||||
|
|
||||||
if(currentHeartRate > upperLimit)
|
if(currentHeartRate > upperLimit)
|
||||||
{
|
{
|
||||||
Bangle.buzz(shortBuzzTimeInMs);
|
Bangle.buzz(shortBuzzTimeInMs);
|
||||||
setTimeout(() => { Bangle.buzz(shortBuzzTimeInMs); }, shortBuzzTimeInMs * 2);
|
setTimeout(() => { Bangle.buzz(shortBuzzTimeInMs); }, shortBuzzTimeInMs * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(currentHeartRate < lowerLimit)
|
if(currentHeartRate < lowerLimit)
|
||||||
{
|
{
|
||||||
Bangle.buzz(longBuzzTimeInMs);
|
Bangle.buzz(longBuzzTimeInMs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onHrm(hrm){
|
function onHrm(hrm){
|
||||||
if(currentHeartRate !== hrm.bpm){
|
if(currentHeartRate !== hrm.bpm){
|
||||||
currentHeartRate = hrm.bpm;
|
currentHeartRate = hrm.bpm;
|
||||||
|
@ -204,97 +213,93 @@ function onHrm(hrm){
|
||||||
confidenceChanged = true;
|
confidenceChanged = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setLimitSetterToLower() {
|
function setLimitSetterToLower() {
|
||||||
resetHighlightTimeout();
|
resetHighlightTimeout();
|
||||||
|
|
||||||
limitSetter = Setter.LOWER;
|
limitSetter = Setter.LOWER;
|
||||||
console.log("Limit setter is lower");
|
|
||||||
|
|
||||||
upperLimitChanged = true;
|
upperLimitChanged = true;
|
||||||
lowerLimitChanged = true;
|
lowerLimitChanged = true;
|
||||||
|
|
||||||
renderUpperLimit();
|
renderUpperLimit();
|
||||||
renderLowerLimit();
|
renderLowerLimit();
|
||||||
|
renderPlusMinusIcons();
|
||||||
}
|
}
|
||||||
|
|
||||||
function setLimitSetterToUpper() {
|
function setLimitSetterToUpper() {
|
||||||
resetHighlightTimeout();
|
resetHighlightTimeout();
|
||||||
|
|
||||||
limitSetter = Setter.UPPER;
|
limitSetter = Setter.UPPER;
|
||||||
console.log("Limit setter is upper");
|
|
||||||
|
|
||||||
upperLimitChanged = true;
|
upperLimitChanged = true;
|
||||||
lowerLimitChanged = true;
|
lowerLimitChanged = true;
|
||||||
|
|
||||||
renderLowerLimit();
|
renderLowerLimit();
|
||||||
renderUpperLimit();
|
renderUpperLimit();
|
||||||
|
renderPlusMinusIcons();
|
||||||
}
|
}
|
||||||
|
|
||||||
function setLimitSetterToNone() {
|
function setLimitSetterToNone() {
|
||||||
limitSetter = Setter.NONE;
|
limitSetter = Setter.NONE;
|
||||||
console.log("Limit setter is none");
|
|
||||||
|
|
||||||
upperLimitChanged = true;
|
upperLimitChanged = true;
|
||||||
lowerLimitChanged = true;
|
lowerLimitChanged = true;
|
||||||
|
|
||||||
renderLowerLimit();
|
renderLowerLimit();
|
||||||
renderUpperLimit();
|
renderUpperLimit();
|
||||||
|
renderPlusMinusIcons();
|
||||||
}
|
}
|
||||||
|
|
||||||
function incrementLimit(){
|
function incrementLimit() {
|
||||||
resetHighlightTimeout();
|
resetHighlightTimeout();
|
||||||
|
|
||||||
if (limitSetter === Setter.UPPER) {
|
if (limitSetter === Setter.UPPER) {
|
||||||
upperLimit++;
|
upperLimit++;
|
||||||
renderUpperLimit();
|
renderUpperLimit();
|
||||||
console.log("Upper limit: " + upperLimit);
|
|
||||||
upperLimitChanged = true;
|
upperLimitChanged = true;
|
||||||
} else if(limitSetter === Setter.LOWER) {
|
} else if(limitSetter === Setter.LOWER) {
|
||||||
lowerLimit++;
|
lowerLimit++;
|
||||||
renderLowerLimit();
|
renderLowerLimit();
|
||||||
console.log("Lower limit: " + lowerLimit);
|
|
||||||
lowerLimitChanged = true;
|
lowerLimitChanged = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function decrementLimit(){
|
function decrementLimit(){
|
||||||
resetHighlightTimeout();
|
resetHighlightTimeout();
|
||||||
|
|
||||||
if (limitSetter === Setter.UPPER) {
|
if (limitSetter === Setter.UPPER) {
|
||||||
upperLimit--;
|
upperLimit--;
|
||||||
renderUpperLimit();
|
renderUpperLimit();
|
||||||
console.log("Upper limit: " + upperLimit);
|
|
||||||
upperLimitChanged = true;
|
upperLimitChanged = true;
|
||||||
} else if(limitSetter === Setter.LOWER) {
|
} else if(limitSetter === Setter.LOWER) {
|
||||||
lowerLimit--;
|
lowerLimit--;
|
||||||
renderLowerLimit();
|
renderLowerLimit();
|
||||||
console.log("Lower limit: " + lowerLimit);
|
|
||||||
lowerLimitChanged = true;
|
lowerLimitChanged = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function resetHighlightTimeout() {
|
function resetHighlightTimeout() {
|
||||||
if (setterHighlightTimeout) {
|
if (setterHighlightTimeout) {
|
||||||
clearTimeout(setterHighlightTimeout);
|
clearTimeout(setterHighlightTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
setterHighlightTimeout = setTimeout(setLimitSetterToNone, 2000);
|
setterHighlightTimeout = setTimeout(setLimitSetterToNone, 2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show launcher when middle button pressed
|
// Show launcher when middle button pressed
|
||||||
function switchOffApp(){
|
function switchOffApp(){
|
||||||
Bangle.setHRMPower(0);
|
Bangle.setHRMPower(0);
|
||||||
Bangle.showLauncher();
|
Bangle.showLauncher();
|
||||||
}
|
}
|
||||||
|
|
||||||
// special function to handle display switch on
|
// special function to handle display switch on
|
||||||
Bangle.on('lcdPower', (on) => {
|
Bangle.on('lcdPower', (on) => {
|
||||||
g.clear();
|
g.clear();
|
||||||
if (on) {
|
if (on) {
|
||||||
Bangle.drawWidgets();
|
Bangle.drawWidgets();
|
||||||
renderButtonIcons();
|
|
||||||
// call your app function here
|
renderHomeIcon();
|
||||||
renderLowerLimitBackground();
|
renderLowerLimitBackground();
|
||||||
renderUpperLimitBackground();
|
renderUpperLimitBackground();
|
||||||
lowerLimitChanged = true;
|
lowerLimitChanged = true;
|
||||||
|
@ -302,10 +307,10 @@ Bangle.on('lcdPower', (on) => {
|
||||||
drawTrainingHeartRate();
|
drawTrainingHeartRate();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Bangle.setHRMPower(1);
|
Bangle.setHRMPower(1);
|
||||||
Bangle.on('HRM', onHrm);
|
Bangle.on('HRM', onHrm);
|
||||||
|
|
||||||
setWatch(incrementLimit, BTN1, {edge:"rising", debounce:50, repeat:true});
|
setWatch(incrementLimit, BTN1, {edge:"rising", debounce:50, repeat:true});
|
||||||
setWatch(switchOffApp, BTN2, {edge:"rising", debounce:50, repeat:true});
|
setWatch(switchOffApp, BTN2, {edge:"rising", debounce:50, repeat:true});
|
||||||
setWatch(decrementLimit, BTN3, {edge:"rising", debounce:50, repeat:true});
|
setWatch(decrementLimit, BTN3, {edge:"rising", debounce:50, repeat:true});
|
||||||
|
@ -317,7 +322,7 @@ Bangle.loadWidgets();
|
||||||
Bangle.drawWidgets();
|
Bangle.drawWidgets();
|
||||||
//drawTrainingHeartRate();
|
//drawTrainingHeartRate();
|
||||||
|
|
||||||
renderButtonIcons();
|
renderHomeIcon();
|
||||||
renderLowerLimitBackground();
|
renderLowerLimitBackground();
|
||||||
renderUpperLimitBackground();
|
renderUpperLimitBackground();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue