From c22240b25d3b07165a48172d9a3d893f8d966df7 Mon Sep 17 00:00:00 2001 From: Florence Haudin Date: Tue, 6 May 2025 15:15:01 +0200 Subject: [PATCH 1/5] Improve bluetoothManager class. --- src/bluetooth-extension/index.ts | 16 ++-- src/bluetooth/BluetoothDeviceRunningItem.ts | 4 +- src/bluetooth/BluetoothManager.ts | 87 +++++++++------------ src/movehub-extension/index.ts | 14 ++-- src/movehub-extension/widget.tsx | 2 +- 5 files changed, 55 insertions(+), 68 deletions(-) diff --git a/src/bluetooth-extension/index.ts b/src/bluetooth-extension/index.ts index dc3170f..b65a053 100644 --- a/src/bluetooth-extension/index.ts +++ b/src/bluetooth-extension/index.ts @@ -16,7 +16,7 @@ import { export namespace CommandIDs { export const openDeviceRegistryDialog = 'bluetooth-manager:open-dialog-for-devices-registry'; - export const disconnectDevice = 'bluetooth-manager:disconnect-device'; + export const disconnect = 'bluetooth-manager:disconnect-device'; } export function buildCompleteIdentifier(native: BluetoothDevice): string { @@ -67,13 +67,13 @@ const BluetoothSidebarPlugin: JupyterFrontEndPlugin = { const openDeviceRegistryDialogLabel = trans.__('Add a Device'); let runningItemsList: Array; - app.commands.addCommand(CommandIDs.disconnectDevice, { + app.commands.addCommand(CommandIDs.disconnect, { execute: args => { const selectedDevice = bluetoothManager.deviceList.find( device => device.native.id === (args.deviceID as string) ); if (selectedDevice) { - bluetoothManager.disconnectDevice(selectedDevice); + bluetoothManager.disconnect(selectedDevice); return selectedDevice; } else { throw new Error('No device provided or device is invalid'); @@ -87,16 +87,16 @@ const BluetoothSidebarPlugin: JupyterFrontEndPlugin = { execute: async () => { showDialog({ title: 'Select device type', - body: new DropDownRegistry(bluetoothManager.registry), + body: new DropDownRegistry(bluetoothManager.deviceTypeRegistry), buttons: [ Dialog.okButton({ label: 'Select' }), Dialog.cancelButton({ label: 'Cancel' }) ] }).then(async result => { if (result.button.accept) { - bluetoothManager.registry.itemsList.forEach(async item => { + bluetoothManager.deviceTypeRegistry.itemsList.forEach(async item => { if (item.deviceType === result.value) { - await bluetoothManager.connectDevice(item); + await bluetoothManager.connect(item); } else { console.warn('There is no corresponding item in the registry!'); } @@ -151,7 +151,7 @@ export class DropDownRegistry extends Widget implements Dialog.IBodyWidget { - constructor(registry: BluetoothManager.DeviceRegistry) { + constructor(registry: BluetoothManager.DeviceTypeRegistry) { super(); this._selectList = document.createElement('select'); this.node.appendChild(this._selectList); @@ -169,7 +169,7 @@ export class DropDownRegistry } private _selectList: HTMLSelectElement; - public registry: BluetoothManager.DeviceRegistry; + public registry: BluetoothManager.DeviceTypeRegistry; } const BluetoothExtensionPlugins: JupyterFrontEndPlugin[] = [ diff --git a/src/bluetooth/BluetoothDeviceRunningItem.ts b/src/bluetooth/BluetoothDeviceRunningItem.ts index 158794c..3d4373f 100644 --- a/src/bluetooth/BluetoothDeviceRunningItem.ts +++ b/src/bluetooth/BluetoothDeviceRunningItem.ts @@ -5,7 +5,7 @@ import { buildCompleteIdentifier } from '../bluetooth-extension'; import { Menu } from '@lumino/widgets'; import { CommandRegistry } from '@lumino/commands'; -export const disconnectDevice = 'bluetooth-manager:disconnect-device'; +export const disconnect = 'bluetooth-manager:disconnect-device'; export class BluetoothDeviceRunningItem implements IRunningSessions.IRunningItem @@ -58,7 +58,7 @@ export class BluetoothDeviceRunningItem } shutdown() { - this.bluetoothManager.disconnectDevice(this._device); + this.bluetoothManager.disconnect(this._device); } private _device: BluetoothManager.Device; diff --git a/src/bluetooth/BluetoothManager.ts b/src/bluetooth/BluetoothManager.ts index c08376d..e44d9e7 100644 --- a/src/bluetooth/BluetoothManager.ts +++ b/src/bluetooth/BluetoothManager.ts @@ -15,9 +15,9 @@ export class BluetoothManager implements IBluetoothManager { ); this.registeredByAPlugin = new Signal< this, - BluetoothManager.DeviceRegistry + BluetoothManager.DeviceTypeRegistry >(this); - this._registry = new BluetoothManager.DeviceRegistry(); + this._deviceTypeRegistry = new BluetoothManager.DeviceTypeRegistry(); this._deviceList = []; this._identifierRegistry = []; } @@ -26,54 +26,50 @@ export class BluetoothManager implements IBluetoothManager { return this._deviceList; } - get registry(): BluetoothManager.DeviceRegistry { - return this._registry; + get deviceTypeRegistry(): BluetoothManager.DeviceTypeRegistry { + return this._deviceTypeRegistry; } - get identifierRegistry(): Array { - return this._identifierRegistry; - } - - async connectDevice( - registryItem: IDeviceRegistryItem + async connect( + registryItem: IDeviceTypeRegistryItem ): Promise { const native = await this.requestDevice(registryItem); if (native) { const device = await registryItem.factory(native); if (device && device.isConnected) { - this.addDeviceToList(device); + this._addDeviceToList(device); device.disconnected.connect(async () => { - this.removeDeviceFromList(device); + this._removeDeviceFromList(device); }); return device; } } } - async disconnectDevice(device: BluetoothManager.Device) { + async disconnect(device: BluetoothManager.Device) { await device.disconnect(); device.dispose(); } // Method to add a device to the list - addDeviceToList(device: BluetoothManager.Device): void { + private _addDeviceToList(device: BluetoothManager.Device): void { const identifier = buildCompleteIdentifier(device.native); - if (this.identifierRegistry.includes(identifier) === false) { + if (this._identifierRegistry.includes(identifier) === false) { this._deviceList.push(device); - this.identifierRegistry.push(identifier); + this._identifierRegistry.push(identifier); } else { - console.warn('The device is already in the identifierRegistry'); + console.warn('The device is already in the registry of identifiers'); } // Emit the signal when the list changes this.deviceListChanged.emit(this._deviceList); } // Method to remove a device from the list - removeDeviceFromList(device: BluetoothManager.Device): void { + private _removeDeviceFromList(device: BluetoothManager.Device): void { const index = this._deviceList.indexOf(device); if (index > -1) { this._deviceList.splice(index, 1); - this.identifierRegistry.splice(index, 1); + this._identifierRegistry.splice(index, 1); // Emit the signal when the list changes this.deviceListChanged.emit(this._deviceList); } @@ -82,20 +78,11 @@ export class BluetoothManager implements IBluetoothManager { removeAllDevices() { this._deviceList.forEach((device, index) => { - this.removeDeviceFromList(device); + this._removeDeviceFromList(device); this.deviceListChanged.emit(this._deviceList); }); } - register(registryItem: IDeviceRegistryItem) { - this._registry.add(registryItem); - this.registeredByAPlugin.emit(this._registry); - console.warn( - `New item from category ${registryItem.deviceType} is added to the registry.` - ); - return this._registry; - } - async checkWebBluetoothSupport(): Promise { const isWebBluetoothSupported: boolean = navigator.bluetooth ? true : false; if (isWebBluetoothSupported === false) { @@ -109,7 +96,7 @@ export class BluetoothManager implements IBluetoothManager { } async requestDevice( - registryItem: IDeviceRegistryItem + registryItem: IDeviceTypeRegistryItem ): Promise { const isWebBluetoothSupported = await this.checkWebBluetoothSupport(); if (isWebBluetoothSupported) { @@ -126,9 +113,9 @@ export class BluetoothManager implements IBluetoothManager { public deviceListChanged: Signal>; public registeredByAPlugin: Signal< BluetoothManager, - BluetoothManager.DeviceRegistry + BluetoothManager.DeviceTypeRegistry >; - private _registry: BluetoothManager.DeviceRegistry; + private _deviceTypeRegistry: BluetoothManager.DeviceTypeRegistry; private _identifierRegistry: Array; } @@ -283,18 +270,18 @@ export namespace BluetoothManager { } } - export class DeviceRegistry implements IDeviceRegistry { - private _registry: Array; - public registryItem: IDeviceRegistryItem; + export class DeviceTypeRegistry implements IDeviceTypeRegistry { + private _deviceTypeRegistry: Array; + public registryItem: IDeviceTypeRegistryItem; constructor() { - this._registry = []; + this._deviceTypeRegistry = []; } - add(registryItem: IDeviceRegistryItem) { - this._registry.push(registryItem); + add(registryItem: IDeviceTypeRegistryItem) { + this._deviceTypeRegistry.push(registryItem); } - get itemsList(): Array { - return this._registry; + get itemsList(): Array { + return this._deviceTypeRegistry; } } } @@ -303,23 +290,19 @@ export namespace BluetoothManager { * Interface for the bluetooth manager. */ export interface IBluetoothManager { - addDeviceToList(Device: BluetoothManager.Device): void; - removeDeviceFromList(Device: BluetoothManager.Device): void; removeAllDevices(Devices: Array): void; - register(registryItem: IDeviceRegistryItem): BluetoothManager.DeviceRegistry; - connectDevice(registryItem: IDeviceRegistryItem): any; - disconnectDevice(device: BluetoothManager.Device): void; + connect(registryItem: IDeviceTypeRegistryItem): any; + disconnect(device: BluetoothManager.Device): void; deviceListChanged: Signal>; registeredByAPlugin: Signal< BluetoothManager, - BluetoothManager.DeviceRegistry + BluetoothManager.DeviceTypeRegistry >; get deviceList(): Array; - get registry(): BluetoothManager.DeviceRegistry; - get identifierRegistry(): Array; + get deviceTypeRegistry(): BluetoothManager.DeviceTypeRegistry; } -export interface IDeviceRegistryItem { +export interface IDeviceTypeRegistryItem { deviceType: string; factory: ( native: BluetoothDevice @@ -327,9 +310,9 @@ export interface IDeviceRegistryItem { options: IDeviceOptions; } -export interface IDeviceRegistry { - add: (registryItem: IDeviceRegistryItem) => void; - get itemsList(): Array; +export interface IDeviceTypeRegistry { + add: (registryItem: IDeviceTypeRegistryItem) => void; + get itemsList(): Array; } export const IBluetoothManager = new Token( diff --git a/src/movehub-extension/index.ts b/src/movehub-extension/index.ts index 19b2505..e8ffbb6 100644 --- a/src/movehub-extension/index.ts +++ b/src/movehub-extension/index.ts @@ -6,7 +6,7 @@ import { ITranslator } from '@jupyterlab/translation'; import { IThemeManager, MainAreaWidget } from '@jupyterlab/apputils'; import { Toolbar } from '@jupyterlab/ui-components'; import { - IDeviceRegistryItem, + IDeviceTypeRegistryItem, IBluetoothManager, BluetoothManager } from '../bluetooth/BluetoothManager'; @@ -27,7 +27,7 @@ export const connectMoveHub = 'bluetooth-manager:connect-movehub'; export const disconnectMoveHub = 'bluetooth-manager:disconnect-movehub'; export const moveHubServiceUUID = '00001623-1212-efde-1623-785feabcd123'; export const moveHubCharacteristicUUID = '00001624-1212-efde-1623-785feabcd123'; -export const movehubRegistryItem: IDeviceRegistryItem = { +export const movehubRegistryItem: IDeviceTypeRegistryItem = { deviceType: 'LEGO® Move Hub', options: { acceptAllDevices: false, @@ -56,7 +56,11 @@ const MoveHubRegisterPlugin: JupyterFrontEndPlugin = { bluetoothManager: BluetoothManager ): void => { console.log('JupyterLab move-hub-register plugin is activated!'); - bluetoothManager.register(movehubRegistryItem); + bluetoothManager.deviceTypeRegistry.add(movehubRegistryItem); + bluetoothManager.registeredByAPlugin.emit(bluetoothManager.deviceTypeRegistry); + console.warn( + `New item from category ${movehubRegistryItem} is added to the registry.` + ); } }; @@ -125,7 +129,7 @@ const LEGOMoveHubControlPanelPlugin: JupyterFrontEndPlugin = { device => device.native.id === (args.deviceID as string) ); if (selectedDevice && selectedDevice instanceof MoveHub) { - bluetoothManager.disconnectDevice(selectedDevice); + bluetoothManager.disconnect(selectedDevice); return selectedDevice; } else { throw new Error('No device provided or device is invalid'); @@ -151,7 +155,7 @@ const LEGOMoveHubControlPanelPlugin: JupyterFrontEndPlugin = { app.commands.addCommand(connectMoveHub, { execute: args => { - const newDevice = bluetoothManager.connectDevice(movehubRegistryItem); + const newDevice = bluetoothManager.connect(movehubRegistryItem); return newDevice; }, caption: 'Connect MoveHub', diff --git a/src/movehub-extension/widget.tsx b/src/movehub-extension/widget.tsx index f5d7dd1..789ca4b 100644 --- a/src/movehub-extension/widget.tsx +++ b/src/movehub-extension/widget.tsx @@ -174,7 +174,7 @@ export class MoveHubModel extends DOMWidgetModel { console.log('not connected yet');*/ if (identifier === '') { this.movehub = - await MoveHubModel.bluetoothManager.connectDevice(movehubRegistryItem); + await MoveHubModel.bluetoothManager.connect(movehubRegistryItem); } else { const selectedDevice = MoveHubModel.bluetoothManager.deviceList.find( device => device.native.id === identifier From 3af1e3a00d707eb3f27cd9714ba3ed906e7e4bd6 Mon Sep 17 00:00:00 2001 From: Florence Haudin Date: Tue, 6 May 2025 23:44:17 +0200 Subject: [PATCH 2/5] Move the registeredByAPlugin signal to the DeviceRegistryItem class. --- src/bluetooth-extension/index.ts | 16 ++++++---- src/bluetooth/BluetoothManager.ts | 53 +++++++++++-------------------- src/movehub-extension/index.ts | 4 ++- 3 files changed, 32 insertions(+), 41 deletions(-) diff --git a/src/bluetooth-extension/index.ts b/src/bluetooth-extension/index.ts index b65a053..a3db5ec 100644 --- a/src/bluetooth-extension/index.ts +++ b/src/bluetooth-extension/index.ts @@ -94,13 +94,17 @@ const BluetoothSidebarPlugin: JupyterFrontEndPlugin = { ] }).then(async result => { if (result.button.accept) { - bluetoothManager.deviceTypeRegistry.itemsList.forEach(async item => { - if (item.deviceType === result.value) { - await bluetoothManager.connect(item); - } else { - console.warn('There is no corresponding item in the registry!'); + bluetoothManager.deviceTypeRegistry.itemsList.forEach( + async item => { + if (item.deviceType === result.value) { + await bluetoothManager.connect(item); + } else { + console.warn( + 'There is no corresponding item in the registry!' + ); + } } - }); + ); } }); } diff --git a/src/bluetooth/BluetoothManager.ts b/src/bluetooth/BluetoothManager.ts index e44d9e7..9ddf720 100644 --- a/src/bluetooth/BluetoothManager.ts +++ b/src/bluetooth/BluetoothManager.ts @@ -13,10 +13,6 @@ export class BluetoothManager implements IBluetoothManager { this.deviceListChanged = new Signal>( this ); - this.registeredByAPlugin = new Signal< - this, - BluetoothManager.DeviceTypeRegistry - >(this); this._deviceTypeRegistry = new BluetoothManager.DeviceTypeRegistry(); this._deviceList = []; this._identifierRegistry = []; @@ -191,32 +187,6 @@ export namespace BluetoothManager { } } - /*async connectAndGetAllServices(): Promise< - Array | undefined - > { - this.native.addEventListener('gattserverdisconnected', event => { - this.isConnected = false; - this.disconnected.emit(true); - }); - const server = this.native.gatt - if (server) { - server.connect(); - if (server.connected === true) { - const services = await server.getPrimaryServices(); - this.isConnected = true; - if (!services || services.length === 0) { - throw new Error('Server exists but no service found on the device.'); - } else { return services; } - } - else { - throw new Error('There is no connection to server. No attempt to get a service.') - } - } - else { - throw new Error('Server is not defined.'); - } - }*/ - async disconnect(): Promise { if (this.native) { this.native.gatt?.disconnect(); @@ -272,9 +242,18 @@ export namespace BluetoothManager { export class DeviceTypeRegistry implements IDeviceTypeRegistry { private _deviceTypeRegistry: Array; + private _registeredByAPlugin: Signal< + this, + BluetoothManager.DeviceTypeRegistry + >; + public registryItem: IDeviceTypeRegistryItem; constructor() { this._deviceTypeRegistry = []; + this._registeredByAPlugin = new Signal< + this, + BluetoothManager.DeviceTypeRegistry + >(this); } add(registryItem: IDeviceTypeRegistryItem) { @@ -283,6 +262,12 @@ export namespace BluetoothManager { get itemsList(): Array { return this._deviceTypeRegistry; } + get registeredByAPlugin(): Signal< + this, + BluetoothManager.DeviceTypeRegistry + > { + return this._registeredByAPlugin; + } } } @@ -294,10 +279,6 @@ export interface IBluetoothManager { connect(registryItem: IDeviceTypeRegistryItem): any; disconnect(device: BluetoothManager.Device): void; deviceListChanged: Signal>; - registeredByAPlugin: Signal< - BluetoothManager, - BluetoothManager.DeviceTypeRegistry - >; get deviceList(): Array; get deviceTypeRegistry(): BluetoothManager.DeviceTypeRegistry; } @@ -313,6 +294,10 @@ export interface IDeviceTypeRegistryItem { export interface IDeviceTypeRegistry { add: (registryItem: IDeviceTypeRegistryItem) => void; get itemsList(): Array; + get registeredByAPlugin(): Signal< + IDeviceTypeRegistry, + BluetoothManager.DeviceTypeRegistry + >; } export const IBluetoothManager = new Token( diff --git a/src/movehub-extension/index.ts b/src/movehub-extension/index.ts index e8ffbb6..575e6c0 100644 --- a/src/movehub-extension/index.ts +++ b/src/movehub-extension/index.ts @@ -57,7 +57,9 @@ const MoveHubRegisterPlugin: JupyterFrontEndPlugin = { ): void => { console.log('JupyterLab move-hub-register plugin is activated!'); bluetoothManager.deviceTypeRegistry.add(movehubRegistryItem); - bluetoothManager.registeredByAPlugin.emit(bluetoothManager.deviceTypeRegistry); + bluetoothManager.deviceTypeRegistry.registeredByAPlugin.emit( + bluetoothManager.deviceTypeRegistry + ); console.warn( `New item from category ${movehubRegistryItem} is added to the registry.` ); From 5622f8670b8df96a54842a4dd0b0b7121f6640c9 Mon Sep 17 00:00:00 2001 From: Florence Haudin <99649086+HaudinFlorence@users.noreply.github.com> Date: Fri, 9 May 2025 14:39:05 +0200 Subject: [PATCH 3/5] Update src/bluetooth/BluetoothManager.ts Co-authored-by: Afshin Taylor Darian --- src/bluetooth/BluetoothManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bluetooth/BluetoothManager.ts b/src/bluetooth/BluetoothManager.ts index 9ddf720..8bfb6a8 100644 --- a/src/bluetooth/BluetoothManager.ts +++ b/src/bluetooth/BluetoothManager.ts @@ -293,7 +293,7 @@ export interface IDeviceTypeRegistryItem { export interface IDeviceTypeRegistry { add: (registryItem: IDeviceTypeRegistryItem) => void; - get itemsList(): Array; + get deviceTypes(): IDeviceTypeRegistryItem[]; get registeredByAPlugin(): Signal< IDeviceTypeRegistry, BluetoothManager.DeviceTypeRegistry From b4aa1e08c49ffa7028f1527ee0a714dd12d5fdd8 Mon Sep 17 00:00:00 2001 From: Florence Haudin Date: Fri, 9 May 2025 16:15:27 +0200 Subject: [PATCH 4/5] Take review comments about signals into account. --- src/bluetooth-extension/index.ts | 4 +- src/bluetooth/BluetoothManager.ts | 90 +++++++++++++++---------------- src/movehub-extension/index.ts | 12 ++--- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/src/bluetooth-extension/index.ts b/src/bluetooth-extension/index.ts index a3db5ec..684a774 100644 --- a/src/bluetooth-extension/index.ts +++ b/src/bluetooth-extension/index.ts @@ -94,7 +94,7 @@ const BluetoothSidebarPlugin: JupyterFrontEndPlugin = { ] }).then(async result => { if (result.button.accept) { - bluetoothManager.deviceTypeRegistry.itemsList.forEach( + bluetoothManager.deviceTypeRegistry.deviceTypes.forEach( async item => { if (item.deviceType === result.value) { await bluetoothManager.connect(item); @@ -160,7 +160,7 @@ export class DropDownRegistry this._selectList = document.createElement('select'); this.node.appendChild(this._selectList); this.registry = registry; - registry.itemsList.forEach(item => { + registry.deviceTypes.forEach(item => { const option = document.createElement('option'); option.value = item.deviceType; option.text = item.deviceType; diff --git a/src/bluetooth/BluetoothManager.ts b/src/bluetooth/BluetoothManager.ts index 8bfb6a8..acd03a1 100644 --- a/src/bluetooth/BluetoothManager.ts +++ b/src/bluetooth/BluetoothManager.ts @@ -241,65 +241,65 @@ export namespace BluetoothManager { } export class DeviceTypeRegistry implements IDeviceTypeRegistry { - private _deviceTypeRegistry: Array; - private _registeredByAPlugin: Signal< - this, - BluetoothManager.DeviceTypeRegistry - >; - - public registryItem: IDeviceTypeRegistryItem; constructor() { - this._deviceTypeRegistry = []; - this._registeredByAPlugin = new Signal< + this._deviceTypes = []; + this._added = new Signal< this, - BluetoothManager.DeviceTypeRegistry + IDeviceTypeRegistryItem >(this); } add(registryItem: IDeviceTypeRegistryItem) { - this._deviceTypeRegistry.push(registryItem); + this._deviceTypes.push(registryItem); + this._added.emit(registryItem) } - get itemsList(): Array { - return this._deviceTypeRegistry; + + get deviceTypes(): IDeviceTypeRegistryItem[] { + return this._deviceTypes; } - get registeredByAPlugin(): Signal< + + get added(): Signal< this, - BluetoothManager.DeviceTypeRegistry + IDeviceTypeRegistryItem > { - return this._registeredByAPlugin; + return this._added; } + + private _deviceTypes: Array; + private _added: Signal< + this, + IDeviceTypeRegistryItem + >; + + public registryItem: IDeviceTypeRegistryItem; } } -/** - * Interface for the bluetooth manager. - */ -export interface IBluetoothManager { - removeAllDevices(Devices: Array): void; - connect(registryItem: IDeviceTypeRegistryItem): any; - disconnect(device: BluetoothManager.Device): void; - deviceListChanged: Signal>; - get deviceList(): Array; - get deviceTypeRegistry(): BluetoothManager.DeviceTypeRegistry; -} + /** + * Interface for the bluetooth manager. + */ + export interface IBluetoothManager { + removeAllDevices(Devices: Array): void; + connect(registryItem: IDeviceTypeRegistryItem): any; + disconnect(device: BluetoothManager.Device): void; + deviceListChanged: Signal>; + get deviceList(): Array; + get deviceTypeRegistry(): BluetoothManager.DeviceTypeRegistry; + } -export interface IDeviceTypeRegistryItem { - deviceType: string; - factory: ( - native: BluetoothDevice - ) => Promise; - options: IDeviceOptions; -} + export interface IDeviceTypeRegistryItem { + deviceType: string; + factory: ( + native: BluetoothDevice + ) => Promise; + options: IDeviceOptions; + } -export interface IDeviceTypeRegistry { - add: (registryItem: IDeviceTypeRegistryItem) => void; - get deviceTypes(): IDeviceTypeRegistryItem[]; - get registeredByAPlugin(): Signal< - IDeviceTypeRegistry, - BluetoothManager.DeviceTypeRegistry - >; -} + export interface IDeviceTypeRegistry { + add: (registryItem: IDeviceTypeRegistryItem) => void; + get deviceTypes(): IDeviceTypeRegistryItem[]; + } -export const IBluetoothManager = new Token( - '@jupyterlab/bluetooth:manager' -); + export const IBluetoothManager = new Token( + '@jupyterlab/bluetooth:manager' + ) diff --git a/src/movehub-extension/index.ts b/src/movehub-extension/index.ts index 575e6c0..ea05e69 100644 --- a/src/movehub-extension/index.ts +++ b/src/movehub-extension/index.ts @@ -57,12 +57,12 @@ const MoveHubRegisterPlugin: JupyterFrontEndPlugin = { ): void => { console.log('JupyterLab move-hub-register plugin is activated!'); bluetoothManager.deviceTypeRegistry.add(movehubRegistryItem); - bluetoothManager.deviceTypeRegistry.registeredByAPlugin.emit( - bluetoothManager.deviceTypeRegistry - ); - console.warn( - `New item from category ${movehubRegistryItem} is added to the registry.` - ); + bluetoothManager.deviceTypeRegistry.added.connect( + async (sender, movehubRegistryItem) => { + console.warn( + `New item from category ${movehubRegistryItem.deviceType} is added to the deviceType registry.` + ); + }) } }; From dbe1eb2dc17525ec62b3dc743a93f4735eb62cbe Mon Sep 17 00:00:00 2001 From: Florence Haudin Date: Wed, 18 Mar 2026 16:35:10 +0100 Subject: [PATCH 5/5] Lint code and take review comments into account. --- src/bluetooth/BluetoothManager.ts | 73 ++++++++++++------------------- src/movehub-extension/index.ts | 5 ++- 2 files changed, 32 insertions(+), 46 deletions(-) diff --git a/src/bluetooth/BluetoothManager.ts b/src/bluetooth/BluetoothManager.ts index acd03a1..3022656 100644 --- a/src/bluetooth/BluetoothManager.ts +++ b/src/bluetooth/BluetoothManager.ts @@ -107,10 +107,6 @@ export class BluetoothManager implements IBluetoothManager { private _deviceList: Array; public deviceListChanged: Signal>; - public registeredByAPlugin: Signal< - BluetoothManager, - BluetoothManager.DeviceTypeRegistry - >; private _deviceTypeRegistry: BluetoothManager.DeviceTypeRegistry; private _identifierRegistry: Array; } @@ -243,63 +239,52 @@ export namespace BluetoothManager { export class DeviceTypeRegistry implements IDeviceTypeRegistry { constructor() { this._deviceTypes = []; - this._added = new Signal< - this, - IDeviceTypeRegistryItem - >(this); + this._added = new Signal(this); } add(registryItem: IDeviceTypeRegistryItem) { this._deviceTypes.push(registryItem); - this._added.emit(registryItem) + this._added.emit(registryItem); } get deviceTypes(): IDeviceTypeRegistryItem[] { return this._deviceTypes; } - get added(): Signal< - this, - IDeviceTypeRegistryItem - > { + get added(): Signal { return this._added; } private _deviceTypes: Array; - private _added: Signal< - this, - IDeviceTypeRegistryItem - >; - - public registryItem: IDeviceTypeRegistryItem; + private _added: Signal; } } - /** - * Interface for the bluetooth manager. - */ - export interface IBluetoothManager { - removeAllDevices(Devices: Array): void; - connect(registryItem: IDeviceTypeRegistryItem): any; - disconnect(device: BluetoothManager.Device): void; - deviceListChanged: Signal>; - get deviceList(): Array; - get deviceTypeRegistry(): BluetoothManager.DeviceTypeRegistry; - } +/** + * Interface for the bluetooth manager. + */ +export interface IBluetoothManager { + removeAllDevices(Devices: Array): void; + connect(registryItem: IDeviceTypeRegistryItem): any; + disconnect(device: BluetoothManager.Device): void; + deviceListChanged: Signal>; + get deviceList(): Array; + get deviceTypeRegistry(): BluetoothManager.DeviceTypeRegistry; +} - export interface IDeviceTypeRegistryItem { - deviceType: string; - factory: ( - native: BluetoothDevice - ) => Promise; - options: IDeviceOptions; - } +export interface IDeviceTypeRegistryItem { + deviceType: string; + factory: ( + native: BluetoothDevice + ) => Promise; + options: IDeviceOptions; +} - export interface IDeviceTypeRegistry { - add: (registryItem: IDeviceTypeRegistryItem) => void; - get deviceTypes(): IDeviceTypeRegistryItem[]; - } +export interface IDeviceTypeRegistry { + add: (registryItem: IDeviceTypeRegistryItem) => void; + get deviceTypes(): IDeviceTypeRegistryItem[]; +} - export const IBluetoothManager = new Token( - '@jupyterlab/bluetooth:manager' - ) +export const IBluetoothManager = new Token( + '@jupyterlab/bluetooth:manager' +); diff --git a/src/movehub-extension/index.ts b/src/movehub-extension/index.ts index ea05e69..147d40b 100644 --- a/src/movehub-extension/index.ts +++ b/src/movehub-extension/index.ts @@ -56,13 +56,14 @@ const MoveHubRegisterPlugin: JupyterFrontEndPlugin = { bluetoothManager: BluetoothManager ): void => { console.log('JupyterLab move-hub-register plugin is activated!'); - bluetoothManager.deviceTypeRegistry.add(movehubRegistryItem); bluetoothManager.deviceTypeRegistry.added.connect( async (sender, movehubRegistryItem) => { console.warn( `New item from category ${movehubRegistryItem.deviceType} is added to the deviceType registry.` ); - }) + } + ); + bluetoothManager.deviceTypeRegistry.add(movehubRegistryItem); } };