1
0
Fork 0
BangleApps/apps/btmultimeter/app.js

106 lines
3.0 KiB
JavaScript

var decoded;
var gatt;
function decode(d) {
var value = d.getUint16(4,1);
if (value&32768)
value = -(value&32767);
var flags = d.getUint8(0);
var flags2 = d.getUint8(1);
// mv dc 27,240 "11xxx"
// mv ac 95,240 "1011xxx"
// v dc 36,240 "100xxx" 36(2dp) 35(20dp)
// v ac 100,240 "1100xxx" 100(2dp) 99(20dp) 97(2000dp)
// ohms 55,241 "110xxx"
// beep 231,242 "11100xxx"
// diode 167,242 "10100xxx"
// capac 76,241 "1001xxx"
// hz 162,241 "10100xxx"
// temp 33,242 "100xxx"
// ncv 96,243 "1100xxx"
// uA 146,240 "10010xxx"
// ma 155,240 "10011xxx"
// A 163,240 "10100xxx"
var dp = flags&7;
var range = (flags>>3)&7;
value *= Math.pow(10, -dp);
var isAC = !!(flags&64);
var mode = "?", units = "";
if (flags2==240) {
if (flags&128) {
mode = "current";
units = ["","nA","uA","mA","A","kA","MA",""][range];
} else {
mode = "voltage";
units = ["","nV","uV","mV","V","kV","MV",""][range] + " " + (isAC?"AC":"DC");
}
} else if (flags2==241) {
if (isAC) {
mode = "capacitance";
units = ["","nF","uF","mF","F","kF","MF",""][range];
} else if (flags&128) {
mode = "frequency";
units = "Hz";
} else {
mode = "resistance";
units = ["","nOhm","uOhm","mOhm","Ohm","kOhm","MOhm",""][range];
}
} else if (flags2==242) {
if (flags&128) mode = isAC ? "continuity" : "diode";
else {
mode = "temperature";
units = isAC ? "F" : "C";
}
} else if (flags2==243) mode = "ncv";
//console.log(mode+" "+value+" "+units,new Uint8Array(d.buffer).slice());
decoded = {
value : value,
mode : mode, // current/voltage/capacitance/frequency/resistance/temperature
units : units, // eg 'mA'
raw : new Uint8Array(d.buffer).slice(),
};
updateDisplay(decoded);
}
function updateDisplay(d) {
var mode = d.mode;
mode = mode.substr(0,1).toUpperCase()+mode.substr(1);
var s = d.value.toString();
var R = Bangle.appRect;
g.reset().clearRect(R);
g.setFont("12x20").setFontAlign(-1,-1).drawString(mode, R.x, R.y);
g.setFont("12x20").setFontAlign(1,1).drawString(d.units, R.x+R.w-1, R.y+R.h-1);
var fontSize = 80;
g.setFont("Vector",fontSize).setFontAlign(0,0);
while (g.stringWidth(s) > R.w-20) {
fontSize -= 2;
g.setFont("Vector", fontSize);
}
g.drawString(s, R.x+R.w/2, R.y+R.h/2);
}
Bangle.loadWidgets();
Bangle.drawWidgets();
E.showMessage(/*LANG*/"Connecting...");
NRF.requestDevice({ filters: [{ name: 'BDM' }] }).then(function(device) {
return device.gatt.connect();
}).then(function(g) {
gatt = g;
return gatt.getPrimaryService(0xFFF0);
}).then(function(service) {
return service.getCharacteristic(0xFFF4);
}).then(function(c) {
c.on('characteristicvaluechanged', function(event) {
d = event.target.value;
decode(d);
});
return c.startNotifications();
}).then(function() {
E.showMessage(/*LANG*/"Connected.");
}).catch(function(e) {
E.showMessage(e.toString());
});