Skip to content

Commit fa8b841

Browse files
author
Nikolay Govorov
committed
Refactor the read/write/erase to event listening
1 parent 9c314b1 commit fa8b841

File tree

4 files changed

+236
-91
lines changed

4 files changed

+236
-91
lines changed

demo/index.ts

Lines changed: 76 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { saveAs } from "file-saver";
2-
import { WebDFUType, WebDFU } from "dfu";
2+
import { WebDFUType, WebDFU } from "dfu/index";
33

44
import { clearLog, logError, logInfo, logProgress, logWarning, setLogContext } from "./log";
55

@@ -317,15 +317,31 @@ uploadButton.addEventListener("click", async function (event) {
317317
maxSize = parseInt(dfuseUploadSizeField.value);
318318
}
319319

320-
try {
321-
const blob = await webdfu.read(transferSize, maxSize);
320+
const process = webdfu.read(transferSize, maxSize);
322321

323-
saveAs(blob, "firmware.bin");
324-
} catch (error) {
325-
logError(error);
322+
// after start
323+
if (webdfu?.type === WebDFUType.SDFUse) {
324+
logInfo(`Reading up to 0x${maxSize.toString(16)} bytes starting at 0x${webdfu.dfuseStartAddress.toString(16)}`);
326325
}
327326

328-
setLogContext(null);
327+
logInfo("Copying data from DFU device to browser");
328+
329+
process.events.on("process", (done, total) => {
330+
logProgress(done, total);
331+
});
332+
333+
process.events.on("error", (error) => {
334+
logError(error);
335+
setLogContext(null);
336+
});
337+
338+
process.events.on("end", (blob) => {
339+
console.log("end?");
340+
logInfo(`Read ${blob.size} bytes`);
341+
setLogContext(null);
342+
343+
saveAs(blob, "firmware.bin");
344+
});
329345
}
330346

331347
return false;
@@ -363,27 +379,65 @@ async function download(): Promise<void> {
363379
logWarning("Failed to clear status");
364380
}
365381

366-
try {
367-
await webdfu.write(transferSize, firmwareFile, manifestationTolerant);
382+
let process = webdfu.write(transferSize, firmwareFile, manifestationTolerant);
383+
384+
// Erase
385+
process.events.on("erase/start", () => {
386+
console.log("erase/start!");
387+
logInfo("Erasing DFU device memory");
388+
});
389+
390+
process.events.on("erase/process", (bytesSent, expectedSize) => {
391+
logProgress(bytesSent, expectedSize);
392+
});
368393

394+
process.events.on("erase/end", () => {
395+
logInfo("Success erased");
396+
});
397+
398+
// Write firmware
399+
process.events.on("write/start", () => {
400+
logInfo("Copying data from browser to DFU device");
401+
});
402+
403+
process.events.on("write/process", (bytesSent, expectedSize) => {
404+
logProgress(bytesSent, expectedSize);
405+
});
406+
407+
process.events.on("write/end", (bytes_sent: number) => {
408+
logInfo(`Wrote ${bytes_sent} bytes`);
409+
logInfo("Manifesting new firmware");
410+
411+
webdfu
412+
?.getStatus()
413+
.then((status) => {
414+
logInfo(`Final DFU status: state=${status.state}, status=${status.status}`);
415+
})
416+
.catch(() => {});
417+
});
418+
419+
process.events.on("error", (error) => {
420+
logError(error);
421+
setLogContext(null);
422+
});
423+
424+
process.events.on("end", () => {
369425
logInfo("Done!");
370426
setLogContext(null);
371427

372428
if (!manifestationTolerant) {
373-
try {
374-
await webdfu.waitDisconnected(5000);
375-
376-
onDisconnect();
377-
webdfu = null;
378-
} catch (error) {
379-
// It didn't reset and disconnect for some reason...
380-
console.log("Device unexpectedly tolerated manifestation.");
381-
}
429+
webdfu
430+
?.waitDisconnected(5000)
431+
.then(() => {
432+
onDisconnect();
433+
webdfu = null;
434+
})
435+
.catch(() => {
436+
// It didn't reset and disconnect for some reason...
437+
console.error("Device unexpectedly tolerated manifestation.");
438+
});
382439
}
383-
} catch (error) {
384-
logError(error);
385-
setLogContext(null);
386-
}
440+
});
387441
}
388442
}
389443

demo/log.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ export function logError(msg: string): void {
4141
export function logProgress(done: number, total?: number): void {
4242
if (logContext) {
4343
let progressBar: HTMLProgressElement | null = null;
44-
4544
if (logContext?.lastElementChild?.tagName.toLowerCase() == "progress") {
4645
progressBar = logContext.lastElementChild as HTMLProgressElement;
4746
}
@@ -52,8 +51,7 @@ export function logProgress(done: number, total?: number): void {
5251
}
5352

5453
progressBar.value = done;
55-
56-
if (typeof total !== "undefined") {
54+
if (total !== undefined) {
5755
progressBar.max = total;
5856
}
5957
}

0 commit comments

Comments
 (0)