From 4d107148c78d5a7211e2e08664052014059b5371 Mon Sep 17 00:00:00 2001 From: jeffyactive Date: Mon, 29 Nov 2021 21:31:53 -0500 Subject: [PATCH 1/2] Added SensiBLE app --- apps.json | 17 ++++ apps/sensible/ChangeLog | 1 + apps/sensible/README.md | 35 +++++++ apps/sensible/sensible-icon.js | 1 + apps/sensible/sensible.js | 163 +++++++++++++++++++++++++++++++++ apps/sensible/sensible.png | Bin 0 -> 1716 bytes 6 files changed, 217 insertions(+) create mode 100644 apps/sensible/ChangeLog create mode 100644 apps/sensible/README.md create mode 100644 apps/sensible/sensible-icon.js create mode 100644 apps/sensible/sensible.js create mode 100644 apps/sensible/sensible.png diff --git a/apps.json b/apps.json index 1c614c592..5ccbecd98 100644 --- a/apps.json +++ b/apps.json @@ -4526,5 +4526,22 @@ {"name":"93dub.app.js","url":"app.js"}, {"name":"93dub.img","url":"app-icon.js","evaluate":true} ] + }, + { + "id": "sensible", + "name": "SensiBLE", + "shortName": "SensiBLE", + "version": "0.01", + "description": "Collect, display and advertise real-time sensor data.", + "icon": "sensible.png", + "type": "app", + "tags": "tool,sensors", + "supports" : [ "BANGLEJS2" ], + "allow_emulator": true, + "readme": "README.md", + "storage": [ + { "name": "sensible.app.js", "url": "sensible.js" }, + { "name": "sensible.img", "url": "sensible-icon.js", "evaluate": true } + ] } ] diff --git a/apps/sensible/ChangeLog b/apps/sensible/ChangeLog new file mode 100644 index 000000000..5560f00bc --- /dev/null +++ b/apps/sensible/ChangeLog @@ -0,0 +1 @@ +0.01: New App! diff --git a/apps/sensible/README.md b/apps/sensible/README.md new file mode 100644 index 000000000..f79b61aea --- /dev/null +++ b/apps/sensible/README.md @@ -0,0 +1,35 @@ +# Sensible + +Collect all the sensor data from the Bangle.js 2, display the live readings in menu pages, and broadcast in Bluetooth Low Energy (BLE) advertising packets to any listening devices in range. + + +## Usage + +The advertising packets will be recognised by [Pareto Anywhere](https://www.reelyactive.com/pareto/anywhere/) open source middleware and any other program which observes the standard packet types. Also convenient for testing individual sensors of the Bangle.js 2 via the menu interface. + + +## Features + +Currently implements: +- Accelerometer +- Barometer +- GPS +- Heart Rate Monitor +- Magnetometer + +in the menu display but NOT YET in Bluetooth Low Energy advertising (which will be implemented in a subsequent version). + + +## Controls + +Browse and control sensors using the standard Espruino menu interface. + + +## Requests + +[Contact reelyActive](https://www.reelyactive.com/contact/) for support/updates. + + +## Creator + +Developed by [jeffyactive](https://github.com/jeffyactive) of [reelyActive](https://www.reelyactive.com) diff --git a/apps/sensible/sensible-icon.js b/apps/sensible/sensible-icon.js new file mode 100644 index 000000000..f904fc7f3 --- /dev/null +++ b/apps/sensible/sensible-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("mEwwkG/4AG+cilGIxGCkU/B44AGmQUBAAsjCyoYN+QWJAAMvCxsjLQXzG4gYIOIZwG+YLDCw34BRIkFx4JFHQRDElGCJYgOCFw5RCPQwJFGAg4BIoSRIDAQQEG4YLBHgYAGJQIjCJ4RGBDoU4SIqNDwYwDJAQEDFwSRGDAQfBFQgIDFwQtDRoowBAgQDEDYQzC7oACTogrEA4IfF/4WDDAY/Fx4CCEYQbB/oXF74TDCAYGBUoIDDCwowCUoIkBAYSABGwIDCLogADBIKMCAYRODLwRGGJAaMFPwghBnoXJHoJ8DF4Q5DC5HTKogVBgAAFpoXH6oQGAA1dC7/UC5sNC4/dCA0QAwsEC50BC40AC5FQC4sgMB4XFgUwC40FC4/QBwkD+B5HDA6oFh/xSREFqtVbogMEj/yVxkFMwRgEl//Y5sAqhgF///SA4AHghgDgQXBPBAAHrpICh4XBMBoADC4ReBAALxHABUBCwX/bI4AKgYXD+YXRn4XDSKCNDAAZ5QOoZhSLohhESRkBLopJQIo4YOCxYYCJQ0BCxoACmURCoMRkYOI")) \ No newline at end of file diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js new file mode 100644 index 000000000..eaebd5c2b --- /dev/null +++ b/apps/sensible/sensible.js @@ -0,0 +1,163 @@ +/** + * Copyright reelyActive 2021 + * We believe in an open Internet of Things + */ + + +// Non-user-configurable constants +const APP_ID = 'sensible'; + + +// Global variables +let acc, bar, hrm, mag; +let isAccMenu, isBarMenu, isGpsMenu, isHrmMenu, isMagMenu = false; +let barEnabled, gpsEnabled, hrmEnabled, magEnabled = true; + + +// Menus +let mainMenu = { + "": { "title": "-- SensiBLE --" }, + "Acceleration": function() { E.showMenu(accMenu); isAccMenu = true; }, + "Barometer": function() { E.showMenu(barMenu); isBarMenu = true; }, + "GPS": function() { E.showMenu(gpsMenu); isGpsMenu = true; }, + "Heart Rate": function() { E.showMenu(hrmMenu); isHrmMenu = true; }, + "Magnetometer": function() { E.showMenu(magMenu); isMagMenu = true; } +}; +let accMenu = { + "": { "title" : "- Acceleration -" }, + "State": { value: "On" }, + "x": { value: null }, + "y": { value: null }, + "z": { value: null }, + "<-": function() { E.showMenu(mainMenu); isAccMenu = false; }, +}; +let barMenu = { + "": { "title" : "- Barometer -" }, + "State": { + value: barEnabled, + format: v => v ? "On" : "Off", + onchange: v => { barEnabled = v; Bangle.setBarometerPower(v, APP_ID); } + }, + "Altitude": { value: null }, + "Press": { value: null }, + "Temp": { value: null }, + "<-": function() { E.showMenu(mainMenu); isBarMenu = false; }, +}; +let gpsMenu = { + "": { "title" : "- GPS -" }, + "State": { + value: gpsEnabled, + format: v => v ? "On" : "Off", + onchange: v => { gpsEnabled = v; Bangle.setGPSPower(v, APP_ID); } + }, + "Lat": { value: null }, + "Lon": { value: null }, + "Altitude": { value: null }, + "Satellites": { value: null }, + "HDOP": { value: null }, + "<-": function() { E.showMenu(mainMenu); isGpsMenu = false; }, +}; +let hrmMenu = { + "": { "title" : "- Heart Rate -" }, + "State": { + value: hrmEnabled, + format: v => v ? "On" : "Off", + onchange: v => { hrmEnabled = v; Bangle.setHRMPower(v, APP_ID); } + }, + "BPM": { value: null }, + "Confidence": { value: null }, + "<-": function() { E.showMenu(mainMenu); isHrmMenu = false; }, +}; +let magMenu = { + "": { "title" : "- Magnetometer -" }, + "State": { + value: magEnabled, + format: v => v ? "On" : "Off", + onchange: v => { magEnabled = v; Bangle.setCompassPower(v, APP_ID); } + }, + "x": { value: null }, + "y": { value: null }, + "z": { value: null }, + "Heading": { value: null }, + "<-": function() { E.showMenu(mainMenu); isMagMenu = false; }, +}; + + +// Update acceleration +Bangle.on('accel', function(newAcc) { + acc = newAcc; + + if(isAccMenu) { + accMenu.x.value = acc.x.toFixed(2); + accMenu.y.value = acc.y.toFixed(2); + accMenu.z.value = acc.z.toFixed(2); + E.showMenu(accMenu); + } +}); + +// Update barometer +Bangle.on('pressure', function(newBar) { + bar = newBar; + + if(isBarMenu) { + barMenu.Altitude.value = bar.altitude.toFixed(1) + 'm'; + barMenu.Press.value = bar.pressure.toFixed(1) + 'mbar'; + barMenu.Temp.value = bar.temperature.toFixed(1) + 'C'; + E.showMenu(barMenu); + } +}); + +// Update GPS +Bangle.on('GPS', function(newGps) { + gps = newGps; + + if(isGpsMenu) { + gpsMenu.Lat.value = gps.lat.toFixed(4); + gpsMenu.Lon.value = gps.lon.toFixed(4); + gpsMenu.Altitude.value = gps.alt + 'm'; + gpsMenu.Satellites.value = gps.satellites; + gpsMenu.HDOP.value = (gps.hdop * 5).toFixed(1) + 'm'; + E.showMenu(gpsMenu); + } +}); + +// Update heart rate monitor +Bangle.on('HRM', function(newHrm) { + hrm = newHrm; + + if(isHrmMenu) { + hrmMenu.BPM.value = hrm.bpm; + hrmMenu.Confidence.value = hrm.confidence + '%'; + E.showMenu(hrmMenu); + } +}); + +// Update magnetometer +Bangle.on('mag', function(newMag) { + mag = newMag; + + if(isMagMenu) { + magMenu.x.value = mag.x; + magMenu.y.value = mag.y; + magMenu.z.value = mag.z; + magMenu.Heading.value = mag.heading.toFixed(1); + E.showMenu(magMenu); + } +}); + + +// Special function to handle display switch on +//Bangle.on('lcdPower', (on) => { +// if(on) { +// E.showMenu(mainMenu); +// } +//}); + + +// On start: +g.clear(); +Bangle.setBarometerPower(true, APP_ID); +Bangle.setGPSPower(true, APP_ID); +Bangle.setHRMPower(true, APP_ID); +Bangle.setCompassPower(true, APP_ID); +E.showMenu(mainMenu); \ No newline at end of file diff --git a/apps/sensible/sensible.png b/apps/sensible/sensible.png new file mode 100644 index 0000000000000000000000000000000000000000..d3e3dfbef76d1f4d89f0836f150715a1a796e870 GIT binary patch literal 1716 zcmV;l221&gP);L88V%$8I>Vz!-GZ43L{7;uQ&8ysK#o0edR-0 zk;iMxjUc2NN@yDDaCaJvM}rMJ)x7=Z=f!20r|+*WuD(`xv+1h6x$RyD0vGs+B$iNs zGIcKq6AO-joa%MMyCHi^+vsnL)O6!B517tc9BnSz;0-84@tc_k)I6gy3L!xoy5Pmo z-~T!yQVR%0{KoRL*L&D)Eu6V-LpvcHmXZ%4TB z{}_r-zq{$+s5PaL%gj;fW?a0p@!iTW^FcP5P ztD;ju$}t8iRse}-lTB=CcJ3iDFBrn{dm_=(w&}zL)`p|;c%p|CN2&74Ew(Da<>YVt z$=CkIU##G*fAMa`;X?8A>1NgrD*1uUIdPFK!GJgg1Vf9>m26?;Hzn*rzSG)1B(0Dw zMX%axlb?vX^4n`By5>H{f5EY6`!dLuIfcJ=hE<{E)m1+;5)d{yrMU_r$g!nGMJJKu z+?}06Q#{XOZsjG$g)zhO*c)q8i?rZqy!-uIav$nw+BAc2mu@Q>qh$L8S|+ir>XOH6 zaz4y(RhC;U_0*yQ_FA~r?36zNm~|3|?TT|jxY~g_9BD7{Ez%r9JEHRkYxl6< z8;;hox(QjovV2+h_PEUp)vCV3edI^6w@kK4AZJ1lW%-HU6>%>w^L*}L$5`FK?wt%z z*(J@S);sRG{nV1a!?|z}-zl_%1XLm?$e9pMA~W#fk^*jMs%IFm@q_mZOO9J#Cbd@W zQ0wW6%g056vFpkhEqjGQlqClz<#U*l>~~H5WlI;ze)qgarev3i$^UZaP$hj~GpCCT zpZs)i#L_}B4*hXnOhS}t!3-A`7RKpA-rH13XJo`uDlLSDhH`;{fi$gw4P&U1&d451 zsk9)N(QjzpNUEeWj1wr876dc;Z`rW^T&GG*Pn>z5QfWaj6BQLj)7mJWM8)((%N(v> zUrOZ_f|48P(Gh;|5bIuMo^6BqY$ZPfQ%jxjv_QJ;s{Rl*cOsGbWRX zrhCGeaL)P>mGm7AA9DeHD32O~na0M(K7Dl5DlssSTOPyNKc&JxVtP-{Dr~@v@PQT^ zt9x=Ofj>QVurLl*#BjOeg(#oQU7ba(h*A9k=lg%d1}}awW@Tm3#fJm-Z*qh%56PYV z@C8~a2W&`&>~?!lP!L`34PZ;+pX2t%NdpZ2`aeo*M8E)SNQMA|!9YuT6(d8X8Mbvi zT@nEUq7%uG)oKk64yIMT4NRk&>D+t6X&%xrpfCiiUcH(Y`T>vhKu3*HU!UH8sU&l70XcZxyN5a0ET_xia5A$f`k zd>P`qW&wsougpx4fJ%PCy`l$0A{rVR5)%_2_A;4=!JcKF Date: Mon, 29 Nov 2021 21:48:30 -0500 Subject: [PATCH 2/2] Corrected variable initialisation --- apps.json | 2 +- apps/sensible/ChangeLog | 1 + apps/sensible/sensible.js | 45 +++++++++++++++++++-------------------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/apps.json b/apps.json index 5ccbecd98..a5c9263d2 100644 --- a/apps.json +++ b/apps.json @@ -4531,7 +4531,7 @@ "id": "sensible", "name": "SensiBLE", "shortName": "SensiBLE", - "version": "0.01", + "version": "0.02", "description": "Collect, display and advertise real-time sensor data.", "icon": "sensible.png", "type": "app", diff --git a/apps/sensible/ChangeLog b/apps/sensible/ChangeLog index 5560f00bc..ba597a22f 100644 --- a/apps/sensible/ChangeLog +++ b/apps/sensible/ChangeLog @@ -1 +1,2 @@ 0.01: New App! +0.02: Corrected variable initialisation diff --git a/apps/sensible/sensible.js b/apps/sensible/sensible.js index eaebd5c2b..c569ff720 100644 --- a/apps/sensible/sensible.js +++ b/apps/sensible/sensible.js @@ -10,8 +10,15 @@ const APP_ID = 'sensible'; // Global variables let acc, bar, hrm, mag; -let isAccMenu, isBarMenu, isGpsMenu, isHrmMenu, isMagMenu = false; -let barEnabled, gpsEnabled, hrmEnabled, magEnabled = true; +let isAccMenu = false; +let isBarMenu = false; +let isGpsMenu = false; +let isHrmMenu = false; +let isMagMenu = false; +let isBarEnabled = true; +let isGpsEnabled = true; +let isHrmEnabled = true; +let isMagEnabled = true; // Menus @@ -34,9 +41,9 @@ let accMenu = { let barMenu = { "": { "title" : "- Barometer -" }, "State": { - value: barEnabled, + value: isBarEnabled, format: v => v ? "On" : "Off", - onchange: v => { barEnabled = v; Bangle.setBarometerPower(v, APP_ID); } + onchange: v => { isBarEnabled = v; Bangle.setBarometerPower(v, APP_ID); } }, "Altitude": { value: null }, "Press": { value: null }, @@ -46,9 +53,9 @@ let barMenu = { let gpsMenu = { "": { "title" : "- GPS -" }, "State": { - value: gpsEnabled, + value: isGpsEnabled, format: v => v ? "On" : "Off", - onchange: v => { gpsEnabled = v; Bangle.setGPSPower(v, APP_ID); } + onchange: v => { isGpsEnabled = v; Bangle.setGPSPower(v, APP_ID); } }, "Lat": { value: null }, "Lon": { value: null }, @@ -60,9 +67,9 @@ let gpsMenu = { let hrmMenu = { "": { "title" : "- Heart Rate -" }, "State": { - value: hrmEnabled, + value: isHrmEnabled, format: v => v ? "On" : "Off", - onchange: v => { hrmEnabled = v; Bangle.setHRMPower(v, APP_ID); } + onchange: v => { isHrmEnabled = v; Bangle.setHRMPower(v, APP_ID); } }, "BPM": { value: null }, "Confidence": { value: null }, @@ -71,9 +78,9 @@ let hrmMenu = { let magMenu = { "": { "title" : "- Magnetometer -" }, "State": { - value: magEnabled, + value: isMagEnabled, format: v => v ? "On" : "Off", - onchange: v => { magEnabled = v; Bangle.setCompassPower(v, APP_ID); } + onchange: v => { isMagEnabled = v; Bangle.setCompassPower(v, APP_ID); } }, "x": { value: null }, "y": { value: null }, @@ -146,18 +153,10 @@ Bangle.on('mag', function(newMag) { }); -// Special function to handle display switch on -//Bangle.on('lcdPower', (on) => { -// if(on) { -// E.showMenu(mainMenu); -// } -//}); - - -// On start: +// On start: enable sensors and display main menu g.clear(); -Bangle.setBarometerPower(true, APP_ID); -Bangle.setGPSPower(true, APP_ID); -Bangle.setHRMPower(true, APP_ID); -Bangle.setCompassPower(true, APP_ID); +Bangle.setBarometerPower(isBarEnabled, APP_ID); +Bangle.setGPSPower(isGpsEnabled, APP_ID); +Bangle.setHRMPower(isHrmEnabled, APP_ID); +Bangle.setCompassPower(isMagEnabled, APP_ID); E.showMenu(mainMenu); \ No newline at end of file