kitchen: Added basic heart rate monitor watch face
parent
c82d06e573
commit
68c24811c5
|
|
@ -3085,7 +3085,7 @@
|
||||||
{ "id": "kitchen",
|
{ "id": "kitchen",
|
||||||
"name": "Kitchen Combo",
|
"name": "Kitchen Combo",
|
||||||
"icon": "kitchen.png",
|
"icon": "kitchen.png",
|
||||||
"version":"0.08",
|
"version":"0.09",
|
||||||
"description": "Combination of the Stepo, Walkersclock, Arrow and Waypointer apps into a multiclock format. 'Everything but the kitchen sink'. Requires firmware v2.08.167 or later",
|
"description": "Combination of the Stepo, Walkersclock, Arrow and Waypointer apps into a multiclock format. 'Everything but the kitchen sink'. Requires firmware v2.08.167 or later",
|
||||||
"tags": "tool,outdoors,gps",
|
"tags": "tool,outdoors,gps",
|
||||||
"type":"clock",
|
"type":"clock",
|
||||||
|
|
@ -3096,11 +3096,14 @@
|
||||||
{"name":"stepo.kit.js","url":"stepo.kit.js"},
|
{"name":"stepo.kit.js","url":"stepo.kit.js"},
|
||||||
{"name":"gps.kit.js","url":"gps.kit.js"},
|
{"name":"gps.kit.js","url":"gps.kit.js"},
|
||||||
{"name":"digi.kit.js","url":"digi.kit.js"},
|
{"name":"digi.kit.js","url":"digi.kit.js"},
|
||||||
|
{"name":"heart.kit.js","url":"heart.kit.js"},
|
||||||
{"name":"swatch.kit.js","url":"swatch.kit.js"},
|
{"name":"swatch.kit.js","url":"swatch.kit.js"},
|
||||||
{"name":"compass.kit.js","url":"compass.kit.js"},
|
{"name":"compass.kit.js","url":"compass.kit.js"},
|
||||||
{"name":"waypoints.json","url":"waypoints.json","evaluate":false},
|
|
||||||
{"name":"kitchen.img","url":"kitchen.icon.js","evaluate":true}
|
{"name":"kitchen.img","url":"kitchen.icon.js","evaluate":true}
|
||||||
]
|
]
|
||||||
|
"data": [
|
||||||
|
{"name":"waypoints.json","url":"waypoints.json"}
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{ "id": "qmsched",
|
{ "id": "qmsched",
|
||||||
"name": "Quiet Mode Schedule",
|
"name": "Quiet Mode Schedule",
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,4 @@
|
||||||
0.06: Reduced memory footprint of compass, used direct screen access rather than arrayBuffer
|
0.06: Reduced memory footprint of compass, used direct screen access rather than arrayBuffer
|
||||||
0.07: Added error codes if dependancies are missing
|
0.07: Added error codes if dependancies are missing
|
||||||
0.08: Improved error handling for missing firmware features, added template app.kit.js
|
0.08: Improved error handling for missing firmware features, added template app.kit.js
|
||||||
|
0.09: Added heart rate monitor app
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
//console.log(o);
|
//console.log(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
function init(gps,sw) {
|
function init(gps,sw, hrm) {
|
||||||
showMem("compass init() START");
|
showMem("compass init() START");
|
||||||
gpsObject = gps;
|
gpsObject = gps;
|
||||||
intervalRefSec = undefined;
|
intervalRefSec = undefined;
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
const Y_ACTIVITY = 116;
|
const Y_ACTIVITY = 116;
|
||||||
const Y_MODELINE = 200;
|
const Y_MODELINE = 200;
|
||||||
|
|
||||||
function init(gps,sw) {
|
function init(gps,sw,hrm) {
|
||||||
showMem("digi init 1");
|
showMem("digi init 1");
|
||||||
days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday"];
|
days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday", "Saturday"];
|
||||||
prevInfo = "";
|
prevInfo = "";
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@
|
||||||
//console.log(o);
|
//console.log(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
function init(gps, sw) {
|
function init(gps, sw, hrm) {
|
||||||
log_debug("gps init");
|
log_debug("gps init");
|
||||||
//log_debug(gps);
|
//log_debug(gps);
|
||||||
gpsObject = gps;
|
gpsObject = gps;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,116 @@
|
||||||
|
(() => {
|
||||||
|
function getFace(){
|
||||||
|
const Y_TIME = 30;
|
||||||
|
const Y_ACTIVITY = 116;
|
||||||
|
let prevTime;
|
||||||
|
let prevBpm;
|
||||||
|
let toggle = 1;
|
||||||
|
let redrawHrmPower = true;
|
||||||
|
let intervalRefSec;
|
||||||
|
let img;
|
||||||
|
let hrmObject;
|
||||||
|
|
||||||
|
function log_debug(o) {
|
||||||
|
//console.log(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
function init(gps, sw, hrm) {
|
||||||
|
img = require("heatshrink").decompress(atob("mEwwRC/ABf/+ADBh//BQgGB//AgYDBCAQWCA4QPCDAYSC//8n4EC4AiEAAo1EBZIeDAAn8BZoKHJAYL7L64LLTa6/DAAi/CKhDjGBZBIGIwQ8IHQQ8IHQYwHBQgwFFwgwGFwgwGFwowFBQwwDFwwwEFwwwEFw4wDBRAkBERAkCERIA/AAYA="));
|
||||||
|
prevTime = "-";
|
||||||
|
prevBpm = "-";
|
||||||
|
toggle = 1;
|
||||||
|
redrawHrmPower = true;
|
||||||
|
hrmObject = hrm;
|
||||||
|
intervalRefSec;
|
||||||
|
g.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
function freeResources() {
|
||||||
|
prevTime = undefined;
|
||||||
|
img = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
function startTimer() {
|
||||||
|
draw();
|
||||||
|
intervalRefSec = setInterval(draw, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
function stopTimer() {
|
||||||
|
if (intervalRefSec) { intervalRefSec = clearInterval(intervalRefSec); }
|
||||||
|
}
|
||||||
|
|
||||||
|
function onButtonShort(btn) {}
|
||||||
|
|
||||||
|
function onButtonLong(btn) {
|
||||||
|
log_debug("toggleHRM");
|
||||||
|
if (btn !== 1) return;
|
||||||
|
if (!Bangle.isHRMOn) return; // old firmware
|
||||||
|
hrmObject.toggleHRMPower();
|
||||||
|
prevBpm = '-';
|
||||||
|
toggle = 1; // ensure we draw the heart first
|
||||||
|
redrawHrmPower = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function draw() {
|
||||||
|
let d = new Date();
|
||||||
|
let da = d.toString().split(" ");
|
||||||
|
let time = da[4].substr(0,5);
|
||||||
|
|
||||||
|
if (time !== prevTime) {
|
||||||
|
prevTime = time;
|
||||||
|
g.setColor(0);
|
||||||
|
g.fillRect(0, Y_TIME, 239, Y_ACTIVITY -1);
|
||||||
|
g.setColor(1,1,1);
|
||||||
|
g.setFont("Vector",80);
|
||||||
|
g.setFontAlign(0,-1);
|
||||||
|
g.drawString(time, 120, Y_TIME);
|
||||||
|
}
|
||||||
|
|
||||||
|
let bpm = hrmObject.getBpm();
|
||||||
|
|
||||||
|
if (!Bangle.isHRMOn()) {
|
||||||
|
if (!redrawHrmPower) return;
|
||||||
|
redrawHrmPower = false;
|
||||||
|
g.setColor(0);
|
||||||
|
g.drawImage(img, 12, 132, {scale:2});
|
||||||
|
g.fillRect(120,120,239,239);
|
||||||
|
g.setColor(255,0,0);
|
||||||
|
//g.setColor(0xFFC0); // yellow
|
||||||
|
g.drawImage(img, 12, 132, {scale:2});
|
||||||
|
|
||||||
|
g.setFont("Vector",40);
|
||||||
|
g.setFontAlign(0,0);
|
||||||
|
g.setColor(1,1,1);
|
||||||
|
g.drawString("OFF", 180, 180);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw the heart
|
||||||
|
if (++toggle % 2 === 0) {
|
||||||
|
g.setColor(0);
|
||||||
|
g.fillRect(12, 132, 108, 228);
|
||||||
|
} else {
|
||||||
|
g.setColor(255,0,0);
|
||||||
|
//g.setColor(0xFFC0); // yellow
|
||||||
|
g.drawImage(img, 12, 132, {scale:2});
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw the bpm
|
||||||
|
if (bpm !== prevBpm) {
|
||||||
|
prevBpm = bpm;
|
||||||
|
g.setColor(0);
|
||||||
|
g.fillRect(120, 120, 239, 239);
|
||||||
|
g.setColor(1,1,1);
|
||||||
|
//g.setColor(0xFFC0); // yellow
|
||||||
|
g.setFont("Vector",52);
|
||||||
|
g.setFontAlign(0,0);
|
||||||
|
g.drawString(bpm, 180, 180);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {init:init, freeResources:freeResources, startTimer:startTimer, stopTimer:stopTimer,
|
||||||
|
onButtonShort:onButtonShort, onButtonLong:onButtonLong};
|
||||||
|
}
|
||||||
|
|
||||||
|
return getFace;
|
||||||
|
})();
|
||||||
|
|
@ -26,7 +26,7 @@ function nextFace(){
|
||||||
|
|
||||||
g.clear();
|
g.clear();
|
||||||
g.reset();
|
g.reset();
|
||||||
face.init(gpsObj, swObj);
|
face.init(gpsObj, swObj, hrmObj);
|
||||||
startdraw();
|
startdraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -651,6 +651,64 @@ function stopwatchDraw() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
|
||||||
|
Heart Rate Monitor
|
||||||
|
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
function HRM() {
|
||||||
|
this.bpm = 0;
|
||||||
|
this.confidence = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRM.prototype.log_debug = function(o) {
|
||||||
|
//console.log(o);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRM.prototype.toggleHRMPower = function() {
|
||||||
|
this.log_debug("HRM.toggleHRMPower()");
|
||||||
|
if (!Bangle.isHRMOn) return; // old firmware
|
||||||
|
|
||||||
|
if (!Bangle.isHRMOn()) {
|
||||||
|
this.log_debug("HRM.toggleHRMPower(powerOn)");
|
||||||
|
Bangle.removeListener('HRM', onHRM);
|
||||||
|
Bangle.setHRMPower(1);
|
||||||
|
Bangle.on('HRM', onHRM);
|
||||||
|
} else {
|
||||||
|
this.log_debug("HRM.toggleHRMPower(powerOff)");
|
||||||
|
Bangle.removeListener('HRM', onHRM);
|
||||||
|
Bangle.setHRMPower(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// poke the hrt widget indicator to change
|
||||||
|
if (WIDGETS.widhrt !== undefined) {
|
||||||
|
WIDGETS.widhrt.draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HRM.prototype.getBpm = function() {
|
||||||
|
return this.bpm;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRM.prototype.getConfidence = function() {
|
||||||
|
return this.confidence;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRM.prototype.onHRM = function(hrm) {
|
||||||
|
this.bpm = hrm.bpm;
|
||||||
|
this.confidence = hrm.confidence;
|
||||||
|
this.log_debug("onHRM:(bpm)" + this.bpm);
|
||||||
|
this.log_debug("onHRM:(conf) " + this.confidence);
|
||||||
|
}
|
||||||
|
|
||||||
|
let hrmObj = new HRM();
|
||||||
|
|
||||||
|
function onHRM(hrm) {
|
||||||
|
hrmObj.onHRM(hrm);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Start App
|
Start App
|
||||||
|
|
@ -659,6 +717,6 @@ Start App
|
||||||
|
|
||||||
g.clear();
|
g.clear();
|
||||||
Bangle.loadWidgets();
|
Bangle.loadWidgets();
|
||||||
face.init(gpsObj,swObj);
|
face.init(gpsObj,swObj, hrmObj);
|
||||||
startdraw();
|
startdraw();
|
||||||
setButtons();
|
setButtons();
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
var buf;
|
var buf;
|
||||||
var intervalRefSec;
|
var intervalRefSec;
|
||||||
|
|
||||||
function init(g,sw) {
|
function init(g,sw,hrm) {
|
||||||
showMem("stepo init 1");
|
showMem("stepo init 1");
|
||||||
pal4color = new Uint16Array([0x0000,0xFFFF,0x7BEF,0xAFE5],0,2); // b,w,grey,greenyellow
|
pal4color = new Uint16Array([0x0000,0xFFFF,0x7BEF,0xAFE5],0,2); // b,w,grey,greenyellow
|
||||||
pal4red = new Uint16Array([0x0000,0xFFFF,0xF800,0xAFE5],0,2); // b,w,red,greenyellow
|
pal4red = new Uint16Array([0x0000,0xFFFF,0xF800,0xAFE5],0,2); // b,w,red,greenyellow
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
function getFace(){
|
function getFace(){
|
||||||
let swObject = undefined;
|
let swObject = undefined;
|
||||||
|
|
||||||
function init(gps, sw) {
|
function init(gps, sw, hrm) {
|
||||||
swObject = sw;
|
swObject = sw;
|
||||||
g.clear();
|
g.clear();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue