Programme de contrôle de l'octopode 4DOF, Theraphosa-Salconi.

Dependencies:   debug mbed

CtrlBridge

  • fonction quelquonque pour communiquer avec les module
  • fonction quelquonque pour faire des recherche dans les module dispo
  • autre fonction pour jouer avec MemRegistre

Version 1.2.0

  • Ajout d'un mode de simulation pour tester le code avec seulement un contrôleur stm32

source/ComSpi.cpp

Committer:
salco
Date:
2015-03-20
Revision:
11:496453b45e25
Parent:
10:7e6aeaebe1a2
Child:
12:bf44013497c8

File content as of revision 11:496453b45e25:


#include "ComSpi.h"

ComSpi::ComSpi(PinName mosi, PinName miso, PinName sclk, PinName _unused) : SPI(mosi,miso,sclk,_unused)
{
    // m_com = new SPI(mosi,miso,sclk,_unused);
    //m_regPortUse=0;
    //m_regPortLost=0;
    m_demuxPos=0;
    demuxIsUse=false;
}

ComSpi::ComSpi(PinName mosi, PinName miso, PinName sclk, PinName demuxA, PinName demuxB, PinName demuxC, PinName demuxD, PinName demuxEnable)
    : SPI(mosi,miso,sclk), m_demuxA(demuxA), m_demuxB(demuxB), m_demuxC(demuxC), m_demuxD(demuxD), m_demuxEnable(demuxEnable)
{
    m_demuxPos=0;
    demuxIsUse=true;
}

ComSpi::~ComSpi()
{
    //if(m_com)
    // delete(m_com);
}
void ComSpi::change_demux(void)
{
    if(demuxIsUse) {
        DigitalOut pinDemuxA(m_demuxA);
        DigitalOut pinDemuxB(m_demuxB);
        DigitalOut pinDemuxC(m_demuxC);
        DigitalOut pinDemuxD(m_demuxD);
        DigitalOut pinDemuxEnable(m_demuxEnable);

        pinDemuxEnable=0;

        if(m_demuxPos & 1) pinDemuxA=1; //0b0001
        else pinDemuxA=0;
        if(m_demuxPos & 2) pinDemuxB=1; //0b0010
        else pinDemuxB=0;
        if(m_demuxPos & 4) pinDemuxC=1; //0b0100
        else pinDemuxC=0;
        if(m_demuxPos & 8) pinDemuxD=1; //0b1000
        else pinDemuxD=0;

        pinDemuxEnable=1;
    }
}
int ComSpi::write(int value)
{
    int a;
    a= SPI::write(value);
    return a;
}
char ComSpi::next_demux(void)
{
    char result = (char)-1;

    if(demuxIsUse) {
        (m_demuxPos == 15)? m_demuxPos=0:m_demuxPos++;
        change_demux();
        result = m_demuxPos;
    }
    return result;
}
char ComSpi::back_demux(void)
{
    char result = (char)-1;

    if(demuxIsUse) {
        (m_demuxPos == 0)? m_demuxPos=15:m_demuxPos--;
        change_demux();

        result = m_demuxPos;
    }
    return result;
}

char ComSpi::get_demux(void)
{
    char result = (char)-1;
    if(demuxIsUse)
        result=m_demuxPos;
    return   result ;
}

bool ComSpi::send(char portID, char adresseModule,string *flag,string *data)
{
    bool result=false;

    string formatedDataSend;
    string formatedDataReceive;
    //int valueReceive=0;
    //int CRC
    debug(DEBUG_SEND, "\n\r   -Debut du send. ");
    debug(DEBUG_SEND, "\n\r    -Debut set demux. ");
    if(portID > (char)-1) {
        m_demuxPos = portID;
        change_demux();
    }
    debug(DEBUG_SEND, "\n\r    -Fin set demux. ");
    // Sync //
    debug(DEBUG_SEND, "\n\r    -Debut Sync. ");
    formatedDataSend.append(1,SYNC);
    debug(DEBUG_SEND, "\n\r    -Fin Sync. ");
    // Address //
    debug(DEBUG_SEND, "\n\r    -Debut Address. ");
    formatedDataSend.append(1,adresseModule);
    debug(DEBUG_SEND, "\n\r    -Fin Address. ");
    // PFB //
    debug(DEBUG_SEND, "\n\r    -Debut PFB. ");
    switch(flag->size()) {
        case 1:
            formatedDataSend.append(1,1<<6);
            break;

        case 2:
            formatedDataSend.append(1,2<<6);
            break;

        case 3:
            formatedDataSend.append(1,3<<6);
            break;

        default:
            formatedDataSend.append(1,0<<6);
            break;
    }
    debug(DEBUG_SEND, "\n\r    -Fin PFB. ");
    // gestion ACK/NAK
    debug(DEBUG_SEND, "\n\r    -Debut ACK/NAK. ");
    formatedDataSend.at(formatedDataSend.length()) |= (NOACK << 4);
    debug(DEBUG_SEND, "\n\r    -Fin ACK/NAK. ");
    // NDB //
    debug(DEBUG_SEND, "\n\r    -Debut NDB. ");
    switch(data->size()) {
        case 1:
            formatedDataSend.at(formatedDataSend.length()) |= 1;
            break;

        case 2:
            formatedDataSend.at(formatedDataSend.length()) |= 2;
            break;

        case 3:
            formatedDataSend.at(formatedDataSend.length()) |= 3;
            break;

        default:
            formatedDataSend.at(formatedDataSend.length()) |= 0;
            break;
    }
    debug(DEBUG_SEND, "\n\r    -Fin NDB. ");
    // flag //
    debug(DEBUG_SEND, "\n\r    -Debut flag. ");
    if(flag->size() != 0)
        formatedDataSend.append(*flag);
    debug(DEBUG_SEND, "\n\r    -Fin flag. ");
    // data //
    debug(DEBUG_SEND, "\n\r    -Debut data. ");
    if(data->size() != 0)
        formatedDataSend.append(*flag);
    debug(DEBUG_SEND, "\n\r    -Fin data. ");
    // CRC //
    //Create CRC
    //Send CRC
    //Compare

    int tempValue=0;
    //Send Data
    debug(DEBUG_SEND, "\n\r    -Debut Send Data. ");
    tempValue = (formatedDataSend[0]<<8)+formatedDataSend[1];
    tempValue=write(tempValue);
    if(tempValue == (formatedDataSend[0]<<8)+formatedDataSend[1]) {
        formatedDataReceive.append(1,formatedDataSend[0]);
        formatedDataReceive.append(1,formatedDataSend[1]);

        for (unsigned i=2; i<formatedDataSend.length(); ++i) {
            tempValue = formatedDataSend[i];
            i++;
            if(i<formatedDataSend.length())
                tempValue = (tempValue<<8) + formatedDataSend[i];

            tempValue=write(tempValue);
            formatedDataReceive.append(1,tempValue>>8);
            formatedDataReceive.append(1,tempValue&0xFF);
        }
        debug(DEBUG_SEND, "\n\r    -Fin Send Data. ");
        // Traitement de l'information //
        debug(DEBUG_SEND, "\n\r    -Debut Traitement de l'information. ");
        tempValue=formatedDataReceive[2];
        string::iterator it=formatedDataReceive.begin()+3;
        // flag //
        flag->clear();
        switch(tempValue>>6) {
            case 1:
                flag->append(1,*it);
                it++;
                break;

            case 2:
                flag->append(1,*it);
                it++;
                flag->append(1,*it);
                it++;
                break;

            case 3:
                flag->append(1,*it);
                it++;
                flag->append(1,*it);
                it++;
                flag->append(1,*it);
                it++;
                break;

                /*default:
                    formatedDataSend.append(1,0<<6);
                    break;*/
        }
        // ACK/NAK
        //

        // NDB //
        data->clear();
        switch(tempValue&0xFF) {
            case 1:
                data->append(1,*it);
                it++;
                break;

            case 2:
                data->append(1,*it);
                it++;
                data->append(1,*it);
                it++;
                break;

            case 3:
                data->append(1,*it);
                it++;
                data->append(1,*it);
                it++;
                data->append(1,*it);
                it++;
                break;

                /*default:

                    break;*/
        }
        // CRC //
        //
        debug(DEBUG_SEND, "\n\r    -Fin Traitement de l'information. ");
        result=true;
    }
    debug(DEBUG_SEND, "\n\r   -Fin du send. ");
    return result;
}