Skip to content

Commit 9c314b1

Browse files
author
Nikolay Govorov
committed
Join the driver and app classes
1 parent 5424e8e commit 9c314b1

File tree

4 files changed

+662
-676
lines changed

4 files changed

+662
-676
lines changed

core.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,9 @@ export type WebDFUProperties = {
9090
DFUVersion: number;
9191
};
9292

93-
export type WebDFULog = Partial<
94-
Record<"info" | "warning", (msg: string) => void> & {
95-
progress: (done: number, total?: number) => void;
96-
}
97-
>;
93+
export type WebDFULog = Record<"info" | "warning", (msg: string) => void> & {
94+
progress: (done: number, total?: number) => void;
95+
};
9896

9997
export const WebDFUType: Record<"DFU" | "SDFUse", number> = {
10098
DFU: 1,

demo/index.ts

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

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

@@ -37,21 +37,21 @@ function niceSize(n: number) {
3737
}
3838
}
3939

40-
function formatDFUSummary(device: DriverDFU) {
40+
function formatDFUSummary(device: WebDFU) {
4141
const vid = hex4(device.device.vendorId);
4242
const pid = hex4(device.device.productId);
4343
const name = device.device.productName;
4444

4545
let mode = "Unknown";
46-
if (device.settings.alternate.interfaceProtocol == 0x01) {
46+
if (device.currentInterfaceSettings?.alternate.interfaceProtocol == 0x01) {
4747
mode = "Runtime";
48-
} else if (device.settings.alternate.interfaceProtocol == 0x02) {
48+
} else if (device.currentInterfaceSettings?.alternate.interfaceProtocol == 0x02) {
4949
mode = "DFU";
5050
}
5151

52-
const cfg = device.settings.configuration.configurationValue;
53-
const intf = device.settings["interface"].interfaceNumber;
54-
const alt = device.settings.alternate.alternateSetting;
52+
const cfg = device.currentInterfaceSettings?.configuration.configurationValue;
53+
const intf = device.currentInterfaceSettings?.["interface"].interfaceNumber;
54+
const alt = device.currentInterfaceSettings?.alternate.alternateSetting;
5555
const serial = device.device.serialNumber;
5656

5757
return `${mode}: [${vid}:${pid}] cfg=${cfg}, intf=${intf}, alt=${alt}, name="${name}" serial="${serial}"`;
@@ -112,10 +112,6 @@ async function connect(interfaceIndex: number) {
112112

113113
await webdfu.connect(interfaceIndex);
114114

115-
if (!webdfu.driver) {
116-
throw new Error();
117-
}
118-
119115
let memorySummary = "";
120116
if (webdfu.properties) {
121117
const desc = webdfu.properties;
@@ -138,7 +134,7 @@ async function connect(interfaceIndex: number) {
138134
manifestationTolerant = webdfu.properties.ManifestationTolerant;
139135
}
140136

141-
if (webdfu.driver.settings.alternate.interfaceProtocol == 0x02) {
137+
if (webdfu.currentInterfaceSettings?.alternate.interfaceProtocol == 0x02) {
142138
if (!desc.CanUpload) {
143139
uploadButton.disabled = false;
144140
dfuseUploadSizeField.disabled = true;
@@ -150,13 +146,13 @@ async function connect(interfaceIndex: number) {
150146
}
151147

152148
if (webdfu.type === WebDFUType.SDFUse) {
153-
if (webdfu.driver.dfuseMemoryInfo) {
149+
if (webdfu.dfuseMemoryInfo) {
154150
let totalSize = 0;
155-
for (const segment of webdfu.driver.dfuseMemoryInfo.segments) {
151+
for (const segment of webdfu.dfuseMemoryInfo.segments) {
156152
totalSize += segment.end - segment.start;
157153
}
158-
memorySummary = `Selected memory region: ${webdfu.driver.dfuseMemoryInfo.name} (${niceSize(totalSize)})`;
159-
for (const segment of webdfu.driver.dfuseMemoryInfo.segments) {
154+
memorySummary = `Selected memory region: ${webdfu.dfuseMemoryInfo.name} (${niceSize(totalSize)})`;
155+
for (const segment of webdfu.dfuseMemoryInfo.segments) {
160156
const properties = [];
161157
if (segment.readable) {
162158
properties.push("readable");
@@ -186,19 +182,19 @@ async function connect(interfaceIndex: number) {
186182
statusDisplay.textContent = "";
187183
connectButton.textContent = "Disconnect";
188184
infoDisplay.textContent =
189-
`Name: ${webdfu.driver.device.productName}\n` +
190-
`MFG: ${webdfu.driver.device.manufacturerName}\n` +
191-
`Serial: ${webdfu.driver.device.serialNumber}\n`;
185+
`Name: ${webdfu.device.productName}\n` +
186+
`MFG: ${webdfu.device.manufacturerName}\n` +
187+
`Serial: ${webdfu.device.serialNumber}\n`;
192188

193189
// Display basic dfu-util style info
194-
if (webdfu.driver) {
195-
dfuDisplay.textContent = formatDFUSummary(webdfu.driver) + "\n" + memorySummary;
190+
if (webdfu) {
191+
dfuDisplay.textContent = formatDFUSummary(webdfu) + "\n" + memorySummary;
196192
} else {
197193
dfuDisplay.textContent = "Not found";
198194
}
199195

200196
// Update buttons based on capabilities
201-
if (webdfu.driver?.settings.alternate.interfaceProtocol == 0x01) {
197+
if (webdfu.currentInterfaceSettings?.alternate.interfaceProtocol == 0x01) {
202198
// Runtime
203199
uploadButton.disabled = false;
204200
downloadButton.disabled = true;
@@ -210,16 +206,16 @@ async function connect(interfaceIndex: number) {
210206
firmwareFileField.disabled = false;
211207
}
212208

213-
if (webdfu.type === WebDFUType.SDFUse && webdfu.driver.dfuseMemoryInfo) {
209+
if (webdfu.type === WebDFUType.SDFUse && webdfu.dfuseMemoryInfo) {
214210
const dfuseFieldsDiv = document.querySelector("#dfuseFields") as HTMLDivElement;
215211
dfuseFieldsDiv.hidden = false;
216212
dfuseStartAddressField.disabled = false;
217213
dfuseUploadSizeField.disabled = false;
218-
const segment = webdfu.driver.getDfuseFirstWritableSegment();
214+
const segment = webdfu.getDfuseFirstWritableSegment();
219215
if (segment) {
220-
webdfu.driver.dfuseStartAddress = segment.start;
216+
webdfu.dfuseStartAddress = segment.start;
221217
dfuseStartAddressField.value = "0x" + segment.start.toString(16);
222-
const maxReadSize = webdfu.driver.getDfuseMaxReadSize(segment.start);
218+
const maxReadSize = webdfu.getDfuseMaxReadSize(segment.start);
223219
dfuseUploadSizeField.value = maxReadSize.toString();
224220
dfuseUploadSizeField.max = maxReadSize.toString();
225221
}
@@ -229,8 +225,6 @@ async function connect(interfaceIndex: number) {
229225
dfuseStartAddressField.disabled = true;
230226
dfuseUploadSizeField.disabled = true;
231227
}
232-
233-
return webdfu.driver;
234228
}
235229

236230
transferSizeField.addEventListener("change", () => {
@@ -242,12 +236,12 @@ dfuseStartAddressField.addEventListener("change", function (event) {
242236
const address = parseInt(field.value, 16);
243237
if (isNaN(address)) {
244238
field.setCustomValidity("Invalid hexadecimal start address");
245-
} else if (webdfu?.driver && webdfu.type === WebDFUType.SDFUse && webdfu?.driver?.dfuseMemoryInfo) {
246-
if (webdfu?.driver.getDfuseSegment(address) !== null) {
247-
webdfu.driver.dfuseStartAddress = address;
239+
} else if (webdfu && webdfu.type === WebDFUType.SDFUse && webdfu?.dfuseMemoryInfo) {
240+
if (webdfu.getDfuseSegment(address) !== null) {
241+
webdfu.dfuseStartAddress = address;
248242
field.setCustomValidity("");
249-
if (webdfu?.driver && webdfu.type === WebDFUType.SDFUse) {
250-
dfuseUploadSizeField.max = webdfu.driver.getDfuseMaxReadSize(address).toString();
243+
if (webdfu && webdfu.type === WebDFUType.SDFUse) {
244+
dfuseUploadSizeField.max = webdfu.getDfuseMaxReadSize(address).toString();
251245
}
252246
} else {
253247
field.setCustomValidity("Address outside of memory map");
@@ -304,18 +298,18 @@ uploadButton.addEventListener("click", async function (event) {
304298
return false;
305299
}
306300

307-
if (!webdfu?.driver || !webdfu?.driver.device.opened) {
301+
if (!webdfu || !webdfu.device.opened) {
308302
onDisconnect();
309303
webdfu = null;
310304
} else {
311305
setLogContext(uploadLog);
312306
clearLog(uploadLog);
313307
try {
314-
if (await webdfu?.driver?.isError()) {
315-
await webdfu?.driver.clearStatus();
308+
if (await webdfu.isError()) {
309+
await webdfu.clearStatus();
316310
}
317311
} catch (error) {
318-
webdfu?.driver.logWarning("Failed to clear status");
312+
logWarning("Failed to clear status");
319313
}
320314

321315
let maxSize = Infinity;
@@ -324,7 +318,7 @@ uploadButton.addEventListener("click", async function (event) {
324318
}
325319

326320
try {
327-
const blob = await webdfu?.driver.do_read(transferSize, maxSize);
321+
const blob = await webdfu.read(transferSize, maxSize);
328322

329323
saveAs(blob, "firmware.bin");
330324
} catch (error) {
@@ -357,16 +351,16 @@ async function download(): Promise<void> {
357351
return;
358352
}
359353

360-
if (webdfu?.driver && firmwareFile != null) {
354+
if (webdfu && firmwareFile != null) {
361355
setLogContext(downloadLog);
362356
clearLog(downloadLog);
363357

364358
try {
365-
if (await webdfu?.driver?.isError()) {
366-
await webdfu?.driver.clearStatus();
359+
if (await webdfu.isError()) {
360+
await webdfu.clearStatus();
367361
}
368362
} catch (error) {
369-
webdfu?.driver.logWarning("Failed to clear status");
363+
logWarning("Failed to clear status");
370364
}
371365

372366
try {
@@ -377,7 +371,7 @@ async function download(): Promise<void> {
377371

378372
if (!manifestationTolerant) {
379373
try {
380-
await webdfu?.driver.waitDisconnected(5000);
374+
await webdfu.waitDisconnected(5000);
381375

382376
onDisconnect();
383377
webdfu = null;

0 commit comments

Comments
 (0)