ruuvi-gatt-demo
Version:
Ruuvi Gatt profile demo with web bluetooth
135 lines (122 loc) • 3.62 kB
JavaScript
/*jshint
node: true
*/
;
const webble = require("ruuvi.webbluetooth.js");
const endpoints = require("ruuvi.endpoints.js");
const $ = require('jquery');
const graph = require('./graph.js');
const FileSaver = require('file-saver');
const deviceInfo = require('./device_information.js')
const GRAPH_ENDPOINT = 0x60;
const STDEV_ENDPOINT = 0x61;
const saveRaw = function() {
let a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
let data = graph.rawLog;
let blob = new Blob([data.join("\r\n")], {
type: "text/plain;charset=utf-8"
});
FileSaver.saveAs(blob, Date() + "raw.csv");
}
const saveDSP = function() {
let a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
let data = graph.dspLog;
let blob = new Blob([data.join("\r\n")], {
type: "text/plain;charset=utf-8"
});
FileSaver.saveAs(blob, Date() + "dsp.csv");
}
const toHexString = function(byteArray) {
return Array.prototype.map.call(byteArray, function(byte) {
return ('0' + (byte & 0xFF).toString(16)).slice(-2);
}).join(' ');
}
let connected = false;
let uart = null;
let dis = null;
let device = null;
const handleIncomingData = async function(data)
{
let bytes = new Uint8Array(data.buffer);
$('#console_text').append('<<< 0x' + toHexString(bytes) + '\n');
scrollToBottom("console_text");
}
const connect = async function() {
let services = webble.getServices();
uart = services["Nordic UART"];
dis = services["Device Information"];
await uart.registerNotifications(uart.TX.UUID, handleIncomingData);
connected = true;
}
const connect_timeout = async function() {
console.log("connecting");
device = await webble.connect($('#device-name').val());
Promise.race([
new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 15000)),
await connect()
]).catch(function(err) {
console.log("Timeout in connection");
device = null;
uart = null;
dis = null;
connected = false;
});
if (device) {
deviceInfo.update(dis, connected);
}
return device;
}
const configure = async function() {
//XXX use ruuvi.endpoints.js create
let continuousAcceleration = new Uint8Array([0x40, 0x60, 0x01, 25, 251, 10, 252, 1, 0, 2, 0]);
let stdevAcceleration = new Uint8Array([0x50, 0x61, 0x16, 0x40, 1, 0, 0, 5, 25, 2, 0]);
//await uart.writeCharacteristic(uart.RX.UUID, continuousAcceleration);
};
const disconnect = async function() {
console.log("Disconnecting");
if (device) {
try {
webble.disconnect(device);
} catch (err) {
console.log("Error while disconnecting: " + err);
}
}
connected = false;
uart = null;
dis = null;
device = null;
deviceInfo.update(dis, connected);
}
const configure_led = async function() {
let destination = 0x2A;
let source = 0x01;
let type = 0x02;
let channel = $('#led-channel').val();
let power = $('#led-power').val();
let cmd = new Uint8Array([destination, source, type, channel, power, 0, 0, 0, 0, 0, 0]);
$('#console_text').append('>>> 0x' + toHexString(cmd) + '\n');
try {
uart.writeCharacteristic(uart.RX.UUID, cmd);
} catch (err) {
console.log(err);
}
}
const scrollToBottom = function(id) {
$('#' + id).scrollTop($('#' + id)[0].scrollHeight);
}
const init = function() {
$('#connect-button').click(connect_timeout);
$('#disconnect-button').click(disconnect);
$('#led-configure').click(configure_led);
graph.initGraph();
}
const delayed_init = function() {
window.setTimeout(init, 1000);
}
module.exports = {
INIT: delayed_init
}