74 lines
2.9 KiB
C++
74 lines
2.9 KiB
C++
#include "IncrementDecrementButtons.hpp"
|
|
|
|
BEGIN_AH_NAMESPACE
|
|
|
|
IncrementDecrementButtons::State
|
|
IncrementDecrementButtons::updateImplementation() {
|
|
Button::State incrState = incrementButton.update();
|
|
Button::State decrState = decrementButton.update();
|
|
|
|
if (decrState == Button::Released && incrState == Button::Released) {
|
|
// Both released
|
|
} else if ((decrState == Button::Rising && incrState == Button::Released) ||
|
|
(incrState == Button::Rising && decrState == Button::Released) ||
|
|
(incrState == Button::Rising && decrState == Button::Rising)) {
|
|
// One released, the other rising → nothing
|
|
// now both released, so go to initial state
|
|
longPressState = Initial;
|
|
} else if (incrState == Button::Falling && decrState == Button::Falling) {
|
|
// Both falling → reset
|
|
// (rather unlikely, but just in case)
|
|
longPressState = AfterReset;
|
|
return Reset;
|
|
} else if (incrState == Button::Falling) {
|
|
if (decrState == Button::Pressed) {
|
|
// One pressed, the other falling → reset
|
|
longPressState = AfterReset;
|
|
return Reset;
|
|
} else {
|
|
// Increment falling, the other released → increment
|
|
return IncrementShort;
|
|
}
|
|
} else if (decrState == Button::Falling) {
|
|
if (incrState == Button::Pressed) {
|
|
// One pressed, the other falling → reset
|
|
longPressState = AfterReset;
|
|
return Reset;
|
|
} else {
|
|
// Decrement falling, the other released → decrement
|
|
return DecrementShort;
|
|
}
|
|
} else if (incrState == Button::Pressed && decrState == Button::Pressed) {
|
|
// Both pressed → nothing
|
|
} else if (longPressState != AfterReset && incrState == Button::Pressed) {
|
|
// Not reset and increment pressed → long press?
|
|
auto now = millis();
|
|
if (longPressState == LongPress) {
|
|
if (now - longPressRepeat >= LONG_PRESS_REPEAT_DELAY) {
|
|
longPressRepeat += LONG_PRESS_REPEAT_DELAY;
|
|
return IncrementHold;
|
|
}
|
|
} else if (incrementButton.stableTime() >= LONG_PRESS_DELAY) {
|
|
longPressState = LongPress;
|
|
longPressRepeat = now;
|
|
return IncrementLong;
|
|
}
|
|
} else if (longPressState != AfterReset && decrState == Button::Pressed) {
|
|
// Not reset and decrement pressed → long press?
|
|
auto now = millis();
|
|
if (longPressState == LongPress) {
|
|
if (now - longPressRepeat >= LONG_PRESS_REPEAT_DELAY) {
|
|
longPressRepeat += LONG_PRESS_REPEAT_DELAY;
|
|
return DecrementHold;
|
|
}
|
|
} else if (decrementButton.stableTime() >= LONG_PRESS_DELAY) {
|
|
longPressState = LongPress;
|
|
longPressRepeat = now;
|
|
return DecrementLong;
|
|
}
|
|
}
|
|
return Nothing;
|
|
}
|
|
|
|
END_AH_NAMESPACE
|