mirror of
https://github.com/thegecko/web-bluetooth-dfu.git
synced 2025-12-14 21:18:13 +08:00
Updated DFU disconnects to work in node and web environments
This commit is contained in:
55
dist/dfu.js
vendored
55
dist/dfu.js
vendored
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user