@@ -10,6 +10,7 SUBDIRS = \ | |||||
10 | genericrwplugin \ |
|
10 | genericrwplugin \ | |
11 | memctrlrplugin \ |
|
11 | memctrlrplugin \ | |
12 | memcheckplugin |
|
12 | memcheckplugin | |
|
13 | ||||
13 | unix:SUBDIRS += spwplugin |
|
14 | unix:SUBDIRS += spwplugin | |
14 |
|
15 | |||
15 | OTHER_FILES += SocExplorer-plugins.spec |
|
16 | OTHER_FILES += SocExplorer-plugins.spec |
@@ -85,7 +85,8 void GR_ESB_bridge::setIP(QString ip) | |||||
85 |
|
85 | |||
86 | void GR_ESB_bridge::setVirtualLink(QString vlink) |
|
86 | void GR_ESB_bridge::setVirtualLink(QString vlink) | |
87 | { |
|
87 | { | |
88 |
vlink = vlink.section( |
|
88 | //vlink = vlink.section(,0,0); | |
|
89 | vlink.remove("Virtual link"); | |||
89 | bool success; |
|
90 | bool success; | |
90 | int vlinkTmp = vlink.toInt(&success); |
|
91 | int vlinkTmp = vlink.toInt(&success); | |
91 | if(success) |
|
92 | if(success) | |
@@ -105,21 +106,170 void GR_ESB_bridge::setVirtualLink(qint3 | |||||
105 |
|
106 | |||
106 | unsigned int GR_ESB_bridge::Write(unsigned int *Value, unsigned int count, unsigned int address) |
|
107 | unsigned int GR_ESB_bridge::Write(unsigned int *Value, unsigned int count, unsigned int address) | |
107 | { |
|
108 | { | |
108 | // TODO write ME! |
|
109 | char writeBuffer[RMAP_WRITE_PACKET_MIN_SZ((RMAP_MAX_XFER_SIZE*4))]; | |
109 | Q_UNUSED(count) |
|
110 | char *RMAPAckBuff; | |
110 | Q_UNUSED(Value) |
|
111 | int transactionID = 0; | |
111 | Q_UNUSED(address) |
|
112 | int written=0; | |
112 | return 0; |
|
113 | SocExplorerEngine::message(this->plugin,"Enter Write function",2); | |
|
114 | QProgressBar* progress=NULL; | |||
|
115 | SocExplorerAutoProgressBar autopb; | |||
|
116 | if(count>RMAP_MAX_XFER_SIZE) | |||
|
117 | { | |||
|
118 | progress= SocExplorerEngine::getProgressBar("Writing on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count); | |||
|
119 | autopb.setProgressBar(progress); | |||
|
120 | } | |||
|
121 | //Quite stupide loop, I guess that I always get the number of byte I asked for! | |||
|
122 | while(count>=RMAP_MAX_XFER_SIZE) | |||
|
123 | { | |||
|
124 | for(int i=0;i<(RMAP_MAX_XFER_SIZE);i++) | |||
|
125 | { | |||
|
126 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+0] = (char)(((unsigned int)Value[i+written]>>24)&0xFF); | |||
|
127 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>16)&0xFF); | |||
|
128 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>8)&0xFF); | |||
|
129 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written])&0xFF); | |||
|
130 | } | |||
|
131 | transactionID=manager->getRMAPtransactionID(); | |||
|
132 | SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2); | |||
|
133 | RMAP_build_tx_request_header( | |||
|
134 | this->manager->destinationLogicalAddress, | |||
|
135 | this->manager->destinationKey, | |||
|
136 | this->manager->sourceLogicalAddress, | |||
|
137 | transactionID, | |||
|
138 | address+(written*4), | |||
|
139 | RMAP_MAX_XFER_SIZE*4, | |||
|
140 | writeBuffer); | |||
|
141 | manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(RMAP_MAX_XFER_SIZE*4)); | |||
|
142 | manager->getRMAPanswer(transactionID,&RMAPAckBuff); | |||
|
143 | free(RMAPAckBuff); | |||
|
144 | written+=RMAP_MAX_XFER_SIZE; | |||
|
145 | count-=RMAP_MAX_XFER_SIZE; | |||
|
146 | progress->setValue(written); | |||
|
147 | qApp->processEvents(); | |||
|
148 | } | |||
|
149 | if(count>0) | |||
|
150 | { | |||
|
151 | for(int i=0;i<((int)count);i++) | |||
|
152 | { | |||
|
153 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+0] = (char)(((unsigned int)Value[i+written]>>24)&0xFF); | |||
|
154 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>16)&0xFF); | |||
|
155 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>8)&0xFF); | |||
|
156 | writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written])&0xFF); | |||
|
157 | } | |||
|
158 | transactionID=manager->getRMAPtransactionID(); | |||
|
159 | SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2); | |||
|
160 | RMAP_build_tx_request_header( | |||
|
161 | this->manager->destinationLogicalAddress, | |||
|
162 | this->manager->destinationKey, | |||
|
163 | this->manager->sourceLogicalAddress, | |||
|
164 | transactionID, | |||
|
165 | address+(written*4), | |||
|
166 | count*4, | |||
|
167 | writeBuffer); | |||
|
168 | manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(count*4)); | |||
|
169 | manager->getRMAPanswer(transactionID,&RMAPAckBuff); | |||
|
170 | free(RMAPAckBuff); | |||
|
171 | written+=count; | |||
|
172 | if(progress!=NULL) | |||
|
173 | { | |||
|
174 | progress->setValue(written); | |||
|
175 | qApp->processEvents(); | |||
|
176 | } | |||
|
177 | } | |||
|
178 | return written; | |||
113 | } |
|
179 | } | |
114 |
|
180 | |||
115 | unsigned int GR_ESB_bridge::Read(unsigned int *Value, unsigned int count, unsigned int address) |
|
181 | unsigned int GR_ESB_bridge::Read(unsigned int *Value, unsigned int count, unsigned int address) | |
116 | { |
|
182 | { | |
117 | // TODO write ME! |
|
183 | char requestBuffer[RMAP_READ_HEADER_MIN_SZ]; | |
118 | Q_UNUSED(Value) |
|
184 | char* RMAP_AnswerBuffer; | |
119 | Q_UNUSED(count) |
|
185 | requestBuffer[0]=this->manager->linkNumber;//Link number | |
120 | Q_UNUSED(address) |
|
186 | int transactionID = 0; | |
|
187 | int read=0; | |||
|
188 | QProgressBar* progress=NULL; | |||
|
189 | SocExplorerAutoProgressBar autopb; | |||
|
190 | if(count>RMAP_MAX_XFER_SIZE) | |||
|
191 | { | |||
|
192 | progress= SocExplorerEngine::getProgressBar("Reading on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count); | |||
|
193 | autopb.setProgressBar(progress); | |||
|
194 | } | |||
|
195 | SocExplorerEngine::message(this->plugin,QString("Enter read function, count=%1, RMAP_MAX_XFER_SIZE=%2").arg(count).arg(RMAP_MAX_XFER_SIZE),2); | |||
|
196 | ||||
|
197 | //Quite stupide loop, I guess that I always get the number of byte I asked for! | |||
|
198 | while((int)count>=(int)RMAP_MAX_XFER_SIZE) | |||
|
199 | { | |||
|
200 | transactionID = manager->getRMAPtransactionID(); | |||
|
201 | SocExplorerEngine::message(this->plugin,QString("New transactionID:%1").arg(transactionID),2); | |||
|
202 | RMAP_build_rx_request_header( | |||
|
203 | this->manager->destinationLogicalAddress, | |||
|
204 | this->manager->destinationKey, | |||
|
205 | this->manager->sourceLogicalAddress, | |||
|
206 | transactionID, | |||
|
207 | address+(read*4), | |||
|
208 | RMAP_MAX_XFER_SIZE*4, | |||
|
209 | requestBuffer); | |||
|
210 | manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ); | |||
|
211 | int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer); | |||
|
212 | if(len==-1) | |||
|
213 | { | |||
|
214 | this->toggleBridgeConnection(); | |||
121 | return 0; |
|
215 | return 0; | |
122 | } |
|
216 | } | |
|
217 | for(int i=0;i<((len-13)/4);i++) | |||
|
218 | { | |||
|
219 | Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]); | |||
|
220 | Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13])); | |||
|
221 | Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14])); | |||
|
222 | Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15])); | |||
|
223 | } | |||
|
224 | free(RMAP_AnswerBuffer); | |||
|
225 | read+=RMAP_MAX_XFER_SIZE; | |||
|
226 | count-=RMAP_MAX_XFER_SIZE; | |||
|
227 | if(progress!=NULL) | |||
|
228 | { | |||
|
229 | progress->setValue(read); | |||
|
230 | qApp->processEvents(); | |||
|
231 | } | |||
|
232 | } | |||
|
233 | if((int)count>0) | |||
|
234 | { | |||
|
235 | transactionID = manager->getRMAPtransactionID(); | |||
|
236 | SocExplorerEngine::message(this->plugin,QString("New transactionID: %1").arg(transactionID),2); | |||
|
237 | SocExplorerEngine::message(this->plugin,QString("Building request with:"),2); | |||
|
238 | SocExplorerEngine::message(this->plugin,QString("Address = %1").arg(address+(read*4),8,16),2); | |||
|
239 | SocExplorerEngine::message(this->plugin,QString("Size = %1").arg(count*4),2); | |||
|
240 | SocExplorerEngine::message(this->plugin,QString("Size + 13 = %1").arg((count*4)+13),2); | |||
|
241 | RMAP_build_rx_request_header( | |||
|
242 | this->manager->destinationLogicalAddress, | |||
|
243 | this->manager->destinationKey, | |||
|
244 | this->manager->sourceLogicalAddress, | |||
|
245 | transactionID, | |||
|
246 | address+(read*4), | |||
|
247 | count*4, | |||
|
248 | requestBuffer); | |||
|
249 | manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ); | |||
|
250 | int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer); | |||
|
251 | if(len==-1) | |||
|
252 | { | |||
|
253 | this->toggleBridgeConnection(); | |||
|
254 | return 0; | |||
|
255 | } | |||
|
256 | for(int i=0;i<((len-13)/4);i++) | |||
|
257 | { | |||
|
258 | Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]); | |||
|
259 | Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13])); | |||
|
260 | Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14])); | |||
|
261 | Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15])); | |||
|
262 | } | |||
|
263 | free(RMAP_AnswerBuffer); | |||
|
264 | read+=count; | |||
|
265 | if(progress!=NULL) | |||
|
266 | { | |||
|
267 | progress->setValue(read); | |||
|
268 | qApp->processEvents(); | |||
|
269 | } | |||
|
270 | } | |||
|
271 | return read; | |||
|
272 | } | |||
123 |
|
273 | |||
124 | int GR_ESB_bridge::pushRMAPPacket(char *packet, int size) |
|
274 | int GR_ESB_bridge::pushRMAPPacket(char *packet, int size) | |
125 | { |
|
275 | { | |
@@ -128,40 +278,139 int GR_ESB_bridge::pushRMAPPacket(char * | |||||
128 |
|
278 | |||
129 |
|
279 | |||
130 | GR_ESB_Manager::GR_ESB_Manager(socexplorerplugin *plugin, QObject *parent) |
|
280 | GR_ESB_Manager::GR_ESB_Manager(socexplorerplugin *plugin, QObject *parent) | |
131 | :QThread((QObject*)parent) |
|
281 | :abstractSpwManager(plugin, parent) | |
132 | { |
|
282 | { | |
133 | this->Read_soc = new QTcpSocket(this); |
|
283 | this->sourceLogicalAddress=32; | |
134 | this->Write_soc = new QTcpSocket(this); |
|
284 | this->destinationLogicalAddress=254; | |
135 | this->RMAPtimeout = 2000; |
|
285 | this->destinationKey=2; | |
136 | this->handleMutex = new QMutex(QMutex::NonRecursive); |
|
286 | connect(&(this->Read_soc),SIGNAL(readyRead()),this,SLOT(readyRead())); | |
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 | } |
|
287 | } | |
144 |
|
288 | |||
145 | GR_ESB_Manager::~GR_ESB_Manager() |
|
289 | GR_ESB_Manager::~GR_ESB_Manager() | |
146 | { |
|
290 | { | |
|
291 | } | |||
147 |
|
292 | |||
|
293 | void GR_ESB_Manager::__processPacket(packetBuffer_t *packet) | |||
|
294 | { | |||
|
295 | if(packet->complete) | |||
|
296 | { | |||
|
297 | if(packet->buffer[1]==(char)SPW_PROTO_ID_RMAP) //RMAP packet | |||
|
298 | { | |||
|
299 | RMAP_Answer* RMapPacket; | |||
|
300 | SocExplorerEngine::message(this->plugin,"Got RMAP packet",2); | |||
|
301 | SocExplorerEngine::message(this->plugin,QString("Rmap packet size %1").arg(packet->PacketLen),2); | |||
|
302 | char* packetbuffer = (char*)malloc(packet->PacketLen); | |||
|
303 | if(packetbuffer) | |||
|
304 | { | |||
|
305 | memcpy(packetbuffer,packet->buffer,packet->PacketLen); | |||
|
306 | this->handleMutex->unlock(); | |||
|
307 | if(packet->PacketLen==8) | |||
|
308 | { | |||
|
309 | RMapPacket=new RMAP_Answer(RMAP_get_transactionID(packetbuffer),packetbuffer,packet->PacketLen); | |||
|
310 | } | |||
|
311 | else | |||
|
312 | { | |||
|
313 | RMapPacket=new RMAP_Answer(RMAP_get_transactionID(packetbuffer),packetbuffer,packet->PacketLen); | |||
|
314 | } | |||
|
315 | RMAP_AnswersMtx->lock(); | |||
|
316 | RMAP_Answers.append(RMapPacket); | |||
|
317 | RMAP_AnswersMtx->unlock(); | |||
|
318 | RMAP_AnswersSem->release(); | |||
|
319 | } | |||
|
320 | } | |||
|
321 | else //any non-rmap packet will be pushed to the network | |||
|
322 | { | |||
|
323 | char* packetbuffer = (char*)malloc(packet->PacketLen); | |||
|
324 | if(packetbuffer) | |||
|
325 | { | |||
|
326 | memcpy(packetbuffer,packet->buffer,packet->PacketLen); | |||
|
327 | emit emitPacket(packetbuffer,packet->PacketLen); | |||
|
328 | SocExplorerEngine::message(this->plugin,"Got SPW packet",2); | |||
|
329 | } | |||
|
330 | } | |||
|
331 | } | |||
|
332 | ||||
|
333 | } | |||
|
334 | ||||
|
335 | QByteArray GR_ESB_Manager::__processData(const QByteArray &data, packetBuffer_t *buffer) | |||
|
336 | { | |||
|
337 | if(buffer->complete) | |||
|
338 | { | |||
|
339 | if(Q_UNLIKELY(data.size()<=4)) | |||
|
340 | return data; | |||
|
341 | buffer->PacketLen= ((int)data.at(3)& 0x0FF) + (((int)data.at(2)& 0x0FF)<<8) + (((int)data.at(1)& 0x0FF)<<16); | |||
|
342 | if(buffer->PacketLen>(data.size()-4)) | |||
|
343 | { | |||
|
344 | memcpy(buffer->buffer,data.data()+4,data.size()-4); | |||
|
345 | buffer->complete=false; | |||
|
346 | buffer->index=data.size()-4; | |||
|
347 | } | |||
|
348 | else | |||
|
349 | { | |||
|
350 | memcpy(buffer->buffer,data.data()+4,data.size()-4); | |||
|
351 | buffer->PacketLen = data.size()-4; | |||
|
352 | buffer->index=data.size()-4; | |||
|
353 | buffer->complete=true; | |||
|
354 | __processPacket(buffer); | |||
|
355 | int len = buffer->PacketLen; | |||
|
356 | buffer->PacketLen = 0; | |||
|
357 | buffer->index=0; | |||
|
358 | if((data.size()-4-len)) | |||
|
359 | { | |||
|
360 | return __processData(data.right((data.size()-4-len)),buffer); | |||
|
361 | } | |||
|
362 | } | |||
|
363 | ||||
|
364 | } | |||
|
365 | else | |||
|
366 | { | |||
|
367 | if(buffer->PacketLen>(data.size()+buffer->index)) | |||
|
368 | { | |||
|
369 | memcpy(buffer->buffer+buffer->index,data.data(),data.size()); | |||
|
370 | buffer->complete=false; | |||
|
371 | buffer->index+=data.size(); | |||
|
372 | } | |||
|
373 | else | |||
|
374 | { | |||
|
375 | memcpy(buffer->buffer+buffer->index,data.data(),buffer->PacketLen-buffer->index); | |||
|
376 | buffer->complete=true; | |||
|
377 | buffer->index+=data.size(); | |||
|
378 | __processPacket(buffer); | |||
|
379 | int len = buffer->PacketLen; | |||
|
380 | buffer->PacketLen = 0; | |||
|
381 | buffer->index=0; | |||
|
382 | if((data.size()-len)) | |||
|
383 | { | |||
|
384 | return __processData(data.right((data.size()-len)),buffer); | |||
|
385 | } | |||
|
386 | } | |||
|
387 | } | |||
|
388 | return QByteArray(); | |||
148 | } |
|
389 | } | |
149 |
|
390 | |||
150 | void GR_ESB_Manager::run() |
|
391 | void GR_ESB_Manager::run() | |
151 | { |
|
392 | { | |
|
393 | char bufferData[(RMAP_MAX_XFER_SIZE*4)+50]; | |||
|
394 | packetBuffer_t buffer={bufferData,0,0,true}; | |||
152 | SocExplorerEngine::message(this->plugin,"Starting GRESB pooling thread",1); |
|
395 | SocExplorerEngine::message(this->plugin,"Starting GRESB pooling thread",1); | |
|
396 | QByteArray data; | |||
153 | while (!this->isInterruptionRequested()) |
|
397 | while (!this->isInterruptionRequested()) | |
154 | { |
|
398 | { | |
155 | if(this->connected) |
|
399 | if(this->connected) | |
156 | { |
|
400 | { | |
157 | handleMutex->lock(); |
|
401 | SocExplorerEngine::message(this->plugin,"Looking for new RMAP packets",8); | |
158 | SocExplorerEngine::message(this->plugin,"Looking for new RMAP packets",4); |
|
402 | if(!incomingPackets.isEmpty()) | |
|
403 | { | |||
|
404 | incomingPacketsMutex.lock(); | |||
|
405 | data.append(incomingPackets.dequeue()); | |||
|
406 | this->incomingPacketsMutex.unlock(); | |||
|
407 | data = __processData(data,&buffer); | |||
|
408 | } | |||
159 |
|
409 | |||
160 | } |
|
410 | } | |
161 | else |
|
411 | else | |
162 | { |
|
412 | { | |
163 | //do some sanity checks! |
|
413 | //do some sanity checks! | |
164 |
|
||||
165 | usleep(RMAPtimeout/2); |
|
414 | usleep(RMAPtimeout/2); | |
166 | } |
|
415 | } | |
167 | usleep(1000); |
|
416 | usleep(1000); | |
@@ -172,21 +421,23 void GR_ESB_Manager::run() | |||||
172 | bool GR_ESB_Manager::connectBridge() |
|
421 | bool GR_ESB_Manager::connectBridge() | |
173 | { |
|
422 | { | |
174 | int timeout=60; |
|
423 | int timeout=60; | |
175 | if(this->Read_soc->state()==QTcpSocket::UnconnectedState) |
|
424 | this->connected = false; | |
|
425 | if(this->Read_soc.state()==QTcpSocket::UnconnectedState) | |||
176 | { |
|
426 | { | |
177 |
this->Read_soc |
|
427 | this->Read_soc.connectToHost(IP,gresb_Conf[virtualLinkIndex].Receive_port); | |
178 |
this->Read_soc |
|
428 | this->Read_soc.waitForConnected(30000); | |
179 | } |
|
429 | } | |
180 |
if(this->Write_soc |
|
430 | if(this->Write_soc.state()==QTcpSocket::UnconnectedState) | |
181 | { |
|
431 | { | |
182 |
this->Write_soc |
|
432 | this->Write_soc.connectToHost(IP,gresb_Conf[virtualLinkIndex].Transmit_port); | |
183 |
this->Write_soc |
|
433 | this->Write_soc.waitForConnected(30000); | |
184 | } |
|
434 | } | |
185 |
while((this->Read_soc |
|
435 | while((this->Read_soc.state()!=QTcpSocket::ConnectedState) && (this->Write_soc.state()!=QTcpSocket::ConnectedState)) | |
186 | { |
|
436 | { | |
187 | usleep(100000); |
|
437 | usleep(100000); | |
188 | if(timeout--==0)return false; |
|
438 | if(timeout--==0)return false; | |
189 | } |
|
439 | } | |
|
440 | this->connected = true; | |||
190 | return true; |
|
441 | return true; | |
191 |
|
442 | |||
192 | } |
|
443 | } | |
@@ -194,17 +445,17 bool GR_ESB_Manager::connectBridge() | |||||
194 | bool GR_ESB_Manager::disconnectBridge() |
|
445 | bool GR_ESB_Manager::disconnectBridge() | |
195 | { |
|
446 | { | |
196 | int timeout=60; |
|
447 | int timeout=60; | |
197 |
if(this->Read_soc |
|
448 | if(this->Read_soc.state()!=QTcpSocket::UnconnectedState) | |
198 | { |
|
449 | { | |
199 |
this->Read_soc |
|
450 | this->Read_soc.disconnectFromHost(); | |
200 |
this->Read_soc |
|
451 | this->Read_soc.waitForDisconnected(30000); | |
201 | } |
|
452 | } | |
202 |
if(this->Write_soc |
|
453 | if(this->Write_soc.state()!=QTcpSocket::UnconnectedState) | |
203 | { |
|
454 | { | |
204 |
this->Write_soc |
|
455 | this->Write_soc.disconnectFromHost(); | |
205 |
this->Write_soc |
|
456 | this->Write_soc.waitForDisconnected(30000); | |
206 | } |
|
457 | } | |
207 |
while((this->Read_soc |
|
458 | while((this->Read_soc.state()!=QTcpSocket::UnconnectedState) && (this->Write_soc.state()!=QTcpSocket::UnconnectedState)) | |
208 | { |
|
459 | { | |
209 | usleep(100000); |
|
460 | usleep(100000); | |
210 | if(timeout--==0)return false; |
|
461 | if(timeout--==0)return false; | |
@@ -212,31 +463,52 bool GR_ESB_Manager::disconnectBridge() | |||||
212 | return true; |
|
463 | return true; | |
213 | } |
|
464 | } | |
214 |
|
465 | |||
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 |
|
466 | |||
229 | bool GR_ESB_Manager::sendPacket(char *packet, int size) |
|
467 | bool GR_ESB_Manager::sendPacket(char *packet, int size) | |
230 | { |
|
468 | { | |
231 | // TODO write ME! |
|
469 | bool result = false; | |
232 | Q_UNUSED(packet) |
|
470 | char protocoleIdentifier; | |
233 | Q_UNUSED(size) |
|
471 | SocExplorerEngine::message(this->plugin,"Sending SPW packet",2); | |
|
472 | if(Q_UNLIKELY(this->Write_soc.state()!=QAbstractSocket::ConnectedState)) | |||
|
473 | { | |||
|
474 | SocExplorerEngine::message(this->plugin,"Socket closed",2); | |||
|
475 | //TODO handle disconnection | |||
|
476 | } | |||
|
477 | char* SPWpacket = (char*)malloc(size+4); | |||
|
478 | if(SPWpacket!=NULL) | |||
|
479 | { | |||
|
480 | SPWpacket[0]=0; //Protocol = spw | |||
|
481 | memcpy(SPWpacket+4,packet,size); | |||
|
482 | SPWpacket[1]=(size>>16) & 0x0FF; | |||
|
483 | SPWpacket[2]=(size>>8) & 0x0FF; | |||
|
484 | SPWpacket[3]=size & 0x0FF; | |||
|
485 | this->handleMutex->lock(); | |||
|
486 | result = ((size+4) == this->Write_soc.write(SPWpacket,size+4)); | |||
|
487 | this->Write_soc.flush(); | |||
|
488 | this->handleMutex->unlock(); | |||
|
489 | free(SPWpacket); | |||
|
490 | } | |||
|
491 | if (Q_UNLIKELY(!result)) | |||
|
492 | { | |||
|
493 | SocExplorerEngine::message(this->plugin,"ERR sending the READ command ",2); | |||
234 | return false; |
|
494 | return false; | |
235 | } |
|
495 | } | |
|
496 | else | |||
|
497 | { | |||
|
498 | emit bytesTransmittedToSpw( size-1 ); // -1 is for removing the first bytes added to the packet to route to the right link | |||
|
499 | // read the protocole identifier | |||
|
500 | protocoleIdentifier = packet[2]; | |||
|
501 | if (protocoleIdentifier == SPW_PROTO_ID_CCSDS) | |||
|
502 | emit ccsdsPacketTransmittedToSpw(); | |||
|
503 | SocExplorerEngine::message(this->plugin,"Packet sent",2); | |||
|
504 | } | |||
|
505 | return true; | |||
|
506 | } | |||
236 |
|
507 | |||
237 | void GR_ESB_Manager::pushRmapPacket(char *packet, int len) |
|
508 | void GR_ESB_Manager::readyRead() | |
238 | { |
|
509 | { | |
239 | // TODO write ME! |
|
510 | incomingPacketsMutex.lock(); | |
240 | Q_UNUSED(packet) |
|
511 | incomingPackets.append(Read_soc.readAll()); | |
241 | Q_UNUSED(len) |
|
512 | incomingPacketsMutex.unlock(); | |
242 | } |
|
513 | } | |
|
514 |
@@ -5,11 +5,12 | |||||
5 | #include <QThread> |
|
5 | #include <QThread> | |
6 | #include <QMutex> |
|
6 | #include <QMutex> | |
7 | #include <QSemaphore> |
|
7 | #include <QSemaphore> | |
|
8 | #include <QQueue> | |||
8 |
|
9 | |||
9 | struct gresb_Conf_str |
|
10 | struct gresb_Conf_str | |
10 | { |
|
11 | { | |
11 |
qint32 |
|
12 | qint32 Transmit_port; | |
12 |
qint32 |
|
13 | qint32 Receive_port; | |
13 | }; |
|
14 | }; | |
14 |
|
15 | |||
15 |
|
16 | |||
@@ -24,37 +25,44 const struct gresb_Conf_str gresb_Conf[] | |||||
24 | }; |
|
25 | }; | |
25 |
|
26 | |||
26 |
|
27 | |||
27 |
class GR_ESB_Manager: public |
|
28 | class GR_ESB_Manager: public abstractSpwManager | |
28 | { |
|
29 | { | |
29 | Q_OBJECT |
|
30 | Q_OBJECT | |
|
31 | ||||
|
32 | typedef struct packetBuffer_t | |||
|
33 | { | |||
|
34 | char* buffer; | |||
|
35 | int PacketLen; | |||
|
36 | int index; | |||
|
37 | bool complete; | |||
|
38 | }packetBuffer_t; | |||
|
39 | ||||
30 | public: |
|
40 | public: | |
31 | explicit GR_ESB_Manager(socexplorerplugin *plugin = 0,QObject* parent=0); |
|
41 | explicit GR_ESB_Manager(socexplorerplugin *plugin = 0,QObject* parent=0); | |
32 | ~GR_ESB_Manager(); |
|
42 | ~GR_ESB_Manager(); | |
33 | void run(); |
|
43 | void run(); | |
34 | bool connectBridge(); |
|
44 | bool connectBridge(); | |
35 | bool disconnectBridge(); |
|
45 | bool disconnectBridge(); | |
36 | int getRMAPtransactionID(); |
|
|||
37 | int getRMAPanswer(int transactionID,char** buffer); |
|
|||
38 | bool sendPacket(char* packet,int size); |
|
46 | bool sendPacket(char* packet,int size); | |
39 |
|
47 | |||
40 | signals: |
|
48 | signals: | |
41 | void emitPacket(char* packet,int size); |
|
49 | void emitPacket(char* packet,int size); | |
42 | private: |
|
50 | private: | |
43 | QMutex* handleMutex,*RMAP_AnswersMtx,*RMAP_pending_transaction_IDsMtx; |
|
|||
44 | QSemaphore* RMAP_AnswersSem; |
|
|||
45 | void pushRmapPacket(char* packet,int len); |
|
51 | void pushRmapPacket(char* packet,int len); | |
46 | socexplorerplugin* plugin; |
|
|||
47 | bool connected; |
|
|||
48 | char* SPWPacketBuff; |
|
52 | char* SPWPacketBuff; | |
49 | QList<RMAP_Answer*> RMAP_Answers; |
|
53 | ||
50 | QList<int> RMAP_pending_transaction_IDs; |
|
54 | void __processPacket(packetBuffer_t *packet); | |
|
55 | QByteArray __processData(const QByteArray &data, packetBuffer_t* buffer); | |||
|
56 | private slots: | |||
|
57 | void readyRead(); | |||
51 |
|
58 | |||
52 | public: |
|
59 | public: | |
53 |
QTcpSocket |
|
60 | QTcpSocket Read_soc; | |
54 |
QTcpSocket |
|
61 | QTcpSocket Write_soc; | |
|
62 | QMutex incomingPacketsMutex; | |||
|
63 | QQueue<QByteArray> incomingPackets; | |||
55 | QString IP; |
|
64 | QString IP; | |
56 | int virtualLinkIndex; |
|
65 | int virtualLinkIndex; | |
57 | int RMAPtimeout; |
|
|||
58 | }; |
|
66 | }; | |
59 |
|
67 | |||
60 |
|
68 |
@@ -6,8 +6,8 | |||||
6 | <rect> |
|
6 | <rect> | |
7 | <x>0</x> |
|
7 | <x>0</x> | |
8 | <y>0</y> |
|
8 | <y>0</y> | |
9 |
<width>9 |
|
9 | <width>978</width> | |
10 |
<height> |
|
10 | <height>518</height> | |
11 | </rect> |
|
11 | </rect> | |
12 | </property> |
|
12 | </property> | |
13 | <property name="windowTitle"> |
|
13 | <property name="windowTitle"> | |
@@ -30,7 +30,188 | |||||
30 | <string>Config</string> |
|
30 | <string>Config</string> | |
31 | </attribute> |
|
31 | </attribute> | |
32 | <layout class="QGridLayout" name="gridLayout_2"> |
|
32 | <layout class="QGridLayout" name="gridLayout_2"> | |
|
33 | <item row="4" column="2"> | |||
|
34 | <widget class="QLineEdit" name="destinationAddressLineEdit"> | |||
|
35 | <property name="toolTip"> | |||
|
36 | <string><html><head/><body><p>Set the RMAP target address, this address will be used as destination address for all the RMAP transfers.</p><p>This is you SOC spw address.</p></body></html></string> | |||
|
37 | </property> | |||
|
38 | <property name="inputMask"> | |||
|
39 | <string comment="ddD"/> | |||
|
40 | </property> | |||
|
41 | <property name="text"> | |||
|
42 | <string>254</string> | |||
|
43 | </property> | |||
|
44 | <property name="maxLength"> | |||
|
45 | <number>3</number> | |||
|
46 | </property> | |||
|
47 | </widget> | |||
|
48 | </item> | |||
|
49 | <item row="11" column="0" colspan="3"> | |||
|
50 | <widget class="QWidget" name="widget" native="true"> | |||
|
51 | <layout class="QGridLayout" name="gridLayout"> | |||
|
52 | <item row="0" column="2"> | |||
|
53 | <widget class="QLabel" name="label_7"> | |||
|
54 | <property name="font"> | |||
|
55 | <font> | |||
|
56 | <weight>75</weight> | |||
|
57 | <bold>true</bold> | |||
|
58 | </font> | |||
|
59 | </property> | |||
|
60 | <property name="text"> | |||
|
61 | <string>Transmitted</string> | |||
|
62 | </property> | |||
|
63 | </widget> | |||
|
64 | </item> | |||
33 | <item row="1" column="1"> |
|
65 | <item row="1" column="1"> | |
|
66 | <widget class="QLabel" name="ReceivedPackets"> | |||
|
67 | <property name="text"> | |||
|
68 | <string>-</string> | |||
|
69 | </property> | |||
|
70 | </widget> | |||
|
71 | </item> | |||
|
72 | <item row="2" column="2"> | |||
|
73 | <widget class="QLabel" name="TransmittedBytes"> | |||
|
74 | <property name="text"> | |||
|
75 | <string>-</string> | |||
|
76 | </property> | |||
|
77 | </widget> | |||
|
78 | </item> | |||
|
79 | <item row="2" column="0"> | |||
|
80 | <widget class="QLabel" name="label_5"> | |||
|
81 | <property name="text"> | |||
|
82 | <string>Bytes</string> | |||
|
83 | </property> | |||
|
84 | </widget> | |||
|
85 | </item> | |||
|
86 | <item row="2" column="1"> | |||
|
87 | <widget class="QLabel" name="ReceivedBytes"> | |||
|
88 | <property name="text"> | |||
|
89 | <string>-</string> | |||
|
90 | </property> | |||
|
91 | </widget> | |||
|
92 | </item> | |||
|
93 | <item row="1" column="2"> | |||
|
94 | <widget class="QLabel" name="TransmittedPackets"> | |||
|
95 | <property name="text"> | |||
|
96 | <string>-</string> | |||
|
97 | </property> | |||
|
98 | </widget> | |||
|
99 | </item> | |||
|
100 | <item row="0" column="1"> | |||
|
101 | <widget class="QLabel" name="label_3"> | |||
|
102 | <property name="font"> | |||
|
103 | <font> | |||
|
104 | <weight>75</weight> | |||
|
105 | <bold>true</bold> | |||
|
106 | </font> | |||
|
107 | </property> | |||
|
108 | <property name="text"> | |||
|
109 | <string>Received</string> | |||
|
110 | </property> | |||
|
111 | </widget> | |||
|
112 | </item> | |||
|
113 | <item row="1" column="0"> | |||
|
114 | <widget class="QLabel" name="label_4"> | |||
|
115 | <property name="text"> | |||
|
116 | <string>Packets</string> | |||
|
117 | </property> | |||
|
118 | </widget> | |||
|
119 | </item> | |||
|
120 | <item row="0" column="0"> | |||
|
121 | <widget class="QPushButton" name="resetStatsQpb"> | |||
|
122 | <property name="text"> | |||
|
123 | <string>Reset stats</string> | |||
|
124 | </property> | |||
|
125 | </widget> | |||
|
126 | </item> | |||
|
127 | </layout> | |||
|
128 | </widget> | |||
|
129 | </item> | |||
|
130 | <item row="3" column="2"> | |||
|
131 | <widget class="QLineEdit" name="sourceAddressLineEdit"> | |||
|
132 | <property name="toolTip"> | |||
|
133 | <string><html><head/><body><p>Set the Space Wire Brick destination Key, the default value is 32 (0x20).</p></body></html></string> | |||
|
134 | </property> | |||
|
135 | <property name="inputMask"> | |||
|
136 | <string comment="ddD"/> | |||
|
137 | </property> | |||
|
138 | <property name="text"> | |||
|
139 | <string>32</string> | |||
|
140 | </property> | |||
|
141 | <property name="maxLength"> | |||
|
142 | <number>3</number> | |||
|
143 | </property> | |||
|
144 | </widget> | |||
|
145 | </item> | |||
|
146 | <item row="8" column="2"> | |||
|
147 | <widget class="QLineEdit" name="RMAPTimeoutLineEdit"> | |||
|
148 | <property name="toolTip"> | |||
|
149 | <string><html><head/><body><p>Set the RMAP timeout, when waiting for a RMAP answer the driver will give up after this time if it doesn't get any answer.</p></body></html></string> | |||
|
150 | </property> | |||
|
151 | <property name="inputMethodHints"> | |||
|
152 | <set>Qt::ImhDigitsOnly</set> | |||
|
153 | </property> | |||
|
154 | <property name="inputMask"> | |||
|
155 | <string comment="DDdd;"/> | |||
|
156 | </property> | |||
|
157 | <property name="text"> | |||
|
158 | <string>500</string> | |||
|
159 | </property> | |||
|
160 | <property name="maxLength"> | |||
|
161 | <number>5</number> | |||
|
162 | </property> | |||
|
163 | </widget> | |||
|
164 | </item> | |||
|
165 | <item row="2" column="2"> | |||
|
166 | <widget class="QComboBox" name="GRESB_LinkNum_CmBx"> | |||
|
167 | <item> | |||
|
168 | <property name="text"> | |||
|
169 | <string>SPW0</string> | |||
|
170 | </property> | |||
|
171 | </item> | |||
|
172 | <item> | |||
|
173 | <property name="text"> | |||
|
174 | <string>SPW1</string> | |||
|
175 | </property> | |||
|
176 | </item> | |||
|
177 | <item> | |||
|
178 | <property name="text"> | |||
|
179 | <string>SPW2</string> | |||
|
180 | </property> | |||
|
181 | </item> | |||
|
182 | </widget> | |||
|
183 | </item> | |||
|
184 | <item row="4" column="0"> | |||
|
185 | <widget class="QLabel" name="RMAPaddressLbl"> | |||
|
186 | <property name="text"> | |||
|
187 | <string>Destination address</string> | |||
|
188 | </property> | |||
|
189 | </widget> | |||
|
190 | </item> | |||
|
191 | <item row="6" column="2"> | |||
|
192 | <widget class="QLineEdit" name="destinationKeyLineEdit"> | |||
|
193 | <property name="toolTip"> | |||
|
194 | <string><html><head/><body><p>Set the RMAP target key, this key will be used for all the RMAP transfers.</p><p>This is you SOC spw key.</p></body></html></string> | |||
|
195 | </property> | |||
|
196 | <property name="inputMask"> | |||
|
197 | <string comment="ddD"/> | |||
|
198 | </property> | |||
|
199 | <property name="text"> | |||
|
200 | <string comment="ddD">2</string> | |||
|
201 | </property> | |||
|
202 | <property name="maxLength"> | |||
|
203 | <number>3</number> | |||
|
204 | </property> | |||
|
205 | </widget> | |||
|
206 | </item> | |||
|
207 | <item row="1" column="0"> | |||
|
208 | <widget class="QLabel" name="GRESB_Vlink_Lbl"> | |||
|
209 | <property name="text"> | |||
|
210 | <string>GR-ESB Virtual link</string> | |||
|
211 | </property> | |||
|
212 | </widget> | |||
|
213 | </item> | |||
|
214 | <item row="1" column="2"> | |||
34 | <widget class="QComboBox" name="GRESB_Vlink_CmBx"> |
|
215 | <widget class="QComboBox" name="GRESB_Vlink_CmBx"> | |
35 | <item> |
|
216 | <item> | |
36 | <property name="text"> |
|
217 | <property name="text"> | |
@@ -64,33 +245,21 | |||||
64 | </item> |
|
245 | </item> | |
65 | </widget> |
|
246 | </widget> | |
66 | </item> |
|
247 | </item> | |
67 |
<item row=" |
|
248 | <item row="3" column="0"> | |
68 |
<widget class="QLabel" name=" |
|
249 | <widget class="QLabel" name="setDestKeyLbl"> | |
69 | <property name="text"> |
|
250 | <property name="text"> | |
70 |
<string> |
|
251 | <string>Source address</string> | |
71 | </property> |
|
252 | </property> | |
72 | </widget> |
|
253 | </widget> | |
73 | </item> |
|
254 | </item> | |
74 |
<item row=" |
|
255 | <item row="8" column="0"> | |
75 |
<widget class="Q |
|
256 | <widget class="QLabel" name="RMAPTimeoutLbl"> | |
76 | <item> |
|
|||
77 | <property name="text"> |
|
|||
78 | <string>SPW0</string> |
|
|||
79 | </property> |
|
|||
80 | </item> |
|
|||
81 | <item> |
|
|||
82 |
|
|
257 | <property name="text"> | |
83 |
|
|
258 | <string>RMAP timeout(ms)</string> | |
84 |
|
|
259 | </property> | |
85 | </item> |
|
|||
86 | <item> |
|
|||
87 | <property name="text"> |
|
|||
88 | <string>SPW2</string> |
|
|||
89 | </property> |
|
|||
90 | </item> |
|
|||
91 | </widget> |
|
260 | </widget> | |
92 | </item> |
|
261 | </item> | |
93 |
<item row="0" column=" |
|
262 | <item row="0" column="2"> | |
94 | <widget class="QLineEdit" name="GRESB_IP_lineEdit"/> |
|
263 | <widget class="QLineEdit" name="GRESB_IP_lineEdit"/> | |
95 | </item> |
|
264 | </item> | |
96 | <item row="2" column="0"> |
|
265 | <item row="2" column="0"> | |
@@ -100,6 +269,13 | |||||
100 | </property> |
|
269 | </property> | |
101 | </widget> |
|
270 | </widget> | |
102 | </item> |
|
271 | </item> | |
|
272 | <item row="6" column="0"> | |||
|
273 | <widget class="QLabel" name="RMAPKeyLbl"> | |||
|
274 | <property name="text"> | |||
|
275 | <string>Destination key</string> | |||
|
276 | </property> | |||
|
277 | </widget> | |||
|
278 | </item> | |||
103 | <item row="0" column="0"> |
|
279 | <item row="0" column="0"> | |
104 | <widget class="QLabel" name="GRESB_IP_Lbl"> |
|
280 | <widget class="QLabel" name="GRESB_IP_Lbl"> | |
105 | <property name="text"> |
|
281 | <property name="text"> | |
@@ -107,7 +283,7 | |||||
107 | </property> |
|
283 | </property> | |
108 | </widget> |
|
284 | </widget> | |
109 | </item> |
|
285 | </item> | |
110 |
<item row=" |
|
286 | <item row="10" column="0" colspan="3"> | |
111 | <widget class="QPushButton" name="connectQpb"> |
|
287 | <widget class="QPushButton" name="connectQpb"> | |
112 | <property name="text"> |
|
288 | <property name="text"> | |
113 | <string>Connect</string> |
|
289 | <string>Connect</string> | |
@@ -125,7 +301,7 | |||||
125 | </attribute> |
|
301 | </attribute> | |
126 | <layout class="QHBoxLayout" name="horizontalLayout"> |
|
302 | <layout class="QHBoxLayout" name="horizontalLayout"> | |
127 | <item> |
|
303 | <item> | |
128 |
<widget class="QWebView" name="WebView" |
|
304 | <widget class="QWebView" name="WebView"/> | |
129 | </item> |
|
305 | </item> | |
130 | </layout> |
|
306 | </layout> | |
131 | </widget> |
|
307 | </widget> | |
@@ -137,7 +313,7 | |||||
137 | <customwidget> |
|
313 | <customwidget> | |
138 | <class>QWebView</class> |
|
314 | <class>QWebView</class> | |
139 | <extends>QWidget</extends> |
|
315 | <extends>QWidget</extends> | |
140 |
<header |
|
316 | <header>QtWebKitWidgets/QWebView</header> | |
141 | <container>1</container> |
|
317 | <container>1</container> | |
142 | </customwidget> |
|
318 | </customwidget> | |
143 | </customwidgets> |
|
319 | </customwidgets> |
@@ -40,11 +40,11 stardundeeSPW_USB::stardundeeSPW_USB(soc | |||||
40 | Q_UNUSED(parent) |
|
40 | Q_UNUSED(parent) | |
41 | this->manager = new stardundeeSPW_USB_Manager(parent,this); |
|
41 | this->manager = new stardundeeSPW_USB_Manager(parent,this); | |
42 | makeGUI(parent); |
|
42 | makeGUI(parent); | |
43 | this->manager->start(); |
|
|||
44 | connect(this->manager,SIGNAL(emitPacket(char*,int)),this,SIGNAL(pushPacketOverTCP(char*,int))); |
|
43 | connect(this->manager,SIGNAL(emitPacket(char*,int)),this,SIGNAL(pushPacketOverTCP(char*,int))); | |
45 | connect(this->manager, SIGNAL(bytesReceivedFromSpw(uint)), this, SIGNAL(BytesReceivedFromSpw(uint))); |
|
44 | connect(this->manager, SIGNAL(bytesReceivedFromSpw(uint)), this, SIGNAL(BytesReceivedFromSpw(uint))); | |
46 | connect(this->manager, SIGNAL(bytesTransmittedToSpw(uint)), this, SIGNAL(BytesTransmittedToSpw(uint))); |
|
45 | connect(this->manager, SIGNAL(bytesTransmittedToSpw(uint)), this, SIGNAL(BytesTransmittedToSpw(uint))); | |
47 | connect(this->manager, SIGNAL(ccsdsPacketTransmittedToSpw()), this, SIGNAL(CCSDSPacketTransmittedToSpw())); |
|
46 | connect(this->manager, SIGNAL(ccsdsPacketTransmittedToSpw()), this, SIGNAL(CCSDSPacketTransmittedToSpw())); | |
|
47 | this->manager->start(); | |||
48 | } |
|
48 | } | |
49 |
|
49 | |||
50 | stardundeeSPW_USB::~stardundeeSPW_USB() |
|
50 | stardundeeSPW_USB::~stardundeeSPW_USB() | |
@@ -215,9 +215,12 unsigned int stardundeeSPW_USB::Read(uns | |||||
215 | free(RMAP_AnswerBuffer); |
|
215 | free(RMAP_AnswerBuffer); | |
216 | read+=RMAP_MAX_XFER_SIZE; |
|
216 | read+=RMAP_MAX_XFER_SIZE; | |
217 | count-=RMAP_MAX_XFER_SIZE; |
|
217 | count-=RMAP_MAX_XFER_SIZE; | |
|
218 | if(progress!=NULL) | |||
|
219 | { | |||
218 | progress->setValue(read); |
|
220 | progress->setValue(read); | |
219 | qApp->processEvents(); |
|
221 | qApp->processEvents(); | |
220 | } |
|
222 | } | |
|
223 | } | |||
221 | if((int)count>0) |
|
224 | if((int)count>0) | |
222 | { |
|
225 | { | |
223 | transactionID = manager->getRMAPtransactionID(); |
|
226 | transactionID = manager->getRMAPtransactionID(); | |
@@ -329,7 +332,6 void stardundeeSPW_USB::makeGUI(socexplo | |||||
329 | { |
|
332 | { | |
330 | Q_UNUSED(parent) |
|
333 | Q_UNUSED(parent) | |
331 | this->p_GUI = new StarDundeeGUI(); |
|
334 | this->p_GUI = new StarDundeeGUI(); | |
332 | // this->mainLayout = new QGridLayout(this->p_GUI); |
|
|||
333 | connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(connectClicked()),this,SLOT(toggleBridgeConnection())); |
|
335 | connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(connectClicked()),this,SLOT(toggleBridgeConnection())); | |
334 | connect(this->manager,SIGNAL(updateAvailableBrickCount(int)),((StarDundeeGUI*)this->p_GUI),SLOT(updateAvailableBrickCount(int))); |
|
336 | connect(this->manager,SIGNAL(updateAvailableBrickCount(int)),((StarDundeeGUI*)this->p_GUI),SLOT(updateAvailableBrickCount(int))); | |
335 | connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(brickSelectionChanged(int)),this,SLOT(brickSelectionChanged(int))); |
|
337 | connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(brickSelectionChanged(int)),this,SLOT(brickSelectionChanged(int))); | |
@@ -400,16 +402,8 void stardundeeSPW_USB::sendPacketComing | |||||
400 | } |
|
402 | } | |
401 |
|
403 | |||
402 | stardundeeSPW_USB_Manager::stardundeeSPW_USB_Manager(socexplorerplugin *plugin, QObject *parent) |
|
404 | stardundeeSPW_USB_Manager::stardundeeSPW_USB_Manager(socexplorerplugin *plugin, QObject *parent) | |
403 | :QThread((QObject*)parent) |
|
405 | :abstractSpwManager(plugin, parent) | |
404 | { |
|
406 | { | |
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 | // TODO remove this crap! |
|
407 | // TODO remove this crap! | |
414 | this->initDialog(); |
|
408 | this->initDialog(); | |
415 | // this->moveToThread(this); |
|
409 | // this->moveToThread(this); | |
@@ -417,10 +411,6 stardundeeSPW_USB_Manager::stardundeeSPW | |||||
417 |
|
411 | |||
418 | stardundeeSPW_USB_Manager::~stardundeeSPW_USB_Manager() |
|
412 | stardundeeSPW_USB_Manager::~stardundeeSPW_USB_Manager() | |
419 | { |
|
413 | { | |
420 | this->terminate(); |
|
|||
421 | while (!this->isFinished()) { |
|
|||
422 | this->usleep(1000); |
|
|||
423 | } |
|
|||
424 | } |
|
414 | } | |
425 |
|
415 | |||
426 | void stardundeeSPW_USB_Manager::run() |
|
416 | void stardundeeSPW_USB_Manager::run() | |
@@ -867,7 +857,7 void stardundeeSPW_USB_Manager::initiali | |||||
867 | unsigned int stardundeeSPW_USB_Manager::getLinkStatus(unsigned char link) |
|
857 | unsigned int stardundeeSPW_USB_Manager::getLinkStatus(unsigned char link) | |
868 | { |
|
858 | { | |
869 | U32 statusControl, errorStatus, portType; |
|
859 | U32 statusControl, errorStatus, portType; | |
870 | U32 linkStatus, operatingSpeed, outputPortConnection; |
|
860 | U32 linkStatus=0, operatingSpeed, outputPortConnection; | |
871 | char isLinkRunning, isAutoStart, isStart, isDisabled, isTristate; |
|
861 | char isLinkRunning, isAutoStart, isStart, isDisabled, isTristate; | |
872 |
|
862 | |||
873 | // Read the link status control register |
|
863 | // Read the link status control register | |
@@ -912,9 +902,9 unsigned int stardundeeSPW_USB_Manager:: | |||||
912 | bool stardundeeSPW_USB_Manager::disconnectBridge() |
|
902 | bool stardundeeSPW_USB_Manager::disconnectBridge() | |
913 | { |
|
903 | { | |
914 | this->handleMutex->lock(); |
|
904 | this->handleMutex->lock(); | |
|
905 | USBSpaceWire_UnregisterReceiveOnAllPorts(hDevice); // Stop receiving on all ports | |||
915 | USBSpaceWire_Close(hDevice); // Close the device |
|
906 | USBSpaceWire_Close(hDevice); // Close the device | |
916 | SocExplorerEngine::message(this->plugin,"stardundee *** Close *** USBSpaceWire_Close, device: " + QString::number(0),0); |
|
907 | SocExplorerEngine::message(this->plugin,"stardundee *** Close *** USBSpaceWire_Close, device: " + QString::number(0),0); | |
917 | USBSpaceWire_UnregisterReceiveOnAllPorts(hDevice); // Stop receiving on all ports |
|
|||
918 | this->handleMutex->unlock(); |
|
908 | this->handleMutex->unlock(); | |
919 | this->RMAP_pending_transaction_IDsMtx->lock(); |
|
909 | this->RMAP_pending_transaction_IDsMtx->lock(); | |
920 | this->RMAP_pending_transaction_IDs.clear(); |
|
910 | this->RMAP_pending_transaction_IDs.clear(); | |
@@ -926,84 +916,6 bool stardundeeSPW_USB_Manager::disconne | |||||
926 | return true; |
|
916 | return true; | |
927 | } |
|
917 | } | |
928 |
|
918 | |||
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 | bool stardundeeSPW_USB_Manager::sendPacket(char *packet, int size) |
|
919 | bool stardundeeSPW_USB_Manager::sendPacket(char *packet, int size) | |
1008 | { |
|
920 | { | |
1009 | char protocoleIdentifier; |
|
921 | char protocoleIdentifier; | |
@@ -1032,15 +944,6 bool stardundeeSPW_USB_Manager::sendPack | |||||
1032 | return true; |
|
944 | return true; | |
1033 | } |
|
945 | } | |
1034 |
|
946 | |||
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 |
|
947 | |||
1045 | void stardundeeSPW_USB_Manager::sendTimecodePeriodically( bool onOff ) |
|
948 | void stardundeeSPW_USB_Manager::sendTimecodePeriodically( bool onOff ) | |
1046 | { |
|
949 | { |
@@ -41,7 +41,7 | |||||
41 | #define BRICK_IS_SET_AS_AN_INTERFACE true |
|
41 | #define BRICK_IS_SET_AS_AN_INTERFACE true | |
42 | #define BRICK_IS_SET_AS_A_ROUTER false |
|
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 | Q_OBJECT |
|
46 | Q_OBJECT | |
47 | public: |
|
47 | public: | |
@@ -58,8 +58,6 public: | |||||
58 | void setTimecodeFrequency(double requestedFrequency); |
|
58 | void setTimecodeFrequency(double requestedFrequency); | |
59 | unsigned int getLinkStatus(unsigned char link); |
|
59 | unsigned int getLinkStatus(unsigned char link); | |
60 | bool disconnectBridge(); |
|
60 | bool disconnectBridge(); | |
61 | int getRMAPtransactionID(); |
|
|||
62 | int getRMAPanswer(int transactionID,char** buffer); |
|
|||
63 | bool sendPacket(char* packet,int size); |
|
61 | bool sendPacket(char* packet,int size); | |
64 |
|
62 | |||
65 | signals: |
|
63 | signals: | |
@@ -75,15 +73,8 public slots: | |||||
75 | int getLinkNumber( void ); |
|
73 | int getLinkNumber( void ); | |
76 |
|
74 | |||
77 | private: |
|
75 | private: | |
78 | QMutex *handleMutex,*RMAP_AnswersMtx,*RMAP_pending_transaction_IDsMtx; |
|
76 | //QSemaphore* RMAP_AnswersSem; | |
79 | QSemaphore* RMAP_AnswersSem; |
|
|||
80 | void pushRmapPacket(char* packet,int len); |
|
|||
81 | star_device_handle hDevice; |
|
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 | QLabel *starDundeeStatusQueryDialogLabel; |
|
79 | QLabel *starDundeeStatusQueryDialogLabel; | |
89 | QPushButton *starDundeeStatusQueryRetryButton; |
|
80 | QPushButton *starDundeeStatusQueryRetryButton; | |
@@ -96,13 +87,8 private: | |||||
96 |
|
87 | |||
97 | public: |
|
88 | public: | |
98 | int selectedBrick; |
|
89 | int selectedBrick; | |
99 | int linkNumber; |
|
|||
100 | int brickList; |
|
90 | int brickList; | |
101 | int linkSpeed; |
|
91 | int linkSpeed; | |
102 | int sourceLogicalAddress; |
|
|||
103 | int destinationLogicalAddress; |
|
|||
104 | int destinationKey; |
|
|||
105 | int RMAPtimeout; |
|
|||
106 | double timecodeFrequency; |
|
92 | double timecodeFrequency; | |
107 | bool interfaceMode; // 1 => interface mode, 0 => router mode |
|
93 | bool interfaceMode; // 1 => interface mode, 0 => router mode | |
108 | }; |
|
94 | }; |
@@ -20,6 +20,8 | |||||
20 | -- Mail : alexis.jeandet@member.fsf.org |
|
20 | -- Mail : alexis.jeandet@member.fsf.org | |
21 | ----------------------------------------------------------------------------*/ |
|
21 | ----------------------------------------------------------------------------*/ | |
22 | #include "abstractspwbridge.h" |
|
22 | #include "abstractspwbridge.h" | |
|
23 | #include <QTime> | |||
|
24 | #include <socexplorerengine.h> | |||
23 |
|
25 | |||
24 | abstractSpwBridge::abstractSpwBridge(socexplorerplugin *parent) |
|
26 | abstractSpwBridge::abstractSpwBridge(socexplorerplugin *parent) | |
25 | :QObject((QObject*)parent) |
|
27 | :QObject((QObject*)parent) | |
@@ -54,3 +56,124 bool abstractSpwBridge::disconnectBridge | |||||
54 |
|
56 | |||
55 |
|
57 | |||
56 |
|
58 | |||
|
59 | ||||
|
60 | ||||
|
61 | ||||
|
62 | abstractSpwManager::abstractSpwManager(socexplorerplugin *plugin, QObject *parent) | |||
|
63 | :QThread((QObject*)parent) | |||
|
64 | { | |||
|
65 | this->RMAPtimeout = 2000; | |||
|
66 | this->handleMutex = new QMutex(QMutex::NonRecursive); | |||
|
67 | this->RMAP_AnswersSem = new QSemaphore(0); | |||
|
68 | this->RMAP_AnswersMtx=new QMutex(QMutex::Recursive); | |||
|
69 | this->RMAP_pending_transaction_IDsMtx=new QMutex(QMutex::Recursive); | |||
|
70 | this->plugin = plugin; | |||
|
71 | connected = false; | |||
|
72 | } | |||
|
73 | ||||
|
74 | abstractSpwManager::~abstractSpwManager() | |||
|
75 | { | |||
|
76 | this->terminate(); | |||
|
77 | while (!this->isFinished()) | |||
|
78 | { | |||
|
79 | this->usleep(1000); | |||
|
80 | } | |||
|
81 | } | |||
|
82 | ||||
|
83 | int abstractSpwManager::getRMAPtransactionID() | |||
|
84 | { | |||
|
85 | this->RMAP_pending_transaction_IDsMtx->lock(); | |||
|
86 | int ID=0; | |||
|
87 | bool found=true; | |||
|
88 | while(ID<511) | |||
|
89 | { | |||
|
90 | for(int i=0;i<RMAP_pending_transaction_IDs.count();i++) | |||
|
91 | { | |||
|
92 | if(RMAP_pending_transaction_IDs[i]==ID)found=false; | |||
|
93 | } | |||
|
94 | if(found==true)break; | |||
|
95 | ID++; | |||
|
96 | found = true; | |||
|
97 | } | |||
|
98 | if(found) | |||
|
99 | { | |||
|
100 | RMAP_pending_transaction_IDs.append(ID); | |||
|
101 | } | |||
|
102 | this->RMAP_pending_transaction_IDsMtx->unlock(); | |||
|
103 | return ID; | |||
|
104 | } | |||
|
105 | ||||
|
106 | int abstractSpwManager::getRMAPanswer(int transactionID, char **buffer) | |||
|
107 | { | |||
|
108 | ||||
|
109 | QTime timeout; | |||
|
110 | *buffer=NULL; | |||
|
111 | int count=0; | |||
|
112 | SocExplorerEngine::message(this->plugin,"Looking for RMAP answer",2); | |||
|
113 | qApp->processEvents(); | |||
|
114 | timeout.start(); | |||
|
115 | while (*buffer==NULL) | |||
|
116 | { | |||
|
117 | this->RMAP_AnswersMtx->lock(); | |||
|
118 | SocExplorerEngine::message(this->plugin,"Got exclusive access on RMAP_Answers stack",2); | |||
|
119 | SocExplorerEngine::message(this->plugin,QString("%1 packet(s) available in RMAP_Answers stack").arg(RMAP_Answers.count()),2); | |||
|
120 | for(int i=0;i<RMAP_Answers.count();i++) | |||
|
121 | { | |||
|
122 | SocExplorerEngine::message(this->plugin,QString("Packet %1 ID=%2").arg(i).arg(RMAP_Answers[i]->transactionID),2); | |||
|
123 | if(RMAP_Answers[i]->transactionID==transactionID) | |||
|
124 | { | |||
|
125 | this->RMAP_pending_transaction_IDsMtx->lock(); | |||
|
126 | SocExplorerEngine::message(this->plugin,"Got exclusive access on RMAP_pending_transaction_ID stack",2); | |||
|
127 | for(int j=0;j<RMAP_pending_transaction_IDs.count();j++) | |||
|
128 | { | |||
|
129 | if(RMAP_pending_transaction_IDs[j]==transactionID) | |||
|
130 | { | |||
|
131 | RMAP_pending_transaction_IDs.removeAt(j); | |||
|
132 | } | |||
|
133 | } | |||
|
134 | this->RMAP_pending_transaction_IDsMtx->unlock(); | |||
|
135 | *buffer = RMAP_Answers[i]->data; | |||
|
136 | count = RMAP_Answers[i]->len; | |||
|
137 | RMAP_Answer* tmp=RMAP_Answers[i]; | |||
|
138 | RMAP_Answers.removeAt(i); | |||
|
139 | delete tmp; | |||
|
140 | } | |||
|
141 | } | |||
|
142 | this->RMAP_AnswersMtx->unlock(); | |||
|
143 | //if no answer found in the stack wait until a new packet is pushed | |||
|
144 | SocExplorerEngine::message(this->plugin,"waiting until a new packet is pushed",2); | |||
|
145 | if(*buffer==NULL) | |||
|
146 | { | |||
|
147 | while (0==this->RMAP_AnswersSem->available()) | |||
|
148 | { | |||
|
149 | SocExplorerEngine::message(this->plugin,QString("this->RMAP_AnswersSem->available() = %1").arg(this->RMAP_AnswersSem->available()),2); | |||
|
150 | if(timeout.elapsed()>=RMAPtimeout) | |||
|
151 | { | |||
|
152 | SocExplorerEngine::message(this->plugin,"Timeout reached giving up!",2); | |||
|
153 | return -1; | |||
|
154 | } | |||
|
155 | usleep(1000); | |||
|
156 | qApp->processEvents(); | |||
|
157 | } | |||
|
158 | this->RMAP_AnswersSem->acquire(); | |||
|
159 | } | |||
|
160 | } | |||
|
161 | return count; | |||
|
162 | } | |||
|
163 | ||||
|
164 | int abstractSpwManager::getLinkNumber() | |||
|
165 | { | |||
|
166 | return this->linkNumber; | |||
|
167 | } | |||
|
168 | ||||
|
169 | void abstractSpwManager::pushRmapPacket(char *packet, int len) | |||
|
170 | { | |||
|
171 | char* packetbuffer = (char*)malloc(len); | |||
|
172 | memcpy(packetbuffer,packet,len); | |||
|
173 | RMAP_Answer* RMPAPpacket=new RMAP_Answer(RMAP_get_transactionID(packetbuffer+1),packetbuffer,len); | |||
|
174 | RMAP_AnswersMtx->lock(); | |||
|
175 | RMAP_Answers.append(RMPAPpacket); | |||
|
176 | RMAP_AnswersMtx->unlock(); | |||
|
177 | } | |||
|
178 | ||||
|
179 |
@@ -23,6 +23,9 | |||||
23 | #define ABSTRACTSPWBRIDGE_H |
|
23 | #define ABSTRACTSPWBRIDGE_H | |
24 |
|
24 | |||
25 | #include <QObject> |
|
25 | #include <QObject> | |
|
26 | #include <QThread> | |||
|
27 | #include <QMutex> | |||
|
28 | #include <QSemaphore> | |||
26 | #include <socexplorerplugin.h> |
|
29 | #include <socexplorerplugin.h> | |
27 | #define RMAP_MAX_XFER_SIZE 4000 //slightly less than 16kBytes |
|
30 | #define RMAP_MAX_XFER_SIZE 4000 //slightly less than 16kBytes | |
28 | #include <spw.h> |
|
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 | #endif // ABSTRACTSPWBRIDGE_H |
|
110 | #endif // ABSTRACTSPWBRIDGE_H |
@@ -12,7 +12,7 QMAKE_CFLAGS += -std=c++11 | |||||
12 |
|
12 | |||
13 | win32:CONFIG += dll |
|
13 | win32:CONFIG += dll | |
14 | win32:CONFIG -= static |
|
14 | win32:CONFIG -= static | |
15 |
VERSION=0.6. |
|
15 | VERSION=0.6.2 | |
16 | TARGET = spwplugin |
|
16 | TARGET = spwplugin | |
17 | DEFINES += PLUGIN=spwplugin |
|
17 | DEFINES += PLUGIN=spwplugin | |
18 | DEFINES += PLUGINHEADER="\"\\\"spwplugin.h"\\\"\" |
|
18 | DEFINES += PLUGINHEADER="\"\\\"spwplugin.h"\\\"\" | |
@@ -24,10 +24,6 DEFINES += driver_can_be_child=0 | |||||
24 | DEFINES += driver_VID=0 |
|
24 | DEFINES += driver_VID=0 | |
25 | DEFINES += driver_PID=0 |
|
25 | DEFINES += driver_PID=0 | |
26 |
|
26 | |||
27 | #STARTDUNDEEPATH=/home/spacewire/usb/spw_usb_driver_v2.68/ |
|
|||
28 |
|
||||
29 | #LIBS += $$STARTDUNDEEPATH/lib/x86_64/libSpaceWireUSBAPI.so \ |
|
|||
30 | # $$STARTDUNDEEPATH/lib/x86_64/libConfigLibraryUSB.so |
|
|||
31 |
|
27 | |||
32 | INCLUDEPATH += \ |
|
28 | INCLUDEPATH += \ | |
33 | $${PWD} \ |
|
29 | $${PWD} \ |
General Comments 0
You need to be logged in to leave comments.
Login now