Gestion du Traffic Adaptatif- Code du mbed coordinateur

Dependencies:   XBeeLib mbed mbed-rtos EthernetInterface

Revision:
28:50d89e4255da
Parent:
27:0085fca436e1
Child:
29:109a6834f399
--- a/main.cpp	Mon Dec 03 22:42:37 2018 +0000
+++ b/main.cpp	Tue Dec 04 17:16:17 2018 +0000
@@ -7,12 +7,6 @@
 using namespace DigiLog;
 #endif
 
-/*
-TO DO:
- - temps pour que les voitures traversent le chantier
- - améliorer la partie sur les compteurs de voitures
-*/
-
 //Adressage
 #define REMOTE_NODE_ADDR64_MSB  ((uint32_t)0x0013A200)
 #define REMOTE_NODE_ADDR64_LSB1  ((uint32_t)0x40C0E3A1) // adresse du recepteur 1
@@ -32,19 +26,19 @@
 DigitalOut led1(LED2);
 
 //Gestion
-int temps = 5; //durée (en s) pour qu'une voiture traverse le chantier
+int temps = 5000; //durée (en ms) pour qu'une voiture traverse le chantier
 Timer timer;
+int whosred;
+Thread t_setFeu1Vert;
+Thread t_setFeu2Vert;
 
 //Communication
 Serial *log_serial;
 XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
 const RemoteXBeeZB remoteDevice1 = RemoteXBeeZB(REMOTE_NODE_ADDR64_1);
 const RemoteXBeeZB remoteDevice2 = RemoteXBeeZB(REMOTE_NODE_ADDR64_2);
-char set_rouge[]="r"; // demande a un recepteur de passer au rouge
-char set_vert[]="v"; // demande a un recepteur de passer au vert
-
-int whosred=0;
-
+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
 
 static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,const char * data)
 {
@@ -56,10 +50,10 @@
     const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data, strlen(data)); 
 }
 
-/** Callback function, invoked at packet reception */
+//Fonction callback invoquée à la réception d'un message
 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
 {
-    const uint64_t remote_addr64 = remote.get_addr64(); //adresse de l'expéditeur
+    const uint64_t remote_addr64 = remote.get_addr64(); //adresse de l'expéditeur du message
         
     if (data[0]==0x6D){
         // baisse le compteur de voiture au feu 1
@@ -86,57 +80,72 @@
         log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2);
     }
     else if (data[0]==0x72){
-        // demande au r2 de passer au vert
+        // 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)){
-            log_serial->printf("r2 passe au vert");
-            send_explicit_data_to_remote_node(xbee, remoteDevice2,set_vert); 
             whosred = 1;
+            t_setFeu2Vert.signal_set(0x1);
         }
-        // demande au r1 de passer au vert
+        // 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)){
-            log_serial->printf("r1 passe au vert");
-            send_explicit_data_to_remote_node(xbee, remoteDevice1,set_vert);
             whosred = 2;
+            t_setFeu1Vert.signal_set(0x1);
         }
     }
     log_serial->printf("\r\n");
 }
 
+void setFeu1Vert(){
+    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"); 
+    }
+}
+
+void setFeu2Vert(){
+    while(1){
+        Thread::signal_wait(0x1);
+        Thread::wait(temps);
+        send_explicit_data_to_remote_node(xbee, remoteDevice2,set_vert);  
+        log_serial->printf("r2 passe au vert");
+    }
+}
+
 void connect_Xbee()
 {
     log_serial = new Serial(DEBUG_TX, DEBUG_RX);
     log_serial->baud(9600);
-    log_serial->printf("Sample application to demo how to receive unicast and broadcast data with the XBeeZB\r\n\r\n");
-    log_serial->printf(XB_LIB_BANNER);
     
     #if defined(ENABLE_LOGGING)
     new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
     #endif
 
-    /* Register callbacks */
+    // Register callbacks
     xbee.register_receive_cb(&receive_cb);
 
     RadioStatus const radioStatus = xbee.init();
     MBED_ASSERT(radioStatus == Success);
 
-    /* Wait until the device has joined the network */
-    log_serial->printf("Waiting for device to join the network: ");
+    //Attend que l'appareil rejoigne le réseau
+    log_serial->printf("En attente de connexion au reseau: ");
     while (!xbee.is_joined()) {
         wait_ms(1000);
         log_serial->printf(".");
     }
-    log_serial->printf("OK\r\n");
+    log_serial->printf("Connection reussie.\r\n");
+    whosred=1;
 }
 
 void gestion()
 {
-    //int i=0;
-    bool stay1=0;
-    bool stay2=0;
+    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)
     {
-        //To check
-        if ((voituresFeu1==0) && (voituresFeu2!=0)){
+        /* Si il n'y a pas de voitures à un feu ou si il y a beaucoup plus de voitures à l'autre feu,    */
+        /* alors l'autre feu passera au vert et le feu avec le moins de voitures passera au rouge.       */
+        if ( ((voituresFeu1==0) && (voituresFeu2!=0)) || (voituresFeu2-voituresFeu1>=10) ){
             if(stay1==0){
                 stay2=0;
                 stay1=1;
@@ -144,7 +153,7 @@
                 Thread::wait(100);
             }
         }
-        else if ((voituresFeu2==0) && (voituresFeu1!=0)){
+        else if ( ((voituresFeu2==0) && (voituresFeu1!=0)) || (voituresFeu1-voituresFeu2>=10) ){
             if(stay2==0){
                 stay1=0;
                 stay2=1;
@@ -152,6 +161,7 @@
                 Thread::wait(100);
             }
         }
+        /* Si on est dans aucun de ces deux cas, alors les feux suivront un cycle d'allumage classique.  */
         else{
             stay1=0;
             stay2=0;
@@ -161,7 +171,7 @@
             else if(whosred==2){
                 send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge);
             }
-            Thread::wait(4000);
+            Thread::wait(10000);
         }
     }
 }
@@ -171,6 +181,8 @@
     connect_Xbee();
     
     t_gestion.start(gestion);
+    t_setFeu1Vert.start(setFeu1Vert);
+    t_setFeu2Vert.start(setFeu2Vert);
     
     while (true) {        
         uint32_t receive_value = xbee.process_rx_frames();//nécessaire pour lire (constamment) la valeur recue