![](/media/cache/profiles/8138ec4f8dbf9991f277b91dd462de7d.jpg.50x50_q85.png)
Example software of using the mbed-rtos to control a simple vehicle's on board computer
Dependencies: MCP23017 WattBob_TextLCD mbed-rtos mbed
Diff: main.cpp
- Revision:
- 8:6fad4bd89240
- Parent:
- 7:f09208f9a4f7
- Child:
- 9:c236eaaacf08
--- a/main.cpp Wed Mar 30 09:35:10 2016 +0000 +++ b/main.cpp Wed Mar 30 09:47:45 2016 +0000 @@ -27,23 +27,30 @@ // ============================================================================ // Define Statements // ============================================================================ + +// LCD Definitions #define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT) #define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT) -#define TRUE 1 -#define FALSE 0 - +// General Logical Assignments #define HIGH 1 #define LOW 0 +// Car Sim, Maximum Car Speed (mph) +#define MAX_SPEED 100 + // ============================================================================ // MBED Pin Assignments // ============================================================================ // System Inputs +// ---------------------------------------------------------------------------- + +// Analog Channels AnalogIn Brake(p19); // Brake Pedal AnalogIn Accelerometer(p20); // Accelerator Pedal +// Digitial Channels DigitalIn EngineState(p18); // Engine State Switch DigitalIn LeftIndicator(p17); // Left Indicator Switch DigitalIn RightIndicator(p16); // Right Indicator Switch @@ -51,17 +58,24 @@ // System Outputs +// ---------------------------------------------------------------------------- + +// LED Indicators (Steady State) DigitalOut EngineStateInd(LED1); // Engine State LED DigitalOut SideLightInd(LED2); // Side Light LED +// LED Indicators (Flashing) PwmOut LeftLightInd(LED3); // Left Indicator LED PwmOut RightLightInd(LED4); // Right Indicator LED PwmOut OverSpeedInd(p22); // OverSpeed LED +// Servo Output PwmOut AvSpeedWiper(p21); // Average Speed Wiper +// USB Connection to PC Serial PCConn(USBTX,USBRX); // Connection to PC +// LCD Objects MCP23017 *par_port; // Object pointing to Expander WattBob_TextLCD *lcd; // LCD Connection @@ -69,30 +83,33 @@ // Global Data Structure Declerations // ============================================================================ - +// Raw Data Structure +// ---------------------------------------------------------------------------- typedef struct { bool EngineState; float RawAccelerometer; float RawBraking; -} CarRawParams; +} CarRawData; -Mutex rawParamsMutex; -CarRawParams rawParams; +Mutex rawDataMutex; +CarRawData rawData; - +// Speed Data Structure +// ---------------------------------------------------------------------------- typedef struct { float rawSpeed[3]; int counter; -} CarSpeed; - +} CarSpeedData; float lastSpeed; + Mutex SpeedMutex; -CarSpeed speedParams; +CarSpeedData speedData; - +// Filtered Data Structure +// ---------------------------------------------------------------------------- typedef struct { float AverageSpeed; @@ -103,6 +120,8 @@ float totalDistance; +// Mail Queue Structure +// ---------------------------------------------------------------------------- typedef struct { float currentAverageSpeed; @@ -115,38 +134,33 @@ Mutex MailMutex; int MailQueueCounter; + // ============================================================================ // Car Simulation // ============================================================================ void CarSimulator(void const *arg) { -// PCConn.printf("CarSim\r\n"); - float newSpeed; - rawParamsMutex.lock(); - float currentAccelerometer = rawParams.RawAccelerometer; -// PCConn.printf("A: %f\r\n",currentAccelerometer); - float currentBrake = rawParams.RawBraking; -// PCConn.printf("B: %f\r\n",currentBrake); - bool currentEngineState = rawParams.EngineState; - rawParamsMutex.unlock(); + rawDataMutex.lock(); + float currentAccelerometer = rawData.RawAccelerometer; + float currentBrake = rawData.RawBraking; + bool currentEngineState = rawData.EngineState; + rawDataMutex.unlock(); -#define MAX_SPEED 100 newSpeed = currentAccelerometer*MAX_SPEED*(1-currentBrake)*currentEngineState; SpeedMutex.lock(); - if(speedParams.counter > 2) + if(speedData.counter > 2) { - speedParams.counter = 0; + speedData.counter = 0; } - speedParams.rawSpeed[speedParams.counter] = newSpeed; + speedData.rawSpeed[speedData.counter] = newSpeed; SpeedMutex.unlock(); - speedParams.counter = speedParams.counter++; - + speedData.counter = speedData.counter++; } // ============================================================================ @@ -157,10 +171,10 @@ void Task1_ReadRawData(void const *arg) { // PCConn.printf("Task1\r\n"); - rawParamsMutex.lock(); - rawParams.RawBraking = Brake.read(); - rawParams.RawAccelerometer = Accelerometer.read(); - rawParamsMutex.unlock(); + rawDataMutex.lock(); + rawData.RawBraking = Brake.read(); + rawData.RawAccelerometer = Accelerometer.read(); + rawDataMutex.unlock(); } @@ -169,9 +183,9 @@ { // PCConn.printf("Task2\r\n"); bool currentEngineState = EngineState.read(); - rawParamsMutex.lock(); - rawParams.EngineState = currentEngineState; - rawParamsMutex.unlock(); + rawDataMutex.lock(); + rawData.EngineState = currentEngineState; + rawDataMutex.unlock(); if(currentEngineState) { @@ -192,7 +206,7 @@ for(int num = 0; num < 3; num++) { - speedTotal = speedTotal + speedParams.rawSpeed[num]; + speedTotal = speedTotal + speedData.rawSpeed[num]; // PCConn.printf("Total: %f\r\n",speedTotal); } @@ -220,7 +234,7 @@ { // PCConn.printf("Task5\r\n"); SpeedMutex.lock(); - float currentInstSpeed = speedParams.rawSpeed[speedParams.counter]; + float currentInstSpeed = speedData.rawSpeed[speedData.counter]; SpeedMutex.unlock(); if(currentInstSpeed > 70.0) @@ -257,10 +271,10 @@ float currentAverageSpeed = filteredParams.AverageSpeed; filteredParamsMutex.unlock(); - rawParamsMutex.lock(); - float currentAccelerometer = rawParams.RawAccelerometer; - float currentBrake = rawParams.RawBraking; - rawParamsMutex.unlock(); + rawDataMutex.lock(); + float currentAccelerometer = rawData.RawAccelerometer; + float currentBrake = rawData.RawBraking; + rawDataMutex.unlock(); PCDump_t *currentPCDump = Memory_Dump.alloc(); currentPCDump -> currentAverageSpeed = currentAverageSpeed; @@ -370,14 +384,14 @@ par_port->write_bit(1,BL_BIT); // turn LCD backlight ON - rawParams.EngineState = 0; - rawParams.RawAccelerometer = 0.0; - rawParams.RawBraking = 0.0; + rawData.EngineState = 0; + rawData.RawAccelerometer = 0.0; + rawData.RawBraking = 0.0; - speedParams.counter = 0; - speedParams.rawSpeed[0] = 0.0; - speedParams.rawSpeed[1] = 0.0; - speedParams.rawSpeed[2] = 0.0; + speedData.counter = 0; + speedData.rawSpeed[0] = 0.0; + speedData.rawSpeed[1] = 0.0; + speedData.rawSpeed[2] = 0.0; filteredParams.AverageSpeed = 0.0;