runSampler method
Implementation
Future<void> runSampler(Function(bool beatDetected, double bpm, double sao2) onBeat) async {
int lastReadAndCalculateTime = 0;
clearFIFO(true);
int lastCalledOnBeat = DateTime.now().microsecondsSinceEpoch;
int microsBetweenSamples = (1000000 / sampleRate).round();
captureStartTimeMicros = DateTime.now().microsecondsSinceEpoch;
while (true) {
// take sample from the device and process it
_PulseOxymeterData latestValues = await readSamplesAndCalculate();
lastReadAndCalculateTime = DateTime.now().microsecondsSinceEpoch;
if (latestValues.pulseDetected || DateTime.now().microsecondsSinceEpoch - lastCalledOnBeat > 2000000) {
latestValues.saO2 = double.parse(latestValues.saO2.toStringAsFixed(1));
latestValues.heartBPM = double.parse(latestValues.heartBPM.toStringAsFixed(1));
printWithTimestamp(
"runSampler calling onBeat called with beatDetected:${latestValues.pulseDetected} bpm:${latestValues.heartBPM} sao2:${latestValues.saO2}");
onBeat(latestValues.pulseDetected, latestValues.heartBPM, latestValues.saO2);
lastCalledOnBeat = DateTime.now().microsecondsSinceEpoch;
}
// Need to wait until millisBetweenSamples milliseconds have passed before taking next sample
int nextSampleTime = lastReadAndCalculateTime + microsBetweenSamples;
int waitTimeInMicros = nextSampleTime - DateTime.now().microsecondsSinceEpoch;
if (waitTimeInMicros > 0) {
await Future.delayed(Duration(microseconds: waitTimeInMicros));
}
}
}