Gestion du Traffic Adaptatif- Code du mbed coordinateur

Dependencies:   XBeeLib mbed mbed-rtos EthernetInterface

Committer:
leomerel
Date:
Mon Dec 03 22:42:37 2018 +0000
Revision:
27:0085fca436e1
Parent:
26:e9fc7e552c88
Child:
28:50d89e4255da
V4.2

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 27:0085fca436e1 46 int whosred=0;
leomerel 27:0085fca436e1 47
leomerel 24:bbde0b873a37 48
leomerel 25:fdb28df21d44 49 static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,const char * data)
leomerel 24:bbde0b873a37 50 {
leomerel 24:bbde0b873a37 51 const uint8_t dstEP = 0xE8;
leomerel 24:bbde0b873a37 52 const uint8_t srcEP = 0xE8;
leomerel 24:bbde0b873a37 53 const uint16_t clusterID = 0x0011;
leomerel 24:bbde0b873a37 54 const uint16_t profileID = 0xC105;
leomerel 24:bbde0b873a37 55
leomerel 25:fdb28df21d44 56 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data, strlen(data));
leomerel 24:bbde0b873a37 57 }
pierreblouet 17:0694b399bd0d 58
pierreblouet 17:0694b399bd0d 59 /** Callback function, invoked at packet reception */
pierreblouet 17:0694b399bd0d 60 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
pierreblouet 17:0694b399bd0d 61 {
leomerel 26:e9fc7e552c88 62 const uint64_t remote_addr64 = remote.get_addr64(); //adresse de l'expéditeur
leomerel 22:c3b22291cb9d 63
leomerel 24:bbde0b873a37 64 if (data[0]==0x6D){
leomerel 24:bbde0b873a37 65 // baisse le compteur de voiture au feu 1
leomerel 24:bbde0b873a37 66 if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1) && (voituresFeu1!=0)){
leomerel 24:bbde0b873a37 67 voituresFeu1--;
leomerel 24:bbde0b873a37 68 }
leomerel 24:bbde0b873a37 69 // baisse le compteur de voiture au feu 2
leomerel 24:bbde0b873a37 70 else if ( (UINT64_LO32(remote_addr64)==UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)) && (voituresFeu2!=0)){
leomerel 24:bbde0b873a37 71 voituresFeu2--;
leomerel 24:bbde0b873a37 72 }
leomerel 25:fdb28df21d44 73 log_serial->printf("Nombre de voitures feu 1 : %d\r\n",voituresFeu1);
leomerel 25:fdb28df21d44 74 log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2);
leomerel 22:c3b22291cb9d 75 }
leomerel 23:2a6ea31d8e23 76 else if (data[0]==0x70){
leomerel 24:bbde0b873a37 77 // augmente le compteur de voiture au feu 1
leomerel 24:bbde0b873a37 78 if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1)){
leomerel 24:bbde0b873a37 79 voituresFeu1++;
leomerel 24:bbde0b873a37 80 }
leomerel 24:bbde0b873a37 81 // augmente le compteur de voiture au feu 2
leomerel 24:bbde0b873a37 82 else if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)){
leomerel 24:bbde0b873a37 83 voituresFeu2++;
leomerel 24:bbde0b873a37 84 }
leomerel 25:fdb28df21d44 85 log_serial->printf("Nombre de voitures feu 1 : %d\r\n",voituresFeu1);
leomerel 25:fdb28df21d44 86 log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2);
leomerel 22:c3b22291cb9d 87 }
leomerel 23:2a6ea31d8e23 88 else if (data[0]==0x72){
leomerel 24:bbde0b873a37 89 // demande au r2 de passer au vert
leomerel 24:bbde0b873a37 90 if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1)){
leomerel 24:bbde0b873a37 91 log_serial->printf("r2 passe au vert");
leomerel 26:e9fc7e552c88 92 send_explicit_data_to_remote_node(xbee, remoteDevice2,set_vert);
leomerel 27:0085fca436e1 93 whosred = 1;
leomerel 24:bbde0b873a37 94 }
leomerel 24:bbde0b873a37 95 // demande au r1 de passer au vert
leomerel 24:bbde0b873a37 96 else if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)){
leomerel 24:bbde0b873a37 97 log_serial->printf("r1 passe au vert");
leomerel 26:e9fc7e552c88 98 send_explicit_data_to_remote_node(xbee, remoteDevice1,set_vert);
leomerel 27:0085fca436e1 99 whosred = 2;
leomerel 24:bbde0b873a37 100 }
leomerel 23:2a6ea31d8e23 101 }
pierreblouet 17:0694b399bd0d 102 log_serial->printf("\r\n");
emilmont 1:491820ee784d 103 }
leomerel 12:9ec78b07c688 104
leomerel 23:2a6ea31d8e23 105 void connect_Xbee()
pierreblouet 17:0694b399bd0d 106 {
pierreblouet 17:0694b399bd0d 107 log_serial = new Serial(DEBUG_TX, DEBUG_RX);
pierreblouet 17:0694b399bd0d 108 log_serial->baud(9600);
pierreblouet 17:0694b399bd0d 109 log_serial->printf("Sample application to demo how to receive unicast and broadcast data with the XBeeZB\r\n\r\n");
pierreblouet 17:0694b399bd0d 110 log_serial->printf(XB_LIB_BANNER);
pierreblouet 17:0694b399bd0d 111
leomerel 22:c3b22291cb9d 112 #if defined(ENABLE_LOGGING)
pierreblouet 17:0694b399bd0d 113 new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
leomerel 22:c3b22291cb9d 114 #endif
pierreblouet 17:0694b399bd0d 115
pierreblouet 17:0694b399bd0d 116 /* Register callbacks */
pierreblouet 17:0694b399bd0d 117 xbee.register_receive_cb(&receive_cb);
pierreblouet 17:0694b399bd0d 118
pierreblouet 17:0694b399bd0d 119 RadioStatus const radioStatus = xbee.init();
pierreblouet 17:0694b399bd0d 120 MBED_ASSERT(radioStatus == Success);
leomerel 12:9ec78b07c688 121
pierreblouet 17:0694b399bd0d 122 /* Wait until the device has joined the network */
pierreblouet 17:0694b399bd0d 123 log_serial->printf("Waiting for device to join the network: ");
pierreblouet 17:0694b399bd0d 124 while (!xbee.is_joined()) {
pierreblouet 17:0694b399bd0d 125 wait_ms(1000);
pierreblouet 17:0694b399bd0d 126 log_serial->printf(".");
leomerel 12:9ec78b07c688 127 }
pierreblouet 17:0694b399bd0d 128 log_serial->printf("OK\r\n");
leomerel 23:2a6ea31d8e23 129 }
leomerel 23:2a6ea31d8e23 130
leomerel 23:2a6ea31d8e23 131 void gestion()
leomerel 23:2a6ea31d8e23 132 {
leomerel 27:0085fca436e1 133 //int i=0;
leomerel 25:fdb28df21d44 134 bool stay1=0;
leomerel 25:fdb28df21d44 135 bool stay2=0;
leomerel 23:2a6ea31d8e23 136 while(1)
leomerel 23:2a6ea31d8e23 137 {
leomerel 25:fdb28df21d44 138 //To check
leomerel 25:fdb28df21d44 139 if ((voituresFeu1==0) && (voituresFeu2!=0)){
leomerel 25:fdb28df21d44 140 if(stay1==0){
leomerel 25:fdb28df21d44 141 stay2=0;
leomerel 25:fdb28df21d44 142 stay1=1;
leomerel 26:e9fc7e552c88 143 send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge);
leomerel 27:0085fca436e1 144 Thread::wait(100);
leomerel 25:fdb28df21d44 145 }
leomerel 23:2a6ea31d8e23 146 }
leomerel 25:fdb28df21d44 147 else if ((voituresFeu2==0) && (voituresFeu1!=0)){
leomerel 25:fdb28df21d44 148 if(stay2==0){
leomerel 25:fdb28df21d44 149 stay1=0;
leomerel 25:fdb28df21d44 150 stay2=1;
leomerel 26:e9fc7e552c88 151 send_explicit_data_to_remote_node(xbee, remoteDevice2,set_rouge);
leomerel 27:0085fca436e1 152 Thread::wait(100);
leomerel 25:fdb28df21d44 153 }
leomerel 23:2a6ea31d8e23 154 }
leomerel 25:fdb28df21d44 155 else{
leomerel 25:fdb28df21d44 156 stay1=0;
leomerel 25:fdb28df21d44 157 stay2=0;
leomerel 27:0085fca436e1 158 if(whosred==1){
leomerel 26:e9fc7e552c88 159 send_explicit_data_to_remote_node(xbee, remoteDevice2,set_rouge);
leomerel 25:fdb28df21d44 160 }
leomerel 27:0085fca436e1 161 else if(whosred==2){
leomerel 26:e9fc7e552c88 162 send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge);
leomerel 25:fdb28df21d44 163 }
leomerel 27:0085fca436e1 164 Thread::wait(4000);
leomerel 25:fdb28df21d44 165 }
leomerel 23:2a6ea31d8e23 166 }
leomerel 22:c3b22291cb9d 167 }
leomerel 22:c3b22291cb9d 168
leomerel 22:c3b22291cb9d 169 int main()
leomerel 22:c3b22291cb9d 170 {
leomerel 23:2a6ea31d8e23 171 connect_Xbee();
leomerel 21:5adfcfd83e95 172
leomerel 23:2a6ea31d8e23 173 t_gestion.start(gestion);
leomerel 23:2a6ea31d8e23 174
leomerel 25:fdb28df21d44 175 while (true) {
leomerel 25:fdb28df21d44 176 uint32_t receive_value = xbee.process_rx_frames();//nécessaire pour lire (constamment) la valeur recue
leomerel 22:c3b22291cb9d 177 if(voituresFeu1 >= 10){led1=1;}
leomerel 22:c3b22291cb9d 178 else{led1=0;}
leomerel 12:9ec78b07c688 179 }
pierreblouet 17:0694b399bd0d 180 }