Gestion du Trafic Adaptatif - Code des mbed récepteurs

Dependencies:   XBeeLib mbed mbed-rtos

Committer:
leomerel
Date:
Sun Dec 02 19:56:58 2018 +0000
Revision:
24:8c3f700dbfe7
Parent:
23:296a2145c0fc
Child:
25:7ce844f9a1ae
V4; Code ameliore et optimise par rapport a la V3. Ajout de la fonctionnalite "intelligente" du feu : lorsqu'il n'y a pas de voiture au feu1 alors qu'il y en a au feu2, alors le feu 2 reste vert.

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