included subframe into receiver and sends to gui

This commit is contained in:
Dhanya Maliakal
2015-09-22 16:21:41 +02:00
parent 71cd046bed
commit 7c0430572b
6 changed files with 63 additions and 92 deletions

View File

@ -297,11 +297,10 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter
* Returns the buffer-current frame read by receiver * Returns the buffer-current frame read by receiver
* @param c pointer to current file name * @param c pointer to current file name
* @param raw address of pointer, pointing to current frame to send to gui * @param raw address of pointer, pointing to current frame to send to gui
* @param fnum frame number for eiger as it is not in the packet
* @param startAcquisitionIndex is the start index of the acquisition * @param startAcquisitionIndex is the start index of the acquisition
* @param startFrameIndex is the start index of the scan * @param startFrameIndex is the start index of the scan
*/ */
void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex); void readFrame(char* c,char** raw, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex);
/** /**
* Closes all files * Closes all files
@ -359,7 +358,7 @@ protected:
* Copy frames to gui * Copy frames to gui
* uses semaphore for nth frame mode * uses semaphore for nth frame mode
*/ */
void copyFrameToGui(char* startbuf[], uint32_t fnum=-1, char* buf=NULL); void copyFrameToGui(char* startbuf[], char* buf=NULL);
/** /**
* creates udp sockets * creates udp sockets
@ -483,6 +482,7 @@ protected:
//// Could be done more fine-grained... TODO //// Could be done more fine-grained... TODO
// private: // private:
protected: protected:
/** structure of an eiger packet*/ /** structure of an eiger packet*/
typedef struct typedef struct
{ {
@ -643,9 +643,6 @@ protected:
/** points to the filename to send to gui */ /** points to the filename to send to gui */
char* guiFileName; char* guiFileName;
/** temporary number for eiger frame number as its not included in the packet */
uint32_t guiFrameNumber;
/** send every nth frame to gui or only upon gui request*/ /** send every nth frame to gui or only upon gui request*/
int nFrameToGui; int nFrameToGui;

View File

@ -338,11 +338,10 @@ class UDPInterface {
* Returns the buffer-current frame read by receiver * Returns the buffer-current frame read by receiver
* @param c pointer to current file name * @param c pointer to current file name
* @param raw address of pointer, pointing to current frame to send to gui * @param raw address of pointer, pointing to current frame to send to gui
* @param fnum frame number for eiger as it is not in the packet
* @param startAcquisitionIndex is the start index of the acquisition * @param startAcquisitionIndex is the start index of the acquisition
* @param startFrameIndex is the start index of the scan * @param startFrameIndex is the start index of the scan
*/ */
virtual void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex)=0; virtual void readFrame(char* c,char** raw, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex)=0;
/** set status to transmitting and /** set status to transmitting and
* when fifo is empty later, sets status to run_finished * when fifo is empty later, sets status to run_finished

View File

@ -294,11 +294,10 @@ class UDPStandardImplementation: private virtual slsReceiverDefs, public UDPBase
* Returns the buffer-current frame read by receiver * Returns the buffer-current frame read by receiver
* @param c pointer to current file name * @param c pointer to current file name
* @param raw address of pointer, pointing to current frame to send to gui * @param raw address of pointer, pointing to current frame to send to gui
* @param fnum frame number for eiger as it is not in the packet
* @param startAcquisitionIndex is the start index of the acquisition * @param startAcquisitionIndex is the start index of the acquisition
* @param startFrameIndex is the start index of the scan * @param startFrameIndex is the start index of the scan
*/ */
void readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex); void readFrame(char* c,char** raw, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex);
/** /**
* Closes all files * Closes all files
@ -356,7 +355,7 @@ private:
* Copy frames to gui * Copy frames to gui
* uses semaphore for nth frame mode * uses semaphore for nth frame mode
*/ */
void copyFrameToGui(char* startbuf[], uint32_t fnum=-1, char* buf=NULL); void copyFrameToGui(char* startbuf[], char* buf=NULL);
/** /**
* creates udp sockets * creates udp sockets

View File

@ -567,7 +567,7 @@ void UDPBaseImplementation::setupFifoStructure(){ FILE_LOG(logDEBUG) << __AT__ <
/** acquisition functions */ /** acquisition functions */
void UDPBaseImplementation::readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex){ void UDPBaseImplementation::readFrame(char* c,char** raw,uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex){
FILE_LOG(logDEBUG) << __AT__ << " called"; FILE_LOG(logDEBUG) << __AT__ << " called";
//point to gui data //point to gui data
if (guiData == NULL){ if (guiData == NULL){
@ -576,7 +576,6 @@ void UDPBaseImplementation::readFrame(char* c,char** raw, uint32_t &fnum, uint32
//copy data and filename //copy data and filename
strcpy(c,guiFileName); strcpy(c,guiFileName);
fnum = guiFrameNumber;
startAcquisitionIndex = getStartAcquisitionIndex(); startAcquisitionIndex = getStartAcquisitionIndex();
startFrameIndex = getStartFrameIndex(); startFrameIndex = getStartFrameIndex();
@ -601,55 +600,8 @@ void UDPBaseImplementation::readFrame(char* c,char** raw, uint32_t &fnum, uint32
void UDPBaseImplementation::copyFrameToGui(char* startbuf[], uint32_t fnum, char* buf){ FILE_LOG(logDEBUG) << __AT__ << " starting"; void UDPBaseImplementation::copyFrameToGui(char* startbuf[], char* buf){ FILE_LOG(logDEBUG) << __AT__ << " starting";
//random read when gui not ready
if((!nFrameToGui) && (!guiData)){
pthread_mutex_lock(&dataReadyMutex);
guiDataReady=0;
pthread_mutex_unlock(&dataReadyMutex);
}
//random read or nth frame read, gui needs data now or it is the first frame
else{
/*
//nth frame read, block current process if the guireader hasnt read it yet
if(nFrameToGui)
sem_wait(&smp);
*/
pthread_mutex_lock(&dataReadyMutex);
guiDataReady=0;
//eiger
if(startbuf != NULL){
int offset = 0;
int size = frameSize/EIGER_MAX_PORTS;
for(int j=0;j<numListeningThreads;++j){
memcpy((((char*)latestData)+offset) ,startbuf[j] + (HEADER_SIZE_NUM_TOT_PACKETS + EIGER_HEADER_LENGTH),size);
offset += size;
}
/*
for(int j=25;j<27;++j)
for(int i=1000;i<1010;i=i+2)
//cout<<"startbuf:"<<dec<<i<<hex<<":\t0x"<<htonl((uint32_t)(*((uint32_t*)(startbuf[1] + HEADER_SIZE_NUM_TOT_PACKETS+ EIGER_HEADER_LENGTH+8+ i))))<<endl;
cout<<"startbuf:"<<dec<<i<<hex<<":\t0x"<<((uint16_t)(*((uint16_t*)(startbuf[1] + 2+ 48+ j*1040+8+ i))))<<endl;
*/
guiFrameNumber = fnum;
}else//other detectors
memcpy(latestData,buf,bufferSize);
strcpy(guiFileName,savefilename);
guiDataReady=1;
pthread_mutex_unlock(&dataReadyMutex);
//nth frame read, block current process if the guireader hasnt read it yet
if(nFrameToGui)
sem_wait(&smp);
}
} }
@ -880,7 +832,7 @@ int UDPBaseImplementation::setupWriter(){ FILE_LOG(logDEBUG) << __AT__ << " star
guiData = NULL; guiData = NULL;
guiDataReady=0; guiDataReady=0;
strcpy(guiFileName,""); strcpy(guiFileName,"");
guiFrameNumber = 0;
cbAction = DO_EVERYTHING; cbAction = DO_EVERYTHING;
pthread_mutex_lock(&status_mutex); pthread_mutex_lock(&status_mutex);
@ -1797,7 +1749,7 @@ void UDPBaseImplementation::handleDataCompression(int ithread, char* wbuffer[],
#endif #endif
if(!once){ if(!once){
copyFrameToGui(NULL,-1,buff); copyFrameToGui(NULL,buff);
once = 1; once = 1;
} }
} }

View File

@ -30,20 +30,11 @@ using namespace std;
#define WRITE_HEADERS #define WRITE_HEADERS
UDPStandardImplementation::UDPStandardImplementation() UDPStandardImplementation::UDPStandardImplementation(){
//:
//thread_started(0),
//eth(NULL),
//latestData(NULL),
//guiFileName(NULL),
//guiFrameNumber(0),
//tengigaEnable(0)
{
thread_started = 0; thread_started = 0;
eth = NULL; eth = NULL;
latestData = NULL; latestData = NULL;
guiFileName = NULL; guiFileName = NULL;
guiFrameNumber = NULL;
tengigaEnable = 0; tengigaEnable = 0;
footer_offset = 0; footer_offset = 0;
for(int i=0;i<MAX_NUM_LISTENING_THREADS;i++){ for(int i=0;i<MAX_NUM_LISTENING_THREADS;i++){
@ -173,7 +164,6 @@ void UDPStandardImplementation::initializeMembers(){
latestData = NULL; latestData = NULL;
guiFileName = NULL; guiFileName = NULL;
guiData = NULL; guiData = NULL;
guiFrameNumber = 0;
sfilefd = NULL; sfilefd = NULL;
cmSub = NULL; cmSub = NULL;
@ -929,7 +919,7 @@ void UDPStandardImplementation::setupFifoStructure(){
/** acquisition functions */ /** acquisition functions */
void UDPStandardImplementation::readFrame(char* c,char** raw, uint32_t &fnum, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex){ void UDPStandardImplementation::readFrame(char* c,char** raw, uint32_t &startAcquisitionIndex, uint32_t &startFrameIndex){
FILE_LOG(logDEBUG) << __AT__ << " called"; FILE_LOG(logDEBUG) << __AT__ << " called";
//point to gui data //point to gui data
if (guiData == NULL){ if (guiData == NULL){
@ -941,7 +931,6 @@ void UDPStandardImplementation::readFrame(char* c,char** raw, uint32_t &fnum, ui
//copy data and filename //copy data and filename
strcpy(c,guiFileName); strcpy(c,guiFileName);
fnum = guiFrameNumber;
startAcquisitionIndex = getStartAcquisitionIndex(); startAcquisitionIndex = getStartAcquisitionIndex();
startFrameIndex = getStartFrameIndex(); startFrameIndex = getStartFrameIndex();
@ -982,7 +971,7 @@ void UDPStandardImplementation::readFrame(char* c,char** raw, uint32_t &fnum, ui
void UDPStandardImplementation::copyFrameToGui(char* startbuf[], uint32_t fnum, char* buf){ void UDPStandardImplementation::copyFrameToGui(char* startbuf[], char* buf){
FILE_LOG(logDEBUG) << __AT__ << " called"; FILE_LOG(logDEBUG) << __AT__ << " called";
#ifdef VERY_VERY_DEBUG #ifdef VERY_VERY_DEBUG
cout << "copyframe" << endl; cout << "copyframe" << endl;
@ -1011,10 +1000,10 @@ cout << "copyframe" << endl;
#endif #endif
//eiger //eiger
if(startbuf != NULL){ if(startbuf != NULL){
for(int j=0;j<packetsPerFrame;++j) for(int j=0;j<packetsPerFrame;++j)
memcpy((((char*)latestData)+j * onePacketSize) ,startbuf[j],onePacketSize); memcpy((((char*)latestData)+j * onePacketSize) ,startbuf[j],onePacketSize);
guiFrameNumber = fnum;
}else//other detectors }else//other detectors
memcpy(latestData,buf,bufferSize); memcpy(latestData,buf,bufferSize);
@ -1298,7 +1287,6 @@ int UDPStandardImplementation::setupWriter(){
guiData = NULL; guiData = NULL;
guiDataReady=0; guiDataReady=0;
strcpy(guiFileName,""); strcpy(guiFileName,"");
guiFrameNumber = 0;
cbAction = DO_EVERYTHING; cbAction = DO_EVERYTHING;
pthread_mutex_lock(&status_mutex); pthread_mutex_lock(&status_mutex);
@ -2981,7 +2969,7 @@ void UDPStandardImplementation::handleWithoutDataCompression(int ithread, char*
#ifdef VERYDEBUG #ifdef VERYDEBUG
cprintf(GREEN,"gonna copy frame\n"); cprintf(GREEN,"gonna copy frame\n");
#endif #endif
copyFrameToGui(wbuffer,currframenum); copyFrameToGui(wbuffer);
#ifdef VERYDEBUG #ifdef VERYDEBUG
cprintf(GREEN,"copied frame\n"); cprintf(GREEN,"copied frame\n");
#endif #endif
@ -2989,7 +2977,7 @@ void UDPStandardImplementation::handleWithoutDataCompression(int ithread, char*
//copy to gui //copy to gui
if(npackets >= packetsPerFrame){//min 1 frame, but neednt be if(npackets >= packetsPerFrame){//min 1 frame, but neednt be
//if(npackets == packetsPerFrame * numJobsPerThread){ //only full frames //if(npackets == packetsPerFrame * numJobsPerThread){ //only full frames
copyFrameToGui(NULL,-1,wbuffer[0]+HEADER_SIZE_NUM_TOT_PACKETS); copyFrameToGui(NULL,wbuffer[0]+HEADER_SIZE_NUM_TOT_PACKETS);
#ifdef VERYVERBOSE #ifdef VERYVERBOSE
cout << ithread << " finished copying" << endl; cout << ithread << " finished copying" << endl;
#endif #endif
@ -3087,7 +3075,7 @@ void UDPStandardImplementation::handleDataCompression(int ithread, char* wbuffer
#endif #endif
if(!once){ if(!once){
copyFrameToGui(NULL,-1,buff); copyFrameToGui(NULL,buff);
once = 1; once = 1;
} }
} }

View File

@ -1068,7 +1068,7 @@ int slsReceiverTCPIPInterface::moench_read_frame(){
uint32_t startAcquisitionIndex=0; uint32_t startAcquisitionIndex=0;
uint32_t startFrameIndex=0; uint32_t startFrameIndex=0;
uint32_t index = 0,bindex = 0, offset=0; uint32_t index = -1,bindex = 0, offset=0;
strcpy(mess,"Could not read frame\n"); strcpy(mess,"Could not read frame\n");
@ -1088,7 +1088,7 @@ int slsReceiverTCPIPInterface::moench_read_frame(){
else{ else{
ret = OK; ret = OK;
/*startIndex=receiverBase->getStartFrameIndex();*/ /*startIndex=receiverBase->getStartFrameIndex();*/
receiverBase->readFrame(fName,&raw,index,startAcquisitionIndex,startFrameIndex); receiverBase->readFrame(fName,&raw,startAcquisitionIndex,startFrameIndex);
/**send garbage with -1 index to try again*/ /**send garbage with -1 index to try again*/
if (raw == NULL){ if (raw == NULL){
@ -1253,7 +1253,7 @@ int slsReceiverTCPIPInterface::gotthard_read_frame(){
char* raw = new char[bufferSize]; char* raw = new char[bufferSize];
uint32_t index=0,index2=0; uint32_t index=-1,index2=0;
uint32_t pindex=0,pindex2=0; uint32_t pindex=0,pindex2=0;
uint32_t bindex=0,bindex2=0; uint32_t bindex=0,bindex2=0;
uint32_t startAcquisitionIndex=0; uint32_t startAcquisitionIndex=0;
@ -1277,7 +1277,7 @@ int slsReceiverTCPIPInterface::gotthard_read_frame(){
}else{ }else{
ret = OK; ret = OK;
/*startIndex=receiverBase->getStartFrameIndex();*/ /*startIndex=receiverBase->getStartFrameIndex();*/
receiverBase->readFrame(fName,&raw,index,startAcquisitionIndex,startFrameIndex); receiverBase->readFrame(fName,&raw,startAcquisitionIndex,startFrameIndex);
/**send garbage with -1 index to try again*/ /**send garbage with -1 index to try again*/
if (raw == NULL){ if (raw == NULL){
@ -1429,7 +1429,7 @@ int slsReceiverTCPIPInterface::propix_read_frame(){
for(i=0;i<rnel;i++) origVal[i]=0; for(i=0;i<rnel;i++) origVal[i]=0;
uint32_t index=0,index2=0; uint32_t index=-1,index2=0;
uint32_t pindex=0,pindex2=0; uint32_t pindex=0,pindex2=0;
uint32_t bindex=0,bindex2=0; uint32_t bindex=0,bindex2=0;
uint32_t startAcquisitionIndex=0; uint32_t startAcquisitionIndex=0;
@ -1453,7 +1453,7 @@ int slsReceiverTCPIPInterface::propix_read_frame(){
}else{ }else{
ret = OK; ret = OK;
/*startIndex=receiverBase->getStartFrameIndex();*/ /*startIndex=receiverBase->getStartFrameIndex();*/
receiverBase->readFrame(fName,&raw,index,startAcquisitionIndex,startFrameIndex); receiverBase->readFrame(fName,&raw,startAcquisitionIndex,startFrameIndex);
/**send garbage with -1 index to try again*/ /**send garbage with -1 index to try again*/
if (raw == NULL){ if (raw == NULL){
@ -1567,16 +1567,36 @@ int slsReceiverTCPIPInterface::propix_read_frame(){
int slsReceiverTCPIPInterface::eiger_read_frame(){ int slsReceiverTCPIPInterface::eiger_read_frame(){
ret=OK; ret=OK;
/** structure of an eiger packet*/
typedef struct
{
unsigned char subframenum[4];
unsigned char missingpacket[2];
unsigned char portnum[1];
unsigned char dynamicrange[1];
} eiger_packet_header_t;
typedef struct
{
unsigned char framenum[6];
unsigned char packetnum[2];
} eiger_packet_footer_t;
char fName[MAX_STR_LENGTH]=""; char fName[MAX_STR_LENGTH]="";
int acquisitionIndex = -1; int acquisitionIndex = -1;
int frameIndex= -1; int frameIndex= -1;
uint32_t index=0; uint32_t index=0;
uint32_t subframenumber=-1;
int frameSize = EIGER_ONE_GIGA_ONE_PACKET_SIZE * packetsPerFrame; int frameSize = EIGER_ONE_GIGA_ONE_PACKET_SIZE * packetsPerFrame;
int dataSize = EIGER_ONE_GIGA_ONE_DATA_SIZE * packetsPerFrame; int dataSize = EIGER_ONE_GIGA_ONE_DATA_SIZE * packetsPerFrame;
int oneDataSize = EIGER_ONE_GIGA_ONE_DATA_SIZE;
if(tenGigaEnable){ if(tenGigaEnable){
frameSize = EIGER_TEN_GIGA_ONE_PACKET_SIZE * packetsPerFrame; frameSize = EIGER_TEN_GIGA_ONE_PACKET_SIZE * packetsPerFrame;
dataSize = EIGER_TEN_GIGA_ONE_DATA_SIZE * packetsPerFrame; dataSize = EIGER_TEN_GIGA_ONE_DATA_SIZE * packetsPerFrame;
oneDataSize = EIGER_TEN_GIGA_ONE_DATA_SIZE;
} }
char* raw = new char[frameSize]; char* raw = new char[frameSize];
char* origVal = new char[frameSize]; char* origVal = new char[frameSize];
@ -1605,10 +1625,8 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
else{ else{
ret = OK; ret = OK;
/** read a frame */ /** read a frame */
receiverBase->readFrame(fName,&raw,index,startAcquisitionIndex,startFrameIndex); receiverBase->readFrame(fName,&raw,startAcquisitionIndex,startFrameIndex);
#ifdef VERBOSE
cout << "index:" << dec << index << endl;
#endif
/**send garbage with -1 index to try again*/ /**send garbage with -1 index to try again*/
if (raw == NULL){ if (raw == NULL){
startAcquisitionIndex = -1; startAcquisitionIndex = -1;
@ -1620,6 +1638,21 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
/**proper frame*/ /**proper frame*/
else{//cout<<"**** got proper frame ******"<<endl; else{//cout<<"**** got proper frame ******"<<endl;
eiger_packet_footer_t* wbuf_footer;
wbuf_footer = (eiger_packet_footer_t*)(raw + oneDataSize + sizeof(eiger_packet_header_t));
index =(uint32_t)(*( (uint64_t*) wbuf_footer));
index += (startFrameIndex-1);
if(dynamicrange == 32){
eiger_packet_header_t* wbuf_header;
wbuf_header = (eiger_packet_header_t*) raw;
subframenumber = *( (uint32_t*) wbuf_header->subframenum);
}
#ifdef VERBOSE
cout << "index:" << dec << index << endl;
cout << "subframenumber:" << dec << subframenumber << endl;
#endif
memcpy(origVal,raw,frameSize); memcpy(origVal,raw,frameSize);
raw=NULL; raw=NULL;
@ -1740,6 +1773,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
cout << "index:" << index << endl; cout << "index:" << index << endl;
cout << "startAcquisitionIndex:" << startAcquisitionIndex << endl; cout << "startAcquisitionIndex:" << startAcquisitionIndex << endl;
cout << "startFrameIndex:" << startFrameIndex << endl; cout << "startFrameIndex:" << startFrameIndex << endl;
cout << "subframenumber:" << subframenumber << endl;
#endif #endif
} }
} }
@ -1751,6 +1785,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
cout << "frameIndex:" << frameIndex << endl; cout << "frameIndex:" << frameIndex << endl;
cout << "startAcquisitionIndex:" << startAcquisitionIndex << endl; cout << "startAcquisitionIndex:" << startAcquisitionIndex << endl;
cout << "startFrameIndex:" << startFrameIndex << endl; cout << "startFrameIndex:" << startFrameIndex << endl;
cout << "subframenumber:" << subframenumber << endl;
} }
#endif #endif
@ -1773,6 +1808,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){
socket->SendDataOnly(fName,MAX_STR_LENGTH); socket->SendDataOnly(fName,MAX_STR_LENGTH);
socket->SendDataOnly(&acquisitionIndex,sizeof(acquisitionIndex)); socket->SendDataOnly(&acquisitionIndex,sizeof(acquisitionIndex));
socket->SendDataOnly(&frameIndex,sizeof(frameIndex)); socket->SendDataOnly(&frameIndex,sizeof(frameIndex));
socket->SendDataOnly(&subframenumber,sizeof(subframenumber));
socket->SendDataOnly(retval,dataSize); socket->SendDataOnly(retval,dataSize);
} }