Skip to content

Commit c5f3cff

Browse files
author
thyttan
committed
Merge remote-tracking branch 'RKBoss6/caloriesApp' into app-loader
2 parents cbee17f + 874d796 commit c5f3cff

2 files changed

Lines changed: 105 additions & 107 deletions

File tree

apps/health/app.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ let settings;
22
const myprofile = require("Storage").readJSON("myprofile.json",1)||{};
33

44
function menuMain() {
5-
var menu={
5+
var menu = {
66
"": { title: /*LANG*/"Health Tracking" },
77
/*LANG*/"< Back": () => load(),
88
/*LANG*/"Step Counting": () => menuStepCount(),
@@ -11,7 +11,7 @@ function menuMain() {
1111
/*LANG*/"Battery": () => menuBattery(),
1212
/*LANG*/"Temperature": () => menuTemperature(),
1313
}
14-
if(global.calories) menu[/*LANG*/"Calories"] = () => load("calories.app.js");
14+
if (global.calories) menu[/*LANG*/"Calories"] = () => load("calories.app.js");
1515
menu[/*LANG*/"Settings"] = () => eval(require("Storage").read("health.settings.js"))(() => { loadSettings(); menuMain(); });
1616
E.showMenu(menu);
1717
}

apps/myprofile/settings.js

Lines changed: 103 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -16,93 +16,93 @@
1616
function writeProfile() {
1717
require('Storage').writeJSON(FILE, myprofile);
1818
}
19-
19+
2020
function finishRHRReading() {
2121
Bangle.setHRMPower(0);
2222
Bangle.removeListener('HRM', onRHRHrm);
2323
if (rhrData.length > 0) {
2424
// Calculate average, ignoring outliers
2525
let avgRHR = Math.round(rhrData.reduce((a, b) => a + b) / rhrData.length);
26-
27-
E.showPrompt(" ",{
28-
buttonHeight:35,
29-
buttons:{"Yes":true,"No":false}
30-
}).then(function(v){
31-
if(v){
26+
27+
E.showPrompt(" ", {
28+
buttonHeight: 35,
29+
buttons: { "Yes": true, "No": false }
30+
}).then(function (v) {
31+
if (v) {
3232
myprofile.minHrm = avgRHR;
3333
writeProfile();
34-
35-
E.showPrompt(" ",{
36-
buttonHeight:35,
37-
buttons:{"Back":true}
38-
}).then(function(v){
34+
35+
E.showPrompt(" ", {
36+
buttonHeight: 35,
37+
buttons: { "Back": true }
38+
}).then(function (v) {
3939
mainMenu();
4040
})
41-
42-
g.clearRect(0,Bangle.appRect.y,g.getWidth(),g.getHeight()-40)
41+
42+
g.clearRect(0, Bangle.appRect.y, g.getWidth(), g.getHeight() - 40)
4343
.setColor("#f00")
44-
.drawImage(atob("Mi2BAAAAAAAAAAAP4AAf4AAf/wAf/gAP/+Af/+AH//wP//wD//+H//+B///z///w///+///8P///////n///////5///////+f///////3///////9////////f///////3///////9////////f///////j///////4///////+P///////B///////wf//////4D//////+Af//////AH//////gA//////4AH/////8AA/////+AAH/////AAB/////gAAP////wAAA////4AAAH///8AAAA///+AAAAH///AAAAA///AAAAAH//gAAAAAf/wAAAAAD/4AAAAAAf4AAAAAAB8AAAAAAAOAAAAAAAAAAAAAAAAAAAAAA=="),g.getWidth()-80,70)
44+
.drawImage(atob("Mi2BAAAAAAAAAAAP4AAf4AAf/wAf/gAP/+Af/+AH//wP//wD//+H//+B///z///w///+///8P///////n///////5///////+f///////3///////9////////f///////3///////9////////f///////j///////4///////+P///////B///////wf//////4D//////+Af//////AH//////gA//////4AH/////8AA/////+AAH/////AAB/////gAAP////wAAA////4AAAH///8AAAA///+AAAAH///AAAAA///AAAAAH//gAAAAAf/wAAAAAD/4AAAAAAf4AAAAAAB8AAAAAAAOAAAAAAAAAAAAAAAAAAAAAA=="), g.getWidth() - 80, 70)
4545
.setColor(g.theme.fg)
46-
.setFont("Vector", 25).setFontAlign(0,0)
47-
.drawString("Saved!", g.getWidth()/2, 35)
48-
.setFont("Vector", 30).setFontAlign(0,0)
49-
.drawString(avgRHR, g.getWidth()/2-30, g.getHeight()/2)
50-
.setFont("Vector", 18).setFontAlign(0,0)
51-
.drawString("RHR", g.getWidth()/2-30, g.getHeight()/2+20);
52-
53-
}else{
46+
.setFont("Vector", 25).setFontAlign(0, 0)
47+
.drawString("Saved!", g.getWidth() / 2, 35)
48+
.setFont("Vector", 30).setFontAlign(0, 0)
49+
.drawString(avgRHR, g.getWidth() / 2 - 30, g.getHeight() / 2)
50+
.setFont("Vector", 18).setFontAlign(0, 0)
51+
.drawString("RHR", g.getWidth() / 2 - 30, g.getHeight() / 2 + 20);
52+
53+
} else {
5454
mainMenu();
5555
}
56-
})
57-
58-
g.clearRect(0,Bangle.appRect.y,g.getWidth(),g.getHeight()-40)
59-
.setColor("#f00")
60-
.drawImage(atob("Mi2BAAAAAAAAAAAP4AAf4AAf/wAf/gAP/+Af/+AH//wP//wD//+H//+B///z///w///+///8P///////n///////5///////+f///////3///////9////////f///////3///////9////////f///////j///////4///////+P///////B///////wf//////4D//////+Af//////AH//////gA//////4AH/////8AA/////+AAH/////AAB/////gAAP////wAAA////4AAAH///8AAAA///+AAAAH///AAAAA///AAAAAH//gAAAAAf/wAAAAAD/4AAAAAAf4AAAAAAB8AAAAAAAOAAAAAAAAAAAAAAAAAAAAAA=="),g.getWidth()-80,70-15)
61-
.setColor(g.theme.fg)
62-
.setFont("Vector", 25).setFontAlign(0,0)
63-
.drawString("Finished!", g.getWidth()/2, 35)
64-
.setFont("Vector", 30).setFontAlign(0,0)
65-
.drawString(avgRHR, g.getWidth()/2-30, g.getHeight()/2-15)
66-
.setFont("Vector", 18).setFontAlign(0,0)
67-
.drawString("RHR", g.getWidth()/2-30, g.getHeight()/2+20-15)
68-
.drawString("Save?", g.getWidth()/2, g.getHeight()/2+30)
69-
70-
}
56+
})
57+
58+
g.clearRect(0, Bangle.appRect.y, g.getWidth(), g.getHeight() - 40)
59+
.setColor("#f00")
60+
.drawImage(atob("Mi2BAAAAAAAAAAAP4AAf4AAf/wAf/gAP/+Af/+AH//wP//wD//+H//+B///z///w///+///8P///////n///////5///////+f///////3///////9////////f///////3///////9////////f///////j///////4///////+P///////B///////wf//////4D//////+Af//////AH//////gA//////4AH/////8AA/////+AAH/////AAB/////gAAP////wAAA////4AAAH///8AAAA///+AAAAH///AAAAA///AAAAAH//gAAAAAf/wAAAAAD/4AAAAAAf4AAAAAAB8AAAAAAAOAAAAAAAAAAAAAAAAAAAAAA=="), g.getWidth() - 80, 70 - 15)
61+
.setColor(g.theme.fg)
62+
.setFont("Vector", 25).setFontAlign(0, 0)
63+
.drawString("Finished!", g.getWidth() / 2, 35)
64+
.setFont("Vector", 30).setFontAlign(0, 0)
65+
.drawString(avgRHR, g.getWidth() / 2 - 30, g.getHeight() / 2 - 15)
66+
.setFont("Vector", 18).setFontAlign(0, 0)
67+
.drawString("RHR", g.getWidth() / 2 - 30, g.getHeight() / 2 + 20 - 15)
68+
.drawString("Save?", g.getWidth() / 2, g.getHeight() / 2 + 30)
69+
70+
}
7171
}
7272

7373
function onRHRHrm(hrm) {
7474
// Only record if the watch is confident in the reading
7575
if (hrm.confidence > 80) {
7676
rhrData.push(hrm.bpm);
7777
}
78-
78+
7979
// Update UI
8080
g.clearRect(Bangle.appRect)
8181
.setColor(g.theme.fg)
82-
.setFont("Vector", 20).setFontAlign(0,0)
83-
.drawString("Measuring...", g.getWidth()/2, 40)
82+
.setFont("Vector", 20).setFontAlign(0, 0)
83+
.drawString("Measuring...", g.getWidth() / 2, 40)
8484
.setFont("Vector", 40)
85-
.drawString(hrm.bpm, g.getWidth()/2-30, g.getHeight()/2-5)
85+
.drawString(hrm.bpm, g.getWidth() / 2 - 30, g.getHeight() / 2 - 5)
8686
.setColor("#f00")
87-
.drawImage(atob("Mi2BAAAAAAAAAAAP4AAf4AAf/wAf/gAP/+Af/+AH//wP//wD//+H//+B///z///w///+///8P///////n///////5///////+f///////3///////9////////f///////3///////9////////f///////j///////4///////+P///////B///////wf//////4D//////+Af//////AH//////gA//////4AH/////8AA/////+AAH/////AAB/////gAAP////wAAA////4AAAH///8AAAA///+AAAAH///AAAAA///AAAAAH//gAAAAAf/wAAAAAD/4AAAAAAf4AAAAAAB8AAAAAAAOAAAAAAAAAAAAAAAAAAAAAA=="),g.getWidth()-80,60)
87+
.drawImage(atob("Mi2BAAAAAAAAAAAP4AAf4AAf/wAf/gAP/+Af/+AH//wP//wD//+H//+B///z///w///+///8P///////n///////5///////+f///////3///////9////////f///////3///////9////////f///////j///////4///////+P///////B///////wf//////4D//////+Af//////AH//////gA//////4AH/////8AA/////+AAH/////AAB/////gAAP////wAAA////4AAAH///8AAAA///+AAAAH///AAAAA///AAAAAH//gAAAAAf/wAAAAAD/4AAAAAAf4AAAAAAB8AAAAAAAOAAAAAAAAAAAAAAAAAAAAAA=="), g.getWidth() - 80, 60)
8888
.setColor(g.theme.fg)
8989
.setFont("Vector", 16)
90-
.drawString(counter + "s remaining", g.getWidth()/2, g.getHeight() - 55)
91-
92-
if(hrm.confidence<=80){
93-
g.setFont("Vector", 14).drawString("Low confidence\nKeep still", g.getWidth()/2, g.getHeight() - 20);
90+
.drawString(counter + "s remaining", g.getWidth() / 2, g.getHeight() - 55)
91+
92+
if (hrm.confidence <= 80) {
93+
g.setFont("Vector", 14).drawString("Low confidence\nKeep still", g.getWidth() / 2, g.getHeight() - 20);
9494
}
9595
}
9696

97-
function startRHR(){
97+
function startRHR() {
9898
// Start the reading
9999
g.clearRect(Bangle.appRect)
100-
g.setColor(g.theme.fg);
101-
g.setFont("Vector", 20).setFontAlign(0,0);
102-
g.drawString("Starting...", g.getWidth()/2, g.getHeight()/2);
100+
g.setColor(g.theme.fg);
101+
g.setFont("Vector", 20).setFontAlign(0, 0);
102+
g.drawString("Starting...", g.getWidth() / 2, g.getHeight() / 2);
103103
rhrData = [];
104104
counter = seconds;
105-
Bangle.on('HRM',onRHRHrm);
105+
Bangle.on('HRM', onRHRHrm);
106106
Bangle.setHRMPower(1);
107107
let interval = setInterval(() => {
108108
counter--;
@@ -112,47 +112,45 @@
112112
}
113113
}, 1000);
114114
}
115-
116-
function RHRReading(){
117-
E.showPrompt("Resting Heart Rate reading requires you to be resting and still. Takes approx. 1 minute.",{
118-
title:"Continue?",
119-
buttonHeight:50,
120-
buttons:{"Continue":true,"Back":false}
121-
}).then(function(v){
122-
if(v){
123-
E.showPrompt("Make sure Bangle.js is snug around your wrist, about 1 cm under your wrist bone.",{
124-
buttonHeight:40,
125-
buttons:{"Continue":true}
126-
}).then(function(v){
127-
startRHR();
128-
});
129-
}else{
115+
116+
function RHRReading() {
117+
E.showPrompt("Resting Heart Rate reading requires you to be resting and still. Takes approx. 1 minute.", {
118+
title: "Continue?",
119+
buttonHeight: 50,
120+
buttons: { "Continue": true, "Back": false }
121+
}).then(function (v) {
122+
if (v) {
123+
E.showPrompt("Make sure Bangle.js is snug around your wrist, about 1 cm under your wrist bone.", {
124+
buttonHeight: 40,
125+
buttons: { "Continue": true }
126+
}).then(function (v) {
127+
startRHR();
128+
});
129+
} else {
130130
mainMenu()
131131
}
132132
});
133133
}
134-
135-
const genderOpts = ["Male","Female","Not Set"];
134+
135+
const genderOpts = ["Male", "Female", "Not Set"];
136136

137137
const ageMenu = () => {
138138
const date = new Date(myprofile.birthday);
139139

140140
E.showMenu({
141-
"" : { "title" : /*LANG*/"Birthday" },
142-
143-
"< Back" : () => {
141+
"": { "title": /*LANG*/"Birthday" },
142+
"< Back": () => {
144143
if (date != new Date(myprofile.birthday)) {
145144
// Birthday changed
146145
if (date > new Date()) {
147146
E.showPrompt(/*LANG*/"Birthday must not be in future!", {
148-
149-
buttons : {"Ok":true},
147+
buttons: { "Ok": true },
150148
}).then(() => ageMenu());
151-
149+
152150
} else {
153151
const age = (new Date()).getFullYear() - date.getFullYear();
154-
const newMaxHRM = Math.round(208-0.7*age); // Tanaka formula: https://my.clevelandclinic.org/health/articles/24649-heart-rate-reserve
155-
E.showPrompt(/*LANG*/`Set HR max to ${newMaxHRM} calculated from age?`).then(function(v) {
152+
const newMaxHRM = Math.round(208 - 0.7 * age); // Tanaka formula: https://my.clevelandclinic.org/health/articles/24649-heart-rate-reserve
153+
E.showPrompt(/*LANG*/`Set HR max to ${newMaxHRM} calculated from age?`).then(function (v) {
156154
myprofile.birthday = date.getFullYear() + "-" + (date.getMonth() + 1).toString().padStart(2, '0') + "-" + date.getDate().toString().padStart(2, '0');
157155
if (v) {
158156
myprofile.maxHrm = newMaxHRM;
@@ -179,7 +177,7 @@
179177
value: date ? date.getMonth() + 1 : null,
180178
format: v => require("date_utils").month(v),
181179
onchange: v => {
182-
date.setMonth((v+11)%12);
180+
date.setMonth((v + 11) % 12);
183181
}
184182
},
185183
/*LANG*/"Year": {
@@ -194,25 +192,25 @@
194192
};
195193

196194
const mainMenu = () => {
197-
var menu={
198-
"" : { "title" : /*LANG*/"My Profile" },
195+
var menu = {
196+
"": { "title": /*LANG*/"My Profile" },
199197

200-
"< Back" : () => back(),
198+
"< Back": () => back(),
201199

202-
/*LANG*/"Birthday" : () => ageMenu(),
200+
/*LANG*/"Birthday": () => ageMenu(),
203201

204202
/*LANG*/'Height': {
205203
value: myprofile.height,
206204
min: 0, max: 300,
207-
step:0.01,
205+
step: 0.01,
208206
format: v => v ? require("locale").distance(v, 2) : '-',
209207
onchange: v => {
210208
if (v !== myprofile.height) {
211209
// height changed
212210
myprofile.height = v;
213211
setTimeout(() => {
214212
const newStrideLength = myprofile.height * 0.414;
215-
E.showPrompt(/*LANG*/`Set Stride length to ${require("locale").distance(newStrideLength, 2)} calculated from height?`).then(function(v) {
213+
E.showPrompt(/*LANG*/`Set Stride length to ${require("locale").distance(newStrideLength, 2)} calculated from height?`).then(function (v) {
216214
if (v) {
217215
myprofile.strideLength = newStrideLength;
218216
}
@@ -226,21 +224,21 @@
226224

227225
/*LANG*/"Weight": {
228226
value: myprofile.weight,
229-
min:0,
230-
step:1,
227+
min: 0,
228+
step: 1,
231229
format: v => v ? v + "kg" : '-',
232230
onchange: v => {
233-
myprofile.weight=v;
231+
myprofile.weight = v;
234232
writeProfile();
235233
},
236234
},
237235

238236
/*LANG*/"Gender": {
239237
value: (typeof myprofile.gender === "number" &&
240-
myprofile.gender >= 0 &&
241-
myprofile.gender < genderOpts.length) ? myprofile.gender : 2,
242-
min:0,
243-
max: genderOpts.length-1,
238+
myprofile.gender >= 0 &&
239+
myprofile.gender < genderOpts.length) ? myprofile.gender : 2,
240+
min: 0,
241+
max: genderOpts.length - 1,
244242
format: v => genderOpts[v],
245243
onchange: v => {
246244
myprofile.gender = v;
@@ -258,20 +256,20 @@
258256
}
259257
},
260258
};
261-
262-
menu[/*LANG*/`Resting/Min HR: ${myprofile.minHrm?myprofile.minHrm:"--"}`]=RHRReading;
263-
menu[/*LANG*/"Stride length"]= {
264-
value: myprofile.strideLength,
265-
min:0.00,
266-
step:0.01,
267-
format: v => v ? require("locale").distance(v, 2) : '-',
268-
onchange: v => {
269-
myprofile.strideLength=v;
270-
writeProfile();
271-
},
272-
}
273-
E.showMenu(menu)
259+
260+
menu[/*LANG*/`Resting/Min HR: ${myprofile.minHrm ? myprofile.minHrm : "--"}`] = RHRReading;
261+
menu[/*LANG*/"Stride length"] = {
262+
value: myprofile.strideLength,
263+
min: 0.00,
264+
step: 0.01,
265+
format: v => v ? require("locale").distance(v, 2) : '-',
266+
onchange: v => {
267+
myprofile.strideLength = v;
268+
writeProfile();
269+
},
270+
}
271+
E.showMenu(menu)
274272
};
275-
273+
276274
mainMenu();
277275
})

0 commit comments

Comments
 (0)