Gestion du Traffic Adaptatif- Code du mbed coordinateur
Dependencies: XBeeLib mbed mbed-rtos EthernetInterface
main.cpp@25:fdb28df21d44, 2018-12-02 (annotated)
- Committer:
- leomerel
- Date:
- Sun Dec 02 19:56:29 2018 +0000
- Revision:
- 25:fdb28df21d44
- Parent:
- 24:bbde0b873a37
- Child:
- 26:e9fc7e552c88
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?
User | Revision | Line number | New contents of line |
---|---|---|---|
pierreblouet | 17:0694b399bd0d | 1 | #include "mbed.h" |
pierreblouet | 17:0694b399bd0d | 2 | #include "XBeeLib.h" |
leomerel | 21:5adfcfd83e95 | 3 | #include "rtos.h" |
leomerel | 25:fdb28df21d44 | 4 | |
pierreblouet | 17:0694b399bd0d | 5 | #if defined(ENABLE_LOGGING) |
pierreblouet | 17:0694b399bd0d | 6 | #include "DigiLoggerMbedSerial.h" |
pierreblouet | 17:0694b399bd0d | 7 | using namespace DigiLog; |
pierreblouet | 17:0694b399bd0d | 8 | #endif |
leomerel | 12:9ec78b07c688 | 9 | |
leomerel | 12:9ec78b07c688 | 10 | |
pierreblouet | 17:0694b399bd0d | 11 | #define REMOTE_NODE_ADDR64_MSB ((uint32_t)0x0013A200) |
pierreblouet | 17:0694b399bd0d | 12 | |
pierreblouet | 17:0694b399bd0d | 13 | //#error "Replace next define with the LSB of the remote module's 64-bit address (SL parameter)" |
leomerel | 24:bbde0b873a37 | 14 | #define REMOTE_NODE_ADDR64_LSB1 ((uint32_t)0x40C0E3A1) // adresse du recepteur 1 |
leomerel | 24:bbde0b873a37 | 15 | #define REMOTE_NODE_ADDR64_LSB2 ((uint32_t)0x4086DA0E) // adresse du recepteur 2 |
pierreblouet | 17:0694b399bd0d | 16 | |
leomerel | 24:bbde0b873a37 | 17 | #define REMOTE_NODE_ADDR64_1 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB1) |
leomerel | 24:bbde0b873a37 | 18 | #define REMOTE_NODE_ADDR64_2 UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB2) |
pierreblouet | 17:0694b399bd0d | 19 | |
pierreblouet | 17:0694b399bd0d | 20 | using namespace XBeeLib; |
pierreblouet | 17:0694b399bd0d | 21 | |
pierreblouet | 17:0694b399bd0d | 22 | //feux gauche |
pierreblouet | 17:0694b399bd0d | 23 | //rouge |
leomerel | 23:2a6ea31d8e23 | 24 | DigitalOut feu_rouge(p12); |
pierreblouet | 17:0694b399bd0d | 25 | //orange |
leomerel | 23:2a6ea31d8e23 | 26 | DigitalOut feu_orange(p14); |
pierreblouet | 17:0694b399bd0d | 27 | //vert |
leomerel | 23:2a6ea31d8e23 | 28 | DigitalOut feu_vert(p16); |
leomerel | 12:9ec78b07c688 | 29 | |
leomerel | 25:fdb28df21d44 | 30 | DigitalOut led1(LED2); |
leomerel | 25:fdb28df21d44 | 31 | |
leomerel | 25:fdb28df21d44 | 32 | char data1[]="r"; // demande a un recepteur de passer au rouge |
leomerel | 25:fdb28df21d44 | 33 | char data2[]="v"; // demande a un recepteur de passer au vert |
leomerel | 25:fdb28df21d44 | 34 | char data3[]="e"; // erreur |
leomerel | 22:c3b22291cb9d | 35 | |
leomerel | 21:5adfcfd83e95 | 36 | //Nombre de voitures au feu |
leomerel | 22:c3b22291cb9d | 37 | int voituresFeu1 = 0; |
leomerel | 24:bbde0b873a37 | 38 | int voituresFeu2 = 0; |
leomerel | 21:5adfcfd83e95 | 39 | DigitalIn boutonPlus(p24); |
leomerel | 21:5adfcfd83e95 | 40 | DigitalIn boutonMoins(p23); |
leomerel | 21:5adfcfd83e95 | 41 | Thread t_nbVoiture; |
leomerel | 21:5adfcfd83e95 | 42 | |
leomerel | 23:2a6ea31d8e23 | 43 | Thread t_gestion; |
leomerel | 25:fdb28df21d44 | 44 | Timer timer; |
pierreblouet | 17:0694b399bd0d | 45 | |
pierreblouet | 17:0694b399bd0d | 46 | Serial *log_serial; |
leomerel | 23:2a6ea31d8e23 | 47 | XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600); |
leomerel | 24:bbde0b873a37 | 48 | const RemoteXBeeZB remoteDevice1 = RemoteXBeeZB(REMOTE_NODE_ADDR64_1); |
leomerel | 24:bbde0b873a37 | 49 | const RemoteXBeeZB remoteDevice2 = RemoteXBeeZB(REMOTE_NODE_ADDR64_2); |
leomerel | 24:bbde0b873a37 | 50 | |
leomerel | 24:bbde0b873a37 | 51 | |
leomerel | 25:fdb28df21d44 | 52 | static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,const char * data) |
leomerel | 24:bbde0b873a37 | 53 | { |
leomerel | 24:bbde0b873a37 | 54 | const uint8_t dstEP = 0xE8; |
leomerel | 24:bbde0b873a37 | 55 | const uint8_t srcEP = 0xE8; |
leomerel | 24:bbde0b873a37 | 56 | const uint16_t clusterID = 0x0011; |
leomerel | 24:bbde0b873a37 | 57 | const uint16_t profileID = 0xC105; |
leomerel | 24:bbde0b873a37 | 58 | |
leomerel | 25:fdb28df21d44 | 59 | const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data, strlen(data)); |
leomerel | 24:bbde0b873a37 | 60 | } |
pierreblouet | 17:0694b399bd0d | 61 | |
pierreblouet | 17:0694b399bd0d | 62 | /** Callback function, invoked at packet reception */ |
pierreblouet | 17:0694b399bd0d | 63 | static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len) |
pierreblouet | 17:0694b399bd0d | 64 | { |
pierreblouet | 17:0694b399bd0d | 65 | const uint64_t remote_addr64 = remote.get_addr64(); |
leomerel | 22:c3b22291cb9d | 66 | |
leomerel | 24:bbde0b873a37 | 67 | if (data[0]==0x6D){ |
leomerel | 24:bbde0b873a37 | 68 | // baisse le compteur de voiture au feu 1 |
leomerel | 24:bbde0b873a37 | 69 | if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1) && (voituresFeu1!=0)){ |
leomerel | 24:bbde0b873a37 | 70 | voituresFeu1--; |
leomerel | 24:bbde0b873a37 | 71 | } |
leomerel | 24:bbde0b873a37 | 72 | // baisse le compteur de voiture au feu 2 |
leomerel | 24:bbde0b873a37 | 73 | else if ( (UINT64_LO32(remote_addr64)==UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)) && (voituresFeu2!=0)){ |
leomerel | 24:bbde0b873a37 | 74 | voituresFeu2--; |
leomerel | 24:bbde0b873a37 | 75 | } |
leomerel | 25:fdb28df21d44 | 76 | log_serial->printf("Nombre de voitures feu 1 : %d\r\n",voituresFeu1); |
leomerel | 25:fdb28df21d44 | 77 | log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2); |
leomerel | 22:c3b22291cb9d | 78 | } |
leomerel | 23:2a6ea31d8e23 | 79 | else if (data[0]==0x70){ |
leomerel | 24:bbde0b873a37 | 80 | // augmente le compteur de voiture au feu 1 |
leomerel | 24:bbde0b873a37 | 81 | if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1)){ |
leomerel | 24:bbde0b873a37 | 82 | voituresFeu1++; |
leomerel | 24:bbde0b873a37 | 83 | } |
leomerel | 24:bbde0b873a37 | 84 | // augmente le compteur de voiture au feu 2 |
leomerel | 24:bbde0b873a37 | 85 | else if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)){ |
leomerel | 24:bbde0b873a37 | 86 | voituresFeu2++; |
leomerel | 24:bbde0b873a37 | 87 | } |
leomerel | 25:fdb28df21d44 | 88 | log_serial->printf("Nombre de voitures feu 1 : %d\r\n",voituresFeu1); |
leomerel | 25:fdb28df21d44 | 89 | log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2); |
leomerel | 22:c3b22291cb9d | 90 | } |
leomerel | 23:2a6ea31d8e23 | 91 | else if (data[0]==0x72){ |
leomerel | 24:bbde0b873a37 | 92 | // demande au r2 de passer au vert |
leomerel | 24:bbde0b873a37 | 93 | if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1)){ |
leomerel | 24:bbde0b873a37 | 94 | log_serial->printf("r2 passe au vert"); |
leomerel | 25:fdb28df21d44 | 95 | send_explicit_data_to_remote_node(xbee, remoteDevice2,data2); |
leomerel | 24:bbde0b873a37 | 96 | } |
leomerel | 24:bbde0b873a37 | 97 | // demande au r1 de passer au vert |
leomerel | 24:bbde0b873a37 | 98 | else if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)){ |
leomerel | 24:bbde0b873a37 | 99 | log_serial->printf("r1 passe au vert"); |
leomerel | 25:fdb28df21d44 | 100 | send_explicit_data_to_remote_node(xbee, remoteDevice1,data2); |
leomerel | 24:bbde0b873a37 | 101 | } |
leomerel | 23:2a6ea31d8e23 | 102 | } |
pierreblouet | 17:0694b399bd0d | 103 | log_serial->printf("\r\n"); |
emilmont | 1:491820ee784d | 104 | } |
leomerel | 12:9ec78b07c688 | 105 | |
leomerel | 23:2a6ea31d8e23 | 106 | void connect_Xbee() |
pierreblouet | 17:0694b399bd0d | 107 | { |
pierreblouet | 17:0694b399bd0d | 108 | log_serial = new Serial(DEBUG_TX, DEBUG_RX); |
pierreblouet | 17:0694b399bd0d | 109 | log_serial->baud(9600); |
pierreblouet | 17:0694b399bd0d | 110 | log_serial->printf("Sample application to demo how to receive unicast and broadcast data with the XBeeZB\r\n\r\n"); |
pierreblouet | 17:0694b399bd0d | 111 | log_serial->printf(XB_LIB_BANNER); |
pierreblouet | 17:0694b399bd0d | 112 | |
leomerel | 22:c3b22291cb9d | 113 | #if defined(ENABLE_LOGGING) |
pierreblouet | 17:0694b399bd0d | 114 | new DigiLoggerMbedSerial(log_serial, LogLevelInfo); |
leomerel | 22:c3b22291cb9d | 115 | #endif |
pierreblouet | 17:0694b399bd0d | 116 | |
pierreblouet | 17:0694b399bd0d | 117 | /* Register callbacks */ |
pierreblouet | 17:0694b399bd0d | 118 | xbee.register_receive_cb(&receive_cb); |
pierreblouet | 17:0694b399bd0d | 119 | |
pierreblouet | 17:0694b399bd0d | 120 | RadioStatus const radioStatus = xbee.init(); |
pierreblouet | 17:0694b399bd0d | 121 | MBED_ASSERT(radioStatus == Success); |
leomerel | 12:9ec78b07c688 | 122 | |
pierreblouet | 17:0694b399bd0d | 123 | /* Wait until the device has joined the network */ |
pierreblouet | 17:0694b399bd0d | 124 | log_serial->printf("Waiting for device to join the network: "); |
pierreblouet | 17:0694b399bd0d | 125 | while (!xbee.is_joined()) { |
pierreblouet | 17:0694b399bd0d | 126 | wait_ms(1000); |
pierreblouet | 17:0694b399bd0d | 127 | log_serial->printf("."); |
leomerel | 12:9ec78b07c688 | 128 | } |
pierreblouet | 17:0694b399bd0d | 129 | log_serial->printf("OK\r\n"); |
leomerel | 23:2a6ea31d8e23 | 130 | } |
leomerel | 23:2a6ea31d8e23 | 131 | |
leomerel | 23:2a6ea31d8e23 | 132 | void gestion() |
leomerel | 23:2a6ea31d8e23 | 133 | { |
leomerel | 23:2a6ea31d8e23 | 134 | int i=0; |
leomerel | 25:fdb28df21d44 | 135 | bool stay1=0; |
leomerel | 25:fdb28df21d44 | 136 | bool stay2=0; |
leomerel | 23:2a6ea31d8e23 | 137 | while(1) |
leomerel | 23:2a6ea31d8e23 | 138 | { |
leomerel | 25:fdb28df21d44 | 139 | //To check |
leomerel | 25:fdb28df21d44 | 140 | if ((voituresFeu1==0) && (voituresFeu2!=0)){ |
leomerel | 25:fdb28df21d44 | 141 | if(stay1==0){ |
leomerel | 25:fdb28df21d44 | 142 | stay2=0; |
leomerel | 25:fdb28df21d44 | 143 | stay1=1; |
leomerel | 25:fdb28df21d44 | 144 | send_explicit_data_to_remote_node(xbee, remoteDevice1,data1); |
leomerel | 25:fdb28df21d44 | 145 | } |
leomerel | 23:2a6ea31d8e23 | 146 | } |
leomerel | 25:fdb28df21d44 | 147 | else if ((voituresFeu2==0) && (voituresFeu1!=0)){ |
leomerel | 25:fdb28df21d44 | 148 | if(stay2==0){ |
leomerel | 25:fdb28df21d44 | 149 | stay1=0; |
leomerel | 25:fdb28df21d44 | 150 | stay2=1; |
leomerel | 25:fdb28df21d44 | 151 | send_explicit_data_to_remote_node(xbee, remoteDevice2,data1); |
leomerel | 25:fdb28df21d44 | 152 | } |
leomerel | 23:2a6ea31d8e23 | 153 | } |
leomerel | 25:fdb28df21d44 | 154 | else{ |
leomerel | 25:fdb28df21d44 | 155 | stay1=0; |
leomerel | 25:fdb28df21d44 | 156 | stay2=0; |
leomerel | 25:fdb28df21d44 | 157 | Thread::wait(4000); |
leomerel | 25:fdb28df21d44 | 158 | if(i==0){ |
leomerel | 25:fdb28df21d44 | 159 | send_explicit_data_to_remote_node(xbee, remoteDevice2,data1); |
leomerel | 25:fdb28df21d44 | 160 | i=1; |
leomerel | 25:fdb28df21d44 | 161 | } |
leomerel | 25:fdb28df21d44 | 162 | else if(i==1){ |
leomerel | 25:fdb28df21d44 | 163 | send_explicit_data_to_remote_node(xbee, remoteDevice1,data1); |
leomerel | 25:fdb28df21d44 | 164 | i=0; |
leomerel | 25:fdb28df21d44 | 165 | } |
leomerel | 25:fdb28df21d44 | 166 | } |
leomerel | 23:2a6ea31d8e23 | 167 | } |
leomerel | 22:c3b22291cb9d | 168 | } |
leomerel | 22:c3b22291cb9d | 169 | |
leomerel | 22:c3b22291cb9d | 170 | int main() |
leomerel | 22:c3b22291cb9d | 171 | { |
leomerel | 23:2a6ea31d8e23 | 172 | connect_Xbee(); |
leomerel | 21:5adfcfd83e95 | 173 | |
leomerel | 23:2a6ea31d8e23 | 174 | t_gestion.start(gestion); |
leomerel | 23:2a6ea31d8e23 | 175 | |
leomerel | 25:fdb28df21d44 | 176 | while (true) { |
leomerel | 25:fdb28df21d44 | 177 | uint32_t receive_value = xbee.process_rx_frames();//nécessaire pour lire (constamment) la valeur recue |
leomerel | 22:c3b22291cb9d | 178 | if(voituresFeu1 >= 10){led1=1;} |
leomerel | 22:c3b22291cb9d | 179 | else{led1=0;} |
leomerel | 12:9ec78b07c688 | 180 | } |
pierreblouet | 17:0694b399bd0d | 181 | } |