From d552bb8e8ac7e81a30c15b5ea3b44d506aab8aee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 20:17:26 +0200 Subject: [PATCH] Add files via upload --- apps/BangleBridge/README.md | 10 + apps/BangleBridge/banglebridge.png | Bin 0 -> 3492 bytes apps/BangleBridge/heart.img | 1 + apps/BangleBridge/iconWatch.img | Bin 0 -> 255 bytes apps/BangleBridge/widget.js | 293 +++++++++++++++++++++++++++++ 5 files changed, 304 insertions(+) create mode 100644 apps/BangleBridge/README.md create mode 100644 apps/BangleBridge/banglebridge.png create mode 100644 apps/BangleBridge/heart.img create mode 100644 apps/BangleBridge/iconWatch.img create mode 100644 apps/BangleBridge/widget.js diff --git a/apps/BangleBridge/README.md b/apps/BangleBridge/README.md new file mode 100644 index 000000000..9897971f8 --- /dev/null +++ b/apps/BangleBridge/README.md @@ -0,0 +1,10 @@ +Widget that allows Bangle Js to record pair and end data using Bluetooth Low Energy in combination with the BangleBridge Android App +Part of smartPPE project https://jorgepramos.github.io/Smart_PPE/index.html + +# BangleBridge + +Widget that allows Bangle Js to record pair and end data using Bluetooth Low Energy in combination with the BangleBridge Android App. + +## Full Project + +Part of smartPPE project [SmartPEE](https://jorgepramos.github.io/Smart_PPE/index.html). \ No newline at end of file diff --git a/apps/BangleBridge/banglebridge.png b/apps/BangleBridge/banglebridge.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1e693fce81785e47c0291619f3a9a62bc7dffb GIT binary patch literal 3492 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 S@FYF}0000xc=8|ph3_4-CRf-{2_ VqY;Pvo9@dHds!6LX9aAt!XL*LHO&A3 literal 0 HcmV?d00001 diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js new file mode 100644 index 000000000..5026b8446 --- /dev/null +++ b/apps/BangleBridge/widget.js @@ -0,0 +1,293 @@ +(() => { + /** + * Widget measurements + * Description: + * name: connection.wid.js + *icon: conectionIcon.icon + * + */ + + //Font + g.setFont("Vector", 100); + //variabangle.Sensorss + let acclS, bttS, compssS, gpsS, hrmS, stepS; //Strings + let accelN, compssN, gpsN, hrmN, stepN; //Num + let prueba = 1; + let data = [0, 0, 0, 0, 0, 0]; + //Constants for redabangle.Sensors code + let storage = require('Storage'); + let deCom = require('heatshrink'); + + + + + //Sensors code + /** + * + * @author Jorge + */ + function accel() { + + Bangle.on('accel', function (acc) { + // acc = {x,y,z,diff,mag} + accelN = acc; + }); + + setInterval(function () { + + acclS = accelN.x + "##" + accelN.y + "##" + accelN.z + "\n" + accelN.diff + "##" + accelN.mag; + data[3] = accelN; + }, 2 * 1000); + + } + + function btt() { + + setInterval(function () { + + bttS = E.getBattery(); //return String + data[2] = E.getBattery(); + }, 15 * 1000); + + } + + + + function compss() { + + Bangle.setCompassPower(1); + Bangle.on('mag', function (mag) { + // mag = {x,y,z,dx,dy,dz,heading} + compssN = mag; + }); + + + setInterval(function () { + + compssS = "A: " + compssN.x + " ## " + compssN.y + " ## " + compssN.z + "\n" + + "B: " + compssN.dx + " ## " + compssN.dy + " ## " + compssN.dz + " ## " + "\n" + + "C: " + compssN.heading; //return String + data[4] = compssN; + }, 2 * 1000); + + } + + + + function gps() { + + Bangle.setGPSPower(1); + Bangle.on('GPS', function (gps) { + // gps = {lat,lon,alt,speed,etc} + gpsN = gps; + + }); + + setInterval(function () { + + gpsS = "A: " + gpsN.lat + " ## " + gpsN.lon + " ## " + gpsN.alt + "\n" + "B: " + gpsN.speed + " ## " + gpsN.course + " ## " + gpsN.time + "\n" + + "C: " + gpsN.satellites + " ## " + gpsN.fix; //return String + // work out how to display the current time + var d = new Date(); + var year = d.getFullYear(); + + var month = d.getMonth() + 1; + var finalMonth = 0; + if (month < 10) { + finalMonth = "0" + month; + } else { + finalMonth = month; + } + var day = d.getDate(); + var finalDay = 0; + if (day < 10) { + finalDay = "0" + day; + } else { + finalDay = day; + } + var h = d.getHours(), + m = d.getMinutes(); + var finalh = 0; + if (h < 10) { + finalh = "0" + h; + } else { + finalh = h; + } + var finalM = 0; + if (m < 10) { + finalM = "0" + m; + } else { + finalM = m; + } + + var s = d.getSeconds(); + var finalS = 0; + if (s < 10) { + finalS = "0" + s; + } else { + finalS = s; + } + var z = d.getMilliseconds(); + var zFinal = new String(z); + zFinal = zFinal.replace('.', ''); + var completeTime = year + "-" + finalMonth + "-" + finalDay + "T" + finalh + ":" + finalM + ":" + finalS + "." + z + "Z"; + var time = h + ":" + ("0" + m).substr(-2); + gpsN.time = completeTime; + data[5] = gpsN; + }, 2 * 1000); + } + + + function hrm() { + + let msr = [0, 0, 0, 0, 0]; + let lastInsert = -1; + + function roundInsert(nueva) { + let indexFinal = (lastInsert + 1) % (msr.length); + + msr[indexFinal] = nueva; + + item = nueva; + lastInsert = indexFinal; + + } + + function normalize(nueva) { + + let normalize = 0; + roundInsert(nueva); + + + msr.forEach(function (number) { + normalize += number; + }); + normalize = normalize / msr.length; + + return normalize; + + } + + + + + setInterval(function () { + + if (!isNaN(hrmN)) { + + + hrmN = normalize(hrmN); + var roundedRate = parseFloat(hrmN).toFixed(2); + hrmS = String.valueOf(roundedRate); //return String + //console.log("array----->" + msr); + data[0] = roundedRate; + + } + + + + + + }, 2 * 1000); + + } + + + function steps() { + + Bangle.on('step', s => { + + stepN = s; + }); + + + setInterval(function () { + + stepS = String.valueOf(stepN); //return String + data[1] = stepN; + }, 2 * 1000); + + + } + + function initSensors() { + + //need power control + Bangle.setHRMPower(1); + + Bangle.on('HRM', function (hrm) { + hrmN = hrm.bpm; + + + }); + console.log("Sensors are being Init...."); + accel(); + btt(); + compss(); + gps(); + hrm(); + steps(); + + } + + var flip = 1; + Bangle.on('lcdPower', function (on) { + + if (flip == 1) { //when off + console.log("--------------------------------------------------------------- 1"); + flip = 0; + + g.clear(); + } else { //when on + console.log("--------------------------------------------------------------- 0"); + + flip = 1; + g.setFont("Vector", 30); + g.drawString(data[0], 65, 180); + Bangle.drawWidgets(); + } + + }); + + + function draw() { + + g.drawImage(storage.read("iconWatch.img"), this.x + 1, this.y + 1); + g.drawImage(storage.read("heart.img"), 145, 167); + } + + + // Finally add widget + WIDGETS["banglebridge"] = { + area: "tl", + width: 10, + draw: draw, + }; + + initSensors(); + + data[0] = 80.5; + g.setFont("Vector", 30); + g.drawString(data[0], 65, 180); + Bangle.drawWidgets(); + + + setInterval(function () { + + var measurement = { + hrm: data[0], + step: data[1], + batt: data[2], + acc: data[3], + com: data[4], + gps: data[5] + }; + + + + + Bluetooth.println(JSON.stringify(measurement) + "#"); + + }, 5 * 1000); + +})(); //End of Widget \ No newline at end of file