d

Dependencies:   mbed

Fork of AEB by Vincenzo Comito

Revision:
3:4bb49a5dfa47
Parent:
2:5811e080f41d
Child:
4:f0be0d8a0394
--- a/main.cpp	Sat Jul 30 08:23:21 2016 +0000
+++ b/main.cpp	Sat Jul 30 13:58:52 2016 +0000
@@ -3,25 +3,47 @@
 #include "rtwtypes.h"
 #include "serialdata.h"
 #include "CircularBuffer.h"
+#include "BBSerial.h"
+
+
+// Comment MASTER or SLAVE
+#define MASTER
+//#define SLAVE
+
+enum color {
+    NONE, RED, GREEN, BLUE, LED_M, LED_S
+};
+
+enum {
+    LED_OFF = 1,
+    LED_ON = 0
+};
+
+
+struct AEBData{
+    AEBData() : distance(1), fault(0), brake(0) {
+    }
+    float distance;
+    float fault;
+    float brake;  
+};
 
 DigitalOut red(LED_RED);
 DigitalOut green(LED_GREEN);
 DigitalOut blue(LED_BLUE);
-
 DigitalOut      trigger(D2);
 InterruptIn     echo(D4);
 Timer           t;
 Ticker          scheduler;
+AEBData aebData;
 
-volatile float           distance;
-float fault = 0;
+#ifdef MASTER
+AEBData slaveData;
+#endif
+
 
 Serial  pc(USBTX, USBRX); // tx, rx
-
-
-// 
-// Copy from ert_main.c
-//
+BBSerial boardSerial;
 
 #include <stddef.h>
 #include <stdio.h>                     /* This ert_main.c example uses printf/fflush */
@@ -71,21 +93,13 @@
   /* Enable interrupts here */
 }
 
-  
-//
-// End copy
-//
-
-
     
-void    start( void )
+void start( void )
 {
     t.start();
 }
 
-CircularBuffer distanceCircularBuffer(5);
-
-float sensDist = 1;
+//CircularBuffer distanceCircularBuffer(5);
 
 void stop( void )
 {
@@ -95,7 +109,7 @@
         distance_cm = 50;
     }
     //distanceCircularBuffer.push_back(distance_cm);
-    sensDist = distance_cm;
+    aebData.distance = distance_cm;
     t.reset();
 }
 
@@ -103,14 +117,7 @@
 extern ExtU_AEB0_T AEB0_U;
 extern ExtY_AEB0_T AEB0_Y;
 
-enum color {
-    NONE, RED, GREEN, BLUE
-};
 
-enum {
-    LED_OFF = 1,
-    LED_ON = 0
-};
 
 void setColor(color c) {
     red = LED_OFF;
@@ -128,34 +135,84 @@
             break;
         case GREEN:
             green = LED_ON;
+        case LED_M:
+            green = LED_ON;
+            red = LED_ON;
+            break;
+        case LED_S:
+            blue = LED_ON;
+            red = LED_ON;
+            break;
+        default:
             break;
     }
 }
 
-
-
-float brake; 
-
     
 void    do_step( void )
 {
-    AEB0_U.speed_km_h = serialRecv();
-    AEB0_U.distance_m = sensDist;    
+    #ifdef MASTER
+    // Get data from simulink
+    float speed = serialRecv();
+    // Forward data to slave
+    // boardSerial.printf("%f %f", aebData.fault, speed);
+    #elif defined SLAVE
+    float speed;
+    float masterFault;
+    if(boardSerial.scanf("%f %f", &masterFault, &speed) != 2) {
+        masterFault = 1;
+        speed = 0;
+    }
+    #endif 
+    
+    
+    //Update AEB data
+    AEB0_U.speed_km_h = speed;
+    AEB0_U.distance_m = aebData.distance;    
  
     rt_OneStep();
-    brake = AEB0_Y.brake;
-    if(brake > 0) {
+    
+    aebData.brake = AEB0_Y.brake;
+    float activateBrake = aebData.brake;
+    
+    #ifdef SLAVE
+    activateBrake = activateBrake && masterFault;
+    #endif
+    
+    if(activateBrake > 0) {
         setColor(BLUE);
     } else {
-        setColor(NONE);
+        #ifdef MASTER
+        setColor(LED_M);
+        #else
+        setColor(LED_S);
+        #endif
+    }
+
+    aebData.fault = AEB0_Y.fault;
+    if(aebData.fault) {
+        setColor(RED);
     }
 
-    fault = AEB0_Y.fault;
-    if(fault) {
-        setColor(RED);
-    }
-    float data[3] = {brake, sensDist, fault};
-    serialSendVec(data, 3);
+            
+    #ifdef MASTER
+    AEBData slaveData;
+   // if(boardSerial.scanf("%f %f %f", slaveData.brake, 
+//              slaveData.distance, slaveData.fault) != 3) {
+//        slaveData.brake = 0;
+//        slaveData.distance = 0;
+//        slaveData.fault = 1;
+//    }
+    
+    slaveData.brake = slaveData.distance = slaveData.fault = 0;
+            
+              
+    float data[6] = {aebData.brake, aebData.distance, aebData.fault,
+                     slaveData.brake, slaveData.distance, slaveData.fault};    
+    serialSendVec(data, 6);
+    #elif defined SLAVE
+    boardSerial.printf("%f %f %f", activateBrake, aebData.distance, aebData.fault);
+    #endif
 }
 
 
@@ -175,14 +232,10 @@
     trigger = 0;
       
     while (true) {
-      //  pc.printf( "Reading inputs....\n\r" );
-
-
         trigger = 1;
         wait_us( 10 );
         trigger = 0;
 
-
     }
     
     AEB0_terminate();