![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Gestion du Traffic Adaptatif- Code du mbed coordinateur
Dependencies: XBeeLib mbed mbed-rtos EthernetInterface
Diff: main.cpp
- 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