12#ifndef M5_UNIT_KEYBOARD_UTILITY_BUTTON_EVENT_DETECTOR_HPP
13#define M5_UNIT_KEYBOARD_UTILITY_BUTTON_EVENT_DETECTOR_HPP
19namespace keyboard_bitwise {
41 uint32_t short_press_ms{200};
42 uint32_t long_press_ms{400};
63 ButtonEvent edge(
const bool pressed,
const uint32_t now_ms)
71 return ButtonEvent::PressDown;
73 return ButtonEvent::None;
78 _state = State::WaitRepeat;
79 return ButtonEvent::PressUp;
81 return ButtonEvent::None;
83 case State::WaitRepeat:
87 _state = State::RepeatDown;
88 return ButtonEvent::PressDown;
90 return ButtonEvent::None;
92 case State::RepeatDown:
95 _state = State::WaitRepeat;
96 return ButtonEvent::PressUp;
98 return ButtonEvent::None;
100 case State::LongHold:
102 _state = State::Idle;
103 return ButtonEvent::LongPressUp;
105 return ButtonEvent::None;
107 return ButtonEvent::None;
116 if (now_ms - _t0 >= _cfg.long_press_ms) {
117 _state = State::LongHold;
118 return ButtonEvent::LongPressStart;
120 return ButtonEvent::None;
122 case State::WaitRepeat:
123 if (now_ms - _t0 > _cfg.short_press_ms) {
124 const uint8_t repeat = _repeat;
126 _state = State::Idle;
127 if (repeat == 1)
return ButtonEvent::SingleClick;
128 if (repeat == 2)
return ButtonEvent::DoubleClick;
129 return ButtonEvent::None;
131 return ButtonEvent::None;
134 return ButtonEvent::None;
139 enum class State : uint8_t { Idle, Down, WaitRepeat, RepeatDown, LongHold };
142 State _state{State::Idle};
Top level namespace of M5Stack.