Gestion du Trafic Adaptatif - Code des mbed récepteurs

Dependencies:   XBeeLib mbed mbed-rtos

Committer:
leomerel
Date:
Thu Nov 22 22:02:54 2018 +0000
Revision:
22:d9287c62dd45
Parent:
21:2ad11875542c
Child:
23:296a2145c0fc
V2.1; Meilleur version avec les feux qui s'allument avec vert-jaune-rouge. Le coordinateur gere tout : quand il devient rouge, il envoie la commande de setter le R au vert. Il attend que le R lui dise qu'il est rouge pour que le C se mette au vert.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
leomerel 20:4e4d869ada85 1 //YOYOYO
pierreblouet 16:b4d5eb2ee378 2
pierreblouet 17:0694b399bd0d 3 #include "mbed.h"
pierreblouet 17:0694b399bd0d 4 #include "XBeeLib.h"
leomerel 21:2ad11875542c 5 #include "rtos.h"
pierreblouet 17:0694b399bd0d 6 #if defined(ENABLE_LOGGING)
pierreblouet 17:0694b399bd0d 7 #include "DigiLoggerMbedSerial.h"
pierreblouet 17:0694b399bd0d 8 using namespace DigiLog;
pierreblouet 17:0694b399bd0d 9 #endif
leomerel 12:9ec78b07c688 10
leomerel 12:9ec78b07c688 11
pierreblouet 17:0694b399bd0d 12 #define REMOTE_NODE_ADDR64_MSB ((uint32_t)0x0013A200)
pierreblouet 17:0694b399bd0d 13
pierreblouet 17:0694b399bd0d 14 //#error "Replace next define with the LSB of the remote module's 64-bit address (SL parameter)"
pierreblouet 18:a302b82c4357 15 #define REMOTE_NODE_ADDR64_LSB ((uint32_t)0x40E779AF)
pierreblouet 17:0694b399bd0d 16
pierreblouet 17:0694b399bd0d 17 #define REMOTE_NODE_ADDR64 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB)
pierreblouet 17:0694b399bd0d 18
pierreblouet 17:0694b399bd0d 19 using namespace XBeeLib;
pierreblouet 17:0694b399bd0d 20
pierreblouet 17:0694b399bd0d 21 //feux gauche
pierreblouet 17:0694b399bd0d 22 //rouge
leomerel 22:d9287c62dd45 23 DigitalOut feu_rouge(p30);
pierreblouet 17:0694b399bd0d 24 //orange
leomerel 22:d9287c62dd45 25 DigitalOut feu_orange(p28);
pierreblouet 17:0694b399bd0d 26 //vert
leomerel 22:d9287c62dd45 27 DigitalOut feu_vert(p26);
leomerel 12:9ec78b07c688 28
leomerel 21:2ad11875542c 29 Thread t_nbVoiture;
leomerel 22:d9287c62dd45 30 Thread t_feuRouge;
leomerel 21:2ad11875542c 31
leomerel 21:2ad11875542c 32 DigitalIn boutonPlus(p24);
leomerel 21:2ad11875542c 33 DigitalIn boutonMoins(p23);
pierreblouet 17:0694b399bd0d 34
leomerel 21:2ad11875542c 35 Serial *log_serial;
leomerel 21:2ad11875542c 36 XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
leomerel 21:2ad11875542c 37 const RemoteXBeeZB remoteDevice = RemoteXBeeZB(REMOTE_NODE_ADDR64);
pierreblouet 17:0694b399bd0d 38
pierreblouet 17:0694b399bd0d 39 /** Callback function, invoked at packet reception */
pierreblouet 17:0694b399bd0d 40 static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
pierreblouet 17:0694b399bd0d 41 {
pierreblouet 17:0694b399bd0d 42 const uint64_t remote_addr64 = remote.get_addr64();
pierreblouet 17:0694b399bd0d 43
pierreblouet 17:0694b399bd0d 44 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 45
leomerel 21:2ad11875542c 46 if (data[0]==0x76){
leomerel 22:d9287c62dd45 47 t_feuRouge.signal_set(0x1);
leomerel 22:d9287c62dd45 48 }
leomerel 22:d9287c62dd45 49 else if (data[0]==0x72){
leomerel 22:d9287c62dd45 50 feu_rouge = 0;
leomerel 22:d9287c62dd45 51 feu_orange = 0;
leomerel 22:d9287c62dd45 52 feu_vert = 1;
leomerel 22:d9287c62dd45 53 }
pierreblouet 18:a302b82c4357 54
pierreblouet 17:0694b399bd0d 55 log_serial->printf("\r\n");
emilmont 1:491820ee784d 56 }
leomerel 12:9ec78b07c688 57
pierreblouet 17:0694b399bd0d 58
leomerel 22:d9287c62dd45 59 static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,int message)
leomerel 22:d9287c62dd45 60 {
pierreblouet 17:0694b399bd0d 61 const uint8_t dstEP = 0xE8;
pierreblouet 17:0694b399bd0d 62 const uint8_t srcEP = 0xE8;
pierreblouet 17:0694b399bd0d 63 const uint16_t clusterID = 0x0011;
pierreblouet 17:0694b399bd0d 64 const uint16_t profileID = 0xC105;
pierreblouet 17:0694b399bd0d 65
leomerel 22:d9287c62dd45 66 char data0[]="m"; // m comme "moins" - une voiture de moins
leomerel 22:d9287c62dd45 67 char data1[]="p"; // p comme "plus" - une voiture de plus
leomerel 22:d9287c62dd45 68 char data2[]="r"; // r comme "rouge" - confirmation que le feu est rouge
pierreblouet 18:a302b82c4357 69 char data3[]="e";
pierreblouet 18:a302b82c4357 70 if (message ==0){
leomerel 22:d9287c62dd45 71 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data0, strlen(data0));
pierreblouet 18:a302b82c4357 72 }
pierreblouet 18:a302b82c4357 73 else if (message ==1){
leomerel 22:d9287c62dd45 74 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data1, strlen(data1));
leomerel 22:d9287c62dd45 75 }
leomerel 22:d9287c62dd45 76 else if (message ==2){
pierreblouet 18:a302b82c4357 77 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data2, strlen(data2));
pierreblouet 18:a302b82c4357 78 }
pierreblouet 18:a302b82c4357 79 else {
pierreblouet 18:a302b82c4357 80 const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data3, strlen(data3));
pierreblouet 18:a302b82c4357 81 }
pierreblouet 18:a302b82c4357 82
pierreblouet 18:a302b82c4357 83
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 22:d9287c62dd45 117 feu_vert = 0;
leomerel 22:d9287c62dd45 118 feu_orange = 1;
leomerel 22:d9287c62dd45 119 Thread::wait(2000);
leomerel 22:d9287c62dd45 120 feu_orange = 0;
leomerel 22:d9287c62dd45 121 feu_rouge = 1;
leomerel 22:d9287c62dd45 122 send_explicit_data_to_remote_node(xbee, remoteDevice,2);
leomerel 22:d9287c62dd45 123 }
leomerel 21:2ad11875542c 124 }
leomerel 12:9ec78b07c688 125
leomerel 21:2ad11875542c 126 void nbVoiture() {
leomerel 22:d9287c62dd45 127 //TO DO :
leomerel 22:d9287c62dd45 128 // - faire un compteur de voitures interne au recepteur et envoyer ce nombre
leomerel 22:d9287c62dd45 129 // au coordinateur -> plus fiable en cas de perte de donnees dans un envoi
leomerel 22:d9287c62dd45 130 // - faire un buffer pour envoyer les donnees
leomerel 22:d9287c62dd45 131 //
leomerel 21:2ad11875542c 132 while(1) {
leomerel 21:2ad11875542c 133 if(boutonPlus){
leomerel 21:2ad11875542c 134 send_explicit_data_to_remote_node(xbee, remoteDevice,1);
leomerel 21:2ad11875542c 135 Thread::wait(500);
leomerel 21:2ad11875542c 136 }
leomerel 21:2ad11875542c 137 if(boutonMoins){
leomerel 21:2ad11875542c 138 send_explicit_data_to_remote_node(xbee, remoteDevice,0);
leomerel 21:2ad11875542c 139 Thread::wait(500);
leomerel 21:2ad11875542c 140 }
leomerel 21:2ad11875542c 141
leomerel 21:2ad11875542c 142 }
leomerel 21:2ad11875542c 143 }
leomerel 21:2ad11875542c 144
leomerel 21:2ad11875542c 145 int main()
leomerel 21:2ad11875542c 146 {
leomerel 21:2ad11875542c 147 connect_Xbee();
leomerel 21:2ad11875542c 148 t_nbVoiture.start(nbVoiture);
leomerel 22:d9287c62dd45 149 t_feuRouge.start(set_feuRouge);
pierreblouet 17:0694b399bd0d 150 while (true) {
pierreblouet 17:0694b399bd0d 151 uint32_t receive_value = xbee.process_rx_frames();
leomerel 12:9ec78b07c688 152 }
pierreblouet 17:0694b399bd0d 153 }