Line data Source code
1 : #include "IncrementDecrementButtons.hpp"
2 :
3 : BEGIN_AH_NAMESPACE
4 :
5 : IncrementDecrementButtons::State
6 38 : IncrementDecrementButtons::updateImplementation() {
7 38 : Button::State incrState = incrementButton.update();
8 38 : Button::State decrState = decrementButton.update();
9 :
10 38 : if (decrState == Button::Released && incrState == Button::Released) {
11 : // Both released
12 33 : } else if ((decrState == Button::Rising && incrState == Button::Released) ||
13 29 : (incrState == Button::Rising && decrState == Button::Released) ||
14 2 : (incrState == Button::Rising && decrState == Button::Rising)) {
15 : // One released, the other rising → nothing
16 : // now both released, so go to initial state
17 8 : longPressState = Initial;
18 25 : } else if (incrState == Button::Falling && decrState == Button::Falling) {
19 : // Both falling → reset
20 : // (rather unlikely, but just in case)
21 2 : longPressState = AfterReset;
22 2 : return Reset;
23 23 : } else if (incrState == Button::Falling) {
24 7 : if (decrState == Button::Pressed) {
25 : // One pressed, the other falling → reset
26 1 : longPressState = AfterReset;
27 1 : return Reset;
28 : } else {
29 : // Increment falling, the other released → increment
30 6 : return IncrementShort;
31 : }
32 16 : } else if (decrState == Button::Falling) {
33 7 : if (incrState == Button::Pressed) {
34 : // One pressed, the other falling → reset
35 1 : longPressState = AfterReset;
36 1 : return Reset;
37 : } else {
38 : // Decrement falling, the other released → decrement
39 6 : return DecrementShort;
40 : }
41 9 : } else if (incrState == Button::Pressed && decrState == Button::Pressed) {
42 : // Both pressed → nothing
43 9 : } else if (longPressState != AfterReset && incrState == Button::Pressed) {
44 : // Not reset and increment pressed → long press?
45 4 : auto now = millis();
46 4 : if (longPressState == LongPress) {
47 2 : if (now - longPressRepeat >= LONG_PRESS_REPEAT_DELAY) {
48 1 : longPressRepeat += LONG_PRESS_REPEAT_DELAY;
49 1 : return IncrementHold;
50 : }
51 2 : } else if (incrementButton.stableTime() >= LONG_PRESS_DELAY) {
52 1 : longPressState = LongPress;
53 1 : longPressRepeat = now;
54 1 : return IncrementLong;
55 : }
56 7 : } else if (longPressState != AfterReset && decrState == Button::Pressed) {
57 : // Not reset and decrement pressed → long press?
58 4 : auto now = millis();
59 4 : if (longPressState == LongPress) {
60 2 : if (now - longPressRepeat >= LONG_PRESS_REPEAT_DELAY) {
61 1 : longPressRepeat += LONG_PRESS_REPEAT_DELAY;
62 1 : return DecrementHold;
63 : }
64 2 : } else if (decrementButton.stableTime() >= LONG_PRESS_DELAY) {
65 1 : longPressState = LongPress;
66 1 : longPressRepeat = now;
67 1 : return DecrementLong;
68 : }
69 : }
70 18 : return Nothing;
71 : }
72 :
73 : END_AH_NAMESPACE
|