![](/media/cache/profiles/4b0986230d9d7aded7f0c24033d221d4.jpg.50x50_q85.jpg)
Programme de contrôle de l'octopode 4DOF, Theraphosa-Salconi.
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
Diff: source/ComSpi.cpp
- Revision:
- 10:7e6aeaebe1a2
- Parent:
- 9:7295385f02b2
- Child:
- 11:496453b45e25
diff -r 7295385f02b2 -r 7e6aeaebe1a2 source/ComSpi.cpp --- a/source/ComSpi.cpp Thu Mar 19 19:14:31 2015 +0000 +++ b/source/ComSpi.cpp Thu Mar 19 21:49:20 2015 +0000 @@ -25,24 +25,24 @@ 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); + DigitalOut pinDemuxA(m_demuxA); + DigitalOut pinDemuxB(m_demuxB); + DigitalOut pinDemuxC(m_demuxC); + DigitalOut pinDemuxD(m_demuxD); + DigitalOut pinDemuxEnable(m_demuxEnable); - pinDemuxEnable=0; + 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; + 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; + pinDemuxEnable=1; } } int ComSpi::write(int value) @@ -59,66 +59,180 @@ (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; + + result = m_demuxPos; } return result; } -bool ComSpi::send(char portID, char adresseModule,char *flag,char *data) + +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; - int valueSend = SYNC; - int valueReceive=0; + + string formatedDataSend; + string formatedDataReceive; + //int valueReceive=0; //int CRC - - if(portID =! -1){ + + if(portID > (char)-1) { m_demuxPos = portID; change_demux(); + } + // Sync // + formatedDataSend.append(1,SYNC); + // Address // + formatedDataSend.append(1,adresseModule); + // 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; + } + // gestion ACK/NAK + formatedDataSend.at(formatedDataSend.length()) |= (NOACK << 4); + // 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; + } + // flag // + if(flag->size() != 0) + formatedDataSend.append(*flag); + // data // + if(data->size() != 0) + formatedDataSend.append(*flag); + // CRC // + //Create CRC + //Send CRC + //Compare + + int tempValue=0; + //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); } - valueReceive=write(valueSend); - if(valueReceive == valueSend) { - valueSend=(adresseModule<<8); - - if(*flag != 0) valueSend+= (PFB1 << 6); - else valueSend+= (PFB0 << 6); + // 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; - valueSend+= (NOACK << 4); + case 2: + flag->append(1,*it); + it++; + flag->append(1,*it); + it++; + break; - if(*data != 0) valueSend+= (NDB01 ); - else valueSend+= (NDB00 ); - - valueReceive=write(valueSend); - if(valueReceive>>8 == adresseModule) { - //fini la sycronisation et la on envoie les data + 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 + // - if(*flag != 0) valueSend = *flag; - else valueSend=0; - - if(*data != 0) valueSend= (valueSend<<4)+(*data); + // NDB // + data->clear(); + switch(tempValue&0xFF) { + case 1: + data->append(1,*it); + it++; + break; - 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; + 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 // + // + result=true; } return result; } \ No newline at end of file