mirror of https://github.com/espruino/BangleApps
New CSC sensor app, first commit
parent
b1fe7201c8
commit
255a89dc95
13
apps.json
13
apps.json
|
@ -2170,6 +2170,19 @@
|
|||
{"name":"tetra.stl","url":"tetra.stl"},
|
||||
{"name":"cube.stl","url":"cube.stl"},
|
||||
{"name":"icosa.stl","url":"icosa.stl"}
|
||||
]
|
||||
},
|
||||
{ "id": "cscsensor",
|
||||
"name": "Cycling speed sensor",
|
||||
"shortName":"CSCSensor",
|
||||
"icon": "icons8-cycling-48.png",
|
||||
"version":"0.01",
|
||||
"description": "Read BLE enabled cycling speed and cadence sensor and display readings on watch.",
|
||||
"tags": "outdoors,exercise,ble,bluetooth",
|
||||
"readme": "README.md",
|
||||
"storage": [
|
||||
{"name":"cscsensor.app.js","url":"cscsensor.app.js"},
|
||||
{"name":"cscsensor.img","url":"cscsensor-icon.js","evaluate":true},
|
||||
]
|
||||
},
|
||||
{ "id": "worldclock",
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
TBD
|
|
@ -0,0 +1 @@
|
|||
require("heatshrink").decompress(atob("mEwxH+AH4A/AH4A/AH/OAAIuuGFYuEGFQv/ADOlwV8wK/qwN8AAelGAguiFogACWsulFw6SERcwAFSISLnSMuAFZWCGENWllWLRSZC0vOAAovWmUslkyvbqJwIuHGC4uBAARiDdAwueL4YACMQLmfX5IAFqwwoMIowpMQ4wpGIcywDiYAA2IAAgwGq2kFwIvGC5YtPDJIuCF4gXPFxQHLF44XQFxAKOF4oXRBg4LOFwYvEEag7OBgReQNZzLNF5IXPBJlXq4vVC5Qv8R9TXQFwbvYJBgLlNbYXRBoYOEA44XfCAgAFCxgXYDI4VPC7IA/AH4A/AH4AWA"))
|
|
@ -0,0 +1,84 @@
|
|||
|
||||
var device;
|
||||
var gatt;
|
||||
var service;
|
||||
var characteristic;
|
||||
|
||||
class CSCSensor {
|
||||
constructor() {
|
||||
this.lastTime = 0;
|
||||
this.lastBangleTime = Date.now();
|
||||
this.lastRevs = -1;
|
||||
this.wheelDia = 28.0;
|
||||
this.speedFailed = 0;
|
||||
this.speed = 0;
|
||||
this.lastSpeed = 0;
|
||||
this.qUpdateScreen = true;
|
||||
}
|
||||
|
||||
updateScreen() {
|
||||
var dist = Math.round(100*this.lastRevs*this.wheelDia*Math.PI/63360.0)/100;
|
||||
var dspeed = Math.round(10*this.speed)/10;
|
||||
g.clearRect(0, 120-2*20, 239, 120+2*20).drawString(dspeed+" mph", 120, 100).drawString(dist+" miles", 120, 140);
|
||||
return;
|
||||
}
|
||||
|
||||
updateSensor(event) {
|
||||
var qChanged = false;
|
||||
if (event.target.uuid == "0x2a5b") {
|
||||
var wheelRevs = event.target.value.getUint32(1, true);
|
||||
var dRevs = (this.lastRevs>0 ? wheelRevs-this.lastRevs : 0);
|
||||
if (dRevs>0) qChanged = true;
|
||||
this.lastRevs = wheelRevs;
|
||||
var wheelTime = event.target.value.getUint16(5, true);
|
||||
var dT = (wheelTime-this.lastTime)/1024;
|
||||
var dBT = (Date.now()-this.lastBangleTime)/1000;
|
||||
if (dT<0) dT+=64;
|
||||
this.lastTime = wheelTime;
|
||||
this.speed = this.lastSpeed;
|
||||
if (dRevs>0 && dT>0) {
|
||||
this.speed = (dRevs*this.wheelDia*Math.PI/63360.0)*3600/dT;
|
||||
this.speedFailed = 0;
|
||||
}
|
||||
else {
|
||||
this.speedFailed++;
|
||||
qChanged = false;
|
||||
if (this.speedFailed>3) {
|
||||
this.speed = 0;
|
||||
qChanged = (this.lastSpeed>0);
|
||||
}
|
||||
}
|
||||
this.lastSpeed = this.speed;
|
||||
}
|
||||
if (qChanged && this.qUpdateScreen) this.updateScreen();
|
||||
}
|
||||
};
|
||||
|
||||
var mySensor = new CSCSensor();
|
||||
|
||||
function parseDevice(d) {
|
||||
device = d;
|
||||
g.clear().drawString("Found device", 120, 120).flip();
|
||||
device.gatt.connect().then(function(ga) {
|
||||
gatt = ga;
|
||||
g.clear().drawString("Connected", 120, 120).flip();
|
||||
return gatt.getPrimaryService("1816");
|
||||
}).then(function(s) {
|
||||
service = s;
|
||||
return service.getCharacteristic("2a5b");
|
||||
}).then(function(c) {
|
||||
characteristic = c;
|
||||
characteristic.on('characteristicvaluechanged', (event)=>mySensor.updateSensor(event));
|
||||
return characteristic.startNotifications();
|
||||
}).then(function() {
|
||||
console.log("Done!");
|
||||
g.clear().setFontVector("40").setColor(1, 1, 1).flip();
|
||||
}).catch(function(e) {
|
||||
g.clear().setColor(1, 0, 0).drawString("ERROR"+e, 120, 120).flip();
|
||||
})}
|
||||
|
||||
NRF.setScan(parseDevice, { filters: [{services:["1816"]}], timeout: 2000});
|
||||
g.clear().setFontVector(18).setFontAlign(0, 0, 0).setColor(0, 1, 0);
|
||||
g.drawString("Scanning for CSC sensor...", 120, 120);
|
||||
|
||||
Bangle.on('kill',()=>{ if (gatt!=undefined) gatt.disconnect()});
|
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
Loading…
Reference in New Issue