
Charles Young's development fork. Going forward I only want to push mature code to main repository.
Fork of GEO_COUNTER_L432KC by
RotarySwitch.cpp@19:fd3e33641aa7, 2018-09-04 (annotated)
- Committer:
- Charles David Young
- Date:
- Tue Sep 04 08:28:34 2018 -0700
- Revision:
- 19:fd3e33641aa7
- Child:
- 20:fb73eaaf0894
Initial implementation of RotarySwitch. Needs debugging and integration with main.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Charles David Young |
19:fd3e33641aa7 | 1 | /** |
Charles David Young |
19:fd3e33641aa7 | 2 | * @author Charles Young |
Charles David Young |
19:fd3e33641aa7 | 3 | * |
Charles David Young |
19:fd3e33641aa7 | 4 | */ |
Charles David Young |
19:fd3e33641aa7 | 5 | |
Charles David Young |
19:fd3e33641aa7 | 6 | #include "RotatySwitch.hpp" |
Charles David Young |
19:fd3e33641aa7 | 7 | |
Charles David Young |
19:fd3e33641aa7 | 8 | RotatySwitch::RotatySwitch(PinName channelA, |
Charles David Young |
19:fd3e33641aa7 | 9 | PinName channelB) |
Charles David Young |
19:fd3e33641aa7 | 10 | : channelA_(channelA), channelB_(channelB) |
Charles David Young |
19:fd3e33641aa7 | 11 | { |
Charles David Young |
19:fd3e33641aa7 | 12 | Wheel.reset(); |
Charles David Young |
19:fd3e33641aa7 | 13 | LEDs_write(0x00); |
Charles David Young |
19:fd3e33641aa7 | 14 | SecTenth_Beat.attach_us(&UpdateInput, 100000); |
Charles David Young |
19:fd3e33641aa7 | 15 | Sec_Beat.attach_us(&UpdateOutput, 1000000); |
Charles David Young |
19:fd3e33641aa7 | 16 | } |
Charles David Young |
19:fd3e33641aa7 | 17 | |
Charles David Young |
19:fd3e33641aa7 | 18 | void RotatySwitch::GetPosition(void) |
Charles David Young |
19:fd3e33641aa7 | 19 | { |
Charles David Young |
19:fd3e33641aa7 | 20 | return LED_status_index; |
Charles David Young |
19:fd3e33641aa7 | 21 | } |
Charles David Young |
19:fd3e33641aa7 | 22 | |
Charles David Young |
19:fd3e33641aa7 | 23 | void RotatySwitch::UpdateOutput() |
Charles David Young |
19:fd3e33641aa7 | 24 | { |
Charles David Young |
19:fd3e33641aa7 | 25 | // Blink mode LED |
Charles David Young |
19:fd3e33641aa7 | 26 | if (WHEEL_MODE_SELECT == currentWheelState) |
Charles David Young |
19:fd3e33641aa7 | 27 | LEDs_write(0); |
Charles David Young |
19:fd3e33641aa7 | 28 | |
Charles David Young |
19:fd3e33641aa7 | 29 | if (WheelStateTimer) |
Charles David Young |
19:fd3e33641aa7 | 30 | { |
Charles David Young |
19:fd3e33641aa7 | 31 | WheelStateTimer++; |
Charles David Young |
19:fd3e33641aa7 | 32 | if (++WheelStateTimer > WheelStateTimeout) |
Charles David Young |
19:fd3e33641aa7 | 33 | { |
Charles David Young |
19:fd3e33641aa7 | 34 | WheelStateMachine(WHEEL_Timeout); |
Charles David Young |
19:fd3e33641aa7 | 35 | WheelStateTimer = 0; |
Charles David Young |
19:fd3e33641aa7 | 36 | } |
Charles David Young |
19:fd3e33641aa7 | 37 | } |
Charles David Young |
19:fd3e33641aa7 | 38 | } |
Charles David Young |
19:fd3e33641aa7 | 39 | |
Charles David Young |
19:fd3e33641aa7 | 40 | void RotatySwitch::UpdateInput() |
Charles David Young |
19:fd3e33641aa7 | 41 | { |
Charles David Young |
19:fd3e33641aa7 | 42 | LEDs_write(LED_statuses[LED_status_index]); |
Charles David Young |
19:fd3e33641aa7 | 43 | |
Charles David Young |
19:fd3e33641aa7 | 44 | // react to wheel if in proper state |
Charles David Young |
19:fd3e33641aa7 | 45 | WheelCurrent = int(Wheel.getPulses()); |
Charles David Young |
19:fd3e33641aa7 | 46 | if ( (WHEEL_MODE_SELECT == currentWheelState) |
Charles David Young |
19:fd3e33641aa7 | 47 | || (WHEEL_SUBMODE_SELECT == currentWheelState)) |
Charles David Young |
19:fd3e33641aa7 | 48 | { |
Charles David Young |
19:fd3e33641aa7 | 49 | if (WHEEL_MODE_SELECT == currentWheelState) |
Charles David Young |
19:fd3e33641aa7 | 50 | { |
Charles David Young |
19:fd3e33641aa7 | 51 | if (WheelCurrent > WheelPrevious) |
Charles David Young |
19:fd3e33641aa7 | 52 | LED_status_index = ++LED_status_index % sizeof(LED_statuses); |
Charles David Young |
19:fd3e33641aa7 | 53 | else |
Charles David Young |
19:fd3e33641aa7 | 54 | if (WheelCurrent < WheelPrevious) |
Charles David Young |
19:fd3e33641aa7 | 55 | LED_status_index = --LED_status_index % sizeof(LED_statuses); |
Charles David Young |
19:fd3e33641aa7 | 56 | } |
Charles David Young |
19:fd3e33641aa7 | 57 | // Keep resetting WheelStateTimer as long as wheel is moving |
Charles David Young |
19:fd3e33641aa7 | 58 | if (WheelPrevious != WheelCurrent) |
Charles David Young |
19:fd3e33641aa7 | 59 | WheelStateTimer = 1; |
Charles David Young |
19:fd3e33641aa7 | 60 | } |
Charles David Young |
19:fd3e33641aa7 | 61 | WheelPrevious = WheelCurrent; |
Charles David Young |
19:fd3e33641aa7 | 62 | |
Charles David Young |
19:fd3e33641aa7 | 63 | // detect when wheel button is pressed but wait until it is released |
Charles David Young |
19:fd3e33641aa7 | 64 | // before doing anything |
Charles David Young |
19:fd3e33641aa7 | 65 | bool QEPBbutton = QEPB.read(); |
Charles David Young |
19:fd3e33641aa7 | 66 | if ( (QEPBbutton) |
Charles David Young |
19:fd3e33641aa7 | 67 | && (!QEPBpressed)) |
Charles David Young |
19:fd3e33641aa7 | 68 | { |
Charles David Young |
19:fd3e33641aa7 | 69 | QEPBpressed = true; |
Charles David Young |
19:fd3e33641aa7 | 70 | } |
Charles David Young |
19:fd3e33641aa7 | 71 | else |
Charles David Young |
19:fd3e33641aa7 | 72 | if ( (!QEPBbutton) |
Charles David Young |
19:fd3e33641aa7 | 73 | && (QEPBpressed)) |
Charles David Young |
19:fd3e33641aa7 | 74 | { |
Charles David Young |
19:fd3e33641aa7 | 75 | QEPBpressed = false; |
Charles David Young |
19:fd3e33641aa7 | 76 | WheelStateMachine(WHEEL_Pressed); |
Charles David Young |
19:fd3e33641aa7 | 77 | } |
Charles David Young |
19:fd3e33641aa7 | 78 | |
Charles David Young |
19:fd3e33641aa7 | 79 | return; |
Charles David Young |
19:fd3e33641aa7 | 80 | } |
Charles David Young |
19:fd3e33641aa7 | 81 | |
Charles David Young |
19:fd3e33641aa7 | 82 | void RotatySwitch::WheelStateMachine(WheelStateEvent event) |
Charles David Young |
19:fd3e33641aa7 | 83 | { |
Charles David Young |
19:fd3e33641aa7 | 84 | switch (currentWheelState) { |
Charles David Young |
19:fd3e33641aa7 | 85 | case WHEEL_INACTIVE: |
Charles David Young |
19:fd3e33641aa7 | 86 | if (WHEEL_Pressed == event) |
Charles David Young |
19:fd3e33641aa7 | 87 | { |
Charles David Young |
19:fd3e33641aa7 | 88 | currentWheelState = WHEEL_MODE_SELECT; |
Charles David Young |
19:fd3e33641aa7 | 89 | WheelStateTimer = 1; |
Charles David Young |
19:fd3e33641aa7 | 90 | } |
Charles David Young |
19:fd3e33641aa7 | 91 | break; |
Charles David Young |
19:fd3e33641aa7 | 92 | case WHEEL_MODE_SELECT: |
Charles David Young |
19:fd3e33641aa7 | 93 | if (WHEEL_Pressed == event) |
Charles David Young |
19:fd3e33641aa7 | 94 | { |
Charles David Young |
19:fd3e33641aa7 | 95 | currentWheelState = WHEEL_SUBMODE_SELECT; |
Charles David Young |
19:fd3e33641aa7 | 96 | WheelStateTimer = 1; |
Charles David Young |
19:fd3e33641aa7 | 97 | } |
Charles David Young |
19:fd3e33641aa7 | 98 | else |
Charles David Young |
19:fd3e33641aa7 | 99 | if (WHEEL_Timeout == event) |
Charles David Young |
19:fd3e33641aa7 | 100 | currentWheelState = WHEEL_INACTIVE; |
Charles David Young |
19:fd3e33641aa7 | 101 | break; |
Charles David Young |
19:fd3e33641aa7 | 102 | case WHEEL_SUBMODE_SELECT: |
Charles David Young |
19:fd3e33641aa7 | 103 | if (WHEEL_Pressed == event) |
Charles David Young |
19:fd3e33641aa7 | 104 | { |
Charles David Young |
19:fd3e33641aa7 | 105 | currentWheelState = WHEEL_MODE_SELECT; |
Charles David Young |
19:fd3e33641aa7 | 106 | WheelStateTimer = 1; |
Charles David Young |
19:fd3e33641aa7 | 107 | } |
Charles David Young |
19:fd3e33641aa7 | 108 | else |
Charles David Young |
19:fd3e33641aa7 | 109 | if (WHEEL_Timeout == event) |
Charles David Young |
19:fd3e33641aa7 | 110 | currentWheelState = WHEEL_INACTIVE; |
Charles David Young |
19:fd3e33641aa7 | 111 | break; |
Charles David Young |
19:fd3e33641aa7 | 112 | default: |
Charles David Young |
19:fd3e33641aa7 | 113 | break; |
Charles David Young |
19:fd3e33641aa7 | 114 | } |
Charles David Young |
19:fd3e33641aa7 | 115 | } |
Charles David Young |
19:fd3e33641aa7 | 116 |