From 2a4bd8022ec88827c0f128bc6600bb9aef6281e0 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Tue, 4 Oct 2016 07:36:00 +0200 Subject: [PATCH] works for deactivated server and receiver --- .../include/UDPBaseImplementation.h | 18 ++++ slsReceiverSoftware/include/UDPInterface.h | 15 ++++ .../include/UDPStandardImplementation.h | 4 + .../include/slsReceiverTCPIPInterface.h | 4 + .../include/sls_receiver_funcs.h | 4 +- .../src/UDPBaseImplementation.cpp | 14 ++- .../src/UDPStandardImplementation.cpp | 88 +++++++++++++++---- .../src/slsReceiverTCPIPInterface.cpp | 68 ++++++++++++++ 8 files changed, 195 insertions(+), 20 deletions(-) diff --git a/slsReceiverSoftware/include/UDPBaseImplementation.h b/slsReceiverSoftware/include/UDPBaseImplementation.h index 568183e42..101816cbe 100644 --- a/slsReceiverSoftware/include/UDPBaseImplementation.h +++ b/slsReceiverSoftware/include/UDPBaseImplementation.h @@ -193,6 +193,14 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter */ runStatus getStatus() const; + /** + * Get activate + * If deactivated, receiver will write dummy packets 0xFF + * (as it will receive nothing from detector) + * @return 0 for deactivated, 1 for activated + */ + int getActivate() const; + @@ -417,6 +425,13 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter */ void closeFile(int i = -1); + /** + * Activate / Deactivate Receiver + * If deactivated, receiver will write dummy packets 0xFF + * (as it will receive nothing from detector) + */ + int setActivate(int enable = -1); + //***callback functions*** /** @@ -485,6 +500,8 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter const static int MAX_NUMBER_OF_LISTENING_THREADS = 2; /** Receiver Status */ runStatus status; + /** Activated/Deactivated */ + int activated; //***connection parameters*** /** Ethernet Interface */ @@ -528,6 +545,7 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter + //***callback parameters*** /** * function being called back for start acquisition diff --git a/slsReceiverSoftware/include/UDPInterface.h b/slsReceiverSoftware/include/UDPInterface.h index 9ad5a7e6a..d4c746c0f 100644 --- a/slsReceiverSoftware/include/UDPInterface.h +++ b/slsReceiverSoftware/include/UDPInterface.h @@ -252,6 +252,14 @@ class UDPInterface { */ virtual slsReceiverDefs::runStatus getStatus() const = 0; + /** + * Get activate + * If deactivated, receiver will write dummy packets 0xFF + * (as it will receive nothing from detector) + * @return 0 for deactivated, 1 for activated + */ + virtual int getActivate() const = 0; + @@ -474,6 +482,13 @@ class UDPInterface { */ virtual void closeFile(int i = -1) = 0; + /** + * Activate / Deactivate Receiver + * If deactivated, receiver will write dummy packets 0xFF + * (as it will receive nothing from detector) + */ + virtual int setActivate(int enable = -1) = 0; + //***callback functions*** /** diff --git a/slsReceiverSoftware/include/UDPStandardImplementation.h b/slsReceiverSoftware/include/UDPStandardImplementation.h index a3af9ab03..e2c9a5dcf 100644 --- a/slsReceiverSoftware/include/UDPStandardImplementation.h +++ b/slsReceiverSoftware/include/UDPStandardImplementation.h @@ -597,6 +597,7 @@ private: /** Missing Packet identifier value */ const static uint16_t missingPacketValue = 0xFFFF; + const static uint16_t deactivatedPacketValue = 0xFEFE; /** Dummy Packet identifier value */ const static uint32_t dummyPacketValue = 0xFFFFFFFF; @@ -675,6 +676,9 @@ private: bool killAllWritingThreads; + //***deactivated parameters*** + uint64_t deactivated_framenumber[MAX_NUMBER_OF_LISTENING_THREADS]; + uint32_t deactivated_packetnumber[MAX_NUMBER_OF_LISTENING_THREADS]; diff --git a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h index 8b5c4527f..6eb7b8491 100644 --- a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h +++ b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h @@ -207,6 +207,10 @@ private: /** set fifo depth */ int set_fifo_depth(); + /** activate/ deactivate */ + int set_activate(); + + //General Functions /** Locks Receiver */ int lock_receiver(); diff --git a/slsReceiverSoftware/include/sls_receiver_funcs.h b/slsReceiverSoftware/include/sls_receiver_funcs.h index e1ef93040..c5e99c1b9 100644 --- a/slsReceiverSoftware/include/sls_receiver_funcs.h +++ b/slsReceiverSoftware/include/sls_receiver_funcs.h @@ -49,7 +49,9 @@ enum { F_ENABLE_RECEIVER_OVERWRITE, /**< set overwrite flag in receiver */ F_ENABLE_RECEIVER_TEN_GIGA, /**< enable 10Gbe in receiver */ - F_SET_RECEIVER_FIFO_DEPTH /**< set receiver fifo depth */ + F_SET_RECEIVER_FIFO_DEPTH, /**< set receiver fifo depth */ + + F_ACTIVATE /** < activate/deactivate readout */ /* Always append functions hereafter!!! */ }; diff --git a/slsReceiverSoftware/src/UDPBaseImplementation.cpp b/slsReceiverSoftware/src/UDPBaseImplementation.cpp index a76cf0e9f..b37885ac4 100644 --- a/slsReceiverSoftware/src/UDPBaseImplementation.cpp +++ b/slsReceiverSoftware/src/UDPBaseImplementation.cpp @@ -49,6 +49,7 @@ void UDPBaseImplementation::initializeMembers(){ //***receiver parameters*** status = IDLE; + activated = true; //***connection parameters*** strcpy(eth,""); @@ -187,7 +188,7 @@ uint32_t UDPBaseImplementation::getFifoDepth() const{ FILE_LOG(logDEBUG) << __AT /***receiver status***/ slsReceiverDefs::runStatus UDPBaseImplementation::getStatus() const{ FILE_LOG(logDEBUG) << __AT__ << " starting"; return status;} - +int UDPBaseImplementation::getActivate() const{FILE_LOG(logDEBUG) << __AT__ << " starting"; return activated;} /************************************************************************* @@ -448,6 +449,17 @@ void UDPBaseImplementation::closeFile(int i){ } +int UDPBaseImplementation::setActivate(int enable){ + FILE_LOG(logDEBUG) << __AT__ << " starting"; + + if(enable != -1){ + activated = enable; + FILE_LOG(logINFO) << "Activation: " << stringEnable(activated); + } + + return activated; +} + /***callback functions***/ void UDPBaseImplementation::registerCallBackStartAcquisition(int (*func)(char*, char*,int, int, void*),void *arg){ startAcquisitionCallBack=func; diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index d64692b65..829b736a3 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -191,6 +191,12 @@ void UDPStandardImplementation::initializeMembers(){ createFileMask = 0x0; killAllWritingThreads = false; + //***deactivated parameters*** + for(int i=0; i < MAX_NUMBER_OF_LISTENING_THREADS; i++){ + deactivated_framenumber[i] = 0; + deactivated_packetnumber[i] = 0; + } + //***filter parameters*** commonModeSubtractionEnable = false; moenchCommonModeSubtraction = NULL; @@ -837,6 +843,11 @@ int UDPStandardImplementation::startReceiver(char *c){ fileCreateSuccess = false; pthread_mutex_unlock(&statusMutex); + //deactivated parameters + for(int i = 0; i < numberofListeningThreads; ++i){ + deactivated_framenumber[i] = 0; + deactivated_packetnumber[i] = 0; + } //Print Receiver Configuration if(myDetectorType != EIGER){ @@ -959,32 +970,34 @@ void UDPStandardImplementation::startReadout(){ if(status == RUNNING){ - //check if all packets got - int totalP = 0,prev,i; - for(i=0; imissingPacket) = deactivatedPacketValue; + *( (uint64_t*) footer) = deactivated_framenumber[ithread]; + *( (uint16_t*) footer->packetNumber) = deactivated_packetnumber[ithread]; + //*( (uint16_t*) footer->packetNumber) = ithread*(packetsPerFrame/numberofListeningThreads)+deactivated_packetnumber[ithread]; +#ifdef MANUALDEBUG + eiger_packet_footer_t* efooter = (eiger_packet_footer_t*)(buffer[ithread] + footerOffset + HEADER_SIZE_NUM_TOT_PACKETS); + cprintf(GREEN,"thread:%d pnum:%d fnum:%d\n", + ithread, + (*( (uint16_t*) efooter->packetNumber)), + (uint32_t)(*( (uint64_t*) efooter))); +#endif + return onePacketSize; + } + int receivedSize = udpSocket[ithread]->ReceiveDataOnly(buffer[ithread] + HEADER_SIZE_NUM_TOT_PACKETS + cSize, lSize + cSize); //throw away packets that is not one packet size, need to check status if socket is shut down @@ -1622,6 +1671,7 @@ int UDPStandardImplementation::prepareAndListenBuffer(int ithread, int lSize, in } totalListeningFrameCount[ithread] += (receivedSize/onePacketSize); + #ifdef MANUALDEBUG if(receivedSize>0){ if(myDetectorType == JUNGFRAU){ @@ -2565,6 +2615,8 @@ void UDPStandardImplementation::stopWriting(int ithread, char* wbuffer[]){ cprintf(GREEN, "Total Packets Caught:%lld\n", (long long int)totalPacketsCaught); cprintf(GREEN, "Total Frames Caught:%lld\n",(long long int)(totalPacketsCaught/packetsPerFrame)); } + if(!activated) + cprintf(RED,"Note: Deactivated Receiver\n"); //acquisition end if (acquisitionFinishedCallBack) acquisitionFinishedCallBack((int)(totalPacketsCaught/packetsPerFrame), pAcquisitionFinished); diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index c1017a4a7..92ebcfc8a 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -262,6 +262,7 @@ int slsReceiverTCPIPInterface::function_table(){ flist[F_ENABLE_RECEIVER_TEN_GIGA] = &slsReceiverTCPIPInterface::enable_tengiga; flist[F_SET_RECEIVER_FIFO_DEPTH] = &slsReceiverTCPIPInterface::set_fifo_depth; + flist[F_ACTIVATE] = &slsReceiverTCPIPInterface::set_activate; #ifdef VERYVERBOSE @@ -2720,8 +2721,75 @@ int slsReceiverTCPIPInterface::set_fifo_depth() { +int slsReceiverTCPIPInterface::set_activate() { + ret=OK; + int retval=-1; + int enable; + strcpy(mess,"Could not activate/deactivate\n"); + // receive arguments + if(socket->ReceiveDataOnly(&enable,sizeof(enable)) < 0 ){ + strcpy(mess,"Error reading from socket\n"); + cprintf(RED,"%s",mess); + ret = FAIL; + } + + // execute action if the arguments correctly arrived +#ifdef SLS_RECEIVER_UDP_FUNCTIONS + if (ret==OK) { + if (lockStatus==1 && socket->differentClients==1){ + sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); + ret=FAIL; + } + + if(ret!=FAIL){ + if (receiverBase == NULL){ + strcpy(mess,SET_RECEIVER_ERR_MESSAGE); + cprintf(RED,"%s",mess); + ret=FAIL; + }else if(receiverBase->getStatus()==RUNNING){ + strcpy(mess,"Cannot activate/deactivate while status is running\n"); + cprintf(RED,"%s",mess); + ret=FAIL; + }else{ + if(enable != -1) + receiverBase->setActivate(enable); + retval = receiverBase->getActivate(); + if(enable >= 0 && retval != enable){ + sprintf(mess,"Tried to set activate to %d, but returned %d\n",enable,retval); + ret = FAIL; + cprintf(RED,"%s",mess); + } + } + } + } +#endif +#ifdef VERYVERBOSE + if(ret!=FAIL) + cout << "Activate: " << retval << endl; + else + cout << mess << endl; +#endif + + + if(ret==OK && socket->differentClients){ + FILE_LOG(logDEBUG) << "Force update"; + ret=FORCE_UPDATE; + } + + // send answer + socket->SendDataOnly(&ret,sizeof(ret)); + if(ret==FAIL){ + cprintf(RED,"%s\n",mess); + socket->SendDataOnly(mess,sizeof(mess)); + } + socket->SendDataOnly(&retval,sizeof(retval)); + + //return ok/fail + return ret; +} +