From 439f301c231fedd5cf00e6a1bc41ad6f66427f62 Mon Sep 17 00:00:00 2001 From: Willems Davy Date: Sat, 9 Sep 2023 21:28:58 +0200 Subject: [PATCH] add widhr (Last announced heartrate BPM Widget) --- apps/widhr/ChangeLog | 1 + apps/widhr/README.md | 10 ++++++++++ apps/widhr/metadata.json | 19 +++++++++++++++++++ apps/widhr/screenshot_widhr.png | Bin 0 -> 2716 bytes apps/widhr/widhr.icon.png | Bin 0 -> 7303 bytes apps/widhr/widhr.wid.js | 30 ++++++++++++++++++++++++++++++ 6 files changed, 60 insertions(+) create mode 100644 apps/widhr/ChangeLog create mode 100644 apps/widhr/README.md create mode 100644 apps/widhr/metadata.json create mode 100644 apps/widhr/screenshot_widhr.png create mode 100644 apps/widhr/widhr.icon.png create mode 100644 apps/widhr/widhr.wid.js diff --git a/apps/widhr/ChangeLog b/apps/widhr/ChangeLog new file mode 100644 index 000000000..7b83706bf --- /dev/null +++ b/apps/widhr/ChangeLog @@ -0,0 +1 @@ +0.01: First release diff --git a/apps/widhr/README.md b/apps/widhr/README.md new file mode 100644 index 000000000..66e909807 --- /dev/null +++ b/apps/widhr/README.md @@ -0,0 +1,10 @@ +# Last announced heartrate BPM Widget + +*Displays the last announced bpm measurement from Bangle.on('HRM', ...); +*it does not enable the heartrate sensor to do measurements it waits on such annoucement. I use it to view the last read value when letting the system take a reading every 10 minutes. +*saves last read value to a file so it can display that last value between app starts / reboots + +![](screenshot_widhr.png) + +Code based on Lato Pedometer Written by: [Hugh Barney](https://github.com/hughbarney) +Code Modified by: [Willems Davy](https://github.com/joyrider3774) diff --git a/apps/widhr/metadata.json b/apps/widhr/metadata.json new file mode 100644 index 000000000..eecc72182 --- /dev/null +++ b/apps/widhr/metadata.json @@ -0,0 +1,19 @@ +{ + "id": "widhr", + "name": "Last announced heartrate BPM Widget", + "shortName":"Last Heartrate BPM", + "icon": "widhr.icon.png", + "screenshots": [{"url":"screenshot_widhr.png"}], + "version":"0.01", + "type": "widget", + "supports": ["BANGLEJS2"], + "readme": "README.md", + "description": "Displays the last announced heartrate BPM from `Bangle.on(\"HRM\", ...);` (it does not enable the hrm sensor it expects the system or other app todo so)", + "tags": "widget", + "data": [ + {"name":"widhr.data.json"} + ], + "storage": [ + {"name":"widhr.wid.js","url":"widhr.wid.js"} + ] + } diff --git a/apps/widhr/screenshot_widhr.png b/apps/widhr/screenshot_widhr.png new file mode 100644 index 0000000000000000000000000000000000000000..e1911f9a32f5525c3a6faccd057e0d3bb88ca7cd GIT binary patch literal 2716 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 X&t+}Dm7HJ$_8?>nJM&9sd!zmb8x`LT literal 0 HcmV?d00001 diff --git a/apps/widhr/widhr.wid.js b/apps/widhr/widhr.wid.js new file mode 100644 index 000000000..bcc8628d3 --- /dev/null +++ b/apps/widhr/widhr.wid.js @@ -0,0 +1,30 @@ +function widhr_hrm(hrm) { + require("Storage").writeJSON("widhr.data.json", {"bpm":hrm.bpm}); + WIDGETS["widhr"].draw(); +} + +Bangle.on('HRM', widhr_hrm); + +function widhr_draw() { + var json = require("Storage").readJSON("widhr.data.json"); + var bpm = json === undefined ? 0 : json.bpm; + //3x6 from bpm text in 6x8 font + var w = (bpm.toString().length)*8 > 3 * 6 ? (bpm.toString().length)*8 : 3 * 6; + if (w != this.width) + { + this.width = w; + setTimeout(() => Bangle.drawWidgets(),10); return; + } + g.reset(); + g.setColor(g.theme.bg); + g.fillRect(this.x, this.y, this.x + this.width, this.y + 23); // erase background + g.setColor(g.theme.fg); + g.setFont("6x8:1"); + g.setFontAlign(-1, 0); + g.drawString("bpm", this.x, this.y + 5); + g.setFont("4x6:2"); + g.setFontAlign(-1, 0); + g.drawString(bpm, this.x, this.y + 17); +} + +WIDGETS["widhr"]={area:"tl",sortorder:-1,width:13,draw:widhr_draw}; \ No newline at end of file