Merge pull request #559 from berkenbu/master

Add sensor battery indicator, small bugfixes
pull/561/head
Gordon Williams 2020-09-16 08:04:07 +01:00 committed by GitHub
commit c1b0bef549
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 62 additions and 21 deletions

View File

@ -2176,7 +2176,7 @@
"name": "Cycling speed sensor",
"shortName":"CSCSensor",
"icon": "icons8-cycling-48.png",
"version":"0.03",
"version":"0.04",
"description": "Read BLE enabled cycling speed and cadence sensor and display readings on watch",
"tags": "outdoors,exercise,ble,bluetooth",
"readme": "README.md",

View File

@ -1,4 +1,5 @@
0.01: New app!
0.02: Add wheel circumference settings dialog
0.03: Save total distance traveled
0.04: Add sensor battery level indicator

View File

@ -26,13 +26,19 @@ class CSCSensor {
this.speedUnit = this.qMetric ? "km/h" : "mph";
this.distUnit = this.qMetric ? "km" : "mi";
this.distFactor = this.qMetric ? 1.609344 : 1;
this.batteryLevel = -1;
}
reset() {
this.settings.totaldist = this.totaldist;
storage.writeJSON(SETTINGS_FILE, this.settings);
this.maxSpeed = 0;
this.movingTime = 0;
this.lastRevsStart = this.lastRevs;
this.maxSpeed = 0;
}
setBatteryLevel(level) {
this.batteryLevel = level;
}
updateScreen() {
var dist = this.distFactor*(this.lastRevs-this.lastRevsStart)*this.wheelCirc/63360.0;
var ddist = Math.round(100*dist)/100;
@ -44,20 +50,38 @@ class CSCSensor {
if (dsecs.length<2) dsecs = "0"+dsecs;
var avespeed = (this.movingTime>2 ? Math.round(10*dist/(this.movingTime/3600))/10 : 0);
var maxspeed = Math.round(10*this.distFactor*this.maxSpeed)/10;
g.setFontAlign(1, -1, 0).setFontVector(18).setColor(1, 1, 0);
g.drawString("Time:", 86, 60);
g.drawString("Speed:", 86, 92);
g.drawString("Ave spd:", 86, 124);
g.drawString("Max spd:", 86, 156);
g.drawString("Trip dist:", 86, 188);
g.drawString("Total:", 86, 220);
g.setFontAlign(-1, -1, 0).setFontVector(24).setColor(1, 1, 1).clearRect(92, 60, 239, 239);
g.drawString(dmins+":"+dsecs, 92, 60);
g.drawString(dspeed+" "+this.speedUnit, 92, 92);
g.drawString(avespeed + " " + this.speedUnit, 92, 124);
g.drawString(maxspeed + " " + this.speedUnit, 92, 156);
g.drawString(ddist + " " + this.distUnit, 92, 188);
g.drawString(tdist + " " + this.distUnit, 92, 220);
for (var i=0; i<6; ++i) {
if ((i&1)==0) g.setColor(0, 0, 0);
else g.setColor(0.2, 0.1, 0.4);
g.fillRect(0, 48+i*32, 86, 48+(i+1)*32);
if ((i&1)==1) g.setColor(0, 0, 0);
else g.setColor(0.2, 0.1, 0.4);
g.fillRect(87, 48+i*32, 239, 48+(i+1)*32);
g.setColor(0.5, 0.5, 0.5).drawRect(87, 48+i*32, 239, 48+(i+1)*32).drawLine(0, 239, 239, 239).drawRect(0, 48, 87, 239);
}
g.setFontAlign(1, 0, 0).setFontVector(19).setColor(1, 1, 0);
g.drawString("Time:", 87, 66);
g.drawString("Speed:", 87, 98);
g.drawString("Ave spd:", 87, 130);
g.drawString("Max spd:", 87, 162);
g.drawString("Trip:", 87, 194);
g.drawString("Total:", 87, 226);
g.setFontAlign(-1, 0, 0).setFontVector(26).setColor(1, 1, 1);//.clearRect(92, 60, 239, 239);
g.drawString(dmins+":"+dsecs, 92, 66);
g.drawString(dspeed+" "+this.speedUnit, 92, 98);
g.drawString(avespeed + " " + this.speedUnit, 92, 130);
g.drawString(maxspeed + " " + this.speedUnit, 92, 162);
g.drawString(ddist + " " + this.distUnit, 92, 194);
g.drawString(tdist + " " + this.distUnit, 92, 226);
if (this.batteryLevel!=-1) {
g.setColor(1, 1, 1).drawRect(10, 55, 20, 75).fillRect(14, 53, 16, 55);
if (this.batteryLevel<25) g.setColor(1, 0, 0);
else if (this.batteryLevel<50) g.setColor(1, 0.5, 0);
else g.setColor(0, 1, 0);
g.fillRect(11, 74-18*this.batteryLevel/100, 19, 74);
console.log(this.batteryLevel);
this.batteryLevel = -1;
}
}
updateSensor(event) {
var qChanged = false;
@ -79,12 +103,13 @@ class CSCSensor {
var dBT = (Date.now()-this.lastBangleTime)/1000;
this.lastBangleTime = Date.now();
if (dT<0) dT+=64;
if (Math.abs(dT-dBT)>2) dT = dBT;
this.lastTime = wheelTime;
this.speed = this.lastSpeed;
if (dRevs>0 && dT>0) {
this.speed = (dRevs*this.wheelCirc/63360.0)*3600/dT;
this.speedFailed = 0;
this.movingTime += dBT;
this.movingTime += dT;
}
else {
this.speedFailed++;
@ -103,6 +128,16 @@ class CSCSensor {
var mySensor = new CSCSensor();
function getSensorBatteryLevel(gatt) {
gatt.getPrimaryService("180f").then(function(s) {
return s.getCharacteristic("2a19");
}).then(function(c) {
return c.readValue();
}).then(function(d) {
mySensor.setBatteryLevel(d.buffer[0]);
});
}
function parseDevice(d) {
device = d;
g.clearRect(0, 60, 239, 239).setFontAlign(0, 0, 0).setColor(0, 1, 0).drawString("Found device", 120, 120).flip();
@ -120,18 +155,23 @@ function parseDevice(d) {
}).then(function() {
console.log("Done!");
g.clearRect(0, 60, 239, 239).setColor(1, 1, 1).flip();
getSensorBatteryLevel(gatt);
mySensor.updateScreen();
}).catch(function(e) {
g.clearRect(0, 60, 239, 239).setColor(1, 0, 0).setFontAlign(0, 0, 0).drawString("ERROR"+e, 120, 120).flip();
console.log(e);
})}
NRF.setScan(parseDevice, { filters: [{services:["1816"]}], timeout: 2000});
g.clearRect(0, 60, 239, 239).setFontVector(18).setFontAlign(0, 0, 0).setColor(0, 1, 0);
g.drawString("Scanning for CSC sensor...", 120, 120);
function connection_setup() {
NRF.setScan(parseDevice, { filters: [{services:["1816"]}], timeout: 2000});
g.clearRect(0, 60, 239, 239).setFontVector(18).setFontAlign(0, 0, 0).setColor(0, 1, 0);
g.drawString("Scanning for CSC sensor...", 120, 120);
}
connection_setup();
setWatch(function() { mySensor.reset(); g.clearRect(0, 60, 239, 239); mySensor.updateScreen(); }, BTN1, {repeat:true, debounce:20});
Bangle.on('kill',()=>{ if (gatt!=undefined) gatt.disconnect(); mySensor.settings.totaldist = mySensor.totaldist; storage.writeJSON(SETTINGS_FILE, mySensor.settings); });
E.on('kill',()=>{ if (gatt!=undefined) gatt.disconnect(); mySensor.settings.totaldist = mySensor.totaldist; storage.writeJSON(SETTINGS_FILE, mySensor.settings); });
NRF.on('disconnect', connection_setup);
Bangle.loadWidgets();
Bangle.drawWidgets();