Tidied implementation

This commit is contained in:
Rob Moran
2016-02-04 23:32:54 -06:00
parent a8bad4f1ff
commit 7ba5e66371
2 changed files with 54 additions and 54 deletions

102
dist/dfu.js vendored
View File

@@ -40,11 +40,6 @@
return new Int16Array(buffer)[0] === 256; return new Int16Array(buffer)[0] === 256;
})(); })();
var controlChar = null;
var packetChar = null;
var versionChar = null;
var server = null;
var loggers = []; var loggers = [];
function addLogger(loggerFn) { function addLogger(loggerFn) {
if (typeof loggerFn === "function") { if (typeof loggerFn === "function") {
@@ -66,24 +61,28 @@
function writeMode(device) { function writeMode(device) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
// Disconnect event currently not implemented
/* /*
// Disconnect event currently not implemented
device.addEventListener("gattserverdisconnected", () => { device.addEventListener("gattserverdisconnected", () => {
log("modeData written"); log("modeData written");
resolve(); resolve();
}); });
*/ */
connect(device) connect(device)
.then(() => { .then(chars => {
log("writing modeData..."); log("writing modeData...");
controlChar.writeValue(new Uint8Array([1])); chars.controlChar.writeValue(new Uint8Array([1]));
return server.disconnect();
// Hack to gracefully disconnect without disconnect event
setTimeout(() => {
chars.server.disconnect();
setTimeout(() => {
log("modeData written");
resolve(device);
}, 1000);
}, 1000);
}) })
.then(() => { .catch(error => {
log("modeData written");
resolve(device);
}).catch(error => {
error = "writeMode error: " + error; error = "writeMode error: " + error;
log(error); log(error);
reject(error); reject(error);
@@ -96,18 +95,18 @@
imageType = imageType || ImageType.Application; imageType = imageType || ImageType.Application;
connect(device) connect(device)
.then(() => { .then(chars => {
if (versionChar) { if (chars.versionChar) {
versionChar.readValue() chars.versionChar.readValue()
.then(data => { .then(data => {
var view = new DataView(data); var view = new DataView(data);
var major = view.getUint8(0); var major = view.getUint8(0);
var minor = view.getUint8(1); var minor = view.getUint8(1);
return transfer(arrayBuffer, imageType, major, minor); return transfer(chars, arrayBuffer, imageType, major, minor);
}); });
} else { } else {
// Default to version 6.0 // Default to version 6.0
return transfer(arrayBuffer, imageType, 6, 0); return transfer(chars, arrayBuffer, imageType, 6, 0);
} }
}) })
.then(() => { .then(() => {
@@ -122,18 +121,21 @@
function connect(device) { function connect(device) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
var server = null;
var service = null; var service = null;
// Disconnect event currently not implemented var controlChar = null;
/* var packetChar = null;
device.addEventListener("gattserverdisconnected", () => { var versionChar = null;
log("device disconnected");
service = null; function complete() {
controlChar = null; resolve({
packetChar = null; server: server,
versionChar = null; controlChar: controlChar,
server = null; packetChar: packetChar,
}); versionChar: versionChar
*/ });
}
device.connectGATT() device.connectGATT()
.then(gattServer => { .then(gattServer => {
// Connected // Connected
@@ -158,10 +160,10 @@
.then(() => { .then(() => {
log("found version characteristic"); log("found version characteristic");
versionChar = characteristic; versionChar = characteristic;
resolve(); complete();
}) })
.catch(error => { .catch(error => {
resolve(); complete();
}); });
}) })
.catch(error => { .catch(error => {
@@ -174,8 +176,10 @@
var interval; var interval;
var offset; var offset;
function transfer(arrayBuffer, imageType, majorVersion, minorVersion) { function transfer(chars, arrayBuffer, imageType, majorVersion, minorVersion) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
var controlChar = chars.controlChar;
var packetChar = chars.packetChar;
log('using dfu version ' + majorVersion + "." + minorVersion); log('using dfu version ' + majorVersion + "." + minorVersion);
// Set up receipts // Set up receipts
@@ -188,13 +192,8 @@
return reject(error); return reject(error);
} }
log("enabling notifications"); log("sending imagetype: " + imageType);
controlChar.startNotifications() controlChar.writeValue(new Uint8Array([1, imageType]))
.then(() => {
controlChar.addEventListener('characteristicvaluechanged', handleControl);
log("sending imagetype: " + imageType);
return controlChar.writeValue(new Uint8Array([1, imageType]))
})
.then(() => { .then(() => {
log("sent start"); log("sent start");
@@ -209,15 +208,16 @@
view.setUint32(8, appLength, littleEndian); view.setUint32(8, appLength, littleEndian);
// Set firmware length // Set firmware length
packetChar.writeValue(view) return packetChar.writeValue(view)
})
.then(() => {
log("sent buffer size: " + arrayBuffer.byteLength);
log("enabling notifications");
return controlChar.startNotifications()
.then(() => { .then(() => {
log("sent buffer size: " + arrayBuffer.byteLength); log("notifications started");
controlChar.addEventListener('characteristicvaluechanged', handleControl);
}) })
.catch(error => {
error = "firmware length error: " + error;
log(error);
reject(error);
});
}) })
.catch(error => { .catch(error => {
error = "start error: " + error; error = "start error: " + error;
@@ -271,7 +271,7 @@
}) })
.then(() => { .then(() => {
log("sent receive"); log("sent receive");
return writePacket(arrayBuffer, 0); return writePacket(packetChar, arrayBuffer, 0);
}) })
.catch(error => { .catch(error => {
error = "error sending packet count: " + error; error = "error sending packet count: " + error;
@@ -318,13 +318,13 @@
} else if (opCode === 17) { } else if (opCode === 17) {
var bytecount = view.getUint32(1, littleEndian); var bytecount = view.getUint32(1, littleEndian);
log('transferred: ' + bytecount); log('transferred: ' + bytecount);
writePacket(arrayBuffer, 0); writePacket(packetChar, arrayBuffer, 0);
} }
} }
}); });
} }
function writePacket(arrayBuffer, count) { function writePacket(packetChar, arrayBuffer, count) {
var size = (offset + packetSize > arrayBuffer.byteLength) ? arrayBuffer.byteLength - offset : packetSize; var size = (offset + packetSize > arrayBuffer.byteLength) ? arrayBuffer.byteLength - offset : packetSize;
var packet = arrayBuffer.slice(offset, offset + size); var packet = arrayBuffer.slice(offset, offset + size);
var view = new Uint8Array(packet); var view = new Uint8Array(packet);
@@ -334,7 +334,7 @@
count ++; count ++;
offset += packetSize; offset += packetSize;
if (count < interval && offset < arrayBuffer.byteLength) { if (count < interval && offset < arrayBuffer.byteLength) {
writePacket(arrayBuffer, count); writePacket(packetChar, arrayBuffer, count);
} }
}) })
.catch(error => { .catch(error => {

View File

@@ -4,9 +4,9 @@
<title>web-bluetooth-dfu</title> <title>web-bluetooth-dfu</title>
</head> </head>
<body> <body>
<button onclick="setMode()" style="font-size: 42px;">Set Mode</button> <button onclick="setMode()" style="font-size: 20px;">Set Mode</button>
<button onclick="findDFU()" style="font-size: 42px;">Transfer</button> <button onclick="findDFU()" style="font-size: 20px;">Transfer</button>
<button onclick="both()" style="font-size: 42px;">Both</button> <button onclick="both()" style="font-size: 20px;">Both</button>
<div id="results"></div> <div id="results"></div>
<script src="dist/dfu.js"></script> <script src="dist/dfu.js"></script>