44 lines
1.0 KiB
C++
44 lines
1.0 KiB
C++
#include "debouncer.h"
|
|
|
|
namespace modules {
|
|
namespace debounce {
|
|
|
|
// original idea from: https://www.eeweb.com/debouncing-push-buttons-using-a-state-machine-approach
|
|
void Debouncer::Step(uint16_t time, bool press) {
|
|
switch (f.state) {
|
|
case State::Waiting:
|
|
if (press) {
|
|
f.state = State::Detected;
|
|
timeLastChange = time;
|
|
f.tmp = press;
|
|
}
|
|
break;
|
|
case State::Detected:
|
|
if (f.tmp == press) {
|
|
if (time - timeLastChange >= debounceTimeout) {
|
|
f.state = State::WaitForRelease;
|
|
}
|
|
} else {
|
|
f.state = State::Waiting;
|
|
}
|
|
break;
|
|
case State::WaitForRelease:
|
|
if (!press) {
|
|
f.state = State::Update;
|
|
}
|
|
break;
|
|
case State::Update:
|
|
f.state = State::Waiting;
|
|
timeLastChange = time;
|
|
f.tmp = false;
|
|
break;
|
|
default:
|
|
f.state = State::Waiting;
|
|
timeLastChange = time;
|
|
f.tmp = false;
|
|
}
|
|
}
|
|
|
|
} // namespace debounce
|
|
} // namespace modules
|