Gestion du Trafic Adaptatif - Code des mbed récepteurs
Dependencies: XBeeLib mbed mbed-rtos
main.cpp@25:7ce844f9a1ae, 2018-12-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |