mirror of
https://github.com/thegecko/web-bluetooth-dfu.git
synced 2025-12-12 20:18:13 +08:00
Tidied implementation
This commit is contained in:
102
dist/dfu.js
vendored
102
dist/dfu.js
vendored
@@ -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 => {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user