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
Revision:
10:7e6aeaebe1a2
Parent:
9:7295385f02b2
Child:
11:496453b45e25
--- 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