Gestion du Traffic Adaptatif- Code du mbed coordinateur

Dependencies:   XBeeLib mbed mbed-rtos EthernetInterface

Committer:
leomerel
Date:
Thu Dec 06 20:28:22 2018 +0000
Revision:
31:7ca80c48a6d7
Parent:
30:f8df12b28719
VF; Version finale remise avec le rapport final. Par rapport a la version precedente, on a ajoute la communication avec le rasberryPi.

Who changed what in which revision?

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