diff --git a/apps.json b/apps.json index a0af1f7a3..b5584b55c 100644 --- a/apps.json +++ b/apps.json @@ -2118,6 +2118,19 @@ {"name":"osgridref.img","url":"app-icon.js","evaluate":true} ] }, + { "id": "openseizure", + "name": "OpenSeizureDetector Widget", + "shortName":"Short Name", + "icon": "widget.png", + "version":"0.01", + "description": "[BETA!] A widget to work alongside [OpenSeizureDetector](https://www.openseizuredetector.org.uk/)", + "tags": "widget", + "type": "widget", + "readme": "README.md", + "storage": [ + {"name":"openseizure.wid.js","url":"widget.js"} + ] + }, {"id": "counter", "name": "Counter", "icon": "counter_icon.png", diff --git a/apps/openseizure/ChangeLog b/apps/openseizure/ChangeLog new file mode 100644 index 000000000..4c21f3ace --- /dev/null +++ b/apps/openseizure/ChangeLog @@ -0,0 +1 @@ +0.01: New Widget! diff --git a/apps/openseizure/README.md b/apps/openseizure/README.md new file mode 100644 index 000000000..10a3a8a79 --- /dev/null +++ b/apps/openseizure/README.md @@ -0,0 +1,12 @@ +# OpenSeizureDetector Widget + +A widget to work alongside [OpenSeizureDetector](https://www.openseizuredetector.org.uk/) + +This is currently just a test and is not ready for everyday use. + +When the widget is running it puts the accelerometer into 25Hz mode, and then +roughly every second it outputs 20 samples (bytes) of acceleration data as a notification +on BLE Service `"a19585e9-0001-39d0-015f-b3e2b9a0c854"`, characteristic `"a19585e9-0002-39d0-015f-b3e2b9a0c854"`. + +Each byte is 1/25th of a second, with a magnitude of acceleration. It is scaled +such that 1g is 64. diff --git a/apps/openseizure/widget.js b/apps/openseizure/widget.js new file mode 100644 index 000000000..f176d2884 --- /dev/null +++ b/apps/openseizure/widget.js @@ -0,0 +1,41 @@ +(() => { + function draw() { + g.reset(); + g.drawImage(E.toArrayBuffer(atob("GBiEBAAAAAABEREQAAAAAAAAAAAKmZkgAAAAAAAAAAAKmZkgAAAAAAAAAAAKkzkgAAAAAAACIQAKkzkgABIgAAAZmSAKPykgApmRAAApmZoqMjkiqZmSAAKZmZmZ8zmpmZmZIAKZmZmZMzmZmZmZIAEpmZmZkzqZmZmSEAACqZmZkjOZmZogAAAAApmZkjOZmSAAAAAAApmZn/mZmSAAAAACqZmZrymZmZogAAEpmZmZkzmZmZmSEAqZmZmZkjqZmZmZoAKZmZmamvmpmZmZIAApmZIan6mhKZmSAAAZmiAKkymgAqmRAAACIAAKkimgAAIgAAAAAAAKkimgAAAAAAAAAAAKmZmgAAAAAAAAAAAKmZmgAAAAAAAAAAABEREQAAAAAA==")), this.x, this.y); + } + + var accelData = new Uint8Array(20); + var accelIdx = 0; + //http://kionixfs.kionix.com/en/datasheet/KX023-1025%20Specifications%20Rev%2012.0.pdf + Bangle.accelWr(0x1B,0x01 | 0x40); // 25hz output, ODR/2 filter + Bangle.setPollInterval(40); // 25hz input + Bangle.on('accel',function(a) { + accelData[accelIdx++] = E.clip(a.mag*64,0,255); + if (accelIdx>=accelData.length) { + accelIdx = 0; + try { NRF.updateServices({ + "a19585e9-0001-39d0-015f-b3e2b9a0c854" : { + "a19585e9-0002-39d0-015f-b3e2b9a0c854" : { + value : accelData, notify : true + } + } + })} catch(e) {}; + } + }); + + NRF.setServices({ + "a19585e9-0001-39d0-015f-b3e2b9a0c854" : { + "a19585e9-0002-39d0-015f-b3e2b9a0c854" : { + value : accelData, + maxLen : 20, + readable : true, + notify : true + } + } + }); + + // add your widget + WIDGETS["openseizure"]={ + area:"tl", width: 24, draw:draw + }; +})() diff --git a/apps/openseizure/widget.png b/apps/openseizure/widget.png new file mode 100644 index 000000000..9c0ecb772 Binary files /dev/null and b/apps/openseizure/widget.png differ