mirror of
https://github.com/thegecko/web-bluetooth-dfu.git
synced 2025-12-14 21:18:13 +08:00
Now injecting logger
This commit is contained in:
88
dist/dfu.js
vendored
88
dist/dfu.js
vendored
@@ -45,11 +45,16 @@
|
|||||||
var versionChar = null;
|
var versionChar = null;
|
||||||
var server = null;
|
var server = null;
|
||||||
|
|
||||||
// Hack to see debug info
|
var loggers = [];
|
||||||
var resultsEl = document.getElementById("results");
|
function addLogger(loggerFn) {
|
||||||
function logFn(message) {
|
if (typeof loggerFn === "function") {
|
||||||
console.log(message);
|
loggers.push(loggerFn);
|
||||||
resultsEl.innerText += message + "\n";
|
}
|
||||||
|
}
|
||||||
|
function log(message) {
|
||||||
|
loggers.forEach(logger => {
|
||||||
|
logger(message);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function findDevice(filters) {
|
function findDevice(filters) {
|
||||||
@@ -65,22 +70,22 @@
|
|||||||
// Disconnect event currently not implemented
|
// Disconnect event currently not implemented
|
||||||
/*
|
/*
|
||||||
device.addEventListener("gattserverdisconnected", () => {
|
device.addEventListener("gattserverdisconnected", () => {
|
||||||
logFn("modeData written");
|
log("modeData written");
|
||||||
resolve();
|
resolve();
|
||||||
});
|
});
|
||||||
*/
|
*/
|
||||||
connect(device)
|
connect(device)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
logFn("writing modeData...");
|
log("writing modeData...");
|
||||||
controlChar.writeValue(new Uint8Array([1]));
|
controlChar.writeValue(new Uint8Array([1]));
|
||||||
return server.disconnect();
|
return server.disconnect();
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
logFn("modeData written");
|
log("modeData written");
|
||||||
resolve(device);
|
resolve(device);
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
error = "writeMode error: " + error;
|
error = "writeMode error: " + error;
|
||||||
logFn(error);
|
log(error);
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -109,7 +114,7 @@
|
|||||||
resolve();
|
resolve();
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
logFn(error);
|
log(error);
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -121,7 +126,7 @@
|
|||||||
// Disconnect event currently not implemented
|
// Disconnect event currently not implemented
|
||||||
/*
|
/*
|
||||||
device.addEventListener("gattserverdisconnected", () => {
|
device.addEventListener("gattserverdisconnected", () => {
|
||||||
logFn("device disconnected");
|
log("device disconnected");
|
||||||
service = null;
|
service = null;
|
||||||
controlChar = null;
|
controlChar = null;
|
||||||
packetChar = null;
|
packetChar = null;
|
||||||
@@ -133,25 +138,25 @@
|
|||||||
.then(gattServer => {
|
.then(gattServer => {
|
||||||
// Connected
|
// Connected
|
||||||
server = gattServer;
|
server = gattServer;
|
||||||
logFn("connected to device");
|
log("connected to device");
|
||||||
return server.getPrimaryService(serviceUUID);
|
return server.getPrimaryService(serviceUUID);
|
||||||
})
|
})
|
||||||
.then(primaryService => {
|
.then(primaryService => {
|
||||||
logFn("found DFU service");
|
log("found DFU service");
|
||||||
service = primaryService;
|
service = primaryService;
|
||||||
return service.getCharacteristic(controlUUID);
|
return service.getCharacteristic(controlUUID);
|
||||||
})
|
})
|
||||||
.then(characteristic => {
|
.then(characteristic => {
|
||||||
logFn("found control characteristic");
|
log("found control characteristic");
|
||||||
controlChar = characteristic;
|
controlChar = characteristic;
|
||||||
return service.getCharacteristic(packetUUID);
|
return service.getCharacteristic(packetUUID);
|
||||||
})
|
})
|
||||||
.then(characteristic => {
|
.then(characteristic => {
|
||||||
logFn("found packet characteristic");
|
log("found packet characteristic");
|
||||||
packetChar = characteristic;
|
packetChar = characteristic;
|
||||||
service.getCharacteristic(versionUUID)
|
service.getCharacteristic(versionUUID)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
logFn("found version characteristic");
|
log("found version characteristic");
|
||||||
versionChar = characteristic;
|
versionChar = characteristic;
|
||||||
resolve();
|
resolve();
|
||||||
})
|
})
|
||||||
@@ -161,7 +166,7 @@
|
|||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
error = "connect error: " + error;
|
error = "connect error: " + error;
|
||||||
logFn(error);
|
log(error);
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -171,7 +176,7 @@
|
|||||||
var offset;
|
var offset;
|
||||||
function transfer(arrayBuffer, imageType, majorVersion, minorVersion) {
|
function transfer(arrayBuffer, imageType, majorVersion, minorVersion) {
|
||||||
return new Promise(function(resolve, reject) {
|
return new Promise(function(resolve, reject) {
|
||||||
logFn('using dfu version ' + majorVersion + "." + minorVersion);
|
log('using dfu version ' + majorVersion + "." + minorVersion);
|
||||||
|
|
||||||
// Set up receipts
|
// Set up receipts
|
||||||
interval = Math.floor(arrayBuffer.byteLength / (packetSize * notifySteps));
|
interval = Math.floor(arrayBuffer.byteLength / (packetSize * notifySteps));
|
||||||
@@ -185,13 +190,13 @@
|
|||||||
var resp_code = view.getUint8(2);
|
var resp_code = view.getUint8(2);
|
||||||
if (resp_code !== 1) {
|
if (resp_code !== 1) {
|
||||||
var error = "error from control: " + resp_code;
|
var error = "error from control: " + resp_code;
|
||||||
logFn(error);
|
log(error);
|
||||||
return reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
var req_opcode = view.getUint8(1);
|
var req_opcode = view.getUint8(1);
|
||||||
if (req_opcode === 1 && majorVersion > 6) {
|
if (req_opcode === 1 && majorVersion > 6) {
|
||||||
logFn('write null init packet');
|
log('write null init packet');
|
||||||
|
|
||||||
controlChar.writeValue(new Uint8Array([2,0]))
|
controlChar.writeValue(new Uint8Array([2,0]))
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -202,12 +207,12 @@
|
|||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
error = "error writing init: " + error;
|
error = "error writing init: " + error;
|
||||||
logFn(error);
|
log(error);
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
|
|
||||||
} else if (req_opcode === 1 || req_opcode === 2) {
|
} else if (req_opcode === 1 || req_opcode === 2) {
|
||||||
logFn('complete, send packet count');
|
log('complete, send packet count');
|
||||||
|
|
||||||
var buffer = new ArrayBuffer(3);
|
var buffer = new ArrayBuffer(3);
|
||||||
var view = new DataView(buffer);
|
var view = new DataView(buffer);
|
||||||
@@ -216,43 +221,43 @@
|
|||||||
|
|
||||||
controlChar.writeValue(view)
|
controlChar.writeValue(view)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
logFn("sent packet count: " + interval);
|
log("sent packet count: " + interval);
|
||||||
return controlChar.writeValue(new Uint8Array([3]));
|
return controlChar.writeValue(new Uint8Array([3]));
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
logFn("sent receive");
|
log("sent receive");
|
||||||
return writePacket(arrayBuffer, 0);
|
return writePacket(arrayBuffer, 0);
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
error = "error sending packet count: " + error;
|
error = "error sending packet count: " + error;
|
||||||
logFn(error);
|
log(error);
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
|
|
||||||
} else if (req_opcode === 3) {
|
} else if (req_opcode === 3) {
|
||||||
logFn('complete, check length');
|
log('complete, check length');
|
||||||
|
|
||||||
controlChar.writeValue(new Uint8Array([7]))
|
controlChar.writeValue(new Uint8Array([7]))
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
error = "error checking length: " + error;
|
error = "error checking length: " + error;
|
||||||
logFn(error);
|
log(error);
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
|
|
||||||
} else if (req_opcode === 7) {
|
} else if (req_opcode === 7) {
|
||||||
var bytecount = view.getUint32(3, littleEndian);
|
var bytecount = view.getUint32(3, littleEndian);
|
||||||
logFn('length: ' + bytecount);
|
log('length: ' + bytecount);
|
||||||
logFn('complete, validate...');
|
log('complete, validate...');
|
||||||
|
|
||||||
controlChar.writeValue(new Uint8Array([4]))
|
controlChar.writeValue(new Uint8Array([4]))
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
error = "error validating: " + error;
|
error = "error validating: " + error;
|
||||||
logFn(error);
|
log(error);
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
|
|
||||||
} else if (req_opcode === 4) {
|
} else if (req_opcode === 4) {
|
||||||
logFn('complete, reset...');
|
log('complete, reset...');
|
||||||
|
|
||||||
controlChar.writeValue(new Uint8Array([5]))
|
controlChar.writeValue(new Uint8Array([5]))
|
||||||
.then(() => {
|
.then(() => {
|
||||||
@@ -260,32 +265,32 @@
|
|||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
error = "error resetting: " + error;
|
error = "error resetting: " + error;
|
||||||
logFn(error);
|
log(error);
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (opCode === 17) {
|
} else if (opCode === 17) {
|
||||||
var bytecount = view.getUint32(1, littleEndian);
|
var bytecount = view.getUint32(1, littleEndian);
|
||||||
logFn('transferred: ' + bytecount);
|
log('transferred: ' + bytecount);
|
||||||
writePacket(arrayBuffer, 0);
|
writePacket(arrayBuffer, 0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!controlChar.properties.notify) {
|
if (!controlChar.properties.notify) {
|
||||||
var error = "controlChar missing notify property";
|
var error = "controlChar missing notify property";
|
||||||
logFn(error);
|
log(error);
|
||||||
return reject(error);
|
return reject(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
logFn("enabling notifications");
|
log("enabling notifications");
|
||||||
controlChar.startNotifications()
|
controlChar.startNotifications()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
logFn("sending imagetype: " + imageType);
|
log("sending imagetype: " + imageType);
|
||||||
return controlChar.writeValue(new Uint8Array([1, imageType]))
|
return controlChar.writeValue(new Uint8Array([1, imageType]))
|
||||||
})
|
})
|
||||||
.then(() => {
|
.then(() => {
|
||||||
logFn("sent start");
|
log("sent start");
|
||||||
|
|
||||||
var softLength = (imageType === ImageType.SoftDevice) ? arrayBuffer.byteLength : 0;
|
var softLength = (imageType === ImageType.SoftDevice) ? arrayBuffer.byteLength : 0;
|
||||||
var bootLength = (imageType === ImageType.Bootloader) ? arrayBuffer.byteLength : 0;
|
var bootLength = (imageType === ImageType.Bootloader) ? arrayBuffer.byteLength : 0;
|
||||||
@@ -300,17 +305,17 @@
|
|||||||
// Set firmware length
|
// Set firmware length
|
||||||
packetChar.writeValue(view)
|
packetChar.writeValue(view)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
logFn("sent buffer size: " + arrayBuffer.byteLength);
|
log("sent buffer size: " + arrayBuffer.byteLength);
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
error = "firmware length error: " + error;
|
error = "firmware length error: " + error;
|
||||||
logFn(error);
|
log(error);
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
error = "start error: " + error;
|
error = "start error: " + error;
|
||||||
logFn(error);
|
log(error);
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -331,11 +336,12 @@
|
|||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
error = "writePacket error: " + error;
|
error = "writePacket error: " + error;
|
||||||
logFn(error);
|
log(error);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
addLogger: addLogger,
|
||||||
ImageType: ImageType,
|
ImageType: ImageType,
|
||||||
findDevice: findDevice,
|
findDevice: findDevice,
|
||||||
writeMode: writeMode,
|
writeMode: writeMode,
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
console.log(message);
|
console.log(message);
|
||||||
resultsEl.innerText += message + "\n";
|
resultsEl.innerText += message + "\n";
|
||||||
}
|
}
|
||||||
|
dfu.addLogger(log);
|
||||||
|
|
||||||
function download(url) {
|
function download(url) {
|
||||||
return new Promise(function(resolve, reject) {
|
return new Promise(function(resolve, reject) {
|
||||||
|
|||||||
Reference in New Issue
Block a user