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-19
Revision:
9:7295385f02b2
Parent:
7:dcfd81d7f93f
Child:
10:7e6aeaebe1a2

File content as of revision 9:7295385f02b2:


#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,NC), 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;
        result = true;
    }
    return result;
}
char ComSpi::back_demux(void)
{
    char result = (char)-1;
    
    if(demuxIsUse) {
        (m_demuxPos == 0)? m_demuxPos=15:m_demuxPos--;
        change_demux();
        
        result = true;
    }
    return result;
}
bool ComSpi::send(char portID, char adresseModule,char *flag,char *data)
{
    bool result=false;
    int valueSend = SYNC;
    int valueReceive=0;
    //int CRC
    
    if(portID =! -1){
        m_demuxPos = portID;
        change_demux();
        }

    valueReceive=write(valueSend);
    if(valueReceive == valueSend) {
        valueSend=(adresseModule<<8);

        if(*flag != 0) valueSend+= (PFB1 << 6);
        else valueSend+= (PFB0 << 6);

        valueSend+= (NOACK << 4);

        if(*data != 0) valueSend+= (NDB01 );
        else valueSend+= (NDB00 );

        valueReceive=write(valueSend);
        if(valueReceive>>8 == adresseModule) {
            //fini la sycronisation et la on envoie les data


            if(*flag != 0) valueSend = *flag;
            else valueSend=0;

            if(*data != 0) valueSend= (valueSend<<4)+(*data);

            valueReceive=write(valueSend);
            if((*flag != 0) && (*data != 0)) *flag = valueReceive>>8;
            else if(*flag != 0) *flag = valueReceive;
            else if(*data != 0) *data = valueReceive;
            
            //Create CRC
            //Send CRC
            //Compare
            result=true;
        }
    }
    return result;
}