From 791f88b0613b1776793ee478f11f6aad22a03b70 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Mon, 10 Jan 2022 20:27:40 +0100 Subject: [PATCH] New widget: Heart rate alarm --- apps.json | 16 +++++++++++ apps/hralarm/ChangeLog | 1 + apps/hralarm/README.md | 15 +++++++++++ apps/hralarm/settings.js | 57 +++++++++++++++++++++++++++++++++++++++ apps/hralarm/widget.js | 27 +++++++++++++++++++ apps/hralarm/widget.png | Bin 0 -> 12944 bytes 6 files changed, 116 insertions(+) create mode 100644 apps/hralarm/ChangeLog create mode 100644 apps/hralarm/README.md create mode 100644 apps/hralarm/settings.js create mode 100644 apps/hralarm/widget.js create mode 100644 apps/hralarm/widget.png diff --git a/apps.json b/apps.json index 389603249..08d6113d4 100644 --- a/apps.json +++ b/apps.json @@ -1351,6 +1351,22 @@ {"name":"pparrot.img","url":"party-parrot-icon.js","evaluate":true} ] }, + { + "id": "hralarm", + "name": "Heart rate alarm", + "shortName":"HR Alarm", + "version":"0.01", + "description": "This invisible widget vibrates whenever the heart rate gets close to the upper limit or goes over or under the configured limits", + "icon": "widget.png", + "type": "widget", + "tags": "widget", + "supports" : ["BANGLEJS2"], + "readme": "README.md", + "storage": [ + {"name":"hralarm.wid.js","url":"widget.js"}, + {"name":"hralarm.settings.js","url":"settings.js"} + ] + }, { "id": "hrings", "name": "Hypno Rings", diff --git a/apps/hralarm/ChangeLog b/apps/hralarm/ChangeLog new file mode 100644 index 000000000..4c21f3ace --- /dev/null +++ b/apps/hralarm/ChangeLog @@ -0,0 +1 @@ +0.01: New Widget! diff --git a/apps/hralarm/README.md b/apps/hralarm/README.md new file mode 100644 index 000000000..37b14ad9d --- /dev/null +++ b/apps/hralarm/README.md @@ -0,0 +1,15 @@ +# Heart rate alarm + +This invisible widget vibrates whenever the heart rate gets close to the upper limit or goes over or under the configured limits. + +## Usage + +Configure the heart rate limits in the apps settings. This widget uses both 'HRM' and 'BTHRM' events. + +## Features + +Long vibration every 10 seconds on reaching upper limit, short vibrations between upper limit and warning threshold and an single vibration when reaching the lower limit again. + +## Requests/Creator + +https://github.com/halemmerich diff --git a/apps/hralarm/settings.js b/apps/hralarm/settings.js new file mode 100644 index 000000000..3158ab8b7 --- /dev/null +++ b/apps/hralarm/settings.js @@ -0,0 +1,57 @@ +(function(back) { + var FILE = "hralarm.json"; + + var settings = Object.assign({ + enabled: false, + upper: 180, + warning: 170, + lower: 150, + }, require('Storage').readJSON(FILE, true) || {}); + + function writeSettings() { + require('Storage').writeJSON(FILE, settings); + } + + E.showMenu({ + '': { 'title': 'HR Alarm' }, + '< Back': back, + 'Enabled': { + value: !!settings.enabled, + format: v => settings.enabled ? "On" : "Off", + onchange: v => { + settings.enabled = v; + writeSettings(); + } + }, + 'Upper limit': { + value: settings.upper, + min: 0, + step:5, + max: 300, + onchange: v => { + settings.upper = v; + writeSettings(); + } + }, + 'Lower limit': { + value: settings.lower, + min: 0, + step:5, + max: 300, + onchange: v => { + settings.lower = v; + writeSettings(); + } + }, + 'Warning at': { + value: settings.warning, + min: 0, + step:5, + max: 300, + onchange: v => { + settings.warning = v; + writeSettings(); + } + } + }); +}) diff --git a/apps/hralarm/widget.js b/apps/hralarm/widget.js new file mode 100644 index 000000000..30a94fdf2 --- /dev/null +++ b/apps/hralarm/widget.js @@ -0,0 +1,27 @@ +(() => { + var settings = require('Storage').readJSON("hralarm.json", true) || {}; + if (!settings.enabled){ Bangle.setHRMPower(0, 'hralarm'); return; } + Bangle.setHRMPower(1, 'hralarm'); + var hitLimit = 0; + var checkHr = function(hr){ + if (hr.bpm > settings.warning && hr.bpm <= settings.upper){ + Bangle.buzz(100, 1); + } + if (hitLimit < getTime() && hr.bpm > settings.upper){ + hitLimit = getTime() + 10; + Bangle.buzz(2000, 1); + } + if (hitLimit > 0 && hr.bpm < settings.lower){ + hitLimit = 0; + Bangle.buzz(500, 1); + } + }; + Bangle.on("HRM", checkHr); + Bangle.on("BTHRM", checkHr); + + WIDGETS["hralarm"]={ + area:"tl", + width: 0, + draw: function(){} + }; +})() diff --git a/apps/hralarm/widget.png b/apps/hralarm/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..726cf3f9bb528f4a8aecd0fba7e4862f4cc4ec2d GIT binary patch literal 12944 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