Gestion du Traffic Adaptatif- Code du mbed coordinateur

Dependencies:   XBeeLib mbed mbed-rtos EthernetInterface

main.cpp

Committer:
leomerel
Date:
2018-12-03
Revision:
26:e9fc7e552c88
Parent:
25:fdb28df21d44
Child:
27:0085fca436e1

File content as of revision 26:e9fc7e552c88:

#include "mbed.h"
#include "XBeeLib.h"
#include "rtos.h"

#if defined(ENABLE_LOGGING)
#include "DigiLoggerMbedSerial.h"
using namespace DigiLog;
#endif

/*
TO DO:
 - temps pour que les voitures traversent le chantier
 - améliorer la partie sur les compteurs de voitures
*/

//Adressage
#define REMOTE_NODE_ADDR64_MSB  ((uint32_t)0x0013A200)
#define REMOTE_NODE_ADDR64_LSB1  ((uint32_t)0x40C0E3A1) // adresse du recepteur 1
#define REMOTE_NODE_ADDR64_LSB2  ((uint32_t)0x4086DA0E) // adresse du recepteur 2
#define REMOTE_NODE_ADDR64_1      UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB1)
#define REMOTE_NODE_ADDR64_2      UINT64(REMOTE_NODE_ADDR64_MSB, REMOTE_NODE_ADDR64_LSB2)

using namespace XBeeLib;

//Nombre de voitures au feu
int voituresFeu1 = 0;
int voituresFeu2 = 0;
DigitalIn boutonPlus(p24);
DigitalIn boutonMoins(p23);
Thread t_nbVoiture;
Thread t_gestion;
DigitalOut led1(LED2);

//Gestion
int temps = 5; //durée (en s) pour qu'une voiture traverse le chantier
Timer timer;

//Communication
Serial *log_serial;
XBeeZB xbee = XBeeZB(RADIO_TX, RADIO_RX, RADIO_RESET, NC, NC, 9600);
const RemoteXBeeZB remoteDevice1 = RemoteXBeeZB(REMOTE_NODE_ADDR64_1);
const RemoteXBeeZB remoteDevice2 = RemoteXBeeZB(REMOTE_NODE_ADDR64_2);
char set_rouge[]="r"; // demande a un recepteur de passer au rouge
char set_vert[]="v"; // demande a un recepteur de passer au vert


static void send_explicit_data_to_remote_node(XBeeZB& xbee, const RemoteXBeeZB& RemoteDevice,const char * data)
{
    const uint8_t dstEP = 0xE8;
    const uint8_t srcEP = 0xE8;
    const uint16_t clusterID = 0x0011;
    const uint16_t profileID = 0xC105;

    const TxStatus txStatus = xbee.send_data(RemoteDevice, dstEP, srcEP, clusterID, profileID, (const uint8_t *)data, strlen(data)); 
}

/** Callback function, invoked at packet reception */
static void receive_cb(const RemoteXBeeZB& remote, bool broadcast, const uint8_t *const data, uint16_t len)
{
    const uint64_t remote_addr64 = remote.get_addr64(); //adresse de l'expéditeur
        
    if (data[0]==0x6D){
        // baisse le compteur de voiture au feu 1
        if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1) && (voituresFeu1!=0)){
            voituresFeu1--; 
        }
        // baisse le compteur de voiture au feu 2
        else if ( (UINT64_LO32(remote_addr64)==UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)) && (voituresFeu2!=0)){
            voituresFeu2--;
        }
        log_serial->printf("Nombre de voitures feu 1 : %d\r\n",voituresFeu1);
        log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2);
    }
    else if (data[0]==0x70){
        // augmente le compteur de voiture au feu 1
        if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1)){
            voituresFeu1++; 
        }
        // augmente le compteur de voiture au feu 2
        else if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)){
            voituresFeu2++;
        }
        log_serial->printf("Nombre de voitures feu 1 : %d\r\n",voituresFeu1);
        log_serial->printf("Nombre de voitures feu 2 : %d\r\n",voituresFeu2);
    }
    else if (data[0]==0x72){
        // demande au r2 de passer au vert
        if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB1)){
            log_serial->printf("r2 passe au vert");
            send_explicit_data_to_remote_node(xbee, remoteDevice2,set_vert); 
        }
        // demande au r1 de passer au vert
        else if ( UINT64_LO32(remote_addr64) == UINT64_LO32(REMOTE_NODE_ADDR64_LSB2)){
            log_serial->printf("r1 passe au vert");
            send_explicit_data_to_remote_node(xbee, remoteDevice1,set_vert);
        }
    }
    log_serial->printf("\r\n");
}

void connect_Xbee()
{
    log_serial = new Serial(DEBUG_TX, DEBUG_RX);
    log_serial->baud(9600);
    log_serial->printf("Sample application to demo how to receive unicast and broadcast data with the XBeeZB\r\n\r\n");
    log_serial->printf(XB_LIB_BANNER);
    
    #if defined(ENABLE_LOGGING)
    new DigiLoggerMbedSerial(log_serial, LogLevelInfo);
    #endif

    /* Register callbacks */
    xbee.register_receive_cb(&receive_cb);

    RadioStatus const radioStatus = xbee.init();
    MBED_ASSERT(radioStatus == Success);

    /* Wait until the device has joined the network */
    log_serial->printf("Waiting for device to join the network: ");
    while (!xbee.is_joined()) {
        wait_ms(1000);
        log_serial->printf(".");
    }
    log_serial->printf("OK\r\n");
}

void gestion()
{
    int i=0;
    bool stay1=0;
    bool stay2=0;
    while(1)
    {
        //To check
        if ((voituresFeu1==0) && (voituresFeu2!=0)){
            if(stay1==0){
                stay2=0;
                stay1=1;
                send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge);
            }
        }
        else if ((voituresFeu2==0) && (voituresFeu1!=0)){
            if(stay2==0){
                stay1=0;
                stay2=1;
                send_explicit_data_to_remote_node(xbee, remoteDevice2,set_rouge);
            }
        }
        else{
            stay1=0;
            stay2=0;
            Thread::wait(4000);
            if(i==0){
                send_explicit_data_to_remote_node(xbee, remoteDevice2,set_rouge);
                i=1;
            }
            else if(i==1){
                send_explicit_data_to_remote_node(xbee, remoteDevice1,set_rouge);
                i=0;
            }
        }
    }
}

int main()
{
    connect_Xbee();
    
    t_gestion.start(gestion);
    
    while (true) {        
        uint32_t receive_value = xbee.process_rx_frames();//nécessaire pour lire (constamment) la valeur recue
        if(voituresFeu1 >= 10){led1=1;}
        else{led1=0;}
    }
}