# HG changeset patch # User Jeandet Alexis # Date 2014-02-27 07:40:41 # Node ID ca5cf5cd2804657369c3dbc477a4841e1e7959ac # Parent 2d12462f4460549746487fd4d8fbe1984fc13e07 Working Snapshot diff --git a/spwplugin/abstractspwbridge.h b/spwplugin/abstractspwbridge.h --- a/spwplugin/abstractspwbridge.h +++ b/spwplugin/abstractspwbridge.h @@ -3,7 +3,7 @@ #include #include -#define RMAP_MAX_XFER_SIZE 3000 //slightly less than 16kBytes +#define RMAP_MAX_XFER_SIZE 4000 //slightly less than 16kBytes #include class abstractSpwBridge : public QObject diff --git a/spwplugin/stardundeespw_usb.cpp b/spwplugin/stardundeespw_usb.cpp --- a/spwplugin/stardundeespw_usb.cpp +++ b/spwplugin/stardundeespw_usb.cpp @@ -27,54 +27,66 @@ int stardundeeSPW_USB::pushRMAPPacket(ch unsigned int stardundeeSPW_USB::Write(unsigned int *Value, unsigned int count, unsigned int address) { - //Add transactionID! - char writeBuffer[RMAP_WRITE_PACKET_MIN_SZ(RMAP_MAX_XFER_SIZE)+1]; + char writeBuffer[RMAP_WRITE_PACKET_MIN_SZ((RMAP_MAX_XFER_SIZE*4))+1]; writeBuffer[0]=1;//Link number int transactionID = 0; int written=0; SocExplorerEngine::message(this->plugin,"Enter Write function"); + QProgressBar* progress=NULL; + if(count>RMAP_MAX_XFER_SIZE) + progress= SocExplorerEngine::getProgressBar("Writing on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count); //Quite stupide loop, I guess that I always get the number of byte I asked for! - for(;count>=RMAP_MAX_XFER_SIZE;count-=RMAP_MAX_XFER_SIZE) + while(count>=RMAP_MAX_XFER_SIZE) { for(int i=0;i<(RMAP_MAX_XFER_SIZE);i++) { - writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char) ((unsigned int) Value[written+i]>>24); - writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char) ((unsigned int) Value[written+i]>>16); - writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char) ((unsigned int) Value[written+i]>>8); - writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+4] = (char) ((unsigned int) Value[written+i]); + writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>24)&0xFF); + writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>16)&0xFF); + writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written]>>8)&0xFF); + writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+4] = (char)(((unsigned int)Value[i+written])&0xFF); } - RMAP_build_tx_request_header(254,2,1,transactionID,address+written,RMAP_MAX_XFER_SIZE*4,writeBuffer+1); + RMAP_build_tx_request_header(254,2,1,transactionID,address+(written*4),RMAP_MAX_XFER_SIZE*4,writeBuffer+1); manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(RMAP_MAX_XFER_SIZE*4)+1); written+=RMAP_MAX_XFER_SIZE; + count-=RMAP_MAX_XFER_SIZE; + progress->setValue(written); + qApp->processEvents(); } if(count>0) { for(int i=0;i<((int)count);i++) { - writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char) ((unsigned int) Value[written+i]>>24); - writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char) ((unsigned int) Value[written+i]>>16); - writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char) ((unsigned int) Value[written+i]>>8); - writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+4] = (char) ((unsigned int) Value[written+i]); + writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+1] = (char)(((unsigned int)Value[i+written]>>24)&0xFF); + writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+2] = (char)(((unsigned int)Value[i+written]>>16)&0xFF); + writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+3] = (char)(((unsigned int)Value[i+written]>>8)&0xFF); + writeBuffer[RMAP_WRITE_HEADER_MIN_SZ+(i*4)+4] = (char)(((unsigned int)Value[i+written])&0xFF); } - RMAP_build_tx_request_header(254,2,1,transactionID,address+written,count*4,writeBuffer+1); + RMAP_build_tx_request_header(254,2,1,transactionID,address+(written*4),count*4,writeBuffer+1); manager->sendPacket(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(count*4) +1); - // QHexEdit* viewer = new QHexEdit(); - // viewer->setData(QByteArray(writeBuffer,RMAP_WRITE_PACKET_MIN_SZ(count*4)+1)); - // viewer->show(); written+=count; + if(progress!=NULL) + { + progress->setValue(written); + qApp->processEvents(); + } + } + if(progress!=NULL) + { + SocExplorerEngine::deleteProgressBar(progress); } return written; } unsigned int stardundeeSPW_USB::Read(unsigned int *Value, unsigned int count, unsigned int address) { - //Add transactionID! char requestBuffer[RMAP_READ_HEADER_MIN_SZ+1]; char* RMAP_AnswerBuffer; requestBuffer[0]=1;//Link number int transactionID = 0; int read=0; -// SocExplorerEngine::message(this->plugin,"Enter read function"); + QProgressBar* progress=NULL; + if(count>RMAP_MAX_XFER_SIZE) + progress= SocExplorerEngine::getProgressBar("Reading on SPW @0x"+QString::number(address,16)+" %v of "+QString::number(count)+" words ",count); SocExplorerEngine::message(this->plugin,QString("Enter read function, count=%1, RMAP_MAX_XFER_SIZE=%2").arg(count).arg(RMAP_MAX_XFER_SIZE)); //Quite stupide loop, I guess that I always get the number of byte I asked for! @@ -85,13 +97,18 @@ unsigned int stardundeeSPW_USB::Read(uns RMAP_build_rx_request_header(254,2,1,transactionID,address+(read*4),RMAP_MAX_XFER_SIZE*4,requestBuffer+1); manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ+1); int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer); - for(int i=0;i<(len/4);i++) + for(int i=0;i<((len-13)/4);i++) { - Value[read+i]=((unsigned int)(RMAP_AnswerBuffer[i])<<24) + ((unsigned int)(RMAP_AnswerBuffer[i+1])<<16) + ((unsigned int)(RMAP_AnswerBuffer[i+2])<<8) + ((unsigned int)(RMAP_AnswerBuffer[i+3])); + Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]); + Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13])); + Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14])); + Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15])); } free(RMAP_AnswerBuffer); read+=RMAP_MAX_XFER_SIZE; count-=RMAP_MAX_XFER_SIZE; + progress->setValue(read); + qApp->processEvents(); } if((int)count>0) { @@ -104,12 +121,24 @@ unsigned int stardundeeSPW_USB::Read(uns RMAP_build_rx_request_header(254,2,1,transactionID,address+(read*4),count*4,requestBuffer+1); manager->sendPacket(requestBuffer,RMAP_READ_HEADER_MIN_SZ+1); int len=manager->getRMAPanswer(transactionID,&RMAP_AnswerBuffer); - for(int i=0;i<(len/4);i++) + for(int i=0;i<((len-13)/4);i++) { - Value[read+i]=((unsigned int)(RMAP_AnswerBuffer[i])<<24) + ((unsigned int)(RMAP_AnswerBuffer[i+1])<<16) + ((unsigned int)(RMAP_AnswerBuffer[i+2])<<8) + ((unsigned int)(RMAP_AnswerBuffer[i+3])); + Value[read+i] = 0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+12]); + Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+13])); + Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+14])); + Value[read+i] = (Value[read+i]<<8) + (0x0FF & ((unsigned int)RMAP_AnswerBuffer[(4*i)+15])); } free(RMAP_AnswerBuffer); read+=count; + if(progress!=NULL) + { + progress->setValue(read); + qApp->processEvents(); + } + } + if(progress!=NULL) + { + SocExplorerEngine::deleteProgressBar(progress); } return read; } @@ -140,7 +169,7 @@ void stardundeeSPW_USB_Manager::run() USB_SPACEWIRE_ID pIdentifier=NULL; USB_SPACEWIRE_STATUS stat; SocExplorerEngine::message(this->plugin,"Starting Startdundee USB pooling thread"); - char buffer[RMAP_MAX_XFER_SIZE*4]; + char buffer[(RMAP_MAX_XFER_SIZE*4)+50]; while (!this->isInterruptionRequested()) { if(this->connected) @@ -150,7 +179,7 @@ void stardundeeSPW_USB_Manager::run() if(USBSpaceWire_WaitOnReadPacketAvailable(hDevice,0.01)) { SocExplorerEngine::message(this->plugin,"Got packet"); - stat = USBSpaceWire_ReadPackets(hDevice, buffer, RMAP_MAX_XFER_SIZE*4,1, 1, &properties, &pIdentifier); + stat = USBSpaceWire_ReadPackets(hDevice, buffer, (RMAP_MAX_XFER_SIZE*4)+50,1, 1, &properties, &pIdentifier); if (stat == TRANSFER_SUCCESS) { if(USBSpaceWire_GetReadTrafficType(&properties, 0) ==SPACEWIRE_TRAFFIC_PACKET) @@ -163,16 +192,27 @@ void stardundeeSPW_USB_Manager::run() { SocExplorerEngine::message(this->plugin,"Got RMAP packet"); SocExplorerEngine::message(this->plugin,QString("Rmap packet size %1").arg(properties.len)); - char* packetbuffer = (char*)malloc(properties.len-13); - memcpy(packetbuffer,buffer+12,properties.len-13); - USBSpaceWire_FreeRead(hDevice, pIdentifier); - pIdentifier = NULL; - handleMutex->unlock(); - RMAP_Answer* packet=new RMAP_Answer(RMAP_get_transactionID(buffer+1),packetbuffer,properties.len); - RMAP_AnswersMtx->lock(); - RMAP_Answers.append(packet); - RMAP_AnswersMtx->unlock(); - RMAP_AnswersSem->release(); + if(properties.len>8) + { + char* packetbuffer = (char*)malloc(properties.len); + memcpy(packetbuffer,buffer,properties.len); + USBSpaceWire_FreeRead(hDevice, pIdentifier); + pIdentifier = NULL; + handleMutex->unlock(); + RMAP_Answer* packet=new RMAP_Answer(RMAP_get_transactionID(buffer+1),packetbuffer,properties.len); + RMAP_AnswersMtx->lock(); + RMAP_Answers.append(packet); + RMAP_AnswersMtx->unlock(); + RMAP_AnswersSem->release(); + + } + else //it's a RMAP write response + { + USBSpaceWire_FreeRead(hDevice, pIdentifier); + pIdentifier = NULL; + handleMutex->unlock(); + } + } else //any non-rmap packet will be pushed to the network {