From e62be3b12d3c94d709a77d89f52c31f7c4ac475d Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Sat, 4 Dec 2021 22:22:47 -0800 Subject: Initial commit. --- arduino/Counter.cc | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100755 arduino/Counter.cc (limited to 'arduino/Counter.cc') diff --git a/arduino/Counter.cc b/arduino/Counter.cc new file mode 100755 index 0000000..abf7c27 --- /dev/null +++ b/arduino/Counter.cc @@ -0,0 +1,98 @@ +#include "Counter.h" + +#include + +void Counter::init (unsigned long startDelay, unsigned long rpmCount, unsigned long signalsPerRPM) +{ + this->startDelay = startDelay; + this->rpmCount = rpmCount; + this->signalsPerRPM = signalsPerRPM; + reset(); +} + +void Counter::setStartDelay (unsigned long val) +{ + startDelay = val; +} + +void Counter::setRPMCount (unsigned long val) +{ + rpmCount = val; +} + +void Counter::setSignalsPerRPM (unsigned long val) +{ + signalsPerRPM = val; +} + +void Counter::start (unsigned long startTime) +{ + if (state == READY) + { + this->startTime = startTime; + state = WAITING_FOR_TIMEOUT; + } +} + +void Counter::reset () +{ + state = READY; +} + +void Counter::update (unsigned long t, int rpmSignal) +{ + switch (state) + { + case WAITING_FOR_TIMEOUT: + { + if (t - startTime >= startDelay) + { + startTime = t; // Update start time for counting state + signals = 0; + state = COUNTING; + } + break; + } + case COUNTING: + { + // Count signals in 1 second intervals + if (lastRpmSignal != rpmSignal && rpmSignal == HIGH) + { + signals++; + } + // 1 second interval reached + if (t - startTime >= 1000) + { + float rpm = ((float) signals / (float) signalsPerRPM) * 60.0f; + if (rpm <= rpmCount) + { + startTime = t; // Update start time for signaling state + state = SIGNALING; + } + else + { + // RPM threshold not reached. + // Count signals per second from scratch. + //Serial.print("rpm: \r\n"); Serial.print(rpm); Serial.print("\r\n"); + startTime = t; + signals = 0; + } + } + break; + } + case SIGNALING: + { + if (t - startTime >= 3000) + { + state = READY; + } + } + default: break; + } + lastRpmSignal = rpmSignal; +} + +Counter::State Counter::getState () const +{ + return state; +} -- cgit v1.2.3