Commit 1cb9812

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-05-20 18:14:15
properly disconnect from device
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 452bbd9
Changed files (2)
app
app/lib/bluetooth/ble_read_cubit.dart
@@ -36,12 +36,29 @@ class BleReadCubit extends Cubit<BleReadState> {
    unawaited(_startRead());
   }
 
+  // TODO: consider using Future for this
+
   /// Bluetooth device to connect to.
   ///
   /// Must have an active established connection and support the measurement
   /// characteristic.
   final BluetoothDevice _device;
 
+  @override
+  Future<void> close() async {
+    if (_device.isConnected) {
+      try {
+        Log.trace('BleReadCubit close: Attempting disconnect from ${_device.advName}');
+        await _device.disconnect();
+        assert(_device.isDisconnected);
+      } catch (e) {
+        Log.err('unable to disconnect', [e, _device]);
+      }
+    }
+
+    await super.close();
+  }
+
   Future<void> _startRead() async {
     Log.trace('_startRead');
 
@@ -53,6 +70,8 @@ class BleReadCubit extends Cubit<BleReadState> {
         Log.trace('BleReadCubit _startRead: Device not connected');
         emit(BleReadFailure());
         return;
+      } else {
+        Log.trace('Connection successful');
       }
     }
     assert(_device.isConnected);
app/lib/components/bluetooth_input.dart
@@ -41,20 +41,24 @@ class _BluetoothInputState extends State<BluetoothInput> {
   final BluetoothCubit _bluetoothCubit =  BluetoothCubit();
   StreamSubscription<BluetoothState>? _bluetoothSubscription;
   DeviceScanCubit? _deviceScanCubit;
+  BleReadCubit? _deviceReadCubit;
 
   @override
   void dispose() async {
     await _bluetoothSubscription?.cancel();
     await _bluetoothCubit.close();
     await _deviceScanCubit?.close();
+    await _deviceReadCubit?.close();
     super.dispose();
   }
 
   void _returnToIdle() async {
-    await  _bluetoothSubscription?.cancel();
+    await _bluetoothSubscription?.cancel();
     _bluetoothSubscription = null;
     await _deviceScanCubit?.close();
     _deviceScanCubit = null;
+    await _deviceReadCubit?.close();
+    _deviceReadCubit = null;
     if (_isActive) {
       setState(() {
         _isActive = false;
@@ -89,12 +93,13 @@ class _BluetoothInputState extends State<BluetoothInput> {
           ),
             // distinction
           DeviceSelected() => BlocBuilder<BleReadCubit, BleReadState>(
-            bloc: BleReadCubit(state.device),
+            bloc: () { _deviceReadCubit = BleReadCubit(state.device); return _deviceReadCubit; }(),
             builder: (BuildContext context, BleReadState state) {
               Log.trace('_BluetoothInputState BleReadCubit: $state');
               return switch (state) {
                 BleReadInProgress() => _buildMainCard(context,
                   child: const CircularProgressIndicator(),
+                  // TODO: onTap to retry
                 ),
                 BleReadFailure() => MeasurementFailure(
                   onTap: _returnToIdle,