25 #include "TimingStats.h" 26 #include "AceButton.h" 36 #define CONCAT_(x, y) x##y 37 #define CONCAT(x,y) CONCAT_(x,y) 38 #define COMPILE_TIME_ASSERT(cond, msg) \ 39 extern char CONCAT(compile_time_assert, __LINE__)[(cond) ? 1 : -1]; 40 COMPILE_TIME_ASSERT(HIGH == 1,
"HIGH must be 1")
41 COMPILE_TIME_ASSERT(LOW == 0, "LOW must be 0")
45 #if ARDUINO_API_VERSION >= 10000 52 "kButtonStateUnknown conflicts with PinStatus enum")
57 init(pin, defaultReleasedState,
id);
61 mButtonConfig(buttonConfig) {
70 mLastDebounceTime = 0;
72 setDefaultReleasedState(defaultReleasedState);
75 void AceButton::setDefaultReleasedState(uint8_t state) {
77 mFlags |= kFlagDefaultReleasedState;
79 mFlags &= ~kFlagDefaultReleasedState;
84 return (mFlags & kFlagDefaultReleasedState) ? HIGH : LOW;
97 uint16_t now = mButtonConfig->
getClock();
99 uint8_t buttonState = mButtonConfig->
readButton(mPin);
102 if (checkDebounced(now, buttonState)) {
104 if (checkInitialized(buttonState)) {
105 checkEvent(now, buttonState);
110 if (stats !=
nullptr) {
111 uint16_t elapsedMicros = mButtonConfig->
getClockMicros() - nowMicros;
112 stats->update(elapsedMicros);
116 void AceButton::checkEvent(uint16_t now, uint8_t buttonState) {
130 checkPostponedClick(now);
131 checkOrphanedClick(now);
135 checkLongPress(now, buttonState);
138 checkRepeatPress(now, buttonState);
141 checkChanged(now, buttonState);
145 bool AceButton::checkDebounced(uint16_t now, uint8_t buttonState) {
146 if (isDebouncing()) {
157 uint16_t elapsedTime = now - mLastDebounceTime;
159 bool isDebouncingTimeOver =
162 if (isDebouncingTimeOver) {
178 mLastDebounceTime = now;
183 bool AceButton::checkInitialized(uint16_t buttonState) {
194 mLastButtonState = buttonState;
198 void AceButton::checkLongPress(uint16_t now, uint8_t buttonState) {
203 if (isPressed() && !isLongPressed()) {
204 uint16_t elapsedTime = now - mLastPressTime;
212 void AceButton::checkRepeatPress(uint16_t now, uint8_t buttonState) {
218 if (isRepeatPressed()) {
219 uint16_t elapsedTime = now - mLastRepeatPressTime;
222 mLastRepeatPressTime = now;
225 uint16_t elapsedTime = now - mLastPressTime;
231 mLastRepeatPressTime = now;
237 void AceButton::checkChanged(uint16_t now, uint8_t buttonState) {
238 mLastButtonState = buttonState;
239 checkPressed(now, buttonState);
240 checkReleased(now, buttonState);
243 void AceButton::checkPressed(uint16_t now, uint8_t buttonState) {
249 mLastPressTime = now;
254 void AceButton::checkReleased(uint16_t now, uint8_t buttonState) {
271 (isRepeatPressed() &&
276 (isDoubleClicked() &&
282 clearDoubleClicked();
284 clearRepeatPressed();
291 void AceButton::checkClicked(uint16_t now) {
300 uint16_t elapsedTime = now - mLastPressTime;
308 checkDoubleClicked(now);
314 if (isDoubleClicked()) {
320 mLastClickTime = now;
330 void AceButton::checkDoubleClicked(uint16_t now) {
332 clearDoubleClicked();
336 uint16_t elapsedTime = now - mLastClickTime;
338 clearDoubleClicked();
348 if (isClickPostponed()) {
349 clearClickPostponed();
355 void AceButton::checkOrphanedClick(uint16_t now) {
366 uint16_t elapsedTime = now - mLastClickTime;
367 if (isClicked() && (elapsedTime >= orphanedClickDelay)) {
372 void AceButton::checkPostponedClick(uint16_t now) {
374 uint16_t elapsedTime = now - mLastClickTime;
375 if (isClickPostponed() && elapsedTime >= postponedClickDelay) {
377 clearClickPostponed();
381 void AceButton::handleEvent(uint8_t eventType) {