detectPulse method

bool detectPulse(
  1. double sensorValue
)

Implementation

bool detectPulse(double sensorValue) {
  if (sensorValue > pulseMaxThreshold) {
    currentPulseDetectorState = _PulseStateMachine.pulseIdle;
    prevSensorValue = 0;
    lastBeat = 0;
    currentBeat = 0;
    valuesWentDown = 0;
    lastBeatThreshold = 0;
    return false;
  }

  switch (currentPulseDetectorState) {
    case _PulseStateMachine.pulseIdle:
      if (sensorValue >= pulseMinThreshold) {
        currentPulseDetectorState = _PulseStateMachine.pulseTraceUp;
        valuesWentDown = 0;
      }
      break;

    case _PulseStateMachine.pulseTraceUp:
      if (sensorValue > prevSensorValue) {
        currentBeat = DateTime.now().millisecondsSinceEpoch;
        lastBeatThreshold = sensorValue;
      } else {
        if (debug == true) {
          printWithTimestamp("Peak reached: $sensorValue $prevSensorValue");
        }

        int beatDuration = currentBeat - lastBeat;
        lastBeat = currentBeat;

        double rawBPM = 0;
        if (beatDuration > 0) {
          rawBPM = 60000.0 / beatDuration;
        }
        if (debug == true) {
          printWithTimestamp("rawBPM: $rawBPM");
        }

        valuesBPM[bpmIndex] = rawBPM;
        valuesBPMSum = 0;
        for (int i = 0; i < pulseBpmSampleSize; i++) {
          valuesBPMSum += valuesBPM[i];
        }

        if (debug == true) {
          printWithTimestamp("CurrentMoving Avg: $valuesBPM");
        }

        bpmIndex++;
        bpmIndex = bpmIndex % pulseBpmSampleSize;

        if (valuesBPMCount < pulseBpmSampleSize) {
          valuesBPMCount++;
        }

        currentBPM = valuesBPMSum / valuesBPMCount;
        if (debug == true) {
          printWithTimestamp("Avg. BPM: $currentBPM");
        }

        currentPulseDetectorState = _PulseStateMachine.pulseTraceDown;

        return true;
      }
      break;

    case _PulseStateMachine.pulseTraceDown:
      if (sensorValue < prevSensorValue) {
        valuesWentDown++;
      }

      if (sensorValue < pulseMinThreshold) {
        currentPulseDetectorState = _PulseStateMachine.pulseIdle;
      }
      break;
  }

  prevSensorValue = sensorValue;
  return false;
}