Gestion du Trafic Adaptatif - Code des mbed récepteurs

Dependencies:   XBeeLib mbed mbed-rtos

Committer:
leomerel
Date:
Thu Nov 29 15:34:33 2018 +0000
Revision:
23:296a2145c0fc
Parent:
22:d9287c62dd45
Child:
24:8c3f700dbfe7
V3.0; Le C gere les 2 R. Il n'y a pas de feu connecte sur le C, mais c'est le C qui envoie les commande "set rouge" ou "set vert" aux R. Avant d'envoyer "set vert" a un R, le C attend de recevoir un message du 2e R assurant que celui-ci est bien rouge

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 21:2ad11875542c 27 Thread t_nbVoiture;
leomerel 22:d9287c62dd45 28 Thread t_feuRouge;
leomerel 21:2ad11875542c 29
leomerel 21:2ad11875542c 30 DigitalIn boutonPlus(p24);
leomerel 21:2ad11875542c 31 DigitalIn boutonMoins(p23);
pierreblouet 17:0694b399bd0d 32
leomerel 21:2ad11875542c 33 Serial *log_serial;
leomerel 21:2ad11875542c 34 XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
leomerel 21:2ad11875542c 35 const RemoteXBeeZB remoteDevice = RemoteXBeeZB(REMOTE_NODE_ADDR64);
pierreblouet 17:0694b399bd0d 36
pierreblouet 17:0694b399bd0d 37 /** Callback function, invoked at packet reception */
pierreblouet 17:0694b399bd0d 38 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
pierreblouet 17:0694b399bd0d 39 {
pierreblouet 17:0694b399bd0d 40 const uint64_t remote_addr64 = remote.get_addr64();
pierreblouet 17:0694b399bd0d 41
pierreblouet 17:0694b399bd0d 42 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 43
leomerel 21:2ad11875542c 44 if (data[0]==0x76){
leomerel 22:d9287c62dd45 45 t_feuRouge.signal_set(0x1);
leomerel 22:d9287c62dd45 46 }
leomerel 22:d9287c62dd45 47 else if (data[0]==0x72){
leomerel 22:d9287c62dd45 48 feu_rouge = 0;
leomerel 22:d9287c62dd45 49 feu_orange = 0;
leomerel 22:d9287c62dd45 50 feu_vert = 1;
leomerel 22:d9287c62dd45 51 }
pierreblouet 18:a302b82c4357 52
pierreblouet 17:0694b399bd0d 53 log_serial->printf("\r\n");
emilmont 1:491820ee784d 54 }
leomerel 12:9ec78b07c688 55
pierreblouet 17:0694b399bd0d 56
leomerel 22:d9287c62dd45 57 static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,int message)
leomerel 22:d9287c62dd45 58 {
pierreblouet 17:0694b399bd0d 59 const uint8_t dstEP = 0xE8;
pierreblouet 17:0694b399bd0d 60 const uint8_t srcEP = 0xE8;
pierreblouet 17:0694b399bd0d 61 const uint16_t clusterID = 0x0011;
pierreblouet 17:0694b399bd0d 62 const uint16_t profileID = 0xC105;
pierreblouet 17:0694b399bd0d 63
leomerel 22:d9287c62dd45 64 char data0[]="m"; // m comme "moins" - une voiture de moins
leomerel 22:d9287c62dd45 65 char data1[]="p"; // p comme "plus" - une voiture de plus
leomerel 22:d9287c62dd45 66 char data2[]="r"; // r comme "rouge" - confirmation que le feu est rouge
pierreblouet 18:a302b82c4357 67 char data3[]="e";
pierreblouet 18:a302b82c4357 68 if (message ==0){
leomerel 22:d9287c62dd45 69 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data0, strlen(data0));
pierreblouet 18:a302b82c4357 70 }
pierreblouet 18:a302b82c4357 71 else if (message ==1){
leomerel 22:d9287c62dd45 72 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data1, strlen(data1));
leomerel 22:d9287c62dd45 73 }
leomerel 22:d9287c62dd45 74 else if (message ==2){
pierreblouet 18:a302b82c4357 75 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data2, strlen(data2));
pierreblouet 18:a302b82c4357 76 }
pierreblouet 18:a302b82c4357 77 else {
pierreblouet 18:a302b82c4357 78 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data3, strlen(data3));
pierreblouet 18:a302b82c4357 79 }
pierreblouet 18:a302b82c4357 80
pierreblouet 18:a302b82c4357 81
emilmont 1:491820ee784d 82 }
leomerel 12:9ec78b07c688 83
leomerel 21:2ad11875542c 84 void connect_Xbee()
pierreblouet 17:0694b399bd0d 85 {
pierreblouet 17:0694b399bd0d 86 log_serial = new Serial(DEBUG_TX, DEBUG_RX);
pierreblouet 17:0694b399bd0d 87 log_serial->baud(9600);
pierreblouet 17:0694b399bd0d 88 log_serial->printf("Sample application to demo how to receive unicast and broadcast data with the XBeeZB\r\n\r\n");
pierreblouet 17:0694b399bd0d 89 log_serial->printf(XB_LIB_BANNER);
pierreblouet 17:0694b399bd0d 90
leomerel 21:2ad11875542c 91 #if defined(ENABLE_LOGGING)
pierreblouet 17:0694b399bd0d 92 new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
leomerel 21:2ad11875542c 93 #endif
pierreblouet 17:0694b399bd0d 94
pierreblouet 17:0694b399bd0d 95 /* Register callbacks */
pierreblouet 17:0694b399bd0d 96 xbee.register_receive_cb(&receive_cb);
pierreblouet 17:0694b399bd0d 97
pierreblouet 17:0694b399bd0d 98 RadioStatus const radioStatus = xbee.init();
pierreblouet 17:0694b399bd0d 99 MBED_ASSERT(radioStatus == Success);
leomerel 12:9ec78b07c688 100
pierreblouet 17:0694b399bd0d 101 /* Wait until the device has joined the network */
pierreblouet 17:0694b399bd0d 102 log_serial->printf("Waiting for device to join the network: ");
pierreblouet 17:0694b399bd0d 103 while (!xbee.is_joined()) {
pierreblouet 17:0694b399bd0d 104 wait_ms(1000);
pierreblouet 17:0694b399bd0d 105 log_serial->printf(".");
leomerel 12:9ec78b07c688 106 }
pierreblouet 17:0694b399bd0d 107 log_serial->printf("OK\r\n");
leomerel 22:d9287c62dd45 108 }
leomerel 22:d9287c62dd45 109
leomerel 22:d9287c62dd45 110 void set_feuRouge()
leomerel 22:d9287c62dd45 111 {
leomerel 22:d9287c62dd45 112 while(1)
leomerel 22:d9287c62dd45 113 {
leomerel 22:d9287c62dd45 114 Thread::signal_wait(0x1);
leomerel 22:d9287c62dd45 115 feu_vert = 0;
leomerel 22:d9287c62dd45 116 feu_orange = 1;
leomerel 22:d9287c62dd45 117 Thread::wait(2000);
leomerel 22:d9287c62dd45 118 feu_orange = 0;
leomerel 22:d9287c62dd45 119 feu_rouge = 1;
leomerel 22:d9287c62dd45 120 send_explicit_data_to_remote_node(xbee, remoteDevice,2);
leomerel 22:d9287c62dd45 121 }
leomerel 21:2ad11875542c 122 }
leomerel 12:9ec78b07c688 123
leomerel 21:2ad11875542c 124 void nbVoiture() {
leomerel 22:d9287c62dd45 125 //TO DO :
leomerel 22:d9287c62dd45 126 // - faire un compteur de voitures interne au recepteur et envoyer ce nombre
leomerel 22:d9287c62dd45 127 // au coordinateur -> plus fiable en cas de perte de donnees dans un envoi
leomerel 22:d9287c62dd45 128 // - faire un buffer pour envoyer les donnees
leomerel 22:d9287c62dd45 129 //
leomerel 21:2ad11875542c 130 while(1) {
leomerel 21:2ad11875542c 131 if(boutonPlus){
leomerel 21:2ad11875542c 132 send_explicit_data_to_remote_node(xbee, remoteDevice,1);
leomerel 21:2ad11875542c 133 Thread::wait(500);
leomerel 21:2ad11875542c 134 }
leomerel 21:2ad11875542c 135 if(boutonMoins){
leomerel 21:2ad11875542c 136 send_explicit_data_to_remote_node(xbee, remoteDevice,0);
leomerel 21:2ad11875542c 137 Thread::wait(500);
leomerel 21:2ad11875542c 138 }
leomerel 21:2ad11875542c 139
leomerel 21:2ad11875542c 140 }
leomerel 21:2ad11875542c 141 }
leomerel 21:2ad11875542c 142
leomerel 21:2ad11875542c 143 int main()
leomerel 21:2ad11875542c 144 {
leomerel 21:2ad11875542c 145 connect_Xbee();
leomerel 21:2ad11875542c 146 t_nbVoiture.start(nbVoiture);
leomerel 22:d9287c62dd45 147 t_feuRouge.start(set_feuRouge);
pierreblouet 17:0694b399bd0d 148 while (true) {
pierreblouet 17:0694b399bd0d 149 uint32_t receive_value = xbee.process_rx_frames();
leomerel 12:9ec78b07c688 150 }
pierreblouet 17:0694b399bd0d 151 }