Ce programme correspond a la cellule de depart du systeme "Laser Gate Timer" developpe par Tanguy KESSELY et Dorian VOYDIE. Il utilise une carte Nucleo F411, un shield BLE IDB05A1 et un PCB fait maison

Dependencies:   mbed X_NUCLEO_IDB0XA1 BLE_API

main.cpp

Committer:
dorianvoydie
Date:
2021-02-04
Revision:
15:040b2ce981f0
Parent:
14:ac6cbe6ffaab

File content as of revision 15:040b2ce981f0:

#include "mbed.h"
#include "ble/BLE.h"
#include "ble/services/UARTService.h"
#include "Serial.h"
#include "stdlib.h"

#define UART_BUFFER (UARTService::BLE_UART_SERVICE_MAX_DATA_LEN)


const static char DEVICE_NAME[] = "ObCP";
UARTService *uartServicePtr;

///////////Périphériques/////////////////
InterruptIn myButton(USER_BUTTON);
InterruptIn photodiode(A2);
DigitalOut myled(LED1);
DigitalOut laser(A3);
DigitalIn photodiode1(A2);
DigitalOut compteur(A4);
float photodiode2 = 0;

///////////Init devices//////////////////
Serial device(D8, D2);
Serial pc(USBTX, USBRX);

//////////Initialisations////////////////
Timer timer_player_1;
Timer timer_player_2;
int begin1;
int begin2;
int end1;
int end2;
float chrono1;
float chrono2;
char temp=0;
char temp2=0;
char temp3=0;
char gamemode = 'M';

void Timer_Reset()
{
    timer_player_1.stop();
    timer_player_2.stop();
    timer_player_1.reset();
    timer_player_2.reset();
    begin1=0;
    begin2=0;
    end1=0;
    end2=0;
    chrono1=0;
    chrono2=0;
}

void photodiode_triggered()
{
    if (gamemode == 'S') {
        compteur = 1;
        wait(0.001);
        compteur = 0;
        Timer_Reset();
        timer_player_1.start();
        begin1 = timer_player_1.read_ms();
        myled=1;
        wait(0.5);
        myled=0;
        
    }
    if (gamemode == 'D') {
        wait(0.001);
        compteur = 0;
        end2 = timer_player_2.read_ms();
        timer_player_2.stop();
        chrono2 = end2-begin2;
    }
    if (gamemode == 'L') {
        wait(0.001);
        compteur = 0;
        timer_player_1.start();
        chrono1 = timer_player_1.read_ms();
        myled=1;
        wait(0.5);
        myled=0;
    }
}
/////////////////////////////////////


/////////COMMUNICATION///////////////
void device_receive()
{
    temp=device.getc();
    //Ignore Sync pattern and do not pass on to PC
    if (temp!=0xAA) {
        //Mode solo, la cellule arrivée envoie u à la cellule départ
        if(temp == 0xBB and temp2!=0xBB) {
            temp2=0xBB;
        }
        if(temp == 0xBC and temp2==0xBB) {
            temp3 = 0xBC;
        }
        if(temp == 0xBD and temp3==0xBC) {
            end1 = timer_player_1.read_ms();
            timer_player_1.stop();
            chrono1 = end1-begin1-0.02;
            photodiode2 = 0;
            pc.printf("C'est bon");
        }
        if(temp == 0xCC) {
            photodiode2 = 1;
        }
        pc.putc(temp);
    }


}
/////////////////////////////////////


// Tableau et index de communication avec UART
static char uartBuff[UART_BUFFER];
// Routine de traitement des erreurs
void onBleError(ble_error_t error);

/****************************************************/
/* Ticker actif lorsque la connexion BLE est présente */
/****************************************************/
void ConnectedBLE(void)
{
    // Signal de vie: allumer et éteindre la LED

}

void update(void)
{

    if (gamemode != 'A') {
        char train1[5];
        char train2[5];
        float chrono_value_J1 = float(chrono1)* 0.001F;
        float chrono_value_J2 = float(chrono2)* 0.001F;

        //Transformation des valeurs numeriques en chaine de caracteres
        sprintf(train1,"%5.2f",chrono_value_J1);
        sprintf(train2,"%5.2f",chrono_value_J2);
        //Integre les trois chaines de caractere contenant les ts dans la chaine uartBuff
        sprintf(uartBuff, "%s %s", train1, train2) ;
        //Envoie la chaine uartBuff sur le sevice TX UART BLE
        uartServicePtr->write(uartBuff, UARTService::BLE_UART_SERVICE_MAX_DATA_LEN);
        // Réinitialiser la chaîne uartBuff en entrant 0 dans les premiers caractères UART_BUFFER
        memset(uartBuff, 0, UART_BUFFER);
    } else {
        char laser1[1];
        char laser2[1];

        //Transformation des valeurs numeriques en chaine de caracteres
        float meas = photodiode1.read();
        sprintf(laser1,"%1.0f",meas);
        sprintf(laser2,"%1.0f",photodiode2);
        //Integre les trois chaines de caractere contenant les ts dans la chaine uartBuff
        sprintf(uartBuff, "%s %s", laser1, laser2) ;
        //Envoie la chaine uartBuff sur le sevice TX UART BLE
        uartServicePtr->write(uartBuff, UARTService::BLE_UART_SERVICE_MAX_DATA_LEN);
        // Réinitialiser la chaîne uartBuff en entrant 0 dans les premiers caractères UART_BUFFER
        memset(uartBuff, 0, UART_BUFFER);
    }


}

/*************************/
/* Connexion BLE réussie */
/*************************/
void BleConnectionCallback(const Gap::ConnectionCallbackParams_t *params)
{
    // Signal de connexion BLE: allume / éteint la LED avec une période de 1 seconde
    ConnectedBLE();
}

/*****************************/
/* Déconnexion du client BLE */
/*****************************/
void BleDisconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
{
    (void)params;
    // Redémarrer la publicité
    Timer_Reset();
    BLE::Instance().gap().startAdvertising();


}

/***************************/
/* Rx de BLE et Rx vers USB*/
/***************************/
void BleOnDataWrittenCallback(const GattWriteCallbackParams *params)
{
    char reception[UART_BUFFER];
    char commande[3];
    if (params->handle == uartServicePtr->getTXCharacteristicHandle()) {
        // Copie de la chaine reçue dans reception
        sprintf(reception,"%s", params->data);
        // Copie dans la chaine commande des deux premier caracteres de la chaine reception
        sprintf(commande,"%c%c%c", reception[0], reception[1], reception[2]);

        if( strcmp(commande, "RST" )==0 ) {
            Timer_Reset();
            update();
        }
        if( strcmp(commande, "SOL" )==0 ) {
            gamemode = 'S';
            laser=1;
            update();
        }
        if( strcmp(commande, "DUO" )==0 ) {
            gamemode = 'D';
            laser=1;
            update();
        }
        if( strcmp(commande, "LAP" )==0 ) {
            gamemode = 'L';
            laser=1;
            update();
        }
        if( strcmp(commande, "MEN" )==0 ) {
            gamemode = 'M';
            laser=0;
            update();
        }
        if( strcmp(commande, "LAS" )==0 ) {
            gamemode = 'A';
            laser=1;
            update();
        }
        if( strcmp(commande, "BIP" )==0 ) {
            Timer_Reset();
            timer_player_1.start();
            timer_player_2.start();
            begin1 = timer_player_1.read_ms();
            begin1 = timer_player_2.read_ms();
            myled=1;
            wait(0.5);
            myled=0;
        }
    }
}

/***************************/
/* Erreur sur le canal BLE */
/***************************/

void onBleError(ble_error_t error)
{
    /* Entrer le traitement des erreurs */
}

/**************************************/
/* Initialisation du service BLE UART */
/**************************************/

void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
{
    BLE&        ble   = params->ble;
    ble_error_t error = params->error;

    if (error != BLE_ERROR_NONE) {

        /* En cas d'erreur, transmettez le traitement d'erreur à onBleInitError*/
        onBleError(error);
        return;
    }

    /* Assurez-vous qu'il s'agit de l'instance par défaut de BLE */
    if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
        return;
    }

    ble.gap().onConnection(BleConnectionCallback);
    ble.gap().onDisconnection(BleDisconnectionCallback);
    ble.gattServer().onDataWritten(BleOnDataWrittenCallback);

    /* Configuration du service primaire. */
    UARTService uartService(ble);
    uartServicePtr = &uartService;

    /* Configurer la publicité */
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
    ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
    ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
    ble.gap().setAdvertisingInterval(500); /* 500ms. */
    ble.gap().startAdvertising();

    // Attend les événements sur BLE
    while (true) {
        
        ble.waitForEvent();
        update();
        //RF Receive Code
        device_receive();
        wait(0.01);
    }
}

/********/
/* MAIN */
/********/
int main(void)
{
    device.baud(2400);
    myButton.fall(&photodiode_triggered);
    photodiode.fall(&photodiode_triggered);
    

    /****** START Initialiser BLE **********/
    BLE &ble = BLE::Instance();
    ble.init(bleInitComplete);
    /******* FIN initialise BLE ***********/
}