Charles Young's development fork. Going forward I only want to push mature code to main repository.
Fork of GEO_COUNTER_L432KC by
Diff: RotarySwitch.cpp
- Revision:
- 19:fd3e33641aa7
- Child:
- 20:fb73eaaf0894
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RotarySwitch.cpp Tue Sep 04 08:28:34 2018 -0700 @@ -0,0 +1,116 @@ +/** + * @author Charles Young + * + */ + +#include "RotatySwitch.hpp" + +RotatySwitch::RotatySwitch(PinName channelA, + PinName channelB) + : channelA_(channelA), channelB_(channelB) +{ + Wheel.reset(); + LEDs_write(0x00); + SecTenth_Beat.attach_us(&UpdateInput, 100000); + Sec_Beat.attach_us(&UpdateOutput, 1000000); +} + +void RotatySwitch::GetPosition(void) +{ + return LED_status_index; +} + +void RotatySwitch::UpdateOutput() +{ + // Blink mode LED + if (WHEEL_MODE_SELECT == currentWheelState) + LEDs_write(0); + + if (WheelStateTimer) + { + WheelStateTimer++; + if (++WheelStateTimer > WheelStateTimeout) + { + WheelStateMachine(WHEEL_Timeout); + WheelStateTimer = 0; + } + } +} + +void RotatySwitch::UpdateInput() +{ + LEDs_write(LED_statuses[LED_status_index]); + + // react to wheel if in proper state + WheelCurrent = int(Wheel.getPulses()); + if ( (WHEEL_MODE_SELECT == currentWheelState) + || (WHEEL_SUBMODE_SELECT == currentWheelState)) + { + if (WHEEL_MODE_SELECT == currentWheelState) + { + if (WheelCurrent > WheelPrevious) + LED_status_index = ++LED_status_index % sizeof(LED_statuses); + else + if (WheelCurrent < WheelPrevious) + LED_status_index = --LED_status_index % sizeof(LED_statuses); + } + // Keep resetting WheelStateTimer as long as wheel is moving + if (WheelPrevious != WheelCurrent) + WheelStateTimer = 1; + } + WheelPrevious = WheelCurrent; + + // detect when wheel button is pressed but wait until it is released + // before doing anything + bool QEPBbutton = QEPB.read(); + if ( (QEPBbutton) + && (!QEPBpressed)) + { + QEPBpressed = true; + } + else + if ( (!QEPBbutton) + && (QEPBpressed)) + { + QEPBpressed = false; + WheelStateMachine(WHEEL_Pressed); + } + + return; +} + +void RotatySwitch::WheelStateMachine(WheelStateEvent event) +{ + switch (currentWheelState) { + case WHEEL_INACTIVE: + if (WHEEL_Pressed == event) + { + currentWheelState = WHEEL_MODE_SELECT; + WheelStateTimer = 1; + } + break; + case WHEEL_MODE_SELECT: + if (WHEEL_Pressed == event) + { + currentWheelState = WHEEL_SUBMODE_SELECT; + WheelStateTimer = 1; + } + else + if (WHEEL_Timeout == event) + currentWheelState = WHEEL_INACTIVE; + break; + case WHEEL_SUBMODE_SELECT: + if (WHEEL_Pressed == event) + { + currentWheelState = WHEEL_MODE_SELECT; + WheelStateTimer = 1; + } + else + if (WHEEL_Timeout == event) + currentWheelState = WHEEL_INACTIVE; + break; + default: + break; + } +} +