Gestion du Traffic Adaptatif- Code du mbed coordinateur

Dependencies:   XBeeLib mbed mbed-rtos EthernetInterface

Revision:
29:109a6834f399
Parent:
28:50d89e4255da
Child:
30:f8df12b28719
--- a/main.cpp	Tue Dec 04 17:16:17 2018 +0000
+++ b/main.cpp	Wed Dec 05 15:28:40 2018 +0000
@@ -1,6 +1,10 @@
 #include "mbed.h"
 #include "XBeeLib.h"
 #include "rtos.h"
+#include "EthernetInterface.h"
+
+const char* ECHO_SERVER_ADDRESS = "192.168.1.133";
+const int ECHO_SERVER_PORT = 7;
 
 #if defined(ENABLE_LOGGING)
 #include "DigiLoggerMbedSerial.h"
@@ -19,11 +23,8 @@
 //Nombre de voitures au feu
 int voituresFeu1 = 0;
 int voituresFeu2 = 0;
-DigitalIn boutonPlus(p24);
-DigitalIn boutonMoins(p23);
 Thread t_nbVoiture;
 Thread t_gestion;
-DigitalOut led1(LED2);
 
 //Gestion
 int temps = 5000; //durée (en ms) pour qu'une voiture traverse le chantier
@@ -31,6 +32,8 @@
 int whosred;
 Thread t_setFeu1Vert;
 Thread t_setFeu2Vert;
+bool stay1=0; /* stay est une variable qui est à 1 lorsqu'on veut qu'un feu reste à une              */
+bool stay2=0; /* certaine couleur jusqu'à ce qu'une autre commande lui dise de changer de couleur    */
 
 //Communication
 Serial *log_serial;
@@ -40,6 +43,42 @@
 char set_rouge[]="r"; // message pour demander a un recepteur de passer au rouge
 char set_vert[]="v"; // message pour demander a un recepteur de passer au vert
 
+
+InterruptIn button(p5);
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+uint8_t vehicule_urgence=0;
+Thread t_urgence;
+Thread t_blink;
+Thread t_Ethernet
+
+void sendMessage() {
+    EthernetInterface eth;
+    eth.init(); //Use DHCP
+    eth.connect();
+    printf("\nClient IP Address is %s\n", eth.getIPAddress());
+    
+    // Connect to Server
+    TCPSocketConnection socket;
+    while (socket.connect(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT) < 0) {
+        printf("Unable to connect to (%s) on port (%d)\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT);
+        wait(1);
+    }
+    printf("Connected to Server at %s\n",ECHO_SERVER_ADDRESS);
+    int i = 0;
+    while(1) {
+        char hello[] = i;
+        printf("Sending  message to Server : '%s' \n",hello);
+        socket.send_all(hello, sizeof(hello) - 1);
+        Thread::wait(1000)
+        i++;
+    }
+    
+    
+}
+
 static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,const char * data)
 {
     const uint8_t dstEP = 0xE8;
@@ -82,13 +121,17 @@
     else if (data[0]==0x72){
         // confirmation que r1 est bien rouge, donc peut demander au r2 de passer au vert
         if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1)){
-            whosred = 1;
-            t_setFeu2Vert.signal_set(0x1);
+            if(vehicule_urgence==0){
+                whosred = 1;
+                t_setFeu2Vert.signal_set(0x1);
+            }
         }
         // confirmation que r2 est bien rouge, donc peut demander au r1 de passer au vert
         else if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)){
-            whosred = 2;
-            t_setFeu1Vert.signal_set(0x1);
+            if(vehicule_urgence==0){
+                whosred = 2;
+                t_setFeu1Vert.signal_set(0x1);
+            }
         }
     }
     log_serial->printf("\r\n");
@@ -98,8 +141,10 @@
     while(1){
         Thread::signal_wait(0x1);
         Thread::wait(temps);
-        send_explicit_data_to_remote_node(xbee, remoteDevice1,set_vert);
-        log_serial->printf("r1 passe au vert"); 
+        if(vehicule_urgence==0){
+            send_explicit_data_to_remote_node(xbee, remoteDevice1,set_vert);
+            log_serial->printf("r1 passe au vert"); 
+        }
     }
 }
 
@@ -107,7 +152,9 @@
     while(1){
         Thread::signal_wait(0x1);
         Thread::wait(temps);
-        send_explicit_data_to_remote_node(xbee, remoteDevice2,set_vert);  
+        if(vehicule_urgence==0){
+            send_explicit_data_to_remote_node(xbee, remoteDevice2,set_vert);  
+        }
         log_serial->printf("r2 passe au vert");
     }
 }
@@ -139,8 +186,6 @@
 
 void gestion()
 {
-    bool stay1=0; /* stay est une variable qui est à 1 lorsqu'on veut qu'un feu reste à une              */
-    bool stay2=0; /* certaine couleur jusqu'à ce qu'une autre commande lui dise de changer de couleur    */
     while(1)
     {
         /* Si il n'y a pas de voitures à un feu ou si il y a beaucoup plus de voitures à l'autre feu,    */
@@ -176,17 +221,58 @@
     }
 }
 
+void rise() {
+    led3 = !led3;
+    t_urgence.signal_set(0x1);
+}
+void fall() {
+    led2 = !led2;
+}
+
+void blink(){
+    while(1){
+        Thread::signal_wait(0x1);
+        while(vehicule_urgence){
+            led4 = !led4;
+            Thread::wait(200);
+        }
+        led4 = 0;
+    }
+}
+
+void urgence(){
+    while(1){
+        Thread::signal_wait(0x1); 
+        t_blink.signal_set(0x1);
+        vehicule_urgence = 1;
+        send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge);
+        send_explicit_data_to_remote_node(xbee, remoteDevice2,set_rouge);
+        Thread::wait(10000);
+        stay1=0;
+        stay2=0;
+        vehicule_urgence = 0;
+    }
+}
+
 int main()
 {
+    
+    led2=0;
+    led3=0;
+    led4=0;
     connect_Xbee();
     
     t_gestion.start(gestion);
     t_setFeu1Vert.start(setFeu1Vert);
     t_setFeu2Vert.start(setFeu2Vert);
+    t_urgence.start(urgence);
+    t_blink.start(blink);
+    t_Ethernet(sendMessage);
+    
+    button.rise(&rise);  // attach the address of the flip function to the rising edge
+    button.fall(&fall);
     
     while (true) {        
         uint32_t receive_value = xbee.process_rx_frames();//nécessaire pour lire (constamment) la valeur recue
-        if(voituresFeu1 >= 10){led1=1;}
-        else{led1=0;}
     }
 }