Charles Young's development fork. Going forward I only want to push mature code to main repository.

Dependencies:   mbed

Fork of GEO_COUNTER_L432KC by Geo Electronics "Geo Counter"

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?

UserRevisionLine numberNew 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