diff --git a/src/dpad.h b/src/dpad.h index 0466ca9..f7358ac 100644 --- a/src/dpad.h +++ b/src/dpad.h @@ -44,6 +44,7 @@ State Helper::read() #ifdef FEATURE_DPAD Helper helper; State lastState; +millis_t debounceUp, debounceDown, debounceConfirm, debounceBack; void init() { @@ -61,27 +62,33 @@ void update() ButtonBack = 3 }; - if (std::get(lastState) != std::get(state)) + constexpr auto debounceTime = 50; + + if (std::get(lastState) != std::get(state) && now-debounceUp > debounceTime) { if (std::get(state)) InputDispatcher::rotate(-1); std::get(lastState) = std::get(state); + debounceUp = now; } - if (std::get(lastState) != std::get(state)) + if (std::get(lastState) != std::get(state) && now-debounceDown > debounceTime) { if (std::get(state)) InputDispatcher::rotate(1); std::get(lastState) = std::get(state); + debounceDown = now; } - if (std::get(lastState) != std::get(state)) + if (std::get(lastState) != std::get(state) && now-debounceConfirm > debounceTime) { InputDispatcher::confirmButton(std::get(state)); std::get(lastState) = std::get(state); + debounceConfirm = now; } - if (std::get(lastState) != std::get(state)) + if (std::get(lastState) != std::get(state) && now-debounceBack > debounceTime) { InputDispatcher::backButton(std::get(state)); std::get(lastState) = std::get(state); + debounceBack = now; } } #endif diff --git a/src/dpad3wire.h b/src/dpad3wire.h index 72fd1b5..e86f950 100644 --- a/src/dpad3wire.h +++ b/src/dpad3wire.h @@ -58,10 +58,12 @@ dpad::State Helper::read() #ifdef FEATURE_DPAD_3WIRESW Helper helper; dpad::State lastState; +millis_t debounceUp, debounceDown, debounceConfirm, debounceBack; void init() { helper.begin(); + debounceUp = debounceDown = debounceConfirm = debounceBack = millis(); } void update() @@ -76,30 +78,34 @@ void update() ButtonBack = 2 }; - if (std::get(lastState) != std::get(state)) + constexpr auto debounceTime = 50; + + if (std::get(lastState) != std::get(state) && now-debounceUp > debounceTime) { if (std::get(state)) InputDispatcher::rotate(-1); std::get(lastState) = std::get(state); + debounceUp = now; } - if (std::get(lastState) != std::get(state)) + if (std::get(lastState) != std::get(state) && now-debounceDown > debounceTime) { if (std::get(state)) InputDispatcher::rotate(1); std::get(lastState) = std::get(state); + debounceDown = now; } - if (std::get(lastState) != std::get(state)) + if (std::get(lastState) != std::get(state) && now-debounceConfirm > debounceTime) { InputDispatcher::confirmButton(std::get(state)); std::get(lastState) = std::get(state); + debounceConfirm = now; } - if (std::get(lastState) != std::get(state)) + if (std::get(lastState) != std::get(state) && now-debounceBack > debounceTime) { InputDispatcher::backButton(std::get(state)); std::get(lastState) = std::get(state); + debounceBack = now; } - - lastState = state; } #endif }