Updated DFU disconnects to work in node and web environments

This commit is contained in:
Rob Moran
2016-03-10 21:35:40 +00:00
parent 28f1c17674
commit 98feec38cf

55
dist/dfu.js vendored
View File

@@ -115,10 +115,15 @@
function writeMode(device) { function writeMode(device) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
device.addEventListener("gattserverdisconnected", function() { var resolved = false;
log("DFU target issued GAP disconnect and reset into bootloader/DFU mode"); function disconnectHandler() {
resolve(device); if (!resolved) {
}); resolved = true;
log("DFU target issued GAP disconnect and reset into bootloader/DFU mode");
resolve(device);
}
}
device.addEventListener("gattserverdisconnected", disconnectHandler);
var characteristics = null; var characteristics = null;
@@ -134,9 +139,13 @@
}) })
.then(function() { .then(function() {
log("modeData written"); log("modeData written");
setTimeout(function() { // TODO: Remove this when gattserverdisconnected event is implemented and possibly put a timeout in that event handler before resolving. // TODO: Remove this when gattserverdisconnected event is implemented and possibly put a timeout in that event handler before resolving
resolve(device); setTimeout(function() {
}, 2000); if (characteristics.server.connected === true) {
characteristics.server.disconnect();
}
disconnectHandler();
}, 5000);
}) })
.catch(function(error) { .catch(function(error) {
error = "writeMode error: " + error; error = "writeMode error: " + error;
@@ -178,7 +187,7 @@
if (versionChar) { if (versionChar) {
return versionChar.readValue() return versionChar.readValue()
.then(function(data) { .then(function(data) {
console.log('read versionChar'); log('read versionChar');
var major = data.getUint8(0); var major = data.getUint8(0);
var minor = data.getUint8(1); var minor = data.getUint8(1);
return transfer(chars, arrayBuffer, imageType, major, minor); return transfer(chars, arrayBuffer, imageType, major, minor);
@@ -218,9 +227,10 @@
device.gatt.connect() device.gatt.connect()
.then(function(gattServer) { .then(function(gattServer) {
log("connected to device"); log("connected to device");
return new Promise(function(resolve) { server = gattServer;
server = gattServer; // This delay is needed because BlueZ needs time to update it's cache.
setTimeout(resolve, 2000); // This delay is needed because BlueZ needs time to update it's cache. return new Promise(function(resolve, reject) {
setTimeout(resolve, 2000);
}); });
}) })
.then(function() { .then(function() {
@@ -263,11 +273,22 @@
var offset; var offset;
function transfer(chars, arrayBuffer, imageType, majorVersion, minorVersion) { function transfer(chars, arrayBuffer, imageType, majorVersion, minorVersion) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
// This should be 'chars.controlChar.service.server' but it's not implemented yet
var server = chars.server; var server = chars.server;
var controlChar = chars.controlChar; var controlChar = chars.controlChar;
var packetChar = chars.packetChar; var packetChar = chars.packetChar;
log('using dfu version ' + majorVersion + "." + minorVersion); log('using dfu version ' + majorVersion + "." + minorVersion);
var resolved = false;
function disconnectHandler() {
if (!resolved) {
resolved = true;
log('disconnected and completed the DFU transfer');
resolve();
}
}
server.device.addEventListener("gattserverdisconnected", disconnectHandler);
// Set up receipts // Set up receipts
interval = Math.floor(arrayBuffer.byteLength / (packetSize * notifySteps)); interval = Math.floor(arrayBuffer.byteLength / (packetSize * notifySteps));
offset = 0; offset = 0;
@@ -390,14 +411,16 @@
case OPCODE.VALIDATE_FIRMWARE: case OPCODE.VALIDATE_FIRMWARE:
log('complete, reset...'); log('complete, reset...');
server.device.addEventListener("gattserverdisconnected", function() {
log('disconnected and completed the DFU transfer');
resolve();
});
controlChar.writeValue(new Uint8Array([OPCODE.ACTIVATE_IMAGE_AND_RESET])) controlChar.writeValue(new Uint8Array([OPCODE.ACTIVATE_IMAGE_AND_RESET]))
.then(function() { .then(function() {
log('image activated and dfu target reset'); log('image activated and dfu target reset');
// TODO: Remove this when gattserverdisconnected event is implemented and possibly put a timeout in that event handler before resolving
setTimeout(function() {
if (server.connected === true) {
server.disconnect();
}
disconnectHandler();
}, 5000);
}) })
.catch(function(error) { .catch(function(error) {
error = "error resetting: " + error; error = "error resetting: " + error;