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:
Fri Mar 20 20:33:35 2015 +0000
Revision:
13:51bbdc349f20
Parent:
12:bf44013497c8
Child:
14:ca1a9230ba7f
Ajout des 3 demande et finalisation de la classe ComSpi, reste les Ack/Nak mais ca presse pas. Je crois pas avoir oublier autres choses pour cette classe.

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 10:7e6aeaebe1a2 86 bool ComSpi::send(char portID, 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 }