@@ -105,21 +105,167 void GR_ESB_bridge::setVirtualLink(qint3 | |||
|
105 | 105 | |
|
106 | 106 | unsigned int GR_ESB_bridge::Write(unsigned int *Value, unsigned int count, unsigned int address) |
|
107 | 107 | { |
|
108 | // TODO write ME! | |
|
109 | Q_UNUSED(count) | |
|
110 | Q_UNUSED(Value) | |
|
111 | Q_UNUSED(address) | |
|
112 | return 0; | |
|
108 | char writeBuffer[RMAP_WRITE_PACKET_MIN_SZ((RMAP_MAX_XFER_SIZE*4))]; | |
|
109 | char *RMAPAckBuff; | |
|
110 | int transactionID = 0; | |
|
111 | int written=0; | |
|
112 | SocExplorerEngine::message(this->plugin,"Enter Write function",2); | |
|
113 | QProgressBar* progress=NULL; | |
|
114 | SocExplorerAutoProgressBar autopb; | |
|
115 | if(count>RMAP_MAX_XFER_SIZE) | |
|
116 | { | |
|
117 | progress= SocExplorerEngine::getProgressBar("Writing on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count); | |
|
118 | autopb.setProgressBar(progress); | |
|
119 | } | |
|
120 | //Quite stupide loop, I guess that I always get the number of byte I asked for! | |
|
121 | while(count>=RMAP_MAX_XFER_SIZE) | |
|
122 | { | |
|
123 | for(int i=0;i<(RMAP_MAX_XFER_SIZE);i++) | |
|
124 | { | |
|
125 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+0] = (char)(((unsigned int)Value[i+written]>>24)&0xFF); | |
|
126 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>16)&0xFF); | |
|
127 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>8)&0xFF); | |
|
128 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written])&0xFF); | |
|
129 | } | |
|
130 | transactionID=manager->getRMAPtransactionID(); | |
|
131 | SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2); | |
|
132 | RMAP_build_tx_request_header( | |
|
133 | this->manager->destinationLogicalAddress, | |
|
134 | this->manager->destinationKey, | |
|
135 | this->manager->sourceLogicalAddress, | |
|
136 | transactionID, | |
|
137 | address+(written*4), | |
|
138 | RMAP_MAX_XFER_SIZE*4, | |
|
139 | writeBuffer); | |
|
140 | manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(RMAP_MAX_XFER_SIZE*4)); | |
|
141 | manager->getRMAPanswer(transactionID,&RMAPAckBuff); | |
|
142 | free(RMAPAckBuff); | |
|
143 | written+=RMAP_MAX_XFER_SIZE; | |
|
144 | count-=RMAP_MAX_XFER_SIZE; | |
|
145 | progress->setValue(written); | |
|
146 | qApp->processEvents(); | |
|
147 | } | |
|
148 | if(count>0) | |
|
149 | { | |
|
150 | for(int i=0;i<((int)count);i++) | |
|
151 | { | |
|
152 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+0] = (char)(((unsigned int)Value[i+written]>>24)&0xFF); | |
|
153 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>16)&0xFF); | |
|
154 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>8)&0xFF); | |
|
155 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written])&0xFF); | |
|
156 | } | |
|
157 | transactionID=manager->getRMAPtransactionID(); | |
|
158 | SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2); | |
|
159 | RMAP_build_tx_request_header( | |
|
160 | this->manager->destinationLogicalAddress, | |
|
161 | this->manager->destinationKey, | |
|
162 | this->manager->sourceLogicalAddress, | |
|
163 | transactionID, | |
|
164 | address+(written*4), | |
|
165 | count*4, | |
|
166 | writeBuffer); | |
|
167 | manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(count*4)); | |
|
168 | manager->getRMAPanswer(transactionID,&RMAPAckBuff); | |
|
169 | free(RMAPAckBuff); | |
|
170 | written+=count; | |
|
171 | if(progress!=NULL) | |
|
172 | { | |
|
173 | progress->setValue(written); | |
|
174 | qApp->processEvents(); | |
|
175 | } | |
|
176 | } | |
|
177 | return written; | |
|
113 | 178 | } |
|
114 | 179 | |
|
115 | 180 | unsigned int GR_ESB_bridge::Read(unsigned int *Value, unsigned int count, unsigned int address) |
|
116 | 181 | { |
|
117 | // TODO write ME! | |
|
118 | Q_UNUSED(Value) | |
|
119 | Q_UNUSED(count) | |
|
120 | Q_UNUSED(address) | |
|
182 | char requestBuffer[RMAP_READ_HEADER_MIN_SZ]; | |
|
183 | char* RMAP_AnswerBuffer; | |
|
184 | requestBuffer[0]=this->manager->linkNumber;//Link number | |
|
185 | int transactionID = 0; | |
|
186 | int read=0; | |
|
187 | QProgressBar* progress=NULL; | |
|
188 | SocExplorerAutoProgressBar autopb; | |
|
189 | if(count>RMAP_MAX_XFER_SIZE) | |
|
190 | { | |
|
191 | progress= SocExplorerEngine::getProgressBar("Reading on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count); | |
|
192 | autopb.setProgressBar(progress); | |
|
193 | } | |
|
194 | SocExplorerEngine::message(this->plugin,QString("Enter read function, count=%1, RMAP_MAX_XFER_SIZE=%2").arg(count).arg(RMAP_MAX_XFER_SIZE),2); | |
|
195 | ||
|
196 | //Quite stupide loop, I guess that I always get the number of byte I asked for! | |
|
197 | while((int)count>=(int)RMAP_MAX_XFER_SIZE) | |
|
198 | { | |
|
199 | transactionID = manager->getRMAPtransactionID(); | |
|
200 | SocExplorerEngine::message(this->plugin,QString("New transactionID:%1").arg(transactionID),2); | |
|
201 | RMAP_build_rx_request_header( | |
|
202 | this->manager->destinationLogicalAddress, | |
|
203 | this->manager->destinationKey, | |
|
204 | this->manager->sourceLogicalAddress, | |
|
205 | transactionID, | |
|
206 | address+(read*4), | |
|
207 | RMAP_MAX_XFER_SIZE*4, | |
|
208 | requestBuffer); | |
|
209 | manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ); | |
|
210 | int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer); | |
|
211 | if(len==-1) | |
|
212 | { | |
|
213 | this->toggleBridgeConnection(); | |
|
121 | 214 | return 0; |
|
122 | 215 | } |
|
216 | for(int i=0;i<((len-13)/4);i++) | |
|
217 | { | |
|
218 | Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]); | |
|
219 | Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13])); | |
|
220 | Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14])); | |
|
221 | Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15])); | |
|
222 | } | |
|
223 | free(RMAP_AnswerBuffer); | |
|
224 | read+=RMAP_MAX_XFER_SIZE; | |
|
225 | count-=RMAP_MAX_XFER_SIZE; | |
|
226 | progress->setValue(read); | |
|
227 | qApp->processEvents(); | |
|
228 | } | |
|
229 | if((int)count>0) | |
|
230 | { | |
|
231 | transactionID = manager->getRMAPtransactionID(); | |
|
232 | SocExplorerEngine::message(this->plugin,QString("New transactionID: %1").arg(transactionID),2); | |
|
233 | SocExplorerEngine::message(this->plugin,QString("Building request with:"),2); | |
|
234 | SocExplorerEngine::message(this->plugin,QString("Address = %1").arg(address+(read*4),8,16),2); | |
|
235 | SocExplorerEngine::message(this->plugin,QString("Size = %1").arg(count*4),2); | |
|
236 | SocExplorerEngine::message(this->plugin,QString("Size + 13 = %1").arg((count*4)+13),2); | |
|
237 | RMAP_build_rx_request_header( | |
|
238 | this->manager->destinationLogicalAddress, | |
|
239 | this->manager->destinationKey, | |
|
240 | this->manager->sourceLogicalAddress, | |
|
241 | transactionID, | |
|
242 | address+(read*4), | |
|
243 | count*4, | |
|
244 | requestBuffer); | |
|
245 | manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ); | |
|
246 | int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer); | |
|
247 | if(len==-1) | |
|
248 | { | |
|
249 | this->toggleBridgeConnection(); | |
|
250 | return 0; | |
|
251 | } | |
|
252 | for(int i=0;i<((len-13)/4);i++) | |
|
253 | { | |
|
254 | Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]); | |
|
255 | Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13])); | |
|
256 | Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14])); | |
|
257 | Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15])); | |
|
258 | } | |
|
259 | free(RMAP_AnswerBuffer); | |
|
260 | read+=count; | |
|
261 | if(progress!=NULL) | |
|
262 | { | |
|
263 | progress->setValue(read); | |
|
264 | qApp->processEvents(); | |
|
265 | } | |
|
266 | } | |
|
267 | return read; | |
|
268 | } | |
|
123 | 269 | |
|
124 | 270 | int GR_ESB_bridge::pushRMAPPacket(char *packet, int size) |
|
125 | 271 | { |
@@ -128,34 +274,65 int GR_ESB_bridge::pushRMAPPacket(char * | |||
|
128 | 274 | |
|
129 | 275 | |
|
130 | 276 | GR_ESB_Manager::GR_ESB_Manager(socexplorerplugin *plugin, QObject *parent) |
|
131 | :QThread((QObject*)parent) | |
|
277 | :abstractSpwManager(plugin, parent) | |
|
132 | 278 | { |
|
133 | 279 | this->Read_soc = new QTcpSocket(this); |
|
134 | 280 | this->Write_soc = new QTcpSocket(this); |
|
135 | this->RMAPtimeout = 2000; | |
|
136 | this->handleMutex = new QMutex(QMutex::NonRecursive); | |
|
137 | this->RMAP_AnswersSem = new QSemaphore(0); | |
|
138 | this->RMAP_AnswersMtx=new QMutex(QMutex::Recursive); | |
|
139 | this->RMAP_pending_transaction_IDsMtx=new QMutex(QMutex::Recursive); | |
|
140 | this->plugin = plugin; | |
|
141 | connected = false; | |
|
142 | this->moveToThread(this); | |
|
143 | 281 | } |
|
144 | 282 | |
|
145 | 283 | GR_ESB_Manager::~GR_ESB_Manager() |
|
146 | 284 | { |
|
147 | ||
|
148 | 285 | } |
|
149 | 286 | |
|
150 | 287 | void GR_ESB_Manager::run() |
|
151 | 288 | { |
|
289 | char buffer[(RMAP_MAX_XFER_SIZE*4)+50]; | |
|
152 | 290 | SocExplorerEngine::message(this->plugin,"Starting GRESB pooling thread",1); |
|
153 | 291 | while (!this->isInterruptionRequested()) |
|
154 | 292 | { |
|
155 | 293 | if(this->connected) |
|
156 | 294 | { |
|
157 | 295 | handleMutex->lock(); |
|
158 |
SocExplorerEngine::message(this->plugin,"Looking for new RMAP packets", |
|
|
296 | SocExplorerEngine::message(this->plugin,"Looking for new RMAP packets",5); | |
|
297 | if(Read_soc->waitForReadyRead(100)) | |
|
298 | { | |
|
299 | QByteArray data = Read_soc->readAll(); | |
|
300 | int PacketLen= ((int)data.at(2)& 0x0FF) + (((int)data.at(3)& 0x0FF)<<8) + (((int)data.at(4)& 0x0FF)<<16); | |
|
301 | if(data[1]==(char)SPW_PROTO_ID_RMAP) //RMAP packet | |
|
302 | { | |
|
303 | RMAP_Answer* packet; | |
|
304 | SocExplorerEngine::message(this->plugin,"Got RMAP packet",2); | |
|
305 | SocExplorerEngine::message(this->plugin,QString("Rmap packet size %1").arg(PacketLen),2); | |
|
306 | char* packetbuffer = (char*)malloc(PacketLen); | |
|
307 | memcpy(packetbuffer,data.data(),PacketLen); | |
|
308 | this->handleMutex->unlock(); | |
|
309 | if(PacketLen==8) | |
|
310 | { | |
|
311 | packet=new RMAP_Answer(RMAP_get_transactionID(buffer),packetbuffer,PacketLen); | |
|
312 | } | |
|
313 | else | |
|
314 | { | |
|
315 | packet=new RMAP_Answer(RMAP_get_transactionID(buffer+1),packetbuffer,PacketLen); | |
|
316 | } | |
|
317 | RMAP_AnswersMtx->lock(); | |
|
318 | RMAP_Answers.append(packet); | |
|
319 | RMAP_AnswersMtx->unlock(); | |
|
320 | RMAP_AnswersSem->release(); | |
|
321 | } | |
|
322 | else //any non-rmap packet will be pushed to the network | |
|
323 | { | |
|
324 | char* packetbuffer = (char*)malloc(PacketLen); | |
|
325 | memcpy(packetbuffer,data.data(),PacketLen); | |
|
326 | emit emitPacket(packetbuffer,PacketLen); | |
|
327 | this->handleMutex->unlock(); | |
|
328 | SocExplorerEngine::message(this->plugin,"Got SPW packet",2); | |
|
329 | } | |
|
330 | ||
|
331 | } | |
|
332 | else | |
|
333 | { | |
|
334 | handleMutex->unlock(); | |
|
335 | } | |
|
159 | 336 | |
|
160 | 337 | } |
|
161 | 338 | else |
@@ -212,31 +389,43 bool GR_ESB_Manager::disconnectBridge() | |||
|
212 | 389 | return true; |
|
213 | 390 | } |
|
214 | 391 | |
|
215 | int GR_ESB_Manager::getRMAPtransactionID() | |
|
216 | { | |
|
217 | // TODO write ME! | |
|
218 | return -1; | |
|
219 | } | |
|
220 | ||
|
221 | int GR_ESB_Manager::getRMAPanswer(int transactionID, char **buffer) | |
|
222 | { | |
|
223 | // TODO write ME! | |
|
224 | Q_UNUSED(transactionID) | |
|
225 | Q_UNUSED(buffer) | |
|
226 | return -1; | |
|
227 | } | |
|
228 | 392 | |
|
229 | 393 | bool GR_ESB_Manager::sendPacket(char *packet, int size) |
|
230 | 394 | { |
|
231 | // TODO write ME! | |
|
232 | Q_UNUSED(packet) | |
|
233 | Q_UNUSED(size) | |
|
395 | bool result = false; | |
|
396 | char protocoleIdentifier; | |
|
397 | SocExplorerEngine::message(this->plugin,"Sending SPW packet",2); | |
|
398 | if(Q_UNLIKELY(this->Write_soc->state()!=QAbstractSocket::ConnectedState)) | |
|
399 | { | |
|
400 | SocExplorerEngine::message(this->plugin,"Socket closed",2); | |
|
401 | //TODO handle disconnection | |
|
402 | } | |
|
403 | char* SPWpacket = (char*)malloc(size+4); | |
|
404 | if(SPWpacket!=NULL) | |
|
405 | { | |
|
406 | SPWpacket[0]=0; //Protocol = spw | |
|
407 | memcpy(SPWpacket+4,packet,size); | |
|
408 | SPWpacket[1]=size & 0x0FF; | |
|
409 | SPWpacket[2]=(size>>8) & 0x0FF; | |
|
410 | SPWpacket[3]=(size>>16) & 0x0FF; | |
|
411 | } | |
|
412 | this->handleMutex->lock(); | |
|
413 | result = ((size+4) == this->Write_soc->write(SPWpacket,size+4)); | |
|
414 | this->handleMutex->unlock(); | |
|
415 | if (Q_UNLIKELY(!result)) | |
|
416 | { | |
|
417 | SocExplorerEngine::message(this->plugin,"ERR sending the READ command ",2); | |
|
234 | 418 | return false; |
|
235 | 419 | } |
|
420 | else | |
|
421 | { | |
|
422 | emit bytesTransmittedToSpw( size-1 ); // -1 is for removing the first bytes added to the packet to route to the right link | |
|
423 | // read the protocole identifier | |
|
424 | protocoleIdentifier = packet[2]; | |
|
425 | if (protocoleIdentifier == SPW_PROTO_ID_CCSDS) | |
|
426 | emit ccsdsPacketTransmittedToSpw(); | |
|
427 | SocExplorerEngine::message(this->plugin,"Packet sent",2); | |
|
428 | } | |
|
429 | return true; | |
|
430 | } | |
|
236 | 431 | |
|
237 | void GR_ESB_Manager::pushRmapPacket(char *packet, int len) | |
|
238 | { | |
|
239 | // TODO write ME! | |
|
240 | Q_UNUSED(packet) | |
|
241 | Q_UNUSED(len) | |
|
242 | } |
@@ -24,7 +24,7 const struct gresb_Conf_str gresb_Conf[] | |||
|
24 | 24 | }; |
|
25 | 25 | |
|
26 | 26 | |
|
27 |
class GR_ESB_Manager: public |
|
|
27 | class GR_ESB_Manager: public abstractSpwManager | |
|
28 | 28 | { |
|
29 | 29 | Q_OBJECT |
|
30 | 30 | public: |
@@ -33,28 +33,19 public: | |||
|
33 | 33 | void run(); |
|
34 | 34 | bool connectBridge(); |
|
35 | 35 | bool disconnectBridge(); |
|
36 | int getRMAPtransactionID(); | |
|
37 | int getRMAPanswer(int transactionID,char** buffer); | |
|
38 | 36 | bool sendPacket(char* packet,int size); |
|
39 | 37 | |
|
40 | 38 | signals: |
|
41 | 39 | void emitPacket(char* packet,int size); |
|
42 | 40 | private: |
|
43 | QMutex* handleMutex,*RMAP_AnswersMtx,*RMAP_pending_transaction_IDsMtx; | |
|
44 | QSemaphore* RMAP_AnswersSem; | |
|
45 | 41 | void pushRmapPacket(char* packet,int len); |
|
46 | socexplorerplugin* plugin; | |
|
47 | bool connected; | |
|
48 | 42 | char* SPWPacketBuff; |
|
49 | QList<RMAP_Answer*> RMAP_Answers; | |
|
50 | QList<int> RMAP_pending_transaction_IDs; | |
|
51 | 43 | |
|
52 | 44 | public: |
|
53 | 45 | QTcpSocket* Read_soc; |
|
54 | 46 | QTcpSocket* Write_soc; |
|
55 | 47 | QString IP; |
|
56 | 48 | int virtualLinkIndex; |
|
57 | int RMAPtimeout; | |
|
58 | 49 | }; |
|
59 | 50 | |
|
60 | 51 |
@@ -40,11 +40,11 stardundeeSPW_USB::stardundeeSPW_USB(soc | |||
|
40 | 40 | Q_UNUSED(parent) |
|
41 | 41 | this->manager = new stardundeeSPW_USB_Manager(parent,this); |
|
42 | 42 | makeGUI(parent); |
|
43 | this->manager->start(); | |
|
44 | 43 | connect(this->manager,SIGNAL(emitPacket(char*,int)),this,SIGNAL(pushPacketOverTCP(char*,int))); |
|
45 | 44 | connect(this->manager, SIGNAL(bytesReceivedFromSpw(uint)), this, SIGNAL(BytesReceivedFromSpw(uint))); |
|
46 | 45 | connect(this->manager, SIGNAL(bytesTransmittedToSpw(uint)), this, SIGNAL(BytesTransmittedToSpw(uint))); |
|
47 | 46 | connect(this->manager, SIGNAL(ccsdsPacketTransmittedToSpw()), this, SIGNAL(CCSDSPacketTransmittedToSpw())); |
|
47 | this->manager->start(); | |
|
48 | 48 | } |
|
49 | 49 | |
|
50 | 50 | stardundeeSPW_USB::~stardundeeSPW_USB() |
@@ -400,16 +400,8 void stardundeeSPW_USB::sendPacketComing | |||
|
400 | 400 | } |
|
401 | 401 | |
|
402 | 402 | stardundeeSPW_USB_Manager::stardundeeSPW_USB_Manager(socexplorerplugin *plugin, QObject *parent) |
|
403 | :QThread((QObject*)parent) | |
|
403 | :abstractSpwManager(plugin, parent) | |
|
404 | 404 | { |
|
405 | this->RMAPtimeout = 2000; | |
|
406 | this->handleMutex = new QMutex(QMutex::NonRecursive); | |
|
407 | // this->handleMutex = new QMutex(QMutex::Recursive); | |
|
408 | this->RMAP_AnswersSem = new QSemaphore(0); | |
|
409 | this->RMAP_AnswersMtx=new QMutex(QMutex::Recursive); | |
|
410 | this->RMAP_pending_transaction_IDsMtx=new QMutex(QMutex::Recursive); | |
|
411 | this->plugin = plugin; | |
|
412 | connected = false; | |
|
413 | 405 | // TODO remove this crap! |
|
414 | 406 | this->initDialog(); |
|
415 | 407 | // this->moveToThread(this); |
@@ -417,10 +409,6 stardundeeSPW_USB_Manager::stardundeeSPW | |||
|
417 | 409 | |
|
418 | 410 | stardundeeSPW_USB_Manager::~stardundeeSPW_USB_Manager() |
|
419 | 411 | { |
|
420 | this->terminate(); | |
|
421 | while (!this->isFinished()) { | |
|
422 | this->usleep(1000); | |
|
423 | } | |
|
424 | 412 | } |
|
425 | 413 | |
|
426 | 414 | void stardundeeSPW_USB_Manager::run() |
@@ -926,84 +914,6 bool stardundeeSPW_USB_Manager::disconne | |||
|
926 | 914 | return true; |
|
927 | 915 | } |
|
928 | 916 | |
|
929 | int stardundeeSPW_USB_Manager::getRMAPtransactionID() | |
|
930 | { | |
|
931 | this->RMAP_pending_transaction_IDsMtx->lock(); | |
|
932 | int ID=0; | |
|
933 | bool found=true; | |
|
934 | while(ID<511) | |
|
935 | { | |
|
936 | for(int i=0;i<RMAP_pending_transaction_IDs.count();i++) | |
|
937 | { | |
|
938 | if(RMAP_pending_transaction_IDs[i]==ID)found=false; | |
|
939 | } | |
|
940 | if(found==true)break; | |
|
941 | ID++; | |
|
942 | found = true; | |
|
943 | } | |
|
944 | if(found) | |
|
945 | { | |
|
946 | RMAP_pending_transaction_IDs.append(ID); | |
|
947 | } | |
|
948 | this->RMAP_pending_transaction_IDsMtx->unlock(); | |
|
949 | return ID; | |
|
950 | } | |
|
951 | ||
|
952 | int stardundeeSPW_USB_Manager::getRMAPanswer(int transactionID, char **buffer) | |
|
953 | { | |
|
954 | QTime timeout; | |
|
955 | *buffer=NULL; | |
|
956 | int count=0; | |
|
957 | SocExplorerEngine::message(this->plugin,"Looking for RMAP answer",2); | |
|
958 | timeout.start(); | |
|
959 | while (*buffer==NULL) | |
|
960 | { | |
|
961 | this->RMAP_AnswersMtx->lock(); | |
|
962 | SocExplorerEngine::message(this->plugin,"Got exclusive access on RMAP_Answers stack",2); | |
|
963 | SocExplorerEngine::message(this->plugin,QString("%1 packet(s) available in RMAP_Answers stack").arg(RMAP_Answers.count()),2); | |
|
964 | for(int i=0;i<RMAP_Answers.count();i++) | |
|
965 | { | |
|
966 | SocExplorerEngine::message(this->plugin,QString("Packet %1 ID=%2").arg(i).arg(RMAP_Answers[i]->transactionID),2); | |
|
967 | if(RMAP_Answers[i]->transactionID==transactionID) | |
|
968 | { | |
|
969 | this->RMAP_pending_transaction_IDsMtx->lock(); | |
|
970 | SocExplorerEngine::message(this->plugin,"Got exclusive access on RMAP_pending_transaction_ID stack",2); | |
|
971 | for(int j=0;j<RMAP_pending_transaction_IDs.count();j++) | |
|
972 | { | |
|
973 | if(RMAP_pending_transaction_IDs[j]==transactionID) | |
|
974 | { | |
|
975 | RMAP_pending_transaction_IDs.removeAt(j); | |
|
976 | } | |
|
977 | } | |
|
978 | this->RMAP_pending_transaction_IDsMtx->unlock(); | |
|
979 | *buffer = RMAP_Answers[i]->data; | |
|
980 | count = RMAP_Answers[i]->len; | |
|
981 | RMAP_Answer* tmp=RMAP_Answers[i]; | |
|
982 | RMAP_Answers.removeAt(i); | |
|
983 | delete tmp; | |
|
984 | } | |
|
985 | } | |
|
986 | this->RMAP_AnswersMtx->unlock(); | |
|
987 | //if no answer found in the stack wait until a new packet is pushed | |
|
988 | SocExplorerEngine::message(this->plugin,"waiting until a new packet is pushed",2); | |
|
989 | if(*buffer==NULL) | |
|
990 | { | |
|
991 | while (0==this->RMAP_AnswersSem->available()) | |
|
992 | { | |
|
993 | SocExplorerEngine::message(this->plugin,QString("this->RMAP_AnswersSem->available() = %1").arg(this->RMAP_AnswersSem->available()),2); | |
|
994 | if(timeout.elapsed()>=RMAPtimeout) | |
|
995 | { | |
|
996 | SocExplorerEngine::message(this->plugin,"Timeout reached giving up!",2); | |
|
997 | return -1; | |
|
998 | } | |
|
999 | usleep(1000); | |
|
1000 | } | |
|
1001 | this->RMAP_AnswersSem->acquire(); | |
|
1002 | } | |
|
1003 | } | |
|
1004 | return count; | |
|
1005 | } | |
|
1006 | ||
|
1007 | 917 | bool stardundeeSPW_USB_Manager::sendPacket(char *packet, int size) |
|
1008 | 918 | { |
|
1009 | 919 | char protocoleIdentifier; |
@@ -1032,15 +942,6 bool stardundeeSPW_USB_Manager::sendPack | |||
|
1032 | 942 | return true; |
|
1033 | 943 | } |
|
1034 | 944 | |
|
1035 | void stardundeeSPW_USB_Manager::pushRmapPacket(char *packet, int len) | |
|
1036 | { | |
|
1037 | char* packetbuffer = (char*)malloc(len); | |
|
1038 | memcpy(packetbuffer,packet,len); | |
|
1039 | RMAP_Answer* RMPAPpacket=new RMAP_Answer(RMAP_get_transactionID(packetbuffer+1),packetbuffer,len); | |
|
1040 | RMAP_AnswersMtx->lock(); | |
|
1041 | RMAP_Answers.append(RMPAPpacket); | |
|
1042 | RMAP_AnswersMtx->unlock(); | |
|
1043 | } | |
|
1044 | 945 | |
|
1045 | 946 | void stardundeeSPW_USB_Manager::sendTimecodePeriodically( bool onOff ) |
|
1046 | 947 | { |
@@ -41,7 +41,7 | |||
|
41 | 41 | #define BRICK_IS_SET_AS_AN_INTERFACE true |
|
42 | 42 | #define BRICK_IS_SET_AS_A_ROUTER false |
|
43 | 43 | |
|
44 |
class stardundeeSPW_USB_Manager: public |
|
|
44 | class stardundeeSPW_USB_Manager: public abstractSpwManager | |
|
45 | 45 | { |
|
46 | 46 | Q_OBJECT |
|
47 | 47 | public: |
@@ -58,8 +58,6 public: | |||
|
58 | 58 | void setTimecodeFrequency(double requestedFrequency); |
|
59 | 59 | unsigned int getLinkStatus(unsigned char link); |
|
60 | 60 | bool disconnectBridge(); |
|
61 | int getRMAPtransactionID(); | |
|
62 | int getRMAPanswer(int transactionID,char** buffer); | |
|
63 | 61 | bool sendPacket(char* packet,int size); |
|
64 | 62 | |
|
65 | 63 | signals: |
@@ -75,15 +73,8 public slots: | |||
|
75 | 73 | int getLinkNumber( void ); |
|
76 | 74 | |
|
77 | 75 | private: |
|
78 | QMutex *handleMutex,*RMAP_AnswersMtx,*RMAP_pending_transaction_IDsMtx; | |
|
79 | 76 | QSemaphore* RMAP_AnswersSem; |
|
80 | void pushRmapPacket(char* packet,int len); | |
|
81 | 77 | star_device_handle hDevice; |
|
82 | socexplorerplugin* plugin; | |
|
83 | bool connected; | |
|
84 | char* SPWPacketBuff; | |
|
85 | QList<RMAP_Answer*> RMAP_Answers; | |
|
86 | QList<int> RMAP_pending_transaction_IDs; | |
|
87 | 78 | |
|
88 | 79 | QLabel *starDundeeStatusQueryDialogLabel; |
|
89 | 80 | QPushButton *starDundeeStatusQueryRetryButton; |
@@ -96,13 +87,8 private: | |||
|
96 | 87 | |
|
97 | 88 | public: |
|
98 | 89 | int selectedBrick; |
|
99 | int linkNumber; | |
|
100 | 90 | int brickList; |
|
101 | 91 | int linkSpeed; |
|
102 | int sourceLogicalAddress; | |
|
103 | int destinationLogicalAddress; | |
|
104 | int destinationKey; | |
|
105 | int RMAPtimeout; | |
|
106 | 92 | double timecodeFrequency; |
|
107 | 93 | bool interfaceMode; // 1 => interface mode, 0 => router mode |
|
108 | 94 | }; |
@@ -20,6 +20,8 | |||
|
20 | 20 | -- Mail : alexis.jeandet@member.fsf.org |
|
21 | 21 | ----------------------------------------------------------------------------*/ |
|
22 | 22 | #include "abstractspwbridge.h" |
|
23 | #include <QTime> | |
|
24 | #include <socexplorerengine.h> | |
|
23 | 25 | |
|
24 | 26 | abstractSpwBridge::abstractSpwBridge(socexplorerplugin *parent) |
|
25 | 27 | :QObject((QObject*)parent) |
@@ -54,3 +56,121 bool abstractSpwBridge::disconnectBridge | |||
|
54 | 56 | |
|
55 | 57 | |
|
56 | 58 | |
|
59 | ||
|
60 | ||
|
61 | abstractSpwManager::abstractSpwManager(socexplorerplugin *plugin, QObject *parent) | |
|
62 | :QThread((QObject*)parent) | |
|
63 | { | |
|
64 | this->RMAPtimeout = 2000; | |
|
65 | this->handleMutex = new QMutex(QMutex::NonRecursive); | |
|
66 | this->RMAP_AnswersSem = new QSemaphore(0); | |
|
67 | this->RMAP_AnswersMtx=new QMutex(QMutex::Recursive); | |
|
68 | this->RMAP_pending_transaction_IDsMtx=new QMutex(QMutex::Recursive); | |
|
69 | this->plugin = plugin; | |
|
70 | connected = false; | |
|
71 | } | |
|
72 | ||
|
73 | abstractSpwManager::~abstractSpwManager() | |
|
74 | { | |
|
75 | this->terminate(); | |
|
76 | while (!this->isFinished()) | |
|
77 | { | |
|
78 | this->usleep(1000); | |
|
79 | } | |
|
80 | } | |
|
81 | ||
|
82 | int abstractSpwManager::getRMAPtransactionID() | |
|
83 | { | |
|
84 | this->RMAP_pending_transaction_IDsMtx->lock(); | |
|
85 | int ID=0; | |
|
86 | bool found=true; | |
|
87 | while(ID<511) | |
|
88 | { | |
|
89 | for(int i=0;i<RMAP_pending_transaction_IDs.count();i++) | |
|
90 | { | |
|
91 | if(RMAP_pending_transaction_IDs[i]==ID)found=false; | |
|
92 | } | |
|
93 | if(found==true)break; | |
|
94 | ID++; | |
|
95 | found = true; | |
|
96 | } | |
|
97 | if(found) | |
|
98 | { | |
|
99 | RMAP_pending_transaction_IDs.append(ID); | |
|
100 | } | |
|
101 | this->RMAP_pending_transaction_IDsMtx->unlock(); | |
|
102 | return ID; | |
|
103 | } | |
|
104 | ||
|
105 | int abstractSpwManager::getRMAPanswer(int transactionID, char **buffer) | |
|
106 | { | |
|
107 | ||
|
108 | QTime timeout; | |
|
109 | *buffer=NULL; | |
|
110 | int count=0; | |
|
111 | SocExplorerEngine::message(this->plugin,"Looking for RMAP answer",2); | |
|
112 | timeout.start(); | |
|
113 | while (*buffer==NULL) | |
|
114 | { | |
|
115 | this->RMAP_AnswersMtx->lock(); | |
|
116 | SocExplorerEngine::message(this->plugin,"Got exclusive access on RMAP_Answers stack",2); | |
|
117 | SocExplorerEngine::message(this->plugin,QString("%1 packet(s) available in RMAP_Answers stack").arg(RMAP_Answers.count()),2); | |
|
118 | for(int i=0;i<RMAP_Answers.count();i++) | |
|
119 | { | |
|
120 | SocExplorerEngine::message(this->plugin,QString("Packet %1 ID=%2").arg(i).arg(RMAP_Answers[i]->transactionID),2); | |
|
121 | if(RMAP_Answers[i]->transactionID==transactionID) | |
|
122 | { | |
|
123 | this->RMAP_pending_transaction_IDsMtx->lock(); | |
|
124 | SocExplorerEngine::message(this->plugin,"Got exclusive access on RMAP_pending_transaction_ID stack",2); | |
|
125 | for(int j=0;j<RMAP_pending_transaction_IDs.count();j++) | |
|
126 | { | |
|
127 | if(RMAP_pending_transaction_IDs[j]==transactionID) | |
|
128 | { | |
|
129 | RMAP_pending_transaction_IDs.removeAt(j); | |
|
130 | } | |
|
131 | } | |
|
132 | this->RMAP_pending_transaction_IDsMtx->unlock(); | |
|
133 | *buffer = RMAP_Answers[i]->data; | |
|
134 | count = RMAP_Answers[i]->len; | |
|
135 | RMAP_Answer* tmp=RMAP_Answers[i]; | |
|
136 | RMAP_Answers.removeAt(i); | |
|
137 | delete tmp; | |
|
138 | } | |
|
139 | } | |
|
140 | this->RMAP_AnswersMtx->unlock(); | |
|
141 | //if no answer found in the stack wait until a new packet is pushed | |
|
142 | SocExplorerEngine::message(this->plugin,"waiting until a new packet is pushed",2); | |
|
143 | if(*buffer==NULL) | |
|
144 | { | |
|
145 | while (0==this->RMAP_AnswersSem->available()) | |
|
146 | { | |
|
147 | SocExplorerEngine::message(this->plugin,QString("this->RMAP_AnswersSem->available() = %1").arg(this->RMAP_AnswersSem->available()),2); | |
|
148 | if(timeout.elapsed()>=RMAPtimeout) | |
|
149 | { | |
|
150 | SocExplorerEngine::message(this->plugin,"Timeout reached giving up!",2); | |
|
151 | return -1; | |
|
152 | } | |
|
153 | usleep(1000); | |
|
154 | } | |
|
155 | this->RMAP_AnswersSem->acquire(); | |
|
156 | } | |
|
157 | } | |
|
158 | return count; | |
|
159 | } | |
|
160 | ||
|
161 | int abstractSpwManager::getLinkNumber() | |
|
162 | { | |
|
163 | return this->linkNumber; | |
|
164 | } | |
|
165 | ||
|
166 | void abstractSpwManager::pushRmapPacket(char *packet, int len) | |
|
167 | { | |
|
168 | char* packetbuffer = (char*)malloc(len); | |
|
169 | memcpy(packetbuffer,packet,len); | |
|
170 | RMAP_Answer* RMPAPpacket=new RMAP_Answer(RMAP_get_transactionID(packetbuffer+1),packetbuffer,len); | |
|
171 | RMAP_AnswersMtx->lock(); | |
|
172 | RMAP_Answers.append(RMPAPpacket); | |
|
173 | RMAP_AnswersMtx->unlock(); | |
|
174 | } | |
|
175 | ||
|
176 |
@@ -23,6 +23,9 | |||
|
23 | 23 | #define ABSTRACTSPWBRIDGE_H |
|
24 | 24 | |
|
25 | 25 | #include <QObject> |
|
26 | #include <QThread> | |
|
27 | #include <QMutex> | |
|
28 | #include <QSemaphore> | |
|
26 | 29 | #include <socexplorerplugin.h> |
|
27 | 30 | #define RMAP_MAX_XFER_SIZE 4000 //slightly less than 16kBytes |
|
28 | 31 | #include <spw.h> |
@@ -65,4 +68,43 private: | |||
|
65 | 68 | |
|
66 | 69 | }; |
|
67 | 70 | |
|
71 | class abstractSpwManager: public QThread | |
|
72 | { | |
|
73 | Q_OBJECT | |
|
74 | public: | |
|
75 | explicit abstractSpwManager(socexplorerplugin *plugin = 0,QObject* parent=0); | |
|
76 | ~abstractSpwManager(); | |
|
77 | virtual void run(){} | |
|
78 | virtual bool connectBridge()=0; | |
|
79 | virtual bool disconnectBridge()=0; | |
|
80 | int getRMAPtransactionID(); | |
|
81 | int getRMAPanswer(int transactionID,char** buffer); | |
|
82 | virtual bool sendPacket(char* packet,int size)=0; | |
|
83 | int RMAPtimeout; | |
|
84 | int linkNumber; | |
|
85 | int sourceLogicalAddress; | |
|
86 | int destinationLogicalAddress; | |
|
87 | int destinationKey; | |
|
88 | signals: | |
|
89 | void emitPacket(char* packet,int size); | |
|
90 | void bytesReceivedFromSpw( unsigned int ); | |
|
91 | void bytesTransmittedToSpw( unsigned int); | |
|
92 | void ccsdsPacketTransmittedToSpw( void ); | |
|
93 | ||
|
94 | public slots: | |
|
95 | int getLinkNumber(); | |
|
96 | ||
|
97 | protected: | |
|
98 | QList<RMAP_Answer*> RMAP_Answers; | |
|
99 | QList<int> RMAP_pending_transaction_IDs; | |
|
100 | QMutex *handleMutex,*RMAP_AnswersMtx,*RMAP_pending_transaction_IDsMtx; | |
|
101 | QSemaphore* RMAP_AnswersSem; | |
|
102 | socexplorerplugin* plugin; | |
|
103 | bool connected; | |
|
104 | void pushRmapPacket(char* packet,int len); | |
|
105 | ||
|
106 | }; | |
|
107 | ||
|
108 | ||
|
109 | ||
|
68 | 110 | #endif // ABSTRACTSPWBRIDGE_H |
General Comments 0
You need to be logged in to leave comments.
Login now