![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
This is car control simulation by using Mbed controller and real time operating system.
Dependencies: MCP23017 Servo WattBob_TextLCD mbed-rtos mbed
Fork of Ass3 by
Diff: CAR.cpp
- Revision:
- 7:a92da438d06c
- Parent:
- 6:5037779f6a55
- Child:
- 8:6e55db96c11c
diff -r 5037779f6a55 -r a92da438d06c CAR.cpp --- a/CAR.cpp Mon Apr 07 15:50:48 2014 +0000 +++ b/CAR.cpp Mon Apr 07 17:15:50 2014 +0000 @@ -1,5 +1,7 @@ #include "CAR.h" Semaphore CAR_MAIL_SEM(1); +Semaphore INPUT_SEM(2); +Semaphore SWITCH_SEM(3); uint32_t Element_Counter_W = 0; uint32_t Element_Counter_R = 0; typedef struct { @@ -9,7 +11,8 @@ int Counter; } CAR_MAIL; static Mail<CAR_MAIL, 100> mail_box; - +bool LSide_Indicator_Value; +bool RSide_Indicator_Value; CAR::CAR(){ Port.write_bit(1,BL_BIT); @@ -25,56 +28,62 @@ } void CAR::Accelero_Brake_Read(void const *args){ while (true) { + INPUT_SEM.wait(); Accelerometer_Value = Accelerometer.read(); Brake_Value = Brake.read(); EngineStat = EngineSwitch; Speed[Counter] = Accelerometer_Value * MaxSpeed * (1 - Brake_Value) * EngineStat ; Counter++; if(Counter > 2) Counter = 0; + INPUT_SEM.release(); Thread::wait(100); } } void CAR::Average_Speed_Measure(void const *args) { while (true) { + INPUT_SEM.wait(); Average_Speed = ( Speed[0] + Speed[1] + Speed[2] )/3 ; + INPUT_SEM.release(); Thread::wait(200); } } void CAR::Average_Speed_Show(void const *args){ while(1){ - SpeedShow = 1.0 - (float)Average_Speed / (float)MaxSpeed ; - SpeedShow_Servo = SpeedShow ; + INPUT_SEM.wait(); + SpeedShow_Servo = 1.0 - (float)Average_Speed / (float)MaxSpeed ; + INPUT_SEM.release(); Thread::wait(1000); } } void CAR::OverSpeed(void const *args){ while(true){ + INPUT_SEM.wait(); if(Average_Speed > 70) IsOverSpeed = 1; else IsOverSpeed = 0; - - Thread::wait(2000); + INPUT_SEM.release(); + Thread::wait(2000); } } -void CAR::Odometer_Measure(void const *args){ - while(true){ - Odometer_Value = GET_ODO(); - Odometer_Value = Odometer_Value + Average_Speed / 7200.0 ; - SAVE_ODO(Odometer_Value); - Thread::wait(500); - } -} -void CAR::Odometer_Show(void const *args){ +void CAR::Odo_Show_Indicator_Switch_Read(void const *args){ while(true){ LCD.locate(0,0); + INPUT_SEM.wait(); + Odometer_Value = GET_ODO() + Average_Speed / 7200.0 ; + SAVE_ODO(Odometer_Value); LCD.printf("AvrgSpd %3D MPH",Average_Speed); LCD.locate(1,0); - LCD.printf("OdoVlu %4.2f M",Odometer_Value); + LCD.printf("OdoVlu %4.2f M",GET_ODO()); + INPUT_SEM.release(); + SWITCH_SEM.wait(); + LSide_Indicator_Value = LSide_Indicator_Switch; + RSide_Indicator_Value = RSide_Indicator_Switch; + SWITCH_SEM.release(); Thread::wait(500); } } @@ -90,16 +99,15 @@ mail_box.put(mail); printf("\n %i £ \n\r",Element_Counter_W); Element_Counter_W++; - Thread::wait(5000); - CAR_MAIL_SEM.release(); + CAR_MAIL_SEM.release(); + Thread::wait(5000); } } void CAR::DUMP_CAR_VALUES_En (void const *args) { while (true) { - L1 = L1 ^ 1; CAR_MAIL_SEM.wait(); while (Element_Counter_W > Element_Counter_R) - DUMP_CAR_VALUES(); + DUMP_CAR_VALUES(); CAR_MAIL_SEM.release(); Thread::wait(20000); } @@ -116,4 +124,24 @@ mail_box.free(mail); Element_Counter_R++; } +} +void CAR::Side_Light_Flash(void const *args){ + while(true){ + SWITCH_SEM.wait(); + if(LSide_Indicator_Value == 1){ + L_Side_Light = L_Side_Light ^ 1; + } + else{ + L_Side_Light = 0; + } + if(RSide_Indicator_Value == 1){ + R_Side_Light = R_Side_Light ^ 1; + SWITCH_SEM.release(); + } + else{ + R_Side_Light = 0 ; + } + SWITCH_SEM.release(); + Thread::wait(1000); + } } \ No newline at end of file