From d28d737fb945da740e730b106a0dd144b14e16a3 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Wed, 3 Aug 2016 17:03:37 +0200 Subject: [PATCH] transmission delay added --- slsDetectorSoftware/commonFiles/error_defs.h | 6 ++ .../commonFiles/sls_detector_defs.h | 6 +- slsDetectorSoftware/eigerDetectorServer/Beb.c | 31 ++++-- slsDetectorSoftware/eigerDetectorServer/Beb.h | 5 +- .../eigerDetectorServer/FebRegisterDefs.h | 2 + ....3.14.2 => eigerDetectorServerv2.0.3.14.3} | Bin 277301 -> 277377 bytes .../slsDetectorFunctionList.c | 7 +- .../slsDetectorServer_defs.h | 2 + .../multiSlsDetector/multiSlsDetector.cpp | 2 +- .../slsDetector/slsDetector.cpp | 53 +++++++++- slsDetectorSoftware/slsDetector/slsDetector.h | 2 + .../slsDetector/slsDetectorCommand.cpp | 99 ++++++++++++------ .../slsDetectorFunctionList.h | 1 + .../slsDetectorServer_funcs.c | 78 ++++++++++++++ .../slsDetectorServer_funcs.h | 1 + 15 files changed, 243 insertions(+), 52 deletions(-) rename slsDetectorSoftware/eigerDetectorServer/bin/{eigerDetectorServerv2.0.3.14.2 => eigerDetectorServerv2.0.3.14.3} (62%) diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index 2b501420a..241c3ae77 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -59,6 +59,7 @@ using namespace std; #define COULD_NOT_PULSE_CHIP 0x0000000000100000ULL #define COULD_NOT_SET_RATE_CORRECTION 0x0000000000200000ULL #define RATE_CORRECTION_TAU_SUBEXPOSURE 0x0000000000400000ULL +#define TRANSMISSION_DELAY 0x0000000000800000ULL // 0x00000000FFFFFFFFULL /** @short class returning all error messages for error mask */ @@ -190,6 +191,11 @@ public: if(slsErrorMask&RATE_CORRECTION_TAU_SUBEXPOSURE) retval.append("Rate Correction Deactivated: (tau/subexptime) must be less than 0.0015\n"); + if(slsErrorMask&TRANSMISSION_DELAY) + retval.append("Could not set/get transmission delay\n"); + + + //------------------------------------------------------ length of message diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index e07b1f15d..7454621f9 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -183,7 +183,10 @@ enum networkParameter { RECEIVER_UDP_IP, /**< receiever UDP IP */ RECEIVER_UDP_PORT, /**< receiever UDP Port */ RECEIVER_UDP_MAC, /**< receiever UDP MAC */ - RECEIVER_UDP_PORT2 /**< receiever UDP Port of second half module for eiger */ + RECEIVER_UDP_PORT2, /**< receiever UDP Port of second half module for eiger */ + DETECTOR_TXN_DELAY_LEFT, /**< transmission delay on the (left) port for next frame */ + DETECTOR_TXN_DELAY_RIGHT,/**< transmission delay on the right port for next frame */ + DETECTOR_TXN_DELAY_FRAME /**< transmission delay of a whole frame for all the ports */ }; /** @@ -523,7 +526,6 @@ enum angleConversionParameter { }; - //typedef struct { //float center; /**< center of the module (channel at which the radius is perpendicular to the module surface) */ //float ecenter; /**< error in the center determination */ diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.c b/slsDetectorSoftware/eigerDetectorServer/Beb.c index 7138c706f..381957cf7 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.c +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.c @@ -268,10 +268,27 @@ int Beb_Activate(int enable){ } -int Beb_SetTransmissionDelay(int delay){ +int Beb_SetTransmissionDelay(enum transmissionDelayIndex mode, int delay){ //mapping new memory u_int32_t baseaddr, value = 0; + u_int32_t offset = TXM_DELAY_LEFT_OFFSET; + char modename[100] = ""; + switch(mode){ + case TXN_LEFT: + offset = TXM_DELAY_LEFT_OFFSET; + strcpy(modename,"Transmission Delay Left"); + break; + case TXN_RIGHT: + offset = TXM_DELAY_RIGHT_OFFSET; + strcpy(modename,"Transmission Delay Right"); + break; + case TXN_FRAME: + offset = TXM_DELAY_FRAME_OFFSET; + strcpy(modename,"Transmission Delay Frame"); + break; + default: cprintf(BG_RED,"Unrecognized mode in transmission delay: %d\n",mode); return -1; + } //open file pointer int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); if(fd < 0){ @@ -280,19 +297,19 @@ int Beb_SetTransmissionDelay(int delay){ } else{ if(delay > -1){ - value = Beb_Read32(baseaddr, TXM_DELAY_LEFT_OFFSET); - cprintf(BLUE, "Transmission Delay value before:%d\n",value); - Beb_Write32(baseaddr, TXM_DELAY_LEFT_OFFSET,delay); + value = Beb_Read32(baseaddr, offset); + cprintf(BLUE, "%s value before:%d\n",modename,value); + Beb_Write32(baseaddr, offset,delay); } - value = Beb_Read32(baseaddr, TXM_DELAY_LEFT_OFFSET); - cprintf(BLUE,"Transmission Delay value:%d\n", value); + value = Beb_Read32(baseaddr, offset); + cprintf(BLUE,"%s value:%d\n", modename,value); } //close file pointer if(fd > 0) Beb_close(fd); - return 0; + return value; } diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.h b/slsDetectorSoftware/eigerDetectorServer/Beb.h index 6e4fee3a1..594d053df 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.h +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.h @@ -11,8 +11,7 @@ #include "LocalLinkInterface.h" - - +#include "slsDetectorServer_defs.h" struct BebInfo{ @@ -51,7 +50,7 @@ struct BebInfo{ int Beb_SetMasterViaSoftware(); int Beb_SetSlaveViaSoftware(); int Beb_Activate(int enable); - int Beb_SetTransmissionDelay(int delay); + int Beb_SetTransmissionDelay(enum transmissionDelayIndex mode, int delay); int Beb_ResetToHardwareSettings(); u_int32_t Beb_GetFirmwareRevision(); u_int32_t Beb_GetFirmwareSoftwareAPIVersion(); diff --git a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h index 8ecd6cfc2..0eca16e3b 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h @@ -123,6 +123,8 @@ #define DEACTIVATE_BIT 0x4 #define TXM_DELAY_LEFT_OFFSET 0x180 +#define TXM_DELAY_RIGHT_OFFSET 0x1A0 +#define TXM_DELAY_FRAME_OFFSET 0x1C0 //command memory #define LEFT_OFFSET 0x0 diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.14.2 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.14.3 similarity index 62% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.14.2 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.14.3 index 0fe8abc7af4d922d2214de50afd47882ab684bbe..b74aa1d918b465e72fc6ca02f1099868e3c9c36b 100755 GIT binary patch delta 37156 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 delta 35823 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 } -int getBebFPGATemp() -{ +int getBebFPGATemp(){ return Beb_GetBebFPGATemp(); } @@ -1314,4 +1313,8 @@ int activate(int enable){ } +int setTransmissionDelay(enum transmissionDelayIndex mode, int delay){ + return Beb_SetTransmissionDelay(mode, delay); +} + #endif diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h index b6dbd9ac5..b5c2f0871 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h @@ -42,5 +42,7 @@ enum detDacIndex{SVP,VTR,VRF,VRS,SVN,VTGSTV,VCMP_LL,VCMP_LR,CAL,VCMP_RL,RXB_RB,R enum detAdcIndex{TEMP_FPGAEXT, TEMP_10GE, TEMP_DCDC, TEMP_SODL, TEMP_SODR, TEMP_FPGA}; +enum transmissionDelayIndex{TXN_LEFT, TXN_RIGHT, TXN_FRAME}; + #endif /* SLSDETECTORSERVER_DEFS_H_ */ diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index 13fa1ab03..826cabbcd 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -2077,7 +2077,7 @@ slsDetectorDefs::ROI* multiSlsDetector::getROI(int &n){ int maxroi = ndet*MAX_ROIS; ROI temproi; ROI roiLimits[maxroi]; - ROI retval[maxroi]; + ROI* retval = new ROI[maxroi]; ROI* temp=0; int index=0; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index b6c1c5f06..3629fd3e2 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -5366,8 +5366,13 @@ char* slsDetector::setNetworkParameter(networkParameter index, string value) { if(thisDetector->myDetectorType == EIGER) return getReceiverUDPPort2(); return getReceiverUDPPort(); + case DETECTOR_TXN_DELAY_LEFT: + case DETECTOR_TXN_DELAY_RIGHT: + case DETECTOR_TXN_DELAY_FRAME: + sscanf(value.c_str(),"%d",&i); + return setTransmissionDelay(index, i); default: - return ("unknown network parameter"); + return (char*)("unknown network parameter"); } } @@ -5398,15 +5403,16 @@ char* slsDetector::getNetworkParameter(networkParameter index) { case RECEIVER_UDP_PORT2: return getReceiverUDPPort2(); break; + case DETECTOR_TXN_DELAY_LEFT: + case DETECTOR_TXN_DELAY_RIGHT: + case DETECTOR_TXN_DELAY_FRAME: + return setTransmissionDelay(index, -1); default: - return ("unknown network parameter"); + return (char*)("unknown network parameter"); } } - - - char* slsDetector::setDetectorMAC(string detectorMAC){ if(detectorMAC.length()==17){ if((detectorMAC[2]==':')&&(detectorMAC[5]==':')&&(detectorMAC[8]==':')&& @@ -5587,6 +5593,43 @@ int slsDetector::setReceiverUDPPort2(int udpport){ } +char* slsDetector::setTransmissionDelay(networkParameter index, int delay){ + int fnum = F_SET_TRANSMISSION_DELAY; + char* cretval = new char[MAX_STR_LENGTH]; + int ret = FAIL; + int retval = -1; + char mess[MAX_STR_LENGTH]=""; + +#ifdef VERBOSE + std::cout<< "Setting Transmission delay of mode "<< index << " to " << delay << std::endl; +#endif + if (thisDetector->onlineFlag==ONLINE_FLAG) { + if (connectControl() == OK){ + controlSocket->SendDataOnly(&fnum,sizeof(fnum)); + controlSocket->SendDataOnly(&index,sizeof(index)); + controlSocket->SendDataOnly(&delay,sizeof(delay)); + controlSocket->ReceiveDataOnly(&ret,sizeof(ret)); + if (ret==FAIL) { + controlSocket->ReceiveDataOnly(mess,sizeof(mess)); + std::cout<< "Detector returned error: " << mess << std::endl; + setErrorMask((getErrorMask())|(TRANSMISSION_DELAY)); + } else + controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); + disconnectControl(); + if (ret==FORCE_UPDATE) + updateDetector(); + } + } +#ifdef VERBOSE + std::cout<< "Speed set to "<< retval << std::endl; +#endif + + + sprintf(cretval,"%d",retval); + return cretval; +} + + int slsDetector::setUDPConnection(){ int ret = FAIL; diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 0a62b600d..141564183 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1673,6 +1673,8 @@ class slsDetector : public slsDetectorUtils, public energyConversion { int setReceiverUDPPort(int udpport); /** sets the receiver udp port2 for Eiger \sa sharedSlsDetector */ int setReceiverUDPPort2(int udpport); + /** sets the transmission delay for left or right port or for an entire frame*/ + char* setTransmissionDelay(networkParameter index, int delay); /** Sets the read receiver frequency if Receiver read upon gui request, readRxrFrequency=0, diff --git a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp index 06209a650..da88c35c7 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -363,6 +363,18 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; + descrToFuncMap[i].m_pFuncName="txndelay_left"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + + descrToFuncMap[i].m_pFuncName="txndelay_right"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + + descrToFuncMap[i].m_pFuncName="txndelay_frame"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + descrToFuncMap[i].m_pFuncName="configuremac"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfigureMac; i++; @@ -2650,41 +2662,59 @@ string slsDetectorCommand::helpScans(int narg, char *args[], int action) { string slsDetectorCommand::cmdNetworkParameter(int narg, char *args[], int action) { - networkParameter t; - int i; - if (action==HELP_ACTION) - return helpNetworkParameter(narg,args,action); + networkParameter t; + int i; + if (action==HELP_ACTION) + return helpNetworkParameter(narg,args,action); - myDet->setOnline(ONLINE_FLAG); + myDet->setOnline(ONLINE_FLAG); - if (cmd=="detectormac") { - t=DETECTOR_MAC; - } else if (cmd=="detectorip") { - t=DETECTOR_IP; - } else if (cmd=="rx_hostname") { - t=RECEIVER_HOSTNAME; - } else if (cmd=="rx_udpip") { - t=RECEIVER_UDP_IP; - } else if (cmd=="rx_udpmac") { - t=RECEIVER_UDP_MAC; - } else if (cmd=="rx_udpport") { - t=RECEIVER_UDP_PORT; - if (action==PUT_ACTION){ - if (!(sscanf(args[1],"%d",&i))) - return ("cannot parse argument") + string(args[1]); - } - } else if (cmd=="rx_udpport2") { - t=RECEIVER_UDP_PORT2; - if (action==PUT_ACTION){ - if (!(sscanf(args[1],"%d",&i))) - return ("cannot parse argument") + string(args[1]); - } - } else return ("unknown network parameter")+cmd; + if (cmd=="detectormac") { + t=DETECTOR_MAC; + } else if (cmd=="detectorip") { + t=DETECTOR_IP; + } else if (cmd=="rx_hostname") { + t=RECEIVER_HOSTNAME; + } else if (cmd=="rx_udpip") { + t=RECEIVER_UDP_IP; + } else if (cmd=="rx_udpmac") { + t=RECEIVER_UDP_MAC; + } else if (cmd=="rx_udpport") { + t=RECEIVER_UDP_PORT; + if (action==PUT_ACTION){ + if (!(sscanf(args[1],"%d",&i))) + return ("cannot parse argument") + string(args[1]); + } + } else if (cmd=="rx_udpport2") { + t=RECEIVER_UDP_PORT2; + if (action==PUT_ACTION){ + if (!(sscanf(args[1],"%d",&i))) + return ("cannot parse argument") + string(args[1]); + } + } else if (cmd=="txndelay_left") { + t=DETECTOR_TXN_DELAY_LEFT; + if (action==PUT_ACTION){ + if (!(sscanf(args[1],"%d",&i))) + return ("cannot parse argument") + string(args[1]); + } + } else if (cmd=="txndelay_right") { + t=DETECTOR_TXN_DELAY_RIGHT; + if (action==PUT_ACTION){ + if (!(sscanf(args[1],"%d",&i))) + return ("cannot parse argument") + string(args[1]); + } + } else if (cmd=="txndelay_frame") { + t=DETECTOR_TXN_DELAY_FRAME; + if (action==PUT_ACTION){ + if (!(sscanf(args[1],"%d",&i))) + return ("cannot parse argument") + string(args[1]); + } + } else return ("unknown network parameter")+cmd; - if (action==PUT_ACTION) - myDet->setNetworkParameter(t, args[1]); + if (action==PUT_ACTION) + myDet->setNetworkParameter(t, args[1]); - return myDet->getNetworkParameter(t); + return myDet->getNetworkParameter(t); } @@ -2701,6 +2731,9 @@ string slsDetectorCommand::helpNetworkParameter(int narg, char *args[], int acti os << "rx_udpmac mac \n sets receiver udp mac to mac"<< std::endl; os << "rx_udpport port \n sets receiver udp port to port"<< std::endl; os << "rx_udpport2 port \n sets receiver udp port to port. For Eiger, it is the second half module and for other detectors, same as rx_udpport"<< std::endl; + os << "txndelay_left port \n sets detector transmission delay of the left port"<< std::endl; + os << "txndelay_right port \n sets detector transmission delay of the right port"<< std::endl; + os << "txndelay_frame port \n sets detector transmission delay of the entire frame"<< std::endl; } if (action==GET_ACTION || action==HELP_ACTION) { os << "detectormac \n gets detector mac "<< std::endl; @@ -2709,7 +2742,9 @@ string slsDetectorCommand::helpNetworkParameter(int narg, char *args[], int acti os << "rx_udpmac \n gets receiver udp mac "<< std::endl; os << "rx_udpport \n gets receiver udp port "<< std::endl; os << "rx_udpport2 \n gets receiver udp port. For Eiger, it is the second half module and for other detectors, same as rx_udpport"<< std::endl; - + os << "txndelay_left \n gets detector transmission delay of the left port"<< std::endl; + os << "txndelay_right \n gets detector transmission delay of the right port"<< std::endl; + os << "txndelay_frame \n gets detector transmission delay of the entire frame"<< std::endl; } return os.str(); diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h index 0e0075859..80bb378b4 100644 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h @@ -154,6 +154,7 @@ void setAllTrimbits(int val); int getAllTrimbits(); int getBebFPGATemp(); int activate(int enable); +int setTransmissionDelay(enum transmissionDelayIndex mode, int delay); #endif diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index 599c681ad..872521865 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -205,6 +205,7 @@ int function_table() { flist[F_SET_RATE_CORRECT]=&set_rate_correct; flist[F_GET_RATE_CORRECT]=&get_rate_correct; flist[F_ACTIVATE]=&set_activate; + flist[F_SET_TRANSMISSION_DELAY]=&set_transmission_delay; #ifdef VERBOSE @@ -4084,3 +4085,80 @@ int set_activate(int file_des) { return ret; } + + + + + + + +int set_transmission_delay(int file_des) { + + enum transmissionDelayIndex index; + enum networkParameter mode; + int delay = -1; + int ret=OK,ret1=OK; + int retval = -1,n; + + sprintf(mess,"can't set transmission delay\n"); + n = receiveData(file_des,&mode,sizeof(mode),INT32); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + n = receiveData(file_des,&delay,sizeof(delay),INT32); + if (n < 0) { + sprintf(mess,"Error reading from socket\n"); + ret=FAIL; + } + +#ifdef VERBOSE + printf("setting transmission delay mode %d to %d\n",(int)mode,delay); +#endif + if (ret==OK) { + if (differentClients==1 && lockStatus==1 && delay>=0) { + ret=FAIL; + sprintf(mess,"Detector locked by %s\n",lastClientIP); + } else { +#ifdef SLS_DETECTOR_FUNCTION_LIST + switch (mode) { +#ifdef EIGERD + case DETECTOR_TXN_DELAY_LEFT: + index = TXN_LEFT; + break; + case DETECTOR_TXN_DELAY_RIGHT: + index = TXN_RIGHT; + break; + case DETECTOR_TXN_DELAY_FRAME: + index = TXN_FRAME; + break; +#endif + default: + sprintf(mess,"unknown transmission mode %d for this detector\n",mode); + ret=FAIL; + break; + } + if (ret==OK) + retval=setTransmissionDelay(index, delay); +#endif + } + if (ret==OK){ + if ((retval!=delay) && (delay>=0)) { + ret=FAIL; + sprintf(mess,"could not change transmission mode %d: should be %d but is %d \n",index, delay, retval); + printf(RED, mess); + }else if (differentClients) + ret=FORCE_UPDATE; + } + } + + //ret could be swapped during sendData + ret1 = ret; + n = sendData(file_des,&ret1,sizeof(ret),INT32); + if (ret==FAIL) + n = sendData(file_des,mess,sizeof(mess),OTHER); + else + n = sendData(file_des,&retval,sizeof(retval),INT32); + + return ret; +} diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h index 379e52d19..bb81b9cae 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h @@ -90,5 +90,6 @@ int pulse_chip(int); int set_rate_correct(int); int get_rate_correct(int); int set_activate(int); +int set_transmission_delay(int); #endif