25 #include "TimingStats.h" 26 #include "AceButton.h" 33 #define CONCAT_(x, y) x##y 34 #define CONCAT(x,y) CONCAT_(x,y) 35 #define COMPILE_TIME_ASSERT(cond, msg) \ 36 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 uint8_t defaultReleasedState, uint8_t
id) {
62 init(buttonConfig, pin, defaultReleasedState,
id);
70 mLastDebounceTime = 0;
72 setDefaultReleasedState(defaultReleasedState);
76 uint8_t defaultReleasedState, uint8_t
id) {
77 mButtonConfig = buttonConfig;
78 init(pin, defaultReleasedState,
id);
81 void AceButton::setDefaultReleasedState(uint8_t state) {
83 mFlags |= kFlagDefaultReleasedState;
85 mFlags &= ~kFlagDefaultReleasedState;
90 return (mFlags & kFlagDefaultReleasedState) ? HIGH : LOW;
103 uint16_t now = mButtonConfig->
getClock();
105 uint8_t buttonState = mButtonConfig->
readButton(mPin);
108 if (checkDebounced(now, buttonState)) {
110 if (checkInitialized(buttonState)) {
111 checkEvent(now, buttonState);
116 if (stats !=
nullptr) {
117 uint16_t elapsedMicros = mButtonConfig->
getClockMicros() - nowMicros;
118 stats->update(elapsedMicros);
123 uint16_t now = mButtonConfig->
getClock();
126 if (checkDebounced(now, buttonState)) {
128 if (checkInitialized(buttonState)) {
129 checkEvent(now, buttonState);
134 void AceButton::checkEvent(uint16_t now, uint8_t buttonState) {
148 checkPostponedClick(now);
149 checkOrphanedClick(now);
153 checkLongPress(now, buttonState);
156 checkRepeatPress(now, buttonState);
159 checkChanged(now, buttonState);
163 bool AceButton::checkDebounced(uint16_t now, uint8_t buttonState) {
164 if (isDebouncing()) {
175 uint16_t elapsedTime = now - mLastDebounceTime;
177 bool isDebouncingTimeOver =
180 if (isDebouncingTimeOver) {
196 mLastDebounceTime = now;
201 bool AceButton::checkInitialized(uint16_t buttonState) {
212 mLastButtonState = buttonState;
216 void AceButton::checkLongPress(uint16_t now, uint8_t buttonState) {
221 if (isPressed() && !isLongPressed()) {
222 uint16_t elapsedTime = now - mLastPressTime;
230 void AceButton::checkRepeatPress(uint16_t now, uint8_t buttonState) {
236 if (isRepeatPressed()) {
237 uint16_t elapsedTime = now - mLastRepeatPressTime;
240 mLastRepeatPressTime = now;
243 uint16_t elapsedTime = now - mLastPressTime;
249 mLastRepeatPressTime = now;
255 void AceButton::checkChanged(uint16_t now, uint8_t buttonState) {
256 mLastButtonState = buttonState;
257 checkPressed(now, buttonState);
258 checkReleased(now, buttonState);
261 void AceButton::checkPressed(uint16_t now, uint8_t buttonState) {
267 mLastPressTime = now;
272 void AceButton::checkReleased(uint16_t now, uint8_t buttonState) {
289 (isRepeatPressed() &&
294 (isDoubleClicked() &&
300 clearDoubleClicked();
302 clearRepeatPressed();
309 void AceButton::checkClicked(uint16_t now) {
318 uint16_t elapsedTime = now - mLastPressTime;
326 checkDoubleClicked(now);
332 if (isDoubleClicked()) {
338 mLastClickTime = now;
348 void AceButton::checkDoubleClicked(uint16_t now) {
350 clearDoubleClicked();
354 uint16_t elapsedTime = now - mLastClickTime;
356 clearDoubleClicked();
366 if (isClickPostponed()) {
367 clearClickPostponed();
373 void AceButton::checkOrphanedClick(uint16_t now) {
384 uint16_t elapsedTime = now - mLastClickTime;
385 if (isClicked() && (elapsedTime >= orphanedClickDelay)) {
390 void AceButton::checkPostponedClick(uint16_t now) {
392 uint16_t elapsedTime = now - mLastClickTime;
393 if (isClickPostponed() && elapsedTime >= postponedClickDelay) {
395 clearClickPostponed();
399 void AceButton::handleEvent(uint8_t eventType) {