Gestion du Traffic Adaptatif- Code du mbed coordinateur

Dependencies:   XBeeLib mbed mbed-rtos EthernetInterface

Committer:
leomerel
Date:
Sun Dec 02 19:56:29 2018 +0000
Revision:
25:fdb28df21d44
Parent:
24:bbde0b873a37
Child:
26:e9fc7e552c88
V4; Code ameliore et optimise par rapport a la V3. Ajout de la fonctionnalite "intelligente" du feu : lorsqu'il n'y a pas de voiture au feu1 alors qu'il y en a au feu2, alors le feu 2 reste vert.

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