runSampler method

Future<void> runSampler(
  1. dynamic onBeat(
    1. bool beatDetected,
    2. double bpm,
    3. double sao2
    )
)

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));
    }
  }
}