Gestion du Trafic Adaptatif - Code des mbed récepteurs

Dependencies:   XBeeLib mbed mbed-rtos

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "XBeeLib.h"
00003 #include "rtos.h"
00004 #if defined(ENABLE_LOGGING)
00005 #include "DigiLoggerMbedSerial.h"
00006 using namespace DigiLog;
00007 #endif
00008 
00009 
00010 #define REMOTE_NODE_ADDR64_MSB  ((uint32_t)0x0013A200)
00011 
00012 //#error "Replace next define with the LSB of the remote module's 64-bit address (SL parameter)"
00013 #define REMOTE_NODE_ADDR64_LSB  ((uint32_t)0x40E779AF)
00014 
00015 #define REMOTE_NODE_ADDR64      UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB)
00016 
00017 using namespace XBeeLib;
00018 
00019 //feux gauche
00020     //rouge
00021 DigitalOut feu_rouge(p30);
00022     //orange
00023 DigitalOut feu_orange(p28);
00024     //vert
00025 DigitalOut feu_vert(p26);
00026 
00027 DigitalOut led1(LED1);
00028 DigitalOut led2(LED2);
00029 DigitalOut led3(LED3);
00030 DigitalOut led4(LED4);
00031 int nbVoiture = 0;
00032 Thread t_affichage;
00033 
00034 Thread t_nbVoitureBouton;
00035 Thread t_nbVoitureCapteur;
00036 Thread t_feuRouge;
00037 Timer timer;
00038 
00039 DigitalIn boutonPlus(p24);
00040 DigitalIn boutonMoins(p23);
00041 AnalogIn signal(p20);
00042 
00043 char moins[]="m"; // m comme "moins" - une voiture de moins
00044 char plus[]="p"; // p comme "plus" - une voiture de plus
00045 char rouge[]="r"; // r comme "rouge" - confirmation que le feu est rouge
00046 
00047 int compteur =0;
00048 int wait_front_montant = 0;
00049 int wait_front_descendant  = 0;
00050 double frequence =0;
00051 
00052 Serial *log_serial;
00053 XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
00054 const RemoteXBeeZB remoteDevice = RemoteXBeeZB(REMOTE_NODE_ADDR64);
00055 
00056 /** Callback function, invoked at packet reception */
00057 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
00058 {
00059     const uint64_t remote_addr64 = remote.get_addr64();
00060 
00061     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);
00062 
00063     if (data[0]==0x72){
00064         t_feuRouge.signal_set(0x1);
00065     }
00066     else if (data[0]==0x76){
00067         feu_rouge = 0;
00068         feu_orange = 0;
00069         feu_vert = 1;
00070     }
00071         
00072     log_serial->printf("\r\n");
00073 }
00074 
00075 
00076 static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,const char * data)
00077 {
00078     const uint8_t dstEP = 0xE8;
00079     const uint8_t srcEP = 0xE8;
00080     const uint16_t clusterID = 0x0011;
00081     const uint16_t profileID = 0xC105;
00082 
00083     const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data, strlen(data));  
00084 }
00085 
00086 void connect_Xbee()
00087 {
00088     log_serial = new Serial(DEBUG_TX, DEBUG_RX);
00089     log_serial->baud(9600);
00090     log_serial->printf("Sample application to demo how to receive unicast and broadcast data with the XBeeZB\r\n\r\n");
00091     log_serial->printf(XB_LIB_BANNER);
00092     
00093     #if defined(ENABLE_LOGGING)
00094     new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
00095     #endif
00096 
00097     /* Register callbacks */
00098     xbee.register_receive_cb(&receive_cb);
00099 
00100     RadioStatus const radioStatus = xbee.init();
00101     MBED_ASSERT(radioStatus == Success);
00102 
00103     /* Wait until the device has joined the network */
00104     log_serial->printf("Waiting for device to join the network: ");
00105     while (!xbee.is_joined()) {
00106         wait_ms(1000);
00107         log_serial->printf(".");
00108     }
00109     log_serial->printf("OK\r\n");
00110 }
00111 
00112 void set_feuRouge()
00113 {
00114    while(1)
00115    {
00116       Thread::signal_wait(0x1);
00117       if (feu_rouge!=1){
00118           feu_vert = 0;
00119           feu_orange = 1;
00120           Thread::wait(2000);
00121           feu_orange = 0;
00122           feu_rouge = 1;
00123       }
00124       send_explicit_data_to_remote_node(xbee, remoteDevice,rouge);
00125    }
00126 }
00127 
00128 void nbVoitureBouton() {
00129     //TO DO : 
00130     // - faire un compteur de voitures interne au recepteur et envoyer ce nombre 
00131     //   au coordinateur -> plus fiable en cas de perte de donnees dans un envoi
00132     // - faire un buffer pour envoyer les donnees
00133     //
00134     while(1) {
00135         if(boutonPlus){
00136             nbVoiture++;
00137             send_explicit_data_to_remote_node(xbee, remoteDevice,plus); 
00138             Thread::wait(500);
00139         }
00140         if(boutonMoins){
00141             nbVoiture--;
00142             send_explicit_data_to_remote_node(xbee, remoteDevice,moins);  
00143             Thread::wait(500);
00144         }        
00145     }
00146 }
00147 
00148 void nbVoitureCapteur() {
00149     while(1){
00150         
00151         //lecture valeur analogique du capteur à effet doppler hb100
00152         int value = signal.read_u16();
00153         
00154         // si inferieur a 100 on commence la mesure de la frequence du signal
00155         if (signal.read_u16()<100&&compteur==0){
00156             timer.start();
00157             compteur++;
00158             wait_front_montant = 1;
00159         }
00160           
00161         // on attend un front montant 
00162         else if (signal.read_u16()>45000&&wait_front_montant==1){
00163             wait_front_montant=0;
00164             wait_front_descendant  = 1;
00165         }
00166         
00167         //deuxieme front dessandant, on a mesurer la frequence , on répète l'opération 3 fois (jusqu'a compteur == 5 )
00168         else if (signal.read_u16()<100&&wait_front_descendant==1){
00169             wait_front_descendant  = 0;
00170             wait_front_montant=1;
00171             timer.stop();
00172             double t = timer.read();
00173             frequence = frequence + 1/t;
00174             compteur++;
00175             timer.reset();
00176             timer.start();
00177         }
00178         
00179        
00180         if(compteur==5){
00181              // on fait la moyenne de la somme des trois frequences mesurées
00182             frequence = frequence/3;
00183             // on calcule la vitesse a partir d'une formule donnée dans la doc du capteur
00184             double vitesse = frequence*2/19.49;
00185             // si la vitesse est superieur à 1km/h, on considère qu'une voiture est passer 
00186             if (vitesse>1){
00187                 send_explicit_data_to_remote_node(xbee, remoteDevice,plus);
00188                 nbVoiture++;
00189                 printf("vitesse : %f KM/H \r\n",vitesse);
00190                 Thread::wait(1000);
00191             }
00192             compteur=0;
00193             timer.reset();
00194         }
00195     }
00196 }
00197 
00198 void affichage(){
00199     while(1){
00200         int a = nbVoiture;
00201         if(a>=8){
00202             led4=1;
00203             a-=8;
00204         }
00205         else{led4=0;}
00206         if(a>=4){
00207             led3=1;
00208             a-=4;
00209         }
00210         else{led3=0;}
00211         if(a>=2){
00212             led2=1;
00213             a-=2;
00214         }
00215         else{led2=0;}
00216         if(a>=1){
00217             led1=1;
00218             a-=1;
00219         }
00220         else{led1=0;}
00221     }
00222 }
00223 
00224 int main()
00225 {
00226     connect_Xbee();
00227     t_nbVoitureBouton.start(nbVoitureBouton);
00228     t_nbVoitureCapteur.start(nbVoitureCapteur);
00229     t_feuRouge.start(set_feuRouge);
00230     t_affichage.start(affichage);
00231     while (true) {
00232         uint32_t receive_value = xbee.process_rx_frames();
00233     }
00234 }