25 #include "TimingStats.h" 26 #include "AceButton.h" 33 #error HIGH must be defined to be 1 36 #error LOW must be defined to be 0 41 init(pin, defaultReleasedState,
id);
49 mLastDebounceTime = 0;
51 setDefaultReleasedState(defaultReleasedState);
54 void AceButton::setDefaultReleasedState(uint8_t state) {
56 mFlags |= kFlagDefaultReleasedState;
58 mFlags &= ~kFlagDefaultReleasedState;
63 return (mFlags & kFlagDefaultReleasedState) ? HIGH : LOW;
76 uint16_t now = mButtonConfig->
getClock();
78 uint8_t buttonState = mButtonConfig->
readButton(mPin);
81 if (checkDebounced(now, buttonState)) {
83 if (checkInitialized(buttonState)) {
84 checkEvent(now, buttonState);
89 if (stats !=
nullptr) {
90 uint16_t elapsedMicros = mButtonConfig->
getClockMicros() - nowMicros;
91 stats->update(elapsedMicros);
95 void AceButton::checkEvent(uint16_t now, uint8_t buttonState) {
109 checkPostponedClick(now);
110 checkOrphanedClick(now);
114 checkLongPress(now, buttonState);
117 checkRepeatPress(now, buttonState);
120 checkChanged(now, buttonState);
124 bool AceButton::checkDebounced(uint16_t now, uint8_t buttonState) {
125 if (isDebouncing()) {
136 uint16_t elapsedTime = now - mLastDebounceTime;
138 bool isDebouncingTimeOver =
141 if (isDebouncingTimeOver) {
157 mLastDebounceTime = now;
162 bool AceButton::checkInitialized(uint16_t buttonState) {
173 mLastButtonState = buttonState;
177 void AceButton::checkLongPress(uint16_t now, uint8_t buttonState) {
182 if (isPressed() && !isLongPressed()) {
183 uint16_t elapsedTime = now - mLastPressTime;
191 void AceButton::checkRepeatPress(uint16_t now, uint8_t buttonState) {
197 if (isRepeatPressed()) {
198 uint16_t elapsedTime = now - mLastRepeatPressTime;
201 mLastRepeatPressTime = now;
204 uint16_t elapsedTime = now - mLastPressTime;
210 mLastRepeatPressTime = now;
216 void AceButton::checkChanged(uint16_t now, uint8_t buttonState) {
217 mLastButtonState = buttonState;
218 checkPressed(now, buttonState);
219 checkReleased(now, buttonState);
222 void AceButton::checkPressed(uint16_t now, uint8_t buttonState) {
228 mLastPressTime = now;
233 void AceButton::checkReleased(uint16_t now, uint8_t buttonState) {
250 (isRepeatPressed() &&
255 (isDoubleClicked() &&
261 clearDoubleClicked();
263 clearRepeatPressed();
270 void AceButton::checkClicked(uint16_t now) {
279 uint16_t elapsedTime = now - mLastPressTime;
287 checkDoubleClicked(now);
293 if (isDoubleClicked()) {
299 mLastClickTime = now;
309 void AceButton::checkDoubleClicked(uint16_t now) {
311 clearDoubleClicked();
315 uint16_t elapsedTime = now - mLastClickTime;
317 clearDoubleClicked();
327 if (isClickPostponed()) {
328 clearClickPostponed();
334 void AceButton::checkOrphanedClick(uint16_t now) {
345 uint16_t elapsedTime = now - mLastClickTime;
346 if (isClicked() && (elapsedTime >= orphanedClickDelay)) {
351 void AceButton::checkPostponedClick(uint16_t now) {
353 uint16_t elapsedTime = now - mLastClickTime;
354 if (isClickPostponed() && elapsedTime >= postponedClickDelay) {
356 clearClickPostponed();
360 void AceButton::handleEvent(uint8_t eventType) {