diff --git a/slsDetectorSoftware/commonFiles/error_defs.h b/slsDetectorSoftware/commonFiles/error_defs.h index 241c3ae77..7253945bc 100644 --- a/slsDetectorSoftware/commonFiles/error_defs.h +++ b/slsDetectorSoftware/commonFiles/error_defs.h @@ -59,7 +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 +#define DETECTOR_NETWORK_PARAMETER 0x0000000000800000ULL // 0x00000000FFFFFFFFULL /** @short class returning all error messages for error mask */ @@ -191,8 +191,8 @@ 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"); + if(slsErrorMask&DETECTOR_NETWORK_PARAMETER) + retval.append("Could not set/get detector network parameter\n"); diff --git a/slsDetectorSoftware/commonFiles/sls_detector_defs.h b/slsDetectorSoftware/commonFiles/sls_detector_defs.h index 7454621f9..3435d5ed7 100755 --- a/slsDetectorSoftware/commonFiles/sls_detector_defs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_defs.h @@ -177,16 +177,19 @@ typedef struct { */ enum networkParameter { - DETECTOR_MAC, /**< detector MAC */ - DETECTOR_IP, /**< detector IP */ - RECEIVER_HOSTNAME, /**< receiver IP/hostname */ - 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 */ - 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 */ + DETECTOR_MAC, /**< detector MAC */ + DETECTOR_IP, /**< detector IP */ + RECEIVER_HOSTNAME, /**< receiver IP/hostname */ + 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 */ + 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 */ + FLOW_CONTROL_10G, /**< flow control for 10GbE */ + FLOW_CONTROL_WR_PTR, /**< memory write pointer for flow control */ + FLOW_CONTROL_RD_PTR /**< memory read pointer for flow control */ }; /** diff --git a/slsDetectorSoftware/commonFiles/sls_detector_funcs.h b/slsDetectorSoftware/commonFiles/sls_detector_funcs.h index 09bfff428..047f0c10b 100644 --- a/slsDetectorSoftware/commonFiles/sls_detector_funcs.h +++ b/slsDetectorSoftware/commonFiles/sls_detector_funcs.h @@ -103,7 +103,8 @@ enum { F_SET_RATE_CORRECT, /** < set/reset rate correction tau */ F_GET_RATE_CORRECT, /** < get rate correction tau */ - F_ACTIVATE /** < activate/deactivate readout */ + F_ACTIVATE, /** < activate/deactivate readout */ + F_SET_NETWORK_PARAMETER /**< set network parameters such as transmission delay, flow control */ /* Always append functions hereafter!!! */ diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.c b/slsDetectorSoftware/eigerDetectorServer/Beb.c index 381957cf7..106e72730 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.c +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.c @@ -268,9 +268,9 @@ int Beb_Activate(int enable){ } -int Beb_SetTransmissionDelay(enum transmissionDelayIndex mode, int delay){ +int Beb_SetNetworkParameter(enum detNetworkParameter mode, int val){ //mapping new memory - u_int32_t baseaddr, value = 0; + u_int32_t baseaddr, valueread = 0; u_int32_t offset = TXM_DELAY_LEFT_OFFSET; char modename[100] = ""; @@ -281,35 +281,41 @@ int Beb_SetTransmissionDelay(enum transmissionDelayIndex mode, int delay){ break; case TXN_RIGHT: offset = TXM_DELAY_RIGHT_OFFSET; - strcpy(modename,"Transmission Delay Right"); + strcpy(modename,"Transmission Delay Right"); break; case TXN_FRAME: offset = TXM_DELAY_FRAME_OFFSET; - strcpy(modename,"Transmission Delay Frame"); + strcpy(modename,"Transmission Delay Frame"); break; - default: cprintf(BG_RED,"Unrecognized mode in transmission delay: %d\n",mode); return -1; + case FLOWCTRL_10G: + offset = TXM_FLOW_CONTROL_10G; + strcpy(modename,"Flow Control for 10G"); + if(val>0) val = 1; + break; + default: cprintf(BG_RED,"Unrecognized mode in network parameter: %d\n",mode); return -1; } //open file pointer int fd = Beb_open(XPAR_PLB_GPIO_SYS_BASEADDR,&baseaddr); if(fd < 0){ - cprintf(BG_RED,"Deactivate FAIL\n"); + cprintf(BG_RED,"Could not read register to set network parameter. FAIL\n"); return -1; } else{ - if(delay > -1){ - value = Beb_Read32(baseaddr, offset); - cprintf(BLUE, "%s value before:%d\n",modename,value); - Beb_Write32(baseaddr, offset,delay); + if(val > -1){ + valueread = Beb_Read32(baseaddr, offset); + //cprintf(BLUE, "%s value before:%d\n",modename,valueread); + Beb_Write32(baseaddr, offset,val); + cprintf(BLUE,"%s value:%d\n", modename,valueread); } - value = Beb_Read32(baseaddr, offset); - cprintf(BLUE,"%s value:%d\n", modename,value); + valueread = Beb_Read32(baseaddr, offset); + //cprintf(BLUE,"%s value:%d\n", modename,valueread); } //close file pointer if(fd > 0) Beb_close(fd); - return value; + return valueread; } diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.h b/slsDetectorSoftware/eigerDetectorServer/Beb.h index 594d053df..e5ddedeb0 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.h +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.h @@ -50,7 +50,7 @@ struct BebInfo{ int Beb_SetMasterViaSoftware(); int Beb_SetSlaveViaSoftware(); int Beb_Activate(int enable); - int Beb_SetTransmissionDelay(enum transmissionDelayIndex mode, int delay); + int Beb_SetNetworkParameter(enum detNetworkParameter mode, int val); 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 0eca16e3b..f1cc52140 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h +++ b/slsDetectorSoftware/eigerDetectorServer/FebRegisterDefs.h @@ -125,6 +125,7 @@ #define TXM_DELAY_LEFT_OFFSET 0x180 #define TXM_DELAY_RIGHT_OFFSET 0x1A0 #define TXM_DELAY_FRAME_OFFSET 0x1C0 +#define TXM_FLOW_CONTROL_10G 0x140 //command memory #define LEFT_OFFSET 0x0 diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.14.4 b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.14.5 similarity index 69% rename from slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.14.4 rename to slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.14.5 index 55830fb4d..9837f64a2 100755 Binary files a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.14.4 and b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServerv2.0.3.14.5 differ diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index 08bd19f59..3ea6aa8fd 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -1313,8 +1313,8 @@ int activate(int enable){ } -int setTransmissionDelay(enum transmissionDelayIndex mode, int delay){ - return Beb_SetTransmissionDelay(mode, delay); +int setNetworkParameter(enum detNetworkParameter mode, int value){ + return Beb_SetNetworkParameter(mode, value); } #endif diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h index b5c2f0871..c440792ed 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorServer_defs.h @@ -42,7 +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}; +enum detNetworkParameter{TXN_LEFT, TXN_RIGHT, TXN_FRAME,FLOWCTRL_10G}; #endif /* SLSDETECTORSERVER_DEFS_H_ */ diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 3629fd3e2..25aa9973c 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -5369,8 +5369,9 @@ char* slsDetector::setNetworkParameter(networkParameter index, string value) { case DETECTOR_TXN_DELAY_LEFT: case DETECTOR_TXN_DELAY_RIGHT: case DETECTOR_TXN_DELAY_FRAME: + case FLOW_CONTROL_10G: sscanf(value.c_str(),"%d",&i); - return setTransmissionDelay(index, i); + return setDetectorNetworkParameter(index, i); default: return (char*)("unknown network parameter"); } @@ -5406,7 +5407,8 @@ char* slsDetector::getNetworkParameter(networkParameter index) { case DETECTOR_TXN_DELAY_LEFT: case DETECTOR_TXN_DELAY_RIGHT: case DETECTOR_TXN_DELAY_FRAME: - return setTransmissionDelay(index, -1); + case FLOW_CONTROL_10G: + return setDetectorNetworkParameter(index, -1); default: return (char*)("unknown network parameter"); } @@ -5593,8 +5595,8 @@ int slsDetector::setReceiverUDPPort2(int udpport){ } -char* slsDetector::setTransmissionDelay(networkParameter index, int delay){ - int fnum = F_SET_TRANSMISSION_DELAY; +char* slsDetector::setDetectorNetworkParameter(networkParameter index, int delay){ + int fnum = F_SET_NETWORK_PARAMETER; char* cretval = new char[MAX_STR_LENGTH]; int ret = FAIL; int retval = -1; @@ -5612,7 +5614,7 @@ char* slsDetector::setTransmissionDelay(networkParameter index, int delay){ if (ret==FAIL) { controlSocket->ReceiveDataOnly(mess,sizeof(mess)); std::cout<< "Detector returned error: " << mess << std::endl; - setErrorMask((getErrorMask())|(TRANSMISSION_DELAY)); + setErrorMask((getErrorMask())|(DETECTOR_NETWORK_PARAMETER)); } else controlSocket->ReceiveDataOnly(&retval,sizeof(retval)); disconnectControl(); diff --git a/slsDetectorSoftware/slsDetector/slsDetector.h b/slsDetectorSoftware/slsDetector/slsDetector.h index 141564183..673729b22 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.h +++ b/slsDetectorSoftware/slsDetector/slsDetector.h @@ -1674,7 +1674,7 @@ class slsDetector : public slsDetectorUtils, public energyConversion { /** 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); + char* setDetectorNetworkParameter(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 da88c35c7..b803a7a9f 100644 --- a/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetectorCommand.cpp @@ -375,6 +375,10 @@ slsDetectorCommand::slsDetectorCommand(slsDetectorUtils *det) { descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; i++; + descrToFuncMap[i].m_pFuncName="flowcontrol_10g"; // + descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdNetworkParameter; + i++; + descrToFuncMap[i].m_pFuncName="configuremac"; // descrToFuncMap[i].m_pFuncPtr=&slsDetectorCommand::cmdConfigureMac; i++; @@ -2709,7 +2713,13 @@ string slsDetectorCommand::cmdNetworkParameter(int narg, char *args[], int actio if (!(sscanf(args[1],"%d",&i))) return ("cannot parse argument") + string(args[1]); } - } else return ("unknown network parameter")+cmd; + } else if (cmd=="flowcontrol_10g") { + t=FLOW_CONTROL_10G; + 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]); @@ -2734,6 +2744,7 @@ string slsDetectorCommand::helpNetworkParameter(int narg, char *args[], int acti 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; + os << "flowcontrol_10g port \n sets flow control for 10g for eiger"<< std::endl; } if (action==GET_ACTION || action==HELP_ACTION) { os << "detectormac \n gets detector mac "<< std::endl; @@ -2745,6 +2756,7 @@ string slsDetectorCommand::helpNetworkParameter(int narg, char *args[], int acti 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; + os << "flowcontrol_10g \n sets flow control for 10g for eiger"<< std::endl; } return os.str(); diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h index 80bb378b4..1e1e13d40 100644 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorFunctionList.h @@ -154,7 +154,7 @@ void setAllTrimbits(int val); int getAllTrimbits(); int getBebFPGATemp(); int activate(int enable); -int setTransmissionDelay(enum transmissionDelayIndex mode, int delay); +int setNetworkParameter(enum detNetworkParameter mode, int value); #endif diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c index 872521865..052a336d2 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.c @@ -205,7 +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; + flist[F_SET_NETWORK_PARAMETER]=&set_network_parameter; #ifdef VERBOSE @@ -4092,31 +4092,31 @@ int set_activate(int file_des) { -int set_transmission_delay(int file_des) { +int set_network_parameter(int file_des) { - enum transmissionDelayIndex index; + enum detNetworkParameter index; enum networkParameter mode; - int delay = -1; + int value = -1; int ret=OK,ret1=OK; int retval = -1,n; - sprintf(mess,"can't set transmission delay\n"); + sprintf(mess,"can't set network parameter\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); + n = receiveData(file_des,&value,sizeof(value),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); + printf("setting network parameter mode %d to %d\n",(int)mode,value); #endif if (ret==OK) { - if (differentClients==1 && lockStatus==1 && delay>=0) { + if (differentClients==1 && lockStatus==1 && value>=0) { ret=FAIL; sprintf(mess,"Detector locked by %s\n",lastClientIP); } else { @@ -4132,21 +4132,24 @@ int set_transmission_delay(int file_des) { case DETECTOR_TXN_DELAY_FRAME: index = TXN_FRAME; break; + case FLOW_CONTROL_10G: + index = FLOWCTRL_10G; + break; #endif default: - sprintf(mess,"unknown transmission mode %d for this detector\n",mode); + sprintf(mess,"unknown network parameter %d for this detector\n",mode); ret=FAIL; break; } if (ret==OK) - retval=setTransmissionDelay(index, delay); + retval=setNetworkParameter(index, value); #endif } if (ret==OK){ - if ((retval!=delay) && (delay>=0)) { + if ((retval!=value) && (value>=0)) { ret=FAIL; - sprintf(mess,"could not change transmission mode %d: should be %d but is %d \n",index, delay, retval); - printf(RED, mess); + sprintf(mess,"could not change network parameter mode %d: should be %d but is %d \n",index, value, retval); + cprintf(RED, "%s",mess); }else if (differentClients) ret=FORCE_UPDATE; } diff --git a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h index bb81b9cae..5eebc1050 100755 --- a/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h +++ b/slsDetectorSoftware/slsDetectorServer/slsDetectorServer_funcs.h @@ -90,6 +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); +int set_network_parameter(int); #endif