cs-midi/AH/Hardware/IncrementDecrementButtons.cpp

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