From dfa901c67304b2b3be762132a07a64baea1c5670 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 18:02:53 +0200 Subject: [PATCH 01/47] Create some.js --- apps/BangleBridge/some.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/BangleBridge/some.js diff --git a/apps/BangleBridge/some.js b/apps/BangleBridge/some.js new file mode 100644 index 000000000..fd538074f --- /dev/null +++ b/apps/BangleBridge/some.js @@ -0,0 +1 @@ +E.showMessage("My\nSimple\nApp","My App") From e79680ae59026019011e05335f0e131d878d1c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 19:02:22 +0200 Subject: [PATCH 02/47] Update apps.json --- apps.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps.json b/apps.json index eeeff3d86..b68927516 100644 --- a/apps.json +++ b/apps.json @@ -3159,6 +3159,19 @@ {"name":"waypoints.json","url":"waypoints.json"} ] }, +{ "id": "banglebridge", + "name": "Bangle_Bridge Widget", + "shortName":"banglebridge", + "icon": "widget.png", + "version":"0.01", + "description": "Widget that allows Bangle Js to record pair and end data using Bluetooth Low Energy in combination with the BangleBridge Android App", + "tags": "widget", + "type": "widget", + "readme": "README.md", + "storage": [ + {"name":"7chname.wid.js","url":"widget.js"} + ] + }, { "id": "qmsched", "name": "Quiet Mode Schedule", "shortName":"Quiet Mode", From 31225385f1ee65a881dad5c543a7cd272fd196dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 19:10:31 +0200 Subject: [PATCH 03/47] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index b68927516..2ac9ce045 100644 --- a/apps.json +++ b/apps.json @@ -3169,7 +3169,7 @@ "type": "widget", "readme": "README.md", "storage": [ - {"name":"7chname.wid.js","url":"widget.js"} + {"name":"banglebridge.wid.js","url":"widget.js"} ] }, { "id": "qmsched", From efb67968d8214acf05c4637edc85b1ca73fd4fa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 19:12:36 +0200 Subject: [PATCH 04/47] First commit to App Loader --- apps/BangleBridge/README.md | 2 + apps/BangleBridge/heart.img | 1 + apps/BangleBridge/iconWatch.img | Bin 0 -> 255 bytes apps/BangleBridge/widget.js | 293 ++++++++++++++++++++++++++++++++ apps/BangleBridge/widget.png | Bin 0 -> 72126 bytes 5 files changed, 296 insertions(+) create mode 100644 apps/BangleBridge/README.md create mode 100644 apps/BangleBridge/heart.img create mode 100644 apps/BangleBridge/iconWatch.img create mode 100644 apps/BangleBridge/widget.js create mode 100644 apps/BangleBridge/widget.png diff --git a/apps/BangleBridge/README.md b/apps/BangleBridge/README.md new file mode 100644 index 000000000..18c71f571 --- /dev/null +++ b/apps/BangleBridge/README.md @@ -0,0 +1,2 @@ +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 \ No newline at end of file diff --git a/apps/BangleBridge/heart.img b/apps/BangleBridge/heart.img new file mode 100644 index 000000000..b8e339b30 --- /dev/null +++ b/apps/BangleBridge/heart.img @@ -0,0 +1 @@ +00ˆþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ þþþþþþþþþþþþþþ þþþþþþþþþþþþþþþþþþ þþþþþþþþþþ þþþþþþþþþþþþþþþ þþþþþþ þþþþþþþþþþþþþ þþþþ þþþþþþþþþþþ þþ ?? þþþþþþþþþ ÿÿ þþþþþþþþ ÿÿ þþþþþþþ ÿÿ þþþþþþ ÿÿ þþþþþþ ?ÿÿÿÿÿÿÿÿÿÿ? þþþþþþ ?ÿÿÿÿÿÿÿÿÿÿ? þþþþþþ ÿÿ ''' 'þþþþþþ ÿÿ' '''þþþþþþ ÿÿ' ''''þþþþþþþ 'ÿÿ' '''''þþþþþþþþ '??'''''''þþþþþþþþþ ''''''''þþþþþþþþþþ ''''''''þþþþþþþþþþþ '''''''''þþþþþþþþþþþþ ''''''''''þþþþþþþþþþþþþ '''''''''''þþþþþþþþþþþþþþþ ''''''''''''þþþþþþþþþþþþþþþþþ ''''''''''''þþþþþþþþþþþþþþþþþþþ '''''''''''''þþþþþþþþþþþþþþþþþþþþþ '''''''''''''þþþþþþþþþþþþþþþþþþþþþþþ ''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþ ''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþ '''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþ '''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ \ No newline at end of file diff --git a/apps/BangleBridge/iconWatch.img b/apps/BangleBridge/iconWatch.img new file mode 100644 index 0000000000000000000000000000000000000000..4a8434583521668bf41f87e690e750d6fa743be1 GIT binary patch literal 255 zcmW;HyAFad6b9hGA+ZawD+8gs6C(p&9*L2GV2LkQ6Q4tC7+kyQV66XXhcBlmJ(spS zg%WZO*;!Oc)GtTPMLZUsjw*}5xI?5p23ljJ4Rd_Y8*5PkC+(OCg=xc=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 diff --git a/apps/BangleBridge/widget.png b/apps/BangleBridge/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..b381b1aa1fc09020622ca40ccda9efb6a5d2e5f3 GIT binary patch literal 72126 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∾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 literal 0 HcmV?d00001 From 7f9f7678091199896edbe18de653047e1d4262e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 19:31:46 +0200 Subject: [PATCH 05/47] Fix of inofrmation display --- apps/BangleBridge/README.md | 10 +++++++++- apps/BangleBridge/widget.png | Bin 72126 -> 3492 bytes 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/apps/BangleBridge/README.md b/apps/BangleBridge/README.md index 18c71f571..21a9b7bc1 100644 --- a/apps/BangleBridge/README.md +++ b/apps/BangleBridge/README.md @@ -1,2 +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 \ No newline at end of file +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. + +## Compilation + +Part of smartPPE project[SmartPEE](https://jorgepramos.github.io/Smart_PPE/index.html). \ No newline at end of file diff --git a/apps/BangleBridge/widget.png b/apps/BangleBridge/widget.png index b381b1aa1fc09020622ca40ccda9efb6a5d2e5f3..3c1e693fce81785e47c0291619f3a9a62bc7dffb 100644 GIT binary patch literal 3492 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 S@FYF}0000{}RE#1;cjv^x6or*}8q~vq6 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∾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 From f53554d63c2193507bc5b41fa323397c4c1216e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 19:36:45 +0200 Subject: [PATCH 06/47] Update Visuals --- apps/BangleBridge/README.md | 4 ++-- apps/BangleBridge/banglebridge.png | Bin 0 -> 3492 bytes 2 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 apps/BangleBridge/banglebridge.png diff --git a/apps/BangleBridge/README.md b/apps/BangleBridge/README.md index 21a9b7bc1..9897971f8 100644 --- a/apps/BangleBridge/README.md +++ b/apps/BangleBridge/README.md @@ -5,6 +5,6 @@ Part of smartPPE project https://jorgepramos.github.io/Smart_PPE/index.html Widget that allows Bangle Js to record pair and end data using Bluetooth Low Energy in combination with the BangleBridge Android App. -## Compilation +## Full Project -Part of smartPPE project[SmartPEE](https://jorgepramos.github.io/Smart_PPE/index.html). \ No newline at end of file +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 zcmV;V4O{YwP)=m zrl&^Cnh9b?XK2IT!M{p?17p4chSzM(r*3u>`-4U({6}mcIyLsG6R$P|QuP4}17p{K zI<+>|d+OFuS*9>B=4)U?^@LNU7po3sQ6WVc?AkgVAX>mAM^!P zU*gHn*sCxw`U)sMmEKEe%VGk(1&`)Qw0Ftm#LYI4(EyBjm0srec~LnlOf(f}Q2vIh z%=`I{pz3gKc8Sd|hV!3oPH2fG^)57uTm`?j1Ji@wNA}9?a;0K`iV6jeV0HxWWIlR6 ziupY^gDYSLtbhxgyxbPw%_~4V3rpp;fAVjY2T(|=K&~5@atZFXpGCf((Xug+UyR5J zEQON)ghs!^rubptnEjALJb4V|?obXu;b#^j9b2DeO`r9=*!qHGrvi)~&RlE5hD$*# zd?5@EcZuhICb<1`J7jr+L8!ORqiZPu3ym^5)=y?#-_887OSELCHee4j;m`4}6ZT^e zWO?(}OB-1}WEF_`VuJsPAIY?D-?nM7j`at{0V>je9L&7d=`c(D!tnI8`Iuh%+xEl& z#vKcR)Rr=0S`FZmLBfQobZ&MB3P8<=##_E1^;#Ej&Z_GiSqz}n2>N^ukDgDzj%THx z3I9^zRB{{MJ@F@wB>94_5RAD+=9lA6V2}O8j`~m@kP!}E>d8x67t6_YYpRcE(Bi;` zmp^A>uUHV#-U;?3_9Ae{Um(vJoHIcYVbktgDik_s$v$@MJOVo%m!_=1n6E!z=jp*x zi*@IU#Q=(QAOeeXCaIIh&_I|ckevzjzS;!8HMVKv5x)|EbKRj?5^C^NS#X))`fVp# zZQ2Cco^?q8N(nM%S4RCImYpL$m3ht)b|v^TI&yybg66sM$)JBQx8Ei?&l%<)oXEoc zlfWSt!~y>PqZEK5aOf-?d}S^J+9ya;H9-IEi#VLv51h&f9Kwg4vPqvb8gJ3P5tb}! z>&fe2omIoCuJJX`|d9IJ2rGXPZlys{h?Zel}6e5Hzt%5K+6V&Yh(W4j1 zAms>~P7ftC>K$8PssTXZ3W8CIeKpQoDaS4&(F-jWm{|4l-ZL3uqk`EDyl!$Q zBp5Fda1{706THGVL3%SV-GBTPRlP>Y7Y;t7@!$>r9jqK2CUc?*)}9#7)EHs9`Hz!o5rymD=0QjZPW6FY zaNqJJS=ZZE-3LYbu^7QKh1GuBnbv)mmbL`0;N5eHI2BkKB2fWALEH3jHh2czTV9rd zqX2xigmLv+cbgV%)+&4>uO9CQ{DZ#?*q}Z9Yg`ELN4+TzL!7qWQhp@XQk8@BHRntw zcRj@CeoOJNS&&8~R7kx8jW$L?R(%?3VQmjwRbk|E6I)=uCasB5`MJI137u?@516(3jk$alRrP zLvVAG8)syK=ekH*c%~82{|o${`&Wr_%6{_Nug$cD(8)LTG!2i02QHv1fP5Ft9Ow3m z=DnV4ardxk!V0H<@!|DjQ#pO*4^Su=KhQD}_0>1Q4WiEbF(T5&flKcRRT7|PKCaB@ zyNwlrD`jb~5~h+DVxsUfmuwOyOs8|R6bVwKJz+)$D9nM?31gWN_lj&l*-5#@0G?@FpE#Bl zjS3|J$OXTcPnh2J7@^%`rJo6Kxe)QMAp{=@g|ug-8H>PFd=(*M9b- z^;a9f>?AFs`OK~i>U5az zN6s&LEV=^%l#t&7$8U9EW_&1TetKS}pW-FiqhjZH5Y+tu(PBMEcyI3%mK+&h8e6Ig zKznIqVE5P$8P@5D6i$5F*tw7cCxf7VicO`(Bof*Y6@_aCiJ_C}&^%Q#BLPqxkWF*S zKO^8)E6G+$lw^;rB}~?;XI$4G*gAB9=8JdJz-8r6elmr;YK z$Vg{|gd0uix^)FSaF-gi50OVLCK|U$Wc`a97}D~TG;5pYAHHXRWhcimYtM9WD5LEt zXrO3YHoeAu(<6TT5kOJg@x1SljD8p(CzL znm$YL^0rM<;NQt^EI%`qg}s;JF4#%&_~8KOZ}`xC*I(hD=tJ9*zcC;GcJXZNzmOJ< z#A!-!_wK=h_*ty@F%Sw2Wig~`XwVMQ?98C9Kk)sSkEKtUVB5I>J~=azuzsr;(DuSZ z7LuC=UCPwK*aEw-NsGXHxsc>tG|?&4j<5`y-1lyo9r34iPVIVtD(b56d=D zpRT_+f^uf{Iw=cdVK&0_ggJ^)0N?!7kEwCNq~GWu zqpQ}0(sN?MY{~{j8}ZV#j&BygsqT%2i}N#pUCt6GT&+WQS>M)EP898L4jVY|C|U5T*-g; z*)C004||e&6S!*u?w&2_rta6&hI{_$6=o?UY(Hz`ZP}ziyY7u$T4Oj$gxz ze0Q@q^G^w7xr79cU|z9bx71 zQOt;$DSgiVwMhsld^gWUYf!z~^$;ujEuo%^)ZpDa;Jq#ias~gi^?fR|!g94)8vsR- zYSd2qT<}b~i5gC%utI1Z5yrKv-M}PjHlb}1eRTA0dz!Ep*5UiyCHbz%g9^<0{wnKyo}d+**b9!FlP50cAg!`Y`OTMxf)n6qHPsVRJVItcE0OJE`u zJTY+E{hdg0(`h-VZ`B$=u~3c&gS#GL&nth{B4ot>4kkEmg8W7y0!UdUQLPH0`T7!Z z%i>*NNv*D3C<;%NIsJC=V_Gu~B)$Mvo%A(3U8~g%%UVpCsW9l6ZMAhRZYwSf ziH{|=ue?=fAvKky5WT*gOs4@ct5KO&(-ohp`3h^;7c|{|A+`Zl%Z>jBw|(troP|;G z;k%*fMTF?3*u^O7dry@XsxQo3_6Lbu5XBf@{~rwKbAnNnkAN1{U%O6c-az3)3Y@>< z&;YF=QaYs#h#8NnbVN}bVWkNQ;sTf8{7=)!LFG0&l2Mfu6g823L0cXb@c#h9k`aVp S@FYF}0000 Date: Fri, 25 Jun 2021 19:44:22 +0200 Subject: [PATCH 07/47] Update apps.json --- apps.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps.json b/apps.json index 2ac9ce045..2df7cacae 100644 --- a/apps.json +++ b/apps.json @@ -3159,9 +3159,9 @@ {"name":"waypoints.json","url":"waypoints.json"} ] }, -{ "id": "banglebridge", - "name": "Bangle_Bridge Widget", - "shortName":"banglebridge", +{ "id": "Banglebridge", + "name": "BangleBridge", + "shortName":"Banglebridge", "icon": "widget.png", "version":"0.01", "description": "Widget that allows Bangle Js to record pair and end data using Bluetooth Low Energy in combination with the BangleBridge Android App", @@ -3169,7 +3169,7 @@ "type": "widget", "readme": "README.md", "storage": [ - {"name":"banglebridge.wid.js","url":"widget.js"} + {"name":"Banglebridge.wid.js","url":"widget.js"} ] }, { "id": "qmsched", From 5f769e2fe29ed70ac2fb60526afe87727bc2f7c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 19:50:07 +0200 Subject: [PATCH 08/47] Update apps.json --- apps.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps.json b/apps.json index 2df7cacae..5af0f3d73 100644 --- a/apps.json +++ b/apps.json @@ -3159,9 +3159,9 @@ {"name":"waypoints.json","url":"waypoints.json"} ] }, -{ "id": "Banglebridge", +{ "id": "BangleBridge", "name": "BangleBridge", - "shortName":"Banglebridge", + "shortName":"BangleBridge", "icon": "widget.png", "version":"0.01", "description": "Widget that allows Bangle Js to record pair and end data using Bluetooth Low Energy in combination with the BangleBridge Android App", @@ -3169,7 +3169,7 @@ "type": "widget", "readme": "README.md", "storage": [ - {"name":"Banglebridge.wid.js","url":"widget.js"} + {"name":"BangleBridge.wid.js","url":"widget.js"} ] }, { "id": "qmsched", From 3cb1d3481fdb9c3c153ab96c8c8e80790a0b224a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 19:56:10 +0200 Subject: [PATCH 09/47] Delete apps/BangleBridge directory --- apps/BangleBridge/README.md | 10 - apps/BangleBridge/banglebridge.png | Bin 3492 -> 0 bytes apps/BangleBridge/heart.img | 1 - apps/BangleBridge/iconWatch.img | Bin 255 -> 0 bytes apps/BangleBridge/some.js | 1 - apps/BangleBridge/widget.js | 293 ----------------------------- apps/BangleBridge/widget.png | Bin 3492 -> 0 bytes 7 files changed, 305 deletions(-) delete mode 100644 apps/BangleBridge/README.md delete mode 100644 apps/BangleBridge/banglebridge.png delete mode 100644 apps/BangleBridge/heart.img delete mode 100644 apps/BangleBridge/iconWatch.img delete mode 100644 apps/BangleBridge/some.js delete mode 100644 apps/BangleBridge/widget.js delete mode 100644 apps/BangleBridge/widget.png diff --git a/apps/BangleBridge/README.md b/apps/BangleBridge/README.md deleted file mode 100644 index 9897971f8..000000000 --- a/apps/BangleBridge/README.md +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 3c1e693fce81785e47c0291619f3a9a62bc7dffb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3492 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 S@FYF}0000xc=8|ph3_4-CRf-{2_ VqY;Pvo9@dHds!6LX9aAt!XL*LHO&A3 diff --git a/apps/BangleBridge/some.js b/apps/BangleBridge/some.js deleted file mode 100644 index fd538074f..000000000 --- a/apps/BangleBridge/some.js +++ /dev/null @@ -1 +0,0 @@ -E.showMessage("My\nSimple\nApp","My App") diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js deleted file mode 100644 index 5026b8446..000000000 --- a/apps/BangleBridge/widget.js +++ /dev/null @@ -1,293 +0,0 @@ -(() => { - /** - * 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 diff --git a/apps/BangleBridge/widget.png b/apps/BangleBridge/widget.png deleted file mode 100644 index 3c1e693fce81785e47c0291619f3a9a62bc7dffb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3492 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 S@FYF}0000 Date: Fri, 25 Jun 2021 19:56:38 +0200 Subject: [PATCH 10/47] Create some.js --- apps/Banglebridge/some.js | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/Banglebridge/some.js diff --git a/apps/Banglebridge/some.js b/apps/Banglebridge/some.js new file mode 100644 index 000000000..5c1b14949 --- /dev/null +++ b/apps/Banglebridge/some.js @@ -0,0 +1 @@ +hola From 2984fd5fc8d6e0d704e59a20ce35b2046aaa956f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 20:05:40 +0200 Subject: [PATCH 11/47] 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 From b49335181d27f641816ae027e25a7637d3e2d331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 20:16:21 +0200 Subject: [PATCH 12/47] Delete apps/Banglebridge directory --- apps/Banglebridge/README.md | 10 - apps/Banglebridge/banglebridge.png | Bin 3492 -> 0 bytes apps/Banglebridge/heart.img | 1 - apps/Banglebridge/iconWatch.img | Bin 255 -> 0 bytes apps/Banglebridge/some.js | 1 - apps/Banglebridge/widget.js | 293 ----------------------------- 6 files changed, 305 deletions(-) delete mode 100644 apps/Banglebridge/README.md delete mode 100644 apps/Banglebridge/banglebridge.png delete mode 100644 apps/Banglebridge/heart.img delete mode 100644 apps/Banglebridge/iconWatch.img delete mode 100644 apps/Banglebridge/some.js delete mode 100644 apps/Banglebridge/widget.js diff --git a/apps/Banglebridge/README.md b/apps/Banglebridge/README.md deleted file mode 100644 index 9897971f8..000000000 --- a/apps/Banglebridge/README.md +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 3c1e693fce81785e47c0291619f3a9a62bc7dffb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3492 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 S@FYF}0000xc=8|ph3_4-CRf-{2_ VqY;Pvo9@dHds!6LX9aAt!XL*LHO&A3 diff --git a/apps/Banglebridge/some.js b/apps/Banglebridge/some.js deleted file mode 100644 index 5c1b14949..000000000 --- a/apps/Banglebridge/some.js +++ /dev/null @@ -1 +0,0 @@ -hola diff --git a/apps/Banglebridge/widget.js b/apps/Banglebridge/widget.js deleted file mode 100644 index 5026b8446..000000000 --- a/apps/Banglebridge/widget.js +++ /dev/null @@ -1,293 +0,0 @@ -(() => { - /** - * 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 From 058047bf6d0ec7e6a477932906a3414b6ff1b2b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 20:16:49 +0200 Subject: [PATCH 13/47] Create algo.txt --- apps/BangleBridge/algo.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 apps/BangleBridge/algo.txt diff --git a/apps/BangleBridge/algo.txt b/apps/BangleBridge/algo.txt new file mode 100644 index 000000000..1df28a22d --- /dev/null +++ b/apps/BangleBridge/algo.txt @@ -0,0 +1 @@ +ss 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 14/47] 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 From 0188dbeff5bcb09f6f4d004e8d60d7c8c83ea17f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Fri, 25 Jun 2021 20:25:56 +0200 Subject: [PATCH 15/47] Add files via upload --- apps/BangleBridge/widget.png | Bin 0 -> 3492 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 apps/BangleBridge/widget.png diff --git a/apps/BangleBridge/widget.png b/apps/BangleBridge/widget.png new file mode 100644 index 0000000000000000000000000000000000000000..3c1e693fce81785e47c0291619f3a9a62bc7dffb GIT binary patch literal 3492 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 S@FYF}0000 Date: Mon, 12 Jul 2021 20:56:31 +0200 Subject: [PATCH 16/47] Add files via upload --- apps/BangleBridge/widget.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js index 5026b8446..736946049 100644 --- a/apps/BangleBridge/widget.js +++ b/apps/BangleBridge/widget.js @@ -234,12 +234,12 @@ 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); From 749eed2a613bd4de7521e1e06602fbc4f8a37777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 20:59:49 +0200 Subject: [PATCH 17/47] Add files via upload --- apps/BangleBridge/widget.js | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js index 736946049..3a70a0f68 100644 --- a/apps/BangleBridge/widget.js +++ b/apps/BangleBridge/widget.js @@ -137,6 +137,7 @@ }, 2 * 1000); } + //2021-06-11T19:21:58.000Z function hrm() { @@ -145,7 +146,7 @@ function roundInsert(nueva) { let indexFinal = (lastInsert + 1) % (msr.length); - + //console.log("Index ==> "+ index); msr[indexFinal] = nueva; item = nueva; @@ -232,15 +233,18 @@ var flip = 1; Bangle.on('lcdPower', function (on) { - + /* + prueba ++; + Bangle.drawWidgets(); + g.setFont("Vector", 45); + g.drawString(prueba,100,200);*/ if (flip == 1) { //when off - + flip = 0; - + //Bangle.buzz(1000); g.clear(); } else { //when on - - + flip = 1; g.setFont("Vector", 30); g.drawString(data[0], 65, 180); @@ -251,29 +255,30 @@ 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"] = { + WIDGETS["bangle.Sensors"] = { area: "tl", width: 10, draw: draw, }; initSensors(); - + // Bangle.drawWidgets(); + // Terminal.println("Running BangleBridge"); data[0] = 80.5; g.setFont("Vector", 30); g.drawString(data[0], 65, 180); Bangle.drawWidgets(); - - setInterval(function () { - + //console.log("---------------------------------------------------------------"); + //console.log(data); + //Bluetooth.println(data[0]); var measurement = { hrm: data[0], step: data[1], @@ -282,12 +287,13 @@ com: data[4], gps: data[5] }; - + /* g.clear(); + g.drawString(compssS,100,200); + */ Bluetooth.println(JSON.stringify(measurement) + "#"); }, 5 * 1000); - })(); //End of Widget \ No newline at end of file From 596fcfd01cc858cb18981e00efa1cae288bf9865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:02:08 +0200 Subject: [PATCH 18/47] Delete widget.js --- apps/BangleBridge/widget.js | 299 ------------------------------------ 1 file changed, 299 deletions(-) delete mode 100644 apps/BangleBridge/widget.js diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js deleted file mode 100644 index 3a70a0f68..000000000 --- a/apps/BangleBridge/widget.js +++ /dev/null @@ -1,299 +0,0 @@ -(() => { - /** - * 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); - } - - //2021-06-11T19:21:58.000Z - - function hrm() { - - let msr = [0, 0, 0, 0, 0]; - let lastInsert = -1; - - function roundInsert(nueva) { - let indexFinal = (lastInsert + 1) % (msr.length); - //console.log("Index ==> "+ index); - 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) { - /* - prueba ++; - Bangle.drawWidgets(); - g.setFont("Vector", 45); - g.drawString(prueba,100,200);*/ - if (flip == 1) { //when off - - flip = 0; - //Bangle.buzz(1000); - g.clear(); - } else { //when on - - 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["bangle.Sensors"] = { - area: "tl", - width: 10, - draw: draw, - }; - - initSensors(); - // Bangle.drawWidgets(); - // Terminal.println("Running BangleBridge"); - data[0] = 80.5; - g.setFont("Vector", 30); - g.drawString(data[0], 65, 180); - Bangle.drawWidgets(); - setInterval(function () { - //console.log("---------------------------------------------------------------"); - //console.log(data); - //Bluetooth.println(data[0]); - var measurement = { - hrm: data[0], - step: data[1], - batt: data[2], - acc: data[3], - com: data[4], - gps: data[5] - }; - /* g.clear(); - g.drawString(compssS,100,200); - */ - - - - Bluetooth.println(JSON.stringify(measurement) + "#"); - - }, 5 * 1000); -})(); //End of Widget \ No newline at end of file From 6caa55054fc3aa29ccd3461dbf608d67871cb48a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:02:22 +0200 Subject: [PATCH 19/47] Add files via upload --- apps/BangleBridge/connection.wid.js | 299 ++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 apps/BangleBridge/connection.wid.js diff --git a/apps/BangleBridge/connection.wid.js b/apps/BangleBridge/connection.wid.js new file mode 100644 index 000000000..de873376f --- /dev/null +++ b/apps/BangleBridge/connection.wid.js @@ -0,0 +1,299 @@ +(() => { + /** + * 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); + } + + //2021-06-11T19:21:58.000Z + + function hrm() { + + let msr = [0, 0, 0, 0, 0]; + let lastInsert = -1; + + function roundInsert(nueva) { + let indexFinal = (lastInsert + 1) % (msr.length); + //console.log("Index ==> "+ index); + 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) { + /* + prueba ++; + Bangle.drawWidgets(); + g.setFont("Vector", 45); + g.drawString(prueba,100,200);*/ + if (flip == 1) { //when off + + flip = 0; + //Bangle.buzz(1000); + g.clear(); + } else { //when on + + 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["bangle.Sensors"] = { + area: "tl", + width: 10, + draw: draw, + }; + + initSensors(); + // Bangle.drawWidgets(); + // Terminal.println("Running BangleBridge"); + data[0] = 80.5; + g.setFont("Vector", 30); + g.drawString(data[0], 65, 180); + Bangle.drawWidgets(); + setInterval(function () { + //console.log("---------------------------------------------------------------"); + //console.log(data); + //Bluetooth.println(data[0]); + var measurement = { + hrm: data[0], + step: data[1], + batt: data[2], + acc: data[3], + com: data[4], + gps: data[5] + }; + /* g.clear(); + g.drawString(compssS,100,200); + */ + + + + Bluetooth.println(JSON.stringify(measurement) + "#"); + + }, 5 * 1000); +})(); //End of Widget \ No newline at end of file From 51f380099c66c3cb957ea23ae89fffe905cb54fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:04:45 +0200 Subject: [PATCH 20/47] Rename connection.wid.js to widget.js --- apps/BangleBridge/{connection.wid.js => widget.js} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename apps/BangleBridge/{connection.wid.js => widget.js} (99%) diff --git a/apps/BangleBridge/connection.wid.js b/apps/BangleBridge/widget.js similarity index 99% rename from apps/BangleBridge/connection.wid.js rename to apps/BangleBridge/widget.js index de873376f..15823e99e 100644 --- a/apps/BangleBridge/connection.wid.js +++ b/apps/BangleBridge/widget.js @@ -296,4 +296,4 @@ Bluetooth.println(JSON.stringify(measurement) + "#"); }, 5 * 1000); -})(); //End of Widget \ No newline at end of file +})(); //End of Widget From 284beede2ad2f94473ef1c0212f5e46c5e6ddaab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:13:23 +0200 Subject: [PATCH 21/47] Add files via upload --- apps/BangleBridge/widget.js | 601 ++++++++++++++++++------------------ 1 file changed, 302 insertions(+), 299 deletions(-) diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js index 15823e99e..f770053c5 100644 --- a/apps/BangleBridge/widget.js +++ b/apps/BangleBridge/widget.js @@ -1,299 +1,302 @@ -(() => { - /** - * 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); - } - - //2021-06-11T19:21:58.000Z - - function hrm() { - - let msr = [0, 0, 0, 0, 0]; - let lastInsert = -1; - - function roundInsert(nueva) { - let indexFinal = (lastInsert + 1) % (msr.length); - //console.log("Index ==> "+ index); - 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) { - /* - prueba ++; - Bangle.drawWidgets(); - g.setFont("Vector", 45); - g.drawString(prueba,100,200);*/ - if (flip == 1) { //when off - - flip = 0; - //Bangle.buzz(1000); - g.clear(); - } else { //when on - - 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["bangle.Sensors"] = { - area: "tl", - width: 10, - draw: draw, - }; - - initSensors(); - // Bangle.drawWidgets(); - // Terminal.println("Running BangleBridge"); - data[0] = 80.5; - g.setFont("Vector", 30); - g.drawString(data[0], 65, 180); - Bangle.drawWidgets(); - setInterval(function () { - //console.log("---------------------------------------------------------------"); - //console.log(data); - //Bluetooth.println(data[0]); - var measurement = { - hrm: data[0], - step: data[1], - batt: data[2], - acc: data[3], - com: data[4], - gps: data[5] - }; - /* g.clear(); - g.drawString(compssS,100,200); - */ - - - - Bluetooth.println(JSON.stringify(measurement) + "#"); - - }, 5 * 1000); -})(); //End of Widget +(() => { + /** + * 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); + } + + //2021-06-11T19:21:58.000Z + + function hrm() { + + let msr = [0, 0, 0, 0, 0]; + let lastInsert = -1; + + function roundInsert(nueva) { + let indexFinal = (lastInsert + 1) % (msr.length); + //console.log("Index ==> "+ index); + 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) { + /* + prueba ++; + Bangle.drawWidgets(); + g.setFont("Vector", 45); + g.drawString(prueba,100,200);*/ + if (flip == 1) { //when off + + flip = 0; + //Bangle.buzz(1000); + g.clear(); + } else { //when on + + 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 + + + initSensors(); + // Bangle.drawWidgets(); + // Terminal.println("Running BangleBridge"); + data[0] = 80.5; + g.setFont("Vector", 30); + g.drawString(data[0], 65, 180); + Bangle.drawWidgets(); + setInterval(function () { + //console.log("---------------------------------------------------------------"); + //console.log(data); + //Bluetooth.println(data[0]); + var measurement = { + hrm: data[0], + step: data[1], + batt: data[2], + acc: data[3], + com: data[4], + gps: data[5] + }; + /* g.clear(); + g.drawString(compssS,100,200); + */ + + + + Bluetooth.println(JSON.stringify(measurement) + "#"); + + }, 5 * 1000); +})(); //End of Widget + // add your widget + WIDGETS["bangle.Sensors"]={ + area: "tl", + width: 10, + draw: draw, + }; +})() \ No newline at end of file From 5838f49683719cc4f6e73b98586b3aa66f4ddf10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:21:02 +0200 Subject: [PATCH 22/47] Add files via upload --- apps/BangleBridge/widget.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js index f770053c5..4d7bf67e5 100644 --- a/apps/BangleBridge/widget.js +++ b/apps/BangleBridge/widget.js @@ -255,8 +255,9 @@ function draw() { - - g.drawImage(storage.read("iconWatch.img"), this.x + 1, this.y + 1); + // g.drawImage(storage.read("iconWatch.img"), this.x + 1, this.y + 1); + g.drawImage(storage.read("iconWatch.img"), 1,1); + g.drawImage(storage.read("heart.img"), 145, 167); } From b20e1ff2de8474013a8baff9eee6dcf01063fd2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:25:12 +0200 Subject: [PATCH 23/47] Add files via upload --- apps/BangleBridge/widget.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js index 4d7bf67e5..e8f6eb0f0 100644 --- a/apps/BangleBridge/widget.js +++ b/apps/BangleBridge/widget.js @@ -255,15 +255,18 @@ function draw() { - // g.drawImage(storage.read("iconWatch.img"), this.x + 1, this.y + 1); - g.drawImage(storage.read("iconWatch.img"), 1,1); - + + g.drawImage(storage.read("iconWatch.img"), 1, 1); g.drawImage(storage.read("heart.img"), 145, 167); } // Finally add widget - + WIDGETS["bangle.Sensors"] = { + area: "tl", + width: 10, + draw: draw, + }; initSensors(); // Bangle.drawWidgets(); From 8d9b078a4882827994914999036fad31580ba75a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:26:42 +0200 Subject: [PATCH 24/47] Delete widget.js --- apps/BangleBridge/widget.js | 306 ------------------------------------ 1 file changed, 306 deletions(-) delete mode 100644 apps/BangleBridge/widget.js diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js deleted file mode 100644 index e8f6eb0f0..000000000 --- a/apps/BangleBridge/widget.js +++ /dev/null @@ -1,306 +0,0 @@ -(() => { - /** - * 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); - } - - //2021-06-11T19:21:58.000Z - - function hrm() { - - let msr = [0, 0, 0, 0, 0]; - let lastInsert = -1; - - function roundInsert(nueva) { - let indexFinal = (lastInsert + 1) % (msr.length); - //console.log("Index ==> "+ index); - 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) { - /* - prueba ++; - Bangle.drawWidgets(); - g.setFont("Vector", 45); - g.drawString(prueba,100,200);*/ - if (flip == 1) { //when off - - flip = 0; - //Bangle.buzz(1000); - g.clear(); - } else { //when on - - flip = 1; - g.setFont("Vector", 30); - g.drawString(data[0], 65, 180); - Bangle.drawWidgets(); - } - - }); - - - function draw() { - - g.drawImage(storage.read("iconWatch.img"), 1, 1); - g.drawImage(storage.read("heart.img"), 145, 167); - } - - - // Finally add widget - WIDGETS["bangle.Sensors"] = { - area: "tl", - width: 10, - draw: draw, - }; - - initSensors(); - // Bangle.drawWidgets(); - // Terminal.println("Running BangleBridge"); - data[0] = 80.5; - g.setFont("Vector", 30); - g.drawString(data[0], 65, 180); - Bangle.drawWidgets(); - setInterval(function () { - //console.log("---------------------------------------------------------------"); - //console.log(data); - //Bluetooth.println(data[0]); - var measurement = { - hrm: data[0], - step: data[1], - batt: data[2], - acc: data[3], - com: data[4], - gps: data[5] - }; - /* g.clear(); - g.drawString(compssS,100,200); - */ - - - - Bluetooth.println(JSON.stringify(measurement) + "#"); - - }, 5 * 1000); -})(); //End of Widget - // add your widget - WIDGETS["bangle.Sensors"]={ - area: "tl", - width: 10, - draw: draw, - }; -})() \ No newline at end of file From 223ccb7e3810a27a385e683ab161998a2f1d16d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:26:49 +0200 Subject: [PATCH 25/47] Delete algo.txt --- apps/BangleBridge/algo.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/BangleBridge/algo.txt diff --git a/apps/BangleBridge/algo.txt b/apps/BangleBridge/algo.txt deleted file mode 100644 index 1df28a22d..000000000 --- a/apps/BangleBridge/algo.txt +++ /dev/null @@ -1 +0,0 @@ -ss From c7abb95f90b6ae509545c48f5364ebc4cbbaefc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:28:30 +0200 Subject: [PATCH 26/47] Add files via upload --- apps/BangleBridge/app.js | 299 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 apps/BangleBridge/app.js diff --git a/apps/BangleBridge/app.js b/apps/BangleBridge/app.js new file mode 100644 index 000000000..3a70a0f68 --- /dev/null +++ b/apps/BangleBridge/app.js @@ -0,0 +1,299 @@ +(() => { + /** + * 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); + } + + //2021-06-11T19:21:58.000Z + + function hrm() { + + let msr = [0, 0, 0, 0, 0]; + let lastInsert = -1; + + function roundInsert(nueva) { + let indexFinal = (lastInsert + 1) % (msr.length); + //console.log("Index ==> "+ index); + 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) { + /* + prueba ++; + Bangle.drawWidgets(); + g.setFont("Vector", 45); + g.drawString(prueba,100,200);*/ + if (flip == 1) { //when off + + flip = 0; + //Bangle.buzz(1000); + g.clear(); + } else { //when on + + 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["bangle.Sensors"] = { + area: "tl", + width: 10, + draw: draw, + }; + + initSensors(); + // Bangle.drawWidgets(); + // Terminal.println("Running BangleBridge"); + data[0] = 80.5; + g.setFont("Vector", 30); + g.drawString(data[0], 65, 180); + Bangle.drawWidgets(); + setInterval(function () { + //console.log("---------------------------------------------------------------"); + //console.log(data); + //Bluetooth.println(data[0]); + var measurement = { + hrm: data[0], + step: data[1], + batt: data[2], + acc: data[3], + com: data[4], + gps: data[5] + }; + /* g.clear(); + g.drawString(compssS,100,200); + */ + + + + Bluetooth.println(JSON.stringify(measurement) + "#"); + + }, 5 * 1000); +})(); //End of Widget \ No newline at end of file From 230d8e195e2c1ce8c4f3ca0b8a9df238368d2b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:32:10 +0200 Subject: [PATCH 27/47] Delete app.js --- apps/BangleBridge/app.js | 299 --------------------------------------- 1 file changed, 299 deletions(-) delete mode 100644 apps/BangleBridge/app.js diff --git a/apps/BangleBridge/app.js b/apps/BangleBridge/app.js deleted file mode 100644 index 3a70a0f68..000000000 --- a/apps/BangleBridge/app.js +++ /dev/null @@ -1,299 +0,0 @@ -(() => { - /** - * 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); - } - - //2021-06-11T19:21:58.000Z - - function hrm() { - - let msr = [0, 0, 0, 0, 0]; - let lastInsert = -1; - - function roundInsert(nueva) { - let indexFinal = (lastInsert + 1) % (msr.length); - //console.log("Index ==> "+ index); - 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) { - /* - prueba ++; - Bangle.drawWidgets(); - g.setFont("Vector", 45); - g.drawString(prueba,100,200);*/ - if (flip == 1) { //when off - - flip = 0; - //Bangle.buzz(1000); - g.clear(); - } else { //when on - - 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["bangle.Sensors"] = { - area: "tl", - width: 10, - draw: draw, - }; - - initSensors(); - // Bangle.drawWidgets(); - // Terminal.println("Running BangleBridge"); - data[0] = 80.5; - g.setFont("Vector", 30); - g.drawString(data[0], 65, 180); - Bangle.drawWidgets(); - setInterval(function () { - //console.log("---------------------------------------------------------------"); - //console.log(data); - //Bluetooth.println(data[0]); - var measurement = { - hrm: data[0], - step: data[1], - batt: data[2], - acc: data[3], - com: data[4], - gps: data[5] - }; - /* g.clear(); - g.drawString(compssS,100,200); - */ - - - - Bluetooth.println(JSON.stringify(measurement) + "#"); - - }, 5 * 1000); -})(); //End of Widget \ No newline at end of file From f1fc7256b704ab7fe6a2677c1a9cd7869acf29bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:36:35 +0200 Subject: [PATCH 28/47] Add files via upload --- apps/BangleBridge/widget.js | 304 ++++++++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 apps/BangleBridge/widget.js diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js new file mode 100644 index 000000000..514acf4dc --- /dev/null +++ b/apps/BangleBridge/widget.js @@ -0,0 +1,304 @@ +(() => { + /** + * 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); + } + + //2021-06-11T19:21:58.000Z + + function hrm() { + + let msr = [0, 0, 0, 0, 0]; + let lastInsert = -1; + + function roundInsert(nueva) { + let indexFinal = (lastInsert + 1) % (msr.length); + //console.log("Index ==> "+ index); + 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) { + /* + prueba ++; + Bangle.drawWidgets(); + g.setFont("Vector", 45); + g.drawString(prueba,100,200);*/ + if (flip == 1) { //when off + + flip = 0; + //Bangle.buzz(1000); + g.clear(); + } else { //when on + + 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("iconWatch.img"), 1,1); + + g.drawImage(storage.read("heart.img"), 145, 167); + } + + + // Finally add widget + + + initSensors(); + // Bangle.drawWidgets(); + // Terminal.println("Running BangleBridge"); + data[0] = 80.5; + g.setFont("Vector", 30); + g.drawString(data[0], 65, 180); + // Bangle.drawWidgets(); + setInterval(function () { + //console.log("---------------------------------------------------------------"); + //console.log(data); + //Bluetooth.println(data[0]); + var measurement = { + hrm: data[0], + step: data[1], + batt: data[2], + acc: data[3], + com: data[4], + gps: data[5] + }; + /* g.clear(); + g.drawString(compssS,100,200); + */ + + + + Bluetooth.println(JSON.stringify(measurement) + "#"); + WIDGETS["bangle.Sensors"].draw(WIDGETS["bangle.Sensors"]); + + }, 5 * 1000); +})(); //End of Widget + // add your widget + WIDGETS["bangle.Sensors"]={ + area: "tl", + width: 10, + draw: draw, + }; +})() \ No newline at end of file From 42b4f71f4fddeb938aa512c75e921e6fe23baf0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:42:00 +0200 Subject: [PATCH 29/47] Add files via upload --- apps/BangleBridge/widget.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js index 514acf4dc..0d33b53c5 100644 --- a/apps/BangleBridge/widget.js +++ b/apps/BangleBridge/widget.js @@ -8,6 +8,11 @@ */ //Font + WIDGETS["bangle.Sensors"]={ + area: "tl", + width: 10, + draw: draw, + }; g.setFont("Vector", 100); //variabangle.Sensorss let acclS, bttS, compssS, gpsS, hrmS, stepS; //Strings @@ -295,10 +300,3 @@ }, 5 * 1000); })(); //End of Widget - // add your widget - WIDGETS["bangle.Sensors"]={ - area: "tl", - width: 10, - draw: draw, - }; -})() \ No newline at end of file From da87512cb80a0596340012cb53cfedf75ae564f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:44:10 +0200 Subject: [PATCH 30/47] Add files via upload --- apps/BangleBridge/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js index 0d33b53c5..13ada1be2 100644 --- a/apps/BangleBridge/widget.js +++ b/apps/BangleBridge/widget.js @@ -296,7 +296,7 @@ Bluetooth.println(JSON.stringify(measurement) + "#"); - WIDGETS["bangle.Sensors"].draw(WIDGETS["bangle.Sensors"]); + draw(); }, 5 * 1000); })(); //End of Widget From 696385b38d770fd9c30d2aad1688096af9e74c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 21:51:02 +0200 Subject: [PATCH 31/47] Add files via upload --- apps/BangleBridge/widget.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js index 13ada1be2..d408fa319 100644 --- a/apps/BangleBridge/widget.js +++ b/apps/BangleBridge/widget.js @@ -8,11 +8,7 @@ */ //Font - WIDGETS["bangle.Sensors"]={ - area: "tl", - width: 10, - draw: draw, - }; + g.setFont("Vector", 100); //variabangle.Sensorss let acclS, bttS, compssS, gpsS, hrmS, stepS; //Strings @@ -299,4 +295,10 @@ draw(); }, 5 * 1000); + + WIDGETS["bangle.Sensors"]={ + area: "tl", + width: 10, + draw: draw, + }; })(); //End of Widget From bdfb28ab42a57e54a7f3e9c418d40cb1289e3518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 22:13:28 +0200 Subject: [PATCH 32/47] Add files via upload --- apps/BangleBridge/widget.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js index d408fa319..3b0b31c8f 100644 --- a/apps/BangleBridge/widget.js +++ b/apps/BangleBridge/widget.js @@ -257,8 +257,8 @@ function draw() { // g.drawImage(storage.read("iconWatch.img"), this.x + 1, this.y + 1); - g.drawImage(storage.read("iconWatch.img"), 1,1); - + g.drawImage(storage.read("iconWatch.img"),this.x + 1,this.y + 1); + g.drawImage(storage.read("heart.img"), 145, 167); } From 9839e65fe61ce6789587a5606dfd0f2baeaa2e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 22:22:29 +0200 Subject: [PATCH 33/47] Add files via upload --- apps/BangleBridge/app.js | 299 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 apps/BangleBridge/app.js diff --git a/apps/BangleBridge/app.js b/apps/BangleBridge/app.js new file mode 100644 index 000000000..3a70a0f68 --- /dev/null +++ b/apps/BangleBridge/app.js @@ -0,0 +1,299 @@ +(() => { + /** + * 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); + } + + //2021-06-11T19:21:58.000Z + + function hrm() { + + let msr = [0, 0, 0, 0, 0]; + let lastInsert = -1; + + function roundInsert(nueva) { + let indexFinal = (lastInsert + 1) % (msr.length); + //console.log("Index ==> "+ index); + 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) { + /* + prueba ++; + Bangle.drawWidgets(); + g.setFont("Vector", 45); + g.drawString(prueba,100,200);*/ + if (flip == 1) { //when off + + flip = 0; + //Bangle.buzz(1000); + g.clear(); + } else { //when on + + 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["bangle.Sensors"] = { + area: "tl", + width: 10, + draw: draw, + }; + + initSensors(); + // Bangle.drawWidgets(); + // Terminal.println("Running BangleBridge"); + data[0] = 80.5; + g.setFont("Vector", 30); + g.drawString(data[0], 65, 180); + Bangle.drawWidgets(); + setInterval(function () { + //console.log("---------------------------------------------------------------"); + //console.log(data); + //Bluetooth.println(data[0]); + var measurement = { + hrm: data[0], + step: data[1], + batt: data[2], + acc: data[3], + com: data[4], + gps: data[5] + }; + /* g.clear(); + g.drawString(compssS,100,200); + */ + + + + Bluetooth.println(JSON.stringify(measurement) + "#"); + + }, 5 * 1000); +})(); //End of Widget \ No newline at end of file From 99860e9ff6fe1ff16bb85ff12be4b05b4c582bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Mon, 12 Jul 2021 22:22:54 +0200 Subject: [PATCH 34/47] Delete widget.js --- apps/BangleBridge/widget.js | 304 ------------------------------------ 1 file changed, 304 deletions(-) delete mode 100644 apps/BangleBridge/widget.js diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js deleted file mode 100644 index 3b0b31c8f..000000000 --- a/apps/BangleBridge/widget.js +++ /dev/null @@ -1,304 +0,0 @@ -(() => { - /** - * 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); - } - - //2021-06-11T19:21:58.000Z - - function hrm() { - - let msr = [0, 0, 0, 0, 0]; - let lastInsert = -1; - - function roundInsert(nueva) { - let indexFinal = (lastInsert + 1) % (msr.length); - //console.log("Index ==> "+ index); - 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) { - /* - prueba ++; - Bangle.drawWidgets(); - g.setFont("Vector", 45); - g.drawString(prueba,100,200);*/ - if (flip == 1) { //when off - - flip = 0; - //Bangle.buzz(1000); - g.clear(); - } else { //when on - - 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("iconWatch.img"),this.x + 1,this.y + 1); - - g.drawImage(storage.read("heart.img"), 145, 167); - } - - - // Finally add widget - - - initSensors(); - // Bangle.drawWidgets(); - // Terminal.println("Running BangleBridge"); - data[0] = 80.5; - g.setFont("Vector", 30); - g.drawString(data[0], 65, 180); - // Bangle.drawWidgets(); - setInterval(function () { - //console.log("---------------------------------------------------------------"); - //console.log(data); - //Bluetooth.println(data[0]); - var measurement = { - hrm: data[0], - step: data[1], - batt: data[2], - acc: data[3], - com: data[4], - gps: data[5] - }; - /* g.clear(); - g.drawString(compssS,100,200); - */ - - - - Bluetooth.println(JSON.stringify(measurement) + "#"); - draw(); - - }, 5 * 1000); - - WIDGETS["bangle.Sensors"]={ - area: "tl", - width: 10, - draw: draw, - }; -})(); //End of Widget From bd32905794275a7d7d888e89912a4fbf8d066bee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 15:28:56 +0200 Subject: [PATCH 35/47] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 5af0f3d73..c2ccf5eb2 100644 --- a/apps.json +++ b/apps.json @@ -3169,7 +3169,7 @@ "type": "widget", "readme": "README.md", "storage": [ - {"name":"BangleBridge.wid.js","url":"widget.js"} + {"name":"BangleBridge.app.js","url":"app.js"} ] }, { "id": "qmsched", From 6acfa724fa4d3e94254eea0e0abd932656b97439 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 15:33:02 +0200 Subject: [PATCH 36/47] Add files via upload --- apps/BangleBridge/app.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/apps/BangleBridge/app.js b/apps/BangleBridge/app.js index 3a70a0f68..4ce084f37 100644 --- a/apps/BangleBridge/app.js +++ b/apps/BangleBridge/app.js @@ -1,4 +1,4 @@ -(() => { + /** * Widget measurements * Description: @@ -261,12 +261,6 @@ } - // Finally add widget - WIDGETS["bangle.Sensors"] = { - area: "tl", - width: 10, - draw: draw, - }; initSensors(); // Bangle.drawWidgets(); @@ -296,4 +290,3 @@ Bluetooth.println(JSON.stringify(measurement) + "#"); }, 5 * 1000); -})(); //End of Widget \ No newline at end of file From 7aa9fb88ee4d1aa5fd33cf7cd0521348204cbf7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 15:33:16 +0200 Subject: [PATCH 37/47] Add files via upload --- app.js | 292 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 292 insertions(+) create mode 100644 app.js diff --git a/app.js b/app.js new file mode 100644 index 000000000..4ce084f37 --- /dev/null +++ b/app.js @@ -0,0 +1,292 @@ + + /** + * 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); + } + + //2021-06-11T19:21:58.000Z + + function hrm() { + + let msr = [0, 0, 0, 0, 0]; + let lastInsert = -1; + + function roundInsert(nueva) { + let indexFinal = (lastInsert + 1) % (msr.length); + //console.log("Index ==> "+ index); + 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) { + /* + prueba ++; + Bangle.drawWidgets(); + g.setFont("Vector", 45); + g.drawString(prueba,100,200);*/ + if (flip == 1) { //when off + + flip = 0; + //Bangle.buzz(1000); + g.clear(); + } else { //when on + + 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); + } + + + + initSensors(); + // Bangle.drawWidgets(); + // Terminal.println("Running BangleBridge"); + data[0] = 80.5; + g.setFont("Vector", 30); + g.drawString(data[0], 65, 180); + Bangle.drawWidgets(); + setInterval(function () { + //console.log("---------------------------------------------------------------"); + //console.log(data); + //Bluetooth.println(data[0]); + var measurement = { + hrm: data[0], + step: data[1], + batt: data[2], + acc: data[3], + com: data[4], + gps: data[5] + }; + /* g.clear(); + g.drawString(compssS,100,200); + */ + + + + Bluetooth.println(JSON.stringify(measurement) + "#"); + + }, 5 * 1000); From 185a57a1912e01660600a71d56baf5cd0327a6b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 16:12:49 +0200 Subject: [PATCH 38/47] Update apps.json --- apps.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps.json b/apps.json index c2ccf5eb2..8967651be 100644 --- a/apps.json +++ b/apps.json @@ -3169,7 +3169,9 @@ "type": "widget", "readme": "README.md", "storage": [ - {"name":"BangleBridge.app.js","url":"app.js"} + {"name":"BangleBridge.app.js","url":"app.js"}, + {"name":"iconWatch.img","url":"iconWatch.img","evaluate":true}, + {"name":"heart.img","url":"heart.img","evaluate":true} ] }, { "id": "qmsched", From 1a95cbf7f6d18d57e24df7500f5177f948be645d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 16:18:37 +0200 Subject: [PATCH 39/47] Update apps.json --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index 8967651be..28e484deb 100644 --- a/apps.json +++ b/apps.json @@ -3170,8 +3170,8 @@ "readme": "README.md", "storage": [ {"name":"BangleBridge.app.js","url":"app.js"}, - {"name":"iconWatch.img","url":"iconWatch.img","evaluate":true}, - {"name":"heart.img","url":"heart.img","evaluate":true} + {"name":"iconWatch.img","url":"iconWatch.img"}, + {"name":"heart.img","url":"heart.img"} ] }, { "id": "qmsched", From 232c49a6ce075beb7ef3d117721cf0e51893bdc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 16:33:41 +0200 Subject: [PATCH 40/47] Delete app.js --- apps/BangleBridge/app.js | 292 --------------------------------------- 1 file changed, 292 deletions(-) delete mode 100644 apps/BangleBridge/app.js diff --git a/apps/BangleBridge/app.js b/apps/BangleBridge/app.js deleted file mode 100644 index 4ce084f37..000000000 --- a/apps/BangleBridge/app.js +++ /dev/null @@ -1,292 +0,0 @@ - - /** - * 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); - } - - //2021-06-11T19:21:58.000Z - - function hrm() { - - let msr = [0, 0, 0, 0, 0]; - let lastInsert = -1; - - function roundInsert(nueva) { - let indexFinal = (lastInsert + 1) % (msr.length); - //console.log("Index ==> "+ index); - 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) { - /* - prueba ++; - Bangle.drawWidgets(); - g.setFont("Vector", 45); - g.drawString(prueba,100,200);*/ - if (flip == 1) { //when off - - flip = 0; - //Bangle.buzz(1000); - g.clear(); - } else { //when on - - 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); - } - - - - initSensors(); - // Bangle.drawWidgets(); - // Terminal.println("Running BangleBridge"); - data[0] = 80.5; - g.setFont("Vector", 30); - g.drawString(data[0], 65, 180); - Bangle.drawWidgets(); - setInterval(function () { - //console.log("---------------------------------------------------------------"); - //console.log(data); - //Bluetooth.println(data[0]); - var measurement = { - hrm: data[0], - step: data[1], - batt: data[2], - acc: data[3], - com: data[4], - gps: data[5] - }; - /* g.clear(); - g.drawString(compssS,100,200); - */ - - - - Bluetooth.println(JSON.stringify(measurement) + "#"); - - }, 5 * 1000); From 12fd3ca464649f944e3026230630db9e78992beb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 16:34:52 +0200 Subject: [PATCH 41/47] Delete iconWatch.img --- apps/BangleBridge/iconWatch.img | Bin 255 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 apps/BangleBridge/iconWatch.img diff --git a/apps/BangleBridge/iconWatch.img b/apps/BangleBridge/iconWatch.img deleted file mode 100644 index 4a8434583521668bf41f87e690e750d6fa743be1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 255 zcmW;HyAFad6b9hGA+ZawD+8gs6C(p&9*L2GV2LkQ6Q4tC7+kyQV66XXhcBlmJ(spS zg%WZO*;!Oc)GtTPMLZUsjw*}5xI?5p23ljJ4Rd_Y8*5PkC+(OCg=xc=8|ph3_4-CRf-{2_ VqY;Pvo9@dHds!6LX9aAt!XL*LHO&A3 From 78bf4516f2d1d263ec69e5170a0328162fc0e5cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 16:35:06 +0200 Subject: [PATCH 42/47] Delete heart.img --- apps/BangleBridge/heart.img | 1 - 1 file changed, 1 deletion(-) delete mode 100644 apps/BangleBridge/heart.img diff --git a/apps/BangleBridge/heart.img b/apps/BangleBridge/heart.img deleted file mode 100644 index b8e339b30..000000000 --- a/apps/BangleBridge/heart.img +++ /dev/null @@ -1 +0,0 @@ -00ˆþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ þþþþþþþþþþþþþþ þþþþþþþþþþþþþþþþþþ þþþþþþþþþþ þþþþþþþþþþþþþþþ þþþþþþ þþþþþþþþþþþþþ þþþþ þþþþþþþþþþþ þþ ?? þþþþþþþþþ ÿÿ þþþþþþþþ ÿÿ þþþþþþþ ÿÿ þþþþþþ ÿÿ þþþþþþ ?ÿÿÿÿÿÿÿÿÿÿ? þþþþþþ ?ÿÿÿÿÿÿÿÿÿÿ? þþþþþþ ÿÿ ''' 'þþþþþþ ÿÿ' '''þþþþþþ ÿÿ' ''''þþþþþþþ 'ÿÿ' '''''þþþþþþþþ '??'''''''þþþþþþþþþ ''''''''þþþþþþþþþþ ''''''''þþþþþþþþþþþ '''''''''þþþþþþþþþþþþ ''''''''''þþþþþþþþþþþþþ '''''''''''þþþþþþþþþþþþþþþ ''''''''''''þþþþþþþþþþþþþþþþþ ''''''''''''þþþþþþþþþþþþþþþþþþþ '''''''''''''þþþþþþþþþþþþþþþþþþþþþ '''''''''''''þþþþþþþþþþþþþþþþþþþþþþþ ''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþ ''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþ '''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþ '''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ \ No newline at end of file From 185ed9ed9ba30fb5e7f28b6861192288ab632082 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 16:35:42 +0200 Subject: [PATCH 43/47] Add files via upload --- apps/BangleBridge/heart.png | 1 + apps/BangleBridge/iconWatch.png | Bin 0 -> 255 bytes apps/BangleBridge/widget.js | 304 ++++++++++++++++++++++++++++++++ 3 files changed, 305 insertions(+) create mode 100644 apps/BangleBridge/heart.png create mode 100644 apps/BangleBridge/iconWatch.png create mode 100644 apps/BangleBridge/widget.js diff --git a/apps/BangleBridge/heart.png b/apps/BangleBridge/heart.png new file mode 100644 index 000000000..b8e339b30 --- /dev/null +++ b/apps/BangleBridge/heart.png @@ -0,0 +1 @@ +00ˆþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ þþþþþþþþþþþþþþ þþþþþþþþþþþþþþþþþþ þþþþþþþþþþ þþþþþþþþþþþþþþþ þþþþþþ þþþþþþþþþþþþþ þþþþ þþþþþþþþþþþ þþ ?? þþþþþþþþþ ÿÿ þþþþþþþþ ÿÿ þþþþþþþ ÿÿ þþþþþþ ÿÿ þþþþþþ ?ÿÿÿÿÿÿÿÿÿÿ? þþþþþþ ?ÿÿÿÿÿÿÿÿÿÿ? þþþþþþ ÿÿ ''' 'þþþþþþ ÿÿ' '''þþþþþþ ÿÿ' ''''þþþþþþþ 'ÿÿ' '''''þþþþþþþþ '??'''''''þþþþþþþþþ ''''''''þþþþþþþþþþ ''''''''þþþþþþþþþþþ '''''''''þþþþþþþþþþþþ ''''''''''þþþþþþþþþþþþþ '''''''''''þþþþþþþþþþþþþþþ ''''''''''''þþþþþþþþþþþþþþþþþ ''''''''''''þþþþþþþþþþþþþþþþþþþ '''''''''''''þþþþþþþþþþþþþþþþþþþþþ '''''''''''''þþþþþþþþþþþþþþþþþþþþþþþ ''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþ ''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþ '''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþ '''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''''''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ''þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ \ No newline at end of file diff --git a/apps/BangleBridge/iconWatch.png b/apps/BangleBridge/iconWatch.png new file mode 100644 index 0000000000000000000000000000000000000000..4a8434583521668bf41f87e690e750d6fa743be1 GIT binary patch literal 255 zcmW;HyAFad6b9hGA+ZawD+8gs6C(p&9*L2GV2LkQ6Q4tC7+kyQV66XXhcBlmJ(spS zg%WZO*;!Oc)GtTPMLZUsjw*}5xI?5p23ljJ4Rd_Y8*5PkC+(OCg=xc=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..3b0b31c8f --- /dev/null +++ b/apps/BangleBridge/widget.js @@ -0,0 +1,304 @@ +(() => { + /** + * 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); + } + + //2021-06-11T19:21:58.000Z + + function hrm() { + + let msr = [0, 0, 0, 0, 0]; + let lastInsert = -1; + + function roundInsert(nueva) { + let indexFinal = (lastInsert + 1) % (msr.length); + //console.log("Index ==> "+ index); + 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) { + /* + prueba ++; + Bangle.drawWidgets(); + g.setFont("Vector", 45); + g.drawString(prueba,100,200);*/ + if (flip == 1) { //when off + + flip = 0; + //Bangle.buzz(1000); + g.clear(); + } else { //when on + + 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("iconWatch.img"),this.x + 1,this.y + 1); + + g.drawImage(storage.read("heart.img"), 145, 167); + } + + + // Finally add widget + + + initSensors(); + // Bangle.drawWidgets(); + // Terminal.println("Running BangleBridge"); + data[0] = 80.5; + g.setFont("Vector", 30); + g.drawString(data[0], 65, 180); + // Bangle.drawWidgets(); + setInterval(function () { + //console.log("---------------------------------------------------------------"); + //console.log(data); + //Bluetooth.println(data[0]); + var measurement = { + hrm: data[0], + step: data[1], + batt: data[2], + acc: data[3], + com: data[4], + gps: data[5] + }; + /* g.clear(); + g.drawString(compssS,100,200); + */ + + + + Bluetooth.println(JSON.stringify(measurement) + "#"); + draw(); + + }, 5 * 1000); + + WIDGETS["bangle.Sensors"]={ + area: "tl", + width: 10, + draw: draw, + }; +})(); //End of Widget From e9abfa160e65aa99eb89401ac5d657136cd86fee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 16:40:47 +0200 Subject: [PATCH 44/47] Update apps.json --- apps.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps.json b/apps.json index 28e484deb..e1ba1d078 100644 --- a/apps.json +++ b/apps.json @@ -3169,7 +3169,7 @@ "type": "widget", "readme": "README.md", "storage": [ - {"name":"BangleBridge.app.js","url":"app.js"}, + {"name":"banglebridge.wid.js","url":"widget.js"}, {"name":"iconWatch.img","url":"iconWatch.img"}, {"name":"heart.img","url":"heart.img"} ] From 4c8cd1f58104b017be7ecab448652bbf43ba4a4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 16:41:05 +0200 Subject: [PATCH 45/47] Add files via upload --- apps/BangleBridge/widget.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js index 3b0b31c8f..ee480268e 100644 --- a/apps/BangleBridge/widget.js +++ b/apps/BangleBridge/widget.js @@ -257,9 +257,9 @@ function draw() { // g.drawImage(storage.read("iconWatch.img"), this.x + 1, this.y + 1); - g.drawImage(storage.read("iconWatch.img"),this.x + 1,this.y + 1); - - g.drawImage(storage.read("heart.img"), 145, 167); + g.drawImage(storage.read("iconWatch.png"),this.x + 1,this.y + 1); + + g.drawImage(storage.read("heart.png"), 145, 167); } @@ -296,7 +296,7 @@ }, 5 * 1000); - WIDGETS["bangle.Sensors"]={ + WIDGETS["banglebridge"]={ area: "tl", width: 10, draw: draw, From 8197f96e24be42432b94463fc14762ea7e553dfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 16:42:32 +0200 Subject: [PATCH 46/47] Update apps.json --- apps.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps.json b/apps.json index e1ba1d078..e91d9b5a7 100644 --- a/apps.json +++ b/apps.json @@ -3170,8 +3170,8 @@ "readme": "README.md", "storage": [ {"name":"banglebridge.wid.js","url":"widget.js"}, - {"name":"iconWatch.img","url":"iconWatch.img"}, - {"name":"heart.img","url":"heart.img"} + {"name":"iconWatch.png","url":"iconWatch.png"}, + {"name":"heart.png","url":"heart.png"} ] }, { "id": "qmsched", From 906b530f5888d0a7bfa0a737f22a43734cbf7a9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20P=C3=A9rez=20Ramos?= Date: Thu, 15 Jul 2021 16:45:52 +0200 Subject: [PATCH 47/47] Add files via upload --- apps/BangleBridge/widget.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/BangleBridge/widget.js b/apps/BangleBridge/widget.js index ee480268e..9feecc703 100644 --- a/apps/BangleBridge/widget.js +++ b/apps/BangleBridge/widget.js @@ -292,7 +292,7 @@ Bluetooth.println(JSON.stringify(measurement) + "#"); - draw(); + //draw(); }, 5 * 1000);