Gestion du Traffic Adaptatif- Code du mbed coordinateur

Dependencies:   XBeeLib mbed mbed-rtos EthernetInterface

Committer:
leomerel
Date:
Mon Dec 03 20:28:23 2018 +0000
Revision:
26:e9fc7e552c88
Parent:
25:fdb28df21d44
Child:
27:0085fca436e1
V4.1;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pierreblouet 17:0694b399bd0d 1 #include "mbed.h"
pierreblouet 17:0694b399bd0d 2 #include "XBeeLib.h"
leomerel 21:5adfcfd83e95 3 #include "rtos.h"
leomerel 25:fdb28df21d44 4
pierreblouet 17:0694b399bd0d 5 #if defined(ENABLE_LOGGING)
pierreblouet 17:0694b399bd0d 6 #include "DigiLoggerMbedSerial.h"
pierreblouet 17:0694b399bd0d 7 using namespace DigiLog;
pierreblouet 17:0694b399bd0d 8 #endif
leomerel 12:9ec78b07c688 9
leomerel 26:e9fc7e552c88 10 /*
leomerel 26:e9fc7e552c88 11 TO DO:
leomerel 26:e9fc7e552c88 12 - temps pour que les voitures traversent le chantier
leomerel 26:e9fc7e552c88 13 - améliorer la partie sur les compteurs de voitures
leomerel 26:e9fc7e552c88 14 */
leomerel 12:9ec78b07c688 15
leomerel 26:e9fc7e552c88 16 //Adressage
pierreblouet 17:0694b399bd0d 17 #define REMOTE_NODE_ADDR64_MSB ((uint32_t)0x0013A200)
leomerel 24:bbde0b873a37 18 #define REMOTE_NODE_ADDR64_LSB1 ((uint32_t)0x40C0E3A1) // adresse du recepteur 1
leomerel 24:bbde0b873a37 19 #define REMOTE_NODE_ADDR64_LSB2 ((uint32_t)0x4086DA0E) // adresse du recepteur 2
leomerel 24:bbde0b873a37 20 #define REMOTE_NODE_ADDR64_1 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB1)
leomerel 24:bbde0b873a37 21 #define REMOTE_NODE_ADDR64_2 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB2)
pierreblouet 17:0694b399bd0d 22
pierreblouet 17:0694b399bd0d 23 using namespace XBeeLib;
pierreblouet 17:0694b399bd0d 24
leomerel 21:5adfcfd83e95 25 //Nombre de voitures au feu
leomerel 22:c3b22291cb9d 26 int voituresFeu1 = 0;
leomerel 24:bbde0b873a37 27 int voituresFeu2 = 0;
leomerel 21:5adfcfd83e95 28 DigitalIn boutonPlus(p24);
leomerel 21:5adfcfd83e95 29 DigitalIn boutonMoins(p23);
leomerel 21:5adfcfd83e95 30 Thread t_nbVoiture;
leomerel 26:e9fc7e552c88 31 Thread t_gestion;
leomerel 26:e9fc7e552c88 32 DigitalOut led1(LED2);
leomerel 21:5adfcfd83e95 33
leomerel 26:e9fc7e552c88 34 //Gestion
leomerel 26:e9fc7e552c88 35 int temps = 5; //durée (en s) pour qu'une voiture traverse le chantier
leomerel 25:fdb28df21d44 36 Timer timer;
pierreblouet 17:0694b399bd0d 37
leomerel 26:e9fc7e552c88 38 //Communication
pierreblouet 17:0694b399bd0d 39 Serial *log_serial;
leomerel 23:2a6ea31d8e23 40 XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
leomerel 24:bbde0b873a37 41 const RemoteXBeeZB remoteDevice1 = RemoteXBeeZB(REMOTE_NODE_ADDR64_1);
leomerel 24:bbde0b873a37 42 const RemoteXBeeZB remoteDevice2 = RemoteXBeeZB(REMOTE_NODE_ADDR64_2);
leomerel 26:e9fc7e552c88 43 char set_rouge[]="r"; // demande a un recepteur de passer au rouge
leomerel 26:e9fc7e552c88 44 char set_vert[]="v"; // demande a un recepteur de passer au vert
leomerel 24:bbde0b873a37 45
leomerel 24:bbde0b873a37 46
leomerel 25:fdb28df21d44 47 static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,const char * data)
leomerel 24:bbde0b873a37 48 {
leomerel 24:bbde0b873a37 49 const uint8_t dstEP = 0xE8;
leomerel 24:bbde0b873a37 50 const uint8_t srcEP = 0xE8;
leomerel 24:bbde0b873a37 51 const uint16_t clusterID = 0x0011;
leomerel 24:bbde0b873a37 52 const uint16_t profileID = 0xC105;
leomerel 24:bbde0b873a37 53
leomerel 25:fdb28df21d44 54 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data, strlen(data));
leomerel 24:bbde0b873a37 55 }
pierreblouet 17:0694b399bd0d 56
pierreblouet 17:0694b399bd0d 57 /** Callback function, invoked at packet reception */
pierreblouet 17:0694b399bd0d 58 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
pierreblouet 17:0694b399bd0d 59 {
leomerel 26:e9fc7e552c88 60 const uint64_t remote_addr64 = remote.get_addr64(); //adresse de l'expéditeur
leomerel 22:c3b22291cb9d 61
leomerel 24:bbde0b873a37 62 if (data[0]==0x6D){
leomerel 24:bbde0b873a37 63 // baisse le compteur de voiture au feu 1
leomerel 24:bbde0b873a37 64 if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1) && (voituresFeu1!=0)){
leomerel 24:bbde0b873a37 65 voituresFeu1--;
leomerel 24:bbde0b873a37 66 }
leomerel 24:bbde0b873a37 67 // baisse le compteur de voiture au feu 2
leomerel 24:bbde0b873a37 68 else if ( (UINT64_LO32(remote_addr64)==UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)) && (voituresFeu2!=0)){
leomerel 24:bbde0b873a37 69 voituresFeu2--;
leomerel 24:bbde0b873a37 70 }
leomerel 25:fdb28df21d44 71 log_serial->printf("Nombre de voitures feu 1 : %d\r\n",voituresFeu1);
leomerel 25:fdb28df21d44 72 log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2);
leomerel 22:c3b22291cb9d 73 }
leomerel 23:2a6ea31d8e23 74 else if (data[0]==0x70){
leomerel 24:bbde0b873a37 75 // augmente le compteur de voiture au feu 1
leomerel 24:bbde0b873a37 76 if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1)){
leomerel 24:bbde0b873a37 77 voituresFeu1++;
leomerel 24:bbde0b873a37 78 }
leomerel 24:bbde0b873a37 79 // augmente le compteur de voiture au feu 2
leomerel 24:bbde0b873a37 80 else if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)){
leomerel 24:bbde0b873a37 81 voituresFeu2++;
leomerel 24:bbde0b873a37 82 }
leomerel 25:fdb28df21d44 83 log_serial->printf("Nombre de voitures feu 1 : %d\r\n",voituresFeu1);
leomerel 25:fdb28df21d44 84 log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2);
leomerel 22:c3b22291cb9d 85 }
leomerel 23:2a6ea31d8e23 86 else if (data[0]==0x72){
leomerel 24:bbde0b873a37 87 // demande au r2 de passer au vert
leomerel 24:bbde0b873a37 88 if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1)){
leomerel 24:bbde0b873a37 89 log_serial->printf("r2 passe au vert");
leomerel 26:e9fc7e552c88 90 send_explicit_data_to_remote_node(xbee, remoteDevice2,set_vert);
leomerel 24:bbde0b873a37 91 }
leomerel 24:bbde0b873a37 92 // demande au r1 de passer au vert
leomerel 24:bbde0b873a37 93 else if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)){
leomerel 24:bbde0b873a37 94 log_serial->printf("r1 passe au vert");
leomerel 26:e9fc7e552c88 95 send_explicit_data_to_remote_node(xbee, remoteDevice1,set_vert);
leomerel 24:bbde0b873a37 96 }
leomerel 23:2a6ea31d8e23 97 }
pierreblouet 17:0694b399bd0d 98 log_serial->printf("\r\n");
emilmont 1:491820ee784d 99 }
leomerel 12:9ec78b07c688 100
leomerel 23:2a6ea31d8e23 101 void connect_Xbee()
pierreblouet 17:0694b399bd0d 102 {
pierreblouet 17:0694b399bd0d 103 log_serial = new Serial(DEBUG_TX, DEBUG_RX);
pierreblouet 17:0694b399bd0d 104 log_serial->baud(9600);
pierreblouet 17:0694b399bd0d 105 log_serial->printf("Sample application to demo how to receive unicast and broadcast data with the XBeeZB\r\n\r\n");
pierreblouet 17:0694b399bd0d 106 log_serial->printf(XB_LIB_BANNER);
pierreblouet 17:0694b399bd0d 107
leomerel 22:c3b22291cb9d 108 #if defined(ENABLE_LOGGING)
pierreblouet 17:0694b399bd0d 109 new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
leomerel 22:c3b22291cb9d 110 #endif
pierreblouet 17:0694b399bd0d 111
pierreblouet 17:0694b399bd0d 112 /* Register callbacks */
pierreblouet 17:0694b399bd0d 113 xbee.register_receive_cb(&receive_cb);
pierreblouet 17:0694b399bd0d 114
pierreblouet 17:0694b399bd0d 115 RadioStatus const radioStatus = xbee.init();
pierreblouet 17:0694b399bd0d 116 MBED_ASSERT(radioStatus == Success);
leomerel 12:9ec78b07c688 117
pierreblouet 17:0694b399bd0d 118 /* Wait until the device has joined the network */
pierreblouet 17:0694b399bd0d 119 log_serial->printf("Waiting for device to join the network: ");
pierreblouet 17:0694b399bd0d 120 while (!xbee.is_joined()) {
pierreblouet 17:0694b399bd0d 121 wait_ms(1000);
pierreblouet 17:0694b399bd0d 122 log_serial->printf(".");
leomerel 12:9ec78b07c688 123 }
pierreblouet 17:0694b399bd0d 124 log_serial->printf("OK\r\n");
leomerel 23:2a6ea31d8e23 125 }
leomerel 23:2a6ea31d8e23 126
leomerel 23:2a6ea31d8e23 127 void gestion()
leomerel 23:2a6ea31d8e23 128 {
leomerel 23:2a6ea31d8e23 129 int i=0;
leomerel 25:fdb28df21d44 130 bool stay1=0;
leomerel 25:fdb28df21d44 131 bool stay2=0;
leomerel 23:2a6ea31d8e23 132 while(1)
leomerel 23:2a6ea31d8e23 133 {
leomerel 25:fdb28df21d44 134 //To check
leomerel 25:fdb28df21d44 135 if ((voituresFeu1==0) && (voituresFeu2!=0)){
leomerel 25:fdb28df21d44 136 if(stay1==0){
leomerel 25:fdb28df21d44 137 stay2=0;
leomerel 25:fdb28df21d44 138 stay1=1;
leomerel 26:e9fc7e552c88 139 send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge);
leomerel 25:fdb28df21d44 140 }
leomerel 23:2a6ea31d8e23 141 }
leomerel 25:fdb28df21d44 142 else if ((voituresFeu2==0) && (voituresFeu1!=0)){
leomerel 25:fdb28df21d44 143 if(stay2==0){
leomerel 25:fdb28df21d44 144 stay1=0;
leomerel 25:fdb28df21d44 145 stay2=1;
leomerel 26:e9fc7e552c88 146 send_explicit_data_to_remote_node(xbee, remoteDevice2,set_rouge);
leomerel 25:fdb28df21d44 147 }
leomerel 23:2a6ea31d8e23 148 }
leomerel 25:fdb28df21d44 149 else{
leomerel 25:fdb28df21d44 150 stay1=0;
leomerel 25:fdb28df21d44 151 stay2=0;
leomerel 25:fdb28df21d44 152 Thread::wait(4000);
leomerel 25:fdb28df21d44 153 if(i==0){
leomerel 26:e9fc7e552c88 154 send_explicit_data_to_remote_node(xbee, remoteDevice2,set_rouge);
leomerel 25:fdb28df21d44 155 i=1;
leomerel 25:fdb28df21d44 156 }
leomerel 25:fdb28df21d44 157 else if(i==1){
leomerel 26:e9fc7e552c88 158 send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge);
leomerel 25:fdb28df21d44 159 i=0;
leomerel 25:fdb28df21d44 160 }
leomerel 25:fdb28df21d44 161 }
leomerel 23:2a6ea31d8e23 162 }
leomerel 22:c3b22291cb9d 163 }
leomerel 22:c3b22291cb9d 164
leomerel 22:c3b22291cb9d 165 int main()
leomerel 22:c3b22291cb9d 166 {
leomerel 23:2a6ea31d8e23 167 connect_Xbee();
leomerel 21:5adfcfd83e95 168
leomerel 23:2a6ea31d8e23 169 t_gestion.start(gestion);
leomerel 23:2a6ea31d8e23 170
leomerel 25:fdb28df21d44 171 while (true) {
leomerel 25:fdb28df21d44 172 uint32_t receive_value = xbee.process_rx_frames();//nécessaire pour lire (constamment) la valeur recue
leomerel 22:c3b22291cb9d 173 if(voituresFeu1 >= 10){led1=1;}
leomerel 22:c3b22291cb9d 174 else{led1=0;}
leomerel 12:9ec78b07c688 175 }
pierreblouet 17:0694b399bd0d 176 }