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:
Thu Apr 23 19:28:42 2015 +0000
Revision:
18:3f113f8441b2
Parent:
17:095f670f9c14
Child:
27:ea60d12dccdf
communication fonctionelle je suis rendu a faire des teste avec les task, la communication est plutot basic pour le moment.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
salco 8:e017e3d527d7 1
salco 8:e017e3d527d7 2 #include "CtrlBridge.h"
salco 8:e017e3d527d7 3
salco 8:e017e3d527d7 4 CtrlBridge *CtrlBridge::uniqueInstance;
salco 8:e017e3d527d7 5
salco 8:e017e3d527d7 6 /**
salco 8:e017e3d527d7 7 * @brief Constructeur priver appler par la fonction getInstance()
salco 8:e017e3d527d7 8 */
salco 9:7295385f02b2 9 CtrlBridge::CtrlBridge()
salco 11:496453b45e25 10 : m_Memory(), ssc32(PA_9, PA_10),
salco 9:7295385f02b2 11 spiLowSpeed (SPI_LOW_MOSI, SPI_LOW_MISO, SPI_LOW_SCK, SPI_LOW_DEMUXA, SPI_LOW_DEMUXB, SPI_LOW_DEMUXC, SPI_LOW_DEMUXD, SPI_LOW_CS),
salco 11:496453b45e25 12 spiHighSpeed(SPI_HIGH_MOSI, SPI_HIGH_MISO, SPI_HIGH_SCK, SPI_HIGH_DEMUXA, SPI_HIGH_DEMUXB, SPI_HIGH_DEMUXC, SPI_HIGH_DEMUXD, SPI_HIGH_CS),
salco 11:496453b45e25 13 pc(SERIAL_TX, SERIAL_RX)
salco 8:e017e3d527d7 14 {
salco 9:7295385f02b2 15 //faire en sorte d'init SPI speed ici
salco 9:7295385f02b2 16 m_regPortUse=0;
salco 9:7295385f02b2 17 m_regPortLost=0;
salco 15:91b3c572d9df 18 spiLowSpeed.format(8,0);
salco 15:91b3c572d9df 19 spiLowSpeed.frequency(10000);
salco 8:e017e3d527d7 20 }
salco 8:e017e3d527d7 21
salco 8:e017e3d527d7 22 CtrlBridge::~CtrlBridge()
salco 8:e017e3d527d7 23 {
salco 9:7295385f02b2 24 }
salco 9:7295385f02b2 25
salco 8:e017e3d527d7 26 /**
salco 8:e017e3d527d7 27 * @brief Methode permetant une seul instance de la classe
salco 8:e017e3d527d7 28 * @return Retourne l'unique instance de la classe
salco 8:e017e3d527d7 29 */
salco 8:e017e3d527d7 30 CtrlBridge *CtrlBridge::getInstance()
salco 8:e017e3d527d7 31 {
salco 9:7295385f02b2 32 if(!uniqueInstance) {
salco 8:e017e3d527d7 33 uniqueInstance = new CtrlBridge();
salco 8:e017e3d527d7 34 }
salco 8:e017e3d527d7 35 return uniqueInstance;
salco 8:e017e3d527d7 36 }
salco 8:e017e3d527d7 37
salco 8:e017e3d527d7 38 bool CtrlBridge::initCom(void)
salco 8:e017e3d527d7 39 {
salco 9:7295385f02b2 40 //char positionInitial;
salco 9:7295385f02b2 41 bool portUse;
salco 14:ca1a9230ba7f 42 unsigned char adresse;
salco 10:7e6aeaebe1a2 43 string flag;
salco 10:7e6aeaebe1a2 44 string data;
salco 10:7e6aeaebe1a2 45 Module* templateModule ;
salco 10:7e6aeaebe1a2 46 templateModule= new Module;
salco 14:ca1a9230ba7f 47
salco 14:ca1a9230ba7f 48 debug(DEBUG_INITMODULE, "\n\rInit::debut");
salco 11:496453b45e25 49 //flag.clear();
salco 11:496453b45e25 50 //flag.append(1,Request_Init_Info);
salco 9:7295385f02b2 51 //positionInitial = spiLowSpeed.next_demux();
salco 9:7295385f02b2 52 for(char i=0; i != 15; i++) {
salco 11:496453b45e25 53 debug(DEBUG_INITMODULE, "\n\r -Debut de boucle :%d ", i);
salco 14:ca1a9230ba7f 54 //flag = Request_Init_Info;
salco 14:ca1a9230ba7f 55 //portUse = spiLowSpeed.send(i,0,&flag,&data);
salco 14:ca1a9230ba7f 56 //if( portUse ) {
salco 14:ca1a9230ba7f 57 // m_regPortUse|=(1<< i);
salco 10:7e6aeaebe1a2 58
salco 14:ca1a9230ba7f 59 do {
salco 17:095f670f9c14 60 debug(" IN");
salco 14:ca1a9230ba7f 61 flag = Request_Init_Info;
salco 15:91b3c572d9df 62 adresse = m_Memory.getAdressDispo(0x80);//80 parce que cest le conecteur droit
salco 18:3f113f8441b2 63 debug(DEBUG_INITMODULE, "\n\r -addresse use :%d", adresse);
salco 14:ca1a9230ba7f 64 data.clear();
salco 15:91b3c572d9df 65 data.append(4,1);
salco 14:ca1a9230ba7f 66 portUse = spiLowSpeed.send(i,adresse,&flag,&data);
salco 16:5ea4337d785f 67 debug(DEBUG_INITMODULE, "\n\r -Port use result :%d", portUse);
salco 16:5ea4337d785f 68
salco 17:095f670f9c14 69 if((flag.empty()) && (data.empty()))// data vide
salco 17:095f670f9c14 70 portUse=false;
salco 17:095f670f9c14 71
salco 14:ca1a9230ba7f 72 if( portUse ) {
salco 16:5ea4337d785f 73 debug(DEBUG_INITMODULE, "\n\r -flag get: ");
salco 16:5ea4337d785f 74 for (unsigned j=0; j<flag.length(); j++) debug(DEBUG_INITMODULE, "%02X,",flag.at(j));
salco 16:5ea4337d785f 75 debug(DEBUG_INITMODULE, "\n\r -data get: ");
salco 16:5ea4337d785f 76 for (unsigned j=0; j<data.length(); j++) debug(DEBUG_INITMODULE, "%02X,",data.at(j));
salco 16:5ea4337d785f 77
salco 17:095f670f9c14 78
salco 14:ca1a9230ba7f 79 m_regPortUse|=(1<< i);
salco 16:5ea4337d785f 80 debug(DEBUG_INITMODULE, "\n\r -Port use :%d", m_regPortUse);
salco 16:5ea4337d785f 81
salco 14:ca1a9230ba7f 82 templateModule->regA = adresse;
salco 16:5ea4337d785f 83 debug(DEBUG_INITMODULE, "\n\r -Adrr use :%d", adresse);
salco 16:5ea4337d785f 84
salco 10:7e6aeaebe1a2 85 templateModule->regB = (spiLowSpeed.get_demux()<<4)+(data[0]&0x0F);
salco 16:5ea4337d785f 86 templateModule->regB |= data[0];
salco 16:5ea4337d785f 87 debug(DEBUG_INITMODULE, "\n\r -regB use :%02X", templateModule->regB);
salco 16:5ea4337d785f 88
salco 10:7e6aeaebe1a2 89 templateModule->regC = data[1];
salco 16:5ea4337d785f 90 debug(DEBUG_INITMODULE, "\n\r -regC use :%02X", templateModule->regC);
salco 16:5ea4337d785f 91
salco 10:7e6aeaebe1a2 92 templateModule->regD = data[2];
salco 16:5ea4337d785f 93 debug(DEBUG_INITMODULE, "\n\r -regD use :%02X", templateModule->regD);
salco 16:5ea4337d785f 94
salco 10:7e6aeaebe1a2 95 switch(templateModule->regD >>6) {
salco 10:7e6aeaebe1a2 96 case 1://Capteur
salco 16:5ea4337d785f 97 debug(DEBUG_INITMODULE, "\n\r -Add Capteur");
salco 10:7e6aeaebe1a2 98 m_Memory.addCapteur(*templateModule);
salco 10:7e6aeaebe1a2 99 break;
salco 10:7e6aeaebe1a2 100
salco 10:7e6aeaebe1a2 101 case 2://Actionneur
salco 16:5ea4337d785f 102 debug(DEBUG_INITMODULE, "\n\r -Add Actionneur");
salco 10:7e6aeaebe1a2 103 m_Memory.addActioneur(*templateModule);
salco 10:7e6aeaebe1a2 104 break;
salco 10:7e6aeaebe1a2 105
salco 10:7e6aeaebe1a2 106
salco 10:7e6aeaebe1a2 107 case 3://Memoire
salco 16:5ea4337d785f 108 debug(DEBUG_INITMODULE, "\n\r -Add Memoire");
salco 10:7e6aeaebe1a2 109 m_Memory.addMemoire(*templateModule);
salco 10:7e6aeaebe1a2 110 break;
salco 14:ca1a9230ba7f 111
salco 14:ca1a9230ba7f 112 default:
salco 10:7e6aeaebe1a2 113 break;
salco 10:7e6aeaebe1a2 114 }
salco 10:7e6aeaebe1a2 115
salco 16:5ea4337d785f 116 if(flag[0] == SLAVE_NO_MORE_EMPTY_ADDR_MODULE)
salco 10:7e6aeaebe1a2 117 portUse=false;
salco 14:ca1a9230ba7f 118
salco 14:ca1a9230ba7f 119 }
salco 17:095f670f9c14 120 debug(" OUT");
salco 14:ca1a9230ba7f 121 } while(portUse);
salco 13:51bbdc349f20 122 debug(DEBUG_INITMODULE, "\n\r -Fin de boucle :%d", i);
salco 9:7295385f02b2 123 }
salco 9:7295385f02b2 124
salco 10:7e6aeaebe1a2 125 if(templateModule)
salco 14:ca1a9230ba7f 126 delete templateModule;
salco 14:ca1a9230ba7f 127
salco 12:bf44013497c8 128 debug(DEBUG_INITMODULE, "\n\rInit::Fin");
salco 8:e017e3d527d7 129 return true;
salco 14:ca1a9230ba7f 130 }
salco 14:ca1a9230ba7f 131
salco 14:ca1a9230ba7f 132 bool CtrlBridge::tryComPort(char portID)
salco 14:ca1a9230ba7f 133 {
salco 14:ca1a9230ba7f 134 if(portID <= (char)-1)portID=0;
salco 14:ca1a9230ba7f 135 if(portID > 15)portID=15;
salco 14:ca1a9230ba7f 136 string flag;
salco 14:ca1a9230ba7f 137 flag.clear();
salco 14:ca1a9230ba7f 138 string data;
salco 14:ca1a9230ba7f 139 data.clear();
salco 14:ca1a9230ba7f 140 return spiLowSpeed.send(portID,0,&flag,&data);
salco 14:ca1a9230ba7f 141 }
salco 14:ca1a9230ba7f 142
salco 15:91b3c572d9df 143 bool CtrlBridge::send( const unsigned char &adresse,string &flag, string &data)
salco 14:ca1a9230ba7f 144 {
salco 16:5ea4337d785f 145 debug(DEBUF_SEND, "\n\rSend::Debut");
salco 14:ca1a9230ba7f 146 bool result = false;
salco 14:ca1a9230ba7f 147 Module moduleRequested;
salco 14:ca1a9230ba7f 148 if(m_Memory.isAdresseValide(adresse,moduleRequested)) {
salco 14:ca1a9230ba7f 149
salco 16:5ea4337d785f 150 if(adresse&0x80)
salco 16:5ea4337d785f 151 result = spiLowSpeed.send(moduleRequested.regB>>4,adresse,&flag,&data);
salco 16:5ea4337d785f 152 else
salco 16:5ea4337d785f 153 result = spiHighSpeed.send(moduleRequested.regB>>4,adresse,&flag,&data);
salco 16:5ea4337d785f 154 //result = true;
salco 14:ca1a9230ba7f 155 }
salco 16:5ea4337d785f 156 debug(DEBUF_SEND, "\n\rSend::Fin");
salco 14:ca1a9230ba7f 157 return result;
salco 14:ca1a9230ba7f 158 }
salco 14:ca1a9230ba7f 159
salco 14:ca1a9230ba7f 160 string CtrlBridge::findModule(const char &peripheriqueID, const char &type, const char &sousType, const char &posSpatial)
salco 14:ca1a9230ba7f 161 {
salco 14:ca1a9230ba7f 162 debug(DEBUF_FINDMODULE, "\n\rFindModule::Debut");
salco 14:ca1a9230ba7f 163 string result;
salco 14:ca1a9230ba7f 164 int maxSize;
salco 14:ca1a9230ba7f 165 Module moduleScan;
salco 14:ca1a9230ba7f 166 bool goodModule;
salco 16:5ea4337d785f 167
salco 16:5ea4337d785f 168 debug(DEBUF_FINDMODULE, "\n\r -peripheriqueID: %02X",peripheriqueID);
salco 16:5ea4337d785f 169 debug(DEBUF_FINDMODULE, "\n\r -type: %02X",type);
salco 16:5ea4337d785f 170 debug(DEBUF_FINDMODULE, "\n\r -sousType: %02X",sousType);
salco 16:5ea4337d785f 171 debug(DEBUF_FINDMODULE, "\n\r -posSpatial: %02X",posSpatial);
salco 14:ca1a9230ba7f 172
salco 14:ca1a9230ba7f 173 debug(DEBUF_FINDMODULE, "\n\r -Debut scan Actioneur");
salco 14:ca1a9230ba7f 174 maxSize = m_Memory.getSizeActioneur();
salco 14:ca1a9230ba7f 175 goodModule = true;
salco 14:ca1a9230ba7f 176 moduleScan= m_Memory.firstActioneur();
salco 14:ca1a9230ba7f 177
salco 14:ca1a9230ba7f 178 for(int i=0; i < maxSize; i++) {
salco 14:ca1a9230ba7f 179 if((peripheriqueID != 0) && (peripheriqueID != moduleScan.regB>>4)) goodModule =false;
salco 14:ca1a9230ba7f 180 else if((type != 0) && (type != moduleScan.regD>>6)) goodModule =false;
salco 14:ca1a9230ba7f 181 else if((sousType != 0) && (sousType != (moduleScan.regD & 0x3F))) goodModule =false;
salco 14:ca1a9230ba7f 182 else if((posSpatial != 0) && (sousType != (moduleScan.regC & 0x3F))) goodModule =false;
salco 14:ca1a9230ba7f 183
salco 16:5ea4337d785f 184 if(goodModule){
salco 14:ca1a9230ba7f 185 result.append(1,moduleScan.regA);
salco 16:5ea4337d785f 186 debug(DEBUF_FINDMODULE, "\n\r -Find one!");
salco 16:5ea4337d785f 187 }
salco 14:ca1a9230ba7f 188 if((goodModule)&&(peripheriqueID != 0) && (peripheriqueID != moduleScan.regB>>4)) goodModule =false;
salco 14:ca1a9230ba7f 189
salco 14:ca1a9230ba7f 190 moduleScan= m_Memory.nextActioneur();
salco 14:ca1a9230ba7f 191 }
salco 14:ca1a9230ba7f 192 debug(DEBUF_FINDMODULE, "\n\r -Fin scan Actioneur");
salco 16:5ea4337d785f 193 //debug(DEBUF_FINDMODULE, "\n\r -Result size: %0i",result.size());
salco 14:ca1a9230ba7f 194 debug(DEBUF_FINDMODULE, "\n\r -Debut scan Capteur");
salco 14:ca1a9230ba7f 195
salco 14:ca1a9230ba7f 196 maxSize = m_Memory.getSizeCapteur();
salco 14:ca1a9230ba7f 197 goodModule = true;
salco 14:ca1a9230ba7f 198 moduleScan= m_Memory.firstCapteur();
salco 14:ca1a9230ba7f 199
salco 14:ca1a9230ba7f 200 for(int i=0; i < maxSize; i++) {
salco 14:ca1a9230ba7f 201 if((peripheriqueID != 0) && (peripheriqueID != moduleScan.regB>>4)) goodModule =false;
salco 14:ca1a9230ba7f 202 else if((type != 0) && (type != moduleScan.regD>>6)) goodModule =false;
salco 14:ca1a9230ba7f 203 else if((sousType != 0) && (sousType != (moduleScan.regD & 0x3F))) goodModule =false;
salco 14:ca1a9230ba7f 204 else if((posSpatial != 0) && (sousType != (moduleScan.regC & 0x3F))) goodModule =false;
salco 14:ca1a9230ba7f 205
salco 16:5ea4337d785f 206 if(goodModule){
salco 14:ca1a9230ba7f 207 result.append(1,moduleScan.regA);
salco 16:5ea4337d785f 208 debug(DEBUF_FINDMODULE, "\n\r -Find one!");
salco 16:5ea4337d785f 209 }
salco 14:ca1a9230ba7f 210 if((goodModule)&&(peripheriqueID != 0) && (peripheriqueID != moduleScan.regB>>4)) goodModule =false;
salco 14:ca1a9230ba7f 211
salco 14:ca1a9230ba7f 212 moduleScan= m_Memory.nextCapteur();
salco 14:ca1a9230ba7f 213 }
salco 14:ca1a9230ba7f 214 debug(DEBUF_FINDMODULE, "\n\r -Fin scan Capteur");
salco 16:5ea4337d785f 215 //debug(DEBUF_FINDMODULE, "\n\r -Result size: %0i",result.size());
salco 14:ca1a9230ba7f 216 debug(DEBUF_FINDMODULE, "\n\r -Debut scan Memoire");
salco 14:ca1a9230ba7f 217
salco 14:ca1a9230ba7f 218 maxSize = m_Memory.getSizeMemoire();
salco 14:ca1a9230ba7f 219 goodModule = true;
salco 14:ca1a9230ba7f 220 moduleScan= m_Memory.firstMemoire();
salco 14:ca1a9230ba7f 221
salco 14:ca1a9230ba7f 222 for(int i=0; i < maxSize; i++) {
salco 14:ca1a9230ba7f 223 if((peripheriqueID != 0) && (peripheriqueID != moduleScan.regB>>4)) goodModule =false;
salco 14:ca1a9230ba7f 224 else if((type != 0) && (type != moduleScan.regD>>6)) goodModule =false;
salco 14:ca1a9230ba7f 225 else if((sousType != 0) && (sousType != (moduleScan.regD & 0x3F))) goodModule =false;
salco 14:ca1a9230ba7f 226 else if((posSpatial != 0) && (sousType != (moduleScan.regC & 0x3F))) goodModule =false;
salco 14:ca1a9230ba7f 227
salco 16:5ea4337d785f 228 if(goodModule){
salco 14:ca1a9230ba7f 229 result.append(1,moduleScan.regA);
salco 16:5ea4337d785f 230 debug(DEBUF_FINDMODULE, "\n\r -Find one!");
salco 16:5ea4337d785f 231 }
salco 14:ca1a9230ba7f 232 if((goodModule)&&(peripheriqueID != 0) && (peripheriqueID != moduleScan.regB>>4)) goodModule =false;
salco 14:ca1a9230ba7f 233
salco 14:ca1a9230ba7f 234 moduleScan= m_Memory.nextMemoire();
salco 14:ca1a9230ba7f 235 }
salco 14:ca1a9230ba7f 236 debug(DEBUF_FINDMODULE, "\n\r -Fin scan Memoire");
salco 16:5ea4337d785f 237 // debug(DEBUF_FINDMODULE, "\n\r -Result size: %0i",result.size());
salco 14:ca1a9230ba7f 238 debug(DEBUF_FINDMODULE, "\n\rFindModule::Fin");
salco 14:ca1a9230ba7f 239 return result;
salco 14:ca1a9230ba7f 240 }
salco 14:ca1a9230ba7f 241
salco 14:ca1a9230ba7f 242 int CtrlBridge::size(const char &peripheriqueID, const char &type, const char &sousType, const char &posSpatial)
salco 14:ca1a9230ba7f 243 {
salco 14:ca1a9230ba7f 244 int result;
salco 14:ca1a9230ba7f 245 string templateString;
salco 14:ca1a9230ba7f 246
salco 14:ca1a9230ba7f 247 templateString = findModule(peripheriqueID,type,sousType,posSpatial);
salco 14:ca1a9230ba7f 248 result = templateString.size()-1;//pas sure si on met -1
salco 14:ca1a9230ba7f 249 return result;
salco 9:7295385f02b2 250 }