mirror of https://github.com/espruino/BangleApps
106 lines
3.0 KiB
JavaScript
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());
|
|
});
|