/********************************************//** * @file slsReceiver_funcs.h * @short interface between receiver and client ***********************************************/ #include "slsReceiver_funcs.h" #include "slsReceiverFunctionList.h" #include "svnInfoReceiver.h" #include "slsReceiverUsers.h" #include "slsDetectorBase.h" #include //SIGINT #include //EXIT #include #include #include #include #include using namespace std; int slsReceiverFuncs::file_des(-1); int slsReceiverFuncs::socketDescriptor(-1); slsReceiverFuncs::~slsReceiverFuncs() { if(socket) delete socket; closeFile(0); } slsReceiverFuncs::slsReceiverFuncs(int argc, char *argv[], int &success): myDetectorType(GOTTHARD), ret(OK), lockStatus(0), shortFrame(-1), packetsPerFrame(GOTTHARD_PACKETS_PER_FRAME), socket(NULL){ int port_no = DEFAULT_PORTNO+2; ifstream infile; string sLine,sargname; int iline = 0; bool dcompr = false; success=OK; string fname = ""; //parse command line for config for(int iarg=1;iarg> sargname; //tcp port if(sargname=="rx_tcpport"){ if(sstr.good()) { sstr >> sargname; if(sscanf(sargname.c_str(),"%d",&port_no)) cout<<"dataport:"<> sargname; if(!strcasecmp(sargname.c_str(),"gotthard")) slsReceiverFuncs::myDetectorType = GOTTHARD; else if(!strcasecmp(sargname.c_str(),"moench")) slsReceiverFuncs::myDetectorType = MOENCH; else if(!strcasecmp(sargname.c_str(),"eiger")) slsReceiverFuncs::myDetectorType = EIGER; else{ cout << "could not decode detector type in config file.\nOptions are:\ngotthard\nmoench.\n\nExiting." << endl; success=FAIL; } } } //compression else if(sargname=="compression"){ if(sstr.good()) { sstr >> sargname; if((!strcasecmp(sargname.c_str(),"yes"))||(!strcasecmp(sargname.c_str(),"y"))) dcompr = true; } } } } infile.close(); }else { cout << "Error opening configuration file " << fname << endl; success = FAIL; } #ifdef VERBOSE cout << "Read configuration file of " << iline << " lines" << endl; #endif } //parse command line for type etc.. more priority if(success == OK){ for(int iarg=1;iarggetErrorStatus()) { success = FAIL; delete socket; socket=NULL; } else { //initialize variables strcpy(socket->lastClientIP,"none"); strcpy(socket->thisClientIP,"none1"); strcpy(mess,"dummy message"); function_table(); slsReceiverList = new slsReceiverFunctionList(myDetectorType); //Catch signal SIGINT to close files properly signal(SIGINT,staticCloseFile); if(dcompr) slsReceiverList->enableDataCompression(dcompr); #ifdef VERBOSE cout << "Function table assigned." << endl; #endif file_des=socket->getFileDes(); socketDescriptor=socket->getsocketDescriptor(); //success = OK; } } } void slsReceiverFuncs::start(){ int v=slsDetectorDefs::OK; while(v!=GOODBYE) { #ifdef VERBOSE cout<< endl; #endif #ifdef VERY_VERBOSE cout << "Waiting for client call" << endl; #endif if(socket->Connect()>=0){ #ifdef VERY_VERBOSE cout << "Conenction accepted" << endl; #endif v = decode_function(); #ifdef VERY_VERBOSE cout << "function executed" << endl; #endif socket->Disconnect(); #ifdef VERY_VERBOSE cout << "connection closed" << endl; #endif } } } int slsReceiverFuncs::function_table(){ for (int i=0;iReceiveDataOnly(&fnum,sizeof(fnum)); if (n <= 0) { #ifdef VERBOSE cout << "ERROR reading from socket " << n << ", " << fnum << endl; #endif return FAIL; } #ifdef VERBOSE else cout << "size of data received " << n <numberOfFunctions-1) fnum = numberOfFunctions-1; //calling function (this->*flist[fnum])(); if (ret==FAIL) cout << "Error executing the function = " << fnum << endl; return ret; } int slsReceiverFuncs::M_nofunc(){ ret=FAIL; sprintf(mess,"Unrecognized Function\n"); cout << mess << endl; socket->SendDataOnly(&ret,sizeof(ret)); socket->SendDataOnly(mess,sizeof(mess)); return GOODBYE; } void slsReceiverFuncs::closeFile(int p){ cout<<"Closing Files... "<closeFile(); cout << "Goodbye!" << endl; exit(-1); } void slsReceiverFuncs::staticCloseFile(int p){ slsReceiverUsers::receiver->closeFile(p); } int slsReceiverFuncs::set_file_name() { ret=OK; char retval[MAX_STR_LENGTH]=""; char fName[MAX_STR_LENGTH]; strcpy(mess,"Could not set file name"); // receive arguments if(socket->ReceiveDataOnly(fName,MAX_STR_LENGTH) < 0 ){ strcpy(mess,"Error reading from socket\n"); ret = FAIL; } // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (ret==OK) { if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } else strcpy(retval,slsReceiverList->setFileName(fName)); } #ifdef VERBOSE if(ret!=FAIL) cout << "file name:" << retval << endl; else cout << mess << endl; #endif #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); socket->SendDataOnly(retval,MAX_STR_LENGTH); //return ok/fail return ret; } int slsReceiverFuncs::set_file_dir() { ret=OK; char retval[MAX_STR_LENGTH]=""; char fPath[MAX_STR_LENGTH]; strcpy(mess,"Could not set file path\n"); // receive arguments if(socket->ReceiveDataOnly(fPath,MAX_STR_LENGTH) < 0 ){ strcpy(mess,"Error reading from socket\n"); ret = FAIL; } // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (ret==OK) { if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; }/* else if((strlen(fPath))&&(slsReceiverList->getStatus()==RUNNING)){ strcpy(mess,"Can not set file path while receiver running\n"); ret = FAIL; }*/ else{ strcpy(retval,slsReceiverList->setFilePath(fPath)); // if file path doesnt exist if(strlen(fPath)) if (strcmp(retval,fPath)){ strcpy(mess,"receiver file path does not exist\n"); ret=FAIL; } } } #ifdef VERBOSE if(ret!=FAIL) cout << "file path:" << retval << endl; else cout << mess << endl; #endif #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); socket->SendDataOnly(retval,MAX_STR_LENGTH); //return ok/fail return ret; } int slsReceiverFuncs::set_file_index() { ret=OK; int retval=-1; int index; strcpy(mess,"Could not set file index\n"); // receive arguments if(socket->ReceiveDataOnly(&index,sizeof(index)) < 0 ){ strcpy(mess,"Error reading from socket\n"); ret = FAIL; } // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (ret==OK) { if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } else retval=slsReceiverList->setFileIndex(index); } #ifdef VERBOSE if(ret!=FAIL) cout << "file index:" << retval << endl; else cout << mess << endl; #endif #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); socket->SendDataOnly(&retval,sizeof(retval)); //return ok/fail return ret; } int slsReceiverFuncs::set_frame_index() { ret=OK; int retval=-1; int index; strcpy(mess,"Could not set frame index\n"); // receive arguments if(socket->ReceiveDataOnly(&index,sizeof(index)) < 0 ){ strcpy(mess,"Error reading from socket\n"); ret = FAIL; } // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (ret==OK) { if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } else retval=slsReceiverList->setFrameIndexNeeded(index); } #ifdef VERBOSE if(ret!=FAIL) cout << "frame index:" << retval << endl; else cout << mess << endl; #endif #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); socket->SendDataOnly(&retval,sizeof(retval)); //return ok/fail return ret; } int slsReceiverFuncs::setup_udp(){ ret=OK; strcpy(mess,"could not set up udp connection"); char retval[MAX_STR_LENGTH]=""; char args[2][MAX_STR_LENGTH]; string temp; int udpport; char eth[MAX_STR_LENGTH]; // receive arguments if(socket->ReceiveDataOnly(args,sizeof(args)) < 0 ){ strcpy(mess,"Error reading from socket\n"); ret = FAIL; } // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (ret==OK) { if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } else if(slsReceiverList->getStatus()==RUNNING){ ret = FAIL; strcpy(mess,"cannot set up udp when receiver is running\n"); } else{ //set up udp port sscanf(args[1],"%d",&udpport); slsReceiverList->setUDPPortNo(udpport); //setup udpip //get ethernet interface or IP to listen to temp = genericSocket::ipToName(args[0]); if(temp=="none"){ ret = FAIL; strcpy(mess, "failed to get ethernet interface or IP to listen to\n"); } else{ strcpy(eth,temp.c_str()); if (strchr(eth,'.')!=NULL) { strcpy(eth,""); ret = FAIL; } cout<<"eth:"<setEthernetInterface(eth); //get mac address from ethernet interface if (ret != FAIL) temp = genericSocket::nameToMac(eth); if ((temp=="00:00:00:00:00:00") || (ret == FAIL)){ ret = FAIL; strcpy(mess,"failed to get mac adddress to listen to\n"); cout << "mess:" << mess << endl; } else{ strcpy(retval,temp.c_str()); cout<<"mac:"<differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); socket->SendDataOnly(retval,MAX_STR_LENGTH); //return ok/fail return ret; } int slsReceiverFuncs::start_receiver(){ ret=OK; ret=OK; enum runStatus s; char cstatus[15]; strcpy(mess,"Could not start receiver\n"); // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } /* else if(!strlen(slsReceiverList->getFilePath())){ strcpy(mess,"receiver not set up. set receiver ip again.\n"); ret = FAIL; } */ else { s = slsReceiverList->getStatus(); strcpy(cstatus, slsDetectorBase::runStatusType(s).c_str()); if(s == IDLE) ret=slsReceiverList->startReceiver(mess); else{ sprintf(mess,"Cannot start Receiver as it is in %s state\n",cstatus); ret=FAIL; } } #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); //return ok/fail return ret; } int slsReceiverFuncs::stop_receiver(){ ret=OK; strcpy(mess,"Could not stop receiver\n"); // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } else if(slsReceiverList->getStatus()!=IDLE) ret=slsReceiverList->stopReceiver(); #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); //return ok/fail return ret; } int slsReceiverFuncs::get_status(){ ret=OK; enum runStatus retval; // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST retval=slsReceiverList->getStatus(); #endif if(socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); socket->SendDataOnly(&retval,sizeof(retval)); //return ok/fail return ret; } int slsReceiverFuncs::get_frames_caught(){ ret=OK; int retval=-1; // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST retval=slsReceiverList->getTotalFramesCaught(); #endif if(socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); socket->SendDataOnly(&retval,sizeof(retval)); //return ok/fail return ret; } int slsReceiverFuncs::get_frame_index(){ ret=OK; int retval=-1; // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST retval=slsReceiverList->getAcquisitionIndex(); #endif if(socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); socket->SendDataOnly(&retval,sizeof(retval)); //return ok/fail return ret; } int slsReceiverFuncs::reset_frames_caught(){ ret=OK; strcpy(mess,"Could not reset frames caught\n"); // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (ret==OK) { if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } else slsReceiverList->resetTotalFramesCaught(); } #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); //return ok/fail return ret; } int slsReceiverFuncs::set_short_frame() { ret=OK; int index=0; int retval=-100; strcpy(mess,"Could not set/reset short frame for receiver\n"); //does not exist for moench if(myDetectorType==MOENCH){ strcpy(mess,"can not set short frame for moench\n"); ret = FAIL; } // receive arguments if(socket->ReceiveDataOnly(&index,sizeof(index)) < 0 ){ strcpy(mess,"Error reading from socket\n"); ret = FAIL; } // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (ret==OK) { if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } else if(slsReceiverList->getStatus()==RUNNING){ strcpy(mess,"Cannot set short frame while status is running\n"); ret=FAIL; } else{ retval=slsReceiverList->setShortFrame(index); shortFrame = retval; if(shortFrame==-1) packetsPerFrame=GOTTHARD_PACKETS_PER_FRAME; else packetsPerFrame=GOTTHARD_SHORT_PACKETS_PER_FRAME; } } #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); socket->SendDataOnly(&retval,sizeof(retval)); //return ok/fail return ret; } int slsReceiverFuncs::read_frame(){ switch(myDetectorType){ case MOENCH: return moench_read_frame(); default: return gotthard_read_frame(); } } int slsReceiverFuncs::moench_read_frame(){ ret=OK; char fName[MAX_STR_LENGTH]=""; int arg = -1,i; int bufferSize = MOENCH_BUFFER_SIZE; int rnel = bufferSize/(sizeof(int)); int* retval = new int[rnel]; int* origVal = new int[rnel]; //all initialized to 0 for(i=0;igetFramesCaught()){ arg = -1; cout<<"haven't caught any frame yet"<getStartFrameIndex(); slsReceiverList->readFrame(fName,&raw); /**send garbage with -1 index to try again*/ if (raw == NULL){ arg = -1; #ifdef VERBOSE cout<<"data not ready for gui yet"<> MOENCH_FRAME_INDEX_OFFSET); uint32_t numPackets = MOENCH_PACKETS_PER_FRAME; //40 uint32_t onePacketSize = MOENCH_DATA_BYTES / MOENCH_PACKETS_PER_FRAME; //1280*40 / 40 = 1280 uint32_t packetDatabytes_row = onePacketSize * (MOENCH_BYTES_IN_ONE_ROW / MOENCH_BYTES_PER_ADC); //1280 * 4 = 5120 uint32_t partsPerFrame = onePacketSize / MOENCH_BYTES_PER_ADC; // 1280 / 80 = 16 uint32_t packetOffset = 0; int packetIndex,x,y; int iPacket = 0; offset = 4; while (iPacket < (int)numPackets){ #ifdef VERBOSE printf("iPacket:%d\n",iPacket);cout << endl; #endif //if missing packets, dont send to gui bindex = (*((uint32_t*)(((char*)origVal)+packetOffset))); if (bindex == 0xFFFFFFFF){ cout << "Missing Packet,Not sending to gui" << endl; index = startIndex - 1; break;//use continue and change index above if you want to display missing packets with 0 value anyway in gui } packetIndex = bindex & MOENCH_PACKET_INDEX_MASK; //cout<<"packetIndex:"<= 40) && (packetIndex < 0)) cout << "cannot decode packet index:" << packetIndex << endl; else{ x = packetIndex / 10; y = packetIndex % 10; #ifdef VERBOSE cout<<"x:"<differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL){ cout << "mess:" << mess << endl; socket->SendDataOnly(mess,sizeof(mess)); } else{ socket->SendDataOnly(fName,MAX_STR_LENGTH); socket->SendDataOnly(&arg,sizeof(arg)); socket->SendDataOnly(retval,MOENCH_DATA_BYTES); } //return ok/fail delete [] retval; delete [] origVal; delete [] raw; return ret; } int slsReceiverFuncs::gotthard_read_frame(){ ret=OK; char fName[MAX_STR_LENGTH]=""; int arg = -1,i; //retval is a full frame int bufferSize = GOTTHARD_BUFFER_SIZE; int rnel = bufferSize/(sizeof(int)); int* retval = new int[rnel]; int* origVal = new int[rnel]; //all initialized to 0 for(i=0;igetFramesCaught()){ arg=-1; cout<<"haven't caught any frame yet"<getStartFrameIndex(); slsReceiverList->readFrame(fName,&raw); /**send garbage with -1 index to try again*/ if (raw == NULL){ arg = -1; #ifdef VERBOSE cout<<"data not ready for gui yet"<> GOTTHARD_SHORT_FRAME_INDEX_OFFSET); #ifdef VERBOSE cout << "index:" << hex << index << endl; #endif }else{ bindex = ((uint32_t)(*((uint32_t*)raw)))+1; pindex = (bindex & GOTTHARD_PACKET_INDEX_MASK); index = ((bindex & GOTTHARD_FRAME_INDEX_MASK) >> GOTTHARD_FRAME_INDEX_OFFSET); bindex2 = ((uint32_t)(*((uint32_t*)((char*)(raw+onebuffersize)))))+1; pindex2 =(bindex2 & GOTTHARD_PACKET_INDEX_MASK); index2 =((bindex2 & GOTTHARD_FRAME_INDEX_MASK) >> GOTTHARD_FRAME_INDEX_OFFSET); #ifdef VERBOSE cout << "index1:" << hex << index << endl; cout << "index2:" << hex << index << endl; #endif } memcpy(origVal,raw,bufferSize); raw=NULL; //1 adc if(shortFrame!=-1){ if(bindex != 0xFFFFFFFF) memcpy((((char*)retval)+(GOTTHARD_SHORT_DATABYTES*shortFrame)),((char*) origVal)+4, GOTTHARD_SHORT_DATABYTES); else{ index = startIndex - 1; cout << "Missing Packet,Not sending to gui" << endl; } } //all adc else{ //ignore if half frame is missing if ((bindex != 0xFFFFFFFF) && (bindex2 != 0xFFFFFFFF)){ //should be same frame if (index == index2){ //ideal situation (should be odd, even(index+1)) if(!pindex){ memcpy(retval,((char*) origVal)+4, onedatasize); memcpy((((char*)retval)+onedatasize), ((char*) origVal)+10+onedatasize, onedatasize); } //swap to even,odd else{ memcpy((((char*)retval)+onedatasize),((char*) origVal)+4, onedatasize); memcpy(retval, ((char*) origVal)+10+onedatasize, onedatasize); index=index2; } }else cout << "different frames caught. frame1:"<< hex << index << ":"<differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL){ cout << "mess:" << mess << endl; socket->SendDataOnly(mess,sizeof(mess)); } else{ socket->SendDataOnly(fName,MAX_STR_LENGTH); socket->SendDataOnly(&arg,sizeof(arg)); socket->SendDataOnly(retval,GOTTHARD_DATA_BYTES); } delete [] retval; delete [] origVal; delete [] raw; return ret; } int slsReceiverFuncs::set_read_frequency(){ ret=OK; int retval=-1; int index; strcpy(mess,"Could not set receiver read frequency\n"); // receive arguments if(socket->ReceiveDataOnly(&index,sizeof(index)) < 0 ){ strcpy(mess,"Error reading from socket\n"); ret = FAIL; } // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (ret==OK) { if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; }/* else if((slsReceiverList->getStatus()==RUNNING) && (index >= 0)){ ret = FAIL; strcpy(mess,"cannot set up receiver mode when receiver is running\n"); }*/ else retval=slsReceiverList->setNFrameToGui(index); } #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); socket->SendDataOnly(&retval,sizeof(retval)); //return ok/fail return ret; } int slsReceiverFuncs::enable_file_write(){ ret=OK; int retval=-1; int enable; strcpy(mess,"Could not set/get enable file write\n"); // receive arguments if(socket->ReceiveDataOnly(&enable,sizeof(enable)) < 0 ){ strcpy(mess,"Error reading from socket\n"); ret = FAIL; } // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (ret==OK) { if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } else{ retval=slsReceiverList->setEnableFileWrite(enable); if((enable!=-1)&&(enable!=retval)) ret=FAIL; } } #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); socket->SendDataOnly(&retval,sizeof(retval)); //return ok/fail return ret; } int slsReceiverFuncs::get_version(){ ret=OK; int64_t retval=-1; // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST retval= SVNREV; retval= (retval <<32) | SVNDATE; #endif if(socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); socket->SendDataOnly(&retval,sizeof(retval)); //return ok/fail return ret; } int slsReceiverFuncs::start_readout(){ ret=OK; enum runStatus retval; // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST slsReceiverList->startReadout(); retval = slsReceiverList->getStatus(); if((retval == TRANSMITTING) || (retval == RUN_FINISHED)) ret = OK; else ret = FAIL; #endif if(socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); socket->SendDataOnly(&retval,sizeof(retval)); //return ok/fail return ret; } int slsReceiverFuncs::set_timer() { ret=OK; int64_t retval = -1; int64_t index[2]; index[1] = -1; strcpy(mess,"Could not set acquisition period or frame number in receiver\n"); // receive arguments if(socket->ReceiveDataOnly(index,sizeof(index)) < 0 ){ strcpy(mess,"Error reading from socket\n"); ret = FAIL; } // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (ret==OK) { if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } else{ if(index[0] == slsDetectorDefs::FRAME_PERIOD) retval=slsReceiverList->setAcquisitionPeriod(index[1]); else retval=slsReceiverList->setNumberOfFrames(index[1]); } } #ifdef VERBOSE if(ret!=FAIL){ if(index[0] == slsDetectorDefs::FRAME_PERIOD) cout << "acquisition period:" << retval << endl; else cout << "frame number:" << retval << endl; }else cout << mess << endl; #endif #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); socket->SendDataOnly(&retval,sizeof(retval)); //return ok/fail return ret; } int slsReceiverFuncs::enable_compression() { ret=OK; int enable=-1; int retval=-100; strcpy(mess,"Could not enable/disable compression for receiver\n"); // receive arguments if(socket->ReceiveDataOnly(&enable,sizeof(enable)) < 0 ){ strcpy(mess,"Error reading from socket\n"); ret = FAIL; } // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (ret==OK) { if(enable >= 0){ if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } else if(slsReceiverList->getStatus()==RUNNING){ strcpy(mess,"Cannot enable/disable compression while status is running\n"); ret=FAIL; } else ret = slsReceiverList->enableDataCompression(enable); } retval=slsReceiverList->getDataCompression(); } #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); socket->SendDataOnly(&retval,sizeof(retval)); //return ok/fail return ret; } int slsReceiverFuncs::set_detector_hostname() { ret=OK; char retval[MAX_STR_LENGTH]=""; char hostname[MAX_STR_LENGTH]=""; strcpy(mess,"Could not set detector hostname"); // receive arguments if(socket->ReceiveDataOnly(hostname,MAX_STR_LENGTH) < 0 ){ strcpy(mess,"Error reading from socket\n"); ret = FAIL; } // execute action if the arguments correctly arrived #ifdef SLS_RECEIVER_FUNCTION_LIST if (ret==OK) { if (lockStatus==1 && socket->differentClients==1){ sprintf(mess,"Receiver locked by %s\n", socket->lastClientIP); ret=FAIL; } else strcpy(retval,slsReceiverList->setDetectorHostname(hostname)); } #ifdef VERBOSE if(ret!=FAIL) cout << "hostname:" << retval << endl; else cout << mess << endl; #endif #endif if(ret==OK && socket->differentClients){ cout << "Force update" << endl; ret=FORCE_UPDATE; } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); socket->SendDataOnly(retval,MAX_STR_LENGTH); //return ok/fail return ret; } int slsReceiverFuncs::lock_receiver() { ret=OK; int lock; // receive arguments if(socket->ReceiveDataOnly(&lock,sizeof(lock)) < 0 ){ sprintf(mess,"Error reading from socket\n"); cout << "Error reading from socket (lock)" << endl; ret=FAIL; } // execute action if the arguments correctly arrived if(ret==OK){ if (lock>=0) { if (lockStatus==0 || strcmp(socket->lastClientIP,socket->thisClientIP)==0 || strcmp(socket->lastClientIP,"none")==0) { lockStatus=lock; strcpy(socket->lastClientIP,socket->thisClientIP); } else { ret=FAIL; sprintf(mess,"Receiver already locked by %s\n", socket->lastClientIP); } } } if (socket->differentClients && ret==OK) ret=FORCE_UPDATE; // send answer socket->SendDataOnly(&ret,sizeof(ret)); if (ret==FAIL) socket->SendDataOnly(mess,sizeof(mess)); else socket->SendDataOnly(&lockStatus,sizeof(lockStatus)); //return ok/fail return ret; } int slsReceiverFuncs::set_port() { ret=OK; MySocketTCP* mySocket=NULL; int sd=-1; enum portType p_type; /** data? control? stop? Unused! */ int p_number; /** new port number */ // receive arguments if(socket->ReceiveDataOnly(&p_type,sizeof(p_type)) < 0 ){ strcpy(mess,"Error reading from socket\n"); cout << mess << endl; ret=FAIL; } if(socket->ReceiveDataOnly(&p_number,sizeof(p_number)) < 0 ){ strcpy(mess,"Error reading from socket\n"); cout << mess << endl; ret=FAIL; } // execute action if the arguments correctly arrived if (ret==OK) { if (socket->differentClients==1 && lockStatus==1 ) { ret=FAIL; sprintf(mess,"Detector locked by %s\n",socket->lastClientIP); } else { if (p_number<1024) { sprintf(mess,"Too low port number %d\n", p_number); cout << mess << endl; ret=FAIL; } cout << "set port " << p_type << " to " << p_number <getErrorStatus(); if (!sd){ ret=OK; if (mySocket->differentClients) ret=FORCE_UPDATE; } else { ret=FAIL; sprintf(mess,"Could not bind port %d\n", p_number); cout << mess << endl; if (sd==-10) { sprintf(mess,"Port %d already set\n", p_number); cout << mess << endl; } } } } // send answer socket->SendDataOnly(&ret,sizeof(ret)); if (ret==FAIL) { socket->SendDataOnly(mess,sizeof(mess)); } else { socket->SendDataOnly(&p_number,sizeof(p_number)); if(sd>=0){ socket->Disconnect(); delete socket; socket = mySocket; file_des=socket->getFileDes(); } } //return ok/fail return ret; } int slsReceiverFuncs::get_last_client_ip() { ret=OK; if (socket->differentClients ) ret=FORCE_UPDATE; socket->SendDataOnly(&ret,sizeof(ret)); socket->SendDataOnly(socket->lastClientIP,sizeof(socket->lastClientIP)); return ret; } int slsReceiverFuncs::send_update() { ret=OK; int ind; char path[MAX_STR_LENGTH]; socket->SendDataOnly(socket->lastClientIP,sizeof(socket->lastClientIP)); //index #ifdef SLS_RECEIVER_FUNCTION_LIST /*if(myDetectorType != EIGER)*/ ind=slsReceiverList->getFileIndex(); socket->SendDataOnly(&ind,sizeof(ind)); #endif //filepath #ifdef SLS_RECEIVER_FUNCTION_LIST strcpy(path,slsReceiverList->getFilePath()); #endif socket->SendDataOnly(path,MAX_STR_LENGTH); //filename #ifdef SLS_RECEIVER_FUNCTION_LIST strcpy(path,slsReceiverList->getFileName()); #endif socket->SendDataOnly(path,MAX_STR_LENGTH); if (lockStatus==0) { strcpy(socket->lastClientIP,socket->thisClientIP); } return ret; } int slsReceiverFuncs::update_client() { ret=OK; socket->SendDataOnly(&ret,sizeof(ret)); return send_update(); } int slsReceiverFuncs::exit_server() { ret=GOODBYE; socket->SendDataOnly(&ret,sizeof(ret)); strcpy(mess,"closing server"); socket->SendDataOnly(mess,sizeof(mess)); cout << mess << endl; return ret; } int slsReceiverFuncs::exec_command() { ret = OK; char cmd[MAX_STR_LENGTH]; char answer[MAX_STR_LENGTH]; int sysret=0; // receive arguments if(socket->ReceiveDataOnly(cmd,MAX_STR_LENGTH) < 0 ){ sprintf(mess,"Error reading from socket\n"); ret=FAIL; } // execute action if the arguments correctly arrived if (ret==OK) { #ifdef VERBOSE cout << "executing command " << cmd << endl; #endif if (lockStatus==0 || socket->differentClients==0) sysret=system(cmd); //should be replaced by popen if (sysret==0) { strcpy(answer,"Succeeded\n"); if (lockStatus==1 && socket->differentClients==1) sprintf(answer,"Detector locked by %s\n", socket->lastClientIP); } else { strcpy(answer,"Failed\n"); ret=FAIL; } } else strcpy(answer,"Could not receive the command\n"); // send answer socket->SendDataOnly(&ret,sizeof(ret)); if(socket->SendDataOnly(answer,MAX_STR_LENGTH) < 0){ strcpy(mess,"Error writing to socket"); ret=FAIL; } //return ok/fail return ret; }