takeMeasurements method
Listens for weight measurements
Provides a stream of MiScaleMeasurement
instances.
Multiple instances are emitted for the same measurement throughout the progress of the measurement to denote changes.
The measurements continue to be taken until the returned stream is cancelled.
Implementation
Stream<MiScaleMeasurement> takeMeasurements() {
StreamSubscription? dataSubscription;
StreamSubscription? cleanUpSubscription;
late StreamController<MiScaleMeasurement> controller;
controller = StreamController<MiScaleMeasurement>.broadcast(
onListen: () {
// Process scale data into measurements
dataSubscription = readScaleData().listen((scaleData) {
final measurement = MiScaleMeasurement.processData(
_activeMeasurements[scaleData.deviceId],
scaleData,
);
if (measurement != null &&
measurement.stage != MiScaleMeasurementStage.MEASURED) {
_activeMeasurements[scaleData.deviceId] = measurement;
} else {
_activeMeasurements.remove(scaleData.deviceId);
}
if (measurement != null) controller.add(measurement);
});
},
onCancel: () {
dataSubscription?.cancel();
cleanUpSubscription?.cancel();
_activeMeasurements.clear();
controller.close();
},
);
return controller.stream.distinct();
}