liaison bluetooth entre gros robot -> panneau ou gros robot -> petit robot

Fork of liaison_Bluetooth by j d

LiaisonBluetooth.cpp

Committer:
duperoux_j
Date:
2018-04-11
Revision:
3:46a9b9c1e1c0
Parent:
2:4fc77e5b08e9
Child:
4:642635655630

File content as of revision 3:46a9b9c1e1c0:

#include "LiaisonBluetooth/LiaisonBluetooth.h"

/*
if (action_robot_2) {
    char *score_char_array = convertir_int_en_4char(score_total);
    paquet_domotique_envoyer(0x30, 4, score_char_array);
}
*/

LiaisonBluetooth::LiaisonBluetooth(Serial *bluetooth, DigitalIn *state) : m_bluetooth(bluetooth), m_state(state)
{
}

bool LiaisonBluetooth::paquet_en_attente()
{
    while (m_bluetooth->readable() && m_state) {
        if (m_bluetooth->getc() == MARQUEUR_DEBUT_TRAME) {
            return true;
        }
    }

    return false;
}

PaquetDomotique *LiaisonBluetooth::lire()
{
    char identifiant = 0;
    if (m_bluetooth->readable() && m_state) {
        identifiant = m_bluetooth->getc();
    } else return NULL;

    char buffer_longueur_paquet[8];
    for (int i = 0 ; i < 8 ; i++) {
        if (m_bluetooth->readable() && m_state) {
            buffer_longueur_paquet[i] = m_bluetooth->getc();
        } else return NULL;
    }
    int longueur_paquet = convertir_4char_en_int(buffer_longueur_paquet);

    char buffer_data[longueur_paquet];
    int index = 0;
    while (index < longueur_paquet-1) {
        if (m_bluetooth->readable() && m_state) {
            char c = m_bluetooth->getc();

            if (c == MARQUEUR_FIN_TRAME)
                return NULL;

            buffer_data[index++] = c;
        } else return NULL;
    }

    return creer_paquetdomotique(identifiant, buffer_data);
}

void LiaisonBluetooth::envoyer(char idenfitiant, int longueur_data, char *data)
{
    if (m_state && m_bluetooth->writeable()) {
        m_bluetooth->putc(idenfitiant);
    }

    char *longueur_buffer = convertir_int_en_4char(longueur_data);
    for (int i = 0 ; i < 4 ; i++) {
        if (m_state && m_bluetooth->writeable()) {
            m_bluetooth->putc(longueur_buffer[i]);
        }
    }

    for (int i = 0 ; i < longueur_data ; i++) {
        if (m_state && m_bluetooth->writeable()) {
            m_bluetooth->putc(data[i]);
        }
    }
}


PaquetDomotique *creer_paquetdomotique(int identifiant, char *data)
{
    PaquetDomotique *paquet = (PaquetDomotique*)malloc(sizeof(PaquetDomotique));
    paquet->identifiant = identifiant;

    paquet->data = (char*)malloc(sizeof(char)*strlen(data));
    strcpy(paquet->data, data);

    return paquet;
}
void detruire_paquetdomotique(PaquetDomotique *paquet)
{
    free(paquet->data);
    free(paquet);
}

char *convertir_int_en_4char(int integer)
{
    char *data = new char[4];

    data[3] = (integer>>24) & 0xFF;
    data[2] = (integer>>16) & 0xFF;
    data[1] = (integer>>8) & 0xFF;
    data[0] = integer & 0xFF;

    return data;
}
int convertir_4char_en_int(char data[4])
{
    return (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
}