25 #include "AceButton.h"
27 namespace ace_button {
32 #define CONCAT_(x, y) x##y
33 #define CONCAT(x,y) CONCAT_(x,y)
34 #define COMPILE_TIME_ASSERT(cond, msg) \
35 extern char CONCAT(compile_time_assert, __LINE__)[(cond) ? 1 : -1];
39 COMPILE_TIME_ASSERT(HIGH == 1,
"HIGH must be 1")
40 COMPILE_TIME_ASSERT(LOW == 0, "LOW must be 0")
44 #if ARDUINO_API_VERSION >= 10000
51 "kButtonStateUnknown conflicts with PinStatus enum")
56 init(pin, defaultReleasedState,
id);
60 uint8_t defaultReleasedState, uint8_t
id) {
61 init(buttonConfig, pin, defaultReleasedState,
id);
69 mLastDebounceTime = 0;
71 setDefaultReleasedState(defaultReleasedState);
75 uint8_t defaultReleasedState, uint8_t
id) {
76 mButtonConfig = buttonConfig;
77 init(pin, defaultReleasedState,
id);
80 void AceButton::setDefaultReleasedState(uint8_t state) {
82 mFlags |= kFlagDefaultReleasedState;
84 mFlags &= ~kFlagDefaultReleasedState;
89 return (mFlags & kFlagDefaultReleasedState) ? HIGH : LOW;
95 uint8_t buttonState = mButtonConfig->
readButton(mPin);
104 uint16_t now = mButtonConfig->
getClock();
107 if (checkDebounced(now, buttonState)) {
109 if (checkInitialized(buttonState)) {
110 checkEvent(now, buttonState);
115 void AceButton::checkEvent(uint16_t now, uint8_t buttonState) {
129 checkPostponedClick(now);
130 checkOrphanedClick(now);
134 checkLongPress(now, buttonState);
137 checkRepeatPress(now, buttonState);
140 checkChanged(now, buttonState);
144 bool AceButton::checkDebounced(uint16_t now, uint8_t buttonState) {
145 if (isDebouncing()) {
156 uint16_t elapsedTime = now - mLastDebounceTime;
158 bool isDebouncingTimeOver =
161 if (isDebouncingTimeOver) {
177 mLastDebounceTime = now;
182 bool AceButton::checkInitialized(uint16_t buttonState) {
193 mLastButtonState = buttonState;
197 void AceButton::checkLongPress(uint16_t now, uint8_t buttonState) {
202 if (isPressed() && !isLongPressed()) {
203 uint16_t elapsedTime = now - mLastPressTime;
211 void AceButton::checkRepeatPress(uint16_t now, uint8_t buttonState) {
217 if (isRepeatPressed()) {
218 uint16_t elapsedTime = now - mLastRepeatPressTime;
221 mLastRepeatPressTime = now;
224 uint16_t elapsedTime = now - mLastPressTime;
230 mLastRepeatPressTime = now;
236 void AceButton::checkChanged(uint16_t now, uint8_t buttonState) {
237 mLastButtonState = buttonState;
238 checkPressed(now, buttonState);
239 checkReleased(now, buttonState);
242 void AceButton::checkPressed(uint16_t now, uint8_t buttonState) {
248 mLastPressTime = now;
253 void AceButton::checkReleased(uint16_t now, uint8_t buttonState) {
270 (isRepeatPressed() &&
275 (isDoubleClicked() &&
281 clearDoubleClicked();
283 clearRepeatPressed();
290 void AceButton::checkClicked(uint16_t now) {
299 uint16_t elapsedTime = now - mLastPressTime;
307 checkDoubleClicked(now);
313 if (isDoubleClicked()) {
319 mLastClickTime = now;
329 void AceButton::checkDoubleClicked(uint16_t now) {
331 clearDoubleClicked();
335 uint16_t elapsedTime = now - mLastClickTime;
337 clearDoubleClicked();
347 if (isClickPostponed()) {
348 clearClickPostponed();
354 void AceButton::checkOrphanedClick(uint16_t now) {
365 uint16_t elapsedTime = now - mLastClickTime;
366 if (isClicked() && (elapsedTime >= orphanedClickDelay)) {
371 void AceButton::checkPostponedClick(uint16_t now) {
373 uint16_t elapsedTime = now - mLastClickTime;
374 if (isClickPostponed() && elapsedTime >= postponedClickDelay) {
376 clearClickPostponed();
380 void AceButton::handleEvent(uint8_t eventType) {