From 455182a384fe6e55c0f946167c25863b46a749fc Mon Sep 17 00:00:00 2001 From: Phil R Date: Sun, 8 Jan 2023 12:31:19 +0100 Subject: [PATCH] init init Update widget.js - removed prints - changed the delay - changed the width - added a try catch for reading the values - added `reloadInterval` but not used yet Update widget.js Expanded the widget, to fix formatting issues Added Changelog Create metadata.json Add files via upload Update metadata.json Update metadata.json Update ChangeLog Update ChangeLog Update metadata.json Update metadata.json removed the fallthrough cases Expected a 'break' statement before 'case' no-fallthrough Update metadata.json Update metadata.json Update metadata.json Update README.md Update README.md Update README.md Update README.md Update README.md test --- apps/widbgjs/ChangeLog | 1 + apps/widbgjs/README.md | 29 ++++++++ apps/widbgjs/metadata.json | 22 ++++++ apps/widbgjs/screenshot.png | Bin 0 -> 16877 bytes apps/widbgjs/settings.js | 54 ++++++++++++++ apps/widbgjs/widget.js | 143 ++++++++++++++++++++++++++++++++++++ 6 files changed, 249 insertions(+) create mode 100644 apps/widbgjs/ChangeLog create mode 100644 apps/widbgjs/README.md create mode 100644 apps/widbgjs/metadata.json create mode 100644 apps/widbgjs/screenshot.png create mode 100644 apps/widbgjs/settings.js create mode 100644 apps/widbgjs/widget.js diff --git a/apps/widbgjs/ChangeLog b/apps/widbgjs/ChangeLog new file mode 100644 index 000000000..7b83706bf --- /dev/null +++ b/apps/widbgjs/ChangeLog @@ -0,0 +1 @@ +0.01: First release diff --git a/apps/widbgjs/README.md b/apps/widbgjs/README.md new file mode 100644 index 000000000..dbb8cd9e4 --- /dev/null +++ b/apps/widbgjs/README.md @@ -0,0 +1,29 @@ +# Prerequisites +For this widget to work and to get data from the phone, you need: +- An Android phone + - with xDrip and the helper app installed. + - the Gadgetbridge app (bangle version) for the Android phone +- A BangleJS + - With this widget installed + +# Widget + +## How to use it +Make sure you have all the prerequisites from above. + +The watch should automatically start displaying values, if there is an arrow visible behind the value, the value is within the not-expired-yet time range changeable in the settings standard is 15 minutes. (I will probably change this in the future, to strike through the text to make expired values clearer). + +## Settings +In the settings, you can: +- Disable/hide the widget +- Change the unit from mmol/L to mg/dL +- Set a time at which old BG values expire + + +# Developer +Developed by Phil Roggenbuck (phrogg) + + +# Disclaimer +As well as xdrip you should not use this app to make medical decisions! + diff --git a/apps/widbgjs/metadata.json b/apps/widbgjs/metadata.json new file mode 100644 index 000000000..0639b5a51 --- /dev/null +++ b/apps/widbgjs/metadata.json @@ -0,0 +1,22 @@ +{ + "id": "widbgjs", + "name": "Blood Glucose Widget (xdrip)", + "shortName":"BG Widget", + "icon": "screenshot.png", + "screenshots": [{"url":"screenshot.png"}], + "version":"0.01", + "type": "widget", + "supports": ["BANGLEJS", "BANGLEJS2"], + "readme": "README.md", + "allow_emulator":true, + "description": "Displays the current blood glucose received from xdrip and send over via a helper app on the watch.", + "tags": "widget", + "storage": [ + {"name":"widbgjs.wid.js","url":"widget.js"}, + {"name":"widbgjs.settings.js","url":"settings.js"} + ], + "data": [ + {"name":"widbgjs.json"}, + {"name":"widbgjs.settings.json"} + ] + } diff --git a/apps/widbgjs/screenshot.png b/apps/widbgjs/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..b6e092af2c13ad62405502b5cb8c9036ddbe8488 GIT binary patch literal 16877 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 (s.unitIsMmol ? 'mmol/L' : 'mg/dL'), + onchange: () => { + s.unitIsMmol = !s.unitIsMmol; + save(); + }, + }, + 'Exp. BG': { + value: s.expireThreshold, + min: 18000, step: 60000, + format: s => (s ? s / 60000 + ' min' : '0'), + onchange: (g) => { + s.expireThreshold = g; + save(); + }, + }, + 'Hide Widget': { + value: s.hide, + format: () => (s.hide ? 'Yes' : 'No'), + onchange: () => { + s.hide = !s.hide; + save(); + }, + }, + '< Back': back, + }); +}); \ No newline at end of file diff --git a/apps/widbgjs/widget.js b/apps/widbgjs/widget.js new file mode 100644 index 000000000..1a1df002d --- /dev/null +++ b/apps/widbgjs/widget.js @@ -0,0 +1,143 @@ +//WIDGETS = {}; // <-- for development only + +(() => { + // persistant vals + let storedData; + let settings; + + function loadSettings() { // stolen from https://github.com/espruino/BangleApps/blob/master/apps/widpedom/widget.js + const d = require('Storage').readJSON("widbgjs.settings.json", 1) || {}; + settings = Object.assign({ + 'unitIsMmol': true, + 'expireThreshold': 600000, + 'reloadInterval': 5 * 60000, + 'hide': false + }, d || {}); + return d; + } + + function loadVals() { + try { + const d = require('Storage').readJSON("widbgjs.json", 1) || {}; + storedData = Object.assign({ + 'bg': null, + 'bgTimeStamp': null, + 'bgDirection': null + }, d || {}); + return d; + } catch(e) { + Bangle.removeFile("widbgjs.json"); + } + return null; + } + + function calculateRotation(bgDirection) { + var a = 90; + // get the arrow right (https://github.com/StephenBlackWasAlreadyTaken/NightWatch/blob/6de1d3775c6e447177c12f387f647628cc8e24ce/mobile/src/main/java/com/dexdrip/stephenblack/nightwatch/Bg.java) + switch (bgDirection) { + case ("DoubleDown"): + g.setColor("#f00"); + a = 180; + break; + case ("SingleDown"): + a = 180; + break; + case ("DoubleUp"): + g.setColor("#f00"); + a = 0; + break; + case ("SingleUp"): + a = 0; + break; + case ("FortyFiveUp"): + a = 45; + break; + case ("FortyFiveDown"): + a = 135; + break; + case ("Flat"): + a = 90; + break; + } + // turn the arrow thanks to (https://forum.espruino.com/conversations/344607/) + const p180 = Math.PI / 180; + // a is defined above + var r = 21; + var x = r * Math.sin(a * p180); + var y = r * Math.cos(a * p180); + + return a * p180; + } + + function getBG(bg) { + var tmp = null; + + try { + if (storedData.bg !== null) { + tmp = bg; + + if (settings.unitIsMmol) { + tmp /= 18; + tmp = tmp.toFixed(1); + } + } + + } catch (e) { } + return tmp; + } + + function isBgTooOld(bgTimeStamp) { + var currTimeInMilli = new Date().valueOf(); + + try { + if (bgTimeStamp === null) { + return true; + } + + if (currTimeInMilli - settings.expireThreshold <= bgTimeStamp) { + return false; + } + } catch (e) { } + return true; + } + + function draw() { + loadSettings(); + try { + if (settings.hide) return; + } catch (e) { } + loadVals(); + + outpt = getBG(storedData.bg); + + if (outpt === null) { // this means no value has been received yet + outpt = "BG"; + bgTimeStamp = "0"; + } + + // prepare to write on the screen + g.reset().clearRect(this.x, this.y, this.x + this.width, this.y + 23); // erase background + g.setFont('Vector', 22); + g.setColor(g.theme.fg); + + // check if the value is too old + if (!isBgTooOld(storedData.bgTimeStamp)) { + g.drawImage(atob("FBQBAGAADwAB+AA/wAduAGZgAGAABgAAYAAGAABgAAYAAGAABgAAYAAGAABgAAYAAGAABgA="), this.x + 60, this.y + 9, { rotate: calculateRotation(storedData.bgDirection) }); + } + g.setColor(g.theme.fg).drawString(outpt, this.x + 5, this.y); + } + + setInterval(function () { + WIDGETS["widbgjs"].draw(WIDGETS["widbgjs"]); + }, 5 * 60000); // update every 5 minutes (%* 60000 + + + // add your widget + WIDGETS["widbgjs"] = { + area: "tl", + width: 72, + draw: draw + }; +})(); + +//Bangle.drawWidgets(); // <-- for development only