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 Muaiyd Al-Zandi

Revision:
7:a92da438d06c
Parent:
6:5037779f6a55
Child:
8:6e55db96c11c
--- 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