diff --git a/lib/usb.ts b/lib/usb.ts index 5be6b4f..29c1e9d 100644 --- a/lib/usb.ts +++ b/lib/usb.ts @@ -52,6 +52,7 @@ export class MicrobitWebUSBConnection ? ConnectionStatus.NO_AUTHORIZED_DEVICE : ConnectionStatus.NOT_SUPPORTED; + private exclusionFilters: USBDeviceFilter[] | undefined; /** * The USB device we last connected to. * Cleared if it is disconnected. @@ -175,6 +176,10 @@ export class MicrobitWebUSBConnection } } + setRequestDeviceExclusionFilters(exclusionFilters: USBDeviceFilter[]) { + this.exclusionFilters = exclusionFilters; + } + async connect(): Promise { return this.withEnrichedErrors(async () => { await this.connectInternal(); @@ -421,6 +426,7 @@ export class MicrobitWebUSBConnection } this.dispatchTypedEvent("beforerequestdevice", new BeforeRequestDevice()); this.device = await navigator.usb.requestDevice({ + exclusionFilters: this.exclusionFilters, filters: [{ vendorId: 0x0d28, productId: 0x0204 }], }); this.dispatchTypedEvent("afterrequestdevice", new AfterRequestDevice()); diff --git a/src/demo.ts b/src/demo.ts index f144be0..032815b 100644 --- a/src/demo.ts +++ b/src/demo.ts @@ -83,6 +83,7 @@ recreateUi("usb"); const createConnectSection = (type: ConnectionType): Section => { const statusParagraph = crelt("p"); let name = ""; + let exclusionFilters = JSON.stringify([{ serialNumber: "XXXX" }]); const dom = crelt( "section", crelt("h2", "Connect"), @@ -119,10 +120,38 @@ const createConnectSection = (type: ConnectionType): Section => { }, }), ), + type === "usb" + ? crelt( + "label", + "Exclusion filters", + crelt("input", { + type: "text", + value: exclusionFilters, + onchange: (e: Event) => { + exclusionFilters = (e.currentTarget as HTMLInputElement).value; + }, + }), + ) + : undefined, crelt( "button", { onclick: () => { + if (type === "usb") { + let parsedExclusionFilters; + try { + if (exclusionFilters) { + parsedExclusionFilters = JSON.parse(exclusionFilters); + } + } catch (err) { + console.error("Invalid exclusion filters"); + } + ( + connection as MicrobitWebUSBConnection + ).setRequestDeviceExclusionFilters(parsedExclusionFilters); + } else if (type === "bluetooth") { + (connection as MicrobitWebBluetoothConnection).setNameFilter(name); + } void connection.connect(); }, },