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
Committer:
salco
Date:
Mon Mar 23 22:41:31 2015 +0000
Revision:
14:ca1a9230ba7f
Parent:
13:51bbdc349f20
Child:
15:91b3c572d9df
Je crois que jai fini tout ce que j'ai besoin pour faire utilisation des modules, reste un peut de pofinage mais pour le moment sa compile.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
salco 7:dcfd81d7f93f 1
salco 7:dcfd81d7f93f 2 #include "ComSpi.h"
salco 7:dcfd81d7f93f 3
salco 7:dcfd81d7f93f 4 ComSpi::ComSpi(PinName mosi, PinName miso, PinName sclk, PinName _unused) : SPI(mosi,miso,sclk,_unused)
salco 7:dcfd81d7f93f 5 {
salco 7:dcfd81d7f93f 6 // m_com = new SPI(mosi,miso,sclk,_unused);
salco 7:dcfd81d7f93f 7 //m_regPortUse=0;
salco 7:dcfd81d7f93f 8 //m_regPortLost=0;
salco 7:dcfd81d7f93f 9 m_demuxPos=0;
salco 7:dcfd81d7f93f 10 demuxIsUse=false;
salco 7:dcfd81d7f93f 11 }
salco 7:dcfd81d7f93f 12
salco 7:dcfd81d7f93f 13 ComSpi::ComSpi(PinName mosi, PinName miso, PinName sclk, PinName demuxA, PinName demuxB, PinName demuxC, PinName demuxD, PinName demuxEnable)
salco 11:496453b45e25 14 : SPI(mosi,miso,sclk), m_demuxA(demuxA), m_demuxB(demuxB), m_demuxC(demuxC), m_demuxD(demuxD), m_demuxEnable(demuxEnable)
salco 7:dcfd81d7f93f 15 {
salco 7:dcfd81d7f93f 16 m_demuxPos=0;
salco 7:dcfd81d7f93f 17 demuxIsUse=true;
salco 7:dcfd81d7f93f 18 }
salco 7:dcfd81d7f93f 19
salco 7:dcfd81d7f93f 20 ComSpi::~ComSpi()
salco 7:dcfd81d7f93f 21 {
salco 7:dcfd81d7f93f 22 //if(m_com)
salco 7:dcfd81d7f93f 23 // delete(m_com);
salco 7:dcfd81d7f93f 24 }
salco 7:dcfd81d7f93f 25 void ComSpi::change_demux(void)
salco 7:dcfd81d7f93f 26 {
salco 9:7295385f02b2 27 if(demuxIsUse) {
salco 10:7e6aeaebe1a2 28 DigitalOut pinDemuxA(m_demuxA);
salco 10:7e6aeaebe1a2 29 DigitalOut pinDemuxB(m_demuxB);
salco 10:7e6aeaebe1a2 30 DigitalOut pinDemuxC(m_demuxC);
salco 10:7e6aeaebe1a2 31 DigitalOut pinDemuxD(m_demuxD);
salco 10:7e6aeaebe1a2 32 DigitalOut pinDemuxEnable(m_demuxEnable);
salco 7:dcfd81d7f93f 33
salco 10:7e6aeaebe1a2 34 pinDemuxEnable=0;
salco 7:dcfd81d7f93f 35
salco 10:7e6aeaebe1a2 36 if(m_demuxPos & 1) pinDemuxA=1; //0b0001
salco 10:7e6aeaebe1a2 37 else pinDemuxA=0;
salco 10:7e6aeaebe1a2 38 if(m_demuxPos & 2) pinDemuxB=1; //0b0010
salco 10:7e6aeaebe1a2 39 else pinDemuxB=0;
salco 10:7e6aeaebe1a2 40 if(m_demuxPos & 4) pinDemuxC=1; //0b0100
salco 10:7e6aeaebe1a2 41 else pinDemuxC=0;
salco 10:7e6aeaebe1a2 42 if(m_demuxPos & 8) pinDemuxD=1; //0b1000
salco 10:7e6aeaebe1a2 43 else pinDemuxD=0;
salco 7:dcfd81d7f93f 44
salco 10:7e6aeaebe1a2 45 pinDemuxEnable=1;
salco 9:7295385f02b2 46 }
salco 7:dcfd81d7f93f 47 }
salco 7:dcfd81d7f93f 48 int ComSpi::write(int value)
salco 7:dcfd81d7f93f 49 {
salco 7:dcfd81d7f93f 50 int a;
salco 7:dcfd81d7f93f 51 a= SPI::write(value);
salco 7:dcfd81d7f93f 52 return a;
salco 7:dcfd81d7f93f 53 }
salco 9:7295385f02b2 54 char ComSpi::next_demux(void)
salco 7:dcfd81d7f93f 55 {
salco 9:7295385f02b2 56 char result = (char)-1;
salco 7:dcfd81d7f93f 57
salco 7:dcfd81d7f93f 58 if(demuxIsUse) {
salco 7:dcfd81d7f93f 59 (m_demuxPos == 15)? m_demuxPos=0:m_demuxPos++;
salco 7:dcfd81d7f93f 60 change_demux();
salco 9:7295385f02b2 61 result = m_demuxPos;
salco 7:dcfd81d7f93f 62 }
salco 7:dcfd81d7f93f 63 return result;
salco 7:dcfd81d7f93f 64 }
salco 9:7295385f02b2 65 char ComSpi::back_demux(void)
salco 7:dcfd81d7f93f 66 {
salco 9:7295385f02b2 67 char result = (char)-1;
salco 10:7e6aeaebe1a2 68
salco 7:dcfd81d7f93f 69 if(demuxIsUse) {
salco 7:dcfd81d7f93f 70 (m_demuxPos == 0)? m_demuxPos=15:m_demuxPos--;
salco 7:dcfd81d7f93f 71 change_demux();
salco 10:7e6aeaebe1a2 72
salco 10:7e6aeaebe1a2 73 result = m_demuxPos;
salco 7:dcfd81d7f93f 74 }
salco 7:dcfd81d7f93f 75 return result;
salco 7:dcfd81d7f93f 76 }
salco 10:7e6aeaebe1a2 77
salco 10:7e6aeaebe1a2 78 char ComSpi::get_demux(void)
salco 10:7e6aeaebe1a2 79 {
salco 10:7e6aeaebe1a2 80 char result = (char)-1;
salco 10:7e6aeaebe1a2 81 if(demuxIsUse)
salco 10:7e6aeaebe1a2 82 result=m_demuxPos;
salco 10:7e6aeaebe1a2 83 return result ;
salco 10:7e6aeaebe1a2 84 }
salco 10:7e6aeaebe1a2 85
salco 14:ca1a9230ba7f 86 bool ComSpi::send(char portID,unsigned char adresseModule,string *flag,string *data)
salco 7:dcfd81d7f93f 87 {
salco 7:dcfd81d7f93f 88 bool result=false;
salco 10:7e6aeaebe1a2 89 string formatedDataSend;
salco 10:7e6aeaebe1a2 90 string formatedDataReceive;
salco 10:7e6aeaebe1a2 91 //int valueReceive=0;
salco 7:dcfd81d7f93f 92 //int CRC
salco 12:bf44013497c8 93
salco 11:496453b45e25 94 debug(DEBUG_SEND, "\n\r -Debut du send. ");
salco 12:bf44013497c8 95
salco 11:496453b45e25 96 debug(DEBUG_SEND, "\n\r -Debut set demux. ");
salco 12:bf44013497c8 97 if(portID > 0xFF) { //(char)-1) {
salco 9:7295385f02b2 98 m_demuxPos = portID;
salco 9:7295385f02b2 99 change_demux();
salco 10:7e6aeaebe1a2 100 }
salco 11:496453b45e25 101 debug(DEBUG_SEND, "\n\r -Fin set demux. ");
salco 12:bf44013497c8 102
salco 10:7e6aeaebe1a2 103 // Sync //
salco 11:496453b45e25 104 debug(DEBUG_SEND, "\n\r -Debut Sync. ");
salco 10:7e6aeaebe1a2 105 formatedDataSend.append(1,SYNC);
salco 11:496453b45e25 106 debug(DEBUG_SEND, "\n\r -Fin Sync. ");
salco 12:bf44013497c8 107
salco 10:7e6aeaebe1a2 108 // Address //
salco 11:496453b45e25 109 debug(DEBUG_SEND, "\n\r -Debut Address. ");
salco 10:7e6aeaebe1a2 110 formatedDataSend.append(1,adresseModule);
salco 11:496453b45e25 111 debug(DEBUG_SEND, "\n\r -Fin Address. ");
salco 12:bf44013497c8 112
salco 10:7e6aeaebe1a2 113 // PFB //
salco 11:496453b45e25 114 debug(DEBUG_SEND, "\n\r -Debut PFB. ");
salco 10:7e6aeaebe1a2 115 switch(flag->size()) {
salco 10:7e6aeaebe1a2 116 case 1:
salco 10:7e6aeaebe1a2 117 formatedDataSend.append(1,1<<6);
salco 10:7e6aeaebe1a2 118 break;
salco 10:7e6aeaebe1a2 119
salco 10:7e6aeaebe1a2 120 case 2:
salco 10:7e6aeaebe1a2 121 formatedDataSend.append(1,2<<6);
salco 10:7e6aeaebe1a2 122 break;
salco 10:7e6aeaebe1a2 123
salco 10:7e6aeaebe1a2 124 case 3:
salco 10:7e6aeaebe1a2 125 formatedDataSend.append(1,3<<6);
salco 10:7e6aeaebe1a2 126 break;
salco 10:7e6aeaebe1a2 127
salco 10:7e6aeaebe1a2 128 default:
salco 10:7e6aeaebe1a2 129 formatedDataSend.append(1,0<<6);
salco 10:7e6aeaebe1a2 130 break;
salco 10:7e6aeaebe1a2 131 }
salco 11:496453b45e25 132 debug(DEBUG_SEND, "\n\r -Fin PFB. ");
salco 12:bf44013497c8 133
salco 10:7e6aeaebe1a2 134 // gestion ACK/NAK
salco 11:496453b45e25 135 debug(DEBUG_SEND, "\n\r -Debut ACK/NAK. ");
salco 12:bf44013497c8 136 formatedDataSend.at(formatedDataSend.length()-1) |= (NOACK << 4);
salco 11:496453b45e25 137 debug(DEBUG_SEND, "\n\r -Fin ACK/NAK. ");
salco 12:bf44013497c8 138
salco 10:7e6aeaebe1a2 139 // NDB //
salco 11:496453b45e25 140 debug(DEBUG_SEND, "\n\r -Debut NDB. ");
salco 10:7e6aeaebe1a2 141 switch(data->size()) {
salco 10:7e6aeaebe1a2 142 case 1:
salco 12:bf44013497c8 143 formatedDataSend.at(formatedDataSend.length()-1) |= 1;
salco 10:7e6aeaebe1a2 144 break;
salco 10:7e6aeaebe1a2 145
salco 10:7e6aeaebe1a2 146 case 2:
salco 12:bf44013497c8 147 formatedDataSend.at(formatedDataSend.length()-1) |= 2;
salco 10:7e6aeaebe1a2 148 break;
salco 10:7e6aeaebe1a2 149
salco 10:7e6aeaebe1a2 150 case 3:
salco 12:bf44013497c8 151 formatedDataSend.at(formatedDataSend.length()-1) |= 3;
salco 10:7e6aeaebe1a2 152 break;
salco 10:7e6aeaebe1a2 153
salco 10:7e6aeaebe1a2 154 default:
salco 12:bf44013497c8 155 formatedDataSend.at(formatedDataSend.length()-1) |= 0;
salco 10:7e6aeaebe1a2 156 break;
salco 10:7e6aeaebe1a2 157 }
salco 11:496453b45e25 158 debug(DEBUG_SEND, "\n\r -Fin NDB. ");
salco 12:bf44013497c8 159
salco 10:7e6aeaebe1a2 160 // flag //
salco 11:496453b45e25 161 debug(DEBUG_SEND, "\n\r -Debut flag. ");
salco 12:bf44013497c8 162 if(flag->size() != 0) {
salco 10:7e6aeaebe1a2 163 formatedDataSend.append(*flag);
salco 12:bf44013497c8 164 }
salco 11:496453b45e25 165 debug(DEBUG_SEND, "\n\r -Fin flag. ");
salco 12:bf44013497c8 166
salco 10:7e6aeaebe1a2 167 // data //
salco 11:496453b45e25 168 debug(DEBUG_SEND, "\n\r -Debut data. ");
salco 12:bf44013497c8 169 if(data->size() != 0) {
salco 10:7e6aeaebe1a2 170 formatedDataSend.append(*flag);
salco 12:bf44013497c8 171 }
salco 11:496453b45e25 172 debug(DEBUG_SEND, "\n\r -Fin data. ");
salco 12:bf44013497c8 173
salco 10:7e6aeaebe1a2 174 // CRC //
salco 13:51bbdc349f20 175 debug(DEBUG_SEND, "\n\r -Debut CRC16. ");
salco 13:51bbdc349f20 176 CRC16* templateCRC;
salco 13:51bbdc349f20 177 templateCRC = new CRC16();
salco 13:51bbdc349f20 178 unsigned short templateValue;
salco 13:51bbdc349f20 179 char templateTable[34];
salco 13:51bbdc349f20 180 for (unsigned i=0; i<34; ++i) templateTable[i]=0;
salco 13:51bbdc349f20 181 for (unsigned i=0; i<formatedDataSend.length(); ++i) templateTable[i]=formatedDataSend[i];
salco 13:51bbdc349f20 182 debug(DEBUG_SEND, "\n\r - envoi au crc: %i,%i,%i,%i,%i,%i ",templateTable[0],templateTable[1],templateTable[2],templateTable[3],templateTable[4],templateTable[5],templateTable[6]);
salco 10:7e6aeaebe1a2 183
salco 13:51bbdc349f20 184 templateValue = templateCRC->calculateCRC16(templateTable,formatedDataSend.size()-1); //atention pt un probleme de sortie du range
salco 13:51bbdc349f20 185
salco 13:51bbdc349f20 186 formatedDataSend.append(1,templateValue>>8);
salco 13:51bbdc349f20 187 formatedDataSend.append(1,templateValue & 0xFF);
salco 13:51bbdc349f20 188
salco 13:51bbdc349f20 189 if(templateCRC)
salco 13:51bbdc349f20 190 delete templateCRC;
salco 13:51bbdc349f20 191
salco 13:51bbdc349f20 192 debug(DEBUG_SEND, "\n\r -Fin CRC16. ");
salco 13:51bbdc349f20 193
salco 10:7e6aeaebe1a2 194 //Send Data
salco 11:496453b45e25 195 debug(DEBUG_SEND, "\n\r -Debut Send Data. ");
salco 12:bf44013497c8 196 debug(DEBUG_SEND, "\n\r -Send: ");
salco 13:51bbdc349f20 197 for (unsigned i=0; i<formatedDataSend.length(); ++i) debug(DEBUG_SEND, "%i,",formatedDataSend.at(i));
salco 13:51bbdc349f20 198
salco 13:51bbdc349f20 199 int twoBytesArray;
salco 13:51bbdc349f20 200 twoBytesArray = (formatedDataSend[0]<<8)+formatedDataSend[1];
salco 13:51bbdc349f20 201
salco 13:51bbdc349f20 202 for(int i=0; (i<3) && (!result); i++) {
salco 13:51bbdc349f20 203 debug(DEBUG_SEND, "\n\r -Tentative: %d",i);
salco 13:51bbdc349f20 204
salco 13:51bbdc349f20 205 twoBytesArray=write(twoBytesArray);
salco 13:51bbdc349f20 206
salco 13:51bbdc349f20 207 if(twoBytesArray>>8 == SYNC) {// twoBytesArray ==(Sync)//+(PFB+ACK+NDB))
salco 13:51bbdc349f20 208 // Envoie le reste si liker si liker //
salco 13:51bbdc349f20 209 debug(DEBUG_SEND, "\n\r -Debut Traitement de l'information. ");
salco 13:51bbdc349f20 210 debug(DEBUG_SEND, "\n\r -Receive: ");
salco 13:51bbdc349f20 211
salco 13:51bbdc349f20 212 formatedDataReceive.clear();
salco 13:51bbdc349f20 213 formatedDataReceive.append(1,twoBytesArray>>8);
salco 13:51bbdc349f20 214 formatedDataReceive.append(1,twoBytesArray & 0xFF);
salco 12:bf44013497c8 215
salco 13:51bbdc349f20 216 for (unsigned i=2; i<formatedDataSend.length(); ++i) {
salco 13:51bbdc349f20 217 twoBytesArray = formatedDataSend[i];
salco 13:51bbdc349f20 218 i++;
salco 13:51bbdc349f20 219 if(i<formatedDataSend.length())
salco 13:51bbdc349f20 220 twoBytesArray = (twoBytesArray<<8) + formatedDataSend[i];
salco 13:51bbdc349f20 221
salco 13:51bbdc349f20 222 twoBytesArray=write(twoBytesArray);
salco 13:51bbdc349f20 223 formatedDataReceive.append(1,twoBytesArray>>8);
salco 13:51bbdc349f20 224 formatedDataReceive.append(1,twoBytesArray&0xFF);
salco 13:51bbdc349f20 225 }
salco 12:bf44013497c8 226
salco 13:51bbdc349f20 227 // CRC //
salco 13:51bbdc349f20 228 unsigned short templateValue=1;
salco 13:51bbdc349f20 229 templateValue=formatedDataReceive.at(formatedDataReceive.length()-2) << 8;
salco 13:51bbdc349f20 230 templateValue|=formatedDataReceive.at(formatedDataReceive.length()-1);
salco 13:51bbdc349f20 231
salco 13:51bbdc349f20 232 for (unsigned i=0; i<formatedDataReceive.length()-2; ++i) {
salco 13:51bbdc349f20 233 templateValue-=formatedDataReceive[i];
salco 13:51bbdc349f20 234 }
salco 13:51bbdc349f20 235 debug(DEBUG_SEND, "\n\r -CRC==0? value: %i. ", templateValue);
salco 13:51bbdc349f20 236 (templateValue==0)? result=true:result=false;
salco 13:51bbdc349f20 237 }
salco 13:51bbdc349f20 238 }
salco 12:bf44013497c8 239 debug(DEBUG_SEND, "\n\r -Fin Send Data. ");
salco 12:bf44013497c8 240
salco 13:51bbdc349f20 241 if(result) {
salco 13:51bbdc349f20 242 // Traitement de l'information //
salco 12:bf44013497c8 243 debug(DEBUG_SEND, "\n\r -Debut Traitement de l'information. ");
salco 12:bf44013497c8 244 debug(DEBUG_SEND, "\n\r -Receive: ");
salco 13:51bbdc349f20 245 for (unsigned i=0; i<formatedDataReceive.length(); ++i)debug(DEBUG_SEND, "%i,",formatedDataReceive.at(i));
salco 12:bf44013497c8 246
salco 10:7e6aeaebe1a2 247 // flag //
salco 10:7e6aeaebe1a2 248 flag->clear();
salco 13:51bbdc349f20 249 twoBytesArray=formatedDataReceive[2];
salco 13:51bbdc349f20 250 string::iterator it=formatedDataReceive.begin()+3;
salco 13:51bbdc349f20 251
salco 13:51bbdc349f20 252 switch(twoBytesArray>>6) {
salco 10:7e6aeaebe1a2 253 case 1:
salco 10:7e6aeaebe1a2 254 flag->append(1,*it);
salco 10:7e6aeaebe1a2 255 it++;
salco 10:7e6aeaebe1a2 256 break;
salco 7:dcfd81d7f93f 257
salco 10:7e6aeaebe1a2 258 case 2:
salco 10:7e6aeaebe1a2 259 flag->append(1,*it);
salco 10:7e6aeaebe1a2 260 it++;
salco 10:7e6aeaebe1a2 261 flag->append(1,*it);
salco 10:7e6aeaebe1a2 262 it++;
salco 10:7e6aeaebe1a2 263 break;
salco 7:dcfd81d7f93f 264
salco 10:7e6aeaebe1a2 265 case 3:
salco 10:7e6aeaebe1a2 266 flag->append(1,*it);
salco 10:7e6aeaebe1a2 267 it++;
salco 10:7e6aeaebe1a2 268 flag->append(1,*it);
salco 10:7e6aeaebe1a2 269 it++;
salco 10:7e6aeaebe1a2 270 flag->append(1,*it);
salco 10:7e6aeaebe1a2 271 it++;
salco 10:7e6aeaebe1a2 272 break;
salco 7:dcfd81d7f93f 273
salco 10:7e6aeaebe1a2 274 /*default:
salco 10:7e6aeaebe1a2 275 formatedDataSend.append(1,0<<6);
salco 10:7e6aeaebe1a2 276 break;*/
salco 10:7e6aeaebe1a2 277 }
salco 12:bf44013497c8 278
salco 10:7e6aeaebe1a2 279 // ACK/NAK
salco 10:7e6aeaebe1a2 280 //
salco 7:dcfd81d7f93f 281
salco 10:7e6aeaebe1a2 282 // NDB //
salco 10:7e6aeaebe1a2 283 data->clear();
salco 13:51bbdc349f20 284 switch(twoBytesArray&0xFF) {
salco 10:7e6aeaebe1a2 285 case 1:
salco 10:7e6aeaebe1a2 286 data->append(1,*it);
salco 10:7e6aeaebe1a2 287 it++;
salco 10:7e6aeaebe1a2 288 break;
salco 7:dcfd81d7f93f 289
salco 10:7e6aeaebe1a2 290 case 2:
salco 10:7e6aeaebe1a2 291 data->append(1,*it);
salco 10:7e6aeaebe1a2 292 it++;
salco 10:7e6aeaebe1a2 293 data->append(1,*it);
salco 10:7e6aeaebe1a2 294 it++;
salco 10:7e6aeaebe1a2 295 break;
salco 10:7e6aeaebe1a2 296
salco 10:7e6aeaebe1a2 297 case 3:
salco 10:7e6aeaebe1a2 298 data->append(1,*it);
salco 10:7e6aeaebe1a2 299 it++;
salco 10:7e6aeaebe1a2 300 data->append(1,*it);
salco 10:7e6aeaebe1a2 301 it++;
salco 10:7e6aeaebe1a2 302 data->append(1,*it);
salco 10:7e6aeaebe1a2 303 it++;
salco 10:7e6aeaebe1a2 304 break;
salco 10:7e6aeaebe1a2 305
salco 10:7e6aeaebe1a2 306 /*default:
salco 10:7e6aeaebe1a2 307
salco 10:7e6aeaebe1a2 308 break;*/
salco 7:dcfd81d7f93f 309 }
salco 13:51bbdc349f20 310 }
salco 12:bf44013497c8 311
salco 12:bf44013497c8 312 debug(DEBUG_SEND, "\n\r -Fin Traitement de l'information. ");
salco 11:496453b45e25 313 debug(DEBUG_SEND, "\n\r -Fin du send. ");
salco 7:dcfd81d7f93f 314 return result;
salco 7:dcfd81d7f93f 315 }