Commit c529b85

derdilla <82763757+NobodyForNothing@users.noreply.github.com>
2024-03-24 16:45:11
implement ble bloc measurement receiving logic
Signed-off-by: derdilla <82763757+NobodyForNothing@users.noreply.github.com>
1 parent 6441920
Changed files (3)
app/lib/components/ble_input/ble_input_bloc.dart
@@ -3,6 +3,7 @@ import 'dart:async';
 import 'package:blood_pressure_app/components/ble_input/ble_input_events.dart';
 import 'package:blood_pressure_app/components/ble_input/ble_input_state.dart';
 import 'package:blood_pressure_app/components/ble_input/measurement_characteristic.dart';
+import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:flutter_bloc/flutter_bloc.dart';
 import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
 
@@ -58,13 +59,8 @@ class BleInputBloc extends Bloc<BleInputEvent, BleInputState> {
                 deviceId: event.device.id,
               );
               _ble.subscribeToCharacteristic(characteristic).listen((List<int> data) {
-                final decoded = BPMeasurementCharacteristic.parse(data);
-                // TODO: display gathered information and allow saving gathered measurement.
+                add(BleBluetoothMeasurementRecieved(data));
               });
-
-              // TODO: move reading code
-
-
               return BleConnectSuccess();
             } else if (update.connectionState == DeviceConnectionState.connecting) {
               return BleConnectInProgress();
@@ -75,13 +71,41 @@ class BleInputBloc extends Bloc<BleInputEvent, BleInputState> {
       } on TimeoutException {
         emit(BleConnectFailed());
       }
+    });
 
+    on<BleBluetoothMeasurementRecieved>((event, emit) {
+      emit(BleMeasurementInProgress());
+      final decoded = BPMeasurementCharacteristic.parse(event.data);
+      final record = BloodPressureRecord(
+        decoded.time ?? DateTime.now(),
+        // TODO: unit conversions
+        decoded.sys.toInt(),
+        decoded.dia.toInt(),
+        decoded.pul?.toInt(),
+        '',
+      );
+      emit(BleMeasurementSuccess(record,
+        bodyMoved: decoded.bodyMoved,
+        cuffLoose: decoded.cuffLoose,
+        irregularPulse: decoded.irregularPulse,
+        improperMeasurementPosition: decoded.improperMeasurementPosition,
+        measurementStatus: decoded.measurementStatus,
+      ),);
     });
-    // TODO: use _ble.statusStream
 
-    // TODO: check if information about measurement start can be obtained
-    // through bluetooth
+    // TODO: use _ble.statusStream ?
+
+    // TODO: show capabilities during testing:
+    // _ble.getDiscoveredServices()
+
+    // Interesting available characteristics:
+    // - Battery Health Information 0x2BEB (and other battery ...)
+    // - Blood Pressure Feature 0x2A49
+    // - Device Name 0x2A00
+    // - Enhanced Blood Pressure Measurement 0x2B34
+    // - Live Health Observations 0x2B8B
 
   }
 
-}
\ No newline at end of file
+}
+// TODO: implement UI
app/lib/components/ble_input/ble_input_events.dart
@@ -2,9 +2,19 @@
 import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
 
 sealed class BleInputEvent {}
+
 class BleInputOpened extends BleInputEvent {}
+
 class BleInputDeviceSelected extends BleInputEvent {
   BleInputDeviceSelected(this.device);
 
   final DiscoveredDevice device;
 }
+
+/// A measurement was started over bluetooth.
+class BleBluetoothMeasurementRecieved extends BleInputEvent {
+  BleBluetoothMeasurementRecieved(this.data);
+
+  /// The binary data received.
+  final List<int> data;
+}
app/lib/components/ble_input/ble_input_state.dart
@@ -1,4 +1,5 @@
 // TODO: doc
+import 'package:blood_pressure_app/components/ble_input/measurement_characteristic.dart';
 import 'package:blood_pressure_app/model/blood_pressure/record.dart';
 import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
 
@@ -25,9 +26,34 @@ class BleConnectFailed extends BleInputState {}
 /// Is connected with device.
 class BleConnectSuccess extends BleInputState {}
 
+/// Received information about an blood pressure measurement.
+class BleMeasurementInProgress extends BleInputState {}
+
 /// A measurement was taken through the bluetooth device.
-class BleMeasureSuccess extends BleInputState {
-  BleMeasureSuccess(this.record);
+class BleMeasurementSuccess extends BleInputState {
+  BleMeasurementSuccess(this.record, {
+    this.bodyMoved,
+    this.cuffLoose,
+    this.irregularPulse,
+    this.measurementStatus,
+    this.improperMeasurementPosition,
+  });
 
+  /// Measured blood pressure data.
   final BloodPressureRecord record;
+
+  /// Whether body movement was detected during measurement.
+  bool? bodyMoved;
+
+  /// Whether the cuff was too loose during measurement.
+  bool? cuffLoose;
+
+  /// Whether irregular pulse was detected.
+  bool? irregularPulse;
+
+  /// The range the pulse rate was in.
+  MeasurementStatus? measurementStatus;
+
+  /// Whether the measurement was taken at an improper position.
+  bool? improperMeasurementPosition;
 }