detectPulse method
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;
}