Gestion du Traffic Adaptatif- Code du mbed coordinateur
Dependencies: XBeeLib mbed mbed-rtos EthernetInterface
Diff: main.cpp
- 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;} } }