#ifndef _DEBOUNCE_H_ #define _DEBOUNCE_H_ template class Debounce { public: enum class State : uint8_t { Unpressed, UnpressedDebounced, Pressed, PressedDebounced, }; enum class Result : uint8_t { NoEvent, Pressed, Released, }; Result event(bool pressed) { switch(state) { case State::Unpressed : if(pressed) { state = State::PressedDebounced; counter = millis(); return Result::Pressed; } break; case State::PressedDebounced : if(millis() - counter > DEBOUNCE_PRESSED) { state = State::Pressed; } break; case State::Pressed : if(!pressed) { state = State::UnpressedDebounced; counter = millis(); return Result::Released; } break; case State::UnpressedDebounced : if(millis() - counter > DEBOUNCE_UNPRESSED) { state = State::Unpressed; } break; } return Result::NoEvent; } private: State state = State::Unpressed; uint8_t counter = 0; }; #endif