Prusa-Firmware-MMU/src/modules/debouncer.cpp

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