From 09645cbba86a7bf20cc1c391c108678123bddbc5 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 30 Nov 2016 10:36:46 +0100 Subject: [PATCH] bottom is defined as flippeddatax in config file, not anymore as argument for receiver --- .../include/UDPBaseImplementation.h | 18 +++-- slsReceiverSoftware/include/UDPInterface.h | 16 ++-- .../include/UDPStandardImplementation.h | 8 -- .../include/slsReceiverTCPIPInterface.h | 9 +-- .../include/sls_receiver_funcs.h | 3 +- .../src/UDPBaseImplementation.cpp | 17 +++-- .../src/UDPStandardImplementation.cpp | 36 ++------- slsReceiverSoftware/src/slsReceiver.cpp | 16 +--- .../src/slsReceiverTCPIPInterface.cpp | 74 +++++++++++++++++-- 9 files changed, 116 insertions(+), 81 deletions(-) diff --git a/slsReceiverSoftware/include/UDPBaseImplementation.h b/slsReceiverSoftware/include/UDPBaseImplementation.h index ff5e85928..4b9766307 100644 --- a/slsReceiverSoftware/include/UDPBaseImplementation.h +++ b/slsReceiverSoftware/include/UDPBaseImplementation.h @@ -50,6 +50,12 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter */ char *getDetectorHostname() const; + /* + * Get flipped data across 'axis' + * @return if data is flipped across 'axis' + */ + int getFlippedData(int axis=0) const; + //***file parameters*** /** @@ -234,11 +240,11 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter */ void configure(map config_map); - /** - * Set Bottom Enable (eiger specific, should be moved to configure, and later from client via TCPIP) - * @param b is true for bottom enabled or false for bottom disabled + /* + * Get flipped data across 'axis' + * @return if data is flipped across 'axis' */ - void setBottomEnable(const bool b); + void setFlippedData(int axis=0, int enable=-1); //***file parameters*** @@ -532,8 +538,8 @@ class UDPBaseImplementation : protected virtual slsReceiverDefs, public UDPInter bool tengigaEnable; /** Fifo Depth */ uint32_t fifoDepth; - /** Bottom Half Module Enable */ - bool bottomEnable; + /** enable for flipping data across both axes */ + bool flippedData[2]; //***receiver parameters*** /** Maximum Number of Listening Threads/ UDP Ports */ diff --git a/slsReceiverSoftware/include/UDPInterface.h b/slsReceiverSoftware/include/UDPInterface.h index bcc705aaa..8bdc1a87e 100644 --- a/slsReceiverSoftware/include/UDPInterface.h +++ b/slsReceiverSoftware/include/UDPInterface.h @@ -103,13 +103,19 @@ class UDPInterface { * They access local cache of configuration or detector parameters ******* *************************************************************************/ - //**initial parameters*** + //**initial/detector parameters*** /* * Get detector hostname * @return hostname or NULL if uninitialized, must be released by calling function (max of 1000 characters) */ virtual char *getDetectorHostname() const = 0; + /* + * Get flipped data across 'axis' + * @return if data is flipped across 'axis' + */ + virtual int getFlippedData(int axis=0) const = 0; + //***file parameters*** /** @@ -292,11 +298,11 @@ class UDPInterface { */ virtual void configure(map config_map) = 0; - /** - * Set Bottom Enable (eiger specific, should be moved to configure, and later from client via TCPIP) - * @param b is true for bottom enabled or false for bottom disabled + /* + * Get flipped data across 'axis' + * @return if data is flipped across 'axis' */ - virtual void setBottomEnable(const bool b)= 0; + virtual void setFlippedData(int axis=0, int enable=-1) = 0; //***file parameters*** diff --git a/slsReceiverSoftware/include/UDPStandardImplementation.h b/slsReceiverSoftware/include/UDPStandardImplementation.h index c1023a996..ad455e791 100644 --- a/slsReceiverSoftware/include/UDPStandardImplementation.h +++ b/slsReceiverSoftware/include/UDPStandardImplementation.h @@ -61,14 +61,6 @@ class UDPStandardImplementation: private virtual slsReceiverDefs, public UDPBase *************************************************************************/ //**initial parameters*** - - /** - * Overridden method - * Configure command line parameters - * @param config_map mapping of config parameters passed from command line arguments - */ - void configure(map config_map); - //*** file parameters*** /** * Set File Name Prefix (without frame index, file index and extension (_d0_f000000000000_8.raw)) diff --git a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h index 0c5d5655e..f0bf66f03 100644 --- a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h +++ b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h @@ -26,10 +26,9 @@ class slsReceiverTCPIPInterface : private virtual slsReceiverDefs { * @param succecc socket creation was successfull * @param rbase pointer to the receiver base * @param pn port number (defaults to default port number) - * @param bot mode is bottom if true, else its a top half module */ - slsReceiverTCPIPInterface(int &success, UDPInterface* rbase, int pn=-1, bool bot=false); + slsReceiverTCPIPInterface(int &success, UDPInterface* rbase, int pn=-1); /** * Sets the port number to listen to. @@ -216,6 +215,9 @@ private: /** activate/ deactivate */ int set_activate(); + /** enable flipped data */ + int set_flipped_data(); + //General Functions /** Locks Receiver */ @@ -284,9 +286,6 @@ private: /** port number */ int portNumber; - /** true if bottom half module for eiger */ - bool bottom; - /** Receiver not setup error message */ char SET_RECEIVER_ERR_MESSAGE[MAX_STR_LENGTH]; diff --git a/slsReceiverSoftware/include/sls_receiver_funcs.h b/slsReceiverSoftware/include/sls_receiver_funcs.h index 5030cb5b2..3fffb7d30 100644 --- a/slsReceiverSoftware/include/sls_receiver_funcs.h +++ b/slsReceiverSoftware/include/sls_receiver_funcs.h @@ -54,8 +54,9 @@ enum { F_ACTIVATE, /** < activate/deactivate readout */ F_STREAM_DATA_FROM_RECEIVER, /**< stream data from receiver to client */ - F_READ_RECEIVER_TIMER /** < sets the timer between each data stream in receiver */ + F_READ_RECEIVER_TIMER, /** < sets the timer between each data stream in receiver */ + F_SET_FLIPPED_DATA_RECEIVER /** < sets the enable to flip data across x/y axis (bottom/top) */ /* Always append functions hereafter!!! */ }; diff --git a/slsReceiverSoftware/src/UDPBaseImplementation.cpp b/slsReceiverSoftware/src/UDPBaseImplementation.cpp index 8f57fba78..80e98e226 100644 --- a/slsReceiverSoftware/src/UDPBaseImplementation.cpp +++ b/slsReceiverSoftware/src/UDPBaseImplementation.cpp @@ -46,7 +46,8 @@ void UDPBaseImplementation::initializeMembers(){ dynamicRange = 16; tengigaEnable = false; fifoDepth = 0; - bottomEnable = false; + flippedData[0] = false; + flippedData[1] = false; //***receiver parameters*** status = IDLE; @@ -104,6 +105,12 @@ char *UDPBaseImplementation::getDetectorHostname() const{ return output; } +int UDPBaseImplementation::getFlippedData(int axis) const{ + FILE_LOG(logDEBUG) << __AT__ << " starting"; + if(axis<0 || axis > 1) return -1; + return flippedData[axis]; +} + /***file parameters***/ char *UDPBaseImplementation::getFileName() const{ @@ -211,11 +218,11 @@ void UDPBaseImplementation::configure(map config_map){ FILE_LOG(logERROR) << __AT__ << " must be overridden by child classes"; } -void UDPBaseImplementation::setBottomEnable(const bool b){ +void UDPBaseImplementation::setFlippedData(int axis, int enable){ FILE_LOG(logDEBUG) << __AT__ << " starting"; - - bottomEnable = b; - FILE_LOG(logINFO) << "Bottom - " << stringEnable(bottomEnable); + if(axis<0 || axis>1) return; + flippedData[axis] = enable; + FILE_LOG(logINFO) << "Flipped Data: " << flippedData[0] << " , " << flippedData[1]; } diff --git a/slsReceiverSoftware/src/UDPStandardImplementation.cpp b/slsReceiverSoftware/src/UDPStandardImplementation.cpp index b48646afa..0b8b58ce3 100644 --- a/slsReceiverSoftware/src/UDPStandardImplementation.cpp +++ b/slsReceiverSoftware/src/UDPStandardImplementation.cpp @@ -416,23 +416,6 @@ int UDPStandardImplementation::setupFifoStructure(){ -void UDPStandardImplementation::configure(map config_map){ - FILE_LOG(logDEBUG) << __AT__ << " starting"; - - map::const_iterator pos; - pos = config_map.find("mode"); - if (pos != config_map.end() ){ - int b; - if(!sscanf(pos->second.c_str(), "%d", &b)){ - cout << "Warning: Could not parse mode. Assuming top mode." << endl; - b = 0; - } - bottomEnable = b!= 0; - FILE_LOG(logINFO) << "Bottom: " << stringEnable(bottomEnable); - } - -} - void UDPStandardImplementation::setFileName(const char c[]){ FILE_LOG(logDEBUG) << __AT__ << " starting"; @@ -1489,11 +1472,7 @@ int UDPStandardImplementation::createUDPSockets(){ uint32_t port[2]; port[0]= udpPortNum[0]; port[1]= udpPortNum[1]; - //port = udpPortNum; - if(bottomEnable){ - port[0] = udpPortNum[1]; - port[1] = udpPortNum[0]; - } + //if eth is mistaken with ip address if (strchr(eth,'.') != NULL) @@ -2420,10 +2399,8 @@ uint32_t UDPStandardImplementation::processListeningBuffer(int ithread, int &cSi int lastPacketOffset; //the offset of the last packet uint32_t lastFrameHeader; //frame number of last packet in buffer - uint64_t lastFrameHeader64; //frame number of last packet in buffer uint32_t packetCount = (rc/onePacketSize);//(packetsPerFrame/numberofListeningThreads) * numberofJobsPerBuffer; //packets received cSize = 0; //reset size - jfrau_packet_header_t* header; switch(myDetectorType){ case GOTTHARD: @@ -2510,7 +2487,6 @@ void UDPStandardImplementation::startWriting(){ char* wbuf = NULL; //buffer popped from FIFO sfilefd[ithread] = 0; //file pointer uint64_t nf = 0; //for compression, number of frames - int listenfifoIndex = ithread; /* outer loop - loops once for each acquisition */ @@ -2532,14 +2508,14 @@ void UDPStandardImplementation::startWriting(){ fifo[0]->pop(wbuf); uint32_t numPackets = (uint32_t)(*((uint32_t*)wbuf)); #ifdef DEBUG4 - cprintf(GREEN,"Writing_Thread %d: Number of Packets: %d for FIFO %d\n", ithread, numPackets, listenfifoIndex); + cprintf(GREEN,"Writing_Thread %d: Number of Packets: %d for FIFO %d\n", ithread, numPackets, dataCompressionEnable?0:ithread); #endif //end of acquisition if(numPackets == dummyPacketValue){ #ifdef DEBUG4 - cprintf(GREEN,"Writing_Thread %d: Dummy frame popped out of FIFO %d",ithread, listenfifoIndex); + cprintf(GREEN,"Writing_Thread %d: Dummy frame popped out of FIFO %d",ithread, dataCompressionEnable?0:ithread); #endif stopWriting(ithread,wbuf); continue; @@ -3108,8 +3084,8 @@ void UDPStandardImplementation::updateFileHeader(int ithread){ "Top\t\t: %d\n" "Left\t\t: %d\n" "Active\t\t: %d\n" - "Frames Caught\t: %d\n" - "Frames Lost\t: %d\n" + "Frames Caught\t: %lld\n" + "Frames Lost\t: %lld\n" "Dynamic Range\t: %d\n" "Ten Giga\t: %d\n" "Image Size\t: %d bytes\n" @@ -3124,7 +3100,7 @@ void UDPStandardImplementation::updateFileHeader(int ithread){ "Frame Number\t: 8 bytes\n" "Bunch ID\t: 8 bytes\n", FILE_HEADER_SIZE, - (bottomEnable?0:1), + (flippedData[0]?0:1), (ithread?0:1), activated, (long long int)(totalPacketsInFile[ithread]/packetsPerFrame), diff --git a/slsReceiverSoftware/src/slsReceiver.cpp b/slsReceiverSoftware/src/slsReceiver.cpp index a6c231a3e..04bc29563 100644 --- a/slsReceiverSoftware/src/slsReceiver.cpp +++ b/slsReceiverSoftware/src/slsReceiver.cpp @@ -41,14 +41,12 @@ slsReceiver::slsReceiver(int argc, char *argv[], int &success){ string rest_hostname = "localhost:8081"; udp_interface = NULL; - bool bottom = false; //TODO: properly set new parameter -> mode? //parse command line for config static struct option long_options[] = { /* These options set a flag. */ //{"verbose", no_argument, &verbose_flag, 1}, /* These options don’t set a flag. We distinguish them by their indices. */ - {"mode", required_argument, 0, 'm'}, {"type", required_argument, 0, 't'}, {"config", required_argument, 0, 'f'}, {"rx_tcpport", required_argument, 0, 'b'}, @@ -62,7 +60,7 @@ slsReceiver::slsReceiver(int argc, char *argv[], int &success){ optind = 1; while ( c != -1 ){ - c = getopt_long (argc, argv, "mbfhtr", long_options, &option_index); + c = getopt_long (argc, argv, "bfhtr", long_options, &option_index); /* Detect the end of the options. */ if (c == -1) @@ -70,13 +68,6 @@ slsReceiver::slsReceiver(int argc, char *argv[], int &success){ switch(c){ - case 'm': - int b; - sscanf(optarg, "%d", &b); - bottom = b != 0; - configuration_map["mode"] = optarg; - break; - case 'f': fname = optarg; //cout << long_options[option_index].name << " " << optarg << endl; @@ -98,7 +89,6 @@ slsReceiver::slsReceiver(int argc, char *argv[], int &success){ string help_message = """\nSLS Receiver Server\n\n"""; help_message += """usage: slsReceiver --config config_fname [--rx_tcpport port]\n\n"""; help_message += """\t--config:\t configuration filename for SLS Detector receiver\n"""; - help_message += """\t--mode:\t 1 for bottom and 0 for top\n"""; help_message += """\t--rx_tcpport:\t TCP Communication Port with the client. Default: 1954.\n\n"""; help_message += """\t--rest_hostname:\t Receiver hostname:port. It applies only to REST receivers, and indicates the hostname of the REST backend. Default: localhost:8081.\n\n"""; @@ -132,12 +122,12 @@ slsReceiver::slsReceiver(int argc, char *argv[], int &success){ } if (success==OK){ - FILE_LOG(logINFO) << "SLS Receiver starting " << udp_interface_type << " on port " << tcpip_port_no << " with mode " << bottom << endl; + FILE_LOG(logINFO) << "SLS Receiver starting " << udp_interface_type << " on port " << tcpip_port_no << endl; #ifdef REST udp_interface = UDPInterface::create(udp_interface_type); udp_interface->configure(configuration_map); #endif - tcpipInterface = new slsReceiverTCPIPInterface(success, udp_interface, tcpip_port_no, bottom); + tcpipInterface = new slsReceiverTCPIPInterface(success, udp_interface, tcpip_port_no); } } diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index db4e91a33..99948460b 100644 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -27,7 +27,7 @@ slsReceiverTCPIPInterface::~slsReceiverTCPIPInterface() { if(mySock) {delete mySock; mySock=NULL;} } -slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int &success, UDPInterface* rbase, int pn, bool bot): +slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int &success, UDPInterface* rbase, int pn): myDetectorType(GOTTHARD), receiverBase(rbase), ret(OK), @@ -38,7 +38,6 @@ slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int &success, UDPInterface* killTCPServerThread(0), tenGigaEnable(0), portNumber(DEFAULT_PORTNO+2), - bottom(bot), mySock(NULL){ strcpy(SET_RECEIVER_ERR_MESSAGE,"Receiver not set up. Please use rx_hostname first.\n"); @@ -265,7 +264,7 @@ int slsReceiverTCPIPInterface::function_table(){ flist[F_ACTIVATE] = &slsReceiverTCPIPInterface::set_activate; flist[F_STREAM_DATA_FROM_RECEIVER] = &slsReceiverTCPIPInterface::set_data_stream_enable; flist[F_READ_RECEIVER_TIMER] = &slsReceiverTCPIPInterface::set_read_receiver_timer; - + flist[F_SET_FLIPPED_DATA_RECEIVER] = &slsReceiverTCPIPInterface::set_flipped_data; #ifdef VERYVERBOSE for (int i=0;isetDetectorType(myDetectorType); retval = myDetectorType; -#ifndef REST - receiverBase->setBottomEnable(bottom); -#endif } } @@ -1652,7 +1648,7 @@ int slsReceiverTCPIPInterface::propix_read_frame(){ int slsReceiverTCPIPInterface::eiger_read_frame(){ ret=OK; - +/* char fName[MAX_STR_LENGTH]=""; int acquisitionIndex = -1; int frameIndex= -1; @@ -1905,7 +1901,7 @@ int slsReceiverTCPIPInterface::eiger_read_frame(){ delete [] retval; delete [] origVal; delete [] raw; - +*/ return ret; } @@ -3013,6 +3009,68 @@ int slsReceiverTCPIPInterface::set_activate() { +int slsReceiverTCPIPInterface::set_flipped_data(){ + ret=OK; + int retval = -1; + int args[2]={0,-1}; + strcpy(mess,"Could not set flipped data in receiver\n"); + + + // receive arguments + if(mySock->ReceiveDataOnly(args,sizeof(args)) < 0 ){ + strcpy(mess,"Error reading from socket\n"); + ret = FAIL; + } + + // execute action if the arguments correctly arrived +#ifdef SLS_RECEIVER_UDP_FUNCTIONS + if (ret==OK) { + if (lockStatus==1 && mySock->differentClients==1){ + sprintf(mess,"Receiver locked by %s\n", mySock->lastClientIP); + ret=FAIL; + } + else if (receiverBase == NULL){ + strcpy(mess,SET_RECEIVER_ERR_MESSAGE); + ret=FAIL; + } + else if(receiverBase->getStatus()==RUNNING || receiverBase->getStatus()==TRANSMITTING){ + strcpy(mess,"Can not set flipped data while receiver not idle\n"); + ret = FAIL; + } + else{ + if(args[1] > -1) + receiverBase->setFlippedData(args[0],args[1]); + retval=receiverBase->getFlippedData(args[0]); + } + } +#ifdef VERYVERBOSE + if(ret!=FAIL){ + cout << "Flipped Data:" << retval << endl; + }else + cout << mess << endl; +#endif +#endif + + if(ret==OK && mySock->differentClients){ + FILE_LOG(logDEBUG) << "Force update"; + ret=FORCE_UPDATE; + } + + // send answer + mySock->SendDataOnly(&ret,sizeof(ret)); + if(ret==FAIL){ + cprintf(RED,"%s\n",mess); + mySock->SendDataOnly(mess,sizeof(mess)); + } + mySock->SendDataOnly(&retval,sizeof(retval)); + + //return ok/fail + return ret; +} + + + +