24 #include "AceButton.h" 31 #error HIGH must be defined to be 1 34 #error LOW must be defined to be 0 39 init(pin, defaultReleasedState,
id);
47 mLastDebounceTime = 0;
49 setDefaultReleasedState(defaultReleasedState);
52 void AceButton::setDefaultReleasedState(uint8_t state) {
54 mFlags |= kFlagDefaultReleasedState;
56 mFlags &= ~kFlagDefaultReleasedState;
61 return (mFlags & kFlagDefaultReleasedState) ? HIGH : LOW;
71 uint16_t now = mButtonConfig->
getClock();
73 uint8_t buttonState = mButtonConfig->
readButton(mPin);
76 if (!checkDebounced(now, buttonState))
return;
79 if (!checkInitialized(buttonState))
return;
94 checkPostponedClick(now);
95 checkOrphanedClick(now);
99 checkLongPress(now, buttonState);
102 checkRepeatPress(now, buttonState);
105 checkChanged(now, buttonState);
109 bool AceButton::checkDebounced(uint16_t now, uint8_t buttonState) {
110 if (isDebouncing()) {
121 uint16_t elapsedTime = now - mLastDebounceTime;
123 bool isDebouncingTimeOver =
126 if (isDebouncingTimeOver) {
142 mLastDebounceTime = now;
147 bool AceButton::checkInitialized(uint16_t buttonState) {
158 mLastButtonState = buttonState;
162 void AceButton::checkLongPress(uint16_t now, uint8_t buttonState) {
167 if (isPressed() && !isLongPressed()) {
168 uint16_t elapsedTime = now - mLastPressTime;
176 void AceButton::checkRepeatPress(uint16_t now, uint8_t buttonState) {
182 if (isRepeatPressed()) {
183 uint16_t elapsedTime = now - mLastRepeatPressTime;
186 mLastRepeatPressTime = now;
189 uint16_t elapsedTime = now - mLastPressTime;
195 mLastRepeatPressTime = now;
201 void AceButton::checkChanged(uint16_t now, uint8_t buttonState) {
202 mLastButtonState = buttonState;
203 checkPressed(now, buttonState);
204 checkReleased(now, buttonState);
207 void AceButton::checkPressed(uint16_t now, uint8_t buttonState) {
213 mLastPressTime = now;
218 void AceButton::checkReleased(uint16_t now, uint8_t buttonState) {
235 (isRepeatPressed() &&
240 (isDoubleClicked() &&
246 clearDoubleClicked();
248 clearRepeatPressed();
255 void AceButton::checkClicked(uint16_t now) {
264 uint16_t elapsedTime = now - mLastPressTime;
272 checkDoubleClicked(now);
278 if (isDoubleClicked()) {
284 mLastClickTime = now;
294 void AceButton::checkDoubleClicked(uint16_t now) {
296 clearDoubleClicked();
300 uint16_t elapsedTime = now - mLastClickTime;
302 clearDoubleClicked();
312 if (isClickPostponed()) {
313 clearClickPostponed();
319 void AceButton::checkOrphanedClick(uint16_t now) {
330 uint16_t elapsedTime = now - mLastClickTime;
331 if (isClicked() && (elapsedTime >= orphanedClickDelay)) {
336 void AceButton::checkPostponedClick(uint16_t now) {
338 uint16_t elapsedTime = now - mLastClickTime;
339 if (isClickPostponed() && elapsedTime >= postponedClickDelay) {
341 clearClickPostponed();
345 void AceButton::handleEvent(uint8_t eventType) {