From bbb0a05fca7fe888e1d734a37107aa51d636467c Mon Sep 17 00:00:00 2001 From: Maliakal Dhanya Date: Fri, 11 Jul 2014 12:53:53 +0200 Subject: [PATCH] incorporating ten giga into the receiver --- slsReceiverSoftware/includes/receiver_defs.h | 16 +- .../slsReceiver/slsReceiverTCPIPInterface.cpp | 132 ++++++------ .../slsReceiver/slsReceiverTCPIPInterface.h | 3 + .../slsReceiver/slsReceiverUDPFunctions.cpp | 191 +++++++++++++----- .../slsReceiver/slsReceiverUDPFunctions.h | 15 +- 5 files changed, 228 insertions(+), 129 deletions(-) diff --git a/slsReceiverSoftware/includes/receiver_defs.h b/slsReceiverSoftware/includes/receiver_defs.h index 2ffd4500d..4b0d10161 100755 --- a/slsReceiverSoftware/includes/receiver_defs.h +++ b/slsReceiverSoftware/includes/receiver_defs.h @@ -74,11 +74,15 @@ #define EIGER_FIFO_SIZE 250 //cannot be less than max jobs per thread = 1000 /*#define EIGER_ALIGNED_FRAME_SIZE 65536*/ -#define EIGER_PACKETS_PER_FRAME_COSTANT (16*EIGER_MAX_PORTS)//*bit mode 4*16=64, 8*16=128, 16*16=256, 32*16=512 -#define EIGER_ONE_PACKET_SIZE 1040 -#define EIGER_ONE_DATA_SIZE 1024 -#define EIGER_BUFFER_SIZE_CONSTANT (EIGER_ONE_PACKET_SIZE*EIGER_PACKETS_PER_FRAME_COSTANT)//1040*16*2//*bit mode -#define EIGER_DATA_BYTES_CONSTANT (EIGER_ONE_DATA_SIZE*EIGER_PACKETS_PER_FRAME_COSTANT) //1024*16*2//*bit mode +#define EIGER_ONE_GIGA_CONSTANT 16 +#define EIGER_TEN_GIGA_CONSTANT 4 +//#define EIGER_PACKETS_PER_FRAME_COSTANT (16*EIGER_MAX_PORTS)//*bit mode 4*16=64, 8*16=128, 16*16=256, 32*16=512 +#define EIGER_ONE_GIGA_ONE_PACKET_SIZE 1040 +#define EIGER_ONE_GIGA_ONE_DATA_SIZE 1024 +#define EIGER_TEN_GIGA_ONE_PACKET_SIZE 4112 +#define EIGER_TEN_GIGA_ONE_DATA_SIZE 4096 +//#define EIGER_BUFFER_SIZE_CONSTANT (EIGER_ONE_PACKET_SIZE*EIGER_PACKETS_PER_FRAME_COSTANT)//1040*16*2//*bit mode +//#define EIGER_DATA_BYTES_CONSTANT (EIGER_ONE_DATA_SIZE*EIGER_PACKETS_PER_FRAME_COSTANT) //1024*16*2//*bit mode #define EIGER_FRAME_INDEX_MASK 0xFFFF #define EIGER_FRAME_INDEX_OFFSET 0 @@ -87,7 +91,7 @@ #define EIGER_IMAGE_HEADER_SIZE 48 #define EIGER_PIXELS_IN_ONE_ROW (256*4) - +#define EIGER_PIXELS_IN_ONE_COL (256) #endif diff --git a/slsReceiverSoftware/slsReceiver/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/slsReceiver/slsReceiverTCPIPInterface.cpp index bbd1dc094..703987822 100644 --- a/slsReceiverSoftware/slsReceiver/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/slsReceiver/slsReceiverTCPIPInterface.cpp @@ -36,7 +36,8 @@ slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int argc, char *argv[], int packetsPerFrame(GOTTHARD_PACKETS_PER_FRAME), dynamicrange(16), socket(NULL), - killTCPServerThread(0){ + killTCPServerThread(0), + tenGigaEnable(0){ int port_no = DEFAULT_PORTNO+2; ifstream infile; @@ -316,6 +317,9 @@ int slsReceiverTCPIPInterface::function_table(){ flist[F_ENABLE_RECEIVER_COMPRESSION] = &slsReceiverTCPIPInterface::enable_compression; flist[F_ENABLE_RECEIVER_OVERWRITE] = &slsReceiverTCPIPInterface::enable_overwrite; + flist[F_ENABLE_RECEIVER_TEN_GIGA] = &slsReceiverTCPIPInterface::enable_tengiga; + + #ifdef VERBOSE for (int i=0;inum2)&0xff)<<"\t\t"; - memcpy(retval+retindex ,origVal+c1 ,EIGER_ONE_DATA_SIZE); - c1 += 16+EIGER_ONE_DATA_SIZE; - retindex += EIGER_ONE_DATA_SIZE; - - //cout<num2)&0xff)<> 8) & 0x00FF00FF00FF00FFULL ); + temp = ((temp << 16) & 0xFFFF0000FFFF0000ULL ) | ((temp >> 16) & 0x0000FFFF0000FFFFULL ); + temp = (temp << 32) | ((temp >> 32) & 0xFFFFFFFFULL); + (*(((uint64_t*)retval)+i)) = temp; } - -*/ - - - for(i=0;i<(1024*(16*dynamicrange)*2)/4;i++) - (*((uint32_t*)retval+i)) = htonl((uint32_t)(*((uint32_t*)retval+i))); - +/* + ( (((val) >> 56) & 0x00000000000000FF) | (((val) >> 40) & 0x000000000000FF00) | \ + (((val) >> 24) & 0x0000000000FF0000) | (((val) >> 8) & 0x00000000FF000000) | \ + (((val) << 8) & 0x000000FF00000000) | (((val) << 24) & 0x0000FF0000000000) | \ + (((val) << 40) & 0x00FF000000000000) | (((val) << 56) & 0xFF00000000000000) ) + */ /* - for(int j=25;j<27;++j) - for(int i=1000;i<1010;i=i+2) - //cout<<"retval:"<differentClients){ cout << "Force update" << endl; @@ -1497,7 +1489,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ else{ socket->SendDataOnly(fName,MAX_STR_LENGTH); socket->SendDataOnly(&arg,sizeof(arg)); - socket->SendDataOnly(retval,(EIGER_DATA_BYTES_CONSTANT*dynamicrange)); + socket->SendDataOnly(retval,dataSize); } delete [] retval; @@ -1508,6 +1500,11 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ } + + + + + int slsReceiverTCPIPInterface::set_read_frequency(){ ret=OK; int retval=-1; @@ -1864,8 +1861,12 @@ int slsReceiverTCPIPInterface::set_dynamic_range() { if(ret!=FAIL){ retval=slsReceiverFunctions->setDynamicRange(dr); dynamicrange = dr; - if(myDetectorType == EIGER) - packetsPerFrame = dr*EIGER_PACKETS_PER_FRAME_COSTANT; + if(myDetectorType == EIGER){ + if(!tenGigaEnable) + packetsPerFrame = EIGER_ONE_GIGA_CONSTANT * dynamicrange * EIGER_MAX_PORTS; + else + packetsPerFrame = EIGER_TEN_GIGA_CONSTANT * dynamicrange * EIGER_MAX_PORTS; + } } } #ifdef VERBOSE @@ -1969,8 +1970,13 @@ int slsReceiverTCPIPInterface::enable_tengiga() { sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } - else - ;//retval=slsReceiverFunctions->enable10GbE(val); + else{ + retval=slsReceiverFunctions->enableTenGiga(val); + if((val!=-1) && (val != retval)) + ret = FAIL; + else + tenGigaEnable = retval; + } } #ifdef VERBOSE if(ret!=FAIL) diff --git a/slsReceiverSoftware/slsReceiver/slsReceiverTCPIPInterface.h b/slsReceiverSoftware/slsReceiver/slsReceiverTCPIPInterface.h index 63016e7d7..bddce2bd8 100644 --- a/slsReceiverSoftware/slsReceiver/slsReceiverTCPIPInterface.h +++ b/slsReceiverSoftware/slsReceiver/slsReceiverTCPIPInterface.h @@ -257,6 +257,9 @@ private: /** thread for TCP server */ pthread_t TCPServer_thread; + /** size of one frame*/ + int tenGigaEnable; + protected: /** Socket */ MySocketTCP* socket; diff --git a/slsReceiverSoftware/slsReceiver/slsReceiverUDPFunctions.cpp b/slsReceiverSoftware/slsReceiver/slsReceiverUDPFunctions.cpp index d659945ba..382fae74e 100644 --- a/slsReceiverSoftware/slsReceiver/slsReceiverUDPFunctions.cpp +++ b/slsReceiverSoftware/slsReceiver/slsReceiverUDPFunctions.cpp @@ -1,4 +1,4 @@ -#ifdef SLS_RECEIVER_UDP_FUNCTIONS +//#ifdef SLS_RECEIVER_UDP_FUNCTIONS /********************************************//** * @file slsReceiverUDPFunctions.cpp * @short does all the functions for a receiver, set/get parameters, start/stop etc. @@ -35,7 +35,8 @@ slsReceiverUDPFunctions::slsReceiverUDPFunctions(): eth(NULL), latestData(NULL), guiFileName(NULL), - guiFrameNumber(0){ + guiFrameNumber(0), + tengigaEnable(0){ for(int i=0;isetDynamicRange(dr); else{ dynamicRange = dr; - packetsPerFrame = EIGER_PACKETS_PER_FRAME_COSTANT * dynamicRange; - frameSize = EIGER_BUFFER_SIZE_CONSTANT * dynamicRange; - bufferSize = (frameSize/EIGER_MAX_PORTS) + EIGER_HEADER_LENGTH;//for only one port - maxPacketsPerFile = EIGER_MAX_FRAMES_PER_FILE * packetsPerFrame; - if(olddr != dr){ + if(myDetectorType == EIGER){ - //del - if(thread_started){ - createListeningThreads(true); - createWriterThreads(true); - } - for(int i=0;ifnum)<push(buffer[ithread]); @@ -1960,37 +1965,37 @@ int i; cout << ithread << " going to push in dummy buffer:" << (void*)buffer[ithread] << " with num packets:"<< (*((uint16_t*)(buffer[ithread]))) << endl; #endif while(!fifo[ithread]->push(buffer[ithread])); -#ifdef VERYDEBUG +//#ifdef VERYDEBUG cout << ithread << " pushed in dummy buffer:" << (void*)buffer[ithread] << endl; -#endif +//#endif } //reset mask and exit loop pthread_mutex_lock(&status_mutex); listeningthreads_mask^=(1< 1) cout << "Waiting for listening to be done.. current mask:" << hex << listeningthreads_mask << endl; -#endif +//#endif while(listeningthreads_mask) usleep(5000); -#ifdef VERYDEBUG +//#ifdef VERYDEBUG t = 0; for(i=0;i= 0){ + if(receiver != NULL) + ;/*receiver->setTenGigaBitEthernet(enable);*/ + else{ + tengigaEnable = enable; + + if(myDetectorType == EIGER){ + + if(!tengigaEnable){ + packetsPerFrame = EIGER_ONE_GIGA_CONSTANT * dynamicRange * EIGER_MAX_PORTS; + onePacketSize = EIGER_ONE_GIGA_ONE_PACKET_SIZE; + maxPacketsPerFile = EIGER_MAX_FRAMES_PER_FILE * packetsPerFrame; + }else{ + packetsPerFrame = EIGER_TEN_GIGA_CONSTANT * dynamicRange * EIGER_MAX_PORTS; + onePacketSize = EIGER_TEN_GIGA_ONE_PACKET_SIZE; + maxPacketsPerFile = EIGER_MAX_FRAMES_PER_FILE * packetsPerFrame*4; + } + frameSize = onePacketSize * packetsPerFrame; + bufferSize = (frameSize/EIGER_MAX_PORTS) + EIGER_HEADER_LENGTH;//everything one port gets (img header plus packets) + //maxPacketsPerFile = EIGER_MAX_FRAMES_PER_FILE * packetsPerFrame; + + + cout<<"packetsPerFrame:"<getTenGigaBitEthernet();*/ + else + return tengigaEnable; + +} @@ -2285,5 +2365,4 @@ void slsReceiverUDPFunctions::handleDataCompression(int ithread, char* wbuffer[] - -#endif +//#endif diff --git a/slsReceiverSoftware/slsReceiver/slsReceiverUDPFunctions.h b/slsReceiverSoftware/slsReceiver/slsReceiverUDPFunctions.h index 6cafcfcff..3cb1872cf 100644 --- a/slsReceiverSoftware/slsReceiver/slsReceiverUDPFunctions.h +++ b/slsReceiverSoftware/slsReceiver/slsReceiverUDPFunctions.h @@ -1,4 +1,4 @@ -#ifdef SLS_RECEIVER_UDP_FUNCTIONS +//#ifdef SLS_RECEIVER_UDP_FUNCTIONS #ifndef SLS_RECEIVER_UDP_FUNCTIONS_H #define SLS_RECEIVER_UDP_FUNCTIONS_H /********************************************//** @@ -228,8 +228,12 @@ public: */ int enableDataCompression(bool enable); - - + /** + * enable 10Gbe + @param enable 1 for 10Gbe or 0 for 1 Gbe, -1 to read out + \returns enable for 10Gbe + */ + int enableTenGiga(int enable = -1); @@ -631,6 +635,9 @@ private: /** variable used to self terminate threads waiting for semaphores */ int killAllWritingThreads; + /** 10Gbe enable*/ + int tengigaEnable; + @@ -755,4 +762,4 @@ public: #endif -#endif +//#endif