
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
- Committer:
- Charles David Young
- Date:
- 2018-09-04
- Revision:
- 19:fd3e33641aa7
- Child:
- 20:fb73eaaf0894
File content as of revision 19:fd3e33641aa7:
/** * @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; } }