![](/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@10:7e6aeaebe1a2, 2015-03-19 (annotated)
- Committer:
- salco
- Date:
- Thu Mar 19 21:49:20 2015 +0000
- Revision:
- 10:7e6aeaebe1a2
- Parent:
- 9:7295385f02b2
- Child:
- 11:496453b45e25
l'init de Ctrl Bridge est faite reste a tester et a inclure les debug.
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 | 7:dcfd81d7f93f | 14 | : SPI(mosi,miso,sclk,NC), 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 | |
salco | 10:7e6aeaebe1a2 | 90 | string formatedDataSend; |
salco | 10:7e6aeaebe1a2 | 91 | string formatedDataReceive; |
salco | 10:7e6aeaebe1a2 | 92 | //int valueReceive=0; |
salco | 7:dcfd81d7f93f | 93 | //int CRC |
salco | 10:7e6aeaebe1a2 | 94 | |
salco | 10:7e6aeaebe1a2 | 95 | if(portID > (char)-1) { |
salco | 9:7295385f02b2 | 96 | m_demuxPos = portID; |
salco | 9:7295385f02b2 | 97 | change_demux(); |
salco | 10:7e6aeaebe1a2 | 98 | } |
salco | 10:7e6aeaebe1a2 | 99 | // Sync // |
salco | 10:7e6aeaebe1a2 | 100 | formatedDataSend.append(1,SYNC); |
salco | 10:7e6aeaebe1a2 | 101 | // Address // |
salco | 10:7e6aeaebe1a2 | 102 | formatedDataSend.append(1,adresseModule); |
salco | 10:7e6aeaebe1a2 | 103 | // PFB // |
salco | 10:7e6aeaebe1a2 | 104 | switch(flag->size()) { |
salco | 10:7e6aeaebe1a2 | 105 | case 1: |
salco | 10:7e6aeaebe1a2 | 106 | formatedDataSend.append(1,1<<6); |
salco | 10:7e6aeaebe1a2 | 107 | break; |
salco | 10:7e6aeaebe1a2 | 108 | |
salco | 10:7e6aeaebe1a2 | 109 | case 2: |
salco | 10:7e6aeaebe1a2 | 110 | formatedDataSend.append(1,2<<6); |
salco | 10:7e6aeaebe1a2 | 111 | break; |
salco | 10:7e6aeaebe1a2 | 112 | |
salco | 10:7e6aeaebe1a2 | 113 | case 3: |
salco | 10:7e6aeaebe1a2 | 114 | formatedDataSend.append(1,3<<6); |
salco | 10:7e6aeaebe1a2 | 115 | break; |
salco | 10:7e6aeaebe1a2 | 116 | |
salco | 10:7e6aeaebe1a2 | 117 | default: |
salco | 10:7e6aeaebe1a2 | 118 | formatedDataSend.append(1,0<<6); |
salco | 10:7e6aeaebe1a2 | 119 | break; |
salco | 10:7e6aeaebe1a2 | 120 | } |
salco | 10:7e6aeaebe1a2 | 121 | // gestion ACK/NAK |
salco | 10:7e6aeaebe1a2 | 122 | formatedDataSend.at(formatedDataSend.length()) |= (NOACK << 4); |
salco | 10:7e6aeaebe1a2 | 123 | // NDB // |
salco | 10:7e6aeaebe1a2 | 124 | switch(data->size()) { |
salco | 10:7e6aeaebe1a2 | 125 | case 1: |
salco | 10:7e6aeaebe1a2 | 126 | formatedDataSend.at(formatedDataSend.length()) |= 1; |
salco | 10:7e6aeaebe1a2 | 127 | break; |
salco | 10:7e6aeaebe1a2 | 128 | |
salco | 10:7e6aeaebe1a2 | 129 | case 2: |
salco | 10:7e6aeaebe1a2 | 130 | formatedDataSend.at(formatedDataSend.length()) |= 2; |
salco | 10:7e6aeaebe1a2 | 131 | break; |
salco | 10:7e6aeaebe1a2 | 132 | |
salco | 10:7e6aeaebe1a2 | 133 | case 3: |
salco | 10:7e6aeaebe1a2 | 134 | formatedDataSend.at(formatedDataSend.length()) |= 3; |
salco | 10:7e6aeaebe1a2 | 135 | break; |
salco | 10:7e6aeaebe1a2 | 136 | |
salco | 10:7e6aeaebe1a2 | 137 | default: |
salco | 10:7e6aeaebe1a2 | 138 | formatedDataSend.at(formatedDataSend.length()) |= 0; |
salco | 10:7e6aeaebe1a2 | 139 | break; |
salco | 10:7e6aeaebe1a2 | 140 | } |
salco | 10:7e6aeaebe1a2 | 141 | // flag // |
salco | 10:7e6aeaebe1a2 | 142 | if(flag->size() != 0) |
salco | 10:7e6aeaebe1a2 | 143 | formatedDataSend.append(*flag); |
salco | 10:7e6aeaebe1a2 | 144 | // data // |
salco | 10:7e6aeaebe1a2 | 145 | if(data->size() != 0) |
salco | 10:7e6aeaebe1a2 | 146 | formatedDataSend.append(*flag); |
salco | 10:7e6aeaebe1a2 | 147 | // CRC // |
salco | 10:7e6aeaebe1a2 | 148 | //Create CRC |
salco | 10:7e6aeaebe1a2 | 149 | //Send CRC |
salco | 10:7e6aeaebe1a2 | 150 | //Compare |
salco | 10:7e6aeaebe1a2 | 151 | |
salco | 10:7e6aeaebe1a2 | 152 | int tempValue=0; |
salco | 10:7e6aeaebe1a2 | 153 | //Send Data |
salco | 10:7e6aeaebe1a2 | 154 | tempValue = (formatedDataSend[0]<<8)+formatedDataSend[1]; |
salco | 10:7e6aeaebe1a2 | 155 | tempValue=write(tempValue); |
salco | 10:7e6aeaebe1a2 | 156 | if(tempValue == (formatedDataSend[0]<<8)+formatedDataSend[1]) { |
salco | 10:7e6aeaebe1a2 | 157 | formatedDataReceive.append(1,formatedDataSend[0]); |
salco | 10:7e6aeaebe1a2 | 158 | formatedDataReceive.append(1,formatedDataSend[1]); |
salco | 10:7e6aeaebe1a2 | 159 | |
salco | 10:7e6aeaebe1a2 | 160 | for (unsigned i=2; i<formatedDataSend.length(); ++i) { |
salco | 10:7e6aeaebe1a2 | 161 | tempValue = formatedDataSend[i]; |
salco | 10:7e6aeaebe1a2 | 162 | i++; |
salco | 10:7e6aeaebe1a2 | 163 | if(i<formatedDataSend.length()) |
salco | 10:7e6aeaebe1a2 | 164 | tempValue = (tempValue<<8) + formatedDataSend[i]; |
salco | 10:7e6aeaebe1a2 | 165 | |
salco | 10:7e6aeaebe1a2 | 166 | tempValue=write(tempValue); |
salco | 10:7e6aeaebe1a2 | 167 | formatedDataReceive.append(1,tempValue>>8); |
salco | 10:7e6aeaebe1a2 | 168 | formatedDataReceive.append(1,tempValue&0xFF); |
salco | 9:7295385f02b2 | 169 | } |
salco | 7:dcfd81d7f93f | 170 | |
salco | 10:7e6aeaebe1a2 | 171 | // Traitement de l'information // |
salco | 10:7e6aeaebe1a2 | 172 | tempValue=formatedDataReceive[2]; |
salco | 10:7e6aeaebe1a2 | 173 | string::iterator it=formatedDataReceive.begin()+3; |
salco | 10:7e6aeaebe1a2 | 174 | // flag // |
salco | 10:7e6aeaebe1a2 | 175 | flag->clear(); |
salco | 10:7e6aeaebe1a2 | 176 | switch(tempValue>>6) { |
salco | 10:7e6aeaebe1a2 | 177 | case 1: |
salco | 10:7e6aeaebe1a2 | 178 | flag->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 179 | it++; |
salco | 10:7e6aeaebe1a2 | 180 | break; |
salco | 7:dcfd81d7f93f | 181 | |
salco | 10:7e6aeaebe1a2 | 182 | case 2: |
salco | 10:7e6aeaebe1a2 | 183 | flag->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 184 | it++; |
salco | 10:7e6aeaebe1a2 | 185 | flag->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 186 | it++; |
salco | 10:7e6aeaebe1a2 | 187 | break; |
salco | 7:dcfd81d7f93f | 188 | |
salco | 10:7e6aeaebe1a2 | 189 | case 3: |
salco | 10:7e6aeaebe1a2 | 190 | flag->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 191 | it++; |
salco | 10:7e6aeaebe1a2 | 192 | flag->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 193 | it++; |
salco | 10:7e6aeaebe1a2 | 194 | flag->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 195 | it++; |
salco | 10:7e6aeaebe1a2 | 196 | break; |
salco | 7:dcfd81d7f93f | 197 | |
salco | 10:7e6aeaebe1a2 | 198 | /*default: |
salco | 10:7e6aeaebe1a2 | 199 | formatedDataSend.append(1,0<<6); |
salco | 10:7e6aeaebe1a2 | 200 | break;*/ |
salco | 10:7e6aeaebe1a2 | 201 | } |
salco | 10:7e6aeaebe1a2 | 202 | // ACK/NAK |
salco | 10:7e6aeaebe1a2 | 203 | // |
salco | 7:dcfd81d7f93f | 204 | |
salco | 10:7e6aeaebe1a2 | 205 | // NDB // |
salco | 10:7e6aeaebe1a2 | 206 | data->clear(); |
salco | 10:7e6aeaebe1a2 | 207 | switch(tempValue&0xFF) { |
salco | 10:7e6aeaebe1a2 | 208 | case 1: |
salco | 10:7e6aeaebe1a2 | 209 | data->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 210 | it++; |
salco | 10:7e6aeaebe1a2 | 211 | break; |
salco | 7:dcfd81d7f93f | 212 | |
salco | 10:7e6aeaebe1a2 | 213 | case 2: |
salco | 10:7e6aeaebe1a2 | 214 | data->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 215 | it++; |
salco | 10:7e6aeaebe1a2 | 216 | data->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 217 | it++; |
salco | 10:7e6aeaebe1a2 | 218 | break; |
salco | 10:7e6aeaebe1a2 | 219 | |
salco | 10:7e6aeaebe1a2 | 220 | case 3: |
salco | 10:7e6aeaebe1a2 | 221 | data->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 222 | it++; |
salco | 10:7e6aeaebe1a2 | 223 | data->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 224 | it++; |
salco | 10:7e6aeaebe1a2 | 225 | data->append(1,*it); |
salco | 10:7e6aeaebe1a2 | 226 | it++; |
salco | 10:7e6aeaebe1a2 | 227 | break; |
salco | 10:7e6aeaebe1a2 | 228 | |
salco | 10:7e6aeaebe1a2 | 229 | /*default: |
salco | 10:7e6aeaebe1a2 | 230 | |
salco | 10:7e6aeaebe1a2 | 231 | break;*/ |
salco | 7:dcfd81d7f93f | 232 | } |
salco | 10:7e6aeaebe1a2 | 233 | // CRC // |
salco | 10:7e6aeaebe1a2 | 234 | // |
salco | 10:7e6aeaebe1a2 | 235 | result=true; |
salco | 7:dcfd81d7f93f | 236 | } |
salco | 7:dcfd81d7f93f | 237 | return result; |
salco | 7:dcfd81d7f93f | 238 | } |