/********************************************//** * @file slsReceiverTCPIPInterface.cpp * @short interface between receiver and client ***********************************************/ #include "slsReceiverTCPIPInterface.h" #include "slsReceiverImplementation.h" #include "MySocketTCP.h" #include "ClientInterface.h" #include "gitInfoReceiver.h" #include "slsReceiverUsers.h" #include "slsReceiver.h" #include "versionAPI.h" #include //EXIT #include #include #include #include #include #include #include #include #include //unique_ptr slsReceiverTCPIPInterface::~slsReceiverTCPIPInterface() { stop(); if(mySock) { delete mySock; mySock=NULL; } if (interface) delete interface; if(receiver) delete receiver; } slsReceiverTCPIPInterface::slsReceiverTCPIPInterface(int pn): myDetectorType(GOTTHARD), receiver(0), ret(OK), fnum(-1), lockStatus(0), killTCPServerThread(0), tcpThreadCreated(false), portNumber(DEFAULT_PORTNO+2), mySock(0), interface(0) { //***callback parameters*** startAcquisitionCallBack = NULL; pStartAcquisition = NULL; acquisitionFinishedCallBack = NULL; pAcquisitionFinished = NULL; rawDataReadyCallBack = NULL; rawDataModifyReadyCallBack = NULL; pRawDataReady = NULL; // create socket portNumber = (pn > 0 ? pn : DEFAULT_PORTNO + 2); MySocketTCP* m = new MySocketTCP(portNumber); mySock = m; interface = new ClientInterface(mySock, -1, "Receiver"); //initialize variables strcpy(mySock->lastClientIP,"none"); strcpy(mySock->thisClientIP,"none1"); memset(mess,0,sizeof(mess)); strcpy(mess,"dummy message"); function_table(); } int slsReceiverTCPIPInterface::start(){ FILE_LOG(logDEBUG) << "Creating TCP Server Thread"; killTCPServerThread = 0; if(pthread_create(&TCPServer_thread, NULL,startTCPServerThread, (void*) this)){ FILE_LOG(logERROR) << "Could not create TCP Server thread"; return FAIL; } tcpThreadCreated = true; //#ifdef VERYVERBOSE FILE_LOG(logDEBUG) << "TCP Server thread created successfully."; //#endif return OK; } void slsReceiverTCPIPInterface::stop(){ if (tcpThreadCreated) { FILE_LOG(logINFO) << "Shutting down TCP Socket on port " << portNumber; killTCPServerThread = 1; if(mySock) mySock->ShutDownSocket(); FILE_LOG(logDEBUG) << "TCP Socket closed on port " << portNumber; pthread_join(TCPServer_thread, NULL); tcpThreadCreated = false; killTCPServerThread = 0; FILE_LOG(logDEBUG) << "Exiting TCP Server Thread on port " << portNumber; } } int64_t slsReceiverTCPIPInterface::getReceiverVersion(){ int64_t retval = GITDATE & 0xFFFFFF; return retval; } /***callback functions***/ void slsReceiverTCPIPInterface::registerCallBackStartAcquisition(int (*func)(char*, char*, uint64_t, uint32_t, void*),void *arg){ startAcquisitionCallBack=func; pStartAcquisition=arg; } void slsReceiverTCPIPInterface::registerCallBackAcquisitionFinished(void (*func)(uint64_t, void*),void *arg){ acquisitionFinishedCallBack=func; pAcquisitionFinished=arg; } void slsReceiverTCPIPInterface::registerCallBackRawDataReady(void (*func)(char* , char*, uint32_t, void*),void *arg){ rawDataReadyCallBack=func; pRawDataReady=arg; } void slsReceiverTCPIPInterface::registerCallBackRawDataModifyReady(void (*func)(char* , char*, uint32_t &,void*),void *arg){ rawDataModifyReadyCallBack=func; pRawDataReady=arg; } void* slsReceiverTCPIPInterface::startTCPServerThread(void *this_pointer){ ((slsReceiverTCPIPInterface*)this_pointer)->startTCPServer(); return this_pointer; } void slsReceiverTCPIPInterface::startTCPServer(){ cprintf(BLUE,"Created [ TCP server Tid: %ld ]\n", (long)syscall(SYS_gettid)); FILE_LOG(logINFO) << "SLS Receiver starting TCP Server on port " << portNumber << std::endl; int ret = OK; while(true) { if(mySock->Connect() >= 0){ ret = decode_function(); mySock->Disconnect(); } //if tcp command was to exit server if(ret == GOODBYE){ FILE_LOG(logINFO) << "Shutting down UDP Socket"; if(receiver){ receiver->shutDownUDPSockets(); } mySock->exitServer(); cprintf(BLUE,"Exiting [ TCP server Tid: %ld ]\n", (long)syscall(SYS_gettid)); pthread_exit(NULL); } //if user entered exit if(killTCPServerThread) { if (ret != GOODBYE) { if(receiver){ receiver->shutDownUDPSockets(); } } cprintf(BLUE,"Exiting [ TCP server Tid: %ld ]\n", (long)syscall(SYS_gettid)); pthread_exit(NULL); } } } int slsReceiverTCPIPInterface::function_table(){ flist[F_EXEC_RECEIVER_COMMAND] = &slsReceiverTCPIPInterface::exec_command; flist[F_EXIT_RECEIVER] = &slsReceiverTCPIPInterface::exit_server; flist[F_LOCK_RECEIVER] = &slsReceiverTCPIPInterface::lock_receiver; flist[F_GET_LAST_RECEIVER_CLIENT_IP] = &slsReceiverTCPIPInterface::get_last_client_ip; flist[F_SET_RECEIVER_PORT] = &slsReceiverTCPIPInterface::set_port; flist[F_UPDATE_RECEIVER_CLIENT] = &slsReceiverTCPIPInterface::update_client; flist[F_GET_RECEIVER_ID] = &slsReceiverTCPIPInterface::get_id; flist[F_GET_RECEIVER_TYPE] = &slsReceiverTCPIPInterface::set_detector_type; flist[F_SEND_RECEIVER_DETHOSTNAME] = &slsReceiverTCPIPInterface::set_detector_hostname; flist[F_RECEIVER_SET_ROI] = &slsReceiverTCPIPInterface::set_roi; flist[F_SETUP_RECEIVER_UDP] = &slsReceiverTCPIPInterface::setup_udp; flist[F_SET_RECEIVER_TIMER] = &slsReceiverTCPIPInterface::set_timer; flist[F_SET_RECEIVER_DYNAMIC_RANGE] = &slsReceiverTCPIPInterface::set_dynamic_range; flist[F_RECEIVER_STREAMING_FREQUENCY] = &slsReceiverTCPIPInterface::set_streaming_frequency; flist[F_GET_RECEIVER_STATUS] = &slsReceiverTCPIPInterface::get_status; flist[F_START_RECEIVER] = &slsReceiverTCPIPInterface::start_receiver; flist[F_STOP_RECEIVER] = &slsReceiverTCPIPInterface::stop_receiver; flist[F_SET_RECEIVER_FILE_PATH] = &slsReceiverTCPIPInterface::set_file_dir; flist[F_SET_RECEIVER_FILE_NAME] = &slsReceiverTCPIPInterface::set_file_name; flist[F_SET_RECEIVER_FILE_INDEX] = &slsReceiverTCPIPInterface::set_file_index; flist[F_GET_RECEIVER_FRAME_INDEX] = &slsReceiverTCPIPInterface::get_frame_index; flist[F_GET_RECEIVER_FRAMES_CAUGHT] = &slsReceiverTCPIPInterface::get_frames_caught; flist[F_RESET_RECEIVER_FRAMES_CAUGHT] = &slsReceiverTCPIPInterface::reset_frames_caught; flist[F_ENABLE_RECEIVER_FILE_WRITE] = &slsReceiverTCPIPInterface::enable_file_write; flist[F_ENABLE_RECEIVER_OVERWRITE] = &slsReceiverTCPIPInterface::enable_overwrite; flist[F_ENABLE_RECEIVER_TEN_GIGA] = &slsReceiverTCPIPInterface::enable_tengiga; flist[F_SET_RECEIVER_FIFO_DEPTH] = &slsReceiverTCPIPInterface::set_fifo_depth; flist[F_RECEIVER_ACTIVATE] = &slsReceiverTCPIPInterface::set_activate; flist[F_STREAM_DATA_FROM_RECEIVER] = &slsReceiverTCPIPInterface::set_data_stream_enable; flist[F_RECEIVER_STREAMING_TIMER] = &slsReceiverTCPIPInterface::set_streaming_timer; flist[F_SET_FLIPPED_DATA_RECEIVER] = &slsReceiverTCPIPInterface::set_flipped_data; flist[F_SET_RECEIVER_FILE_FORMAT] = &slsReceiverTCPIPInterface::set_file_format; flist[F_SEND_RECEIVER_DETPOSID] = &slsReceiverTCPIPInterface::set_detector_posid; flist[F_SEND_RECEIVER_MULTIDETSIZE] = &slsReceiverTCPIPInterface::set_multi_detector_size; flist[F_SET_RECEIVER_STREAMING_PORT] = &slsReceiverTCPIPInterface::set_streaming_port; flist[F_RECEIVER_STREAMING_SRC_IP] = &slsReceiverTCPIPInterface::set_streaming_source_ip; flist[F_SET_RECEIVER_SILENT_MODE] = &slsReceiverTCPIPInterface::set_silent_mode; flist[F_ENABLE_GAPPIXELS_IN_RECEIVER] = &slsReceiverTCPIPInterface::enable_gap_pixels; flist[F_RESTREAM_STOP_FROM_RECEIVER] = &slsReceiverTCPIPInterface::restream_stop; flist[F_ADDITIONAL_JSON_HEADER] = &slsReceiverTCPIPInterface::set_additional_json_header; flist[F_RECEIVER_UDP_SOCK_BUF_SIZE] = &slsReceiverTCPIPInterface::set_udp_socket_buffer_size; flist[F_RECEIVER_REAL_UDP_SOCK_BUF_SIZE]= &slsReceiverTCPIPInterface::get_real_udp_socket_buffer_size; flist[F_SET_RECEIVER_FRAMES_PER_FILE] = &slsReceiverTCPIPInterface::set_frames_per_file; flist[F_RECEIVER_CHECK_VERSION] = &slsReceiverTCPIPInterface::check_version_compatibility; flist[F_RECEIVER_DISCARD_POLICY] = &slsReceiverTCPIPInterface::set_discard_policy; flist[F_RECEIVER_PADDING_ENABLE] = &slsReceiverTCPIPInterface::set_padding_enable; flist[F_RECEIVER_DEACTIVATED_PADDING_ENABLE] = &slsReceiverTCPIPInterface::set_deactivated_receiver_padding_enable; for (int i = NUM_DET_FUNCTIONS + 1; i < NUM_REC_FUNCTIONS ; i++) { FILE_LOG(logDEBUG1) << "function fnum: " << i << " (" << getFunctionNameFromEnum((enum detFuncs)i) << ") located at " << flist[i]; } return OK; } int slsReceiverTCPIPInterface::decode_function(){ ret = FAIL; int n = mySock->ReceiveDataOnly(&fnum,sizeof(fnum)); if (n <= 0) { FILE_LOG(logDEBUG5) << "Could not read socket. " "Received " << n << " bytes," << "fnum:" << fnum << " " "(" << getFunctionNameFromEnum((enum detFuncs)fnum) << ")"; return FAIL; } else FILE_LOG(logDEBUG5) << "Received " << n << " bytes"; if (fnum <= NUM_DET_FUNCTIONS || fnum >= NUM_REC_FUNCTIONS) { FILE_LOG(logERROR) << "Unknown function enum " << fnum; ret = (this->M_nofunc)(); } else{ FILE_LOG(logDEBUG5) << "calling function fnum: "<< fnum << " " "(" << getFunctionNameFromEnum((enum detFuncs)fnum) << ") " "located at " << flist[fnum]; ret = (this->*flist[fnum])(); if (ret == FAIL) { FILE_LOG(logDEBUG5) << "Failed to execute function = " << fnum << " (" << getFunctionNameFromEnum((enum detFuncs)fnum) << ")"; } } return ret; } void slsReceiverTCPIPInterface::functionNotImplemented() { ret = FAIL; sprintf(mess, "Function (%s) is not implemented for this detector\n", getFunctionNameFromEnum((enum detFuncs)fnum)); FILE_LOG(logERROR) << mess; } int slsReceiverTCPIPInterface::M_nofunc(){ ret = FAIL; memset(mess, 0, sizeof(mess)); int n = 0; // to receive any arguments while (n > 0) n = mySock->ReceiveDataOnly(mess,MAX_STR_LENGTH); strcpy(mess,"Unrecognized Function. Please do not proceed.\n"); FILE_LOG(logERROR) << mess; interface->Server_SendResult(false, ret, NULL, 0, mess); return ret; } int slsReceiverTCPIPInterface::exec_command() { ret = FAIL; memset(mess, 0, sizeof(mess)); char cmd[MAX_STR_LENGTH] = {0}; char retval[MAX_STR_LENGTH] = {0}; // get args, return if socket crashed if (interface->Server_ReceiveArg(ret, mess, cmd, MAX_STR_LENGTH) == FAIL) return FAIL; // verify if receiver is unlocked if (interface->Server_VerifyLock(ret, mess, lockStatus) == OK) { const size_t tempsize = 256; std::array temp; std::string sresult; std::shared_ptr pipe(popen(cmd, "r"), pclose); if (!pipe) { ret = FAIL; strcpy(mess, "Executing Command failed\n"); FILE_LOG(logERROR) << mess; } else { while (!feof(pipe.get())) { if (fgets(temp.data(), tempsize, pipe.get()) != NULL) sresult += temp.data(); } strncpy(retval, sresult.c_str(), MAX_STR_LENGTH); ret = OK; } } interface->Server_SendResult(false, ret, retval, MAX_STR_LENGTH, mess); return ret; } int slsReceiverTCPIPInterface::exit_server() { cprintf(RED,"Closing receiver server\n"); ret = OK; interface->Server_SendResult(false, ret, NULL, 0); ret = GOODBYE; return ret; } int slsReceiverTCPIPInterface::lock_receiver() { ret = OK; memset(mess, 0, sizeof(mess)); int lock = 0; // get args, return if socket crashed if (interface->Server_ReceiveArg(ret, mess, &lock, sizeof(lock)) == FAIL) return FAIL; // execute action if (lock >= 0) { if (!lockStatus || // if it was unlocked, anyone can lock (!strcmp(mySock->lastClientIP,mySock->thisClientIP)) || // if it was locked, need same ip (!strcmp(mySock->lastClientIP,"none"))) //if it was locked, must be by "none" { lockStatus = lock; strcpy(mySock->lastClientIP,mySock->thisClientIP); } else interface->Server_LockedError(ret, mess); } interface->Server_SendResult(true, ret, &lockStatus,sizeof(lockStatus), mess); return ret; } int slsReceiverTCPIPInterface::get_last_client_ip() { ret = OK; interface->Server_SendResult(true, ret,mySock->lastClientIP, sizeof(mySock->lastClientIP)); return ret; } int slsReceiverTCPIPInterface::set_port() { ret = OK; memset(mess, 0, sizeof(mess)); int p_number = -1; MySocketTCP* mySocket = 0; char oldLastClientIP[INET_ADDRSTRLEN] = {0}; // get args, return if socket crashed if (interface->Server_ReceiveArg(ret, mess, &p_number, sizeof(p_number)) == FAIL) return FAIL; // verify if receiver is unlocked if (interface->Server_VerifyLock(ret, mess, lockStatus) == OK) { // port number too low if (p_number < 1024) { ret = FAIL; sprintf(mess,"Port Number (%d) too low\n", p_number); FILE_LOG(logERROR) << mess; } else { FILE_LOG(logINFO) << "set port to " << p_number <lastClientIP); // create new socket try { mySocket = new MySocketTCP(p_number); strcpy(mySock->lastClientIP,oldLastClientIP); } catch(SamePortSocketException e) { ret = FAIL; sprintf(mess, "Could not bind port %d. It is already set\n", p_number); FILE_LOG(logERROR) << mess; } catch (...) { ret = FAIL; sprintf(mess, "Could not bind port %d.\n", p_number); FILE_LOG(logERROR) << mess; } } } interface->Server_SendResult(true, ret, &p_number,sizeof(p_number), mess); // delete old socket if(ret != FAIL){ mySock->Disconnect(); delete mySock; mySock = mySocket; interface->SetSocket(mySock); } return ret; } int slsReceiverTCPIPInterface::update_client() { ret = OK; memset(mess, 0, sizeof(mess)); // no arg, check receiver is null interface->Server_ReceiveArg(ret, mess, NULL, 0, true, receiver); interface->Server_SendResult(false, ret, NULL, 0, mess); if (ret == FAIL) return ret; // update return send_update(); } int slsReceiverTCPIPInterface::send_update() { int ind = -1; char defaultVal[MAX_STR_LENGTH] = {0}; char* path = NULL; int n = 0; n += mySock->SendDataOnly(mySock->lastClientIP,sizeof(mySock->lastClientIP)); // filepath path = receiver->getFilePath(); if (path == NULL) n += mySock->SendDataOnly(defaultVal,MAX_STR_LENGTH); else { n += mySock->SendDataOnly(path,MAX_STR_LENGTH); delete[] path; } // filename path = receiver->getFileName(); if(path == NULL) n += mySock->SendDataOnly(defaultVal,MAX_STR_LENGTH); else { n += mySock->SendDataOnly(path,MAX_STR_LENGTH); delete[] path; } // index ind=receiver->getFileIndex(); n += mySock->SendDataOnly(&ind,sizeof(ind)); //file format ind=(int)receiver->getFileFormat(); n += mySock->SendDataOnly(&ind,sizeof(ind)); //frames per file ind=(int)receiver->getFramesPerFile(); n += mySock->SendDataOnly(&ind,sizeof(ind)); //frame discard policy ind=(int)receiver->getFrameDiscardPolicy(); n += mySock->SendDataOnly(&ind,sizeof(ind)); //frame padding ind=(int)receiver->getFramePaddingEnable(); n += mySock->SendDataOnly(&ind,sizeof(ind)); // file write enable ind=(int)receiver->getFileWriteEnable(); n += mySock->SendDataOnly(&ind,sizeof(ind)); // file overwrite enable ind=(int)receiver->getOverwriteEnable(); n += mySock->SendDataOnly(&ind,sizeof(ind)); // gap pixels ind=(int)receiver->getGapPixelsEnable(); n += mySock->SendDataOnly(&ind,sizeof(ind)); // streaming frequency ind=(int)receiver->getStreamingFrequency(); n += mySock->SendDataOnly(&ind,sizeof(ind)); // streaming port ind=(int)receiver->getStreamingPort(); n += mySock->SendDataOnly(&ind,sizeof(ind)); // streaming source ip path = receiver->getStreamingSourceIP(); mySock->SendDataOnly(path,MAX_STR_LENGTH); if (path != NULL) delete[] path; // additional json header path = receiver->getAdditionalJsonHeader(); mySock->SendDataOnly(path,MAX_STR_LENGTH); if (path != NULL) delete[] path; // data streaming enable ind=(int)receiver->getDataStreamEnable(); n += mySock->SendDataOnly(&ind,sizeof(ind)); // activate ind=(int)receiver->getActivate(); n += mySock->SendDataOnly(&ind,sizeof(ind)); // deactivated padding enable ind=(int)receiver->getDeactivatedPadding(); n += mySock->SendDataOnly(&ind,sizeof(ind)); // silent mode ind=(int)receiver->getSilentMode(); n += mySock->SendDataOnly(&ind,sizeof(ind)); if (!lockStatus) strcpy(mySock->lastClientIP,mySock->thisClientIP); return OK; } int slsReceiverTCPIPInterface::get_id(){ ret = OK; int64_t retval = getReceiverVersion(); interface->Server_SendResult(true, ret, &retval, sizeof(retval)); return ret; } int slsReceiverTCPIPInterface::set_detector_type(){ memset(mess, 0, sizeof(mess)); detectorType dr = GENERIC; detectorType retval = GENERIC; // get args, return if socket crashed if (interface->Server_ReceiveArg(ret, mess, &dr, sizeof(dr)) == FAIL) return FAIL; // set if (dr >= 0) { // if object exists, verify unlocked and idle, else only verify lock (connecting first time) if (receiver == NULL) interface->Server_VerifyLock(ret, mess, lockStatus); else interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum); if (ret == OK) { switch(dr) { case GOTTHARD: case EIGER: case JUNGFRAUCTB: case JUNGFRAU: break; default: ret = FAIL; sprintf(mess,"Unknown detector type: %d\n", dr); FILE_LOG(logERROR) << mess; break; } if(ret == OK) { if(receiver == NULL){ receiver = new slsReceiverImplementation(); if(startAcquisitionCallBack) receiver->registerCallBackStartAcquisition(startAcquisitionCallBack,pStartAcquisition); if(acquisitionFinishedCallBack) receiver->registerCallBackAcquisitionFinished(acquisitionFinishedCallBack,pAcquisitionFinished); if(rawDataReadyCallBack) receiver->registerCallBackRawDataReady(rawDataReadyCallBack,pRawDataReady); if(rawDataModifyReadyCallBack) receiver->registerCallBackRawDataModifyReady(rawDataModifyReadyCallBack,pRawDataReady); } myDetectorType = dr; ret = receiver->setDetectorType(myDetectorType); retval = myDetectorType; // client has started updating receiver, update ip if (!lockStatus) strcpy(mySock->lastClientIP,mySock->thisClientIP); } } } //get retval = myDetectorType; interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_detector_hostname() { memset(mess, 0, sizeof(mess)); char hostname[MAX_STR_LENGTH] = {0}; char* retval = NULL; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, hostname,MAX_STR_LENGTH, true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (strlen(hostname)) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) receiver->setDetectorHostname(hostname); } // get retval = receiver->getDetectorHostname(); if(retval == NULL) { ret = FAIL; cprintf(RED, "Could not set hostname to %s\n", hostname); FILE_LOG(logERROR) << mess; } } interface->Server_SendResult(true, ret, retval, (retval == NULL) ? 0 : MAX_STR_LENGTH, mess); if(retval != NULL) delete[] retval; return ret; } int slsReceiverTCPIPInterface::set_roi() { ret = OK; memset(mess, 0, sizeof(mess)); int nroi = 0; // receive arguments if (mySock->ReceiveDataOnly(&nroi,sizeof(nroi)) < 0 ) return interface->Server_SocketCrash(); std::vector roiLimits; int iloop = 0; for (iloop = 0; iloop < nroi; iloop++) { ROI temp; if ( mySock->ReceiveDataOnly(&temp,sizeof(ROI)) < 0 ) return interface->Server_SocketCrash(); roiLimits.push_back(temp); } // only for gotthard if (myDetectorType != GOTTHARD) functionNotImplemented(); // base object not null else if (receiver == NULL) interface->Server_NullObjectError(ret, mess); else { // only set // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) ret = receiver->setROI(roiLimits); } interface->Server_SendResult(true, ret, NULL, 0, mess); roiLimits.clear(); return ret; } int slsReceiverTCPIPInterface::setup_udp(){ char args[3][MAX_STR_LENGTH] = {0}; char retval[MAX_STR_LENGTH] = {0}; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, args, sizeof(args), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // only set // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { //set up udp port int udpport=-1,udpport2=-1; sscanf(args[1],"%d",&udpport); sscanf(args[2],"%d",&udpport2); receiver->setUDPPortNumber(udpport); if (myDetectorType == EIGER) receiver->setUDPPortNumber2(udpport2); //setup udpip //get ethernet interface or IP to listen to FILE_LOG(logINFO) << "Receiver UDP IP: " << args[0]; std::string temp = genericSocket::ipToName(args[0]); if (temp == "none"){ ret = FAIL; strcpy(mess, "Failed to get ethernet interface or IP\n"); FILE_LOG(logERROR) << mess; } else { char eth[MAX_STR_LENGTH]; memset(eth,0,sizeof(eth)); strcpy(eth,temp.c_str()); if (strchr(eth,'.') != NULL) { strcpy(eth,""); ret = FAIL; strcpy(mess, "Failed to get ethernet interface\n"); FILE_LOG(logERROR) << mess; } receiver->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"); FILE_LOG(logERROR) << mess; } else { strcpy(retval,temp.c_str()); FILE_LOG(logINFO) << "Reciever MAC Address: " << retval; } } } } interface->Server_SendResult(true, ret, retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_timer() { memset(mess, 0, sizeof(mess)); int64_t index[2] = {-1, -1}; int64_t retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &index, sizeof(index), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (index[1] >= 0) { // verify if receiver is unlocked if (interface->Server_VerifyLock(ret, mess, lockStatus) == OK) { switch (index[0]) { case ACQUISITION_TIME: ret = receiver->setAcquisitionTime(index[1]); break; case FRAME_PERIOD: ret = receiver->setAcquisitionPeriod(index[1]); break; case FRAME_NUMBER: case CYCLES_NUMBER: case STORAGE_CELL_NUMBER: receiver->setNumberOfFrames(index[1]); break; case SUBFRAME_ACQUISITION_TIME: receiver->setSubExpTime(index[1]); break; case SUBFRAME_DEADTIME: receiver->setSubPeriod(index[1] + receiver->getSubExpTime()); break; case SAMPLES_JCTB: if (myDetectorType != JUNGFRAUCTB) { ret = FAIL; sprintf(mess,"This timer mode (%lld) does not exist for this receiver type\n", (long long int)index[0]); FILE_LOG(logERROR) << "Warning: " << mess; break; } receiver->setNumberofSamples(index[1]); break; default: ret = FAIL; sprintf(mess,"This timer mode (%lld) does not exist for receiver\n", (long long int)index[0]); FILE_LOG(logERROR) << mess; } } } // get switch (index[0]) { case ACQUISITION_TIME: retval=receiver->getAcquisitionTime(); break; case FRAME_PERIOD: retval=receiver->getAcquisitionPeriod(); break; case FRAME_NUMBER: case CYCLES_NUMBER: case STORAGE_CELL_NUMBER: retval=receiver->getNumberOfFrames(); break; case SUBFRAME_ACQUISITION_TIME: retval=receiver->getSubExpTime(); break; case SUBFRAME_DEADTIME: retval=(receiver->getSubPeriod() - receiver->getSubExpTime()); break; case SAMPLES_JCTB: if (myDetectorType != JUNGFRAUCTB) { ret = FAIL; sprintf(mess,"This timer mode (%lld) does not exist for this receiver type\n", (long long int)index[0]); FILE_LOG(logERROR) << "Warning: " << mess; break; } retval=receiver->getNumberofSamples(); break; default: ret = FAIL; sprintf(mess,"This timer mode (%lld) does not exist for receiver\n", (long long int)index[0]); FILE_LOG(logERROR) << mess; } // check if (ret == OK && index[1] >= 0 && retval != index[1]) { ret = FAIL; strcpy(mess,"Could not set timer\n"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << slsDetectorDefs::getTimerType((timerIndex)(index[0])) << ":" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_dynamic_range() { memset(mess, 0, sizeof(mess)); int dr = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &dr, sizeof(dr), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (dr >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { bool exists = false; switch (dr) { case 16: exists = true; break; case 4: case 8: case 32: if (myDetectorType == EIGER) exists = true; break; default: break; } // invalid dr if (!exists) { ret = FAIL; sprintf(mess,"This dynamic range %d does not exist for this detector\n",dr); FILE_LOG(logERROR) << mess; } // valid dr else { ret = receiver->setDynamicRange(dr); if(ret == FAIL) { strcpy(mess, "Could not allocate memory for fifo or could not start listening/writing threads\n"); FILE_LOG(logERROR) << mess; } } } } // get retval = receiver->getDynamicRange(); if(dr > 0 && retval != dr) { ret = FAIL; strcpy(mess, "Could not set dynamic range\n"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "dynamic range: " << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_streaming_frequency(){ memset(mess, 0, sizeof(mess)); int index = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &index, sizeof(index), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (index >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { ret = receiver->setStreamingFrequency(index); if(ret == FAIL) { strcpy(mess, "Could not allocate memory for listening fifo\n"); FILE_LOG(logERROR) << mess; } } } // get retval=receiver->getStreamingFrequency(); // check retval for failure if(ret == OK && index >= 0 && retval != index){ ret = FAIL; strcpy(mess,"Could not set streaming frequency"); FILE_LOG(logERROR) << mess; } } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::get_status(){ ret = OK; memset(mess, 0, sizeof(mess)); enum runStatus retval = ERROR; // no arg, check receiver is null interface->Server_ReceiveArg(ret, mess, NULL, 0, true, receiver); if (ret == OK) retval = receiver->getStatus(); interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::start_receiver(){ memset(mess, 0, sizeof(mess)); // no arg, and check receiver is null interface->Server_ReceiveArg(ret, mess, NULL, 0, true, receiver); // receiver is not null if (ret == OK) { // only set // verify if receiver is unlocked if (interface->Server_VerifyLock(ret, mess, lockStatus) == OK) { // should not be idle enum runStatus s = receiver->getStatus(); if (s != IDLE) { ret=FAIL; sprintf(mess,"Cannot start Receiver as it is in %s state\n",runStatusType(s).c_str()); FILE_LOG(logERROR) << mess; }else { ret=receiver->startReceiver(mess); if (ret == FAIL) { FILE_LOG(logERROR) << mess; } } } } interface->Server_SendResult(true, ret, NULL, 0, mess); return ret; } int slsReceiverTCPIPInterface::stop_receiver(){ memset(mess, 0, sizeof(mess)); // no arg, and check receiver is null interface->Server_ReceiveArg(ret, mess, NULL, 0, true, receiver); // receiver is not null if (ret == OK) { // only set // verify if receiver is unlocked if (interface->Server_VerifyLock(ret, mess, lockStatus) == OK) { if(receiver->getStatus() != IDLE) receiver->stopReceiver(); enum runStatus s = receiver->getStatus(); if (s == IDLE) ret = OK; else { ret = FAIL; sprintf(mess,"Could not stop receiver. It is in %s state\n",runStatusType(s).c_str()); FILE_LOG(logERROR) << mess; } } } interface->Server_SendResult(true, ret, NULL, 0, mess); return ret; } int slsReceiverTCPIPInterface::set_file_dir() { memset(mess, 0, sizeof(mess)); char fPath[MAX_STR_LENGTH] = {0}; char* retval=NULL; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, fPath, sizeof(fPath), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (strlen(fPath)) { receiver->setFilePath(fPath); } // get retval = receiver->getFilePath(); if (retval == NULL || (strlen(fPath) && strcasecmp(fPath, retval))) { ret = FAIL; strcpy(mess,"receiver file path does not exist\n"); FILE_LOG(logERROR) << mess; } if (retval != NULL) { FILE_LOG(logDEBUG1) << "file path:" << retval; } } interface->Server_SendResult(true, ret, retval, (retval == NULL) ? 0 : MAX_STR_LENGTH, mess); if(retval != NULL) delete[] retval; return ret; } int slsReceiverTCPIPInterface::set_file_name() { memset(mess, 0, sizeof(mess)); char fName[MAX_STR_LENGTH] = {0}; char* retval = NULL; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, fName, sizeof(fName), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (strlen(fName)) { receiver->setFileName(fName); } // get retval = receiver->getFileName(); if(retval == NULL) { ret = FAIL; strcpy(mess, "file name is empty\n"); FILE_LOG(logERROR) << mess; } if (retval != NULL) { FILE_LOG(logDEBUG1) << "file name:" << retval; } } interface->Server_SendResult(true, ret, retval, (retval == NULL) ? 0 : MAX_STR_LENGTH, mess); if(retval != NULL) delete[] retval; return ret; } int slsReceiverTCPIPInterface::set_file_index() { memset(mess, 0, sizeof(mess)); int index = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &index, sizeof(index), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (index >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setFileIndex(index); } } // get retval=receiver->getFileIndex(); if(index >= 0 && retval != index) { ret = FAIL; strcpy(mess, "Could not set file index\n"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "file index:" << retval; } interface->Server_SendResult(true, ret, &retval,sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::get_frame_index(){ memset(mess, 0, sizeof(mess)); int retval = -1; // no arg, check receiver is null interface->Server_ReceiveArg(ret, mess, NULL, 0, true, receiver); if (ret == OK) retval=receiver->getAcquisitionIndex(); interface->Server_SendResult(true, ret, &retval,sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::get_frames_caught(){ memset(mess, 0, sizeof(mess)); int retval = -1; // no arg, check receiver is null interface->Server_ReceiveArg(ret, mess, NULL, 0, true, receiver); if (ret == OK) retval=receiver->getTotalFramesCaught(); interface->Server_SendResult(true, ret, &retval,sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::reset_frames_caught(){ memset(mess, 0, sizeof(mess)); // no arg, and check receiver is null interface->Server_ReceiveArg(ret, mess, NULL, 0, true, receiver); // receiver is not null if (ret == OK) { // only set // verify if receiver is unlocked if (interface->Server_VerifyLock(ret, mess, lockStatus) == OK) { receiver->resetAcquisitionCount(); } } interface->Server_SendResult(true, ret, NULL, 0, mess); return ret; } int slsReceiverTCPIPInterface::enable_file_write(){ memset(mess, 0, sizeof(mess)); int enable = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &enable, sizeof(enable), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (enable >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setFileWriteEnable(enable); } } // get retval=receiver->getFileWriteEnable(); if(enable >= 0 && enable != retval) { ret=FAIL; strcpy(mess,"Could not set file write enable"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "file write enable:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::enable_overwrite() { memset(mess, 0, sizeof(mess)); int index = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &index, sizeof(index), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (index >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setOverwriteEnable(index); } } // get retval=receiver->getOverwriteEnable(); if(index >=0 && retval != index) { ret = FAIL; strcpy(mess,"Could not set file over write enable\n"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "file overwrite enable:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::enable_tengiga() { memset(mess, 0, sizeof(mess)); int val = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &val, sizeof(val), true, receiver) == FAIL) return FAIL; if (myDetectorType != EIGER) functionNotImplemented(); // base object not null else if (ret == OK) { // set if (val >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { ret = receiver->setTenGigaEnable(val); } } // get retval=receiver->getTenGigaEnable(); if((val >= 0) && (val != retval)) { ret = FAIL; strcpy(mess,"Could not set ten giga enable"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "10Gbe:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_fifo_depth() { memset(mess, 0, sizeof(mess)); int value = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &value, sizeof(value), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (value >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { ret = receiver->setFifoDepth(value); if (ret == FAIL) { strcpy(mess,"Could not set fifo depth"); FILE_LOG(logERROR) << mess; } } } // get retval = receiver->getFifoDepth(); if(value >= 0 && retval != value) { ret = FAIL; strcpy(mess, "Could not set fifo depth\n"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "fifo depth:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_activate() { memset(mess, 0, sizeof(mess)); int enable = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &enable, sizeof(enable), true, receiver) == FAIL) return FAIL; if (myDetectorType != EIGER) functionNotImplemented(); // base object not null else if (ret == OK) { // set if (enable >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setActivate(enable > 0 ? true : false); } } // get retval = (int)receiver->getActivate(); if(enable >= 0 && retval != enable){ ret = FAIL; sprintf(mess,"Could not set activate to %d, returned %d\n",enable,retval); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "Activate: " << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_data_stream_enable(){ memset(mess, 0, sizeof(mess)); int index = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &index, sizeof(index), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (index >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { ret = receiver->setDataStreamEnable(index); } } // get retval = receiver->getDataStreamEnable(); if(index >= 0 && retval != index){ ret = FAIL; strcpy(mess,"Could not set data stream enable"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "data streaming enable:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_streaming_timer(){ memset(mess, 0, sizeof(mess)); int index = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &index, sizeof(index), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (index >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setStreamingTimer(index); } } // get retval=receiver->getStreamingTimer(); if(index >= 0 && retval != index){ ret = FAIL; strcpy(mess,"Could not set datastream timer"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "Streaming timer:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_flipped_data(){ memset(mess, 0, sizeof(mess)); int args[2] = {0,-1}; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, args, sizeof(args), true, receiver) == FAIL) return FAIL; if (myDetectorType != EIGER) functionNotImplemented(); // base object not null else if (ret == OK) { // set if (args[1] >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setFlippedData(args[0],args[1]); } } // get retval=receiver->getFlippedData(args[0]); if (args[1] > -1 && retval != args[1]) { ret = FAIL; strcpy(mess, "Could not set flipped data\n"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "Flipped Data:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_file_format() { memset(mess, 0, sizeof(mess)); fileFormat retval = GET_FILE_FORMAT; fileFormat f = GET_FILE_FORMAT; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &f, sizeof(f), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (f >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setFileFormat(f); } } // get retval = receiver->getFileFormat(); if(f >= 0 && retval != f){ ret = FAIL; sprintf(mess,"Could not set file format to %s, returned %s\n", getFileFormatType(f).c_str(),getFileFormatType(retval).c_str()); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "File Format: " << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_detector_posid() { memset(mess, 0, sizeof(mess)); int arg = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &arg, sizeof(arg), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (arg >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setDetectorPositionId(arg); } } // get retval=receiver->getDetectorPositionId(); if (arg >= 0 && retval != arg) { ret = FAIL; strcpy(mess,"Could not set detector position id"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "Position Id:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_multi_detector_size() { memset(mess, 0, sizeof(mess)); int arg[2] = {-1, -1}; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, arg, sizeof(arg), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if((arg[0] > 0) && (arg[1] > 0)) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setMultiDetectorSize(arg); } } // get int* temp = receiver->getMultiDetectorSize(); for (int i = 0; i < MAX_DIMENSIONS; ++i) { if (!i) retval = temp[i]; else retval *= temp[i]; } FILE_LOG(logDEBUG1) << "Multi Detector Size:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_streaming_port() { memset(mess, 0, sizeof(mess)); int port = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &port, sizeof(port), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (port >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setStreamingPort(port); } } // get retval=receiver->getStreamingPort(); FILE_LOG(logDEBUG1) << "streaming port:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_streaming_source_ip() { memset(mess, 0, sizeof(mess)); char arg[MAX_STR_LENGTH] = {0}; char* retval=NULL; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, arg, MAX_STR_LENGTH, true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // only set // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setStreamingSourceIP(arg); } // get retval = receiver->getStreamingSourceIP(); FILE_LOG(logDEBUG1) << "streaming source ip:" << retval; } interface->Server_SendResult(true, ret, retval, (retval == NULL) ? 0 : MAX_STR_LENGTH, mess); if(retval != NULL) delete[] retval; return ret; } int slsReceiverTCPIPInterface::set_silent_mode() { memset(mess, 0, sizeof(mess)); int value = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &value, sizeof(value), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (value >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setSilentMode(value); } } // get retval = (int)receiver->getSilentMode(); FILE_LOG(logDEBUG1) << "silent mode:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::enable_gap_pixels() { memset(mess, 0, sizeof(mess)); int enable = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &enable, sizeof(enable), true, receiver) == FAIL) return FAIL; if (myDetectorType != EIGER) functionNotImplemented(); // base object not null else if (ret == OK) { // set if (enable >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setGapPixelsEnable(enable); } } // get retval = receiver->getGapPixelsEnable(); if(enable >= 0 && retval != enable){ ret = FAIL; sprintf(mess,"Could not set gap pixels to %d, returned %d\n",enable,retval); FILE_LOG(logERROR) << "Warning: " << mess; } FILE_LOG(logDEBUG1) << "Gap Pixels Enable: " << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::restream_stop(){ memset(mess, 0, sizeof(mess)); // no arg, and check receiver is null interface->Server_ReceiveArg(ret, mess, NULL, 0, true, receiver); // receiver is not null if (ret == OK) { // only set // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { if (receiver->getDataStreamEnable() == false) { ret = FAIL; sprintf(mess,"Could not restream stop packet as data Streaming is disabled.\n"); FILE_LOG(logERROR) << mess; } else { ret = receiver->restreamStop(); if (ret == FAIL) { sprintf(mess,"Could not restream stop packet.\n"); FILE_LOG(logERROR) << mess; } } } } interface->Server_SendResult(true, ret, NULL, 0, mess); return ret; } int slsReceiverTCPIPInterface::set_additional_json_header() { memset(mess, 0, sizeof(mess)); char arg[MAX_STR_LENGTH] = {0}; char* retval=NULL; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, arg, sizeof(arg), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // only set // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setAdditionalJsonHeader(arg); } // get retval = receiver->getAdditionalJsonHeader(); FILE_LOG(logDEBUG1) << "additional json header:" << retval; } interface->Server_SendResult(true, ret, retval, MAX_STR_LENGTH, mess); if (retval != NULL) delete[] retval; return ret; } int slsReceiverTCPIPInterface::set_udp_socket_buffer_size() { memset(mess, 0, sizeof(mess)); int index = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &index, sizeof(index), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (index >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { if (receiver->setUDPSocketBufferSize(index) == FAIL) { ret = FAIL; strcpy(mess, "Could not create dummy UDP Socket to test buffer size\n"); FILE_LOG(logERROR) << mess; } } } // get retval=receiver->getUDPSocketBufferSize(); if(index >= 0 && ((retval != index) || ((int)receiver->getActualUDPSocketBufferSize() != (index*2)))) { ret = FAIL; strcpy(mess, "Could not set UDP Socket buffer size (No CAP_NET_ADMIN privileges?)\n"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "UDP Socket Buffer Size:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::get_real_udp_socket_buffer_size(){ memset(mess, 0, sizeof(mess)); int retval = -1; // no arg, check receiver is null interface->Server_ReceiveArg(ret, mess, NULL, 0, true, receiver); if (ret == OK) retval = receiver->getActualUDPSocketBufferSize(); interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_frames_per_file() { ret = OK; memset(mess, 0, sizeof(mess)); int index = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &index, sizeof(index), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (index >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setFramesPerFile(index); } } // get retval=receiver->getFramesPerFile(); if(index >= 0 && retval != index) { ret = FAIL; strcpy(mess, "Could not set frames per file\n"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "frames per file:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::check_version_compatibility() { memset(mess, 0, sizeof(mess)); int64_t arg = -1; // get args, return if socket crashed if (interface->Server_ReceiveArg(ret, mess, &arg, sizeof(arg)) == FAIL) return FAIL; FILE_LOG(logDEBUG1) << "Checking versioning compatibility with value " << arg; int64_t client_requiredVersion = arg; int64_t rx_apiVersion = APIRECEIVER; int64_t rx_version = getReceiverVersion(); // old client if (rx_apiVersion > client_requiredVersion) { ret = FAIL; sprintf(mess,"This client is incompatible.\n" "Client's receiver API Version: (0x%llx). Receiver API Version: (0x%llx).\n" "Incompatible, update client!\n", (long long unsigned int)client_requiredVersion, (long long unsigned int)rx_apiVersion); FILE_LOG(logERROR) << mess; } // old software else if (client_requiredVersion > rx_version) { ret = FAIL; sprintf(mess,"This receiver is incompatible.\n" "Receiver Version: (0x%llx). Client's receiver API Version: (0x%llx).\n" "Incompatible, update receiver!\n", (long long unsigned int)rx_version, (long long unsigned int)client_requiredVersion); FILE_LOG(logERROR) << mess; } else FILE_LOG(logINFO) << "Compatibility with Client: Successful"; interface->Server_SendResult(true, ret, NULL, 0, mess); return ret; } int slsReceiverTCPIPInterface::set_discard_policy() { memset(mess, 0, sizeof(mess)); int index = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &index, sizeof(index), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (index >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setFrameDiscardPolicy((frameDiscardPolicy)index); } } // get retval=receiver->getFrameDiscardPolicy(); if(index >= 0 && retval != index) { ret = FAIL; strcpy(mess, "Could not set frame discard policy\n"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "frame discard policy:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_padding_enable() { ret = OK; memset(mess, 0, sizeof(mess)); int index = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &index, sizeof(index), true, receiver) == FAIL) return FAIL; // base object not null if (ret == OK) { // set if (index >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { index = (index == 0) ? 0 : 1; receiver->setFramePaddingEnable(index); } } // get retval=(int)receiver->getFramePaddingEnable(); if(index >= 0 && retval != index) { ret = FAIL; strcpy(mess, "Could not set frame padding enable\n"); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "Frame Padding Enable:" << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; } int slsReceiverTCPIPInterface::set_deactivated_receiver_padding_enable() { memset(mess, 0, sizeof(mess)); int enable = -1; int retval = -1; // get args, return if socket crashed, ret is fail if receiver is not null if (interface->Server_ReceiveArg(ret, mess, &enable, sizeof(enable), true, receiver) == FAIL) return FAIL; if (myDetectorType != EIGER) functionNotImplemented(); // base object not null else if (ret == OK) { // set if (enable >= 0) { // verify if receiver is unlocked and idle if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) { receiver->setDeactivatedPadding(enable > 0 ? true : false); } } // get retval = (int)receiver->getDeactivatedPadding(); if(enable >= 0 && retval != enable){ ret = FAIL; sprintf(mess,"Could not set deactivated padding enable to %d, returned %d\n",enable,retval); FILE_LOG(logERROR) << mess; } FILE_LOG(logDEBUG1) << "Deactivated Padding Enable: " << retval; } interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess); return ret; }