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:
charlesdavidyoung
Date:
Wed Sep 05 17:31:35 2018 +0000
Revision:
26:166dbe6022e8
Parent:
24:db7494389c03
Child:
34:10550b327e3d
LED7segDisplay class debugged

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
charlesdavidyoung 20:fb73eaaf0894 6 #include "RotarySwitch.hpp"
charlesdavidyoung 20:fb73eaaf0894 7
charlesdavidyoung 20:fb73eaaf0894 8 // QEI class supports the mode wheel. In its most basic function it will tell
charlesdavidyoung 20:fb73eaaf0894 9 // us which direction the wheel is moving (right or left) so that we can
charlesdavidyoung 20:fb73eaaf0894 10 // use it to select the current mode.
charlesdavidyoung 20:fb73eaaf0894 11 QEI Wheel(D12, D11, NC, 16); // Quadrature encoder
Charles David Young 19:fd3e33641aa7 12
charlesdavidyoung 20:fb73eaaf0894 13 #define CPM 0x01
charlesdavidyoung 20:fb73eaaf0894 14 #define CPS 0x02
charlesdavidyoung 20:fb73eaaf0894 15 #define PLS 0x04
charlesdavidyoung 20:fb73eaaf0894 16 #define VOLTS 0x08
charlesdavidyoung 20:fb73eaaf0894 17 #define CNT1 0x10
charlesdavidyoung 20:fb73eaaf0894 18 #define CNT2 0x20
charlesdavidyoung 20:fb73eaaf0894 19 #define HV 0x40
charlesdavidyoung 20:fb73eaaf0894 20 #define MENU 0x80
charlesdavidyoung 20:fb73eaaf0894 21 uint8_t LED_statuses[] = {CPM, CPS, PLS, VOLTS, CNT1, CNT2, HV, MENU};
charlesdavidyoung 20:fb73eaaf0894 22
charlesdavidyoung 20:fb73eaaf0894 23 RotarySwitch::RotarySwitch()
Charles David Young 19:fd3e33641aa7 24 {
charlesdavidyoung 20:fb73eaaf0894 25 LED_status = CPM;
charlesdavidyoung 20:fb73eaaf0894 26 LED_status_index = 0;
charlesdavidyoung 20:fb73eaaf0894 27 WheelCurrent = 0;
charlesdavidyoung 20:fb73eaaf0894 28 WheelPrevious = 0;
charlesdavidyoung 20:fb73eaaf0894 29 QEPBpressed = false;
charlesdavidyoung 20:fb73eaaf0894 30 WheelStateTimer = 0;
charlesdavidyoung 20:fb73eaaf0894 31
charlesdavidyoung 20:fb73eaaf0894 32 LEDs_write(0x00); // initialize LEDs (CPM and CNT1 on)
Charles David Young 19:fd3e33641aa7 33 Wheel.reset();
Charles David Young 19:fd3e33641aa7 34 }
Charles David Young 19:fd3e33641aa7 35
charlesdavidyoung 20:fb73eaaf0894 36 int RotarySwitch::GetPosition(void)
Charles David Young 19:fd3e33641aa7 37 {
Charles David Young 19:fd3e33641aa7 38 return LED_status_index;
Charles David Young 19:fd3e33641aa7 39 }
Charles David Young 19:fd3e33641aa7 40
charlesdavidyoung 20:fb73eaaf0894 41 //---------------------------------------------------------------------------
charlesdavidyoung 20:fb73eaaf0894 42 //Write to 74HC595 (LEDs) - Take care to avoid conflict with MAX7219
charlesdavidyoung 20:fb73eaaf0894 43
charlesdavidyoung 20:fb73eaaf0894 44 void RotarySwitch::LEDs_write(unsigned short data_val)
charlesdavidyoung 20:fb73eaaf0894 45 {
charlesdavidyoung 20:fb73eaaf0894 46 #define DT 1 // delay time in us for SPI emulation
charlesdavidyoung 20:fb73eaaf0894 47
charlesdavidyoung 20:fb73eaaf0894 48 // Update 74HC595 shift registers
charlesdavidyoung 20:fb73eaaf0894 49 unsigned short mask;
charlesdavidyoung 20:fb73eaaf0894 50
charlesdavidyoung 20:fb73eaaf0894 51 SCK = 0;
charlesdavidyoung 20:fb73eaaf0894 52 wait_us(DT);
charlesdavidyoung 20:fb73eaaf0894 53 CS2 = 0;
charlesdavidyoung 20:fb73eaaf0894 54
charlesdavidyoung 20:fb73eaaf0894 55 for(mask = 0x80; mask!= 0; mask>>= 1)
charlesdavidyoung 20:fb73eaaf0894 56 {
charlesdavidyoung 20:fb73eaaf0894 57 wait_us(DT);
charlesdavidyoung 20:fb73eaaf0894 58 SCK = 0;
charlesdavidyoung 20:fb73eaaf0894 59 if(mask & data_val)
charlesdavidyoung 20:fb73eaaf0894 60 MOSI = 0;
charlesdavidyoung 20:fb73eaaf0894 61 else
charlesdavidyoung 20:fb73eaaf0894 62 MOSI = 1;
charlesdavidyoung 20:fb73eaaf0894 63 wait_us(DT);
charlesdavidyoung 20:fb73eaaf0894 64 SCK = 1;
charlesdavidyoung 20:fb73eaaf0894 65 }
charlesdavidyoung 20:fb73eaaf0894 66
charlesdavidyoung 20:fb73eaaf0894 67 SCK = 0;
charlesdavidyoung 20:fb73eaaf0894 68 wait_us(DT);
charlesdavidyoung 20:fb73eaaf0894 69 CS2 = 1;
charlesdavidyoung 20:fb73eaaf0894 70
charlesdavidyoung 20:fb73eaaf0894 71 return;
charlesdavidyoung 20:fb73eaaf0894 72 }
charlesdavidyoung 20:fb73eaaf0894 73
charlesdavidyoung 20:fb73eaaf0894 74 void RotarySwitch::UpdateOutput()
Charles David Young 19:fd3e33641aa7 75 {
Charles David Young 19:fd3e33641aa7 76 // Blink mode LED
charlesdavidyoung 24:db7494389c03 77 if (WHEEL_SUBMODE_SELECT == currentWheelState)
Charles David Young 19:fd3e33641aa7 78 LEDs_write(0);
Charles David Young 19:fd3e33641aa7 79
Charles David Young 19:fd3e33641aa7 80 if (WheelStateTimer)
Charles David Young 19:fd3e33641aa7 81 {
Charles David Young 19:fd3e33641aa7 82 WheelStateTimer++;
Charles David Young 19:fd3e33641aa7 83 if (++WheelStateTimer > WheelStateTimeout)
Charles David Young 19:fd3e33641aa7 84 {
Charles David Young 19:fd3e33641aa7 85 WheelStateMachine(WHEEL_Timeout);
Charles David Young 19:fd3e33641aa7 86 WheelStateTimer = 0;
Charles David Young 19:fd3e33641aa7 87 }
Charles David Young 19:fd3e33641aa7 88 }
Charles David Young 19:fd3e33641aa7 89 }
Charles David Young 19:fd3e33641aa7 90
charlesdavidyoung 24:db7494389c03 91 float RotarySwitch::UpdateInput()
charlesdavidyoung 24:db7494389c03 92 {
charlesdavidyoung 24:db7494389c03 93 float direction = 0; // used to return direction of rotation
charlesdavidyoung 24:db7494389c03 94
charlesdavidyoung 24:db7494389c03 95 if (WHEEL_INACTIVE == currentWheelState)
Charles David Young 23:41260ab0f49d 96 LEDs_write(0);
Charles David Young 23:41260ab0f49d 97 else
Charles David Young 23:41260ab0f49d 98 LEDs_write(LED_statuses[LED_status_index]);
Charles David Young 19:fd3e33641aa7 99
Charles David Young 19:fd3e33641aa7 100 // react to wheel if in proper state
Charles David Young 19:fd3e33641aa7 101 WheelCurrent = int(Wheel.getPulses());
Charles David Young 19:fd3e33641aa7 102 if ( (WHEEL_MODE_SELECT == currentWheelState)
Charles David Young 19:fd3e33641aa7 103 || (WHEEL_SUBMODE_SELECT == currentWheelState))
Charles David Young 19:fd3e33641aa7 104 {
Charles David Young 19:fd3e33641aa7 105 if (WheelCurrent > WheelPrevious)
charlesdavidyoung 24:db7494389c03 106 {
charlesdavidyoung 26:166dbe6022e8 107 if (WHEEL_MODE_SELECT == currentWheelState)
charlesdavidyoung 26:166dbe6022e8 108 LED_status_index = ++LED_status_index % sizeof(LED_statuses);
charlesdavidyoung 24:db7494389c03 109 direction = 1;
charlesdavidyoung 24:db7494389c03 110 }
Charles David Young 19:fd3e33641aa7 111 else
Charles David Young 19:fd3e33641aa7 112 if (WheelCurrent < WheelPrevious)
charlesdavidyoung 24:db7494389c03 113 {
charlesdavidyoung 26:166dbe6022e8 114 if (WHEEL_MODE_SELECT == currentWheelState)
charlesdavidyoung 26:166dbe6022e8 115 LED_status_index = --LED_status_index % sizeof(LED_statuses);
charlesdavidyoung 24:db7494389c03 116 direction = -1;
charlesdavidyoung 24:db7494389c03 117 }
charlesdavidyoung 26:166dbe6022e8 118
Charles David Young 19:fd3e33641aa7 119 // Keep resetting WheelStateTimer as long as wheel is moving
Charles David Young 19:fd3e33641aa7 120 if (WheelPrevious != WheelCurrent)
Charles David Young 19:fd3e33641aa7 121 WheelStateTimer = 1;
Charles David Young 19:fd3e33641aa7 122 }
Charles David Young 19:fd3e33641aa7 123 WheelPrevious = WheelCurrent;
Charles David Young 19:fd3e33641aa7 124
Charles David Young 19:fd3e33641aa7 125 // detect when wheel button is pressed but wait until it is released
Charles David Young 19:fd3e33641aa7 126 // before doing anything
Charles David Young 19:fd3e33641aa7 127 bool QEPBbutton = QEPB.read();
Charles David Young 19:fd3e33641aa7 128 if ( (QEPBbutton)
Charles David Young 19:fd3e33641aa7 129 && (!QEPBpressed))
Charles David Young 19:fd3e33641aa7 130 {
Charles David Young 19:fd3e33641aa7 131 QEPBpressed = true;
Charles David Young 19:fd3e33641aa7 132 }
Charles David Young 19:fd3e33641aa7 133 else
Charles David Young 19:fd3e33641aa7 134 if ( (!QEPBbutton)
Charles David Young 19:fd3e33641aa7 135 && (QEPBpressed))
Charles David Young 19:fd3e33641aa7 136 {
Charles David Young 19:fd3e33641aa7 137 QEPBpressed = false;
Charles David Young 19:fd3e33641aa7 138 WheelStateMachine(WHEEL_Pressed);
Charles David Young 19:fd3e33641aa7 139 }
Charles David Young 19:fd3e33641aa7 140
charlesdavidyoung 24:db7494389c03 141 return direction;
Charles David Young 19:fd3e33641aa7 142 }
Charles David Young 19:fd3e33641aa7 143
charlesdavidyoung 20:fb73eaaf0894 144 void RotarySwitch::WheelStateMachine(WheelStateEvent event)
Charles David Young 19:fd3e33641aa7 145 {
Charles David Young 19:fd3e33641aa7 146 switch (currentWheelState) {
Charles David Young 19:fd3e33641aa7 147 case WHEEL_INACTIVE:
Charles David Young 19:fd3e33641aa7 148 if (WHEEL_Pressed == event)
Charles David Young 19:fd3e33641aa7 149 {
Charles David Young 19:fd3e33641aa7 150 currentWheelState = WHEEL_MODE_SELECT;
Charles David Young 19:fd3e33641aa7 151 WheelStateTimer = 1;
Charles David Young 19:fd3e33641aa7 152 }
Charles David Young 19:fd3e33641aa7 153 break;
Charles David Young 19:fd3e33641aa7 154 case WHEEL_MODE_SELECT:
Charles David Young 19:fd3e33641aa7 155 if (WHEEL_Pressed == event)
Charles David Young 19:fd3e33641aa7 156 {
Charles David Young 19:fd3e33641aa7 157 currentWheelState = WHEEL_SUBMODE_SELECT;
Charles David Young 19:fd3e33641aa7 158 WheelStateTimer = 1;
Charles David Young 19:fd3e33641aa7 159 }
Charles David Young 19:fd3e33641aa7 160 else
Charles David Young 19:fd3e33641aa7 161 if (WHEEL_Timeout == event)
Charles David Young 19:fd3e33641aa7 162 currentWheelState = WHEEL_INACTIVE;
Charles David Young 19:fd3e33641aa7 163 break;
Charles David Young 19:fd3e33641aa7 164 case WHEEL_SUBMODE_SELECT:
Charles David Young 19:fd3e33641aa7 165 if (WHEEL_Pressed == event)
Charles David Young 19:fd3e33641aa7 166 {
Charles David Young 19:fd3e33641aa7 167 currentWheelState = WHEEL_MODE_SELECT;
Charles David Young 19:fd3e33641aa7 168 WheelStateTimer = 1;
Charles David Young 19:fd3e33641aa7 169 }
Charles David Young 19:fd3e33641aa7 170 else
Charles David Young 19:fd3e33641aa7 171 if (WHEEL_Timeout == event)
Charles David Young 19:fd3e33641aa7 172 currentWheelState = WHEEL_INACTIVE;
Charles David Young 19:fd3e33641aa7 173 break;
Charles David Young 19:fd3e33641aa7 174 default:
Charles David Young 19:fd3e33641aa7 175 break;
Charles David Young 19:fd3e33641aa7 176 }
Charles David Young 19:fd3e33641aa7 177 }
Charles David Young 19:fd3e33641aa7 178