Gestion du Trafic Adaptatif - Code des mbed récepteurs

Dependencies:   XBeeLib mbed mbed-rtos

Committer:
leomerel
Date:
Tue Dec 04 19:33:10 2018 +0000
Revision:
25:7ce844f9a1ae
Parent:
24:8c3f700dbfe7
Child:
26:9f2c70bfb336
V5; Ajout capteur + affichage du nombre de voiture en binaire avec les led

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:2ad11875542c 3 #include "rtos.h"
pierreblouet 17:0694b399bd0d 4 #if defined(ENABLE_LOGGING)
pierreblouet 17:0694b399bd0d 5 #include "DigiLoggerMbedSerial.h"
pierreblouet 17:0694b399bd0d 6 using namespace DigiLog;
pierreblouet 17:0694b399bd0d 7 #endif
leomerel 12:9ec78b07c688 8
leomerel 12:9ec78b07c688 9
pierreblouet 17:0694b399bd0d 10 #define REMOTE_NODE_ADDR64_MSB ((uint32_t)0x0013A200)
pierreblouet 17:0694b399bd0d 11
pierreblouet 17:0694b399bd0d 12 //#error "Replace next define with the LSB of the remote module's 64-bit address (SL parameter)"
pierreblouet 18:a302b82c4357 13 #define REMOTE_NODE_ADDR64_LSB ((uint32_t)0x40E779AF)
pierreblouet 17:0694b399bd0d 14
pierreblouet 17:0694b399bd0d 15 #define REMOTE_NODE_ADDR64 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB)
pierreblouet 17:0694b399bd0d 16
pierreblouet 17:0694b399bd0d 17 using namespace XBeeLib;
pierreblouet 17:0694b399bd0d 18
pierreblouet 17:0694b399bd0d 19 //feux gauche
pierreblouet 17:0694b399bd0d 20 //rouge
leomerel 22:d9287c62dd45 21 DigitalOut feu_rouge(p30);
pierreblouet 17:0694b399bd0d 22 //orange
leomerel 22:d9287c62dd45 23 DigitalOut feu_orange(p28);
pierreblouet 17:0694b399bd0d 24 //vert
leomerel 22:d9287c62dd45 25 DigitalOut feu_vert(p26);
leomerel 12:9ec78b07c688 26
leomerel 25:7ce844f9a1ae 27 DigitalOut led1(LED1);
leomerel 25:7ce844f9a1ae 28 DigitalOut led2(LED2);
leomerel 25:7ce844f9a1ae 29 DigitalOut led3(LED3);
leomerel 25:7ce844f9a1ae 30 DigitalOut led4(LED4);
leomerel 25:7ce844f9a1ae 31 int nbVoiture = 0;
leomerel 25:7ce844f9a1ae 32 Thread t_affichage;
leomerel 25:7ce844f9a1ae 33
leomerel 25:7ce844f9a1ae 34 Thread t_nbVoitureBouton;
leomerel 25:7ce844f9a1ae 35 Thread t_nbVoitureCapteur;
leomerel 22:d9287c62dd45 36 Thread t_feuRouge;
leomerel 25:7ce844f9a1ae 37 Timer timer;
leomerel 21:2ad11875542c 38
leomerel 21:2ad11875542c 39 DigitalIn boutonPlus(p24);
leomerel 21:2ad11875542c 40 DigitalIn boutonMoins(p23);
leomerel 25:7ce844f9a1ae 41 AnalogIn signal(p20);
pierreblouet 17:0694b399bd0d 42
leomerel 25:7ce844f9a1ae 43 char moins[]="m"; // m comme "moins" - une voiture de moins
leomerel 25:7ce844f9a1ae 44 char plus[]="p"; // p comme "plus" - une voiture de plus
leomerel 25:7ce844f9a1ae 45 char rouge[]="r"; // r comme "rouge" - confirmation que le feu est rouge
leomerel 25:7ce844f9a1ae 46
leomerel 25:7ce844f9a1ae 47 int compteur =0;
leomerel 25:7ce844f9a1ae 48 int wait_front_montant = 0;
leomerel 25:7ce844f9a1ae 49 int wait_front_descendant = 0;
leomerel 25:7ce844f9a1ae 50 double frequence =0;
leomerel 24:8c3f700dbfe7 51
leomerel 21:2ad11875542c 52 Serial *log_serial;
leomerel 21:2ad11875542c 53 XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
leomerel 21:2ad11875542c 54 const RemoteXBeeZB remoteDevice = RemoteXBeeZB(REMOTE_NODE_ADDR64);
pierreblouet 17:0694b399bd0d 55
pierreblouet 17:0694b399bd0d 56 /** Callback function, invoked at packet reception */
pierreblouet 17:0694b399bd0d 57 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
pierreblouet 17:0694b399bd0d 58 {
pierreblouet 17:0694b399bd0d 59 const uint64_t remote_addr64 = remote.get_addr64();
pierreblouet 17:0694b399bd0d 60
pierreblouet 17:0694b399bd0d 61 log_serial->printf("\r\nGot a %s RX packet [%08x:%08x|%04x], len %d\r\nData: ", broadcast ? "BROADCAST" : "UNICAST", UINT64_HI32(remote_addr64), UINT64_LO32(remote_addr64), remote.get_addr16(), len);
pierreblouet 17:0694b399bd0d 62
leomerel 24:8c3f700dbfe7 63 if (data[0]==0x72){
leomerel 22:d9287c62dd45 64 t_feuRouge.signal_set(0x1);
leomerel 22:d9287c62dd45 65 }
leomerel 24:8c3f700dbfe7 66 else if (data[0]==0x76){
leomerel 22:d9287c62dd45 67 feu_rouge = 0;
leomerel 22:d9287c62dd45 68 feu_orange = 0;
leomerel 22:d9287c62dd45 69 feu_vert = 1;
leomerel 22:d9287c62dd45 70 }
pierreblouet 18:a302b82c4357 71
pierreblouet 17:0694b399bd0d 72 log_serial->printf("\r\n");
emilmont 1:491820ee784d 73 }
leomerel 12:9ec78b07c688 74
pierreblouet 17:0694b399bd0d 75
leomerel 24:8c3f700dbfe7 76 static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,const char * data)
leomerel 22:d9287c62dd45 77 {
pierreblouet 17:0694b399bd0d 78 const uint8_t dstEP = 0xE8;
pierreblouet 17:0694b399bd0d 79 const uint8_t srcEP = 0xE8;
pierreblouet 17:0694b399bd0d 80 const uint16_t clusterID = 0x0011;
pierreblouet 17:0694b399bd0d 81 const uint16_t profileID = 0xC105;
pierreblouet 17:0694b399bd0d 82
leomerel 24:8c3f700dbfe7 83 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data, strlen(data));
emilmont 1:491820ee784d 84 }
leomerel 12:9ec78b07c688 85
leomerel 21:2ad11875542c 86 void connect_Xbee()
pierreblouet 17:0694b399bd0d 87 {
pierreblouet 17:0694b399bd0d 88 log_serial = new Serial(DEBUG_TX, DEBUG_RX);
pierreblouet 17:0694b399bd0d 89 log_serial->baud(9600);
pierreblouet 17:0694b399bd0d 90 log_serial->printf("Sample application to demo how to receive unicast and broadcast data with the XBeeZB\r\n\r\n");
pierreblouet 17:0694b399bd0d 91 log_serial->printf(XB_LIB_BANNER);
pierreblouet 17:0694b399bd0d 92
leomerel 21:2ad11875542c 93 #if defined(ENABLE_LOGGING)
pierreblouet 17:0694b399bd0d 94 new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
leomerel 21:2ad11875542c 95 #endif
pierreblouet 17:0694b399bd0d 96
pierreblouet 17:0694b399bd0d 97 /* Register callbacks */
pierreblouet 17:0694b399bd0d 98 xbee.register_receive_cb(&receive_cb);
pierreblouet 17:0694b399bd0d 99
pierreblouet 17:0694b399bd0d 100 RadioStatus const radioStatus = xbee.init();
pierreblouet 17:0694b399bd0d 101 MBED_ASSERT(radioStatus == Success);
leomerel 12:9ec78b07c688 102
pierreblouet 17:0694b399bd0d 103 /* Wait until the device has joined the network */
pierreblouet 17:0694b399bd0d 104 log_serial->printf("Waiting for device to join the network: ");
pierreblouet 17:0694b399bd0d 105 while (!xbee.is_joined()) {
pierreblouet 17:0694b399bd0d 106 wait_ms(1000);
pierreblouet 17:0694b399bd0d 107 log_serial->printf(".");
leomerel 12:9ec78b07c688 108 }
pierreblouet 17:0694b399bd0d 109 log_serial->printf("OK\r\n");
leomerel 22:d9287c62dd45 110 }
leomerel 22:d9287c62dd45 111
leomerel 22:d9287c62dd45 112 void set_feuRouge()
leomerel 22:d9287c62dd45 113 {
leomerel 22:d9287c62dd45 114 while(1)
leomerel 22:d9287c62dd45 115 {
leomerel 22:d9287c62dd45 116 Thread::signal_wait(0x1);
leomerel 24:8c3f700dbfe7 117 if (feu_rouge!=1){
leomerel 24:8c3f700dbfe7 118 feu_vert = 0;
leomerel 24:8c3f700dbfe7 119 feu_orange = 1;
leomerel 24:8c3f700dbfe7 120 Thread::wait(2000);
leomerel 24:8c3f700dbfe7 121 feu_orange = 0;
leomerel 24:8c3f700dbfe7 122 feu_rouge = 1;
leomerel 24:8c3f700dbfe7 123 }
leomerel 25:7ce844f9a1ae 124 send_explicit_data_to_remote_node(xbee, remoteDevice,rouge);
leomerel 22:d9287c62dd45 125 }
leomerel 21:2ad11875542c 126 }
leomerel 12:9ec78b07c688 127
leomerel 25:7ce844f9a1ae 128 void nbVoitureBouton() {
leomerel 22:d9287c62dd45 129 //TO DO :
leomerel 22:d9287c62dd45 130 // - faire un compteur de voitures interne au recepteur et envoyer ce nombre
leomerel 22:d9287c62dd45 131 // au coordinateur -> plus fiable en cas de perte de donnees dans un envoi
leomerel 22:d9287c62dd45 132 // - faire un buffer pour envoyer les donnees
leomerel 22:d9287c62dd45 133 //
leomerel 21:2ad11875542c 134 while(1) {
leomerel 21:2ad11875542c 135 if(boutonPlus){
leomerel 25:7ce844f9a1ae 136 nbVoiture++;
leomerel 25:7ce844f9a1ae 137 send_explicit_data_to_remote_node(xbee, remoteDevice,plus);
leomerel 21:2ad11875542c 138 Thread::wait(500);
leomerel 21:2ad11875542c 139 }
leomerel 21:2ad11875542c 140 if(boutonMoins){
leomerel 25:7ce844f9a1ae 141 nbVoiture--;
leomerel 25:7ce844f9a1ae 142 send_explicit_data_to_remote_node(xbee, remoteDevice,moins);
leomerel 21:2ad11875542c 143 Thread::wait(500);
leomerel 25:7ce844f9a1ae 144 }
leomerel 25:7ce844f9a1ae 145 }
leomerel 25:7ce844f9a1ae 146 }
leomerel 25:7ce844f9a1ae 147
leomerel 25:7ce844f9a1ae 148 void nbVoitureCapteur() {
leomerel 25:7ce844f9a1ae 149 while(1){
leomerel 25:7ce844f9a1ae 150 int value = signal.read_u16();
leomerel 25:7ce844f9a1ae 151 // if(value<100){voiture++;printf("%d\r\n",value);wait(4);}
leomerel 25:7ce844f9a1ae 152
leomerel 25:7ce844f9a1ae 153 if (signal.read_u16()<100&&compteur==0){
leomerel 25:7ce844f9a1ae 154 timer.start();
leomerel 25:7ce844f9a1ae 155 compteur++;
leomerel 25:7ce844f9a1ae 156 wait_front_montant = 1;
leomerel 25:7ce844f9a1ae 157 }
leomerel 25:7ce844f9a1ae 158
leomerel 25:7ce844f9a1ae 159
leomerel 25:7ce844f9a1ae 160 else if (signal.read_u16()>45000&&wait_front_montant==1){
leomerel 25:7ce844f9a1ae 161 wait_front_montant=0;
leomerel 25:7ce844f9a1ae 162 wait_front_descendant = 1;
leomerel 25:7ce844f9a1ae 163 }
leomerel 25:7ce844f9a1ae 164
leomerel 25:7ce844f9a1ae 165 else if (signal.read_u16()<100&&wait_front_descendant==1){
leomerel 25:7ce844f9a1ae 166 wait_front_descendant = 0;
leomerel 25:7ce844f9a1ae 167 wait_front_montant=1;
leomerel 25:7ce844f9a1ae 168 timer.stop();
leomerel 25:7ce844f9a1ae 169 double t = timer.read();
leomerel 25:7ce844f9a1ae 170 frequence = frequence + 1/t;
leomerel 25:7ce844f9a1ae 171 // printf("temps %f \r\n",t);
leomerel 25:7ce844f9a1ae 172 // printf("frequence %f\r\n",frequence);
leomerel 25:7ce844f9a1ae 173 compteur++;
leomerel 25:7ce844f9a1ae 174 timer.reset();
leomerel 25:7ce844f9a1ae 175 timer.start();
leomerel 21:2ad11875542c 176 }
leomerel 21:2ad11875542c 177
leomerel 25:7ce844f9a1ae 178 if(compteur==5){
leomerel 25:7ce844f9a1ae 179 frequence = frequence/3;
leomerel 25:7ce844f9a1ae 180 double vitesse = frequence*2/19.49;
leomerel 25:7ce844f9a1ae 181 printf("vitesse : %f KM/H \r\n",vitesse);
leomerel 25:7ce844f9a1ae 182 if (vitesse>1){
leomerel 25:7ce844f9a1ae 183 send_explicit_data_to_remote_node(xbee, remoteDevice,plus);
leomerel 25:7ce844f9a1ae 184 nbVoiture++;
leomerel 25:7ce844f9a1ae 185 printf("vitesse : %f KM/H \r\n",vitesse);
leomerel 25:7ce844f9a1ae 186 Thread::wait(1000);
leomerel 25:7ce844f9a1ae 187 }
leomerel 25:7ce844f9a1ae 188 compteur=0;
leomerel 25:7ce844f9a1ae 189 timer.reset();
leomerel 25:7ce844f9a1ae 190 }
leomerel 25:7ce844f9a1ae 191 }
leomerel 25:7ce844f9a1ae 192 }
leomerel 25:7ce844f9a1ae 193
leomerel 25:7ce844f9a1ae 194 void affichage(){
leomerel 25:7ce844f9a1ae 195 while(1){
leomerel 25:7ce844f9a1ae 196 int a = nbVoiture;
leomerel 25:7ce844f9a1ae 197 if(a>=8){
leomerel 25:7ce844f9a1ae 198 led4=1;
leomerel 25:7ce844f9a1ae 199 a-=8;
leomerel 25:7ce844f9a1ae 200 }
leomerel 25:7ce844f9a1ae 201 else{led4=0;}
leomerel 25:7ce844f9a1ae 202 if(a>=4){
leomerel 25:7ce844f9a1ae 203 led3=1;
leomerel 25:7ce844f9a1ae 204 a-=4;
leomerel 25:7ce844f9a1ae 205 }
leomerel 25:7ce844f9a1ae 206 else{led3=0;}
leomerel 25:7ce844f9a1ae 207 if(a>=2){
leomerel 25:7ce844f9a1ae 208 led2=1;
leomerel 25:7ce844f9a1ae 209 a-=2;
leomerel 25:7ce844f9a1ae 210 }
leomerel 25:7ce844f9a1ae 211 else{led2=0;}
leomerel 25:7ce844f9a1ae 212 if(a>=1){
leomerel 25:7ce844f9a1ae 213 led1=1;
leomerel 25:7ce844f9a1ae 214 a-=1;
leomerel 25:7ce844f9a1ae 215 }
leomerel 25:7ce844f9a1ae 216 else{led1=0;}
leomerel 21:2ad11875542c 217 }
leomerel 21:2ad11875542c 218 }
leomerel 21:2ad11875542c 219
leomerel 21:2ad11875542c 220 int main()
leomerel 21:2ad11875542c 221 {
leomerel 21:2ad11875542c 222 connect_Xbee();
leomerel 25:7ce844f9a1ae 223 t_nbVoitureBouton.start(nbVoitureBouton);
leomerel 25:7ce844f9a1ae 224 t_nbVoitureCapteur.start(nbVoitureCapteur);
leomerel 22:d9287c62dd45 225 t_feuRouge.start(set_feuRouge);
leomerel 25:7ce844f9a1ae 226 t_affichage.start(affichage);
pierreblouet 17:0694b399bd0d 227 while (true) {
pierreblouet 17:0694b399bd0d 228 uint32_t receive_value = xbee.process_rx_frames();
leomerel 12:9ec78b07c688 229 }
pierreblouet 17:0694b399bd0d 230 }