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:
Wed Apr 22 19:27:44 2015 +0000
Revision:
15:91b3c572d9df
Parent:
14:ca1a9230ba7f
Child:
16:5ea4337d785f
Voila la communication est authentifier des deux coter. Reste plus qu'a utiliser les bytes transporter dans cette communication.

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 14:ca1a9230ba7f 60 flag = Request_Init_Info;
salco 15:91b3c572d9df 61 adresse = m_Memory.getAdressDispo(0x80);//80 parce que cest le conecteur droit
salco 14:ca1a9230ba7f 62 data.clear();
salco 15:91b3c572d9df 63 data.append(4,1);
salco 14:ca1a9230ba7f 64 portUse = spiLowSpeed.send(i,adresse,&flag,&data);
salco 14:ca1a9230ba7f 65
salco 14:ca1a9230ba7f 66 if( portUse ) {
salco 14:ca1a9230ba7f 67 m_regPortUse|=(1<< i);
salco 14:ca1a9230ba7f 68
salco 14:ca1a9230ba7f 69 templateModule->regA = adresse;
salco 10:7e6aeaebe1a2 70 templateModule->regB = (spiLowSpeed.get_demux()<<4)+(data[0]&0x0F);
salco 10:7e6aeaebe1a2 71 templateModule->regC = data[1];
salco 10:7e6aeaebe1a2 72 templateModule->regD = data[2];
salco 10:7e6aeaebe1a2 73
salco 10:7e6aeaebe1a2 74 switch(templateModule->regD >>6) {
salco 10:7e6aeaebe1a2 75 case 1://Capteur
salco 10:7e6aeaebe1a2 76 m_Memory.addCapteur(*templateModule);
salco 10:7e6aeaebe1a2 77 break;
salco 10:7e6aeaebe1a2 78
salco 10:7e6aeaebe1a2 79 case 2://Actionneur
salco 10:7e6aeaebe1a2 80 m_Memory.addActioneur(*templateModule);
salco 10:7e6aeaebe1a2 81 break;
salco 10:7e6aeaebe1a2 82
salco 10:7e6aeaebe1a2 83
salco 10:7e6aeaebe1a2 84 case 3://Memoire
salco 10:7e6aeaebe1a2 85 m_Memory.addMemoire(*templateModule);
salco 10:7e6aeaebe1a2 86 break;
salco 14:ca1a9230ba7f 87
salco 14:ca1a9230ba7f 88 default:
salco 10:7e6aeaebe1a2 89 break;
salco 10:7e6aeaebe1a2 90 }
salco 10:7e6aeaebe1a2 91
salco 14:ca1a9230ba7f 92 if(flag[0] != CONTIEN_AUTRE_MODULE)
salco 10:7e6aeaebe1a2 93 portUse=false;
salco 14:ca1a9230ba7f 94
salco 14:ca1a9230ba7f 95 }
salco 14:ca1a9230ba7f 96 } while(portUse);
salco 13:51bbdc349f20 97 debug(DEBUG_INITMODULE, "\n\r -Fin de boucle :%d", i);
salco 9:7295385f02b2 98 }
salco 9:7295385f02b2 99
salco 10:7e6aeaebe1a2 100 if(templateModule)
salco 14:ca1a9230ba7f 101 delete templateModule;
salco 14:ca1a9230ba7f 102
salco 12:bf44013497c8 103 debug(DEBUG_INITMODULE, "\n\rInit::Fin");
salco 8:e017e3d527d7 104 return true;
salco 14:ca1a9230ba7f 105 }
salco 14:ca1a9230ba7f 106
salco 14:ca1a9230ba7f 107 bool CtrlBridge::tryComPort(char portID)
salco 14:ca1a9230ba7f 108 {
salco 14:ca1a9230ba7f 109 if(portID <= (char)-1)portID=0;
salco 14:ca1a9230ba7f 110 if(portID > 15)portID=15;
salco 14:ca1a9230ba7f 111 string flag;
salco 14:ca1a9230ba7f 112 flag.clear();
salco 14:ca1a9230ba7f 113 string data;
salco 14:ca1a9230ba7f 114 data.clear();
salco 14:ca1a9230ba7f 115 return spiLowSpeed.send(portID,0,&flag,&data);
salco 14:ca1a9230ba7f 116 }
salco 14:ca1a9230ba7f 117
salco 15:91b3c572d9df 118 bool CtrlBridge::send( const unsigned char &adresse,string &flag, string &data)
salco 14:ca1a9230ba7f 119 {
salco 14:ca1a9230ba7f 120 bool result = false;
salco 14:ca1a9230ba7f 121 Module moduleRequested;
salco 14:ca1a9230ba7f 122 if(m_Memory.isAdresseValide(adresse,moduleRequested)) {
salco 14:ca1a9230ba7f 123
salco 14:ca1a9230ba7f 124 if(adresse&0x80)spiLowSpeed.send(moduleRequested.regB>>4,adresse,&flag,&data);
salco 14:ca1a9230ba7f 125 else spiHighSpeed.send(moduleRequested.regB>>4,adresse,&flag,&data);
salco 14:ca1a9230ba7f 126 result = true;
salco 14:ca1a9230ba7f 127 }
salco 14:ca1a9230ba7f 128
salco 14:ca1a9230ba7f 129 return result;
salco 14:ca1a9230ba7f 130 }
salco 14:ca1a9230ba7f 131
salco 14:ca1a9230ba7f 132 string CtrlBridge::findModule(const char &peripheriqueID, const char &type, const char &sousType, const char &posSpatial)
salco 14:ca1a9230ba7f 133 {
salco 14:ca1a9230ba7f 134 debug(DEBUF_FINDMODULE, "\n\rFindModule::Debut");
salco 14:ca1a9230ba7f 135 string result;
salco 14:ca1a9230ba7f 136 int maxSize;
salco 14:ca1a9230ba7f 137 Module moduleScan;
salco 14:ca1a9230ba7f 138 bool goodModule;
salco 14:ca1a9230ba7f 139
salco 14:ca1a9230ba7f 140 debug(DEBUF_FINDMODULE, "\n\r -Debut scan Actioneur");
salco 14:ca1a9230ba7f 141 maxSize = m_Memory.getSizeActioneur();
salco 14:ca1a9230ba7f 142 goodModule = true;
salco 14:ca1a9230ba7f 143 moduleScan= m_Memory.firstActioneur();
salco 14:ca1a9230ba7f 144
salco 14:ca1a9230ba7f 145 for(int i=0; i < maxSize; i++) {
salco 14:ca1a9230ba7f 146 if((peripheriqueID != 0) && (peripheriqueID != moduleScan.regB>>4)) goodModule =false;
salco 14:ca1a9230ba7f 147 else if((type != 0) && (type != moduleScan.regD>>6)) goodModule =false;
salco 14:ca1a9230ba7f 148 else if((sousType != 0) && (sousType != (moduleScan.regD & 0x3F))) goodModule =false;
salco 14:ca1a9230ba7f 149 else if((posSpatial != 0) && (sousType != (moduleScan.regC & 0x3F))) goodModule =false;
salco 14:ca1a9230ba7f 150
salco 14:ca1a9230ba7f 151 if(goodModule)
salco 14:ca1a9230ba7f 152 result.append(1,moduleScan.regA);
salco 14:ca1a9230ba7f 153 if((goodModule)&&(peripheriqueID != 0) && (peripheriqueID != moduleScan.regB>>4)) goodModule =false;
salco 14:ca1a9230ba7f 154
salco 14:ca1a9230ba7f 155 moduleScan= m_Memory.nextActioneur();
salco 14:ca1a9230ba7f 156 }
salco 14:ca1a9230ba7f 157 debug(DEBUF_FINDMODULE, "\n\r -Fin scan Actioneur");
salco 14:ca1a9230ba7f 158 debug(DEBUF_FINDMODULE, "\n\r -Result size: %i",result.size());
salco 14:ca1a9230ba7f 159 debug(DEBUF_FINDMODULE, "\n\r -Debut scan Capteur");
salco 14:ca1a9230ba7f 160
salco 14:ca1a9230ba7f 161 maxSize = m_Memory.getSizeCapteur();
salco 14:ca1a9230ba7f 162 goodModule = true;
salco 14:ca1a9230ba7f 163 moduleScan= m_Memory.firstCapteur();
salco 14:ca1a9230ba7f 164
salco 14:ca1a9230ba7f 165 for(int i=0; i < maxSize; i++) {
salco 14:ca1a9230ba7f 166 if((peripheriqueID != 0) && (peripheriqueID != moduleScan.regB>>4)) goodModule =false;
salco 14:ca1a9230ba7f 167 else if((type != 0) && (type != moduleScan.regD>>6)) goodModule =false;
salco 14:ca1a9230ba7f 168 else if((sousType != 0) && (sousType != (moduleScan.regD & 0x3F))) goodModule =false;
salco 14:ca1a9230ba7f 169 else if((posSpatial != 0) && (sousType != (moduleScan.regC & 0x3F))) goodModule =false;
salco 14:ca1a9230ba7f 170
salco 14:ca1a9230ba7f 171 if(goodModule)
salco 14:ca1a9230ba7f 172 result.append(1,moduleScan.regA);
salco 14:ca1a9230ba7f 173 if((goodModule)&&(peripheriqueID != 0) && (peripheriqueID != moduleScan.regB>>4)) goodModule =false;
salco 14:ca1a9230ba7f 174
salco 14:ca1a9230ba7f 175 moduleScan= m_Memory.nextCapteur();
salco 14:ca1a9230ba7f 176 }
salco 14:ca1a9230ba7f 177 debug(DEBUF_FINDMODULE, "\n\r -Fin scan Capteur");
salco 14:ca1a9230ba7f 178 debug(DEBUF_FINDMODULE, "\n\r -Result size: %i",result.size());
salco 14:ca1a9230ba7f 179 debug(DEBUF_FINDMODULE, "\n\r -Debut scan Memoire");
salco 14:ca1a9230ba7f 180
salco 14:ca1a9230ba7f 181 maxSize = m_Memory.getSizeMemoire();
salco 14:ca1a9230ba7f 182 goodModule = true;
salco 14:ca1a9230ba7f 183 moduleScan= m_Memory.firstMemoire();
salco 14:ca1a9230ba7f 184
salco 14:ca1a9230ba7f 185 for(int i=0; i < maxSize; i++) {
salco 14:ca1a9230ba7f 186 if((peripheriqueID != 0) && (peripheriqueID != moduleScan.regB>>4)) goodModule =false;
salco 14:ca1a9230ba7f 187 else if((type != 0) && (type != moduleScan.regD>>6)) goodModule =false;
salco 14:ca1a9230ba7f 188 else if((sousType != 0) && (sousType != (moduleScan.regD & 0x3F))) goodModule =false;
salco 14:ca1a9230ba7f 189 else if((posSpatial != 0) && (sousType != (moduleScan.regC & 0x3F))) goodModule =false;
salco 14:ca1a9230ba7f 190
salco 14:ca1a9230ba7f 191 if(goodModule)
salco 14:ca1a9230ba7f 192 result.append(1,moduleScan.regA);
salco 14:ca1a9230ba7f 193 if((goodModule)&&(peripheriqueID != 0) && (peripheriqueID != moduleScan.regB>>4)) goodModule =false;
salco 14:ca1a9230ba7f 194
salco 14:ca1a9230ba7f 195 moduleScan= m_Memory.nextMemoire();
salco 14:ca1a9230ba7f 196 }
salco 14:ca1a9230ba7f 197 debug(DEBUF_FINDMODULE, "\n\r -Fin scan Memoire");
salco 14:ca1a9230ba7f 198 debug(DEBUF_FINDMODULE, "\n\r -Result size: %i",result.size());
salco 14:ca1a9230ba7f 199 debug(DEBUF_FINDMODULE, "\n\rFindModule::Fin");
salco 14:ca1a9230ba7f 200 return result;
salco 14:ca1a9230ba7f 201 }
salco 14:ca1a9230ba7f 202
salco 14:ca1a9230ba7f 203 int CtrlBridge::size(const char &peripheriqueID, const char &type, const char &sousType, const char &posSpatial)
salco 14:ca1a9230ba7f 204 {
salco 14:ca1a9230ba7f 205 int result;
salco 14:ca1a9230ba7f 206 string templateString;
salco 14:ca1a9230ba7f 207
salco 14:ca1a9230ba7f 208 templateString = findModule(peripheriqueID,type,sousType,posSpatial);
salco 14:ca1a9230ba7f 209 result = templateString.size()-1;//pas sure si on met -1
salco 14:ca1a9230ba7f 210 return result;
salco 9:7295385f02b2 211 }