Gestion du Traffic Adaptatif- Code du mbed coordinateur
Dependencies: XBeeLib mbed mbed-rtos EthernetInterface
main.cpp
- Committer:
- leomerel
- Date:
- 2018-12-03
- Revision:
- 26:e9fc7e552c88
- Parent:
- 25:fdb28df21d44
- Child:
- 27:0085fca436e1
File content as of revision 26:e9fc7e552c88:
#include "mbed.h" #include "XBeeLib.h" #include "rtos.h" #if defined(ENABLE_LOGGING) #include "DigiLoggerMbedSerial.h" 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 #define REMOTE_NODE_ADDR64_LSB2 ((uint32_t)0x4086DA0E) // adresse du recepteur 2 #define REMOTE_NODE_ADDR64_1 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB1) #define REMOTE_NODE_ADDR64_2 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB2) using namespace XBeeLib; //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 = 5; //durée (en s) pour qu'une voiture traverse le chantier Timer timer; //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 static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,const char * data) { const uint8_t dstEP = 0xE8; const uint8_t srcEP = 0xE8; const uint16_t clusterID = 0x0011; const uint16_t profileID = 0xC105; const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data, strlen(data)); } /** Callback function, invoked at packet reception */ 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 if (data[0]==0x6D){ // baisse le compteur de voiture au feu 1 if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1) && (voituresFeu1!=0)){ voituresFeu1--; } // baisse le compteur de voiture au feu 2 else if ( (UINT64_LO32(remote_addr64)==UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)) && (voituresFeu2!=0)){ voituresFeu2--; } log_serial->printf("Nombre de voitures feu 1 : %d\r\n",voituresFeu1); log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2); } else if (data[0]==0x70){ // augmente le compteur de voiture au feu 1 if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1)){ voituresFeu1++; } // augmente le compteur de voiture au feu 2 else if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)){ voituresFeu2++; } log_serial->printf("Nombre de voitures feu 1 : %d\r\n",voituresFeu1); log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2); } else if (data[0]==0x72){ // demande 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); } // demande 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); } } log_serial->printf("\r\n"); } 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 */ 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: "); while (!xbee.is_joined()) { wait_ms(1000); log_serial->printf("."); } log_serial->printf("OK\r\n"); } void gestion() { int i=0; bool stay1=0; bool stay2=0; while(1) { //To check if ((voituresFeu1==0) && (voituresFeu2!=0)){ if(stay1==0){ stay2=0; stay1=1; send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge); } } else if ((voituresFeu2==0) && (voituresFeu1!=0)){ if(stay2==0){ stay1=0; stay2=1; send_explicit_data_to_remote_node(xbee, remoteDevice2,set_rouge); } } else{ stay1=0; stay2=0; Thread::wait(4000); if(i==0){ send_explicit_data_to_remote_node(xbee, remoteDevice2,set_rouge); i=1; } else if(i==1){ send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge); i=0; } } } } int main() { connect_Xbee(); t_gestion.start(gestion); 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;} } }