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:
- 20:fb73eaaf0894
- Parent:
- 19:fd3e33641aa7
- Child:
- 23:41260ab0f49d
--- a/RotarySwitch.cpp Tue Sep 04 08:28:34 2018 -0700 +++ b/RotarySwitch.cpp Tue Sep 04 19:57:31 2018 +0000 @@ -3,24 +3,75 @@ * */ -#include "RotatySwitch.hpp" +#include "RotarySwitch.hpp" + +// QEI class supports the mode wheel. In its most basic function it will tell +// us which direction the wheel is moving (right or left) so that we can +// use it to select the current mode. +QEI Wheel(D12, D11, NC, 16); // Quadrature encoder -RotatySwitch::RotatySwitch(PinName channelA, - PinName channelB) - : channelA_(channelA), channelB_(channelB) +#define CPM 0x01 +#define CPS 0x02 +#define PLS 0x04 +#define VOLTS 0x08 +#define CNT1 0x10 +#define CNT2 0x20 +#define HV 0x40 +#define MENU 0x80 +uint8_t LED_statuses[] = {CPM, CPS, PLS, VOLTS, CNT1, CNT2, HV, MENU}; + +RotarySwitch::RotarySwitch() { + LED_status = CPM; + LED_status_index = 0; + WheelCurrent = 0; + WheelPrevious = 0; + QEPBpressed = false; + WheelStateTimer = 0; + + LEDs_write(0x00); // initialize LEDs (CPM and CNT1 on) Wheel.reset(); - LEDs_write(0x00); - SecTenth_Beat.attach_us(&UpdateInput, 100000); - Sec_Beat.attach_us(&UpdateOutput, 1000000); } -void RotatySwitch::GetPosition(void) +int RotarySwitch::GetPosition(void) { return LED_status_index; } -void RotatySwitch::UpdateOutput() +//--------------------------------------------------------------------------- +//Write to 74HC595 (LEDs) - Take care to avoid conflict with MAX7219 + +void RotarySwitch::LEDs_write(unsigned short data_val) +{ +#define DT 1 // delay time in us for SPI emulation + + // Update 74HC595 shift registers + unsigned short mask; + + SCK = 0; + wait_us(DT); + CS2 = 0; + + for(mask = 0x80; mask!= 0; mask>>= 1) + { + wait_us(DT); + SCK = 0; + if(mask & data_val) + MOSI = 0; + else + MOSI = 1; + wait_us(DT); + SCK = 1; + } + + SCK = 0; + wait_us(DT); + CS2 = 1; + + return; +} + +void RotarySwitch::UpdateOutput() { // Blink mode LED if (WHEEL_MODE_SELECT == currentWheelState) @@ -37,7 +88,7 @@ } } -void RotatySwitch::UpdateInput() +void RotarySwitch::UpdateInput() { LEDs_write(LED_statuses[LED_status_index]); @@ -79,7 +130,7 @@ return; } -void RotatySwitch::WheelStateMachine(WheelStateEvent event) +void RotarySwitch::WheelStateMachine(WheelStateEvent event) { switch (currentWheelState) { case WHEEL_INACTIVE: