##// END OF EJS Templates
Now RMAP write uses Transaction ID and waits for ack.
Jeandet Alexis -
r16:66782ba1cf13 default
parent child
Show More
@@ -32,7 +32,7 spwplugin::spwplugin(QWidget *parent):so
32 32 this->pyObject = new spwPyWrapper(this);
33 33 this->mainGroupBox = new QGroupBox("SpaceWire Plugin Configuration",this);
34 34 this->bridgeSelector = new QComboBox(this);
35 this->mainLayout = new QGridLayout(this);
35 this->mainLayout = new QGridLayout(this->mainGroupBox);
36 36 this->mainLayout->addWidget(new QLabel("Select SpaceWire bridge",this),0,0,1,1,Qt::AlignCenter);
37 37 this->mainLayout->addWidget(this->bridgeSelector,0,1,1,1);
38 38 this->mainGroupBox->setLayout(this->mainLayout);
@@ -82,6 +82,7 int stardundeeSPW_USB::pushRMAPPacket(ch
82 82 unsigned int stardundeeSPW_USB::Write(unsigned int *Value, unsigned int count, unsigned int address)
83 83 {
84 84 char writeBuffer[RMAP_WRITE_PACKET_MIN_SZ((RMAP_MAX_XFER_SIZE*4))+1];
85 char *RMAPAckBuff;
85 86 writeBuffer[0]=this->manager->linkNumber;//Link number
86 87 int transactionID = 0;
87 88 int written=0;
@@ -103,8 +104,12 unsigned int stardundeeSPW_USB::Write(un
103 104 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written]>>8)&0xFF);
104 105 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+4] = (char)(((unsigned int)Value[i+written])&0xFF);
105 106 }
107 transactionID=manager->getRMAPtransactionID();
108 SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2);
106 109 RMAP_build_tx_request_header(this->manager->rmapAddress,this->manager->rmapKey,1,transactionID,address+(written*4),RMAP_MAX_XFER_SIZE*4,writeBuffer+1);
107 110 manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(RMAP_MAX_XFER_SIZE*4)+1);
111 manager->getRMAPanswer(transactionID,&RMAPAckBuff);
112 free(RMAPAckBuff);
108 113 written+=RMAP_MAX_XFER_SIZE;
109 114 count-=RMAP_MAX_XFER_SIZE;
110 115 progress->setValue(written);
@@ -119,8 +124,12 unsigned int stardundeeSPW_USB::Write(un
119 124 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written]>>8)&0xFF);
120 125 writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+4] = (char)(((unsigned int)Value[i+written])&0xFF);
121 126 }
127 transactionID=manager->getRMAPtransactionID();
128 SocExplorerEngine::message(this->plugin,QString("Sending Write request with ID=%1").arg(transactionID),2);
122 129 RMAP_build_tx_request_header(this->manager->rmapAddress,this->manager->rmapKey,1,transactionID,address+(written*4),count*4,writeBuffer+1);
123 130 manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(count*4) +1);
131 manager->getRMAPanswer(transactionID,&RMAPAckBuff);
132 free(RMAPAckBuff);
124 133 written+=count;
125 134 if(progress!=NULL)
126 135 {
@@ -260,7 +269,7 void stardundeeSPW_USB::rmapTimeoutChang
260 269 void stardundeeSPW_USB::makeGUI(socexplorerplugin *parent)
261 270 {
262 271 this->p_GUI = new StarDundeeGUI();
263 // this->mainLayout = new QGridLayout(this->p_GUI);
272 // this->mainLayout = new QGridLayout(this->p_GUI);
264 273 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(connectClicked()),this,SLOT(toggleBridgeConnection()));
265 274 connect(this->manager,SIGNAL(updateAvailableBrickCount(int)),((StarDundeeGUI*)this->p_GUI),SLOT(updateAvailableBrickCount(int)));
266 275 connect(((StarDundeeGUI*)this->p_GUI),SIGNAL(brickSelectionChanged(int)),this,SLOT(brickSelectionChanged(int)));
@@ -338,29 +347,26 void stardundeeSPW_USB_Manager::run()
338 347 SocExplorerEngine::message(this->plugin,"Got end of packet",2);
339 348 if(buffer[1]==(char)SPW_PROTO_ID_RMAP) //RMAP packet
340 349 {
350 RMAP_Answer* packet;
341 351 SocExplorerEngine::message(this->plugin,"Got RMAP packet",2);
342 352 SocExplorerEngine::message(this->plugin,QString("Rmap packet size %1").arg(properties.len),2);
343 if(properties.len>8)
353 char* packetbuffer = (char*)malloc(properties.len);
354 memcpy(packetbuffer,buffer,properties.len);
355 USBSpaceWire_FreeRead(hDevice, pIdentifier);
356 pIdentifier = NULL;
357 handleMutex->unlock();
358 if(properties.len==8)
344 359 {
345 char* packetbuffer = (char*)malloc(properties.len);
346 memcpy(packetbuffer,buffer,properties.len);
347 USBSpaceWire_FreeRead(hDevice, pIdentifier);
348 pIdentifier = NULL;
349 handleMutex->unlock();
350 RMAP_Answer* packet=new RMAP_Answer(RMAP_get_transactionID(buffer+1),packetbuffer,properties.len);
351 RMAP_AnswersMtx->lock();
352 RMAP_Answers.append(packet);
353 RMAP_AnswersMtx->unlock();
354 RMAP_AnswersSem->release();
355
360 packet=new RMAP_Answer(RMAP_get_transactionID(buffer),packetbuffer,properties.len);
356 361 }
357 else //it's a RMAP write response
362 else
358 363 {
359 USBSpaceWire_FreeRead(hDevice, pIdentifier);
360 pIdentifier = NULL;
361 handleMutex->unlock();
364 packet=new RMAP_Answer(RMAP_get_transactionID(buffer+1),packetbuffer,properties.len);
362 365 }
363
366 RMAP_AnswersMtx->lock();
367 RMAP_Answers.append(packet);
368 RMAP_AnswersMtx->unlock();
369 RMAP_AnswersSem->release();
364 370 }
365 371 else //any non-rmap packet will be pushed to the network
366 372 {
@@ -538,9 +544,10 int stardundeeSPW_USB_Manager::getRMAPan
538 544 {
539 545 this->RMAP_AnswersMtx->lock();
540 546 SocExplorerEngine::message(this->plugin,"Got exclusive access on RMAP_Answers stack",2);
541 SocExplorerEngine::message(this->plugin,QString("%2 packet(s) available in RMAP_Answers stack").arg(RMAP_Answers.count()),2);
547 SocExplorerEngine::message(this->plugin,QString("%1 packet(s) available in RMAP_Answers stack").arg(RMAP_Answers.count()),2);
542 548 for(int i=0;i<RMAP_Answers.count();i++)
543 549 {
550 SocExplorerEngine::message(this->plugin,QString("Packet %1 ID=%2").arg(i).arg(RMAP_Answers[i]->transactionID),2);
544 551 if(RMAP_Answers[i]->transactionID==transactionID)
545 552 {
546 553 this->RMAP_pending_transaction_IDsMtx->lock();
General Comments 0
You need to be logged in to leave comments. Login now