Implemented basic debounce

This commit is contained in:
2020-06-06 23:20:40 +02:00
parent 8a61f2a803
commit 33692fa054
2 changed files with 23 additions and 10 deletions

View File

@@ -44,6 +44,7 @@ State Helper<IN1, IN2, IN3, IN4>::read()
#ifdef FEATURE_DPAD #ifdef FEATURE_DPAD
Helper<PINS_DPAD_UP, PINS_DPAD_DOWN, PINS_DPAD_CONFIRM, PINS_DPAD_BACK> helper; Helper<PINS_DPAD_UP, PINS_DPAD_DOWN, PINS_DPAD_CONFIRM, PINS_DPAD_BACK> helper;
State lastState; State lastState;
millis_t debounceUp, debounceDown, debounceConfirm, debounceBack;
void init() void init()
{ {
@@ -61,27 +62,33 @@ void update()
ButtonBack = 3 ButtonBack = 3
}; };
if (std::get<ButtonUp>(lastState) != std::get<ButtonUp>(state)) constexpr auto debounceTime = 50;
if (std::get<ButtonUp>(lastState) != std::get<ButtonUp>(state) && now-debounceUp > debounceTime)
{ {
if (std::get<ButtonUp>(state)) if (std::get<ButtonUp>(state))
InputDispatcher::rotate(-1); InputDispatcher::rotate(-1);
std::get<ButtonUp>(lastState) = std::get<ButtonUp>(state); std::get<ButtonUp>(lastState) = std::get<ButtonUp>(state);
debounceUp = now;
} }
if (std::get<ButtonDown>(lastState) != std::get<ButtonDown>(state)) if (std::get<ButtonDown>(lastState) != std::get<ButtonDown>(state) && now-debounceDown > debounceTime)
{ {
if (std::get<ButtonDown>(state)) if (std::get<ButtonDown>(state))
InputDispatcher::rotate(1); InputDispatcher::rotate(1);
std::get<ButtonDown>(lastState) = std::get<ButtonDown>(state); std::get<ButtonDown>(lastState) = std::get<ButtonDown>(state);
debounceDown = now;
} }
if (std::get<ButtonConfirm>(lastState) != std::get<ButtonConfirm>(state)) if (std::get<ButtonConfirm>(lastState) != std::get<ButtonConfirm>(state) && now-debounceConfirm > debounceTime)
{ {
InputDispatcher::confirmButton(std::get<ButtonConfirm>(state)); InputDispatcher::confirmButton(std::get<ButtonConfirm>(state));
std::get<ButtonConfirm>(lastState) = std::get<ButtonConfirm>(state); std::get<ButtonConfirm>(lastState) = std::get<ButtonConfirm>(state);
debounceConfirm = now;
} }
if (std::get<ButtonBack>(lastState) != std::get<ButtonBack>(state)) if (std::get<ButtonBack>(lastState) != std::get<ButtonBack>(state) && now-debounceBack > debounceTime)
{ {
InputDispatcher::backButton(std::get<ButtonBack>(state)); InputDispatcher::backButton(std::get<ButtonBack>(state));
std::get<ButtonBack>(lastState) = std::get<ButtonBack>(state); std::get<ButtonBack>(lastState) = std::get<ButtonBack>(state);
debounceBack = now;
} }
} }
#endif #endif

View File

@@ -58,10 +58,12 @@ dpad::State Helper<OUT, IN1, IN2>::read()
#ifdef FEATURE_DPAD_3WIRESW #ifdef FEATURE_DPAD_3WIRESW
Helper<PINS_DPAD_3WIRESW_OUT, PINS_DPAD_3WIRESW_IN1, PINS_DPAD_3WIRESW_IN2> helper; Helper<PINS_DPAD_3WIRESW_OUT, PINS_DPAD_3WIRESW_IN1, PINS_DPAD_3WIRESW_IN2> helper;
dpad::State lastState; dpad::State lastState;
millis_t debounceUp, debounceDown, debounceConfirm, debounceBack;
void init() void init()
{ {
helper.begin(); helper.begin();
debounceUp = debounceDown = debounceConfirm = debounceBack = millis();
} }
void update() void update()
@@ -76,30 +78,34 @@ void update()
ButtonBack = 2 ButtonBack = 2
}; };
if (std::get<ButtonUp>(lastState) != std::get<ButtonUp>(state)) constexpr auto debounceTime = 50;
if (std::get<ButtonUp>(lastState) != std::get<ButtonUp>(state) && now-debounceUp > debounceTime)
{ {
if (std::get<ButtonUp>(state)) if (std::get<ButtonUp>(state))
InputDispatcher::rotate(-1); InputDispatcher::rotate(-1);
std::get<ButtonUp>(lastState) = std::get<ButtonUp>(state); std::get<ButtonUp>(lastState) = std::get<ButtonUp>(state);
debounceUp = now;
} }
if (std::get<ButtonDown>(lastState) != std::get<ButtonDown>(state)) if (std::get<ButtonDown>(lastState) != std::get<ButtonDown>(state) && now-debounceDown > debounceTime)
{ {
if (std::get<ButtonDown>(state)) if (std::get<ButtonDown>(state))
InputDispatcher::rotate(1); InputDispatcher::rotate(1);
std::get<ButtonDown>(lastState) = std::get<ButtonDown>(state); std::get<ButtonDown>(lastState) = std::get<ButtonDown>(state);
debounceDown = now;
} }
if (std::get<ButtonConfirm>(lastState) != std::get<ButtonConfirm>(state)) if (std::get<ButtonConfirm>(lastState) != std::get<ButtonConfirm>(state) && now-debounceConfirm > debounceTime)
{ {
InputDispatcher::confirmButton(std::get<ButtonConfirm>(state)); InputDispatcher::confirmButton(std::get<ButtonConfirm>(state));
std::get<ButtonConfirm>(lastState) = std::get<ButtonConfirm>(state); std::get<ButtonConfirm>(lastState) = std::get<ButtonConfirm>(state);
debounceConfirm = now;
} }
if (std::get<ButtonBack>(lastState) != std::get<ButtonBack>(state)) if (std::get<ButtonBack>(lastState) != std::get<ButtonBack>(state) && now-debounceBack > debounceTime)
{ {
InputDispatcher::backButton(std::get<ButtonBack>(state)); InputDispatcher::backButton(std::get<ButtonBack>(state));
std::get<ButtonBack>(lastState) = std::get<ButtonBack>(state); std::get<ButtonBack>(lastState) = std::get<ButtonBack>(state);
debounceBack = now;
} }
lastState = state;
} }
#endif #endif
} }