Commit c529b85
Changed files (3)
app
lib
components
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;
}