code pour recevoir des trames et mettre les char sur le port usb

Dependencies:   mbed

Fork of APP4 by S5info_H14

coordinateur.cpp

Committer:
RufflesAllD
Date:
2014-04-29
Revision:
8:ecc7c75a37ee
Parent:
7:a6f58e5d1188

File content as of revision 8:ecc7c75a37ee:

#include "coordinateur.hpp"

Serial pc(USBTX, USBRX);

Coordinateur::Coordinateur(PinName _tx, PinName _rx) :
    trame(_tx, _rx), xbee(_tx, _rx), etat(Start)
{
    // Reset le xbee
    DigitalOut reset(p8);
    
    reset = 0;
    wait(0.4);
    reset = 1;
}

Coordinateur::~Coordinateur()
{
    delete data;
}

void Coordinateur::setPanID(string _pan)
{
    trame.sendATCommand("ID", _pan.c_str(), _pan.length()); // Set le PANID selon le fichier de config
    trame.sendATCommand("WR", 0, 0);    // Écrit la valeur du PANID en mémoire
    trame.sendATCommand("AC", 0, 0);    // Applique les changements effectués
}

void Coordinateur::getBytes()
{
    if (xbee.readable())
    {
        etatTrame(xbee.getc()); // Envoie les char recu en sans-fil dans la machine à état
    }
}

// Machine à état qui reconstruit la trame
void Coordinateur::etatTrame(char c)
{
    switch (etat)
    {
        // Trouve les delimiter pour partir la trame
        case Start:
            if (c == 0x7E)
                etat = Length;
            break;
        
        // Prend les MSB de length
        case Length:
            length[0] = c;
            etat = Length2;
            break;
        
        // Prend les LSB de length et calcul le length
        case Length2:
            length[1] = c;
            length_int = (length[0] << 8) | length[1];
            if (length_int == 16)
                etat = Data;
            else
                etat = Start;
            counter = 0;
            data = new char[length_int];
            break;
        
        // Prend les datas
        case Data:
            if (c == 0x7E)
                etat = Length;
            else if (counter < length_int)
            {
                data[counter] = c;
                counter++;
            }
            else
            {
                //trame.checkTrame(data, c, length_int);
                pc.putc(0xFF);      // delimiter pour l'application sur l'ordinateur
                wait(0.1);          // 
                pc.putc(data[12]);  // 
                wait(0.1);          // 
                pc.putc(data[13]);  // envoie sur le port usb des 4 char déterminant le code du mouvement à exécuter
                wait(0.1);          // 
                pc.putc(data[14]);  // 
                wait(0.1);          // 
                pc.putc(data[15]);  // 
                etat = Start;
            }
            break;
    }
}