Gestion du Traffic Adaptatif- Code du mbed coordinateur

Dependencies:   XBeeLib mbed mbed-rtos EthernetInterface

Committer:
leomerel
Date:
Wed Dec 05 15:28:40 2018 +0000
Revision:
29:109a6834f399
Parent:
28:50d89e4255da
Child:
30:f8df12b28719
aa

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 29:109a6834f399 4 #include "EthernetInterface.h"
leomerel 29:109a6834f399 5
leomerel 29:109a6834f399 6 const char* ECHO_SERVER_ADDRESS = "192.168.1.133";
leomerel 29:109a6834f399 7 const int ECHO_SERVER_PORT = 7;
leomerel 25:fdb28df21d44 8
pierreblouet 17:0694b399bd0d 9 #if defined(ENABLE_LOGGING)
pierreblouet 17:0694b399bd0d 10 #include "DigiLoggerMbedSerial.h"
pierreblouet 17:0694b399bd0d 11 using namespace DigiLog;
pierreblouet 17:0694b399bd0d 12 #endif
leomerel 12:9ec78b07c688 13
leomerel 26:e9fc7e552c88 14 //Adressage
pierreblouet 17:0694b399bd0d 15 #define REMOTE_NODE_ADDR64_MSB ((uint32_t)0x0013A200)
leomerel 24:bbde0b873a37 16 #define REMOTE_NODE_ADDR64_LSB1 ((uint32_t)0x40C0E3A1) // adresse du recepteur 1
leomerel 24:bbde0b873a37 17 #define REMOTE_NODE_ADDR64_LSB2 ((uint32_t)0x4086DA0E) // adresse du recepteur 2
leomerel 24:bbde0b873a37 18 #define REMOTE_NODE_ADDR64_1 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB1)
leomerel 24:bbde0b873a37 19 #define REMOTE_NODE_ADDR64_2 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB2)
pierreblouet 17:0694b399bd0d 20
pierreblouet 17:0694b399bd0d 21 using namespace XBeeLib;
pierreblouet 17:0694b399bd0d 22
leomerel 21:5adfcfd83e95 23 //Nombre de voitures au feu
leomerel 22:c3b22291cb9d 24 int voituresFeu1 = 0;
leomerel 24:bbde0b873a37 25 int voituresFeu2 = 0;
leomerel 21:5adfcfd83e95 26 Thread t_nbVoiture;
leomerel 26:e9fc7e552c88 27 Thread t_gestion;
leomerel 21:5adfcfd83e95 28
leomerel 26:e9fc7e552c88 29 //Gestion
leomerel 28:50d89e4255da 30 int temps = 5000; //durée (en ms) pour qu'une voiture traverse le chantier
leomerel 25:fdb28df21d44 31 Timer timer;
leomerel 28:50d89e4255da 32 int whosred;
leomerel 28:50d89e4255da 33 Thread t_setFeu1Vert;
leomerel 28:50d89e4255da 34 Thread t_setFeu2Vert;
leomerel 29:109a6834f399 35 bool stay1=0; /* stay est une variable qui est à 1 lorsqu'on veut qu'un feu reste à une */
leomerel 29:109a6834f399 36 bool stay2=0; /* certaine couleur jusqu'à ce qu'une autre commande lui dise de changer de couleur */
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 28:50d89e4255da 43 char set_rouge[]="r"; // message pour demander a un recepteur de passer au rouge
leomerel 28:50d89e4255da 44 char set_vert[]="v"; // message pour demander a un recepteur de passer au vert
leomerel 24:bbde0b873a37 45
leomerel 29:109a6834f399 46
leomerel 29:109a6834f399 47 InterruptIn button(p5);
leomerel 29:109a6834f399 48 DigitalOut led1(LED1);
leomerel 29:109a6834f399 49 DigitalOut led2(LED2);
leomerel 29:109a6834f399 50 DigitalOut led3(LED3);
leomerel 29:109a6834f399 51 DigitalOut led4(LED4);
leomerel 29:109a6834f399 52 uint8_t vehicule_urgence=0;
leomerel 29:109a6834f399 53 Thread t_urgence;
leomerel 29:109a6834f399 54 Thread t_blink;
leomerel 29:109a6834f399 55 Thread t_Ethernet
leomerel 29:109a6834f399 56
leomerel 29:109a6834f399 57 void sendMessage() {
leomerel 29:109a6834f399 58 EthernetInterface eth;
leomerel 29:109a6834f399 59 eth.init(); //Use DHCP
leomerel 29:109a6834f399 60 eth.connect();
leomerel 29:109a6834f399 61 printf("\nClient IP Address is %s\n", eth.getIPAddress());
leomerel 29:109a6834f399 62
leomerel 29:109a6834f399 63 // Connect to Server
leomerel 29:109a6834f399 64 TCPSocketConnection socket;
leomerel 29:109a6834f399 65 while (socket.connect(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT) < 0) {
leomerel 29:109a6834f399 66 printf("Unable to connect to (%s) on port (%d)\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT);
leomerel 29:109a6834f399 67 wait(1);
leomerel 29:109a6834f399 68 }
leomerel 29:109a6834f399 69 printf("Connected to Server at %s\n",ECHO_SERVER_ADDRESS);
leomerel 29:109a6834f399 70 int i = 0;
leomerel 29:109a6834f399 71 while(1) {
leomerel 29:109a6834f399 72 char hello[] = i;
leomerel 29:109a6834f399 73 printf("Sending message to Server : '%s' \n",hello);
leomerel 29:109a6834f399 74 socket.send_all(hello, sizeof(hello) - 1);
leomerel 29:109a6834f399 75 Thread::wait(1000)
leomerel 29:109a6834f399 76 i++;
leomerel 29:109a6834f399 77 }
leomerel 29:109a6834f399 78
leomerel 29:109a6834f399 79
leomerel 29:109a6834f399 80 }
leomerel 29:109a6834f399 81
leomerel 25:fdb28df21d44 82 static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,const char * data)
leomerel 24:bbde0b873a37 83 {
leomerel 24:bbde0b873a37 84 const uint8_t dstEP = 0xE8;
leomerel 24:bbde0b873a37 85 const uint8_t srcEP = 0xE8;
leomerel 24:bbde0b873a37 86 const uint16_t clusterID = 0x0011;
leomerel 24:bbde0b873a37 87 const uint16_t profileID = 0xC105;
leomerel 24:bbde0b873a37 88
leomerel 25:fdb28df21d44 89 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data, strlen(data));
leomerel 24:bbde0b873a37 90 }
pierreblouet 17:0694b399bd0d 91
leomerel 28:50d89e4255da 92 //Fonction callback invoquée à la réception d'un message
pierreblouet 17:0694b399bd0d 93 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
pierreblouet 17:0694b399bd0d 94 {
leomerel 28:50d89e4255da 95 const uint64_t remote_addr64 = remote.get_addr64(); //adresse de l'expéditeur du message
leomerel 22:c3b22291cb9d 96
leomerel 24:bbde0b873a37 97 if (data[0]==0x6D){
leomerel 24:bbde0b873a37 98 // baisse le compteur de voiture au feu 1
leomerel 24:bbde0b873a37 99 if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1) && (voituresFeu1!=0)){
leomerel 24:bbde0b873a37 100 voituresFeu1--;
leomerel 24:bbde0b873a37 101 }
leomerel 24:bbde0b873a37 102 // baisse le compteur de voiture au feu 2
leomerel 24:bbde0b873a37 103 else if ( (UINT64_LO32(remote_addr64)==UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)) && (voituresFeu2!=0)){
leomerel 24:bbde0b873a37 104 voituresFeu2--;
leomerel 24:bbde0b873a37 105 }
leomerel 25:fdb28df21d44 106 log_serial->printf("Nombre de voitures feu 1 : %d\r\n",voituresFeu1);
leomerel 25:fdb28df21d44 107 log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2);
leomerel 22:c3b22291cb9d 108 }
leomerel 23:2a6ea31d8e23 109 else if (data[0]==0x70){
leomerel 24:bbde0b873a37 110 // augmente le compteur de voiture au feu 1
leomerel 24:bbde0b873a37 111 if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1)){
leomerel 24:bbde0b873a37 112 voituresFeu1++;
leomerel 24:bbde0b873a37 113 }
leomerel 24:bbde0b873a37 114 // augmente le compteur de voiture au feu 2
leomerel 24:bbde0b873a37 115 else if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)){
leomerel 24:bbde0b873a37 116 voituresFeu2++;
leomerel 24:bbde0b873a37 117 }
leomerel 25:fdb28df21d44 118 log_serial->printf("Nombre de voitures feu 1 : %d\r\n",voituresFeu1);
leomerel 25:fdb28df21d44 119 log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2);
leomerel 22:c3b22291cb9d 120 }
leomerel 23:2a6ea31d8e23 121 else if (data[0]==0x72){
leomerel 28:50d89e4255da 122 // confirmation que r1 est bien rouge, donc peut demander au r2 de passer au vert
leomerel 24:bbde0b873a37 123 if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1)){
leomerel 29:109a6834f399 124 if(vehicule_urgence==0){
leomerel 29:109a6834f399 125 whosred = 1;
leomerel 29:109a6834f399 126 t_setFeu2Vert.signal_set(0x1);
leomerel 29:109a6834f399 127 }
leomerel 24:bbde0b873a37 128 }
leomerel 28:50d89e4255da 129 // confirmation que r2 est bien rouge, donc peut demander au r1 de passer au vert
leomerel 24:bbde0b873a37 130 else if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)){
leomerel 29:109a6834f399 131 if(vehicule_urgence==0){
leomerel 29:109a6834f399 132 whosred = 2;
leomerel 29:109a6834f399 133 t_setFeu1Vert.signal_set(0x1);
leomerel 29:109a6834f399 134 }
leomerel 24:bbde0b873a37 135 }
leomerel 23:2a6ea31d8e23 136 }
pierreblouet 17:0694b399bd0d 137 log_serial->printf("\r\n");
emilmont 1:491820ee784d 138 }
leomerel 12:9ec78b07c688 139
leomerel 28:50d89e4255da 140 void setFeu1Vert(){
leomerel 28:50d89e4255da 141 while(1){
leomerel 28:50d89e4255da 142 Thread::signal_wait(0x1);
leomerel 28:50d89e4255da 143 Thread::wait(temps);
leomerel 29:109a6834f399 144 if(vehicule_urgence==0){
leomerel 29:109a6834f399 145 send_explicit_data_to_remote_node(xbee, remoteDevice1,set_vert);
leomerel 29:109a6834f399 146 log_serial->printf("r1 passe au vert");
leomerel 29:109a6834f399 147 }
leomerel 28:50d89e4255da 148 }
leomerel 28:50d89e4255da 149 }
leomerel 28:50d89e4255da 150
leomerel 28:50d89e4255da 151 void setFeu2Vert(){
leomerel 28:50d89e4255da 152 while(1){
leomerel 28:50d89e4255da 153 Thread::signal_wait(0x1);
leomerel 28:50d89e4255da 154 Thread::wait(temps);
leomerel 29:109a6834f399 155 if(vehicule_urgence==0){
leomerel 29:109a6834f399 156 send_explicit_data_to_remote_node(xbee, remoteDevice2,set_vert);
leomerel 29:109a6834f399 157 }
leomerel 28:50d89e4255da 158 log_serial->printf("r2 passe au vert");
leomerel 28:50d89e4255da 159 }
leomerel 28:50d89e4255da 160 }
leomerel 28:50d89e4255da 161
leomerel 23:2a6ea31d8e23 162 void connect_Xbee()
pierreblouet 17:0694b399bd0d 163 {
pierreblouet 17:0694b399bd0d 164 log_serial = new Serial(DEBUG_TX, DEBUG_RX);
pierreblouet 17:0694b399bd0d 165 log_serial->baud(9600);
pierreblouet 17:0694b399bd0d 166
leomerel 22:c3b22291cb9d 167 #if defined(ENABLE_LOGGING)
pierreblouet 17:0694b399bd0d 168 new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
leomerel 22:c3b22291cb9d 169 #endif
pierreblouet 17:0694b399bd0d 170
leomerel 28:50d89e4255da 171 // Register callbacks
pierreblouet 17:0694b399bd0d 172 xbee.register_receive_cb(&receive_cb);
pierreblouet 17:0694b399bd0d 173
pierreblouet 17:0694b399bd0d 174 RadioStatus const radioStatus = xbee.init();
pierreblouet 17:0694b399bd0d 175 MBED_ASSERT(radioStatus == Success);
leomerel 12:9ec78b07c688 176
leomerel 28:50d89e4255da 177 //Attend que l'appareil rejoigne le réseau
leomerel 28:50d89e4255da 178 log_serial->printf("En attente de connexion au reseau: ");
pierreblouet 17:0694b399bd0d 179 while (!xbee.is_joined()) {
pierreblouet 17:0694b399bd0d 180 wait_ms(1000);
pierreblouet 17:0694b399bd0d 181 log_serial->printf(".");
leomerel 12:9ec78b07c688 182 }
leomerel 28:50d89e4255da 183 log_serial->printf("Connection reussie.\r\n");
leomerel 28:50d89e4255da 184 whosred=1;
leomerel 23:2a6ea31d8e23 185 }
leomerel 23:2a6ea31d8e23 186
leomerel 23:2a6ea31d8e23 187 void gestion()
leomerel 23:2a6ea31d8e23 188 {
leomerel 23:2a6ea31d8e23 189 while(1)
leomerel 23:2a6ea31d8e23 190 {
leomerel 28:50d89e4255da 191 /* Si il n'y a pas de voitures à un feu ou si il y a beaucoup plus de voitures à l'autre feu, */
leomerel 28:50d89e4255da 192 /* alors l'autre feu passera au vert et le feu avec le moins de voitures passera au rouge. */
leomerel 28:50d89e4255da 193 if ( ((voituresFeu1==0) && (voituresFeu2!=0)) || (voituresFeu2-voituresFeu1>=10) ){
leomerel 25:fdb28df21d44 194 if(stay1==0){
leomerel 25:fdb28df21d44 195 stay2=0;
leomerel 25:fdb28df21d44 196 stay1=1;
leomerel 26:e9fc7e552c88 197 send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge);
leomerel 27:0085fca436e1 198 Thread::wait(100);
leomerel 25:fdb28df21d44 199 }
leomerel 23:2a6ea31d8e23 200 }
leomerel 28:50d89e4255da 201 else if ( ((voituresFeu2==0) && (voituresFeu1!=0)) || (voituresFeu1-voituresFeu2>=10) ){
leomerel 25:fdb28df21d44 202 if(stay2==0){
leomerel 25:fdb28df21d44 203 stay1=0;
leomerel 25:fdb28df21d44 204 stay2=1;
leomerel 26:e9fc7e552c88 205 send_explicit_data_to_remote_node(xbee, remoteDevice2,set_rouge);
leomerel 27:0085fca436e1 206 Thread::wait(100);
leomerel 25:fdb28df21d44 207 }
leomerel 23:2a6ea31d8e23 208 }
leomerel 28:50d89e4255da 209 /* Si on est dans aucun de ces deux cas, alors les feux suivront un cycle d'allumage classique. */
leomerel 25:fdb28df21d44 210 else{
leomerel 25:fdb28df21d44 211 stay1=0;
leomerel 25:fdb28df21d44 212 stay2=0;
leomerel 27:0085fca436e1 213 if(whosred==1){
leomerel 26:e9fc7e552c88 214 send_explicit_data_to_remote_node(xbee, remoteDevice2,set_rouge);
leomerel 25:fdb28df21d44 215 }
leomerel 27:0085fca436e1 216 else if(whosred==2){
leomerel 26:e9fc7e552c88 217 send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge);
leomerel 25:fdb28df21d44 218 }
leomerel 28:50d89e4255da 219 Thread::wait(10000);
leomerel 25:fdb28df21d44 220 }
leomerel 23:2a6ea31d8e23 221 }
leomerel 22:c3b22291cb9d 222 }
leomerel 22:c3b22291cb9d 223
leomerel 29:109a6834f399 224 void rise() {
leomerel 29:109a6834f399 225 led3 = !led3;
leomerel 29:109a6834f399 226 t_urgence.signal_set(0x1);
leomerel 29:109a6834f399 227 }
leomerel 29:109a6834f399 228 void fall() {
leomerel 29:109a6834f399 229 led2 = !led2;
leomerel 29:109a6834f399 230 }
leomerel 29:109a6834f399 231
leomerel 29:109a6834f399 232 void blink(){
leomerel 29:109a6834f399 233 while(1){
leomerel 29:109a6834f399 234 Thread::signal_wait(0x1);
leomerel 29:109a6834f399 235 while(vehicule_urgence){
leomerel 29:109a6834f399 236 led4 = !led4;
leomerel 29:109a6834f399 237 Thread::wait(200);
leomerel 29:109a6834f399 238 }
leomerel 29:109a6834f399 239 led4 = 0;
leomerel 29:109a6834f399 240 }
leomerel 29:109a6834f399 241 }
leomerel 29:109a6834f399 242
leomerel 29:109a6834f399 243 void urgence(){
leomerel 29:109a6834f399 244 while(1){
leomerel 29:109a6834f399 245 Thread::signal_wait(0x1);
leomerel 29:109a6834f399 246 t_blink.signal_set(0x1);
leomerel 29:109a6834f399 247 vehicule_urgence = 1;
leomerel 29:109a6834f399 248 send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge);
leomerel 29:109a6834f399 249 send_explicit_data_to_remote_node(xbee, remoteDevice2,set_rouge);
leomerel 29:109a6834f399 250 Thread::wait(10000);
leomerel 29:109a6834f399 251 stay1=0;
leomerel 29:109a6834f399 252 stay2=0;
leomerel 29:109a6834f399 253 vehicule_urgence = 0;
leomerel 29:109a6834f399 254 }
leomerel 29:109a6834f399 255 }
leomerel 29:109a6834f399 256
leomerel 22:c3b22291cb9d 257 int main()
leomerel 22:c3b22291cb9d 258 {
leomerel 29:109a6834f399 259
leomerel 29:109a6834f399 260 led2=0;
leomerel 29:109a6834f399 261 led3=0;
leomerel 29:109a6834f399 262 led4=0;
leomerel 23:2a6ea31d8e23 263 connect_Xbee();
leomerel 21:5adfcfd83e95 264
leomerel 23:2a6ea31d8e23 265 t_gestion.start(gestion);
leomerel 28:50d89e4255da 266 t_setFeu1Vert.start(setFeu1Vert);
leomerel 28:50d89e4255da 267 t_setFeu2Vert.start(setFeu2Vert);
leomerel 29:109a6834f399 268 t_urgence.start(urgence);
leomerel 29:109a6834f399 269 t_blink.start(blink);
leomerel 29:109a6834f399 270 t_Ethernet(sendMessage);
leomerel 29:109a6834f399 271
leomerel 29:109a6834f399 272 button.rise(&rise); // attach the address of the flip function to the rising edge
leomerel 29:109a6834f399 273 button.fall(&fall);
leomerel 23:2a6ea31d8e23 274
leomerel 25:fdb28df21d44 275 while (true) {
leomerel 25:fdb28df21d44 276 uint32_t receive_value = xbee.process_rx_frames();//nécessaire pour lire (constamment) la valeur recue
leomerel 12:9ec78b07c688 277 }
pierreblouet 17:0694b399bd0d 278 }