diff --git a/code/gpios.cpp b/code/gpios.cpp index 62c0f21..be49d76 100644 --- a/code/gpios.cpp +++ b/code/gpios.cpp @@ -145,19 +145,23 @@ GpioClient::GpioClient(bool sim) for(auto& [buttonID, buttonData] : m_buttons) { bool rawButtonState = ButtonData::GetButtonState(buttonData); - if(rawButtonState == true) - { - buttonData.m_pressedTime++; - if(buttonData.m_pressedTime == buttonData.DEBOUNCE_TIME) - { - buttonData.m_pressed = true; - buttonData.CallUserCallbacks(); - } - } - else - { - buttonData.m_pressedTime = 0; - } + if (rawButtonState == true) + { + if (buttonData.m_pressedTime < buttonData.DEBOUNCE_TIME + 1) { + buttonData.m_pressedTime++; + } + + if (buttonData.m_pressedTime >= buttonData.DEBOUNCE_TIME && !buttonData.m_isCurrentlyPressed) + { + buttonData.m_isCurrentlyPressed = true; + buttonData.CallUserCallbacks(); + } + } + else + { + buttonData.m_pressedTime = 0; + buttonData.m_isCurrentlyPressed = false; + } } std::this_thread::sleep_for(std::chrono::milliseconds(25)); } diff --git a/code/gpios.h b/code/gpios.h index 5c927ee..57c1675 100644 --- a/code/gpios.h +++ b/code/gpios.h @@ -28,6 +28,7 @@ struct ButtonData{ uint32_t m_pressedTime {0}; //! time when button was pressed GPIO::GPIO_PULL m_pullMode; //! pull up or down bool m_pressed; //! is button pressed + bool m_isStablePressed {false}; //! Tracks the button's current stable, debounced state (ON/OFF) Callbacks m_callbacks; //! callbacks to call when button is pressed static constexpr int DEBOUNCE_TIME = 2; //! debounce time in cycles