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:
1:b409ad65466a
Parent:
0:68ce46607848
Child:
2:707ab9d39a64
Child:
4:952a2d814fb1
Child:
6:5037779f6a55
--- a/CAR.cpp	Wed Apr 02 09:13:57 2014 +0000
+++ b/CAR.cpp	Mon Apr 07 15:19:37 2014 +0000
@@ -1,8 +1,119 @@
 #include "CAR.h"
+Semaphore CAR_MAIL_SEM(1);
+uint32_t Element_Counter_W = 0;
+uint32_t Element_Counter_R = 0;
+typedef struct {
+            uint8_t Mail_Average_Speed; 
+            float   Mail_Accelerometer_Value;
+            float   Mail_Brake_Value;
+            int     Counter;
+        } CAR_MAIL;
+static Mail<CAR_MAIL, 100> mail_box;
 
-void CAR::led2_thread(void const *args) {
+ 
+CAR::CAR(){
+    Port.write_bit(1,BL_BIT); 
+     
+      
+}
+void CAR::SAVE_ODO(float value) {
+    LPC_RTC->GPREG0 = *((uint32_t*)&value);
+}
+ 
+float CAR::GET_ODO() {
+    return *((float*)&(LPC_RTC->GPREG0));
+}
+void CAR::Accelero_Brake_Read(void const *args){
     while (true) {
-        led2 = !led2;
+        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;
+        Thread::wait(100);
+    }
+}
+
+void CAR::Average_Speed_Measure(void const *args) {
+    while (true) {
+        Average_Speed = ( Speed[0] + Speed[1] + Speed[2] )/3 ;
+        Thread::wait(200);
+    }
+}
+
+void CAR::Average_Speed_Show(void const *args){
+    while(1){
+        SpeedShow = 1.0 - (float)Average_Speed / (float)MaxSpeed ;
+        SpeedShow_Servo = SpeedShow ;
         Thread::wait(1000);
     }
+}
+void CAR::OverSpeed(void const *args){
+    while(true){
+    if(Average_Speed > 70)
+            IsOverSpeed = 1;
+            
+        else
+            IsOverSpeed = 0;
+            
+        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){
+    while(true){
+        LCD.locate(0,0);
+        LCD.printf("AvrgSpd %3D MPH",Average_Speed);
+        LCD.locate(1,0);
+        LCD.printf("OdoVlu %4.2f M",Odometer_Value);
+        Thread::wait(500);
+    }
+}
+void CAR::SEND_CAR_VALUES (void const *args) {
+    
+    while (true) {
+        CAR_MAIL *mail = mail_box.alloc();
+        CAR_MAIL_SEM.wait();
+        mail->Mail_Average_Speed = Average_Speed; 
+        mail->Mail_Accelerometer_Value = Accelerometer_Value;
+        mail->Mail_Brake_Value = Brake_Value;
+        mail->Counter = Element_Counter_W ;
+        mail_box.put(mail);
+        printf("\n %i £ \n\r",Element_Counter_W);
+        Element_Counter_W++;
+        Thread::wait(1000); 
+        CAR_MAIL_SEM.release();             
+    }
+}
+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();
+        CAR_MAIL_SEM.release();
+        Thread::wait(5000);
+    }
+}
+void CAR::DUMP_CAR_VALUES () {
+    printf("Writing \n\r");
+    osEvent evt = mail_box.get(10);
+    CAR_MAIL *mail = (CAR_MAIL*)evt.value.p;
+    if (evt.status == osEventMail) {
+            printf("\nAverage_Speed: %i MPH\n\r"   , mail->Mail_Average_Speed);
+            printf("Accelerometer_Value: %.3f %\n\r"     , mail->Mail_Accelerometer_Value);
+            printf("Brake_Value: %.3f %\n\r", mail->Mail_Brake_Value);
+            printf("\nCounter: %i \n\r"   , mail->Counter);
+            mail_box.free(mail);
+            Element_Counter_R++;        
+    }
 }
\ No newline at end of file