From 79463bc0ff202ba3f1bf974b47fe4c22e411bb5e Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Sat, 14 Nov 2020 19:39:23 -0500 Subject: [PATCH 1/8] Merged view of usb and bluetooth devices --- .../acquisition_device.dart | 8 ++- .../acquisition_device/device_type.dart | 1 + .../acquisition_device_repository.dart | 54 +++++++++---------- .../bluetooth_repository.dart | 29 +++++++--- .../serial_repository.dart | 10 +++- .../navigation/navdrawer_tabs.dart | 2 +- .../navigation/navdrawer_widget.dart | 5 +- .../navigation/routes/router.dart | 4 +- .../pages/device_selector/device_list.dart | 31 +++++++++++ .../device_selector_page.dart} | 27 ++++------ 10 files changed, 108 insertions(+), 63 deletions(-) create mode 100644 mobile/lib/src/domain/acquisition_device/device_type.dart create mode 100644 mobile/lib/src/presentation/pages/device_selector/device_list.dart rename mobile/lib/src/presentation/pages/{bluetooth_page/bluetoothSelector_page.dart => device_selector/device_selector_page.dart} (62%) diff --git a/mobile/lib/src/domain/acquisition_device/acquisition_device.dart b/mobile/lib/src/domain/acquisition_device/acquisition_device.dart index 9721ec3b..f2243067 100644 --- a/mobile/lib/src/domain/acquisition_device/acquisition_device.dart +++ b/mobile/lib/src/domain/acquisition_device/acquisition_device.dart @@ -1,10 +1,8 @@ +import 'package:polydodo/src/domain/acquisition_device/device_type.dart'; import 'package:polydodo/src/domain/entity.dart'; class AcquisitionDevice extends Entity { final String name; - - AcquisitionDevice( - id, - this.name, - ) : super(id); + final DeviceType deviceType; + AcquisitionDevice(id, this.name, this.deviceType) : super(id); } diff --git a/mobile/lib/src/domain/acquisition_device/device_type.dart b/mobile/lib/src/domain/acquisition_device/device_type.dart new file mode 100644 index 00000000..a6a9ecf6 --- /dev/null +++ b/mobile/lib/src/domain/acquisition_device/device_type.dart @@ -0,0 +1 @@ +enum DeviceType { serial, bluetooth } diff --git a/mobile/lib/src/infrastructure/connection_repositories/acquisition_device_repository.dart b/mobile/lib/src/infrastructure/connection_repositories/acquisition_device_repository.dart index d703295f..4226fab4 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/acquisition_device_repository.dart +++ b/mobile/lib/src/infrastructure/connection_repositories/acquisition_device_repository.dart @@ -1,22 +1,21 @@ import 'dart:async'; import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart'; +import 'package:polydodo/src/domain/acquisition_device/device_type.dart'; import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart'; import 'package:polydodo/src/infrastructure/connection_repositories/bluetooth_repository.dart'; import 'package:polydodo/src/infrastructure/connection_repositories/serial_repository.dart'; -import 'package:streaming_shared_preferences/streaming_shared_preferences.dart'; class AcquisitionDeviceRepository implements IAcquisitionDeviceRepository { final BluetoothRepository _bluetoothRepository = BluetoothRepository(); final SerialRepository _serialRepository = SerialRepository(); + final List _acquisitionDevicePersistency = []; + IAcquisitionDeviceRepository _currentRepository; StreamSubscription _bluetoothStream; StreamSubscription _serialStream; - StreamSubscription _currentStream; - StreamController> _acquisitionDeviceController; - StreamingSharedPreferences _preferences; AcquisitionDeviceRepository() { _currentRepository = _serialRepository; @@ -25,34 +24,26 @@ class AcquisitionDeviceRepository implements IAcquisitionDeviceRepository { @override Future initializeRepository() async { - if (_preferences == null) { - _preferences = await StreamingSharedPreferences.instance; - _preferences - .getBool('using_bluetooth', defaultValue: false) - .listen((usingBluetooth) { - disconnect(); - _currentStream.pause(); - _currentRepository = - usingBluetooth ? _bluetoothRepository : _serialRepository; - _currentRepository.initializeRepository(); - _currentStream = usingBluetooth ? _bluetoothStream : _serialStream; - _currentStream.resume(); - }); - - _serialStream = _serialRepository.watch().listen((event) { - _acquisitionDeviceController.add(event); - }); - _bluetoothStream = _bluetoothRepository.watch().listen((event) { - _acquisitionDeviceController.add(event); - }); + _acquisitionDevicePersistency.clear(); + _bluetoothRepository.initializeRepository(); + _serialRepository.initializeRepository(); - _currentStream = _bluetoothStream; - _serialStream.pause(); - } + _serialStream ??= _serialRepository.watch().listen((event) { + _addDevices(event); + }); + _bluetoothStream ??= _bluetoothRepository.watch().listen((event) { + _addDevices(event); + }); } @override void connect(AcquisitionDevice device, Function(bool, Exception) callback) { + _bluetoothRepository.pauseScan(); + + _currentRepository = (device.deviceType == DeviceType.bluetooth) + ? _bluetoothRepository + : _serialRepository; + _currentRepository.connect(device, callback); } @@ -75,4 +66,13 @@ class AcquisitionDeviceRepository implements IAcquisitionDeviceRepository { Stream> watch() { return _acquisitionDeviceController.stream; } + + void _addDevices(List devices) { + for (var device in devices) { + if (!_acquisitionDevicePersistency.contains(device)) { + _acquisitionDevicePersistency.add(device); + } + } + _acquisitionDeviceController.add(_acquisitionDevicePersistency); + } } diff --git a/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart b/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart index c362c7c9..ad9f4b55 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart +++ b/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart'; +import 'package:polydodo/src/domain/acquisition_device/device_type.dart'; import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart'; import 'package:polydodo/src/infrastructure/constants.dart'; import 'package:polydodo/src/domain/unique_id.dart'; @@ -25,19 +26,18 @@ class BluetoothRepository implements IAcquisitionDeviceRepository { @override void initializeRepository() { if (_bluetoothScanSubscription == null) { - flutterReactiveBle = FlutterReactiveBle(); - - _bluetoothScanSubscription = flutterReactiveBle.scanForDevices( - withServices: []).listen((device) => addDevice(device)); + _initScan(); } else { - _bluetoothScanSubscription.resume(); _acquisitionDevicePersistency.clear(); + resumeScan(); } } void addDevice(DiscoveredDevice bluetoothDevice) { var device = AcquisitionDevice( - UniqueId.from(bluetoothDevice.id.toString()), bluetoothDevice.name); + UniqueId.from(bluetoothDevice.id), + (bluetoothDevice.name.isEmpty) ? 'Unknown' : bluetoothDevice.name, + DeviceType.bluetooth); final idx = _acquisitionDevicePersistency.indexOf(device); @@ -50,12 +50,27 @@ class BluetoothRepository implements IAcquisitionDeviceRepository { streamController.add(_acquisitionDevicePersistency); } + void _initScan() { + flutterReactiveBle = FlutterReactiveBle(); + + _bluetoothScanSubscription = flutterReactiveBle + .scanForDevices(withServices: []).listen((device) => addDevice(device)); + } + + void pauseScan() { + _bluetoothScanSubscription.pause(); + } + + void resumeScan() { + _bluetoothScanSubscription.resume(); + } + @override void connect( AcquisitionDevice device, Function(bool, [Exception]) callback) async { _selectedDevice = device; _acquisitionDevicePersistency.clear(); - _bluetoothScanSubscription.pause(); + pauseScan(); _connectedDeviceStream = flutterReactiveBle .connectToDevice( diff --git a/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart b/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart index 0e854546..ed0d1962 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart +++ b/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:typed_data'; +import 'package:polydodo/src/domain/acquisition_device/device_type.dart'; import 'package:polydodo/src/domain/unique_id.dart'; import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart'; import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart'; @@ -20,6 +21,12 @@ class SerialRepository implements IAcquisitionDeviceRepository { void initializeRepository() { _acquisitionDevicePersistency.clear(); _serialDevices.clear(); + UsbSerial.usbEventStream.listen((event) { + if (event.event == UsbEvent.ACTION_USB_ATTACHED) { + addDevices([event.device]); + } + }); + UsbSerial.listDevices().then((devices) => addDevices(devices)); } @@ -27,7 +34,8 @@ class SerialRepository implements IAcquisitionDeviceRepository { for (var serialDevice in serialDevices) { var device = AcquisitionDevice( UniqueId.from(serialDevice.deviceId.toString()), - serialDevice.productName); + serialDevice.productName, + DeviceType.serial); _acquisitionDevicePersistency.add(device); _serialDevices.add(serialDevice); diff --git a/mobile/lib/src/presentation/navigation/navdrawer_tabs.dart b/mobile/lib/src/presentation/navigation/navdrawer_tabs.dart index 9c392844..1e1c0689 100644 --- a/mobile/lib/src/presentation/navigation/navdrawer_tabs.dart +++ b/mobile/lib/src/presentation/navigation/navdrawer_tabs.dart @@ -1,7 +1,7 @@ enum NavdrawerTab { Dashboard, RecordSleep, - BluetoothSelector, + DeviceSelector, History, SleepSequenceStats } diff --git a/mobile/lib/src/presentation/navigation/navdrawer_widget.dart b/mobile/lib/src/presentation/navigation/navdrawer_widget.dart index f1a5a995..7bda7b8e 100644 --- a/mobile/lib/src/presentation/navigation/navdrawer_widget.dart +++ b/mobile/lib/src/presentation/navigation/navdrawer_widget.dart @@ -26,10 +26,11 @@ class NavDrawer extends StatelessWidget { route: Routes.dashboardPage, context: context, ), + // Todo: find the real place for the device selector, up to debate _createDrawerItem( icon: Icons.bluetooth, - text: 'Bluetooth selector', - route: Routes.bluetoothSelectorPage, + text: 'Device selector', + route: Routes.deviceSelectorPage, context: context, ), _createDrawerItem( diff --git a/mobile/lib/src/presentation/navigation/routes/router.dart b/mobile/lib/src/presentation/navigation/routes/router.dart index f375a268..bf295daa 100644 --- a/mobile/lib/src/presentation/navigation/routes/router.dart +++ b/mobile/lib/src/presentation/navigation/routes/router.dart @@ -1,7 +1,7 @@ import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route_annotations.dart'; -import 'package:polydodo/src/presentation/pages/bluetooth_page/bluetoothSelector_page.dart'; import 'package:polydodo/src/presentation/pages/dashboard/dashboard_page.dart'; +import 'package:polydodo/src/presentation/pages/device_selector/device_selector_page.dart'; import 'package:polydodo/src/presentation/pages/record_sleep/record_sleep_guide_page.dart'; import 'package:polydodo/src/presentation/pages/record_sleep/record_sleep_recording_page.dart'; import 'package:polydodo/src/presentation/pages/record_sleep/record_sleep_validate_page.dart'; @@ -25,7 +25,7 @@ import 'package:polydodo/src/presentation/pages/sleep_sequence_stats_page/sleep_ page: RecordSleepRecordingPage, transitionsBuilder: TransitionsBuilders.fadeIn), CustomRoute( - page: BluetoothSelectorPage, + page: DeviceSelectorPage, transitionsBuilder: TransitionsBuilders.fadeIn), CustomRoute( page: SleepHistoryPage, diff --git a/mobile/lib/src/presentation/pages/device_selector/device_list.dart b/mobile/lib/src/presentation/pages/device_selector/device_list.dart new file mode 100644 index 00000000..0c2c9099 --- /dev/null +++ b/mobile/lib/src/presentation/pages/device_selector/device_list.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:polydodo/src/application/device/device_selector_cubit.dart'; +import 'package:polydodo/src/domain/acquisition_device/device_type.dart'; + +Widget buildDeviceList(var state) { + return ListView.builder( + itemCount: state.devices.length, + itemBuilder: (context, index) { + return Card( + child: ListTile( + onTap: () => BlocProvider.of(context) + .connect(state.devices[index]), + title: Text(state.devices[index].name), + subtitle: Text(state.devices[index].id.toString()), + trailing: _getTrailing(state.devices[index].deviceType), + ), + ); + }); +} + +Widget _getTrailing(DeviceType type) { + switch (type) { + case DeviceType.bluetooth: + return Icon(Icons.bluetooth); + case DeviceType.serial: + return Icon(Icons.usb); + default: + return Icon(Icons.error); + } +} diff --git a/mobile/lib/src/presentation/pages/bluetooth_page/bluetoothSelector_page.dart b/mobile/lib/src/presentation/pages/device_selector/device_selector_page.dart similarity index 62% rename from mobile/lib/src/presentation/pages/bluetooth_page/bluetoothSelector_page.dart rename to mobile/lib/src/presentation/pages/device_selector/device_selector_page.dart index 9a65314b..5aa2ad66 100644 --- a/mobile/lib/src/presentation/pages/bluetooth_page/bluetoothSelector_page.dart +++ b/mobile/lib/src/presentation/pages/device_selector/device_selector_page.dart @@ -7,23 +7,25 @@ import 'package:polydodo/src/presentation/navigation/navdrawer_tabs.dart'; import 'package:polydodo/src/presentation/navigation/navdrawer_widget.dart'; import 'package:polydodo/src/presentation/navigation/routes/router.gr.dart'; -class BluetoothSelectorPage extends StatelessWidget { - static const name = 'bluetoothRoute'; +import 'device_list.dart'; - BluetoothSelectorPage({Key key}) : super(key: key); +class DeviceSelectorPage extends StatelessWidget { + static const name = 'DeviceSelectorRoute'; + + DeviceSelectorPage({Key key}) : super(key: key); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Polydodo')), - drawer: NavDrawer(activeTab: NavdrawerTab.BluetoothSelector), + drawer: NavDrawer(activeTab: NavdrawerTab.DeviceSelector), body: BlocConsumer( listener: (context, state) { print(state.runtimeType); if (state is DeviceSearchFailure) { Scaffold.of(context).showSnackBar(SnackBar( - content: Text( - 'Unable to search for bluetooth devices because ${state.cause}'), + content: + Text('Unable to search for devices because ${state.cause}'), )); } else if (state is DeviceConnectionFailure) { Scaffold.of(context).showSnackBar(SnackBar( @@ -36,18 +38,7 @@ class BluetoothSelectorPage extends StatelessWidget { }, builder: (context, state) { if (state is DeviceSearchInProgress) { - return ListView.builder( - itemCount: state.devices.length, - itemBuilder: (context, index) { - return Card( - child: ListTile( - onTap: () => - BlocProvider.of(context) - .connect(state.devices[index]), - title: Text(state.devices[index].name), - subtitle: Text(state.devices[index].id.toString())), - ); - }); + return buildDeviceList(state); } else { return Container(); } From d671c6fb18e6c674a80f8793244f8c7c591e8e88 Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Tue, 17 Nov 2020 14:54:37 -0500 Subject: [PATCH 2/8] Swapped from acquisition device repository to service --- .../device/device_selector_cubit.dart | 40 ++++++++++++------ .../i_acquisition_device_repository.dart | 4 +- .../i_device_locator_service.dart | 11 +++++ .../bluetooth_repository.dart | 7 ++-- .../serial_repository.dart | 15 ++++--- mobile/lib/src/locator.dart | 9 ++-- .../device_locator_service.dart} | 41 +++++++------------ 7 files changed, 71 insertions(+), 56 deletions(-) create mode 100644 mobile/lib/src/domain/acquisition_device/i_device_locator_service.dart rename mobile/lib/src/{infrastructure/connection_repositories/acquisition_device_repository.dart => services/device_locator_service.dart} (60%) diff --git a/mobile/lib/src/application/device/device_selector_cubit.dart b/mobile/lib/src/application/device/device_selector_cubit.dart index 6644c9eb..9c499f1e 100644 --- a/mobile/lib/src/application/device/device_selector_cubit.dart +++ b/mobile/lib/src/application/device/device_selector_cubit.dart @@ -3,32 +3,32 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart'; -import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart'; +import 'package:polydodo/src/domain/acquisition_device/i_device_locator_service.dart'; import 'device_selector_state.dart'; class DeviceSelectorCubit extends Cubit { - final IAcquisitionDeviceRepository _deviceRepository; + final IDeviceLocatorService _deviceLocatorService; + final List _acquisitionDevicePersistency = []; - StreamSubscription> _acquisitionDeviceStream; + Stream _deviceLocatorStream; + StreamSubscription> _deviceLocatorStreamSubscription; - DeviceSelectorCubit(this._deviceRepository) : super(DeviceInitial()) { + DeviceSelectorCubit(this._deviceLocatorService) : super(DeviceInitial()) { startSearching(); } void startSearching() { - _deviceRepository.initializeRepository(); + _deviceLocatorStream = _deviceLocatorService.scan(); - _acquisitionDeviceStream ??= _deviceRepository - .watch() - .asBroadcastStream() - .listen((devices) => emit(DeviceSearchInProgress(devices)), - onError: (e) => emit(DeviceSearchFailure(e))); + _deviceLocatorStreamSubscription ??= _deviceLocatorStream.listen((devices) { + _addDevices(devices); + }); } Future connect(AcquisitionDevice device) async { emit(DeviceConnectionInProgress()); - _deviceRepository.connect(device, connectionCallback); + _deviceLocatorService.connect(device, connectionCallback); } void connectionCallback(bool connected, [Exception e]) { @@ -36,13 +36,27 @@ class DeviceSelectorCubit extends Cubit { emit(DeviceConnectionFailure(e)); resetSearch(); } else if (connected) { - _acquisitionDeviceStream.cancel(); + _deviceLocatorStreamSubscription.cancel(); emit(DeviceConnectionSuccess()); } } void resetSearch() { - _deviceRepository.disconnect(); + _deviceLocatorService.disconnect(); startSearching(); } + + void _addDevices(List devices) { + for (var device in devices) { + var idx = _acquisitionDevicePersistency.indexOf(device); + + if (idx == -1) { + _acquisitionDevicePersistency.add(device); + } else { + _acquisitionDevicePersistency[idx] = device; + } + } + + emit(DeviceSearchInProgress(_acquisitionDevicePersistency)); + } } diff --git a/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart b/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart index f0b569e8..282dccc9 100644 --- a/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart +++ b/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart @@ -1,13 +1,11 @@ import 'acquisition_device.dart'; abstract class IAcquisitionDeviceRepository { - void initializeRepository(); + Stream> scan(); void connect(AcquisitionDevice device, Function(bool, [Exception]) callback); void disconnect(); Future>> startDataStream(); void stopDataStream(); - - Stream> watch(); } diff --git a/mobile/lib/src/domain/acquisition_device/i_device_locator_service.dart b/mobile/lib/src/domain/acquisition_device/i_device_locator_service.dart new file mode 100644 index 00000000..95f2850c --- /dev/null +++ b/mobile/lib/src/domain/acquisition_device/i_device_locator_service.dart @@ -0,0 +1,11 @@ +import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart'; + +abstract class IDeviceLocatorService { + Stream> scan(); + + void connect(AcquisitionDevice device, Function(bool, [Exception]) callback); + void disconnect(); + + Future>> startDataStream(); + void stopDataStream(); +} diff --git a/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart b/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart index ad9f4b55..befdee90 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart +++ b/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart @@ -24,13 +24,15 @@ class BluetoothRepository implements IAcquisitionDeviceRepository { final streamController = StreamController>(); @override - void initializeRepository() { + Stream> scan() { if (_bluetoothScanSubscription == null) { _initScan(); } else { _acquisitionDevicePersistency.clear(); resumeScan(); } + + return streamController.stream; } void addDevice(DiscoveredDevice bluetoothDevice) { @@ -127,7 +129,4 @@ class BluetoothRepository implements IAcquisitionDeviceRepository { _sendCharacteristic, value: STOP_STREAM_CHAR.codeUnits)); } - - @override - Stream> watch() => streamController.stream; } diff --git a/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart b/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart index ed0d1962..d02c990d 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart +++ b/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart @@ -13,25 +13,32 @@ class SerialRepository implements IAcquisitionDeviceRepository { UsbDevice _selectedDevice; UsbPort _serialPort; StreamSubscription _inputStreamSubscription; + StreamSubscription _usbEventSubscription; final List _acquisitionDevicePersistency = []; final List _serialDevices = []; final streamController = StreamController>(); @override - void initializeRepository() { + Stream> scan() { _acquisitionDevicePersistency.clear(); _serialDevices.clear(); - UsbSerial.usbEventStream.listen((event) { + _usbEventSubscription ??= UsbSerial.usbEventStream.listen((event) { if (event.event == UsbEvent.ACTION_USB_ATTACHED) { addDevices([event.device]); } }); UsbSerial.listDevices().then((devices) => addDevices(devices)); + + return streamController.stream; } void addDevices(List serialDevices) { for (var serialDevice in serialDevices) { + if (_serialDevices.contains(serialDevice)) { + continue; + } + var device = AcquisitionDevice( UniqueId.from(serialDevice.deviceId.toString()), serialDevice.productName, @@ -40,6 +47,7 @@ class SerialRepository implements IAcquisitionDeviceRepository { _acquisitionDevicePersistency.add(device); _serialDevices.add(serialDevice); } + streamController.add(_acquisitionDevicePersistency); } @@ -108,7 +116,4 @@ class SerialRepository implements IAcquisitionDeviceRepository { Future stopDataStream() async { await _serialPort.write(Uint8List.fromList(STOP_STREAM_CHAR.codeUnits)); } - - @override - Stream> watch() => streamController.stream; } diff --git a/mobile/lib/src/locator.dart b/mobile/lib/src/locator.dart index 7a0f1be4..3e0c8c3a 100644 --- a/mobile/lib/src/locator.dart +++ b/mobile/lib/src/locator.dart @@ -5,18 +5,19 @@ import 'package:polydodo/src/application/eeg_data/data_cubit.dart'; import 'package:polydodo/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart'; import 'package:polydodo/src/application/sleep_sequence_stats/sleep_sequence_stats_cubit.dart'; import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart'; +import 'package:polydodo/src/domain/acquisition_device/i_device_locator_service.dart'; import 'package:polydodo/src/domain/eeg_data/i_eeg_data_repository.dart'; import 'package:polydodo/src/domain/sleep_sequence/i_sleep_sequence_repository.dart'; -import 'package:polydodo/src/infrastructure/connection_repositories/acquisition_device_repository.dart'; import 'package:polydodo/src/infrastructure/connection_repositories/eeg_data_repository.dart'; import 'package:polydodo/src/infrastructure/sleep_history/sleep_history_repository.dart'; +import 'package:polydodo/src/services/device_locator_service.dart'; /// Private GetIt instance as we want all DI to be performed here in this file final _serviceLocator = GetIt.asNewInstance(); void registerServices() { - _serviceLocator.registerSingleton( - AcquisitionDeviceRepository()); + _serviceLocator + .registerSingleton(DeviceLocatorService()); _serviceLocator.registerSingleton(EEGDataRepository()); _serviceLocator .registerSingleton(SleepHistoryRepository()); @@ -26,7 +27,7 @@ void registerServices() { List createBlocProviders() => [ BlocProvider( create: (context) => DeviceSelectorCubit( - _serviceLocator.get(), + _serviceLocator.get(), ), ), BlocProvider( diff --git a/mobile/lib/src/infrastructure/connection_repositories/acquisition_device_repository.dart b/mobile/lib/src/services/device_locator_service.dart similarity index 60% rename from mobile/lib/src/infrastructure/connection_repositories/acquisition_device_repository.dart rename to mobile/lib/src/services/device_locator_service.dart index 4226fab4..b262207e 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/acquisition_device_repository.dart +++ b/mobile/lib/src/services/device_locator_service.dart @@ -3,37 +3,38 @@ import 'dart:async'; import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart'; import 'package:polydodo/src/domain/acquisition_device/device_type.dart'; import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart'; +import 'package:polydodo/src/domain/acquisition_device/i_device_locator_service.dart'; import 'package:polydodo/src/infrastructure/connection_repositories/bluetooth_repository.dart'; import 'package:polydodo/src/infrastructure/connection_repositories/serial_repository.dart'; -class AcquisitionDeviceRepository implements IAcquisitionDeviceRepository { +class DeviceLocatorService implements IDeviceLocatorService { final BluetoothRepository _bluetoothRepository = BluetoothRepository(); final SerialRepository _serialRepository = SerialRepository(); - final List _acquisitionDevicePersistency = []; IAcquisitionDeviceRepository _currentRepository; - StreamSubscription _bluetoothStream; - StreamSubscription _serialStream; + StreamSubscription _serialStreamSubscription; + StreamSubscription _bluetoothStreamSubscription; StreamController> _acquisitionDeviceController; - AcquisitionDeviceRepository() { + DeviceLocatorService() { _currentRepository = _serialRepository; _acquisitionDeviceController = StreamController(); } @override - Future initializeRepository() async { - _acquisitionDevicePersistency.clear(); - _bluetoothRepository.initializeRepository(); - _serialRepository.initializeRepository(); + Stream> scan() { + var bluetoothStream = _bluetoothRepository.scan(); + var serialStream = _serialRepository.scan(); - _serialStream ??= _serialRepository.watch().listen((event) { - _addDevices(event); + _serialStreamSubscription ??= bluetoothStream.listen((event) { + _acquisitionDeviceController.add(event); }); - _bluetoothStream ??= _bluetoothRepository.watch().listen((event) { - _addDevices(event); + _bluetoothStreamSubscription ??= serialStream.listen((event) { + _acquisitionDeviceController.add(event); }); + + return _acquisitionDeviceController.stream; } @override @@ -61,18 +62,4 @@ class AcquisitionDeviceRepository implements IAcquisitionDeviceRepository { void stopDataStream() { _currentRepository.stopDataStream(); } - - @override - Stream> watch() { - return _acquisitionDeviceController.stream; - } - - void _addDevices(List devices) { - for (var device in devices) { - if (!_acquisitionDevicePersistency.contains(device)) { - _acquisitionDevicePersistency.add(device); - } - } - _acquisitionDeviceController.add(_acquisitionDevicePersistency); - } } From da84521b1f5caf0196c1abaf769993b518504841 Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Tue, 17 Nov 2020 14:56:43 -0500 Subject: [PATCH 3/8] Removed unecessary print --- .../presentation/pages/device_selector/device_selector_page.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/mobile/lib/src/presentation/pages/device_selector/device_selector_page.dart b/mobile/lib/src/presentation/pages/device_selector/device_selector_page.dart index 5aa2ad66..5303d85c 100644 --- a/mobile/lib/src/presentation/pages/device_selector/device_selector_page.dart +++ b/mobile/lib/src/presentation/pages/device_selector/device_selector_page.dart @@ -21,7 +21,6 @@ class DeviceSelectorPage extends StatelessWidget { drawer: NavDrawer(activeTab: NavdrawerTab.DeviceSelector), body: BlocConsumer( listener: (context, state) { - print(state.runtimeType); if (state is DeviceSearchFailure) { Scaffold.of(context).showSnackBar(SnackBar( content: From 40c37a813793c89a955044b9e01a5e76b0cb8f47 Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Tue, 17 Nov 2020 18:50:47 -0500 Subject: [PATCH 4/8] Removed persistency in acquisition repositories --- .../device/device_selector_cubit.dart | 24 +++++++++---------- .../i_acquisition_device_repository.dart | 2 +- .../i_device_locator_service.dart | 2 +- .../bluetooth_repository.dart | 17 +++---------- .../serial_repository.dart | 21 +++++++--------- .../src/services/device_locator_service.dart | 4 ++-- 6 files changed, 27 insertions(+), 43 deletions(-) diff --git a/mobile/lib/src/application/device/device_selector_cubit.dart b/mobile/lib/src/application/device/device_selector_cubit.dart index 9c499f1e..5d9cb8d5 100644 --- a/mobile/lib/src/application/device/device_selector_cubit.dart +++ b/mobile/lib/src/application/device/device_selector_cubit.dart @@ -8,10 +8,10 @@ import 'device_selector_state.dart'; class DeviceSelectorCubit extends Cubit { final IDeviceLocatorService _deviceLocatorService; - final List _acquisitionDevicePersistency = []; + final List _scannedDevices = []; Stream _deviceLocatorStream; - StreamSubscription> _deviceLocatorStreamSubscription; + StreamSubscription _deviceLocatorStreamSubscription; DeviceSelectorCubit(this._deviceLocatorService) : super(DeviceInitial()) { startSearching(); @@ -20,8 +20,8 @@ class DeviceSelectorCubit extends Cubit { void startSearching() { _deviceLocatorStream = _deviceLocatorService.scan(); - _deviceLocatorStreamSubscription ??= _deviceLocatorStream.listen((devices) { - _addDevices(devices); + _deviceLocatorStreamSubscription ??= _deviceLocatorStream.listen((device) { + _addDevice(device); }); } @@ -46,17 +46,15 @@ class DeviceSelectorCubit extends Cubit { startSearching(); } - void _addDevices(List devices) { - for (var device in devices) { - var idx = _acquisitionDevicePersistency.indexOf(device); + void _addDevice(AcquisitionDevice device) { + var idx = _scannedDevices.indexOf(device); - if (idx == -1) { - _acquisitionDevicePersistency.add(device); - } else { - _acquisitionDevicePersistency[idx] = device; - } + if (idx == -1) { + _scannedDevices.add(device); + } else { + _scannedDevices[idx] = device; } - emit(DeviceSearchInProgress(_acquisitionDevicePersistency)); + emit(DeviceSearchInProgress(_scannedDevices)); } } diff --git a/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart b/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart index 282dccc9..1f42d59b 100644 --- a/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart +++ b/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart @@ -1,7 +1,7 @@ import 'acquisition_device.dart'; abstract class IAcquisitionDeviceRepository { - Stream> scan(); + Stream scan(); void connect(AcquisitionDevice device, Function(bool, [Exception]) callback); void disconnect(); diff --git a/mobile/lib/src/domain/acquisition_device/i_device_locator_service.dart b/mobile/lib/src/domain/acquisition_device/i_device_locator_service.dart index 95f2850c..9c17ae4a 100644 --- a/mobile/lib/src/domain/acquisition_device/i_device_locator_service.dart +++ b/mobile/lib/src/domain/acquisition_device/i_device_locator_service.dart @@ -1,7 +1,7 @@ import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart'; abstract class IDeviceLocatorService { - Stream> scan(); + Stream scan(); void connect(AcquisitionDevice device, Function(bool, [Exception]) callback); void disconnect(); diff --git a/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart b/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart index befdee90..55896190 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart +++ b/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart @@ -20,15 +20,13 @@ class BluetoothRepository implements IAcquisitionDeviceRepository { FlutterReactiveBle flutterReactiveBle; StreamSubscription _connectedDeviceStream; StreamSubscription _bluetoothScanSubscription; - final List _acquisitionDevicePersistency = []; - final streamController = StreamController>(); + final streamController = StreamController(); @override - Stream> scan() { + Stream scan() { if (_bluetoothScanSubscription == null) { _initScan(); } else { - _acquisitionDevicePersistency.clear(); resumeScan(); } @@ -41,15 +39,7 @@ class BluetoothRepository implements IAcquisitionDeviceRepository { (bluetoothDevice.name.isEmpty) ? 'Unknown' : bluetoothDevice.name, DeviceType.bluetooth); - final idx = _acquisitionDevicePersistency.indexOf(device); - - if (idx == -1) { - _acquisitionDevicePersistency.add(device); - } else { - _acquisitionDevicePersistency[idx] = device; - } - - streamController.add(_acquisitionDevicePersistency); + streamController.add(device); } void _initScan() { @@ -71,7 +61,6 @@ class BluetoothRepository implements IAcquisitionDeviceRepository { void connect( AcquisitionDevice device, Function(bool, [Exception]) callback) async { _selectedDevice = device; - _acquisitionDevicePersistency.clear(); pauseScan(); _connectedDeviceStream = flutterReactiveBle diff --git a/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart b/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart index d02c990d..d38ce662 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart +++ b/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'dart:collection'; import 'dart:typed_data'; import 'package:polydodo/src/domain/acquisition_device/device_type.dart'; @@ -14,13 +15,11 @@ class SerialRepository implements IAcquisitionDeviceRepository { UsbPort _serialPort; StreamSubscription _inputStreamSubscription; StreamSubscription _usbEventSubscription; - final List _acquisitionDevicePersistency = []; - final List _serialDevices = []; - final streamController = StreamController>(); + final Map _serialDevices = {}; + final streamController = StreamController(); @override - Stream> scan() { - _acquisitionDevicePersistency.clear(); + Stream scan() { _serialDevices.clear(); _usbEventSubscription ??= UsbSerial.usbEventStream.listen((event) { if (event.event == UsbEvent.ACTION_USB_ATTACHED) { @@ -35,7 +34,7 @@ class SerialRepository implements IAcquisitionDeviceRepository { void addDevices(List serialDevices) { for (var serialDevice in serialDevices) { - if (_serialDevices.contains(serialDevice)) { + if (_serialDevices.containsKey(serialDevice.deviceId.toString())) { continue; } @@ -44,18 +43,16 @@ class SerialRepository implements IAcquisitionDeviceRepository { serialDevice.productName, DeviceType.serial); - _acquisitionDevicePersistency.add(device); - _serialDevices.add(serialDevice); - } + streamController.add(device); - streamController.add(_acquisitionDevicePersistency); + _serialDevices[serialDevice.deviceId.toString()] = serialDevice; + } } @override Future connect( AcquisitionDevice device, Function(bool, Exception) callback) async { - _selectedDevice = - _serialDevices[_acquisitionDevicePersistency.indexOf(device)]; + _selectedDevice = _serialDevices[device.id.toString()]; _serialPort = await _selectedDevice.create(); var openSuccessful = await _serialPort.open(); diff --git a/mobile/lib/src/services/device_locator_service.dart b/mobile/lib/src/services/device_locator_service.dart index b262207e..b59bcbdb 100644 --- a/mobile/lib/src/services/device_locator_service.dart +++ b/mobile/lib/src/services/device_locator_service.dart @@ -15,7 +15,7 @@ class DeviceLocatorService implements IDeviceLocatorService { StreamSubscription _serialStreamSubscription; StreamSubscription _bluetoothStreamSubscription; - StreamController> _acquisitionDeviceController; + StreamController _acquisitionDeviceController; DeviceLocatorService() { _currentRepository = _serialRepository; @@ -23,7 +23,7 @@ class DeviceLocatorService implements IDeviceLocatorService { } @override - Stream> scan() { + Stream scan() { var bluetoothStream = _bluetoothRepository.scan(); var serialStream = _serialRepository.scan(); From 431ced6d31d77a35dcd497c7b43b14799eb2f7a6 Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Tue, 17 Nov 2020 19:03:20 -0500 Subject: [PATCH 5/8] Moved service to domain level --- .../device/device_selector_cubit.dart | 4 +- .../i_device_locator_service.dart | 11 ---- .../serial_repository.dart | 1 - mobile/lib/src/locator.dart | 11 ++-- .../src/services/device_locator_service.dart | 65 ------------------- 5 files changed, 8 insertions(+), 84 deletions(-) delete mode 100644 mobile/lib/src/domain/acquisition_device/i_device_locator_service.dart delete mode 100644 mobile/lib/src/services/device_locator_service.dart diff --git a/mobile/lib/src/application/device/device_selector_cubit.dart b/mobile/lib/src/application/device/device_selector_cubit.dart index 5d9cb8d5..e642c76e 100644 --- a/mobile/lib/src/application/device/device_selector_cubit.dart +++ b/mobile/lib/src/application/device/device_selector_cubit.dart @@ -3,11 +3,11 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart'; -import 'package:polydodo/src/domain/acquisition_device/i_device_locator_service.dart'; +import 'package:polydodo/src/domain/acquisition_device/device_locator_service.dart'; import 'device_selector_state.dart'; class DeviceSelectorCubit extends Cubit { - final IDeviceLocatorService _deviceLocatorService; + final DeviceLocatorService _deviceLocatorService; final List _scannedDevices = []; Stream _deviceLocatorStream; diff --git a/mobile/lib/src/domain/acquisition_device/i_device_locator_service.dart b/mobile/lib/src/domain/acquisition_device/i_device_locator_service.dart deleted file mode 100644 index 9c17ae4a..00000000 --- a/mobile/lib/src/domain/acquisition_device/i_device_locator_service.dart +++ /dev/null @@ -1,11 +0,0 @@ -import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart'; - -abstract class IDeviceLocatorService { - Stream scan(); - - void connect(AcquisitionDevice device, Function(bool, [Exception]) callback); - void disconnect(); - - Future>> startDataStream(); - void stopDataStream(); -} diff --git a/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart b/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart index d38ce662..27aa799b 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart +++ b/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:collection'; import 'dart:typed_data'; import 'package:polydodo/src/domain/acquisition_device/device_type.dart'; diff --git a/mobile/lib/src/locator.dart b/mobile/lib/src/locator.dart index 3e0c8c3a..91c91893 100644 --- a/mobile/lib/src/locator.dart +++ b/mobile/lib/src/locator.dart @@ -4,20 +4,21 @@ import 'package:polydodo/src/application/device/device_selector_cubit.dart'; import 'package:polydodo/src/application/eeg_data/data_cubit.dart'; import 'package:polydodo/src/application/sleep_sequence_history/sleep_sequence_history_cubit.dart'; import 'package:polydodo/src/application/sleep_sequence_stats/sleep_sequence_stats_cubit.dart'; +import 'package:polydodo/src/domain/acquisition_device/device_locator_service.dart'; import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart'; -import 'package:polydodo/src/domain/acquisition_device/i_device_locator_service.dart'; import 'package:polydodo/src/domain/eeg_data/i_eeg_data_repository.dart'; import 'package:polydodo/src/domain/sleep_sequence/i_sleep_sequence_repository.dart'; +import 'package:polydodo/src/infrastructure/connection_repositories/bluetooth_repository.dart'; import 'package:polydodo/src/infrastructure/connection_repositories/eeg_data_repository.dart'; +import 'package:polydodo/src/infrastructure/connection_repositories/serial_repository.dart'; import 'package:polydodo/src/infrastructure/sleep_history/sleep_history_repository.dart'; -import 'package:polydodo/src/services/device_locator_service.dart'; /// Private GetIt instance as we want all DI to be performed here in this file final _serviceLocator = GetIt.asNewInstance(); void registerServices() { - _serviceLocator - .registerSingleton(DeviceLocatorService()); + _serviceLocator.registerSingleton( + DeviceLocatorService(BluetoothRepository(), SerialRepository())); _serviceLocator.registerSingleton(EEGDataRepository()); _serviceLocator .registerSingleton(SleepHistoryRepository()); @@ -27,7 +28,7 @@ void registerServices() { List createBlocProviders() => [ BlocProvider( create: (context) => DeviceSelectorCubit( - _serviceLocator.get(), + _serviceLocator.get(), ), ), BlocProvider( diff --git a/mobile/lib/src/services/device_locator_service.dart b/mobile/lib/src/services/device_locator_service.dart deleted file mode 100644 index b59bcbdb..00000000 --- a/mobile/lib/src/services/device_locator_service.dart +++ /dev/null @@ -1,65 +0,0 @@ -import 'dart:async'; - -import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart'; -import 'package:polydodo/src/domain/acquisition_device/device_type.dart'; -import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart'; -import 'package:polydodo/src/domain/acquisition_device/i_device_locator_service.dart'; -import 'package:polydodo/src/infrastructure/connection_repositories/bluetooth_repository.dart'; -import 'package:polydodo/src/infrastructure/connection_repositories/serial_repository.dart'; - -class DeviceLocatorService implements IDeviceLocatorService { - final BluetoothRepository _bluetoothRepository = BluetoothRepository(); - final SerialRepository _serialRepository = SerialRepository(); - - IAcquisitionDeviceRepository _currentRepository; - - StreamSubscription _serialStreamSubscription; - StreamSubscription _bluetoothStreamSubscription; - StreamController _acquisitionDeviceController; - - DeviceLocatorService() { - _currentRepository = _serialRepository; - _acquisitionDeviceController = StreamController(); - } - - @override - Stream scan() { - var bluetoothStream = _bluetoothRepository.scan(); - var serialStream = _serialRepository.scan(); - - _serialStreamSubscription ??= bluetoothStream.listen((event) { - _acquisitionDeviceController.add(event); - }); - _bluetoothStreamSubscription ??= serialStream.listen((event) { - _acquisitionDeviceController.add(event); - }); - - return _acquisitionDeviceController.stream; - } - - @override - void connect(AcquisitionDevice device, Function(bool, Exception) callback) { - _bluetoothRepository.pauseScan(); - - _currentRepository = (device.deviceType == DeviceType.bluetooth) - ? _bluetoothRepository - : _serialRepository; - - _currentRepository.connect(device, callback); - } - - @override - void disconnect() { - _currentRepository.disconnect(); - } - - @override - Future>> startDataStream() { - return _currentRepository.startDataStream(); - } - - @override - void stopDataStream() { - _currentRepository.stopDataStream(); - } -} From aeeaaf812a7a1acfa5ff263ab3a2bf051da7454d Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Tue, 17 Nov 2020 19:07:48 -0500 Subject: [PATCH 6/8] Added missing file --- .../device_locator_service.dart | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 mobile/lib/src/domain/acquisition_device/device_locator_service.dart diff --git a/mobile/lib/src/domain/acquisition_device/device_locator_service.dart b/mobile/lib/src/domain/acquisition_device/device_locator_service.dart new file mode 100644 index 00000000..e45c680d --- /dev/null +++ b/mobile/lib/src/domain/acquisition_device/device_locator_service.dart @@ -0,0 +1,59 @@ +import 'dart:async'; + +import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart'; +import 'package:polydodo/src/domain/acquisition_device/device_type.dart'; +import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart'; +import 'package:polydodo/src/infrastructure/connection_repositories/bluetooth_repository.dart'; +import 'package:polydodo/src/infrastructure/connection_repositories/serial_repository.dart'; + +class DeviceLocatorService { + final BluetoothRepository _bluetoothRepository; + final SerialRepository _serialRepository; + + IAcquisitionDeviceRepository _currentRepository; + + StreamSubscription _serialStreamSubscription; + StreamSubscription _bluetoothStreamSubscription; + StreamController _acquisitionDeviceController; + + DeviceLocatorService(this._bluetoothRepository, this._serialRepository) { + _currentRepository = _serialRepository; + _acquisitionDeviceController = StreamController(); + } + + Stream scan() { + var bluetoothStream = _bluetoothRepository.scan(); + var serialStream = _serialRepository.scan(); + + _serialStreamSubscription ??= bluetoothStream.listen((event) { + _acquisitionDeviceController.add(event); + }); + _bluetoothStreamSubscription ??= serialStream.listen((event) { + _acquisitionDeviceController.add(event); + }); + + return _acquisitionDeviceController.stream; + } + + void connect(AcquisitionDevice device, Function(bool, Exception) callback) { + _bluetoothRepository.pauseScan(); + + _currentRepository = (device.deviceType == DeviceType.bluetooth) + ? _bluetoothRepository + : _serialRepository; + + _currentRepository.connect(device, callback); + } + + void disconnect() { + _currentRepository.disconnect(); + } + + Future>> startDataStream() { + return _currentRepository.startDataStream(); + } + + void stopDataStream() { + _currentRepository.stopDataStream(); + } +} From 7b493d263103a8f716a12d88c78c82e3de5ca123 Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Wed, 18 Nov 2020 22:46:22 -0500 Subject: [PATCH 7/8] Used interface only in domain layer --- .../device/device_selector_cubit.dart | 10 +++------ .../device_locator_service.dart | 6 ++--- .../i_acquisition_device_repository.dart | 1 + .../bluetooth_repository.dart | 22 +++++++------------ .../serial_repository.dart | 3 +++ 5 files changed, 17 insertions(+), 25 deletions(-) diff --git a/mobile/lib/src/application/device/device_selector_cubit.dart b/mobile/lib/src/application/device/device_selector_cubit.dart index e642c76e..1a1b9870 100644 --- a/mobile/lib/src/application/device/device_selector_cubit.dart +++ b/mobile/lib/src/application/device/device_selector_cubit.dart @@ -47,14 +47,10 @@ class DeviceSelectorCubit extends Cubit { } void _addDevice(AcquisitionDevice device) { - var idx = _scannedDevices.indexOf(device); - - if (idx == -1) { + if (!_scannedDevices.contains(device)) { _scannedDevices.add(device); - } else { - _scannedDevices[idx] = device; - } - emit(DeviceSearchInProgress(_scannedDevices)); + emit(DeviceSearchInProgress(_scannedDevices)); + } } } diff --git a/mobile/lib/src/domain/acquisition_device/device_locator_service.dart b/mobile/lib/src/domain/acquisition_device/device_locator_service.dart index e45c680d..5681870c 100644 --- a/mobile/lib/src/domain/acquisition_device/device_locator_service.dart +++ b/mobile/lib/src/domain/acquisition_device/device_locator_service.dart @@ -3,12 +3,10 @@ import 'dart:async'; import 'package:polydodo/src/domain/acquisition_device/acquisition_device.dart'; import 'package:polydodo/src/domain/acquisition_device/device_type.dart'; import 'package:polydodo/src/domain/acquisition_device/i_acquisition_device_repository.dart'; -import 'package:polydodo/src/infrastructure/connection_repositories/bluetooth_repository.dart'; -import 'package:polydodo/src/infrastructure/connection_repositories/serial_repository.dart'; class DeviceLocatorService { - final BluetoothRepository _bluetoothRepository; - final SerialRepository _serialRepository; + final IAcquisitionDeviceRepository _bluetoothRepository; + final IAcquisitionDeviceRepository _serialRepository; IAcquisitionDeviceRepository _currentRepository; diff --git a/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart b/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart index 1f42d59b..897b4963 100644 --- a/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart +++ b/mobile/lib/src/domain/acquisition_device/i_acquisition_device_repository.dart @@ -2,6 +2,7 @@ import 'acquisition_device.dart'; abstract class IAcquisitionDeviceRepository { Stream scan(); + void pauseScan(); void connect(AcquisitionDevice device, Function(bool, [Exception]) callback); void disconnect(); diff --git a/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart b/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart index 55896190..9bd6e979 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart +++ b/mobile/lib/src/infrastructure/connection_repositories/bluetooth_repository.dart @@ -20,7 +20,7 @@ class BluetoothRepository implements IAcquisitionDeviceRepository { FlutterReactiveBle flutterReactiveBle; StreamSubscription _connectedDeviceStream; StreamSubscription _bluetoothScanSubscription; - final streamController = StreamController(); + Stream bluetoothStream; @override Stream scan() { @@ -30,25 +30,20 @@ class BluetoothRepository implements IAcquisitionDeviceRepository { resumeScan(); } - return streamController.stream; - } - - void addDevice(DiscoveredDevice bluetoothDevice) { - var device = AcquisitionDevice( - UniqueId.from(bluetoothDevice.id), - (bluetoothDevice.name.isEmpty) ? 'Unknown' : bluetoothDevice.name, - DeviceType.bluetooth); - - streamController.add(device); + return bluetoothStream; } void _initScan() { flutterReactiveBle = FlutterReactiveBle(); - _bluetoothScanSubscription = flutterReactiveBle - .scanForDevices(withServices: []).listen((device) => addDevice(device)); + bluetoothStream = flutterReactiveBle.scanForDevices(withServices: []).map( + (device) => AcquisitionDevice( + UniqueId.from(device.id), + (device.name.isEmpty) ? 'Unknown' : device.name, + DeviceType.bluetooth)); } + @override void pauseScan() { _bluetoothScanSubscription.pause(); } @@ -61,7 +56,6 @@ class BluetoothRepository implements IAcquisitionDeviceRepository { void connect( AcquisitionDevice device, Function(bool, [Exception]) callback) async { _selectedDevice = device; - pauseScan(); _connectedDeviceStream = flutterReactiveBle .connectToDevice( diff --git a/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart b/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart index 27aa799b..10c49883 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart +++ b/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart @@ -31,6 +31,9 @@ class SerialRepository implements IAcquisitionDeviceRepository { return streamController.stream; } + @override + void pauseScan() {} + void addDevices(List serialDevices) { for (var serialDevice in serialDevices) { if (_serialDevices.containsKey(serialDevice.deviceId.toString())) { From 16af82dd8908691f088134c1f10eb83519ae9b5f Mon Sep 17 00:00:00 2001 From: MouradLachhab Date: Wed, 18 Nov 2020 22:47:50 -0500 Subject: [PATCH 8/8] Changed function addDevice to private --- .../connection_repositories/serial_repository.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart b/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart index 10c49883..6418c103 100644 --- a/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart +++ b/mobile/lib/src/infrastructure/connection_repositories/serial_repository.dart @@ -22,11 +22,11 @@ class SerialRepository implements IAcquisitionDeviceRepository { _serialDevices.clear(); _usbEventSubscription ??= UsbSerial.usbEventStream.listen((event) { if (event.event == UsbEvent.ACTION_USB_ATTACHED) { - addDevices([event.device]); + _addDevices([event.device]); } }); - UsbSerial.listDevices().then((devices) => addDevices(devices)); + UsbSerial.listDevices().then((devices) => _addDevices(devices)); return streamController.stream; } @@ -34,7 +34,7 @@ class SerialRepository implements IAcquisitionDeviceRepository { @override void pauseScan() {} - void addDevices(List serialDevices) { + void _addDevices(List serialDevices) { for (var serialDevice in serialDevices) { if (_serialDevices.containsKey(serialDevice.deviceId.toString())) { continue;