![](/media/cache/profiles/4b0986230d9d7aded7f0c24033d221d4.jpg.50x50_q85.jpg)
Programme de contrôle de l'octopode 4DOF, Theraphosa-Salconi.
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
source/ComSpi.cpp@12:bf44013497c8, 2015-03-20 (annotated)
- Committer:
- salco
- Date:
- Fri Mar 20 14:25:23 2015 +0000
- Revision:
- 12:bf44013497c8
- Parent:
- 11:496453b45e25
- Child:
- 13:51bbdc349f20
La com a l'aire fonctionelle et le debug est operationelle.
Who changed what in which revision?
User | Revision | Line number | New 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 | 10:7e6aeaebe1a2 | 175 | //Create CRC |
salco | 10:7e6aeaebe1a2 | 176 | //Send CRC |
salco | 10:7e6aeaebe1a2 | 177 | //Compare |
salco | 10:7e6aeaebe1a2 | 178 | |
salco | 10:7e6aeaebe1a2 | 179 | int tempValue=0; |
salco | 10:7e6aeaebe1a2 | 180 | //Send Data |
salco | 11:496453b45e25 | 181 | debug(DEBUG_SEND, "\n\r -Debut Send Data. "); |
salco | 12:bf44013497c8 | 182 | debug(DEBUG_SEND, "\n\r -Send: "); |
salco | 12:bf44013497c8 | 183 | for (unsigned i=0; i<formatedDataSend.length(); ++i) { |
salco | 12:bf44013497c8 | 184 | debug(DEBUG_SEND, "%i,",formatedDataSend.at(i)); |
salco | 12:bf44013497c8 | 185 | } |
salco | 12:bf44013497c8 | 186 | |
salco | 10:7e6aeaebe1a2 | 187 | tempValue = (formatedDataSend[0]<<8)+formatedDataSend[1]; |
salco | 10:7e6aeaebe1a2 | 188 | tempValue=write(tempValue); |
salco | 12:bf44013497c8 | 189 | |
salco | 12:bf44013497c8 | 190 | debug(DEBUG_SEND, "\n\r -Fin Send Data. "); |
salco | 12:bf44013497c8 | 191 | |
salco | 12:bf44013497c8 | 192 | // Envoie si liker // |
salco | 12:bf44013497c8 | 193 | debug(DEBUG_SEND, "\n\r -Debut Traitement de l'information. "); |
salco | 12:bf44013497c8 | 194 | debug(DEBUG_SEND, "\n\r -Receive: "); |
salco | 12:bf44013497c8 | 195 | if(tempValue == (formatedDataSend[0]<<8)+formatedDataSend[1]) {// tempValue ==(Sync+(PFB+ACK+NDB)) |
salco | 10:7e6aeaebe1a2 | 196 | formatedDataReceive.append(1,formatedDataSend[0]); |
salco | 10:7e6aeaebe1a2 | 197 | formatedDataReceive.append(1,formatedDataSend[1]); |
salco | 10:7e6aeaebe1a2 | 198 | |
salco | 10:7e6aeaebe1a2 | 199 | for (unsigned i=2; i<formatedDataSend.length(); ++i) { |
salco | 10:7e6aeaebe1a2 | 200 | tempValue = formatedDataSend[i]; |
salco | 10:7e6aeaebe1a2 | 201 | i++; |
salco | 12:bf44013497c8 | 202 | if(i<formatedDataSend.length()) { |
salco | 10:7e6aeaebe1a2 | 203 | tempValue = (tempValue<<8) + formatedDataSend[i]; |
salco | 12:bf44013497c8 | 204 | } |
salco | 10:7e6aeaebe1a2 | 205 | tempValue=write(tempValue); |
salco | 10:7e6aeaebe1a2 | 206 | formatedDataReceive.append(1,tempValue>>8); |
salco | 10:7e6aeaebe1a2 | 207 | formatedDataReceive.append(1,tempValue&0xFF); |
salco | 9:7295385f02b2 | 208 | } |
salco | 12:bf44013497c8 | 209 | |
salco | 12:bf44013497c8 | 210 | |
salco | 12:bf44013497c8 | 211 | |
salco | 10:7e6aeaebe1a2 | 212 | // Traitement de l'information // |
salco | 12:bf44013497c8 | 213 | //debug(DEBUG_SEND, "\n\r -Debut Traitement de l'information. "); |
salco | 12:bf44013497c8 | 214 | //debug(DEBUG_SEND, "\n\r -Send: "); |
salco | 12:bf44013497c8 | 215 | for (unsigned i=0; i<formatedDataReceive.length(); ++i) { |
salco | 12:bf44013497c8 | 216 | debug(DEBUG_SEND, "%i,",formatedDataReceive.at(i)); |
salco | 12:bf44013497c8 | 217 | } |
salco | 12:bf44013497c8 | 218 | |
salco | 10:7e6aeaebe1a2 | 219 | tempValue=formatedDataReceive[2]; |
salco | 10:7e6aeaebe1a2 | 220 | string::iterator it=formatedDataReceive.begin()+3; |
salco | 12:bf44013497c8 | 221 | |
salco | 10:7e6aeaebe1a2 | 222 | // flag // |
salco | 10:7e6aeaebe1a2 | 223 | flag->clear(); |
salco | 10:7e6aeaebe1a2 | 224 | switch(tempValue>>6) { |
salco | 10:7e6aeaebe1a2 | 225 | case 1: |
salco | 10:7e6aeaebe1a2 | 226 | flag->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 227 | it++; |
salco | 10:7e6aeaebe1a2 | 228 | break; |
salco | 7:dcfd81d7f93f | 229 | |
salco | 10:7e6aeaebe1a2 | 230 | case 2: |
salco | 10:7e6aeaebe1a2 | 231 | flag->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 232 | it++; |
salco | 10:7e6aeaebe1a2 | 233 | flag->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 234 | it++; |
salco | 10:7e6aeaebe1a2 | 235 | break; |
salco | 7:dcfd81d7f93f | 236 | |
salco | 10:7e6aeaebe1a2 | 237 | case 3: |
salco | 10:7e6aeaebe1a2 | 238 | flag->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 239 | it++; |
salco | 10:7e6aeaebe1a2 | 240 | flag->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 241 | it++; |
salco | 10:7e6aeaebe1a2 | 242 | flag->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 243 | it++; |
salco | 10:7e6aeaebe1a2 | 244 | break; |
salco | 7:dcfd81d7f93f | 245 | |
salco | 10:7e6aeaebe1a2 | 246 | /*default: |
salco | 10:7e6aeaebe1a2 | 247 | formatedDataSend.append(1,0<<6); |
salco | 10:7e6aeaebe1a2 | 248 | break;*/ |
salco | 10:7e6aeaebe1a2 | 249 | } |
salco | 12:bf44013497c8 | 250 | |
salco | 10:7e6aeaebe1a2 | 251 | // ACK/NAK |
salco | 10:7e6aeaebe1a2 | 252 | // |
salco | 7:dcfd81d7f93f | 253 | |
salco | 10:7e6aeaebe1a2 | 254 | // NDB // |
salco | 10:7e6aeaebe1a2 | 255 | data->clear(); |
salco | 10:7e6aeaebe1a2 | 256 | switch(tempValue&0xFF) { |
salco | 10:7e6aeaebe1a2 | 257 | case 1: |
salco | 10:7e6aeaebe1a2 | 258 | data->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 259 | it++; |
salco | 10:7e6aeaebe1a2 | 260 | break; |
salco | 7:dcfd81d7f93f | 261 | |
salco | 10:7e6aeaebe1a2 | 262 | case 2: |
salco | 10:7e6aeaebe1a2 | 263 | data->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 264 | it++; |
salco | 10:7e6aeaebe1a2 | 265 | data->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 266 | it++; |
salco | 10:7e6aeaebe1a2 | 267 | break; |
salco | 10:7e6aeaebe1a2 | 268 | |
salco | 10:7e6aeaebe1a2 | 269 | case 3: |
salco | 10:7e6aeaebe1a2 | 270 | data->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 271 | it++; |
salco | 10:7e6aeaebe1a2 | 272 | data->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 273 | it++; |
salco | 10:7e6aeaebe1a2 | 274 | data->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 275 | it++; |
salco | 10:7e6aeaebe1a2 | 276 | break; |
salco | 10:7e6aeaebe1a2 | 277 | |
salco | 10:7e6aeaebe1a2 | 278 | /*default: |
salco | 10:7e6aeaebe1a2 | 279 | |
salco | 10:7e6aeaebe1a2 | 280 | break;*/ |
salco | 7:dcfd81d7f93f | 281 | } |
salco | 12:bf44013497c8 | 282 | |
salco | 10:7e6aeaebe1a2 | 283 | // CRC // |
salco | 10:7e6aeaebe1a2 | 284 | // |
salco | 12:bf44013497c8 | 285 | |
salco | 10:7e6aeaebe1a2 | 286 | result=true; |
salco | 7:dcfd81d7f93f | 287 | } |
salco | 12:bf44013497c8 | 288 | |
salco | 12:bf44013497c8 | 289 | debug(DEBUG_SEND, "\n\r -Fin Traitement de l'information. "); |
salco | 11:496453b45e25 | 290 | debug(DEBUG_SEND, "\n\r -Fin du send. "); |
salco | 7:dcfd81d7f93f | 291 | return result; |
salco | 7:dcfd81d7f93f | 292 | } |