From ca054626e6eba7380b5b913bca362bef26c81f43 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil <33750417+thattil@users.noreply.github.com> Date: Mon, 30 Sep 2019 14:46:25 +0200 Subject: [PATCH] Removeudpcache (#65) * WIP * WIP * WIP * WIP * WIP * WIP * WIP * WIP * WIP * WIP * WIP * solved eiger 1-10g issue * some fixes for remove udp cache to work * bug fix virtual * removed special handling of rx_udpip --- cmk.sh | 2 +- .../bin/ctbDetectorServer_developer | Bin 166680 -> 175020 bytes .../slsDetectorFunctionList.c | 29 +- slsDetectorServers/eigerDetectorServer/Beb.c | 3 + slsDetectorServers/eigerDetectorServer/Beb.h | 1 + .../bin/eigerDetectorServer_developer | Bin 308390 -> 321160 bytes .../slsDetectorFunctionList.c | 45 +- .../slsDetectorFunctionList.c | 87 +- .../bin/gotthardDetectorServer_developer | Bin 120404 -> 128524 bytes .../slsDetectorFunctionList.c | 26 +- .../bin/jungfrauDetectorServer_developer | Bin 130996 -> 139860 bytes .../slsDetectorFunctionList.c | 140 +-- .../slsDetectorFunctionList.c | 25 +- .../include/slsDetectorFunctionList.h | 32 +- .../include/slsDetectorServer_funcs.h | 30 +- .../src/slsDetectorServer_funcs.c | 838 +++++++++++++++++- slsDetectorSoftware/include/CmdProxy.h | 53 +- slsDetectorSoftware/include/Detector.h | 22 +- .../include/multiSlsDetector.h | 176 +--- slsDetectorSoftware/include/slsDetector.h | 235 +++-- .../include/slsDetectorCommand.h | 2 - slsDetectorSoftware/src/Detector.cpp | 64 +- slsDetectorSoftware/src/multiSlsDetector.cpp | 266 +----- slsDetectorSoftware/src/slsDetector.cpp | 506 +++++------ .../src/slsDetectorCommand.cpp | 223 +---- slsReceiverSoftware/include/Listener.h | 4 +- .../include/slsReceiverImplementation.h | 10 +- .../include/slsReceiverTCPIPInterface.h | 19 +- slsReceiverSoftware/src/Listener.cpp | 18 +- .../src/slsReceiverImplementation.cpp | 18 +- .../src/slsReceiverTCPIPInterface.cpp | 190 ++-- slsSupportLib/include/sls_detector_funcs.h | 64 +- slsSupportLib/include/versionAPI.h | 10 +- 33 files changed, 1759 insertions(+), 1379 deletions(-) diff --git a/cmk.sh b/cmk.sh index 70328c2a9..52fda3004 100755 --- a/cmk.sh +++ b/cmk.sh @@ -155,7 +155,7 @@ if [ $TEXTCLIENT -eq 0 ] && [ $RECEIVER -eq 0 ] && [ $GUI -eq 0 ]; then echo "Enabling Compile Option: TextClient, Receiver and GUI" else if [ $TEXTCLIENT -eq 1 ]; then - CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON " + CMAKE_POST+=" -DSLS_USE_TEXTCLIENT=ON -DSLS_USE_RECEIVER=OFF " echo "Enabling Compile Option: TextClient" fi if [ $RECEIVER -eq 1 ]; then diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index 1e19cbea328950d1641c89e7c3a66741585800d6..f8f8686e68be2ec0fa4e1ba342bff6d4787511c2 100755 GIT binary patch delta 86169 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 delta 79211 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,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff); - FILE_LOG(logINFO, ("1G UDP: Destination (IP: %s, port:%d)\n", cDestIp, udpport)); - if (setUDPDestinationDetails(0, cDestIp, udpport) == FAIL) { + FILE_LOG(logINFO, ("1G UDP: Destination (IP: %s, port:%d)\n", cDestIp, destport)); + if (setUDPDestinationDetails(0, cDestIp, destport) == FAIL) { FILE_LOG(logERROR, ("could not set udp 1G destination IP and port\n")); return FAIL; } @@ -1527,7 +1534,6 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t // 10 G FILE_LOG(logINFOBLUE, ("Configuring 10G MAC\n")); - uint32_t sourceport = DEFAULT_TX_UDP_PORT; FILE_LOG(logINFO, ("\tSource IP : %d.%d.%d.%d \t\t(0x%08x)\n", (sourceip>>24)&0xff,(sourceip>>16)&0xff,(sourceip>>8)&0xff,(sourceip)&0xff, sourceip)); @@ -1551,7 +1557,7 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t (unsigned int)((destmac>>8)&0xFF), (unsigned int)((destmac>>0)&0xFF), (long long unsigned int)destmac)); - FILE_LOG(logINFO, ("\tDest. Port : %d \t\t\t(0x%08x)\n",udpport, udpport)); + FILE_LOG(logINFO, ("\tDest. Port : %d \t\t\t(0x%08x)\n",destport, destport)); long int checksum=calcChecksum(sourceip, destip); bus_w(TX_IP_REG, sourceip); @@ -1576,7 +1582,7 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t FILE_LOG(logDEBUG1, ("Read from RX_MAC_MSB_REG: 0x%08x\n", bus_r(RX_MAC_MSB_REG))); val = (((sourceport << UDP_PORT_TX_OFST) & UDP_PORT_TX_MSK) | - ((udpport << UDP_PORT_RX_OFST) & UDP_PORT_RX_MSK)); + ((destport << UDP_PORT_RX_OFST) & UDP_PORT_RX_MSK)); bus_w(UDP_PORT_REG, val); FILE_LOG(logDEBUG1, ("Read from UDP_PORT_REG: 0x%08x\n", bus_r(UDP_PORT_REG))); @@ -1591,6 +1597,15 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t return OK; } +int setDetectorPosition(int pos[]) { + memcpy(detPos, pos, sizeof(detPos)); + return OK; +} + +int* getDetectorPosition() { + return detPos; +} + int enableTenGigabitEthernet(int val) { uint32_t addr = CONFIG_REG; diff --git a/slsDetectorServers/eigerDetectorServer/Beb.c b/slsDetectorServers/eigerDetectorServer/Beb.c index d1e941db6..e958f5da7 100755 --- a/slsDetectorServers/eigerDetectorServer/Beb.c +++ b/slsDetectorServers/eigerDetectorServer/Beb.c @@ -1176,6 +1176,9 @@ int Beb_GetQuad() { return Beb_quadEnable; } +int* Beb_GetDetectorPosition() { + return Beb_positions; +} int Beb_SetDetectorPosition(int pos[]) { if (!Beb_activated) diff --git a/slsDetectorServers/eigerDetectorServer/Beb.h b/slsDetectorServers/eigerDetectorServer/Beb.h index ad0f2ec2e..3ca53043b 100755 --- a/slsDetectorServers/eigerDetectorServer/Beb.h +++ b/slsDetectorServers/eigerDetectorServer/Beb.h @@ -76,6 +76,7 @@ int Beb_GetBebFPGATemp(); void Beb_SetDetectorNumber(uint32_t detid); int Beb_SetQuad(int value); int Beb_GetQuad(); +int* Beb_GetDetectorPosition(); int Beb_SetDetectorPosition(int pos[]); int Beb_SetStartingFrameNumber(uint64_t value); int Beb_GetStartingFrameNumber(uint64_t* retval, int tengigaEnable); diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index 02b9f3b5fd0a53272295d8937f086d4da83f59db..17d286450acd04d93847f0afaf565e14e9cbad75 100755 GIT binary patch delta 84304 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 delta 77375 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%0A4Lwz_Am7D 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,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff); - FILE_LOG(logINFO, ("1G UDP: Destination (IP: %s, port:%d, port2:%d)\n", cDestIp, udpport, udpport2)); - if (setUDPDestinationDetails(0, cDestIp, udpport) == FAIL) { + FILE_LOG(logINFO, ("1G UDP: Destination (IP: %s, port:%d, port2:%d)\n", cDestIp, destport, destport2)); + if (setUDPDestinationDetails(0, cDestIp, destport) == FAIL) { FILE_LOG(logERROR, ("could not set udp destination IP and port\n")); return FAIL; } - if (setUDPDestinationDetails(1, cDestIp, udpport2) == FAIL) { + if (setUDPDestinationDetails(1, cDestIp, destport2) == FAIL) { FILE_LOG(logERROR, ("could not set udp destination IP and port2\n")); return FAIL; } @@ -1175,8 +1188,6 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t #else FILE_LOG(logINFO, ("Configuring MAC\n")); - int src_port = DEFAULT_UDP_SOURCE_PORT; - char src_mac[50], src_ip[INET_ADDRSTRLEN],dst_mac[50], dst_ip[INET_ADDRSTRLEN]; getMacAddressinString(src_mac, 50, sourcemac); getMacAddressinString(dst_mac, 50, destmac); @@ -1195,9 +1206,9 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t int beb_num = detid; int header_number = 0; - int dst_port = udpport; + int dst_port = destport; if (!top) - dst_port = udpport2; + dst_port = destport2; FILE_LOG(logINFO, ("\tDest Port : %d\n", dst_port)); @@ -1212,9 +1223,9 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t /*}*/ header_number = 32; - dst_port = udpport2; + dst_port = destport2; if (!top) - dst_port = udpport; + dst_port = destport; FILE_LOG(logINFO, ("\tDest Port : %d\n",dst_port)); /*for(i=0;i<32;i++) {*//** modified for Aldo*/ @@ -1235,15 +1246,23 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t } - int setDetectorPosition(int pos[]) { #ifdef VIRTUAL + memcpy(eiger_virtual_detPos, pos, sizeof(eiger_virtual_detPos)); return OK; #else return Beb_SetDetectorPosition(pos); #endif } +int* getDetectorPosition() { +#ifdef VIRTUAL + return eiger_virtual_detPos; +#else + return Beb_GetDetectorPosition(); +#endif +} + int setQuad(int value) { if (value < 0) { return OK; diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index 5c8e4bf72..d59b5bb48 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -21,6 +21,7 @@ // Global variable from slsDetectorServer_funcs extern int debugflag; +extern udpStruct udpDetails; int firmware_compatibility = OK; int firmware_check_done = 0; @@ -35,7 +36,7 @@ int virtual_stop = 0; uint32_t clkDivider[NUM_CLOCKS] = {125, 20, 80}; int highvoltage = 0; - +int detPos[2] = {0, 0}; int isFirmwareCheckDone() { return firmware_check_done; @@ -471,13 +472,21 @@ int setHighVoltage(int val){ } -int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport) { +int configureMAC() { + + uint32_t srcip = udpDetails.srcip; + uint32_t dstip = udpDetails.dstip; + uint64_t srcmac = udpDetails.srcmac; + uint64_t dstmac = udpDetails.dstmac; + int srcport = udpDetails.srcport; + int dstport = udpDetails.dstport; + #ifdef VIRTUAL char cDestIp[MAX_STR_LENGTH]; memset(cDestIp, 0, MAX_STR_LENGTH); - sprintf(cDestIp, "%d.%d.%d.%d", (destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff); - FILE_LOG(logINFO, ("1G UDP: Destination (IP: %s, port:%d)\n", cDestIp, udpport)); - if (setUDPDestinationDetails(0, cDestIp, udpport) == FAIL) { + sprintf(cDestIp, "%d.%d.%d.%d", (dstip>>24)&0xff,(dstip>>16)&0xff,(dstip>>8)&0xff,(dstip)&0xff); + FILE_LOG(logINFO, ("1G UDP: Destination (IP: %s, port:%d)\n", cDestIp, dstport)); + if (setUDPDestinationDetails(0, cDestIp, dstport) == FAIL) { FILE_LOG(logERROR, ("could not set udp destination IP and port\n")); return FAIL; } @@ -485,30 +494,29 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t #endif FILE_LOG(logINFOBLUE, ("Configuring MAC\n")); - uint32_t sourceport = DEFAULT_TX_UDP_PORT; FILE_LOG(logINFO, ("\tSource IP : %d.%d.%d.%d \t\t(0x%08x)\n", - (sourceip>>24)&0xff,(sourceip>>16)&0xff,(sourceip>>8)&0xff,(sourceip)&0xff, sourceip)); + (srcip>>24)&0xff,(srcip>>16)&0xff,(srcip>>8)&0xff,(srcip)&0xff, srcip)); FILE_LOG(logINFO, ("\tSource MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", - (unsigned int)((sourcemac>>40)&0xFF), - (unsigned int)((sourcemac>>32)&0xFF), - (unsigned int)((sourcemac>>24)&0xFF), - (unsigned int)((sourcemac>>16)&0xFF), - (unsigned int)((sourcemac>>8)&0xFF), - (unsigned int)((sourcemac>>0)&0xFF), - (long long unsigned int)sourcemac)); - FILE_LOG(logINFO, ("\tSource Port : %d \t\t\t(0x%08x)\n",sourceport, sourceport)); + (unsigned int)((srcmac>>40)&0xFF), + (unsigned int)((srcmac>>32)&0xFF), + (unsigned int)((srcmac>>24)&0xFF), + (unsigned int)((srcmac>>16)&0xFF), + (unsigned int)((srcmac>>8)&0xFF), + (unsigned int)((srcmac>>0)&0xFF), + (long long unsigned int)srcmac)); + FILE_LOG(logINFO, ("\tSource Port : %d \t\t\t(0x%08x)\n", srcport, srcport)); - FILE_LOG(logINFO, ("\tDest. IP : %d.%d.%d.%d \t\t\t(0x%08x)\n", - (destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff, destip)); + FILE_LOG(logINFO, ("\tDest. IP : %d.%d.%d.%d \t\t(0x%08x)\n", + (dstip>>24)&0xff,(dstip>>16)&0xff,(dstip>>8)&0xff,(dstip)&0xff, dstip)); FILE_LOG(logINFO, ("\tDest. MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", - (unsigned int)((destmac>>40)&0xFF), - (unsigned int)((destmac>>32)&0xFF), - (unsigned int)((destmac>>24)&0xFF), - (unsigned int)((destmac>>16)&0xFF), - (unsigned int)((destmac>>8)&0xFF), - (unsigned int)((destmac>>0)&0xFF), - (long long unsigned int)destmac)); - FILE_LOG(logINFO, ("\tDest. Port : %d \t\t\t(0x%08x)\n\n",udpport, udpport)); + (unsigned int)((dstmac>>40)&0xFF), + (unsigned int)((dstmac>>32)&0xFF), + (unsigned int)((dstmac>>24)&0xFF), + (unsigned int)((dstmac>>16)&0xFF), + (unsigned int)((dstmac>>8)&0xFF), + (unsigned int)((dstmac>>0)&0xFF), + (long long unsigned int)dstmac)); + FILE_LOG(logINFO, ("\tDest. Port : %d \t\t\t(0x%08x)\n\n",dstport, dstport)); // start addr uint32_t addr = BASE_PATTERN_RAM; @@ -520,21 +528,21 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t // mac addresses // msb (32) + lsb (16) - udp->udp_destmac_msb = ((destmac >> 16) & BIT32_MASK); - udp->udp_destmac_lsb = ((destmac >> 0) & BIT16_MASK); + udp->udp_destmac_msb = ((dstmac >> 16) & BIT32_MASK); + udp->udp_destmac_lsb = ((dstmac >> 0) & BIT16_MASK); // msb (16) + lsb (32) - udp->udp_srcmac_msb = ((sourcemac >> 32) & BIT16_MASK); - udp->udp_srcmac_lsb = ((sourcemac >> 0) & BIT32_MASK); + udp->udp_srcmac_msb = ((srcmac >> 32) & BIT16_MASK); + udp->udp_srcmac_lsb = ((srcmac >> 0) & BIT32_MASK); // ip addresses - udp->ip_srcip_msb = ((sourceip >> 16) & BIT16_MASK); - udp->ip_srcip_lsb = ((sourceip >> 0) & BIT16_MASK); - udp->ip_destip_msb = ((destip >> 16) & BIT16_MASK); - udp->ip_destip_lsb = ((destip >> 0) & BIT16_MASK); + udp->ip_srcip_msb = ((srcip >> 16) & BIT16_MASK); + udp->ip_srcip_lsb = ((srcip >> 0) & BIT16_MASK); + udp->ip_destip_msb = ((dstip >> 16) & BIT16_MASK); + udp->ip_destip_lsb = ((dstip >> 0) & BIT16_MASK); // source port - udp->udp_srcport = sourceport; - udp->udp_destport = udpport; + udp->udp_srcport = srcport; + udp->udp_destport = dstport; // other defines udp->udp_ethertype = 0x800; @@ -590,6 +598,15 @@ void calcChecksum(udp_header* udp) { /* aquisition */ +int setDetectorPosition(int pos[]) { + memcpy(detPos, pos, sizeof(detPos)); + return OK; +} + +int* getDetectorPosition() { + return detPos; +} + int startStateMachine(){ #ifdef VIRTUAL // create udp socket diff --git a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer index 250eed0449088bb92a4a8c60ef311f46ad6b342e..21b13a1470e8de17bdffe439afc0961f8427f824 100755 GIT binary patch delta 63174 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 WlU6%KqSjbsL{+E{jcequwf`G(fM2!% delta 55658 zcmb4s4O~=J`v08~aKKTof;hZr0}>LEP3Fs}sDmOZqM+hSW;G%zDJ3c;zT}K%#kOui zmlDgZ!L0RHY>nk^GmPz$YvmTXqfuE|alMFW=Hg2>Dl-4?bMD-kK~4AX=X3CW&w0*s zo^#G~p7VZY%jvF-wO!K+vU2h{jthayuyxE1^@w%<67%x@}x*7mm}W@i}7r zOIkRSsDFur%Qs9FCsp$^y5n!7@)Yr<#xo{}*tR#T;WeoG?f= z#8OlpAr@8hm8w=IAO1S*b+sn3_7x6}7qZ1dP!t9zxUx{LHHK6CIWy77TR;`~VOPL`a1;?YtL@|@&q{ADoXIad-U56OUO3n?Idv46KTs( z5Duu*lb1bd5_3=oa8e(x&2`q90+~i~ZD8;K7|59xQoHn5f4NCGxGzRkDi};rVTB`A zV&O<(LzjV;QJiQSrOM+6�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 #endif - +extern udpStruct udpDetails; // Variables that will be exported int phaseShift = DEFAULT_PHASE_SHIFT; @@ -30,6 +30,7 @@ int virtual_status = 0; int virtual_stop = 0; int highvoltage = 0; #endif +int detPos[2] = {0, 0}; int detectorFirstServer = 1; int dacValues[NDAC] = {0}; @@ -1327,7 +1328,13 @@ void calcChecksum(mac_conf* mac, int sourceip, int destip) { mac->ip.ip_chksum = checksum; } -int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport) { +int configureMAC() { + uint32_t sourceip = udpDetails.srcip; + uint32_t destip = udpDetails.dstip; + uint64_t sourcemac = udpDetails.srcmac; + uint64_t destmac = udpDetails.dstmac; + int sourceport = udpDetails.srcport; + int destport = udpDetails.dstport; #ifdef VIRTUAL return OK; #endif @@ -1337,7 +1344,6 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t FILE_LOG(logDEBUG1, ("\tRoi: %d, Ip Packet size: %d UDP Packet size: %d\n", adcConfigured, ipPacketSize, udpPacketSize)); - uint32_t sourceport = DEFAULT_TX_UDP_PORT; FILE_LOG(logINFO, ("\tSource IP : %d.%d.%d.%d (0x%08x)\n", (sourceip>>24)&0xff,(sourceip>>16)&0xff,(sourceip>>8)&0xff,(sourceip)&0xff, sourceip)); FILE_LOG(logINFO, ("\tSource MAC : %02x:%02x:%02x:%02x:%02x:%02x (0x%010llx)\n", @@ -1359,7 +1365,7 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t (unsigned int)((destmac>>8)&0xFF), (unsigned int)((destmac>>0)&0xFF), (long long unsigned int)destmac)); - FILE_LOG(logINFO, ("\tDest. Port : %d (0x%08x)\n",udpport, udpport)); + FILE_LOG(logINFO, ("\tDest. Port : %d (0x%08x)\n",destport, destport)); //reset mac bus_w (addr, bus_r(addr) | RST_MSK); @@ -1413,7 +1419,7 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t calcChecksum(mac_conf_regs, sourceip, destip); mac_conf_regs->udp.udp_srcport = sourceport; - mac_conf_regs->udp.udp_destport = udpport; + mac_conf_regs->udp.udp_destport = destport; mac_conf_regs->udp.udp_len = udpPacketSize; mac_conf_regs->udp.udp_chksum = 0x0000; @@ -1516,10 +1522,20 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t return OK; } + int getAdcConfigured(){ return adcConfigured; } +int setDetectorPosition(int pos[]) { + memcpy(detPos, pos, sizeof(detPos)); + return OK; +} + +int* getDetectorPosition() { + return detPos; +} + /* aquisition */ diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index 36dc65ed753a745769a826ebd5d0a6f429a51d40..33c966ba249360d8331a579dfce497db68990dbf 100755 GIT binary patch delta 70485 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%0A9MQ^wT zA9F8F#LV#^%p5l<%Y#^9w(g;Q!&+gsB0{AK=!&mVEny5Wp*|cT%23?PM1Dv2gczGQ z5izxUzZ;e{_Pm+s_oR$R4N#2*!JWa$D~uJq>zl1vxzi!vcEgiKYCsj6(0WZV`5Cz{H8wpuk3{cQ1;@*cv0ZMZ6T zThw?`fK#^NY{3=Y*8xU|i-oT6Fv15$8WS;V4Bz4Kz3qy{m&knWS1jn+xCTuh{VUIPx8J#YXkpfRW$9I}hG@@NR#FJ_<+P zgRbPjH)-TS_~yemAHLzs+Sb10D|YyH8u5;hEFg1;p-hS8@}c6Ef?Uu@v^o7 z!FM?T@3%(e!rKjRH+w)jm%Sv5=@7P|hgYViAL$HC$ zg+uXKxR79!lwBDE=fHd=ectTh;Q<(-*{T&LenK{@|4I*eu3kGT^6SCmp%^h;9KTcrM?wUzLhk2QNKU4>*@yeWi|G;*|(#j*e;>B z`)$3}g9z7CI?vqRG?uhKuhm0y^|g9FTJL_iG7`um zFo=~iu-v(QJ$91f6wF1(_Bp z!0Y0kcM}Xd#Ut-dFpL*(a1XL+UntAQMFQEli=gAJO^^2O8G;WRBPvr>92~6-&Rxui2HEF{_wO2=;DE2=^+ZtnUdVwzY3}X|Iq)Ag zOx(LGJz*yT>|_DzLv{opH6&iJBLF{4i_YWeE9r$OZobamMbU2}STPV*aTiH~cH$KOy9X|A?XD?%nBkZ$N+zEC3hsBfv)p z&?n?afcT*ocOG)#V2ZJ;nZw`3os}+JMu70U-xz>UwdXYxY8MJ1e7$(<-)|FY;a|)6 zeQ>@S{3L|@;e0jx52bV7l=kshL?T`t%kYuG9k?uiM+b!1alQ^=&*JIe`8tI4rSsmp zJ$1VKG8*2_t#xPc(U=|hXv~gLIMp3PC%Xl?E=BVU%f(=;ENPW7w$AkE5W58`8pRT* zcSj$hi{5q70taahgtY-UI^yaFQE2xe-MWn~h$*3g33mpfu@zP*=wwyThJmZKIcHTLUXkbORaLe6+*{ z8kE=oO6(Y@eawzSQ1gL=LBRO~c?oO*%{6R%UU4^GC&e{cAGA@hX z{G&(O7XxuqV7}65(1qt~)H{Z0CyfEuVHvFH|G@p_6L@P2I~MR!bQ7w?6wkm|_0jIJ zYL6QukMAAytTp5-Av%;!aw%)cFQCuvMrz^Y*Ewop>8qcga#TL<9fH0p{QNr-r5K(% zZ)e!~@O1Xs-h=Rglb?x-v-L z5Z3koNc@|xSIljLSlvwGJ!K0F6?6l&I8V4IKK}MTm)Ria9$tk`L70E&2VlXeb0Y}dIcMYVy$VO zN4{y5gK{;S*!P2hu?OD7;{KcB10PrnRif}gXW`{ubbN8>wosV?hZ#5a(jQ^GtsD7y z%a$^~k_LVsbSA%087CJvpik*YYf7}dgDzuFPJT%BRVb@^D4(?NK9ZAu7=qnX?WKgD zW2Bo$D_^!R6%#+~+^)Zl#X)iOhkasB4-!B3bu%Qh91S4}p*LBMrs2a7X>Uh!G#y{4 zNPmlR;DKby(H!6$h9@UejurwJGCV$+a?}CrV0dgY<>&_B4GfP+rW`E?E@ya1GUe!A z;Jpm@PezVTmjWOJ7@==6Qtq?71JF`&Ffv5#5SsYt>TroQCJLDi59&3!$5hsrgX&bS>4M=&Jd%7mZep zD_@#1ISU+#tMbga!jeKCC#9x?o?b;CAx%eJprMo4b7X1XiF4 zcFV^joXkhY?}J$(4v6dib$!g;16U!BPhwfV{cUVTew$@^HNNpty)&BSHDFW2G`KgB zvb-L+p5fhzl;viGH}7PHJdv`zA8%5*Vi1ZMVRa&9xf9sQaB(7K`F7y#3@=HfEcXC=7%ohtEI$Z*kl}pnXv#+$t8}g( z7Nvd51s-1};r~XTZs-x#hETRJ)$jkWwYQI}vdZ`V*TPHOGH7H3NJKja35jUOkP(A~ zhzubjA(;^&A}VrFiO?7$H!_4|WGKWYV~mi@Q8XeHL~bL8!+0ASgJh&+pk$0O9*(!; zFb;#i_u3nL=;6%y)~40cW>Z~VSK`dL#y!T=qJY6;YKq5`Ao}S zGP!9EH|}@ayM<@rKZn&zmIqs^{<=CJ9WsPadj!`b%-6pkR@=C`Zg;(j>w65oYLChw zLxwrSnPGJvQW?Z`bsl=h;6?#uTrV?U|7_T@H}fJn+|BjZ4fb4b=6bXF`XTe*xK;Oe z534iK%LWY>SvEgKwB=wEv-b{WoMo0MkCCKv*$0c_TJ(`(AD_4HJNVwZ_c#jND5Tn4 z$Q&l4WtuuLO)ZoCZbFtxc_$&uM4v>+GR=#QwRjmVf82#HWe%&CTJ@u5Ys@dT>YHv6 zR2Q*Ny(AO9L1 z0@q&RIAmo12qPRevVTMnjxg^Z;XP4= zqdEu8`$`Pqm`=ZnTlW=Ba4!CkbMc4b{1Z2x*GcB3{+oxxsn_Ny{!^Qdr5S3|x&C*x z=~${!8_hVw_48l-UEgE(fH?n;M@Dnre$ThJ+*34o)Xl2M+q{Lu-DloHoId1FGk$2^ zLSm{};?+0T%tD&C@I$plX!oftB#n5QIX>j7wvYni1?Kn_SG9$d6E8Q%`(4!*QcJwn z9Pf2iTgXx3N6qmrSG9$75$`g`J6zd9_=+G21LlNQSG9#`G)Svf4QO^%TZj{JCv&{f zRc#?&#J$Y%T35A&1Q8E1$E#d#-9qZzZ|>*H?z!a4qp%lzNhTEptGvUdv>QCbYp93G;dAs7X9~UvnMxmwVA8Q zH?F>6zM57vul4?@M{WEJnVgv(vC$dE@dojdPW}Ag_=NxF=XYPw@w2z%m1l+bR=$~2 zeNad0W}Ej|_^*yvKj>)rrndU4|nhj$m9 z{=DFSmvK|ujlvJN8Jvfh80fsKc@tFr#aZS}(Eh<9-JkvBhN78&o@^Cius7m>m#*STy|EQRVwjRbNr&S+N|=4=bPi_oYiJkM!d`%KkckG zt7_ua=6Jia+N_$1H=EKjO@072DHKLccko!C7rqf(D5i)qomjwOQE{ zw>QUkJFCsggSdw|Ug4}Zs{rBw=J+<}TQ{rsi`KMndE8?CJGa!A=j)ttD_G)oTkH(i zmUBMm-s~E68nU`R>YRDtx_S~07CmwDq0zBRKN+a6B5PHR&alPoZ>uI&ZH{qhC)`+5 z)OONARu+AC^1=JMYxpDfHR^LcRq|^$7V19pLNyjW((%g_@iD#pm|rJzW3=MTqqUgd zZkx%X$Q)T{S%kAj7Fssp?2(0*OE`CAq2&|KA6aMxgbPL%S|Q=W&Z5H|&Q|+9%+IRz zlg-2L@-bhJ|JXeI3u}2c)!rQbINBBWv9iAVWHtO5#52rs*U4)53yBw+;|`P6@K+MA zG{+}SR>NOUyxttQo~(wym3XT;KJ281zngfsIeyiN;WzeNA>oQS;gXXYejN?c)v5+u za8kqXLfpk1KkKB1-$2}8j-PT;!yiIC#2i1t@ZLP`ex<+ptWrCQ#i(kJM#= zrrB-D{OBHXjNUt%UUcG=dsIHn&aeF~Pp1nv=EpC1c=EpDG1^4OE!_tVH`=GRCQIwo zhGc1*+Da^=Ulj7CcVaOEUTpsG^&vY}CRL#GcT8iB5=Q686Ye66_`xTvy&r4u$J6A& zcg+c-^LO1iMfsVhrSN51^YmoU9&vz&x3*IGQI@*na*b_I~qZ%00k&;K0qv zluwEI`_)*MIjYH2PQ2V4FLqRusgZc2IbPtXCQ}>nHgi1JQB9^^;=Sg0mZO?XgTx2T z@eD^bnQW=g_JArs)zLhe^d#ub2}zD>GWinsHOJ!|)np1I9%hcmII77MM?B6Pk8o6z zDUEoVIUeG8>tvdDupfatS&B~^Io@HFrQEBIDgggn@-K= zB=vT%*gVu-?$^(EUdP{iUElMrn+H$hcZ**8>Ymwuzu&WGXjuJP0Q)*N>bl^b(oQR+ zeoSk;qve_k|Mda3L(2A`>@hdaU>@eOcNG2Qt9u`B;Zs6Ca`@Hp_x30&wN9MRbW~rv zQ$P4ahq;!<-JRz54)w9tzs&C)nMF^Wo^1Rteu0k4RY|T&avd_id8l07<~NV$+;s_l z7wWFRrl-8~-41*T+=&aUQzk?w@E2{U+Y;wPPwMWh^C5LEed{*&t(&y&I@OPReyKi4 zvDDQ|UA@%x>Tr|M>;~lbh@0PErjArLpK-Dj%g2M~4^WAyXD_XvsVYY5Xf*m(^Tx2+ z%XOGp<4tC?F;4Xy)$7^g?{28FD?%gRR&b#lms`qtG{pP{s`|Ua{L0fi)zaTdG$Dx0 zLG{X#!-G@AT2C&CD zewPBj+*pY7Q(e1hw5Nk5eP&M<&CRNR#*njI*=pClO_X@%9v)tll}!tJZoG3@n_IA9 zsw{fA>z)TZTy+NidZX?xe!8TJyjAu8D8GLGlN%pV_L|?&78SkFb(hKTlx%u{A7lGn zPD@knCVsfDY0U3>#Pw%moMM9JZCaole>n@R4CeV>^m*3`>+bsTJ>B&m2Y#JnYpp*x zzDIxXGtjiDD^pqd0^ByBNOUK3Teg;$I15w?aE$^8%)*yR+ zcb1>-Hl5Vu%fT*Zu>6_P)zm-M!$QzxHw`r}l^mnd3Zry|Qb9)XP zpMch|sVBE{I&L=|vzE@b^~bMPk25@tP3n)E2CSunE~#Bd!;{)g6UWJ&zN%Z5ovPe~ z<(7_BQlF(;Dt)wDm7R&=$)3i}@yOISPWsuXJ4RaKsgunfm7U`#>83d?h72+r^)_=l zjF+CqMrvv7e0s|`y$~r?QOq9kua#S7+y29G-Cn`B-T6S^_{^T8$Af!Xk6&)&qk-c% ze~()c<7+Z^>U)gL=65Hp_L;p}nRoVxd6Pso?xQn9<0iN}J$rB_t)ETL3unApox;!K zTUzL72yYC(kDDyrR9&=;bE0^b@AX?6R(E#1TrZ8g+DpqzKkEF*>7#`o+4St<1D%C6 zPH!cL1-iUs$m4fyTPB5Sfwj3FHJ)milgyK1F4rd@H7S+~qhZ|09hrPSmdW%{EmJu& z+ws1TgVzT}E`wT}YUWbPxbcShMdK4D5H$7vLb_X5wNL1&YB$;0O8*7r4g3z1h9e1T zW{Y#vbVBrxRYlDtRXsB-S5?8{yt7WtQS%iza^?ITy3qT$sU;^btMyIm9%bdU@kY*h20@- zrFGkJ+n%=LrdT`aZJq3jtJ2l9*-lQk?j*hQxapXk+-F_iz?rY1ZvCAy$jYI%qwP@l zp%30$yhS9BNw7}%c8Oh2ZHKAjF1gj(?GS$CL#9-FndjC@Ev*egtav->ZK)e$KOuFj z-X@h#?QE|)a%`l?)&`Tq-O}A?duV)*?IE2(h%j>c+Ve3a<=7s&GvrA_eu5l7)`h=j z5;m}0XZ>W4Ag?%df6YHuk547{_0A&p{IQj5v)45M@-)ph+dA4>pgz<|9yBo&) z*e%!+`_x;ym?tT9z+Br{y}Do6wm2r64&5yua_~Cziyp5-|6%ygq|ly_Ln3*suQjY2 zzFQh(Oa^l!qupBP;o{))w0YAC{9kQaiNcy4eWvs?jJ2I;{~LCNn}cD>ag>ICH-K%9 z(&3f?Gz~aPkJ$ft&=bYq8pj%J4KdVgW#wnEwjKY2niB=niV0iE&m#YAtU3m%Un67Q zjnbWNv`MXt?B$Ll+w08*YHD(lQ;awJF}Wq+lWIMx zb*Wa|jg8til+hpEYsG{ooJPxH0gaTC+0JUc^GD0ols;Jo&@5rz>c%Ii&91pqut~FR z^YO)K6@$y|if$i>MDwq_uci6tc`l8vFJ+Ra`R=z{kC3x%H`!b1wS?JpXDqtg$7tAi zW8+cVjWX6aL!!~VO{z9);HhMgp)8T<`nZ0@p~+Y@wT0y5?6*-oMk$)2b~bdzmz+quJv1fVQNq7x2CIZvN4)RXG>5##4L$(xYyGjJ|8=izL8 z(uR>@4%$eZOn+-4bDG4U+5^W2#?e#?gO6YNJ@X}0o6OHKXm($hbcR;Qj+(|RPt0rw93 zxs)&gd2R_d*vwPELN;66;ghoEskjyFJR^OJdO*5{rk?yTTJ>WBc@l-M&0Q|O(a-WX zC&%5ef!&t8`Kpbz=6v+}d?a?f-D-8U56BbJ;pP$H)&qj6behbbSli)bI9TIj@bDS0 z9ukqikxq4ip3+&ei3Rr*bXYb-wR)_GSMy>&$dL4A!-}Z-)nhr|_OCQmQ(hF4ArJEerJ? zTQ&t!c6F$ac-4kurGJ{j?apNGP+hYtnnP!QfmG+s9Y6Jubi)|8rRlt-i?yu-i^0L< z=`GzxtXUW1Eq9Im)t~vM}mHw``{+)4#r+5>r__Jx3 zpG+OiGX@_)bn!EVRX6xDxbNGV492yDN_5E6=%3B}j@iW*O z+h}Clr*+$ANGECCLB~2iHPr{o&DNcSJ3lo=Ji%ael8NxDC!||w|EC*29^cddsSs8l z>fXMSGt(oi+x|~&(48UA8lLPKb7VZS;*6tvdkkl!aAG#-&XA`to-J2xkC-~2kPG!L zN18sg>2WzS*(WE~kH0DR*0?y1Hj#->%4WN=98r!hsjT@iHy zPss`n=N;pFnmbIT^QHgf=*a8m&yM~PD>fhgT1uqaO6=D@Kop7M(JHha zZARPCK6DtJs9U;P?vWX(;-od=FXfY_!qk9H$Rj9TIbF>P37KsiY4u3rk22oU^Ba|`ytni`^69yYo{Wr{9UVGz*6jH=E%j6B zs{9*y>1KreNK0-@G<}dM|4&`+Z)KP?c83db2@N5eIUJplJMu-rCEJtgs?|bkO2jv2o#Hw(OQ&?wnm7$&(_H%%~qedbjjj1FD}(jebJ_F zwNd_6PMW_oBV)y?<@!eqze$|!ub-M^Q|FT-8>~%sIr2Vdy+_iDB>k$@8T#c*GxRIh zq-Lzpzqn%E(rMnN2|2ufdD~#9#f$wD6aAMg@lQ(fpK9>QH2+8X(@AOi7gw)IU$Ruc za`6)V;-sYXr7ymyUy{CbamLal>Uz;eOifNE|IhsQvt{^<6k-@Dg^Z*9NLre)bVy|=Rr1|{&LVhaKEoD&0j|;iI zA&#rmc>Fk*>8lO$apQ;~^r17KjPNoyXK`w(K5cRO;+2>-o$dnU*C@!hj01TO09ojiCeGzZ^LOns^n%Jn}2w1@((I(95Hj%!Mcf?rT82X%34Dv+&C>+J26toU)Lfg>p z&rOrwlHQXtP70BQa!~;)K3R8dr3{qbfgK#cP&`_N)}zg6JKBd1qZ8;Xy3}DhTq4g- zYW_lqUZkC(?XgQC=f-W_|tVh+j#f)ZtvlM zhAtzkbDZta6y$?~Q8Y?K=_u!1op%}UYu+i}(oeJrZ9}_J13HFIql@SovblhrF4Rrm zE{Emx^_+V*qwQ!PI*d-Bv*;2UMic)+Q;|1Xx+HnE-e79lE+?Dzl*{pT1?5t+GUi;O zfhYxe{FjB3MyTTInvzOW@d3i4N++E1Paz7gahyPjgcZX_sN(9Hl1fu?ms_O!rw9_e zr4)9WMFV4`uqLcjOn5Y|!YWP0TW(R!7+E)Ohn#CaNwW29TQ9^r=&3(q=Rcb6d|&#Q z>>79%aCu*jmv#F0<=Bz`O@xn^#7GV4O}upLOigvt$)T!UihksEQi{dB%R>glcB`S9QmuYhYho8a$<~tRKOw=~Y7~4B+-yE~U zint5PMdH7i;~;pVE`(ou`KGpG%tos`X}(@bdN0@8&DS-qoA2JJI^u?!QT=7ke%9)K zC$8(?)a@AehIPT%jauHASFLiT>ET0iyjAKyO#X+Y=h$RE(miMTSEF<^Wgp^$jtC)5 zuOE`r#(0gDrn*CN>KI`wP2U`n_m0UTa9sti5V)^V-v7(u2~rgNL`(Ff+0!NcL}^+= z#xcHkNYlnfIn65RPE$>zoH8~cQHl~vwF8Y(XEm5;y4EN?j1fmTi?(PYf;At}30XuD z7vUfr(!^YzT5~5tj5Svey`c{bf*~*(E`Uie8LoxvU_LB>+u(Ls1*_pl#=>~Wh(@Nv9GC}7;5N7$?t@emNkx&2 zT;wT8$0F%iB&#iQSQGOm3Ndezk-!uJ?r=Kvhv6_1#=}II4%fmwxCzpudGu)BK3D^> z;5;li?-V=@FTzW3n70KhO+-zC4$vKXLVp+tBcU;xKq7%hS6{VTn1C%I=CKg7Q*<{Rst0y?1Tqk13U&# zz_aiiybP~uBHEgr!v;D-SLh9WU@#1Y3t%ivfvezpm;<-M61WrYh7IsAJRyuCx}Cr| z5-z~2@R}y($8zL~hpS*Z%z=5Z1a5=Z;IJlQCJGTV2~L6Ta60tox((MSLRUBi`oQTh z6o$jya34I(sbT&R0`2e=yZ|p!P&fre!g!bn)8Sf}2RFfOa68-wYv2*s0#Cuy@FKhf zhj~G<(!|q~paXP=p3ol#LSrO>Xab3F8C(n3*|Je;GO$m`zbkd|#rjSl~uoRYQa&n`P#>veD z+J&6lsY&M)A)V9UW>~CAmmncsB4Gkdg6S|@llR66d2ga7UHR+JuJ+IcPSK=?t&kqh za0>K*Yhf-dfLmb~ya+GDK}}9uCX900Dgs$TPRoHUumfIzmo(`)Nk~r@*bT9S=O7%? zG%PcXo=-agyRal3@T3Fro>b&n zNkTh3g-Mw#4?4kSNDBinb$}0yhlyB*hK6s_WTcajk$Nn{q)jb?$z)Vee zu(~{0UGBNW^NF_*KSsQacsXQQyR)p_IorASYvO@4As)!kgzS<8q0GU%X1pbdRhy-0tYqW$v)!AKH}K`55s;qpoxb(g?Pvt zM!+bT3ezABdT1XHId6Pw-Z7f+&VhN5o_o{thq1`RSmfaaFcw~e!Zt)o{;>HkpGc9xCv6xBlO%Sl(Td=%!aveJFMU#=R?6h6zm(zi(R}X9t{%W zQ6Arq?t?X&n0`!%=_fStn1c|HIm0j*0k^^u$T{b+qnhwzBlBY;^Gk%w;8}Q16OYr8 z$LWaQCgPik2NMs4919*daxQqBf*z-!$D3d?WQ-nXjQnkc@Sg~|(VrXrt03ouUo+;v zX3T%heZS_uUvGok;W>B#UWQjS5#T9AfH(AqfiNAeg`444c!Yy>KnsD3BwW(O3_Bra z*uyxO0I6UG70e*x4D!t&-wg5vh6oWD1{2{j$bluW17gWQEct}B5Kq`ZCfO4irjDcX z!RMJiK}??@TWAMepdNZb0}OycFakzFnh-=2o+zV;a!ow9Q;6qwYhu|lyxS>U&*6F= z?1g=%xc|#nux3)-Oy=}VMtCM8JhKoM!*W;&t6?p~&NH#|%r;1~XWBt~O$0l0PIZL_ z=&Omf?)V=)iH8yohs}_Ip0!GdS?MqfW<$nj)@JQKF{_k783{CY7LA=%3+puz%0PsA zo4k(6aEFjo4%=y(2w4Z$!+cm^$~q=Jt!FV~W}P!N9%J*HO(SO0h}nTK7-E>&7-n`X zjEAh#*{svqYvDSW3-cjkHk&aExk|a$h#w{13Qxh)5QEL`gG`dyOcMGgLN&-N4P};w zxr;R`d z37BZkIoJ;e;59hRnOw)2+!i`OXXpk!pbwl5gJ1}ZgwZe#GQT2H;3}92vtSnFss0WcmWLdNG=#wV7B#L|#BED~qLByo)dnl$lzvJlUw!Xcao zLKE@juo8B`ZcQwrVT)+kA}U-&g$WE%0z;H=4qnj2;sbcQ8#Ixa$m(bDF42ToqSM4u z8nTpzETO_B)R%1jF#oI^a>yaETe#BRJe=^mwO7a+*=dL3_&tOkiy(Z zVQwVTqhxxNLPaT5l+27vX2z|w6Jn*kCJLAn1Vn^1_CZYd0;YSBIq)KLAmc1IoYTabg+i=}W8H?S&kf)z$Ygt|L5P8mSFMD2)f)D}eof?s@TpxGEP>k~1?N$49u3W-p?QOFND~_wx_pK%KL7@4;ZHdn%3nkXb+ zA^Fr>eId(r3k}*rgSIS#DUgP5q2XItHCu)uJ={VMx6-k#bZl!BjDc(6I!Fh$(gEXJ zxk9{^uZg!X-CLNh#D$M`^pNxt(oLs?Fr6meLj0H}N}Yr#bs^nAx-W4WSV{xmP7~to z3{7mK=iBJ{wm~?giFfGnJM{RS3-F>Q%4lF24SeS+@oTLAGE7m1DSq!O#P9u}4P;Ji z_r#Co4QbeR8ul&?dzXg2OZvN{znclOU@K&Dl~YbR<&@LIa(YFap-YMosLX zp*v`3WhWnub!p=LJ|W)k*ThbGy7QVQcDV|%YlU-Vh35zpRk@kIRaZW@h43B zCrnyXN(E&UJduJY!CF{P1t+MWor3Ks*d7ky77|pzBtFC>K8!^UW06msDbE$A!3@|2 zJ1F0q_5UXyD%eK_H5BYd!5;7!JV6D$RM4l1{c%F(&&$MpOAU_Ts$Lz+0C<6{L|=mcG$2lRq|tp5W61j1khH{^3e0X^}dN7MNWiSG2s z6M91$TAu^+U^%RWOrrWDunTrWW_LZa`ydq^q@shBSY{vP%9mZx_+DuEExuKaGnwd1sOq&0+ z7veviUiCmCb0iSO?=L3_?*@7IVSrY zlYQ<54KM%(!3Y=y<6r{Ba-U z|1usXLRQC@td1{t!7A7a+u$G^(nP0=5S@BRgF9*PR~fATuQCac@RdrS2Vc>Hui9V- zqz7NogRchQ6-}HLeE6Y3J7^E}&%WVZcb$V5G|}V0FYt7RrLYXL%z9X6J-x6GUV(#}ILDBkW5~|2O3pb!H|PO&J#2!_kb=LX;P2?bcXXf+3-n=uzHFEa3t=&2DEb(R zzG_&@`tPHFJ__h-gB`FN_QC;pMH75XCH|s8J7^E}&;HQ$e6KDSKuJ| zSsmYdLMr^83cshq@2T+nZIB)Edm8>d4exj32VFd101SfbVU8yLI>d)@LKD}R1J{hW zzhs(_GDDMh^$U5|fF|#qDCE79pa(R-U>FYZLfu=S$tk$Orr>|mTMMbj-!}DtkW(9A z2kg|O`$8ez<6#iQUFPluDaSn=MnVBKh`Y?_j$h3^m4tK(@T355;#I_}VLfcp8f8zlZD@h}{NVTZ|onEW^hXAi<5 z+-M7Nqs3`*-dbFt^KfNG*$5dm5z^8qS{k(gk|BzQMNv^yCd`7H;AV)YGHM&V0CcV+(ZsQkvmfzr;tPmVp>qK7NaC@Yyx&R4`(0o@EHLGskCk(0sG^qxa33Up1^IV`a}bV%SKuHktda^Usi2Y;R?@=v zHBQDl=m4Ez3S7lW*`AZK6J&<&WQFZq2iI%jgDFCM;0{@#AFx6{*a>%YqNbuC+vHf1iDG+<+bc6uVt-F8aF152X9vkdAo`u{S@h^Ne>}C3{t>56tF#s z>&bY?Xh<*(S!>Okw++N{Yq8u~Ci7Y*^V&^tGrSD1^2Qy<8+QV%(V~M65^5?9Pq~d3&_!)-e8HVK9Li|d__?5iyD;Z!bY{Rh{g<~~__5WNxfdUdb zU?=`2#yE~KjvItS_?zhY^YlEPSsc$Sj;Dw5^l%XkSVRLBF$Weg2NoTJCm<$Xgoznm zk)VT_FbiISm+?b+;)n8v%!$RDS^ta62~^^kvd1yy1S{b#H~_EUnDWIj+;C)hz+{*TE8tGp01rd*Emirhz(M?28The`nFNjyXn~jERn{+) zYB`f?ISpD)gO<~S<@8{A6KsYQu$%&tnUu*)%H%K@0e8VFNCT5;U@{dZQ{jpL_JJUn z1+!r@JPNU}am5fDK`@@OP#6KDU;!+IM`0_(bSaqbKj`6q(8JUrJZAzA8a-V}Pgl0U zV|dPz@SG)UB8{O*V`$RyVF5e=+i{@LkQZpk3v}QGI*_i`e>xUOr{(EY@H9LNF?~9w zfAIjGwg%VAYxxSmxC%QW$dtq`x+L3;QK zJzTF7V!bWQgjtXtt{-H1#bM$ENC%B{FxyUuYzSYc-MM z!ndvTFdOE=KG=_M&==pJA7oPfj!Bg}374P)OoeHXp~_{bUS)2)%G`MMFgyaW?5kKd zZxyb160;@9cv>j@BxypBZ*B5)-}!Bg-w>;H`)cDxXFK6?5FJ$++4 ztbiS`6Ca~1KE^4KiZ@g7o0<@B>L3<-6N|lx#ookXg?fCCZul0b;9GRZhuDME5b^^^l&H(9;rYXahrGIOM(( z?kmBhC785?hLq3{lRdsiCy0qnnAmgxHb5F=qCussj#5@fDfgGE&*4fL+fv5%Z39k9 zUr5DoQ}NqWyp4*tVVP}MW?L`pi>GX*pDHH>}jHVWR(nJY$mGaNU>PRyTwlO*J(lPBF`nlq@B=aXk2Cu}XT5*UdhZy< z*wyhjG}ig1iqgf_lhz&pz{UJ)EQ@;mZ&=29r6 zOEGV2F}$rU)THrVzHD%Bxh5aDEaU@M`O<-bFCB1$C$DXu4SeZ<*SiNpHTg8}7*F$Z z;(Xc$ghXIlX!Y^p9lBxvh<)IF;w=@S{jvThZop6u_3C$=S z?FjHv;u1oEyu`Th(&Lg$!GRP^#nb4?G~OGhor4#tpqC2zAa7R>3i9(>=fZ2@g9*fw zU@fdC{RHXleDQ=HPcMZ-e9=VX3n#YF9`ZGf$FhwCP7^o_Dflr8_VeMJD1I;&CU7Hf zUDN65^a{8eUW8ccF<0`t!$g=4w?nS`rEnkd02;=};4%OU1cdP2p)kHX#QSL=uZ@Ac zHU?6D;No~qx?vi(5?<4~cuk`L;irTQr$KWng`BfXlMy?GjG*9XUgM&%(EL@rFH*rm zO~{3IntZld$Y&XALxYfp7Tz1T@!D9a$t759$pw?k1v$lg217K%pD!(8)fvo>zyc~S zgvAi+1RjP*U<*8EO1&VzH(ucT2^Tf-E2h-1*bjdd4-;V;%+Q3FzYt!5kp0k${m?5K zE`a3oBHu%$eAA+gxzCd$kS9lAHq3?fu#tx^YbKL5ler7Bi^z*Y$V-|S!(ts1$D=8L zwGhBs2#(=MN@v#$@^l~K>F&qVJpi(r*Rq<|u^X&oH)tVW3;CM%u{diWi?~TGVj9>& z16wNKPRh%qyevoqf@wf74G5+I!42>*ybQ1MXnMMavo0Iyv+bN=PjPl-(Z#CO&g!mZ zb=R`GYgyg3IWUh!Tg#%YhipfO*p6!1hHBY{4zO(rC{XgYd{z-8RjnC=*+`^*+^v>kMUE|42Pk!#qEuxPgKs|NnGgULKhdf zv7H-FI&;C5^mC+NAia(B4&wd92e=;0^-vfEV@S^+JrkcQ@lN8Mt*{NAf~RqP3S6HW zw1E@Z*09WJEOUAvkA~AV1bRv6gO?zdI1?ennJ9><&S0uD1+WkvfDI7SpTYEeYT%3z7J^P zn+PGkiGpY0IZbqL7NUDA`I2}veVt5z3tw~L>{V{KMn=Z;8^*Moin^)j>ol%sz>Dw_ z*D>ignDiSO@C^<4hOz&KvG1-R|4#B{kuMuk-q)%;O#cn0|0V$@!6EVq@*ArNRFg5E zj0Ie&`thcoWkBXg?(Tk42I-8Prk3q$zMrFV(CacEP>ld zr=G8==WG&jI((LVXUS*mrH8%r@InaBwlEk8qjBQ;;J-TGVbFB=D-E! zKrcP)rH2<7%L_+gC+va)@CpTNqk!%33LNBN%+URXp}SavZ}tE@0$cFGI^lzLfmrH$ zEcHDd`<{+{Ps6_F+3J)fq|+uIO-}62PCT3^*9bZJ01mxO9C}%#^F(msiQvqx>8yig zkbDkRJY1`JR`P7*%W=|^UEY&j{y}S=i8h=9rtqxgk>zPcx;4y(d3YY#c^~1~_z2e@ z;d($gk1S&(j{|NDz@5>63!BkrNeCngE`gagmQdY*-iJo~8VF)DiOGQ7$&a3asZ zNsvdDACIgVM|teD!X%hXIaC}-#WOO9XA-A8o)L0J4RKB#4#cN8kPufPWZX_j&*JD= zTn^;MI4l!aYHI$gTw-Lx&SJtwH1L&~!>|>$L98Ev^&=Ra2u5eF72jsJhW3zoJl7q1 zLO&P)!(k+3TFhly%v}Z3VK&T#TVV-g+RbI!%{>4cIOEM_{>*Kyi#jaJC7bqB7x`-T zB{*z~^(5#3sV|!PqM5$Yfsj$>aW0}0;WEhRM>8#>H^I$tJFI}ro@i!IbPGHN zPs6kD61>b8r0Lgu`ZeDH8krLFJqdWjKo|_8;R3h}roeS@J=_ep!V0(((xLfuX#O#H z0%E}V7;ye&c$IHXTk{QS8|VyOp*Qq_!7vmqVAGC?C6GeGD!3lzz^$+Z?u5Hx13U~* zz;<{JUVvBOHGE7qJa;ETS2zXw!09j)hQnAG4_Co-p09a4UpK)9HthoxT$ju-JQY%L z9TnHHBh;}Y)MBDqEL6)*QOizIn*@`&5lbAv5)I3EAg90_m~#y+>lU=Z4!mT+c*#Ox z8q9#~mCvwOK3m3#qa4=4de{ZKA#?dz=5j1^HkLUX8wFz^mX5{Ju||3vOOIpOnqt|S zo}<9$DDXM9uIJdg;8=lwjs_7t;`FSRDygy#GK)h!(d=U*_j_vS0gEi2juXwFO?&Y^0yQMG!4AA=dc0_Euo~9FA-rd-)+H3Qgo2iA zhZXPuY=9TwMZ9W(c-4YoAMD3#X25Ia3qxTz&N6|sOoOb>Wx22fZe!D4J_YZXJ6X#Hr-jRD;c~Wx6rRO zO#Nan?1R_fFkZ7$c+E~juCL+x8uG6p|C%P)%(=Rob9FCXGdH|u9+3Pmk^iO3@G1xP zeh%ydIL88Tjs?MHcvKTvbj+AV&$23o$l8T>%n9$93#6s5(9-qxc*UGxF3e}L2yW0| zGE9ZFuwE0{3{AEklAcX^b}#JH#D*v#HpIY2*o0He1E-i5EP#dZ3Pt7&;vEaZI~D?4 z;4ydsUc@_=iFYguVu@TV@v0qOF?*a`2Pw{ z!Y~*C8JgD^n%9oPR-9hy8#|krbeq~>2VSpayk4nzyXa|w1{cCOxC*AjbMOMrt_Yl6 zQ7{Q6LmKi14SAy;Hsbv9#QEh7qu~NbgErHk&CT#APB1$1CLMXxNQ>X3#cyJwH!)G6 z7hW*~UNLXHVm^4qTJegt;RR!8idIL@$0*aVv) zbK))LL3M||ht{#(PFZyQyf8hWAVd<6r{bGxAlDuZnmT@x8?N65mUFuW~lC1B-nc#KikB@xFdI zfY*!yKcv79nN%M#sjA6WO}^?}m=9ZF8{V@hyk{}66qe!Sa>2=^hs^dGW_!&M*urO0 zq<>8M$9^yXl5YH1T{ug^IUcWFJYKuuAROWa+=>@)Ysik*!j9K+5nh5U$ChDDKFaCu z(R!U+;f6er7cwAU7K{RHy2MRLkWLh)o zK%J-yb)#N%6t$u@oqVMd?Lt)W3KhIU1+UPcR~k_hqKsF_{|fnEA-^#UMW84YgBGGV zlz@^@GD=0pH2%xb$qjnshCGlLG9X_>t2fZ<4M8XbQSb%|-ax?{D0BmbZ=k>p6uyDN zbL@~kazZYMa&ss*hjMc$H-~a_C^sh?B6EPQIRn$nZKDUg!GjTz{SG zuXFu%b-fIgqe`?3RiSEBi|SD$YC_HEC~8G*r~`GPF4T>B8UNS&2=t=?bOjBfA)PD` zNJBbgi|mj+azZXhkKB+4@$$kaRWjd+FtS1*i}eqf%6c%26fSg{n|Bs@2JgUeu+NmDEx(fR5_q4m(7P zci58-D}52QSM-s_Jv%xGx1u(r!kwra^<$cfD+C775E%v1kPg`*7okA-cA+X% zjp|V&YC_HEC~8G*s1tReZq$qVP(K<#SI{6D!a@QWHU85fTV#jqkqgozH{^l5kOBFj z02G8mP#B6pQD~t~{-G3=p>kA-cA+X%jcQRnYD7(_Sts}SvNZNk=pG8)L!o;pbPt8@ zq0l`Px+exv@SZr7fC^DDqM|)iw1XaEfocY)o|4%s6o;#Z&!_9NpE5nJSjf=~$ZKnCQ8;!qTd zK?{*D3PWBf07W1@NUtdkwps20_uMpTJ* zp(>qhr|@1C=-<;3izU5Cr{a-07QkSa#1Cs&{N#_C6#{3eP70*?EepXSVw{Y delta 62604 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 XY(p3IvW-03NY_T8ZKP`}LoNRoGv^J9 diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index e3312b760..5cbe9d120 100755 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -23,6 +23,7 @@ // Global variable from slsDetectorServer_funcs extern int debugflag; +extern udpStruct udpDetails; int firmware_compatibility = OK; int firmware_check_done = 0; @@ -38,6 +39,9 @@ enum detectorSettings thisSettings = UNINITIALIZED; int highvoltage = 0; int dacValues[NDAC] = {0}; int adcPhase = 0; +int detPos[4] = {0, 0, 0, 0}; +int numUDPInterfaces = 1; + int isFirmwareCheckDone() { return firmware_check_done; @@ -1022,16 +1026,12 @@ void setNumberofUDPInterfaces(int val) { FILE_LOG(logINFOBLUE, ("Setting #Interfaces: 1\n")); bus_w(addr, bus_r(addr) &~ CONFIG_OPRTN_MDE_2_X_10GbE_MSK); } - FILE_LOG(logINFO, ("config reg:0x%x\n", bus_r(addr))); + FILE_LOG(logDEBUG, ("config reg:0x%x\n", bus_r(addr))); } int getNumberofUDPInterfaces() { - FILE_LOG(logINFO, ("config reg:0x%x\n", bus_r(CONFIG_REG))); - FILE_LOG(logINFO, ("config reg 2x10 :0x%x %d\n", - CONFIG_OPRTN_MDE_2_X_10GbE_MSK, - bus_r(CONFIG_REG)|CONFIG_OPRTN_MDE_2_X_10GbE_MSK)); + FILE_LOG(logDEBUG, ("config reg:0x%x\n", bus_r(CONFIG_REG))); // return 2 if enabled, else 1 - return ((bus_r(CONFIG_REG) & CONFIG_OPRTN_MDE_2_X_10GbE_MSK) ? 2 : 1); } @@ -1128,94 +1128,104 @@ void calcChecksum(udp_header* udp) { -int configureMAC(int numInterfaces, int selInterface, - uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, - uint32_t destip2, uint64_t destmac2, uint64_t sourcemac2, uint32_t sourceip2, uint32_t udpport2) { +int configureMAC() { + + uint32_t srcip = udpDetails.srcip; + uint32_t srcip2 = udpDetails.srcip2; + uint32_t dstip = udpDetails.dstip; + uint32_t dstip2 = udpDetails.dstip2; + uint64_t srcmac = udpDetails.srcmac; + uint64_t srcmac2 = udpDetails.srcmac2; + uint64_t dstmac = udpDetails.dstmac; + uint64_t dstmac2 = udpDetails.dstmac2; + int srcport = udpDetails.srcport; + int srcport2 = udpDetails.srcport2; + int dstport = udpDetails.dstport; + int dstport2 = udpDetails.dstport2; + #ifdef VIRTUAL char cDestIp[MAX_STR_LENGTH]; memset(cDestIp, 0, MAX_STR_LENGTH); - sprintf(cDestIp, "%d.%d.%d.%d", (destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff); - FILE_LOG(logINFO, ("1G UDP: Destination (IP: %s, port:%d)\n", cDestIp, udpport)); - if (setUDPDestinationDetails(0, cDestIp, udpport) == FAIL) { + sprintf(cDestIp, "%d.%d.%d.%d", (dstip>>24)&0xff,(dstip>>16)&0xff,(dstip>>8)&0xff,(dstip)&0xff); + FILE_LOG(logINFO, ("1G UDP: Destination (IP: %s, port:%d)\n", cDestIp, dstport)); + if (setUDPDestinationDetails(0, cDestIp, dstport) == FAIL) { FILE_LOG(logERROR, ("could not set udp destination IP and port\n")); return FAIL; } return OK; #endif FILE_LOG(logINFOBLUE, ("Configuring MAC\n")); - - uint32_t sourceport = DEFAULT_TX_UDP_PORT; - + int numInterfaces = getNumberofUDPInterfaces(); + int selInterface = getPrimaryInterface(); FILE_LOG(logINFO, ("\t#Interfaces : %d\n", numInterfaces)); FILE_LOG(logINFO, ("\tInterface : %d %s\n\n", selInterface, (selInterface ? "Inner" : "Outer"))); FILE_LOG(logINFO, ("\tOuter %s\n", (numInterfaces == 2) ? "(Bottom)": (selInterface ? "Not Used" : "Used"))); FILE_LOG(logINFO, ("\tSource IP : %d.%d.%d.%d \t\t(0x%08x)\n", - (sourceip>>24)&0xff,(sourceip>>16)&0xff,(sourceip>>8)&0xff,(sourceip)&0xff, sourceip)); + (srcip>>24)&0xff,(srcip>>16)&0xff,(srcip>>8)&0xff,(srcip)&0xff, srcip)); FILE_LOG(logINFO, ("\tSource MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", - (unsigned int)((sourcemac>>40)&0xFF), - (unsigned int)((sourcemac>>32)&0xFF), - (unsigned int)((sourcemac>>24)&0xFF), - (unsigned int)((sourcemac>>16)&0xFF), - (unsigned int)((sourcemac>>8)&0xFF), - (unsigned int)((sourcemac>>0)&0xFF), - (long long unsigned int)sourcemac)); - FILE_LOG(logINFO, ("\tSource Port : %d \t\t\t(0x%08x)\n",sourceport, sourceport)); + (unsigned int)((srcmac>>40)&0xFF), + (unsigned int)((srcmac>>32)&0xFF), + (unsigned int)((srcmac>>24)&0xFF), + (unsigned int)((srcmac>>16)&0xFF), + (unsigned int)((srcmac>>8)&0xFF), + (unsigned int)((srcmac>>0)&0xFF), + (long long unsigned int)srcmac)); + FILE_LOG(logINFO, ("\tSource Port : %d \t\t\t(0x%08x)\n", srcport, srcport)); - FILE_LOG(logINFO, ("\tDest. IP : %d.%d.%d.%d \t\t\t(0x%08x)\n", - (destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff, destip)); + FILE_LOG(logINFO, ("\tDest. IP : %d.%d.%d.%d \t\t(0x%08x)\n", + (dstip>>24)&0xff,(dstip>>16)&0xff,(dstip>>8)&0xff,(dstip)&0xff, dstip)); FILE_LOG(logINFO, ("\tDest. MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", - (unsigned int)((destmac>>40)&0xFF), - (unsigned int)((destmac>>32)&0xFF), - (unsigned int)((destmac>>24)&0xFF), - (unsigned int)((destmac>>16)&0xFF), - (unsigned int)((destmac>>8)&0xFF), - (unsigned int)((destmac>>0)&0xFF), - (long long unsigned int)destmac)); - FILE_LOG(logINFO, ("\tDest. Port : %d \t\t\t(0x%08x)\n\n",udpport, udpport)); + (unsigned int)((dstmac>>40)&0xFF), + (unsigned int)((dstmac>>32)&0xFF), + (unsigned int)((dstmac>>24)&0xFF), + (unsigned int)((dstmac>>16)&0xFF), + (unsigned int)((dstmac>>8)&0xFF), + (unsigned int)((dstmac>>0)&0xFF), + (long long unsigned int)dstmac)); + FILE_LOG(logINFO, ("\tDest. Port : %d \t\t\t(0x%08x)\n\n",dstport, dstport)); - uint32_t sourceport2 = DEFAULT_TX_UDP_PORT + 1; FILE_LOG(logINFO, ("\tInner %s\n", (numInterfaces == 2) ? "(Top)": (selInterface ? "Used" : "Not Used"))); FILE_LOG(logINFO, ("\tSource IP2 : %d.%d.%d.%d \t\t(0x%08x)\n", - (sourceip2>>24)&0xff,(sourceip2>>16)&0xff,(sourceip2>>8)&0xff,(sourceip2)&0xff, sourceip2)); + (srcip2>>24)&0xff,(srcip2>>16)&0xff,(srcip2>>8)&0xff,(srcip2)&0xff, srcip2)); FILE_LOG(logINFO, ("\tSource MAC2 : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", - (unsigned int)((sourcemac2>>40)&0xFF), - (unsigned int)((sourcemac2>>32)&0xFF), - (unsigned int)((sourcemac2>>24)&0xFF), - (unsigned int)((sourcemac2>>16)&0xFF), - (unsigned int)((sourcemac2>>8)&0xFF), - (unsigned int)((sourcemac2>>0)&0xFF), - (long long unsigned int)sourcemac2)); - FILE_LOG(logINFO, ("\tSource Port2: %d \t\t\t(0x%08x)\n",sourceport2, sourceport2)); + (unsigned int)((srcmac2>>40)&0xFF), + (unsigned int)((srcmac2>>32)&0xFF), + (unsigned int)((srcmac2>>24)&0xFF), + (unsigned int)((srcmac2>>16)&0xFF), + (unsigned int)((srcmac2>>8)&0xFF), + (unsigned int)((srcmac2>>0)&0xFF), + (long long unsigned int)srcmac2)); + FILE_LOG(logINFO, ("\tSource Port2: %d \t\t\t(0x%08x)\n", srcport2, srcport2)); - FILE_LOG(logINFO, ("\tDest. IP2 : %d.%d.%d.%d \t\t\t(0x%08x)\n", - (destip2>>24)&0xff,(destip2>>16)&0xff,(destip2>>8)&0xff,(destip2)&0xff, destip2)); + FILE_LOG(logINFO, ("\tDest. IP2 : %d.%d.%d.%d \t\t(0x%08x)\n", + (dstip2>>24)&0xff,(dstip2>>16)&0xff,(dstip2>>8)&0xff,(dstip2)&0xff, dstip2)); FILE_LOG(logINFO, ("\tDest. MAC2 : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n", - (unsigned int)((destmac2>>40)&0xFF), - (unsigned int)((destmac2>>32)&0xFF), - (unsigned int)((destmac2>>24)&0xFF), - (unsigned int)((destmac2>>16)&0xFF), - (unsigned int)((destmac2>>8)&0xFF), - (unsigned int)((destmac2>>0)&0xFF), - (long long unsigned int)destmac2)); - FILE_LOG(logINFO, ("\tDest. Port2 : %d \t\t\t(0x%08x)\n",udpport2, udpport2)); + (unsigned int)((dstmac2>>40)&0xFF), + (unsigned int)((dstmac2>>32)&0xFF), + (unsigned int)((dstmac2>>24)&0xFF), + (unsigned int)((dstmac2>>16)&0xFF), + (unsigned int)((dstmac2>>8)&0xFF), + (unsigned int)((dstmac2>>0)&0xFF), + (long long unsigned int)dstmac2)); + FILE_LOG(logINFO, ("\tDest. Port2 : %d \t\t\t(0x%08x)\n", dstport2, dstport2)); // default one rxr entry (others not yet implemented in client yet) int iRxEntry = 0; if (numInterfaces == 2) { // bottom - setupHeader(iRxEntry, OUTER, destip, destmac, udpport, sourcemac, sourceip, sourceport); + setupHeader(iRxEntry, OUTER, dstip, dstmac, dstport, srcmac, srcip, srcport); // top - setupHeader(iRxEntry, INNER, destip2, destmac2, udpport2, sourcemac2, sourceip2, sourceport2); + setupHeader(iRxEntry, INNER, dstip2, dstmac2, dstport2, srcmac2, srcip2, srcport2); } // single interface else { // default if (selInterface == 0) { - setupHeader(iRxEntry, OUTER, destip, destmac, udpport, sourcemac, sourceip, sourceport); + setupHeader(iRxEntry, OUTER, dstip, dstmac, dstport, srcmac, srcip, srcport); } else { - setupHeader(iRxEntry, INNER, destip, destmac, udpport, sourcemac, sourceip, sourceport); + setupHeader(iRxEntry, INNER, dstip, dstmac, dstport, srcmac, srcip, srcport2); } } @@ -1228,15 +1238,13 @@ int configureMAC(int numInterfaces, int selInterface, return OK; } - int setDetectorPosition(int pos[]) { int ret = OK; int innerPos[2] = {pos[X], pos[Y]}; int outerPos[2] = {pos[X], pos[Y]}; int selInterface = getPrimaryInterface(); - int numInterfaces = getNumberofUDPInterfaces(); - if (numInterfaces == 1) { + if (getNumberofUDPInterfaces() == 1) { FILE_LOG(logDEBUG, ("Setting detector position: 1 Interface %s \n(%d, %d)\n", (selInterface ? "Inner" : "Outer"), innerPos[X], innerPos[Y])); } @@ -1246,6 +1254,10 @@ int setDetectorPosition(int pos[]) { " inner top(%d, %d), outer bottom(%d, %d)\n" , innerPos[X], innerPos[Y], outerPos[X], outerPos[Y])); } + detPos[0] = innerPos[0]; + detPos[1] = innerPos[1]; + detPos[2] = outerPos[0]; + detPos[3] = outerPos[1]; // row //outer @@ -1270,7 +1282,7 @@ int setDetectorPosition(int pos[]) { ret = FAIL; if (ret == OK) { - if (numInterfaces == 1) { + if (getNumberofUDPInterfaces() == 1) { FILE_LOG(logINFOBLUE, ("Position set to [%d, %d]\n", innerPos[X], innerPos[Y])); } else { @@ -1282,6 +1294,10 @@ int setDetectorPosition(int pos[]) { } +int* getDetectorPosition() { + return detPos; +} + /* jungfrau specific - powerchip, autocompdisable, asictimer, clockdiv, pll, flashing fpga */ diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c index 1508a6af3..a8579f604 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -17,6 +17,7 @@ #include #endif +extern udpStruct udpDetails; // Global variable from slsDetectorServer_funcs extern int debugflag; @@ -35,6 +36,7 @@ int32_t clkPhase[NUM_CLOCKS] = {0, 0, 0}; uint32_t clkDivider[NUM_CLOCKS] = {125, 20, 80}; int highvoltage = 0; +int detPos[2] = {0, 0}; int isFirmwareCheckDone() { return firmware_check_done; @@ -400,17 +402,19 @@ int setHighVoltage(int val){ } -int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport) { +int configureMAC() { #ifdef VIRTUAL + uint32_t dstip = udpDetails.dstip; + int dstport = udpDetails.dstport; + char cDestIp[MAX_STR_LENGTH]; memset(cDestIp, 0, MAX_STR_LENGTH); - sprintf(cDestIp, "%d.%d.%d.%d", (destip>>24)&0xff,(destip>>16)&0xff,(destip>>8)&0xff,(destip)&0xff); - FILE_LOG(logINFO, ("1G UDP: Destination (IP: %s, port:%d)\n", cDestIp, udpport)); - if (setUDPDestinationDetails(0, cDestIp, udpport) == FAIL) { + sprintf(cDestIp, "%d.%d.%d.%d", (dstip>>24)&0xff,(dstip>>16)&0xff,(dstip>>8)&0xff,(dstip)&0xff); + FILE_LOG(logINFO, ("1G UDP: Destination (IP: %s, port:%d)\n", cDestIp, dstport)); + if (setUDPDestinationDetails(0, cDestIp, dstport) == FAIL) { FILE_LOG(logERROR, ("could not set udp destination IP and port\n")); return FAIL; } - return OK; #endif return OK; } @@ -636,6 +640,15 @@ void setPatternLoop(int level, int *startAddr, int *stopAddr, int *nLoop) { /* aquisition */ +int setDetectorPosition(int pos[]) { + memcpy(detPos, pos, sizeof(detPos)); + return OK; +} + +int* getDetectorPosition() { + return detPos; +} + int startStateMachine(){ #ifdef VIRTUAL // create udp socket @@ -658,6 +671,8 @@ int startStateMachine(){ } + + #ifdef VIRTUAL void* start_timer(void* arg) { int64_t periodns = setTimer(FRAME_PERIOD, -1); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 0ee453146..83e54db84 100755 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -14,6 +14,21 @@ Here are the definitions, but the actual implementation should be done for each ****************************************************/ enum interfaceType {OUTER, INNER}; +typedef struct udpStruct_s { + int srcport; + int srcport2; + int dstport; + int dstport2; + uint64_t srcmac; + uint64_t srcmac2; + uint64_t dstmac; + uint64_t dstmac2; + uint32_t srcip; + uint32_t srcip2; + uint32_t dstip; + uint32_t dstip2; +}udpStruct; + // basic tests int isFirmwareCheckDone(); @@ -263,19 +278,14 @@ long int calcChecksum(int sourceip, int destip); int getAdcConfigured(); #endif -#ifdef EIGERD -int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2); -#elif JUNGFRAUD -int configureMAC(int numInterfaces, int selInterface, - uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, - uint32_t destip2, uint64_t destmac2, uint64_t sourcemac2, uint32_t sourceip2, uint32_t udpport2); -#else -int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport); -#endif -#if defined(JUNGFRAUD) || defined(EIGERD) + +int configureMAC(); int setDetectorPosition(int pos[]); -#endif +int* getDetectorPosition(); +int isConfigurable(); + + #ifdef EIGERD int setQuad(int value); int getQuad(); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index 2957cd76e..4b1250f2f 100755 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -56,7 +56,6 @@ int get_last_client_ip(int); int set_port(int); int update_client(int); int send_update(int); -int configure_mac(int); int calibrate_pedestal(int); int enable_ten_giga(int); int set_all_trimbits(int); @@ -108,6 +107,35 @@ int set_interrupt_subframe(int); int get_interrupt_subframe(int); int set_read_n_lines(int); int get_read_n_lines(int); +void calculate_and_set_position(); +int set_detector_position(int); +int check_detector_idle(); +int is_configurable(); +void configure_mac(); +int set_source_udp_ip(int); +int get_source_udp_ip(int); +int set_source_udp_ip2(int); +int get_source_udp_ip2(int); +int set_dest_udp_ip(int); +int get_dest_udp_ip(int); +int set_dest_udp_ip2(int); +int get_dest_udp_ip2(int); +int set_source_udp_mac(int); +int get_source_udp_mac(int); +int set_source_udp_mac2(int); +int get_source_udp_mac2(int); +int set_dest_udp_mac(int); +int get_dest_udp_mac(int); +int set_dest_udp_mac2(int); +int get_dest_udp_mac2(int); +int set_dest_udp_port(int); +int get_dest_udp_port(int); +int set_dest_udp_port2(int); +int get_dest_udp_port2(int); +int set_num_interfaces(int); +int get_num_interfaces(int); +int set_interface_sel(int); +int get_interface_sel(int); int set_parallel_mode(int); int get_parallel_mode(int); int set_overflow_mode(int); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 5f6be1614..7c2666d51 100755 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -39,12 +39,17 @@ extern char mess[MAX_STR_LENGTH]; // Variables that will be exported int sockfd = 0; int debugflag = 0; +udpStruct udpDetails = {32410, 32411, 50001, 50002, 0, 0, 0, 0, 0, 0, 0, 0}; +int configured = FAIL; +char configureMessage[MAX_STR_LENGTH]=""; +int maxydet = -1; +int detectorId = -1; + + // Local variables int (*flist[NUM_DET_FUNCTIONS])(int); -#ifdef EIGERD -uint32_t dhcpipad = 0; -#endif + enum updateRet {NO_UPDATE, UPDATE}; @@ -63,9 +68,6 @@ void init_detector() { if (isControlServer) { basictests(); initControlServer(); -#ifdef EIGERD - dhcpipad = getDetectorIP(); -#endif } else initStopServer(); strcpy(mess,"dummy message"); @@ -199,7 +201,6 @@ const char* getFunctionName(enum detFuncs func) { case F_GET_LAST_CLIENT_IP: return "F_GET_LAST_CLIENT_IP"; case F_SET_PORT: return "F_SET_PORT"; case F_UPDATE_CLIENT: return "F_UPDATE_CLIENT"; - case F_CONFIGURE_MAC: return "F_CONFIGURE_MAC"; case F_ENABLE_TEN_GIGA: return "F_ENABLE_TEN_GIGA"; case F_SET_ALL_TRIMBITS: return "F_SET_ALL_TRIMBITS"; case F_SET_PATTERN_IO_CONTROL: return "F_SET_PATTERN_IO_CONTROL"; @@ -250,6 +251,31 @@ const char* getFunctionName(enum detFuncs func) { case F_GET_INTERRUPT_SUBFRAME: return "F_GET_INTERRUPT_SUBFRAME"; case F_SET_READ_N_LINES: return "F_SET_READ_N_LINES"; case F_GET_READ_N_LINES: return "F_GET_READ_N_LINES"; + case F_SET_POSITION: return "F_SET_POSITION"; + case F_SET_SOURCE_UDP_MAC: return "F_SET_SOURCE_UDP_MAC"; + case F_GET_SOURCE_UDP_MAC: return "F_GET_SOURCE_UDP_MAC"; + case F_SET_SOURCE_UDP_MAC2: return "F_SET_SOURCE_UDP_MAC2"; + case F_GET_SOURCE_UDP_MAC2: return "F_GET_SOURCE_UDP_MAC2"; + case F_SET_SOURCE_UDP_IP: return "F_SET_SOURCE_UDP_IP"; + case F_GET_SOURCE_UDP_IP: return "F_GET_SOURCE_UDP_IP"; + case F_SET_SOURCE_UDP_IP2: return "F_SET_SOURCE_UDP_IP2"; + case F_GET_SOURCE_UDP_IP2: return "F_GET_SOURCE_UDP_IP2"; + case F_SET_DEST_UDP_MAC: return "F_SET_DEST_UDP_MAC"; + case F_GET_DEST_UDP_MAC: return "F_GET_DEST_UDP_MAC"; + case F_SET_DEST_UDP_MAC2: return "F_SET_DEST_UDP_MAC2"; + case F_GET_DEST_UDP_MAC2: return "F_GET_DEST_UDP_MAC2"; + case F_SET_DEST_UDP_IP: return "F_SET_DEST_UDP_IP"; + case F_GET_DEST_UDP_IP: return "F_GET_DEST_UDP_IP"; + case F_SET_DEST_UDP_IP2: return "F_SET_DEST_UDP_IP2"; + case F_GET_DEST_UDP_IP2: return "F_GET_DEST_UDP_IP2"; + case F_SET_DEST_UDP_PORT: return "F_SET_DEST_UDP_PORT"; + case F_GET_DEST_UDP_PORT: return "F_GET_DEST_UDP_PORT"; + case F_SET_DEST_UDP_PORT2: return "F_SET_DEST_UDP_PORT2"; + case F_GET_DEST_UDP_PORT2: return "F_GET_DEST_UDP_PORT2"; + case F_SET_NUM_INTERFACES: return "F_SET_NUM_INTERFACES"; + case F_GET_NUM_INTERFACES: return "F_GET_NUM_INTERFACES"; + case F_SET_INTERFACE_SEL: return "F_SET_INTERFACE_SEL"; + case F_GET_INTERFACE_SEL: return "F_GET_INTERFACE_SEL"; case F_SET_PARALLEL_MODE: return "F_SET_PARALLEL_MODE"; case F_GET_PARALLEL_MODE: return "F_GET_PARALLEL_MODE"; case F_SET_OVERFLOW_MODE: return "F_SET_OVERFLOW_MODE"; @@ -294,7 +320,6 @@ void function_table() { flist[F_GET_LAST_CLIENT_IP] = &get_last_client_ip; flist[F_SET_PORT] = &set_port; flist[F_UPDATE_CLIENT] = &update_client; - flist[F_CONFIGURE_MAC] = &configure_mac; flist[F_ENABLE_TEN_GIGA] = &enable_ten_giga; flist[F_SET_ALL_TRIMBITS] = &set_all_trimbits; flist[F_SET_PATTERN_IO_CONTROL] = &set_pattern_io_control; @@ -345,6 +370,31 @@ void function_table() { flist[F_GET_INTERRUPT_SUBFRAME] = &get_interrupt_subframe; flist[F_SET_READ_N_LINES] = &set_read_n_lines; flist[F_GET_READ_N_LINES] = &get_read_n_lines; + flist[F_SET_POSITION] = &set_detector_position; + flist[F_SET_SOURCE_UDP_MAC] = &set_source_udp_mac; + flist[F_GET_SOURCE_UDP_MAC] = &get_source_udp_mac; + flist[F_SET_SOURCE_UDP_MAC2] = &set_source_udp_mac2; + flist[F_GET_SOURCE_UDP_MAC2] = &get_source_udp_mac2; + flist[F_SET_SOURCE_UDP_IP] = &set_source_udp_ip; + flist[F_GET_SOURCE_UDP_IP] = &get_source_udp_ip; + flist[F_SET_SOURCE_UDP_IP2] = &set_source_udp_ip2; + flist[F_GET_SOURCE_UDP_IP2] = &get_source_udp_ip2; + flist[F_SET_DEST_UDP_MAC] = &set_dest_udp_mac; + flist[F_GET_DEST_UDP_MAC] = &get_dest_udp_mac; + flist[F_SET_DEST_UDP_MAC2] = &set_dest_udp_mac2; + flist[F_GET_DEST_UDP_MAC2] = &get_dest_udp_mac2; + flist[F_SET_DEST_UDP_IP] = &set_dest_udp_ip; + flist[F_GET_DEST_UDP_IP] = &get_dest_udp_ip; + flist[F_SET_DEST_UDP_IP2] = &set_dest_udp_ip2; + flist[F_GET_DEST_UDP_IP2] = &get_dest_udp_ip2; + flist[F_SET_DEST_UDP_PORT] = &set_dest_udp_port; + flist[F_GET_DEST_UDP_PORT] = &get_dest_udp_port; + flist[F_SET_DEST_UDP_PORT2] = &set_dest_udp_port2; + flist[F_GET_DEST_UDP_PORT2] = &get_dest_udp_port2; + flist[F_SET_NUM_INTERFACES] = &set_num_interfaces; + flist[F_GET_NUM_INTERFACES] = &get_num_interfaces; + flist[F_SET_INTERFACE_SEL] = &set_interface_sel; + flist[F_GET_INTERFACE_SEL] = &get_interface_sel; flist[F_SET_PARALLEL_MODE] = &set_parallel_mode; flist[F_GET_PARALLEL_MODE] = &get_parallel_mode; flist[F_SET_OVERFLOW_MODE] = &set_overflow_mode; @@ -1501,15 +1551,35 @@ int start_acquisition(int file_des) { FILE_LOG(logDEBUG1, ("Starting Acquisition\n")); // only set if (Server_VerifyLock() == OK) { - ret = startStateMachine(); - if (ret == FAIL) { -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) - sprintf(mess, "Could not start acquisition. Could not create udp socket in server. Check rx_udpip & rx_udpport.\n"); -#else - sprintf(mess, "Could not start acquisition\n"); -#endif +#ifdef EIGERD + // check for hardware mac and hardware ip + if (udpDetails.srcmac != getDetectorMAC()) { + ret = FAIL; + sprintf(mess, "Invalid udp source mac address for this detector. Must be same as hardware detector mac address \n"); FILE_LOG(logERROR,(mess)); } + else if (!enableTenGigabitEthernet(-1) && (udpDetails.srcip != getDetectorIP())) { + ret = FAIL; + sprintf(mess, "Invalid udp source ip address for this detector. Must be same as hardware detector ip address in 1G readout mode \n"); + FILE_LOG(logERROR,(mess)); + } + else +#endif + if (configured == FAIL) { + ret = FAIL; + sprintf(mess, "Could not start acquisition because %s\n", configureMessage); + FILE_LOG(logERROR,(mess)); + } else { + ret = startStateMachine(); + if (ret == FAIL) { +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) + sprintf(mess, "Could not start acquisition. Could not create udp socket in server. Check rx_udpip & rx_udpport.\n"); +#else + sprintf(mess, "Could not start acquisition\n"); +#endif + FILE_LOG(logERROR,(mess)); + } + } FILE_LOG(logDEBUG2, ("Starting Acquisition ret: %d\n", ret)); } return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); @@ -1589,17 +1659,36 @@ int start_and_read_all(int file_des) { FILE_LOG(logDEBUG1, ("Starting Acquisition\n")); // only set if (Server_VerifyLock() == OK) { - ret = startStateMachine(); - if (ret == FAIL) { -#if defined(CHIPTESTBOARDD) || defined(MOENCHD) - sprintf(mess, "Could not start acquisition. Could not create udp socket in server. Check rx_udpip & rx_udpport.\n"); -#else - sprintf(mess, "Could not start acquisition\n"); -#endif +#ifdef EIGERD + // check for hardware mac and hardware ip + if (udpDetails.srcmac != getDetectorMAC()) { + ret = FAIL; + sprintf(mess, "Invalid udp source mac address for this detector. Must be same as hardware detector mac address \n"); FILE_LOG(logERROR,(mess)); } + else if (!enableTenGigabitEthernet(-1) && (udpDetails.srcip != getDetectorIP())) { + ret = FAIL; + sprintf(mess, "Invalid udp source ip address for this detector. Must be same as hardware detector ip address in 1G readout mode \n"); + FILE_LOG(logERROR,(mess)); + } + else +#endif + if (configured == FAIL) { + ret = FAIL; + sprintf(mess, "Could not start acquisition because %s\n", configureMessage); + FILE_LOG(logERROR,(mess)); + } else { + ret = startStateMachine(); + if (ret == FAIL) { +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) + sprintf(mess, "Could not start acquisition. Could not create udp socket in server. Check rx_udpip & rx_udpport.\n"); +#else + sprintf(mess, "Could not start acquisition\n"); +#endif + FILE_LOG(logERROR,(mess)); + } + } FILE_LOG(logDEBUG2, ("Starting Acquisition ret: %d\n", ret)); - } // lock or acquisition start error @@ -1904,6 +1993,10 @@ int set_roi(int file_des) { sprintf(mess, "Could not set ROI. Invalid xmin or xmax\n"); FILE_LOG(logERROR,(mess)); } + // old firmware requires a redo configure mac + else { + configure_mac(); + } } #endif @@ -2276,7 +2369,7 @@ int send_update(int file_des) { - +/* int configure_mac(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); @@ -2435,7 +2528,7 @@ int configure_mac(int file_des) { // always remember the ip sent from the client (could be for 10g(if not dhcp)) if (srcIp != getDetectorIP()) - dhcpipad = srcIp; + custom10gIp = srcIp; //only for 1Gbe, change ip to hardware ip if (!enableTenGigabitEthernet(-1)) { @@ -2444,7 +2537,7 @@ int configure_mac(int file_des) { } // 10 gbe (use ip given from client) else - srcIp = dhcpipad; + srcIp = custom10gIp; ret = configureMAC(dstIp, dstMac, srcMac, srcIp, dstPort, dstPort2); #elif JUNGFRAUD ret = configureMAC(numInterfaces, selInterface, dstIp, dstMac, srcMac, srcIp, dstPort, dstIp2, dstMac2, srcMac2, srcIp2, dstPort2); @@ -2486,7 +2579,7 @@ int configure_mac(int file_des) { } return Server_SendResult(file_des, OTHER, UPDATE, retvals, sizeof(retvals)); } - +*/ int enable_ten_giga(int file_des) { @@ -2497,14 +2590,28 @@ int enable_ten_giga(int file_des) { if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) return printSocketReadError(); - FILE_LOG(logDEBUG1, ("Enable/ Disable 10GbE : %d\n", arg)); + FILE_LOG(logINFOBLUE, ("Setting 10GbE: %d\n", arg)); #if defined(JUNGFRAUD) || defined(GOTTHARDD) || defined(MYTHEN3D) || defined(GOTTHARD2D) functionNotImplemented(); #else // set & get if ((arg == -1) || (Server_VerifyLock() == OK)) { - retval = enableTenGigabitEthernet(arg); + if (arg >= 0 && enableTenGigabitEthernet(-1) != arg) { + enableTenGigabitEthernet(arg); + uint64_t hardwaremac = getDetectorMAC(); + if (udpDetails.srcmac != hardwaremac) { + FILE_LOG(logINFOBLUE, ("Updating udp source mac\n")); + udpDetails.srcmac = hardwaremac; + } + uint32_t hardwareip = getDetectorIP(); + if (arg == 0 && udpDetails.srcip != hardwareip) { + FILE_LOG(logINFOBLUE, ("Updating udp source ip\n")); + udpDetails.srcip = hardwareip; + } + configure_mac(); + } + retval = enableTenGigabitEthernet(-1); FILE_LOG(logDEBUG1, ("10GbE: %d\n", retval)); validate(arg, retval, "enable/disable 10GbE", DEC); } @@ -4116,6 +4223,678 @@ int get_read_n_lines(int file_des) { } + + +void calculate_and_set_position() { + if (maxydet == -1 || detectorId == -1) { + ret = FAIL; + sprintf(mess, "Could not set detector position (did not get multi size).\n"); + FILE_LOG(logERROR,(mess)); + return; + } + int maxy = maxydet; +#ifdef JUNGFRAUD + maxy *= getNumberofUDPInterfaces(); +#endif + int pos[2] = {0, 0}; + // row + pos[0] = (detectorId % maxy); + // col for horiz. udp ports + pos[1] = (detectorId / maxy); +#ifdef EIGERD + pos[1] *= 2; +#endif + FILE_LOG(logDEBUG, ("Setting Positions (%d,%d)\n", pos[0], pos[1])); + if(setDetectorPosition(pos) == FAIL) { + ret = FAIL; + sprintf(mess, "Could not set detector position.\n"); + FILE_LOG(logERROR,(mess)); + } + // to redo the detector mac (depends on positions) + else { + // create detector mac from x and y + if (udpDetails.srcmac == 0) { + char dmac[50]; + memset(dmac, 0, 50); + sprintf(dmac, "aa:bb:cc:dd:%02x:%02x", pos[0]&0xFF, pos[1]&0xFF); + FILE_LOG(logINFO, ("Udp source mac address created: %s\n", dmac)); + unsigned char a[6]; + sscanf(dmac, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]); + udpDetails.srcmac = 0; + int i; + for (i = 0; i < 6; ++i) { + udpDetails.srcmac = (udpDetails.srcmac << 8) + a[i]; + } + } +#ifdef JUNGFRAUD + if (getNumberofUDPInterfaces() > 1) { + if (udpDetails.srcmac2 == 0) { + char dmac2[50]; + memset(dmac2, 0, 50); + sprintf(dmac2, "aa:bb:cc:dd:%02x:%02x", (pos[0] + 1 )&0xFF, pos[1]&0xFF); + FILE_LOG(logINFO, ("Udp source mac address2 created: %s\n", dmac2)); + unsigned char a[6]; + sscanf(dmac2, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx", &a[0], &a[1], &a[2], &a[3], &a[4], &a[5]); + udpDetails.srcmac2 = 0; + int i; + for (i = 0; i < 6; ++i) { + udpDetails.srcmac2 = (udpDetails.srcmac2 << 8) + a[i]; + } + } + } +#endif + configure_mac(); + } + // no need to do a get (also jungfrau gives bigger set for second) +} + + +int set_detector_position(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int args[2] = { 0, 0}; + + if (receiveData(file_des, args, sizeof(args), INT32) < 0) + return printSocketReadError(); + FILE_LOG(logINFO, ("Setting detector positions: [%u, %u]\n", args[0], args[1])); + + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + maxydet = args[0]; + detectorId = args[1]; + calculate_and_set_position(); + } + } + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +} + +int check_detector_idle() { + enum runStatus status = getRunStatus(); + if (status != IDLE && status != RUN_FINISHED && status != STOPPED) { + ret = FAIL; + sprintf(mess, "Cannot configure mac when detector is not idle. Detector at %s state\n", getRunStateName(status)); + FILE_LOG(logERROR,(mess)); + } + return ret; +} + +int is_configurable() { + if (udpDetails.srcip == 0) { + strcpy(configureMessage, "udp source ip not configured\n"); + FILE_LOG(logWARNING, ("%s", configureMessage)); + return FAIL; + } + if (udpDetails.dstip == 0) { + strcpy(configureMessage, "udp destination ip not configured\n"); + FILE_LOG(logWARNING, ("%s", configureMessage)); + return FAIL; + } + if (udpDetails.srcmac == 0) { + strcpy(configureMessage, "udp source mac not configured\n"); + FILE_LOG(logWARNING, ("%s", configureMessage)); + return FAIL; + } + if (udpDetails.dstmac == 0) { + strcpy(configureMessage, "udp destination mac not configured\n"); + FILE_LOG(logWARNING, ("%s", configureMessage)); + return FAIL; + } +#ifdef JUNGFRAUD + if (getNumberofUDPInterfaces() == 2) { + if (udpDetails.srcip2 == 0) { + strcpy(configureMessage, "udp source ip2 not configured\n"); + FILE_LOG(logWARNING, ("%s", configureMessage)); + return FAIL; + } + if (udpDetails.dstip2 == 0) { + strcpy(configureMessage, "udp destination ip2 not configured\n"); + FILE_LOG(logWARNING, ("%s", configureMessage)); + return FAIL; + } + if (udpDetails.srcmac2 == 0) { + strcpy(configureMessage, "udp source mac2 not configured\n"); + FILE_LOG(logWARNING, ("%s", configureMessage)); + return FAIL; + } + if (udpDetails.dstmac2 == 0) { + strcpy(configureMessage, "udp destination mac2 not configured\n"); + FILE_LOG(logWARNING, ("%s", configureMessage)); + return FAIL; + } + } +#endif + return OK; +} + +void configure_mac() { + if (is_configurable() == OK) { + ret = configureMAC(); + if (ret != OK) { +#if defined(CHIPTESTBOARDD) || defined(MOENCHD) + if (ret == -1) { + sprintf(mess, "Could not allocate RAM\n"); + } else { + sprintf(mess,"Could not configure mac because of incorrect udp 1G destination IP and port\n"); + } +#else + sprintf(mess,"Configure Mac failed\n"); +#endif + strcpy(configureMessage, mess); + FILE_LOG(logERROR,(mess)); + } else { + FILE_LOG(logINFOGREEN, ("\tConfigure MAC successful\n")); + configured = OK; + return; + } + } + configured = FAIL; + FILE_LOG(logWARNING, ("Configure FAIL, not all parameters configured yet\n")); +} + + + + +int set_source_udp_ip(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint32_t arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + arg = __builtin_bswap32(arg); + FILE_LOG(logINFO, ("Setting udp source ip: 0x%x\n", arg)); + + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + if (udpDetails.srcip != arg) { + udpDetails.srcip = arg; + configure_mac(); + } + } + } + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +} + +int get_source_udp_ip(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint32_t retval = -1; + FILE_LOG(logDEBUG1, ("Getting udp source ip\n")); + + // get only + retval = udpDetails.srcip; + retval = __builtin_bswap32(retval); + FILE_LOG(logDEBUG1, ("udp soure ip retval: 0x%x\n", retval)); + + return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); +} + + + + +int set_source_udp_ip2(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint32_t arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + arg = __builtin_bswap32(arg); + FILE_LOG(logINFO, ("Setting udp source ip2: 0x%x\n", arg)); + +#ifndef JUNGFRAUD + functionNotImplemented(); +#else + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + if (udpDetails.srcip2 != arg) { + udpDetails.srcip2 = arg; + configure_mac(); + } + } + } +#endif + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +} + +int get_source_udp_ip2(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint32_t retval = -1; + FILE_LOG(logDEBUG1, ("Getting udp source ip2\n")); + +#ifndef JUNGFRAUD + functionNotImplemented(); +#else + // get only + retval = udpDetails.srcip2; + retval = __builtin_bswap32(retval); + FILE_LOG(logDEBUG1, ("udp soure ip2 retval: 0x%x\n", retval)); +#endif + return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); +} + + +int set_dest_udp_ip(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint32_t arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + arg = __builtin_bswap32(arg); + FILE_LOG(logINFO, ("Setting udp destination ip: 0x%x\n", arg)); + + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + if (udpDetails.dstip != arg) { + udpDetails.dstip = arg; + configure_mac(); + } + } + } + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +} + +int get_dest_udp_ip(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint32_t retval = -1; + FILE_LOG(logDEBUG1, ("Getting destination ip\n")); + + // get only + retval = udpDetails.dstip; + retval = __builtin_bswap32(retval); + FILE_LOG(logDEBUG1, ("udp destination ip retval: 0x%x\n", retval)); + + return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); +} + + + + +int set_dest_udp_ip2(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint32_t arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + arg = __builtin_bswap32(arg); + FILE_LOG(logINFO, ("Setting udp destination ip2: 0x%x\n", arg)); + +#ifndef JUNGFRAUD + functionNotImplemented(); +#else + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + if (udpDetails.dstip2 != arg) { + udpDetails.dstip2 = arg; + configure_mac(); + } + } + } +#endif + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +} + +int get_dest_udp_ip2(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint32_t retval = -1; + FILE_LOG(logDEBUG1, ("Getting udp destination ip2\n")); + +#ifndef JUNGFRAUD + functionNotImplemented(); +#else + // get only + retval = udpDetails.dstip2; + retval = __builtin_bswap32(retval); + FILE_LOG(logDEBUG1, ("udp destination ip2 retval: 0x%x\n", retval)); +#endif + return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); +} + + + + +int set_source_udp_mac(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint64_t arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT64) < 0) + return printSocketReadError(); + FILE_LOG(logINFO, ("Setting udp source mac: 0x%lx\n", arg)); + + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + if (udpDetails.srcmac != arg) { + udpDetails.srcmac = arg; + configure_mac(); + } + } + } + return Server_SendResult(file_des, INT64, UPDATE, NULL, 0); +} + + +int get_source_udp_mac(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint64_t retval = -1; + FILE_LOG(logDEBUG1, ("Getting udp source mac\n")); + + // get only + retval = udpDetails.srcmac; + FILE_LOG(logDEBUG1, ("udp soure mac retval: 0x%lx\n", retval)); + + return Server_SendResult(file_des, INT64, UPDATE, &retval, sizeof(retval)); +} + + + +int set_source_udp_mac2(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint64_t arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT64) < 0) + return printSocketReadError(); + FILE_LOG(logINFO, ("Setting udp source mac2: 0x%lx\n", arg)); + +#ifndef JUNGFRAUD + functionNotImplemented(); +#else + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + if (udpDetails.srcmac2 != arg) { + udpDetails.srcmac2 = arg; + configure_mac(); + } + } + } +#endif + return Server_SendResult(file_des, INT64, UPDATE, NULL, 0); +} + +int get_source_udp_mac2(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint64_t retval = -1; + FILE_LOG(logDEBUG1, ("Getting udp source mac2\n")); + +#ifndef JUNGFRAUD + functionNotImplemented(); +#else + // get only + retval = udpDetails.srcmac2; + FILE_LOG(logDEBUG1, ("udp soure mac2 retval: 0x%lx\n", retval)); +#endif + return Server_SendResult(file_des, INT64, UPDATE, &retval, sizeof(retval)); +} + + + +int set_dest_udp_mac(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint64_t arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT64) < 0) + return printSocketReadError(); + FILE_LOG(logINFO, ("Setting udp destination mac: 0x%lx\n", arg)); + + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + if (udpDetails.dstmac != arg) { + udpDetails.dstmac = arg; + configure_mac(); + } + } + } + return Server_SendResult(file_des, INT64, UPDATE, NULL, 0); +} + +int get_dest_udp_mac(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint64_t retval = -1; + FILE_LOG(logDEBUG1, ("Getting udp destination mac\n")); + + // get only + retval = udpDetails.dstmac; + FILE_LOG(logDEBUG1, ("udp destination mac retval: 0x%lx\n", retval)); + + return Server_SendResult(file_des, INT64, UPDATE, &retval, sizeof(retval)); +} + + + + +int set_dest_udp_mac2(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint64_t arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT64) < 0) + return printSocketReadError(); + FILE_LOG(logINFO, ("Setting udp destination mac2: 0x%lx\n", arg)); + +#ifndef JUNGFRAUD + functionNotImplemented(); +#else + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + if (udpDetails.dstmac2 != arg) { + udpDetails.dstmac2 = arg; + configure_mac(); + } + } + } +#endif + return Server_SendResult(file_des, INT64, UPDATE, NULL, 0); +} + +int get_dest_udp_mac2(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + uint64_t retval = -1; + FILE_LOG(logDEBUG1, ("Getting udp destination mac2\n")); + +#ifndef JUNGFRAUD + functionNotImplemented(); +#else + // get only + retval = udpDetails.dstmac2; + FILE_LOG(logDEBUG1, ("udp destination mac2 retval: 0x%lx\n", retval)); +#endif + return Server_SendResult(file_des, INT64, UPDATE, &retval, sizeof(retval)); +} + + + + +int set_dest_udp_port(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + FILE_LOG(logINFO, ("Setting udp destination port: %u\n", arg)); + + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + if (udpDetails.dstport != arg) { + udpDetails.dstport = arg; + configure_mac(); + } + } + } + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +} + +int get_dest_udp_port(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int retval = -1; + FILE_LOG(logDEBUG1, ("Getting destination port\n")); + + // get only + retval = udpDetails.dstport; + FILE_LOG(logDEBUG, ("udp destination port retval: %u\n", retval)); + + return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); +} + + + + +int set_dest_udp_port2(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + FILE_LOG(logINFO, ("Setting udp destination port2: %u\n", arg)); + +#if !defined(JUNGFRAUD) && !defined(EIGERD) + functionNotImplemented(); +#else + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + if (udpDetails.dstport2 != arg) { + udpDetails.dstport2 = arg; + configure_mac(); + } + } + } +#endif + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +} + +int get_dest_udp_port2(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int retval = -1; + FILE_LOG(logDEBUG1, ("Getting destination port2\n")); + +#if !defined(JUNGFRAUD) && !defined(EIGERD) + functionNotImplemented(); +#else + // get only + retval = udpDetails.dstport2; + FILE_LOG(logDEBUG1, ("udp destination port2 retval: %u\n", retval)); +#endif + return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); +} + + + + + + +int set_num_interfaces(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + FILE_LOG(logINFO, ("Setting number of interfaces: %d\n", arg)); + +#ifndef JUNGFRAUD + functionNotImplemented(); +#else + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + if (getNumberofUDPInterfaces() != arg) { + setNumberofUDPInterfaces(arg); + calculate_and_set_position(); // aleady configures mac + } + } + } +#endif + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +} + + +int get_num_interfaces(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int retval = -1; + FILE_LOG(logDEBUG1, ("Getting number of udp interfaces\n")); + +#ifndef JUNGFRAUD + retval = 1; +#else + // get only + retval = getNumberofUDPInterfaces(); +#endif + FILE_LOG(logDEBUG1, ("Number of udp interfaces retval: %u\n", retval)); + return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); +} + + + + +int set_interface_sel(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int arg = 0; + + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + FILE_LOG(logINFO, ("Setting selected interface: %d\n", arg)); + +#ifndef JUNGFRAUD + functionNotImplemented(); +#else + // only set + if (Server_VerifyLock() == OK) { + if (check_detector_idle() == OK) { + if (getPrimaryInterface() != arg) { + selectPrimaryInterface(arg); + configure_mac(); + } + } + } +#endif + return Server_SendResult(file_des, INT32, UPDATE, NULL, 0); +} + +int get_interface_sel(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int retval = -1; + FILE_LOG(logDEBUG1, ("Getting selected interface\n")); + +#ifndef JUNGFRAUD + functionNotImplemented(); +#else + // get only + retval = getPrimaryInterface(); + FILE_LOG(logDEBUG1, ("Selected interface retval: %u\n", retval)); +#endif + return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); +} + + + int set_parallel_mode(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); @@ -4323,3 +5102,4 @@ int get_readout_mode(int file_des) { #endif return Server_SendResult(file_des, INT32, UPDATE, &retval, sizeof(retval)); } + diff --git a/slsDetectorSoftware/include/CmdProxy.h b/slsDetectorSoftware/include/CmdProxy.h index 9d5044b2e..01fe1a97a 100644 --- a/slsDetectorSoftware/include/CmdProxy.h +++ b/slsDetectorSoftware/include/CmdProxy.h @@ -7,6 +7,7 @@ #include #include #include +#include "network_utils.h" /** Macro to make an integer command. * CMDNAME name of the function that does the command @@ -72,6 +73,7 @@ return os.str(); \ } + namespace sls { class CmdProxy { @@ -127,7 +129,19 @@ class CmdProxy { {"lock", &CmdProxy::lock}, {"rx_readfreq", &CmdProxy::rx_readfreq}, {"rx_padding", &CmdProxy::rx_padding}, - {"rx_framesperfile", &CmdProxy::rx_framesperfile}}; + {"rx_framesperfile", &CmdProxy::rx_framesperfile}, + {"detectormac", &CmdProxy::detectormac}, + {"detectormac2", &CmdProxy::detectormac2}, + {"rx_udpmac", &CmdProxy::rx_udpmac}, + {"rx_udpmac2", &CmdProxy::rx_udpmac2}, + {"detectorip", &CmdProxy::detectorip}, + {"detectorip2", &CmdProxy::detectorip2}, + {"rx_udpip", &CmdProxy::rx_udpip}, + {"rx_udpip2", &CmdProxy::rx_udpip2}, + {"rx_udpport", &CmdProxy::rx_udpport}, + {"rx_udpport2", &CmdProxy::rx_udpport2}, + {"numinterfaces", &CmdProxy::numinterfaces}, + {"selinterface", &CmdProxy::selinterface}}; StringMap depreciated_functions{{"r_readfreq", "rx_readfreq"}, {"r_padding", "rx_padding"}, @@ -179,6 +193,7 @@ class CmdProxy { "[0, 1]\n\tgets partial frames padding enable in the " "receiver. 0 does not pad partial frames(fastest), 1 " "(default) pads partial frames"); + INTEGER_COMMAND(rx_framesperfile, getFramesPerFile, setFramesPerFile, std::stoi, "[n_frames]\n\tNumber of frames per file"); @@ -197,6 +212,42 @@ class CmdProxy { INTEGER_COMMAND(findex, getAcquisitionIndex, setAcquisitionIndex, std::stoi, "[0, 1]\n\tFile index"); + + INTEGER_COMMAND(detectormac, getSourceUDPMAC, setSourceUDPMAC, MacAddr, + "[x:x:x:x:x:x]\n\tMac address of the detector (source) udp interface. "); + + INTEGER_COMMAND(detectormac2, getSourceUDPMAC2, setSourceUDPMAC2, MacAddr, + "[x:x:x:x:x:x]\n\t[Jungfrau] Mac address of the bottom half of detector (source) udp interface. "); + + INTEGER_COMMAND(rx_udpmac, getDestinationUDPMAC, setDestinationUDPMAC, MacAddr, + "[x:x:x:x:x:x]\n\tMac address of the receiver (destination) udp interface. Can be unused as rx_hostname/rx_udpip retrieves it."); + + INTEGER_COMMAND(rx_udpmac2, getDestinationUDPMAC2, setDestinationUDPMAC2, MacAddr, + "[x:x:x:x:x:x]\n\t[Jungfrau] Mac address of the receiver (destination) udp interface where the second half of detector data is sent to. Can be unused as rx_hostname/rx_udpip2 retrieves it.") + + INTEGER_COMMAND(detectorip, getSourceUDPIP, setSourceUDPIP, IpAddr, + "[x.x.x.x]\n\tIp address of the detector (source) udp interface. Must be same subnet as destination udp ip."); + + INTEGER_COMMAND(detectorip2, getSourceUDPIP2, setSourceUDPIP2, IpAddr, + "[x.x.x.x]\n\t[Jungfrau] Ip address of the bottom half of detector (source) udp interface. Must be same subnet as destination udp ip2."); + + INTEGER_COMMAND(rx_udpip, getDestinationUDPIP, setDestinationUDPIP, IpAddr, + "[x.x.x.x]\n\tIp address of the receiver (destination) udp interface."); + + INTEGER_COMMAND(rx_udpip2, getDestinationUDPIP2, setDestinationUDPIP2, IpAddr, + "[x.x.x.x]\n\t[Jungfrau] Ip address of the receiver (destination) udp interface where the second half of detector data is sent to."); + + INTEGER_COMMAND(rx_udpport, getDestinationUDPPort, setDestinationUDPPort, std::stoi, + "[n]\n\tPort number of the receiver (destination) udp interface."); + + INTEGER_COMMAND(rx_udpport2, getDestinationUDPPort2, setDestinationUDPPort2, std::stoi, + "[n]\n\t[Jungfrau] Port number of the receiver (destination) udp interface where the second half of detector data is sent to.\n[Eiger] Port number of the reciever (desintation) udp interface where the right half of the detector data is sent to."); + + INTEGER_COMMAND(numinterfaces, getNumberofUDPInterfaces, setNumberofUDPInterfaces, std::stoi, + "[1, 2]\n\t[Jungfrau] Number of udp interfaces to stream data from detector. Default: 1."); + + INTEGER_COMMAND(selinterface, getSelectedUDPInterface, selectUDPInterface, std::stoi, + "[0, 1]\n\t[Jungfrau] The udp interface to stream data from detector. Effective only when number of interfaces is 1. Default: 0 (outer)"); INTEGER_COMMAND(parallel, getParallelMode, setParallelMode, std::stoi, "[0, 1]\n\tEnable or disable parallel mode. [Eiger]"); diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h index ff02f2456..b5dfeeda3 100644 --- a/slsDetectorSoftware/include/Detector.h +++ b/slsDetectorSoftware/include/Detector.h @@ -263,12 +263,6 @@ class Detector { * * * ************************************************/ - /** Configures the destination for UDP packets in the detector - * Needed only if you use a custom receiver (not slsReceiver) - * as it is already included in setReceiverHostname. - */ - void configureMAC(Positions pos = {}); // TODO: find a reasonable name - /** [Jungfrau] */ Result getNumberofUDPInterfaces(Positions pos = {}) const; @@ -291,13 +285,13 @@ class Detector { * 10G Eiger and other detectors, the source UDP IP must be in the * same subnet of the destination UDP IP */ - void setSourceUDPIP(const std::string &ip, Positions pos = {}); + void setSourceUDPIP(const IpAddr ip, Positions pos = {}); /** [Jungfrau] bottom half */ Result getSourceUDPIP2(Positions pos = {}) const; /** [Jungfrau] bottom half */ - void setSourceUDPIP2(const std::string &ip, Positions pos = {}); + void setSourceUDPIP2(const IpAddr ip, Positions pos = {}); Result getSourceUDPMAC(Positions pos = {}) const; @@ -306,24 +300,24 @@ class Detector { * Others can be anything (beware of certain bits) */ - void setSourceUDPMAC(const std::string &mac, Positions pos = {}); + void setSourceUDPMAC(const MacAddr mac, Positions pos = {}); /** [Jungfrau] bottom half */ Result getSourceUDPMAC2(Positions pos = {}) const; /** [Jungfrau] bottom half */ - void setSourceUDPMAC2(const std::string &mac, Positions pos = {}); + void setSourceUDPMAC2(const MacAddr mac, Positions pos = {}); Result getDestinationUDPIP(Positions pos = {}) const; /** IP of the interface in receiver that the detector sends data to */ - void setDestinationUDPIP(const std::string &ip, Positions pos = {}); + void setDestinationUDPIP(const IpAddr ip, Positions pos = {}); /** [Jungfrau bottom half] */ Result getDestinationUDPIP2(Positions pos = {}) const; /** [Jungfrau bottom half] */ - void setDestinationUDPIP2(const std::string &ip, Positions pos = {}); + void setDestinationUDPIP2(const IpAddr ip, Positions pos = {}); Result getDestinationUDPMAC(Positions pos = {}) const; @@ -331,13 +325,13 @@ class Detector { * Only needed if you use a custom receiver (not slsReceiver) * Must be followed by configuremac. */ - void setDestinationUDPMAC(const std::string &mac, Positions pos = {}); + void setDestinationUDPMAC(const MacAddr mac, Positions pos = {}); /** [Jungfrau bottom half] */ Result getDestinationUDPMAC2(Positions pos = {}) const; /** [Jungfrau bottom half] */ - void setDestinationUDPMAC2(const std::string &mac, Positions pos = {}); + void setDestinationUDPMAC2(const MacAddr mac, Positions pos = {}); Result getDestinationUDPPort(Positions pos = {}) const; diff --git a/slsDetectorSoftware/include/multiSlsDetector.h b/slsDetectorSoftware/include/multiSlsDetector.h index 6f72663d1..b200c3afc 100755 --- a/slsDetectorSoftware/include/multiSlsDetector.h +++ b/slsDetectorSoftware/include/multiSlsDetector.h @@ -582,7 +582,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { * Configures in detector the destination for UDP packets * @param detPos -1 for all detectors in list or specific detector position */ - void configureMAC(int detPos = -1); // + //void configureMAC(int detPos = -1); //TODO /** * Set starting frame number for the next acquisition @@ -840,73 +840,6 @@ class multiSlsDetector : public virtual slsDetectorDefs { */ uint32_t clearBit(uint32_t addr, int n, int detPos = -1); // - /** - * Validates the format of the detector MAC address and sets it - * @param detectorMAC detector MAC address - * @param detPos -1 for all detectors in list or specific detector position - * @returns the detector MAC address - */ - std::string setDetectorMAC(const std::string &detectorMAC, - int detPos = -1); // - - /** - * Returns the detector MAC address - * @param detPos -1 for all detectors in list or specific detector position - * @returns the detector MAC address - */ - std::string getDetectorMAC(int detPos = -1); // - - /** - * Validates the format of the detector MAC address (bottom half) and sets - * it (Jungfrau only) - * @param detectorMAC detector MAC address (bottom half) - * @param detPos -1 for all detectors in list or specific detector position - * @returns the detector MAC address (bottom half) - */ - std::string setDetectorMAC2(const std::string &detectorMAC, - int detPos = -1); // - - /** - * Returns the detector MAC address (bottom half) Jungfrau only - * @param detPos -1 for all detectors in list or specific detector position - * @returns the detector MAC address (bottom half) - */ - std::string getDetectorMAC2(int detPos = -1); // - - /** - * //TODO: custom ip (eiger 10G and other detectors), use 0.0.0.0 and test - * Validates the format of the detector IP address and sets it - * @param detectorIP detector IP address - * @param detPos -1 for all detectors in list or specific detector position - * @returns the detector IP address - */ - std::string setDetectorIP(const std::string &detectorIP, - int detPos = -1); // - - /** - * Returns the detector IP address - * @param detPos -1 for all detectors in list or specific detector position - * @returns the detector IP address - */ - std::string getDetectorIP(int detPos = -1) const; // - - /** - * Validates the format of the detector IP address (bottom half) and sets it - * (Jungfrau only) - * @param detectorIP detector IP address (bottom half) - * @param detPos -1 for all detectors in list or specific detector position - * @returns the detector IP address (bottom half) - */ - std::string setDetectorIP2(const std::string &detectorIP, - int detPos = -1); // - - /** - * Returns the detector IP address (bottom half) Jungfrau only - * @param detPos -1 for all detectors in list or specific detector position - * @returns the detector IP address (bottom half) - */ - std::string getDetectorIP2(int detPos = -1) const; // - /** * Validates and sets the receiver. * Also updates the receiver with all the shared memory parameters @@ -927,108 +860,12 @@ class multiSlsDetector : public virtual slsDetectorDefs { std::string getReceiverHostname(int detPos = -1) const; // /** - * TODO: replace this with setEthernetInterface - * Validates the format of the receiver UDP IP address and sets it - * @param udpip receiver UDP IP address - * @param detPos -1 for all detectors in list or specific detector position - * @returns the receiver UDP IP address - */ - std::string setReceiverUDPIP(const std::string &udpip, int detPos = -1); // - - /** - * Returns the receiver UDP IP address - * @param detPos -1 for all detectors in list or specific detector position - * @returns the receiver UDP IP address - */ - std::string getReceiverUDPIP(int detPos = -1) const; // - - /** - * Validates the format of the receiver UDP IP address (bottom half) and - * sets it(Jungfrau only) - * @param udpip receiver UDP IP address (bottom half) - * @param detPos -1 for all detectors in list or specific detector position - * @returns the receiver UDP IP address (bottom half) - */ - std::string setReceiverUDPIP2(const std::string &udpip, int detPos = -1); // - - /** - * Returns the receiver UDP IP address (bottom half) Jungfrau only - * @param detPos -1 for all detectors in list or specific detector position - * @returns the receiver UDP IP address (bottom half) - */ - std::string getReceiverUDPIP2(int detPos = -1) const; // - - /** - * Validates the format of the receiver UDP MAC address and sets it - * @param udpmac receiver UDP MAC address - * @param detPos -1 for all detectors in list or specific detector position - * @returns the receiver UDP MAC address - */ - std::string setReceiverUDPMAC(const std::string &udpmac, - int detPos = -1); // - - /** - * Returns the receiver UDP MAC address - * @param detPos -1 for all detectors in list or specific detector position - * @returns the receiver UDP MAC address - */ - std::string getReceiverUDPMAC(int detPos = -1) const; // - - /** - * Validates the format of the receiver UDP MAC address (bottom half) and - * sets it (Jungfrau only) - * @param udpmac receiver UDP MAC address (bottom half) - * @param detPos -1 for all detectors in list or specific detector position - * @returns the receiver UDP MAC address (bottom half) - */ - std::string setReceiverUDPMAC2(const std::string &udpmac, int detPos = -1); - - /** - * Returns the receiver UDP MAC address (bottom half) Jungfrau only - * @param detPos -1 for all detectors in list or specific detector position - * @returns the receiver UDP MAC address (bottom half) - */ - std::string getReceiverUDPMAC2(int detPos = -1) const; - - /** - * Sets the receiver UDP port - * @param udpport receiver UDP port - * @param detPos -1 for all detectors in list or specific detector position - * @returns the receiver UDP port - */ - int setReceiverUDPPort(int udpport, int detPos = -1); // - - /** - * Returns the receiver UDP port - * @param detPos -1 for all detectors in list or specific detector position - * @returns the receiver UDP port - */ - int getReceiverUDPPort(int detPos = -1) const; // - - /** - * Sets the receiver UDP port 2 (Eiger and Jungfrau only) - * @param udpport receiver UDP port 2 - * @param detPos -1 for all detectors in list or specific detector position - * @returns the receiver UDP port 2 - */ - int setReceiverUDPPort2(int udpport, int detPos = -1); // - - /** - * Returns the receiver UDP port 2 of same interface (Eiger and Jungfrau - * only) - * @param detPos -1 for all detectors in list or specific detector position - * @returns the receiver UDP port 2 of same interface - */ - int getReceiverUDPPort2(int detPos = -1) const; // - - /** - * Sets the number of UDP interfaces to stream data from detector (Jungfrau + * ets the number of UDP interfaces to stream data from detector (Jungfrau * only) * @param n number of interfaces. Options 1 or 2. * @param detPos -1 for all detectors in list or specific detector position - * @returns the number of interfaces */ - int setNumberofUDPInterfaces(int n, int detPos = -1); // + void setNumberofUDPInterfaces(int n, int detPos = -1); // /** * Returns the number of UDP interfaces to stream data from detector @@ -1036,16 +873,15 @@ class multiSlsDetector : public virtual slsDetectorDefs { * @param detPos -1 for all detectors in list or specific detector position * @returns the number of interfaces */ - int getNumberofUDPInterfaces(int detPos = -1) const; // + int getNumberofUDPInterfaces(int detPos = -1) ; // /** * Selects the UDP interfaces to stream data from detector. Effective only * when number of interfaces is 1. (Jungfrau only) * @param n selected interface. Options 1 or 2. * @param detPos -1 for all detectors in list or specific detector position - * @returns the interface selected */ - int selectUDPInterface(int n, int detPos = -1); + void selectUDPInterface(int n, int detPos = -1); /** * Returns the UDP interfaces to stream data from detector. Effective only @@ -1053,7 +889,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { * @param detPos -1 for all detectors in list or specific detector position * @returns the interface selected */ - int getSelectedUDPInterface(int detPos = -1) const; // + int getSelectedUDPInterface(int detPos = -1) ; // /** * (advanced users) diff --git a/slsDetectorSoftware/include/slsDetector.h b/slsDetectorSoftware/include/slsDetector.h index 180d1b24d..71fa755a9 100755 --- a/slsDetectorSoftware/include/slsDetector.h +++ b/slsDetectorSoftware/include/slsDetector.h @@ -13,7 +13,7 @@ class ServerInterface; #define SLS_SHMAPIVERSION 0x190726 -#define SLS_SHMVERSION 0x190816 +#define SLS_SHMVERSION 0x190830 /** * @short structure allocated in shared memory to store detector settings for @@ -89,45 +89,6 @@ struct sharedSlsDetector { /** is the TCP port used to communicate between client and the receiver */ int rxTCPPort; - /** is the UDP port used to send data from detector to receiver */ - int rxUDPPort; - - /** is the port used to communicate between second half module of - * Eiger/ Jungfrau detector and the receiver*/ - int rxUDPPort2; - - /** ip address of the receiver for the detector to send packets to**/ - sls::IpAddr rxUDPIP; - - /** ip address of the receiver for the 2nd interface of the detector to send - * packets to**/ - sls::IpAddr rxUDPIP2; - - /** mac address of receiver for the detector to send packets to **/ - sls::MacAddr rxUDPMAC; - - /** mac address of receiver for the 2nd interface of the detector to send - * packets to **/ - sls::MacAddr rxUDPMAC2; - - /** mac address of the detector **/ - sls::MacAddr detectorMAC; - - /** mac address of the 2nd interface of the detector **/ - sls::MacAddr detectorMAC2; - - /** ip address of the detector **/ - sls::IpAddr detectorIP; - - /** ip address of the 2nd interface of the detector **/ - sls::IpAddr detectorIP2; - - /** number of udp interface */ - int numUDPInterfaces; - - /** selected udp interface */ - int selectedUDPInterface; - /** is set if the receiver hostname given and is connected, * unset if socket connection is not possible */ bool useReceiverFlag; @@ -719,63 +680,7 @@ class slsDetector : public virtual slsDetectorDefs { */ uint32_t clearBit(uint32_t addr, int n); - /** - * Validates the format of the detector MAC address and sets it \sa - * sharedSlsDetector - * @param detectorMAC detector MAC address - * @returns the detector MAC address - */ - std::string setDetectorMAC(const std::string &detectorMAC); - - /** - * Returns the detector MAC address\sa sharedSlsDetector - * @returns the detector MAC address - */ - sls::MacAddr getDetectorMAC(); - - /** - * Validates the format of the detector MAC address (bottom half) and sets - * it (Jungfrau only) - * @param detectorMAC detector MAC address (bottom half) - * @returns the detector MAC address (bottom half) - */ - std::string setDetectorMAC2(const std::string &detectorMAC); - - /** - * Returns the detector MAC address (bottom half) Jungfrau only - * @returns the detector MAC address (bottom half) - */ - sls::MacAddr getDetectorMAC2(); - - /** - * Validates the format of the detector IP address and sets it \sa - * sharedSlsDetector - * @param detectorIP detector IP address - * @returns the detector IP address - */ - std::string setDetectorIP(const std::string &detectorIP); - - /** - * Returns the detector IP address\sa sharedSlsDetector - * @returns the detector IP address - */ - sls::IpAddr getDetectorIP() const; - - /** - * Validates the format of the detector IP address (bottom half) and sets it - * (Jungfrau only) - * @param detectorIP detector IP address (bottom half) - * @returns the detector IP address (bottom half) - */ - std::string setDetectorIP2(const std::string &detectorIP); - - /** - * Returns the detector IP address (bottom half) Jungfrau only - * @returns the detector IP address (bottom half) - */ - sls::IpAddr getDetectorIP2() const; - - /** + /** * Validates and sets the receiver. * Also updates the receiver with all the shared memory parameters * significant for the receiver Also configures the detector to the receiver @@ -791,104 +696,164 @@ class slsDetector : public virtual slsDetectorDefs { */ std::string getReceiverHostname() const; - /** - * Validates the format of the receiver UDP IP address and sets it \sa - * sharedSlsDetector - * @param udpip receiver UDP IP address - * @returns the receiver UDP IP address + /** + * Validates the format of the detector MAC address and sets it + * @param mac detector MAC address */ - std::string setReceiverUDPIP(const std::string &udpip); + void setSourceUDPMAC(const sls::MacAddr mac); /** - * Returns the receiver UDP IP address\sa sharedSlsDetector + * Returns the detector MAC address + * @returns the detector MAC address + */ + sls::MacAddr getSourceUDPMAC(); + + /** + * Validates the format of the detector MAC address (bottom half) and sets + * it (Jungfrau only) + * @param mac detector MAC address (bottom half) + */ + void setSourceUDPMAC2(const sls::MacAddr mac); + + /** + * Returns the detector MAC address (bottom half) Jungfrau only + * @returns the detector MAC address (bottom half) + */ + sls::MacAddr getSourceUDPMAC2(); + + /** + * Validates the format of the detector IP address and sets it + * @param ip detector IP address + */ + void setSourceUDPIP(const sls::IpAddr ip); + + /** + * Returns the detector IP address + * @returns the detector IP address + */ + sls::IpAddr getSourceUDPIP(); + + /** + * Validates the format of the detector IP address (bottom half) and sets it + * (Jungfrau only) + * @param ip detector IP address (bottom half) + */ + void setSourceUDPIP2(const sls::IpAddr ip); + + /** + * Returns the detector IP address (bottom half) Jungfrau only + * @returns the detector IP address (bottom half) + */ + sls::IpAddr getSourceUDPIP2(); + + /** + * Validates the format of the receiver UDP IP address and sets it + * If slsReceiver used, Gets receiver udp mac address and sends it to the detector + * @param ip receiver UDP IP address + */ + void setDestinationUDPIP(const sls::IpAddr ip); + + /** + * Returns the receiver UDP IP address + * If slsReceiver used, Gets receiver udp mac address and sends it to the detector * @returns the receiver UDP IP address */ - sls::IpAddr getReceiverUDPIP() const; + sls::IpAddr getDestinationUDPIP(); + + /** + * Gets destination udp ip from detector, + * if 0, it converts rx_hostname to ip and + * updates both detector and receiver + */ + void updateRxDestinationUDPIP(); /** * Validates the format of the receiver UDP IP address (bottom half) and * sets it(Jungfrau only) - * @param udpip receiver UDP IP address (bottom half) - * @returns the receiver UDP IP address (bottom half) + * If slsReceiver used, Gets receiver udp mac address2 and sends it to the detector + * @param ip receiver UDP IP address (bottom half) */ - std::string setReceiverUDPIP2(const std::string &udpip); + void setDestinationUDPIP2(const sls::IpAddr ip); /** * Returns the receiver UDP IP address (bottom half) Jungfrau only + * If slsReceiver used, Gets receiver udp mac address2 and sends it to the detector * @returns the receiver UDP IP address (bottom half) */ - sls::IpAddr getReceiverUDPIP2() const; + sls::IpAddr getDestinationUDPIP2(); + + /** + * Gets destination udp ip2 from detector, + * if 0, it converts rx_hostname to ip and + * updates both detector and receiver + */ + void updateRxDestinationUDPIP2(); + + /** + * Validates the format of the receiver UDP MAC address and sets it + * @param mac receiver UDP MAC address + */ + void setDestinationUDPMAC(const sls::MacAddr mac); /** - * Validates the format of the receiver UDP MAC address and sets it \sa - * sharedSlsDetector - * @param udpmac receiver UDP MAC address + * Returns the receiver UDP MAC address * @returns the receiver UDP MAC address */ - std::string setReceiverUDPMAC(const std::string &udpmac); - - /** - * Returns the receiver UDP MAC address\sa sharedSlsDetector - * @returns the receiver UDP MAC address - */ - sls::MacAddr getReceiverUDPMAC() const; + sls::MacAddr getDestinationUDPMAC(); /** * Validates the format of the receiver UDP MAC address (bottom half) and * sets it (Jungfrau only) - * @param udpmac receiver UDP MAC address (bottom half) - * @returns the receiver UDP MAC address (bottom half) + * @param mac receiver UDP MAC address (bottom half) */ - std::string setReceiverUDPMAC2(const std::string &udpmac); + void setDestinationUDPMAC2(const sls::MacAddr mac); /** * Returns the receiver UDP MAC address (bottom half) Jungfrau only * @returns the receiver UDP MAC address (bottom half) */ - sls::MacAddr getReceiverUDPMAC2() const; + sls::MacAddr getDestinationUDPMAC2(); /** * Sets the receiver UDP port\sa sharedSlsDetector * @param udpport receiver UDP port - * @returns the receiver UDP port */ - int setReceiverUDPPort(int udpport); + void setDestinationUDPPort(int udpport); /** * Returns the receiver UDP port\sa sharedSlsDetector * @returns the receiver UDP port */ - int getReceiverUDPPort() const; + int getDestinationUDPPort(); /** * Sets the receiver UDP port 2\sa sharedSlsDetector (Eiger and Jungfrau * only) * @param udpport receiver UDP port 2 - * @returns the receiver UDP port 2 */ - int setReceiverUDPPort2(int udpport); + void setDestinationUDPPort2(int udpport); /** * Returns the receiver UDP port 2 of same interface\sa sharedSlsDetector * (Eiger and Jungfrau only) * @returns the receiver UDP port 2 of same interface */ - int getReceiverUDPPort2() const; + int getDestinationUDPPort2(); /** * Sets the number of UDP interfaces to stream data from detector (Jungfrau * only) * @param n number of interfaces. Options 1 or 2. - * @returns the number of interfaces + * @returns the number of interface */ - int setNumberofUDPInterfaces(int n); + void setNumberofUDPInterfaces(int n); /** * Returns the number of UDP interfaces to stream data from detector * (Jungfrau only) * @returns the number of interfaces */ - int getNumberofUDPInterfaces() const; + int getNumberofUDPInterfaces(); /** * Selects the UDP interfaces to stream data from detector. Effective only @@ -896,14 +861,14 @@ class slsDetector : public virtual slsDetectorDefs { * @param n selected interface. Options 1 or 2. * @returns the interface selected */ - int selectUDPInterface(int n); + void selectUDPInterface(int n); /** * Returns the UDP interfaces to stream data from detector. Effective only * when number of interfaces is 1. (Jungfrau only) * @returns the interface selected */ - int getSelectedUDPInterface() const; + int getSelectedUDPInterface(); /** * Sets the client zmq port\sa sharedSlsDetector @@ -1727,7 +1692,7 @@ class slsDetector : public virtual slsDetectorDefs { void *retval, size_t retval_size); template - void sendToDetector(int fnum, const Arg &args, Ret &retval); + void sendToDetector(int fnum, const Arg &args, Ret &retval); template void sendToDetector(int fnum, const Arg &args, std::nullptr_t); template diff --git a/slsDetectorSoftware/include/slsDetectorCommand.h b/slsDetectorSoftware/include/slsDetectorCommand.h index c62e8a634..3bf778a18 100755 --- a/slsDetectorSoftware/include/slsDetectorCommand.h +++ b/slsDetectorSoftware/include/slsDetectorCommand.h @@ -58,7 +58,6 @@ class slsDetectorCommand : public virtual slsDetectorDefs { static std::string helpPort(int action); static std::string helpLastClient(int action); static std::string helpOnline(int action); - static std::string helpConfigureMac(int action); static std::string helpDetectorSize(int action); static std::string helpSettings(int action); static std::string helpSN(int action); @@ -102,7 +101,6 @@ class slsDetectorCommand : public virtual slsDetectorDefs { std::string cmdPort(int narg, const char * const args[], int action, int detPos = -1); std::string cmdLastClient(int narg, const char * const args[], int action, int detPos = -1); std::string cmdOnline(int narg, const char * const args[], int action, int detPos = -1); - std::string cmdConfigureMac(int narg, const char * const args[], int action, int detPos = -1); std::string cmdDetectorSize(int narg, const char * const args[], int action, int detPos = -1); std::string cmdSettings(int narg, const char * const args[], int action, int detPos = -1); std::string cmdSN(int narg, const char * const args[], int action, int detPos = -1); diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 0291c1ef6..22a22ecec 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -303,10 +303,6 @@ void Detector::sendSoftwareTrigger(Positions pos) { // Network Configuration (Detector<->Receiver) -void Detector::configureMAC(Positions pos) { - pimpl->Parallel(&slsDetector::configureMAC, pos); -} - Result Detector::getNumberofUDPInterfaces(Positions pos) const { return pimpl->Parallel(&slsDetector::getNumberofUDPInterfaces, pos); } @@ -335,98 +331,98 @@ void Detector::selectUDPInterface(int interface, Positions pos) { } Result Detector::getSourceUDPIP(Positions pos) const { - return pimpl->Parallel(&slsDetector::getDetectorIP, pos); + return pimpl->Parallel(&slsDetector::getSourceUDPIP, pos); } -void Detector::setSourceUDPIP(const std::string &ip, Positions pos) { - pimpl->Parallel(&slsDetector::setDetectorIP, pos, ip); +void Detector::setSourceUDPIP(const IpAddr ip, Positions pos) { + pimpl->Parallel(&slsDetector::setSourceUDPIP, pos, ip); } Result Detector::getSourceUDPIP2(Positions pos) const { - return pimpl->Parallel(&slsDetector::getDetectorIP2, pos); + return pimpl->Parallel(&slsDetector::getSourceUDPIP2, pos); } -void Detector::setSourceUDPIP2(const std::string &ip, Positions pos) { - pimpl->Parallel(&slsDetector::setDetectorIP2, pos, ip); +void Detector::setSourceUDPIP2(const IpAddr ip, Positions pos) { + pimpl->Parallel(&slsDetector::setSourceUDPIP2, pos, ip); } Result Detector::getSourceUDPMAC(Positions pos) const { - return pimpl->Parallel(&slsDetector::getDetectorMAC, pos); + return pimpl->Parallel(&slsDetector::getSourceUDPMAC, pos); } -void Detector::setSourceUDPMAC(const std::string &mac, Positions pos) { - pimpl->Parallel(&slsDetector::setDetectorMAC, pos, mac); +void Detector::setSourceUDPMAC(const MacAddr mac, Positions pos) { + pimpl->Parallel(&slsDetector::setSourceUDPMAC, pos, mac); } Result Detector::getSourceUDPMAC2(Positions pos) const { - return pimpl->Parallel(&slsDetector::getDetectorMAC2, pos); + return pimpl->Parallel(&slsDetector::getSourceUDPMAC2, pos); } -void Detector::setSourceUDPMAC2(const std::string &mac, Positions pos) { - pimpl->Parallel(&slsDetector::setDetectorMAC2, pos, mac); +void Detector::setSourceUDPMAC2(const MacAddr mac, Positions pos) { + pimpl->Parallel(&slsDetector::setSourceUDPMAC2, pos, mac); } Result Detector::getDestinationUDPIP(Positions pos) const { - return pimpl->Parallel(&slsDetector::getReceiverUDPIP, pos); + return pimpl->Parallel(&slsDetector::getDestinationUDPIP, pos); } -void Detector::setDestinationUDPIP(const std::string &ip, Positions pos) { - pimpl->Parallel(&slsDetector::setReceiverUDPIP, pos, ip); +void Detector::setDestinationUDPIP(const IpAddr ip, Positions pos) { + pimpl->Parallel(&slsDetector::setDestinationUDPIP, pos, ip); } Result Detector::getDestinationUDPIP2(Positions pos) const { - return pimpl->Parallel(&slsDetector::getReceiverUDPIP2, pos); + return pimpl->Parallel(&slsDetector::getDestinationUDPIP2, pos); } -void Detector::setDestinationUDPIP2(const std::string &ip, Positions pos) { - pimpl->Parallel(&slsDetector::setReceiverUDPIP2, pos, ip); +void Detector::setDestinationUDPIP2(const IpAddr ip, Positions pos) { + pimpl->Parallel(&slsDetector::setDestinationUDPIP2, pos, ip); } Result Detector::getDestinationUDPMAC(Positions pos) const { - return pimpl->Parallel(&slsDetector::getReceiverUDPMAC, pos); + return pimpl->Parallel(&slsDetector::getDestinationUDPMAC, pos); } -void Detector::setDestinationUDPMAC(const std::string &mac, Positions pos) { - pimpl->Parallel(&slsDetector::setReceiverUDPMAC, pos, mac); +void Detector::setDestinationUDPMAC(const MacAddr mac, Positions pos) { + pimpl->Parallel(&slsDetector::setDestinationUDPMAC, pos, mac); } Result Detector::getDestinationUDPMAC2(Positions pos) const { - return pimpl->Parallel(&slsDetector::getReceiverUDPMAC2, pos); + return pimpl->Parallel(&slsDetector::getDestinationUDPMAC2, pos); } -void Detector::setDestinationUDPMAC2(const std::string &mac, Positions pos) { - pimpl->Parallel(&slsDetector::setReceiverUDPMAC2, pos, mac); +void Detector::setDestinationUDPMAC2(const MacAddr mac, Positions pos) { + pimpl->Parallel(&slsDetector::setDestinationUDPMAC2, pos, mac); } Result Detector::getDestinationUDPPort(Positions pos) const { - return pimpl->Parallel(&slsDetector::getReceiverUDPPort, pos); + return pimpl->Parallel(&slsDetector::getDestinationUDPPort, pos); } void Detector::setDestinationUDPPort(int port, int module_id) { if (module_id == -1) { std::vector port_list = getPortNumbers(port); for (int idet = 0; idet < size(); ++idet) { - pimpl->Parallel(&slsDetector::setReceiverUDPPort, {idet}, + pimpl->Parallel(&slsDetector::setDestinationUDPPort, {idet}, port_list[idet]); } } else { - pimpl->Parallel(&slsDetector::setReceiverUDPPort, {module_id}, port); + pimpl->Parallel(&slsDetector::setDestinationUDPPort, {module_id}, port); } } Result Detector::getDestinationUDPPort2(Positions pos) const { - return pimpl->Parallel(&slsDetector::getReceiverUDPPort2, pos); + return pimpl->Parallel(&slsDetector::getDestinationUDPPort2, pos); } void Detector::setDestinationUDPPort2(int port, int module_id) { if (module_id == -1) { std::vector port_list = getPortNumbers(port); for (int idet = 0; idet < size(); ++idet) { - pimpl->Parallel(&slsDetector::setReceiverUDPPort2, {idet}, + pimpl->Parallel(&slsDetector::setDestinationUDPPort2, {idet}, port_list[idet]); } } else { - pimpl->Parallel(&slsDetector::setReceiverUDPPort2, {module_id}, port); + pimpl->Parallel(&slsDetector::setDestinationUDPPort2, {module_id}, port); } } diff --git a/slsDetectorSoftware/src/multiSlsDetector.cpp b/slsDetectorSoftware/src/multiSlsDetector.cpp index 0286b70b1..2536dfd83 100755 --- a/slsDetectorSoftware/src/multiSlsDetector.cpp +++ b/slsDetectorSoftware/src/multiSlsDetector.cpp @@ -888,7 +888,7 @@ void multiSlsDetector::readAll(int detPos) { // multi parallelCall(&slsDetector::readAll); } - +/* void multiSlsDetector::configureMAC(int detPos) { // single if (detPos >= 0) { @@ -898,6 +898,7 @@ void multiSlsDetector::configureMAC(int detPos) { // multi parallelCall(&slsDetector::configureMAC); } +*/ void multiSlsDetector::setStartingFrameNumber(const uint64_t value, int detPos) { @@ -1275,98 +1276,6 @@ uint32_t multiSlsDetector::clearBit(uint32_t addr, int n, int detPos) { throw RuntimeError(ss.str()); } -std::string multiSlsDetector::setDetectorMAC(const std::string &detectorMAC, - int detPos) { - // single - if (detPos >= 0) { - return detectors[detPos]->setDetectorMAC(detectorMAC); - } - - // multi - auto r = parallelCall(&slsDetector::setDetectorMAC, detectorMAC); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::getDetectorMAC(int detPos) { - // single - if (detPos >= 0) { - return detectors[detPos]->getDetectorMAC().str(); - } - - // multi - auto r = serialCall(&slsDetector::getDetectorMAC); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::setDetectorMAC2(const std::string &detectorMAC, - int detPos) { - // single - if (detPos >= 0) { - return detectors[detPos]->setDetectorMAC2(detectorMAC); - } - - // multi - auto r = parallelCall(&slsDetector::setDetectorMAC2, detectorMAC); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::getDetectorMAC2(int detPos) { - // single - if (detPos >= 0) { - return detectors[detPos]->getDetectorMAC2().str(); - } - - // multi - auto r = serialCall(&slsDetector::getDetectorMAC2); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::setDetectorIP(const std::string &detectorIP, - int detPos) { - // single - if (detPos >= 0) { - return detectors[detPos]->setDetectorIP(detectorIP); - } - - // multi - auto r = parallelCall(&slsDetector::setDetectorIP, detectorIP); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::getDetectorIP(int detPos) const { - // single - if (detPos >= 0) { - return detectors[detPos]->getDetectorIP().str(); - } - - // multi - auto r = serialCall(&slsDetector::getDetectorIP); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::setDetectorIP2(const std::string &detectorIP, - int detPos) { - // single - if (detPos >= 0) { - return detectors[detPos]->setDetectorIP2(detectorIP); - } - - // multi - auto r = parallelCall(&slsDetector::setDetectorIP2, detectorIP); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::getDetectorIP2(int detPos) const { - // single - if (detPos >= 0) { - return detectors[detPos]->getDetectorIP2().str(); - } - - // multi - auto r = serialCall(&slsDetector::getDetectorIP2); - return sls::concatenateIfDifferent(r); -} - std::string multiSlsDetector::setReceiverHostname(const std::string &receiver, int detPos) { // single @@ -1390,155 +1299,19 @@ std::string multiSlsDetector::getReceiverHostname(int detPos) const { return sls::concatenateIfDifferent(r); } -std::string multiSlsDetector::setReceiverUDPIP(const std::string &udpip, - int detPos) { - // single - if (detPos >= 0) { - return detectors[detPos]->setReceiverUDPIP(udpip); - } - // multi - auto r = parallelCall(&slsDetector::setReceiverUDPIP, udpip); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::getReceiverUDPIP(int detPos) const { - // single - if (detPos >= 0) { - return detectors[detPos]->getReceiverUDPIP().str(); - } - - // multi - auto r = serialCall(&slsDetector::getReceiverUDPIP); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::setReceiverUDPIP2(const std::string &udpip, - int detPos) { - // single - if (detPos >= 0) { - return detectors[detPos]->setReceiverUDPIP2(udpip); - } - - // multi - auto r = parallelCall(&slsDetector::setReceiverUDPIP2, udpip); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::getReceiverUDPIP2(int detPos) const { - // single - if (detPos >= 0) { - return detectors[detPos]->getReceiverUDPIP2().str(); - } - - // multi - auto r = serialCall(&slsDetector::getReceiverUDPIP2); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::setReceiverUDPMAC(const std::string &udpmac, - int detPos) { - // single - if (detPos >= 0) { - return detectors[detPos]->setReceiverUDPMAC(udpmac); - } - - // multi - auto r = parallelCall(&slsDetector::setReceiverUDPMAC, udpmac); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::getReceiverUDPMAC(int detPos) const { - // single - if (detPos >= 0) { - return detectors[detPos]->getReceiverUDPMAC().str(); - } - - // multi - auto r = serialCall(&slsDetector::getReceiverUDPMAC); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::setReceiverUDPMAC2(const std::string &udpmac, - int detPos) { - // single - if (detPos >= 0) { - return detectors[detPos]->setReceiverUDPMAC2(udpmac); - } - - // multi - auto r = parallelCall(&slsDetector::setReceiverUDPMAC2, udpmac); - return sls::concatenateIfDifferent(r); -} - -std::string multiSlsDetector::getReceiverUDPMAC2(int detPos) const { - // single - if (detPos >= 0) { - return detectors[detPos]->getReceiverUDPMAC2().str(); - } - - // multi - auto r = serialCall(&slsDetector::getReceiverUDPMAC2); - return sls::concatenateIfDifferent(r); -} - -int multiSlsDetector::setReceiverUDPPort(int udpport, int detPos) { - // single - if (detPos >= 0) { - return detectors[detPos]->setReceiverUDPPort(udpport); - } - - // multi - auto r = parallelCall(&slsDetector::setReceiverUDPPort, udpport); - return sls::minusOneIfDifferent(r); -} - -int multiSlsDetector::getReceiverUDPPort(int detPos) const { - // single - if (detPos >= 0) { - return detectors[detPos]->getReceiverUDPPort(); - } - - // multi - auto r = serialCall(&slsDetector::getReceiverUDPPort); - return sls::minusOneIfDifferent(r); -} - -int multiSlsDetector::setReceiverUDPPort2(int udpport, int detPos) { - // single - if (detPos >= 0) { - return detectors[detPos]->setReceiverUDPPort2(udpport); - } - - // multi - auto r = parallelCall(&slsDetector::setReceiverUDPPort2, udpport); - return sls::minusOneIfDifferent(r); -} - -int multiSlsDetector::getReceiverUDPPort2(int detPos) const { - // single - if (detPos >= 0) { - return detectors[detPos]->getReceiverUDPPort2(); - } - - // multi - auto r = serialCall(&slsDetector::getReceiverUDPPort2); - return sls::minusOneIfDifferent(r); -} - -int multiSlsDetector::setNumberofUDPInterfaces(int n, int detPos) { +void multiSlsDetector::setNumberofUDPInterfaces(int n, int detPos) { bool previouslyClientStreaming = enableDataStreamingToClient(); int previouslyReceiverStreaming = enableDataStreamingFromReceiver(); // single - int ret = OK; if (detPos >= 0) { - ret = detectors[detPos]->setNumberofUDPInterfaces(n); + detectors[detPos]->setNumberofUDPInterfaces(n); } // multi - auto r = parallelCall(&slsDetector::setNumberofUDPInterfaces, n); + parallelCall(&slsDetector::setNumberofUDPInterfaces, n); // redo the zmq sockets if (previouslyClientStreaming) { @@ -1549,45 +1322,37 @@ int multiSlsDetector::setNumberofUDPInterfaces(int n, int detPos) { enableDataStreamingFromReceiver(0); enableDataStreamingFromReceiver(1); } - - // return single - if (detPos >= 0) - return ret; - - // return multi - return sls::minusOneIfDifferent(r); } -int multiSlsDetector::getNumberofUDPInterfaces(int detPos) const { +int multiSlsDetector::getNumberofUDPInterfaces(int detPos) { // single if (detPos >= 0) { return detectors[detPos]->getNumberofUDPInterfaces(); } // multi - auto r = serialCall(&slsDetector::getNumberofUDPInterfaces); + auto r = parallelCall(&slsDetector::getNumberofUDPInterfaces); return sls::minusOneIfDifferent(r); } -int multiSlsDetector::selectUDPInterface(int n, int detPos) { +void multiSlsDetector::selectUDPInterface(int n, int detPos) { // single if (detPos >= 0) { - return detectors[detPos]->selectUDPInterface(n); + detectors[detPos]->selectUDPInterface(n); } // multi - auto r = parallelCall(&slsDetector::selectUDPInterface, n); - return sls::minusOneIfDifferent(r); + parallelCall(&slsDetector::selectUDPInterface, n); } -int multiSlsDetector::getSelectedUDPInterface(int detPos) const { +int multiSlsDetector::getSelectedUDPInterface(int detPos) { // single if (detPos >= 0) { return detectors[detPos]->getSelectedUDPInterface(); } // multi - auto r = serialCall(&slsDetector::getSelectedUDPInterface); + auto r = parallelCall(&slsDetector::getSelectedUDPInterface); return sls::minusOneIfDifferent(r); } @@ -2410,7 +2175,12 @@ std::string multiSlsDetector::printReceiverConfiguration(int detPos) { // multi auto r = parallelCall(&slsDetector::printReceiverConfiguration); - return sls::concatenateIfDifferent(r); + // concatenate without '+' + std::string ret; + for (const auto &s : r) + if (!s.empty()) + ret += s; + return ret; } bool multiSlsDetector::getUseReceiverFlag(int detPos) { diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp index a33350d7b..1c0c57f40 100755 --- a/slsDetectorSoftware/src/slsDetector.cpp +++ b/slsDetectorSoftware/src/slsDetector.cpp @@ -338,21 +338,6 @@ void slsDetector::initializeDetectorStructure(detectorType type) { shm()->deadTime = 0; sls::strcpy_safe(shm()->rxHostname, "none"); shm()->rxTCPPort = DEFAULT_PORTNO + 2; - shm()->rxUDPPort = DEFAULT_UDP_PORTNO; - shm()->rxUDPPort2 = DEFAULT_UDP_PORTNO + 1; - - shm()->rxUDPIP = 0u; - shm()->rxUDPIP2 = 0u; - shm()->rxUDPMAC = 0ul; - shm()->rxUDPMAC2 = 0ul; - - shm()->detectorMAC = DEFAULT_DET_MAC; - shm()->detectorMAC2 = DEFAULT_DET_MAC2; - shm()->detectorIP = DEFAULT_DET_MAC; - shm()->detectorIP2 = DEFAULT_DET_MAC2; - - shm()->numUDPInterfaces = 1; - shm()->selectedUDPInterface = 0; shm()->useReceiverFlag = false; shm()->tenGigaEnable = 0; shm()->flippedDataX = 0; @@ -645,8 +630,11 @@ int slsDetector::getReadNLines() { void slsDetector::updateMultiSize(slsDetectorDefs::xy det) { shm()->multiSize = det; + int args[2] = {shm()->multiSize.y, detId}; + sendToDetector(F_SET_POSITION, args, nullptr); } + int slsDetector::setControlPort(int port_number) { int retval = -1; FILE_LOG(logDEBUG1) << "Setting control port to " << port_number; @@ -1214,6 +1202,7 @@ void slsDetector::readAll() { FILE_LOG(logDEBUG1) << "Detector successfully finished reading all frames"; } +/* void slsDetector::configureMAC() { int fnum = F_CONFIGURE_MAC; const size_t array_size = 50; @@ -1321,6 +1310,7 @@ void slsDetector::configureMAC() { updateCachedDetectorVariables(); } } +*/ void slsDetector::setStartingFrameNumber(uint64_t value) { FILE_LOG(logDEBUG1) << "Setting starting frame number to " << value; @@ -1615,75 +1605,6 @@ uint32_t slsDetector::clearBit(uint32_t addr, int n) { } } -std::string slsDetector::setDetectorMAC(const std::string &detectorMAC) { - auto addr = MacAddr(detectorMAC); - if (addr == 0) { - throw RuntimeError( - "server MAC Address should be in xx:xx:xx:xx:xx:xx format"); - } - shm()->detectorMAC = addr; - if (strcmp(shm()->rxHostname, "none") == 0) { - FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; - } else { - setUDPConnection(); - } - - return getDetectorMAC().str(); -} - -MacAddr slsDetector::getDetectorMAC() { return shm()->detectorMAC; } - -std::string slsDetector::setDetectorMAC2(const std::string &detectorMAC) { - auto addr = MacAddr(detectorMAC); - if (addr == 0) { - throw RuntimeError( - "server MAC Address 2 should be in xx:xx:xx:xx:xx:xx format"); - } - shm()->detectorMAC2 = addr; - if (strcmp(shm()->rxHostname, "none") == 0) { - FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; - } else { - setUDPConnection(); - } - return getDetectorMAC2().str(); -} - -MacAddr slsDetector::getDetectorMAC2() { return shm()->detectorMAC2; } - -std::string slsDetector::setDetectorIP(const std::string &ip) { - auto addr = IpAddr(ip); - if (addr == 0) { - throw RuntimeError("setDetectorIP: IP Address should be VALID and " - "in xxx.xxx.xxx.xxx format"); - } - shm()->detectorIP = ip; - if (strcmp(shm()->rxHostname, "none") == 0) { - FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; - } else { - setUDPConnection(); - } - return getDetectorIP().str(); -} - -IpAddr slsDetector::getDetectorIP() const { return shm()->detectorIP; } - -std::string slsDetector::setDetectorIP2(const std::string &ip) { - auto addr = IpAddr(ip); - if (addr == 0) { - throw RuntimeError("setDetectorIP: IP2 Address should be VALID and " - "in xxx.xxx.xxx.xxx format"); - } - shm()->detectorIP2 = ip; - if (strcmp(shm()->rxHostname, "none") == 0) { - FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; - } else { - setUDPConnection(); - } - return getDetectorIP().str(); -} - -IpAddr slsDetector::getDetectorIP2() const { return shm()->detectorIP2; } - std::string slsDetector::setReceiverHostname(const std::string &receiverIP) { FILE_LOG(logDEBUG1) << "Setting up Receiver with " << receiverIP; // recieverIP is none @@ -1750,7 +1671,19 @@ std::string slsDetector::setReceiverHostname(const std::string &receiverIP) { sendMultiDetectorSize(); setDetectorId(); setDetectorHostname(); - setUDPConnection(); + + // setup udp + updateRxDestinationUDPIP(); + setDestinationUDPPort(getDestinationUDPPort()); + if (shm()->myDetectorType == JUNGFRAU || shm()->myDetectorType == EIGER ) { + setDestinationUDPPort2(getDestinationUDPPort2()); + } + if (shm()->myDetectorType == JUNGFRAU) { + updateRxDestinationUDPIP2(); + setNumberofUDPInterfaces(getNumberofUDPInterfaces()); + } + FILE_LOG(logDEBUG1) << printReceiverConfiguration(); + setReceiverUDPSocketBufferSize(0); setFilePath(shm()->rxFilePath); setFileName(shm()->rxFileName); @@ -1825,119 +1758,237 @@ std::string slsDetector::getReceiverHostname() const { return std::string(shm()->rxHostname); } -std::string slsDetector::setReceiverUDPIP(const std::string &udpip) { - auto ip = IpAddr(udpip); - if (ip == 0) { - throw ReceiverError("setReceiverUDPIP: UDP IP Address should be " - "VALID and in xxx.xxx.xxx.xxx format"); - } - shm()->rxUDPIP = ip; - if (strcmp(shm()->rxHostname, "none") == 0) { - FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; - } else { - setUDPConnection(); - } - return getReceiverUDPIP().str(); -} - -sls::IpAddr slsDetector::getReceiverUDPIP() const { return shm()->rxUDPIP; } - -std::string slsDetector::setReceiverUDPIP2(const std::string &udpip) { - auto ip = IpAddr(udpip); - if (ip == 0) { - throw ReceiverError("setReceiverUDPIP: UDP IP Address 2 should be " - "VALID and in xxx.xxx.xxx.xxx format"); - } - shm()->rxUDPIP2 = ip; - if (strcmp(shm()->rxHostname, "none") == 0) { - FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; - } else { - setUDPConnection(); - } - return getReceiverUDPIP2().str(); -} - -sls::IpAddr slsDetector::getReceiverUDPIP2() const { return shm()->rxUDPIP2; } - -std::string slsDetector::setReceiverUDPMAC(const std::string &udpmac) { - auto mac = MacAddr(udpmac); +void slsDetector::setSourceUDPMAC(const sls::MacAddr mac) { + FILE_LOG(logDEBUG1) << "Setting source udp mac to " << mac; if (mac == 0) { - throw ReceiverError("Could not decode UDPMAC from: " + udpmac); + throw RuntimeError("Invalid source udp mac address"); } - shm()->rxUDPMAC = mac; - return getReceiverUDPMAC().str(); + sendToDetector(F_SET_SOURCE_UDP_MAC, mac, nullptr); } -MacAddr slsDetector::getReceiverUDPMAC() const { return shm()->rxUDPMAC; } +sls::MacAddr slsDetector::getSourceUDPMAC() { + sls::MacAddr retval(0lu); + FILE_LOG(logDEBUG1) << "Getting source udp mac"; + sendToDetector(F_GET_SOURCE_UDP_MAC, nullptr, retval); + FILE_LOG(logDEBUG1) << "Source udp mac: " << retval; + return retval; +} -std::string slsDetector::setReceiverUDPMAC2(const std::string &udpmac) { - auto mac = MacAddr(udpmac); +void slsDetector::setSourceUDPMAC2(const sls::MacAddr mac) { + FILE_LOG(logDEBUG1) << "Setting source udp mac2 to " << mac; if (mac == 0) { - throw ReceiverError("Could not decode UDPMA2C from: " + udpmac); + throw RuntimeError("Invalid source udp mac address2"); } - shm()->rxUDPMAC2 = mac; - return getReceiverUDPMAC2().str(); + sendToDetector(F_SET_SOURCE_UDP_MAC2, mac, nullptr); } -MacAddr slsDetector::getReceiverUDPMAC2() const { return shm()->rxUDPMAC2; } - -int slsDetector::setReceiverUDPPort(int udpport) { - shm()->rxUDPPort = udpport; - if (strcmp(shm()->rxHostname, "none") == 0) { - FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; - } else { - setUDPConnection(); - } - return shm()->rxUDPPort; +sls::MacAddr slsDetector::getSourceUDPMAC2() { + sls::MacAddr retval(0lu); + FILE_LOG(logDEBUG1) << "Getting source udp mac2"; + sendToDetector(F_GET_SOURCE_UDP_MAC2, nullptr, retval); + FILE_LOG(logDEBUG1) << "Source udp mac2: " << retval; + return retval; } -int slsDetector::getReceiverUDPPort() const { return shm()->rxUDPPort; } - -int slsDetector::setReceiverUDPPort2(int udpport) { - shm()->rxUDPPort2 = udpport; - if (strcmp(shm()->rxHostname, "none") == 0) { - FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; - } else { - setUDPConnection(); +void slsDetector::setSourceUDPIP(const IpAddr ip) { + FILE_LOG(logDEBUG1) << "Setting source udp ip to " << ip; + if (ip == 0) { + throw RuntimeError("Invalid source udp ip address"); } - return shm()->rxUDPPort2; + + sendToDetector(F_SET_SOURCE_UDP_IP, ip, nullptr); } -int slsDetector::getReceiverUDPPort2() const { return shm()->rxUDPPort2; } - -int slsDetector::setNumberofUDPInterfaces(int n) { - if (shm()->myDetectorType != JUNGFRAU) { - throw RuntimeError( - "Cannot choose number of interfaces for this detector"); - } - shm()->numUDPInterfaces = (n > 1 ? 2 : 1); - if (strcmp(shm()->rxHostname, "none") == 0) { - FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; - } else { - setUDPConnection(); - } - return shm()->numUDPInterfaces; +sls::IpAddr slsDetector::getSourceUDPIP() { + sls::IpAddr retval(0u); + FILE_LOG(logDEBUG1) << "Getting source udp ip"; + sendToDetector(F_GET_SOURCE_UDP_IP, nullptr, retval); + FILE_LOG(logDEBUG1) << "Source udp ip: " << retval; + return retval; } -int slsDetector::getNumberofUDPInterfaces() const { - return shm()->numUDPInterfaces; +void slsDetector::setSourceUDPIP2(const IpAddr ip) { + FILE_LOG(logDEBUG1) << "Setting source udp ip2 to " << ip; + if (ip == 0) { + throw RuntimeError("Invalid source udp ip address2"); + } + + sendToDetector(F_SET_SOURCE_UDP_IP2, ip, nullptr); } -int slsDetector::selectUDPInterface(int n) { - if (shm()->myDetectorType != JUNGFRAU) { - throw RuntimeError("Cannot select an interface for this detector"); - } - shm()->selectedUDPInterface = (n == 0 ? 0 : 1); - if (strcmp(shm()->rxHostname, "none") == 0) { - FILE_LOG(logDEBUG1) << "Receiver hostname not set yet"; - } else { - setUDPConnection(); - } - return shm()->selectedUDPInterface; +sls::IpAddr slsDetector::getSourceUDPIP2() { + sls::IpAddr retval(0u); + FILE_LOG(logDEBUG1) << "Getting source udp ip2"; + sendToDetector(F_GET_SOURCE_UDP_IP2, nullptr, retval); + FILE_LOG(logDEBUG1) << "Source udp ip2: " << retval; + return retval; } -int slsDetector::getSelectedUDPInterface() const { - return shm()->selectedUDPInterface; +void slsDetector::setDestinationUDPIP(const IpAddr ip) { + FILE_LOG(logDEBUG1) << "Setting destination udp ip to " << ip; + if (ip == 0) { + throw RuntimeError("Invalid destination udp ip address"); + } + sendToDetector(F_SET_DEST_UDP_IP, ip, nullptr); + if (shm()->useReceiverFlag) { + sls::MacAddr retval(0lu); + sendToReceiver(F_SET_RECEIVER_UDP_IP, ip, retval); + FILE_LOG(logINFO) << "Setting destination udp mac to " << retval; + sendToDetector(F_SET_DEST_UDP_MAC, retval, nullptr); + } +} + +sls::IpAddr slsDetector::getDestinationUDPIP() { + sls::IpAddr retval(0u); + FILE_LOG(logDEBUG1) << "Getting destination udp ip"; + sendToDetector(F_GET_DEST_UDP_IP, nullptr, retval); + FILE_LOG(logDEBUG1) << "Destination udp ip: " << retval; + return retval; +} + +void slsDetector::updateRxDestinationUDPIP() { + auto ip = getDestinationUDPIP(); + if (ip == 0) { + // Hostname could be ip try to decode otherwise look up the hostname + ip = shm()->rxHostname; + if (ip == 0) { + ip = HostnameToIp(shm()->rxHostname); + } + FILE_LOG(logINFO) << "Setting destination default udp ip to " << ip; + } + setDestinationUDPIP(ip); +} + +void slsDetector::setDestinationUDPIP2(const IpAddr ip) { + FILE_LOG(logDEBUG1) << "Setting destination udp ip2 to " << ip; + if (ip == 0) { + throw RuntimeError("Invalid destination udp ip address2"); + } + + sendToDetector(F_SET_DEST_UDP_IP2, ip, nullptr); + if (shm()->useReceiverFlag) { + sls::MacAddr retval(0lu); + sendToReceiver(F_SET_RECEIVER_UDP_IP2, ip, retval); + FILE_LOG(logINFO) << "Setting destination udp mac2 to " << retval; + sendToDetector(F_SET_DEST_UDP_MAC2, retval, nullptr); + } +} + +sls::IpAddr slsDetector::getDestinationUDPIP2() { + sls::IpAddr retval(0u); + FILE_LOG(logDEBUG1) << "Getting destination udp ip2"; + sendToDetector(F_GET_DEST_UDP_IP2, nullptr, retval); + FILE_LOG(logDEBUG1) << "Destination udp ip2: " << retval; + return retval; +} + +void slsDetector::updateRxDestinationUDPIP2() { + auto ip = getDestinationUDPIP2(); + if (ip == 0) { + // Hostname could be ip try to decode otherwise look up the hostname + ip = shm()->rxHostname; + if (ip == 0) { + ip = HostnameToIp(shm()->rxHostname); + } + FILE_LOG(logINFO) << "Setting destination default udp ip2 to " << ip; + } + setDestinationUDPIP2(ip); +} + +void slsDetector::setDestinationUDPMAC(const MacAddr mac) { + FILE_LOG(logDEBUG1) << "Setting destination udp mac to " << mac; + if (mac == 0) { + throw RuntimeError("Invalid destination udp mac address"); + } + + sendToDetector(F_SET_DEST_UDP_MAC, mac, nullptr); +} + +sls::MacAddr slsDetector::getDestinationUDPMAC() { + sls::MacAddr retval(0lu); + FILE_LOG(logDEBUG1) << "Getting destination udp mac"; + sendToDetector(F_GET_DEST_UDP_MAC, nullptr, retval); + FILE_LOG(logDEBUG1) << "Destination udp mac: " << retval; + return retval; +} + +void slsDetector::setDestinationUDPMAC2(const MacAddr mac) { + FILE_LOG(logDEBUG1) << "Setting destination udp mac2 to " << mac; + if (mac == 0) { + throw RuntimeError("Invalid desinaion udp mac address2"); + } + + sendToDetector(F_SET_DEST_UDP_MAC2, mac, nullptr); +} + +sls::MacAddr slsDetector::getDestinationUDPMAC2() { + sls::MacAddr retval(0lu); + FILE_LOG(logDEBUG1) << "Getting destination udp mac2"; + sendToDetector(F_GET_DEST_UDP_MAC2, nullptr, retval); + FILE_LOG(logDEBUG1) << "Destination udp mac2: " << retval; + return retval; +} + +void slsDetector::setDestinationUDPPort(const int port) { + FILE_LOG(logDEBUG1) << "Setting destination udp port to " << port; + sendToDetector(F_SET_DEST_UDP_PORT, port, nullptr); + if (shm()->useReceiverFlag) { + sendToReceiver(F_SET_RECEIVER_UDP_PORT, port, nullptr); + } +} + +int slsDetector::getDestinationUDPPort() { + int retval = -1; + FILE_LOG(logDEBUG1) << "Getting destination udp port"; + sendToDetector(F_GET_DEST_UDP_PORT, nullptr, retval); + FILE_LOG(logDEBUG1) << "Destination udp port: " << retval; + + return retval; +} + +void slsDetector::setDestinationUDPPort2(const int port) { + FILE_LOG(logDEBUG1) << "Setting destination udp port2 to " << port; + sendToDetector(F_SET_DEST_UDP_PORT2, port, nullptr); + if (shm()->useReceiverFlag) { + sendToReceiver(F_SET_RECEIVER_UDP_PORT2, port, nullptr); + } +} + +int slsDetector::getDestinationUDPPort2() { + int retval = -1; + FILE_LOG(logDEBUG1) << "Getting destination udp port2"; + sendToDetector(F_GET_DEST_UDP_PORT2, nullptr, retval); + FILE_LOG(logDEBUG1) << "Destination udp port2: " << retval; + return retval; +} + +void slsDetector::setNumberofUDPInterfaces(int n) { + FILE_LOG(logDEBUG1) << "Setting number of udp interfaces to " << n; + sendToDetector(F_SET_NUM_INTERFACES, n, nullptr); + if (shm()->useReceiverFlag) { + sendToReceiver(F_SET_RECEIVER_NUM_INTERFACES, n, nullptr); + } +} + +int slsDetector::getNumberofUDPInterfaces() { + int retval = -1; + FILE_LOG(logDEBUG1) << "Getting number of udp interfaces"; + sendToDetector(F_GET_NUM_INTERFACES, nullptr, retval); + FILE_LOG(logDEBUG1) << "Number of udp interfaces: " << retval; + return retval; +} + +void slsDetector::selectUDPInterface(int n) { + FILE_LOG(logDEBUG1) << "Setting selected udp interface to " << n; + sendToDetector(F_SET_INTERFACE_SEL, n, nullptr); +} + +int slsDetector::getSelectedUDPInterface() { + int retval = -1; + FILE_LOG(logDEBUG1) << "Getting selected udp interface"; + sendToDetector(F_GET_INTERFACE_SEL, nullptr, retval); + FILE_LOG(logDEBUG1) << "Selected udp interface: " << retval; + return retval; } void slsDetector::setClientStreamingPort(int port) { shm()->zmqport = port; } @@ -2159,62 +2210,6 @@ int64_t slsDetector::getReceiverRealUDPSocketBufferSize() const { return retval; } -void slsDetector::setUDPConnection() { - char args[5][MAX_STR_LENGTH]{}; - char retvals[2][MAX_STR_LENGTH]{}; - FILE_LOG(logDEBUG1) << "Setting UDP Connection"; - - // called before set up - if (strcmp(shm()->rxHostname, "none") == 0) { - throw RuntimeError( - "Cannot set udp connection. Receiver hostname not set yet."); - } - - if (shm()->rxUDPIP == 0) { - // Hostname could be ip try to decode otherwise look up the hostname - shm()->rxUDPIP = shm()->rxHostname; - if (shm()->rxUDPIP == 0) { - shm()->rxUDPIP = HostnameToIp(shm()->rxHostname); - } - } - // jungfrau 2 interfaces, copy udpip if udpip2 empty - if (shm()->numUDPInterfaces == 2) { - if (shm()->rxUDPIP2 == 0) { - shm()->rxUDPIP2 = shm()->rxUDPIP; - } - } - - // copy arguments to args[][] - snprintf(args[0], sizeof(args[0]), "%d", shm()->numUDPInterfaces); - sls::strcpy_safe(args[1], getReceiverUDPIP().str()); - sls::strcpy_safe(args[2], getReceiverUDPIP2().str()); - snprintf(args[3], sizeof(args[3]), "%d", shm()->rxUDPPort); - snprintf(args[4], sizeof(args[4]), "%d", shm()->rxUDPPort2); - FILE_LOG(logDEBUG1) << "Receiver Number of UDP Interfaces: " - << shm()->numUDPInterfaces; - FILE_LOG(logDEBUG1) << "Receiver udp ip address: " << shm()->rxUDPIP; - FILE_LOG(logDEBUG1) << "Receiver udp ip address2: " << shm()->rxUDPIP2; - FILE_LOG(logDEBUG1) << "Receiver udp port: " << shm()->rxUDPPort; - FILE_LOG(logDEBUG1) << "Receiver udp port2: " << shm()->rxUDPPort2; - - if (shm()->useReceiverFlag) { - sendToReceiver(F_SETUP_RECEIVER_UDP, args, retvals); - if (strlen(retvals[0]) != 0u) { - FILE_LOG(logDEBUG1) << "Receiver UDP MAC returned : " << retvals[0]; - shm()->rxUDPMAC = retvals[0]; - } - if (strlen(retvals[1]) != 0u) { - FILE_LOG(logDEBUG1) - << "Receiver UDP MAC2 returned : " << retvals[1]; - shm()->rxUDPMAC2 = retvals[1]; - } - configureMAC(); - } else { - throw ReceiverError("setUDPConnection: Receiver is OFFLINE"); - } - FILE_LOG(logDEBUG1) << printReceiverConfiguration(); -} - int slsDetector::digitalTest(digitalTestMode mode, int ival) { int args[]{static_cast(mode), ival}; int retval = -1; @@ -2268,11 +2263,6 @@ void slsDetector::setROI(slsDetectorDefs::ROI arg) { } } - // old firmware requires configuremac after setting roi - if (shm()->myDetectorType == GOTTHARD) { - configureMAC(); - } - sendROItoReceiver(); } @@ -2805,17 +2795,30 @@ void slsDetector::updateRateCorrection() { std::string slsDetector::printReceiverConfiguration() { std::ostringstream os; - os << "#Detector " << detId << ":\n Receiver Hostname:\t" - << getReceiverHostname() << "\nDetector UDP IP (Source):\t\t" - << getDetectorIP() << "\nDetector UDP IP2 (Source):\t\t" - << getDetectorIP2() << "\nDetector UDP MAC:\t\t" << getDetectorMAC() - << "\nDetector UDP MAC2:\t\t" << getDetectorMAC2() - << "\nReceiver UDP IP:\t" << getReceiverUDPIP() - << "\nReceiver UDP IP2:\t" << getReceiverUDPIP2() - << "\nReceiver UDP MAC:\t" << getReceiverUDPMAC() - << "\nReceiver UDP MAC2:\t" << getReceiverUDPMAC2() - << "\nReceiver UDP Port:\t" << getReceiverUDPPort() - << "\nReceiver UDP Port2:\t" << getReceiverUDPPort2(); + os << "\n\nDetector " << detId << "\nReceiver Hostname:\t" + << getReceiverHostname(); + + if (shm()->myDetectorType == JUNGFRAU) { + os << "\nNumber of Interfaces:\t" << getNumberofUDPInterfaces() + << "\nSelected Interface:\t" << getSelectedUDPInterface(); + } + + os << "\nDetector UDP IP:\t" + << getSourceUDPIP() << "\nDetector UDP MAC:\t" + << getSourceUDPMAC() << "\nReceiver UDP IP:\t" + << getDestinationUDPIP() << "\nReceiver UDP MAC:\t" << getDestinationUDPMAC(); + + if (shm()->myDetectorType == JUNGFRAU) { + os << "\nDetector UDP IP2:\t" << getSourceUDPIP2() + << "\nDetector UDP MAC2:\t" << getSourceUDPMAC2() + << "\nReceiver UDP IP2:\t" << getDestinationUDPIP2() + << "\nReceiver UDP MAC2:\t" << getDestinationUDPMAC2(); + } + os << "\nReceiver UDP Port:\t" << getDestinationUDPPort(); + if (shm()->myDetectorType == JUNGFRAU || shm()->myDetectorType == EIGER) { + os << "\nReceiver UDP Port2:\t" << getDestinationUDPPort2(); + } + os << "\n"; return os.str(); } @@ -3259,9 +3262,6 @@ int slsDetector::enableTenGigabitEthernet(int value) { sendToDetector(F_ENABLE_TEN_GIGA, value, retval); FILE_LOG(logDEBUG1) << "10Gbe: " << retval; shm()->tenGigaEnable = retval; - if (value >= 0) { - configureMAC(); - } if (shm()->useReceiverFlag) { retval = -1; value = shm()->tenGigaEnable; diff --git a/slsDetectorSoftware/src/slsDetectorCommand.cpp b/slsDetectorSoftware/src/slsDetectorCommand.cpp index f0fb2348a..a21982c2c 100755 --- a/slsDetectorSoftware/src/slsDetectorCommand.cpp +++ b/slsDetectorSoftware/src/slsDetectorCommand.cpp @@ -1492,48 +1492,6 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) { descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; ++i; - /*! \page network - - rx_udpip [ip] sets/gets the ip address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-detector). Used if different from eth0. \c Returns \c (string) - */ - descrToFuncMap[i].m_pFuncName = "rx_udpip"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; - ++i; - - /*! \page network - - rx_udpip2 [ip] sets/gets the ip address of the second receiver UDP interface where the data from the top half module of the detector will be streamed to. Normally used for single detectors (Can be multi-detector). Used if different from eth0. JUNGFRAU only. \c Returns \c (string) - */ - descrToFuncMap[i].m_pFuncName = "rx_udpip2"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; - ++i; - - /*! \page network - - rx_udpmac [mac] sets/gets the mac address of the receiver UDP interface where the data from the detector will be streamed to. Normally used for single detectors (Can be multi-detector). \c Returns \c (string) - */ - descrToFuncMap[i].m_pFuncName = "rx_udpmac"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; - ++i; - - /*! \page network - - rx_udpmac2 [mac] sets/gets the mac address of the second receiver UDP interface where the data from the top half module of the detector will be streamed to. Normally used for single detectors (Can be multi-detector). JUNGFRAU only.\c Returns \c (string) - */ - descrToFuncMap[i].m_pFuncName = "rx_udpmac2"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; - ++i; - - /*! \page network - - rx_udpport [port] sets/gets the port of the receiver UDP interface where the data from the detector will be streamed to. Use single-detector command. \c Returns \c (int) - */ - descrToFuncMap[i].m_pFuncName = "rx_udpport"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; - ++i; - - /*! \page network - - rx_udpport2 [port] sets/gets the second port of the receiver UDP interface where the data from the second half of the detector will be streamed to. Use single-detector command. For Eiger, it is the right half and for Jungfrau, it is the top half module. \c Returns \c (int) - */ - descrToFuncMap[i].m_pFuncName = "rx_udpport2"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; - ++i; - /*! \page network - rx_udpsocksize [size] sets/gets the UDP socket buffer size. Already trying to set by default to 100mb, 2gb for Jungfrau. Does not remember in client shared memory, so must be initialized each time after setting receiver hostname in config file.\c Returns \c (int) */ @@ -1548,48 +1506,6 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) { descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; ++i; - /*! \page network - - detectormac [mac] sets/gets the mac address of the detector UDP interface from where the detector will stream data. Use single-detector command. Normally unused. \c Returns \c (string) - */ - descrToFuncMap[i].m_pFuncName = "detectormac"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; - ++i; - - /*! \page network - - detectormac2 [mac] sets/gets the mac address of the second half of the detector UDP interface from where the top half module of the detector will stream data. Use single-detector command. Normally unused. JUNGFRAU only. \c Returns \c (string) - */ - descrToFuncMap[i].m_pFuncName = "detectormac2"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; - ++i; - - /*! \page network - - detectorip [ip] sets/gets the ip address of the detector UDP interface from where the detector will stream data. Use single-detector command. Keep in same subnet as rx_udpip (if rx_udpip specified). \c Returns \c (string) - */ - descrToFuncMap[i].m_pFuncName = "detectorip"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; - ++i; - - /*! \page network - - detectorip2 [ip] sets/gets the ip address of the top half of the detector UDP interface from where the top half of the detector will stream data. Use single-detector command. Keep in same subnet as rx_udpip2 (if rx_udpip2 specified). JUNGFRAU only. \c Returns \c (string) - */ - descrToFuncMap[i].m_pFuncName = "detectorip2"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; - ++i; - - /*! \page network - - numinterfaces [n] sets/gets the number of interfaces used to stream out from the detector. Options: 1(default), 2. JUNGFRAU only. \c Returns \c (int) - */ - descrToFuncMap[i].m_pFuncName = "numinterfaces"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; - ++i; - - /*! \page network - - selinterface [n] sets/gets interface to use to stream data out of the detector. Options: 0 (outer, default), 1(inner). Effective only when \c numinterfaces is 1. JUNGFRAU only. \c Returns \c (int) - */ - descrToFuncMap[i].m_pFuncName = "selinterface"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; - ++i; - /*! \page network - txndelay_left [delay] sets/gets the transmission delay of first packet in an image being streamed out from the detector's left UDP port. Use single-detector command. Used for EIGER only. \c Returns \c (int) */ @@ -1653,13 +1569,6 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) { descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter; i++; - /*! \page network - - configuremac [i] configures the MAC of the detector with these parameters: detectorip, detectormac, rx_udpip, rx_udpmac, rx_udpport, rx_udpport2 (if applicable). This command is already included in \c rx_hsotname. Only put!. \c Returns \c (int) - */ - descrToFuncMap[i].m_pFuncName = "configuremac"; - descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdConfigureMac; - ++i; - /*! \page network - rx_tcpport [port] sets/gets the port of the client-receiver TCP interface. Use single-detector command. Is different for each detector if same \c rx_hostname used. Must be first command to communicate with receiver. \c Returns \c (int) */ @@ -2574,88 +2483,12 @@ std::string slsDetectorCommand::cmdNetworkParameter(int narg, const char * const if (action == HELP_ACTION) return helpNetworkParameter(action); - if (cmd == "detectormac") { - if (action == PUT_ACTION) { - myDet->setDetectorMAC(args[1], detPos); - } - return myDet->getDetectorMAC(detPos); - } else if (cmd == "detectormac2") { - if (action == PUT_ACTION) { - myDet->setDetectorMAC2(args[1], detPos); - } - return myDet->getDetectorMAC2(detPos); - } else if (cmd == "detectorip") { - if (action == PUT_ACTION) { - myDet->setDetectorIP(args[1], detPos); - } - return myDet->getDetectorIP(detPos); - } else if (cmd == "detectorip2") { - if (action == PUT_ACTION) { - myDet->setDetectorIP2(args[1], detPos); - } - return myDet->getDetectorIP2(detPos); - } else if (cmd == "rx_hostname") { + if (cmd == "rx_hostname") { if (action == PUT_ACTION) { myDet->setReceiverHostname(args[1], detPos); } return myDet->getReceiverHostname(detPos); - } else if (cmd == "rx_udpip") { - if (action == PUT_ACTION) { - myDet->setReceiverUDPIP(args[1], detPos); - } - return myDet->getReceiverUDPIP(detPos); - } else if (cmd == "rx_udpip2") { - if (action == PUT_ACTION) { - myDet->setReceiverUDPIP2(args[1], detPos); - } - return myDet->getReceiverUDPIP2(detPos); - } else if (cmd == "rx_udpmac") { - if (action == PUT_ACTION) { - myDet->setReceiverUDPMAC(args[1], detPos); - } - return myDet->getReceiverUDPMAC(detPos); - } else if (cmd == "rx_udpmac2") { - if (action == PUT_ACTION) { - myDet->setReceiverUDPMAC2(args[1], detPos); - } - return myDet->getReceiverUDPMAC2(detPos); - } else if (cmd == "rx_udpport") { - if (action == PUT_ACTION) { - if (!(sscanf(args[1], "%d", &i))) { - return ("cannot parse argument") + std::string(args[1]); - } - myDet->setReceiverUDPPort(i, detPos); - } - sprintf(ans, "%d", myDet->getReceiverUDPPort(detPos)); - return ans; - } else if (cmd == "rx_udpport2") { - if (action == PUT_ACTION) { - if (!(sscanf(args[1], "%d", &i))) { - return ("cannot parse argument") + std::string(args[1]); - } - myDet->setReceiverUDPPort2(i, detPos); - } - sprintf(ans, "%d", myDet->getReceiverUDPPort2(detPos)); - return ans; - } else if (cmd == "numinterfaces") { - if (action == PUT_ACTION) { - if (!(sscanf(args[1], "%d", &i))) { - return ("cannot parse argument") + std::string(args[1]); - } - myDet->setNumberofUDPInterfaces(i, detPos); - } - sprintf(ans, "%d", myDet->getNumberofUDPInterfaces(detPos)); - return ans; - } else if (cmd == "selinterface") { - if (action == PUT_ACTION) { - if (!(sscanf(args[1], "%d", &i))) { - return ("cannot parse argument") + std::string(args[1]); - } - myDet->selectUDPInterface(i, detPos); - } - sprintf(ans, "%d", myDet->getSelectedUDPInterface(detPos)); - return ans; - } else if (cmd == "rx_udpsocksize") { + } else if (cmd == "rx_udpsocksize") { if (action == PUT_ACTION) { int64_t ival = -1; if (!(sscanf(args[1], "%ld", &ival))) { @@ -2748,19 +2581,8 @@ std::string slsDetectorCommand::helpNetworkParameter(int action) { std::ostringstream os; if (action == PUT_ACTION || action == HELP_ACTION) { - os << "detectormac mac \n sets detector mac to mac" << std::endl; - os << "detectormac2 mac \n sets detector mac of 2nd udp interface to mac. Jungfrau only" << std::endl; - os << "detectorip ip \n sets detector ip to ip" << std::endl; - os << "detectorip2 ip \n sets detector ip of 2nd udp interface to ip. Jungfrau only" << std::endl; + os << "rx_hostname name \n sets receiver ip/hostname to name" << std::endl; - os << "rx_udpip ip \n sets receiver udp ip to ip" << std::endl; - os << "rx_udpip2 ip \n sets receiver udp ip of 2nd udp interface to ip. Jungfrau only" << std::endl; - os << "rx_udpmac mac \n sets receiver udp mac to mac" << std::endl; - os << "rx_udpmac2 mac \n sets receiver udp mac of 2nd udp interface to mac. Jungfrau only." << 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 right half and for Jungfrau, it is the top half module and for other detectors, same as rx_udpport" << std::endl; - os << "numinterfaces n \n sets the number of interfaces to n used to stream out from the detector. Options: 1 (default), 2. JUNGFRAU only. " << std::endl; - os << "selinterface n \n sets interface to use to stream data out of the detector. Options: 0 (outer, default), 1(inner). Effective only when numinterfaces is 1. JUNGFRAU only. " << 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; @@ -2788,19 +2610,7 @@ std::string slsDetectorCommand::helpNetworkParameter(int action) { << std::endl; } if (action == GET_ACTION || action == HELP_ACTION) { - os << "detectormac \n gets detector mac " << std::endl; - os << "detectormac2 \n gets detector mac of 2nd udp interface. Jungfrau only" << std::endl; - os << "detectorip \n gets detector ip " << std::endl; - os << "detectorip2 \n gets detector ip of 2nd udp interface. Jungfrau only" << std::endl; os << "rx_hostname \n gets receiver ip " << std::endl; - os << "rx_udpmac \n gets receiver udp mac " << std::endl; - os << "rx_udpmac2 \n gets receiver udp mac of 2nd udp interface. Jungfrau only" << std::endl; - os << "rx_udpip \n gets receiver udp mac " << std::endl; - os << "rx_udpip2 \n gets receiver udp mac of 2nd udp interface. Jungfrau only" << std::endl; - os << "rx_udpport \n gets receiver udp port " << std::endl; - os << "rx_udpport2 \n gets receiver udp port of 2nd udp interface. For Eiger, it is the right half and for Jungfrau, it is the top half module and for other detectors, same as rx_udpport" << std::endl; - os << "numinterfaces \n gets the number of interfaces to n used to stream out from the detector. Options: 1 (default), 2. JUNGFRAU only. " << std::endl; - os << "selinterface \n gets interface to use to stream data out of the detector. Options: 0 (outer, default), 1(inner). Effective only when numinterfaces is 1. JUNGFRAU only. " << 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; @@ -2937,30 +2747,6 @@ std::string slsDetectorCommand::helpOnline(int action) { return os.str(); } -std::string slsDetectorCommand::cmdConfigureMac(int narg, const char * const args[], int action, int detPos) { - - if (action == HELP_ACTION) { - return helpConfigureMac(action); - } - if (action == PUT_ACTION) { - myDet->configureMAC(detPos); - } else - return std::string("Cannot get ") + cmd; - - return std::string("successful"); -} - -std::string slsDetectorCommand::helpConfigureMac(int action) { - - std::ostringstream os; - if (action == PUT_ACTION || action == HELP_ACTION) - os << "configuremac i \n configures the MAC of the detector." << std::endl; - if (action == GET_ACTION || action == HELP_ACTION) - os << "configuremac " - << "Cannot get " << std::endl; - - return os.str(); -} std::string slsDetectorCommand::cmdDetectorSize(int narg, const char * const args[], int action, int detPos) { @@ -4534,8 +4320,7 @@ std::string slsDetectorCommand::cmdConfiguration(int narg, const char * const ar } else if (cmd == "rx_printconfig") { if (action == PUT_ACTION) return std::string("cannot put"); - FILE_LOG(logINFO) << myDet->printReceiverConfiguration(detPos); - return std::string(""); + return myDet->printReceiverConfiguration(detPos); } else if (cmd == "parameters") { if (action == PUT_ACTION) { sval = std::string(args[1]); diff --git a/slsReceiverSoftware/include/Listener.h b/slsReceiverSoftware/include/Listener.h index efdb3a1e6..ad6490357 100755 --- a/slsReceiverSoftware/include/Listener.h +++ b/slsReceiverSoftware/include/Listener.h @@ -40,7 +40,7 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { * @param sm pointer to silent mode */ Listener(int ind, detectorType dtype, Fifo* f, std::atomic* s, - uint32_t* portno, char* e, uint64_t* nf, uint32_t* dr, + uint32_t* portno, std::string* e, uint64_t* nf, uint32_t* dr, int64_t* us, int64_t* as, uint32_t* fpf, frameDiscardPolicy* fdp, bool* act, bool* depaden, bool* sm); @@ -222,7 +222,7 @@ class Listener : private virtual slsDetectorDefs, public ThreadObject { uint32_t* udpPortNumber; /** ethernet interface */ - char* eth; + std::string* eth; /** Number of Images to catch */ uint64_t* numImages; diff --git a/slsReceiverSoftware/include/slsReceiverImplementation.h b/slsReceiverSoftware/include/slsReceiverImplementation.h index 186e5458f..cba2ecbde 100755 --- a/slsReceiverSoftware/include/slsReceiverImplementation.h +++ b/slsReceiverSoftware/include/slsReceiverImplementation.h @@ -503,15 +503,15 @@ class slsReceiverImplementation : private virtual slsDetectorDefs { /** * Set Ethernet Interface to listen to - * @param c ethernet inerface eg. eth0 (max of 1000 characters) + * @param c ethernet inerface eg. eth0 */ - void setEthernetInterface(const char *c); + void setEthernetInterface(const std::string &c); /** * Set second Ethernet Interface to listen to (jungfrau specific) - * @param c second ethernet inerface eg. eth0 (max of 1000 characters) + * @param c second ethernet inerface eg. eth0 */ - void setEthernetInterface2(const char *c); + void setEthernetInterface2(const std::string &c); /** * Set number of UDP Interfaces (jungfrau specific) @@ -933,7 +933,7 @@ class slsReceiverImplementation : private virtual slsDetectorDefs { /** Number of UDP Interfaces */ int numUDPInterfaces; /** Ethernet Interface */ - char eth[MAX_NUMBER_OF_LISTENING_THREADS][MAX_STR_LENGTH]; + std::vector eth; /** Server UDP Port Number*/ uint32_t udpPortNum[MAX_NUMBER_OF_LISTENING_THREADS]; /** udp socket buffer size */ diff --git a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h index da40e9ca6..1a0f72411 100755 --- a/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h +++ b/slsReceiverSoftware/include/slsReceiverTCPIPInterface.h @@ -159,9 +159,6 @@ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs { /** set roi */ int set_roi(sls::ServerInterface2 &socket); - /** Set up UDP Details */ - int setup_udp(sls::ServerInterface2 &socket); - /** set acquisition period, frame number etc */ int set_timer(sls::ServerInterface2 &socket); @@ -300,6 +297,22 @@ class slsReceiverTCPIPInterface : private virtual slsDetectorDefs { /** read n lines */ int set_read_n_lines(sls::ServerInterface2 &socket); + /** set udp ip */ + int set_udp_ip(sls::ServerInterface2 &socket); + + /** set udp ip2 */ + int set_udp_ip2(sls::ServerInterface2 &socket); + + /** set udp port */ + int set_udp_port(sls::ServerInterface2 &socket); + + /** set udp port2 */ + int set_udp_port2(sls::ServerInterface2 &socket); + + /** set number of udp interfaces */ + int set_num_interfaces(sls::ServerInterface2 &socket); + + /** detector type */ detectorType myDetectorType; diff --git a/slsReceiverSoftware/src/Listener.cpp b/slsReceiverSoftware/src/Listener.cpp index e1deb6ba8..9a00c41f5 100755 --- a/slsReceiverSoftware/src/Listener.cpp +++ b/slsReceiverSoftware/src/Listener.cpp @@ -21,7 +21,7 @@ const std::string Listener::TypeName = "Listener"; Listener::Listener(int ind, detectorType dtype, Fifo* f, std::atomic* s, - uint32_t* portno, char* e, uint64_t* nf, uint32_t* dr, + uint32_t* portno, std::string* e, uint64_t* nf, uint32_t* dr, int64_t* us, int64_t* as, uint32_t* fpf, frameDiscardPolicy* fdp, bool* act, bool* depaden, bool* sm) : ThreadObject(ind), @@ -187,10 +187,10 @@ int Listener::CreateUDPSockets() { } //if eth is mistaken with ip address - if (strchr(eth,'.') != nullptr){ - memset(eth, 0, MAX_STR_LENGTH); + if ((*eth).find('.') != std::string::npos) { + (*eth) = ""; } - if(!strlen(eth)){ + if (!(*eth).length()) { FILE_LOG(logWARNING) << "eth is empty. Listening to all"; } @@ -198,7 +198,7 @@ int Listener::CreateUDPSockets() { try{ udpSocket = sls::make_unique(*udpPortNumber, genericSocket::UDP, - generalData->packetSize, (strlen(eth)?eth:nullptr), generalData->headerPacketSize, + generalData->packetSize, ((*eth).length() ? (*eth).c_str() : nullptr), generalData->headerPacketSize, *udpSocketBufferSize); FILE_LOG(logINFO) << index << ": UDP port opened at port " << *udpPortNumber; } catch (...) { @@ -244,14 +244,14 @@ int Listener::CreateDummySocketForUDPSocketBufferSize(int64_t s) { *udpSocketBufferSize = s; //if eth is mistaken with ip address - if (strchr(eth,'.') != nullptr){ - memset(eth, 0, MAX_STR_LENGTH); - } + if ((*eth).find('.') != std::string::npos) { + (*eth) = ""; + } //create dummy socket try { genericSocket g(*udpPortNumber, genericSocket::UDP, - generalData->packetSize, (strlen(eth)?eth:nullptr), generalData->headerPacketSize, + generalData->packetSize, ((*eth).length() ? (*eth).c_str() : nullptr), generalData->headerPacketSize, *udpSocketBufferSize); // doubled due to kernel bookkeeping (could also be less due to permissions) diff --git a/slsReceiverSoftware/src/slsReceiverImplementation.cpp b/slsReceiverSoftware/src/slsReceiverImplementation.cpp index f6d97e141..55d8189f1 100755 --- a/slsReceiverSoftware/src/slsReceiverImplementation.cpp +++ b/slsReceiverSoftware/src/slsReceiverImplementation.cpp @@ -86,8 +86,8 @@ void slsReceiverImplementation::InitializeMembers() { //***connection parameters*** numUDPInterfaces = 1; + eth.resize(MAX_NUMBER_OF_LISTENING_THREADS); for (int i = 0; i < MAX_NUMBER_OF_LISTENING_THREADS; i++) { - strcpy(eth[i], ""); udpPortNum[i] = DEFAULT_UDP_PORTNO + i; } udpSocketBufferSize = 0; @@ -285,12 +285,12 @@ uint32_t slsReceiverImplementation::getUDPPortNumber2() const { std::string slsReceiverImplementation::getEthernetInterface() const { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; - return std::string(eth[0]); + return eth[0]; } std::string slsReceiverImplementation::getEthernetInterface2() const { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; - return std::string(eth[1]); + return eth[1]; } int slsReceiverImplementation::getNumberofUDPInterfaces() const { @@ -677,17 +677,17 @@ void slsReceiverImplementation::setUDPPortNumber2(const uint32_t i) { FILE_LOG(logINFO) << "UDP Port Number[1]: " << udpPortNum[1]; } -void slsReceiverImplementation::setEthernetInterface(const char *c) { +void slsReceiverImplementation::setEthernetInterface(const std::string &c) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; - strcpy(eth[0], c); + eth[0] = c; FILE_LOG(logINFO) << "Ethernet Interface: " << eth[0]; } -void slsReceiverImplementation::setEthernetInterface2(const char *c) { +void slsReceiverImplementation::setEthernetInterface2(const std::string &c) { FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called"; - strcpy(eth[1], c); + eth[1] = c; FILE_LOG(logINFO) << "Ethernet Interface 2: " << eth[1]; } @@ -725,7 +725,7 @@ int slsReceiverImplementation::setNumberofUDPInterfaces(const int n) { auto fifo_ptr = fifo[i].get(); listener.push_back(sls::make_unique( i, myDetectorType, fifo_ptr, &status, &udpPortNum[i], - eth[i], &numberOfFrames, &dynamicRange, + ð[i], &numberOfFrames, &dynamicRange, &udpSocketBufferSize, &actualUDPSocketBufferSize, &framesPerFile, &frameDiscardMode, &activated, &deactivatedPaddingEnable, &silentMode)); @@ -1167,7 +1167,7 @@ int slsReceiverImplementation::setDetectorType(const detectorType d) { try { auto fifo_ptr = fifo[i].get(); listener.push_back(sls::make_unique( - i, myDetectorType, fifo_ptr, &status, &udpPortNum[i], eth[i], + i, myDetectorType, fifo_ptr, &status, &udpPortNum[i], ð[i], &numberOfFrames, &dynamicRange, &udpSocketBufferSize, &actualUDPSocketBufferSize, &framesPerFile, &frameDiscardMode, &activated, &deactivatedPaddingEnable, &silentMode)); diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp index 125a4e9dd..eec9ebaad 100755 --- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp +++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp @@ -156,7 +156,6 @@ int slsReceiverTCPIPInterface::function_table(){ 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; @@ -202,6 +201,11 @@ int slsReceiverTCPIPInterface::function_table(){ flist[F_RECEIVER_DBIT_OFFSET] = &slsReceiverTCPIPInterface::set_dbit_offset; flist[F_SET_RECEIVER_QUAD] = &slsReceiverTCPIPInterface::set_quad_type; flist[F_SET_RECEIVER_READ_N_LINES] = &slsReceiverTCPIPInterface::set_read_n_lines; + flist[F_SET_RECEIVER_UDP_IP] = &slsReceiverTCPIPInterface::set_udp_ip; + flist[F_SET_RECEIVER_UDP_IP2] = &slsReceiverTCPIPInterface::set_udp_ip2; + flist[F_SET_RECEIVER_UDP_PORT] = &slsReceiverTCPIPInterface::set_udp_port; + flist[F_SET_RECEIVER_UDP_PORT2] = &slsReceiverTCPIPInterface::set_udp_port2; + flist[F_SET_RECEIVER_NUM_INTERFACES] = &slsReceiverTCPIPInterface::set_num_interfaces; for (int i = NUM_DET_FUNCTIONS + 1; i < NUM_REC_FUNCTIONS ; i++) { FILE_LOG(logDEBUG1) << "function fnum: " << i << " (" << @@ -524,102 +528,6 @@ int slsReceiverTCPIPInterface::set_roi(Interface &socket) { return socket.Send(OK); } -int slsReceiverTCPIPInterface::setup_udp(Interface &socket) { - ret = OK; - char args[5][MAX_STR_LENGTH]{}; - char retvals[2][MAX_STR_LENGTH]{}; - socket.Receive(args); - VerifyIdle(socket); - - // setup interfaces count - int numInterfaces = atoi(args[0]) > 1 ? 2 : 1; - char *ip1 = args[1]; - char *ip2 = args[2]; - uint32_t port1 = atoi(args[3]); - uint32_t port2 = atoi(args[4]); - - // 1st interface - impl()->setUDPPortNumber(port1); - if (myDetectorType == EIGER) { - impl()->setUDPPortNumber2(port2); - } - FILE_LOG(logINFO) << "Receiver UDP IP: " << ip1; - // get eth - std::string temp = sls::IpToInterfaceName(ip1); - if (temp == "none") { - throw RuntimeError("Failed to get ethernet interface or IP"); - } else { - char eth[MAX_STR_LENGTH]{}; - sls::strcpy_safe(eth, temp.c_str()); - // if there is a dot in eth name - if (strchr(eth, '.') != nullptr) { - sls::strcpy_safe(eth, ""); - FILE_LOG(logERROR) - << "Failed to get ethernet interface from IP. Got " << temp - << '\n'; - } - impl()->setEthernetInterface(eth); - if (myDetectorType == EIGER) { - impl()->setEthernetInterface2(eth); - } - // get mac address - if (ret != FAIL) { - temp = sls::InterfaceNameToMac(eth).str(); - if (temp == "00:00:00:00:00:00") { - throw RuntimeError("failed to get mac adddress to listen to\n"); - } else { - sls::strcpy_safe(retvals[0], temp.c_str()); - FILE_LOG(logINFO) << "Receiver MAC Address: " << retvals[0]; - } - } - } - - // 2nd interface - if (myDetectorType == JUNGFRAU && numInterfaces == 2) { - impl()->setUDPPortNumber2(port2); - FILE_LOG(logINFO) << "Receiver UDP IP 2: " << ip2; - // get eth - temp = sls::IpToInterfaceName(ip2); - if (temp == "none") { - throw RuntimeError("Failed to get 2nd ethernet interface or IP"); - } else { - char eth[MAX_STR_LENGTH]{}; - memset(eth, 0, MAX_STR_LENGTH); - sls::strcpy_safe(eth, temp.c_str()); - // if there is a dot in eth name - if (strchr(eth, '.') != nullptr) { - sls::strcpy_safe(eth, ""); - FILE_LOG(logERROR) - << "Failed to get 2nd ethernet interface from IP. Got " - << temp << '\n'; - } - impl()->setEthernetInterface2(eth); - - // get mac address - if (ret != FAIL) { - temp = sls::InterfaceNameToMac(eth).str(); - if (temp == "00:00:00:00:00:00") { - throw RuntimeError( - "failed to get 2nd mac adddress to listen to"); - FILE_LOG(logERROR) << mess; - } else { - sls::strcpy_safe(retvals[1], temp.c_str()); - FILE_LOG(logINFO) - << "Receiver MAC Address 2: " << retvals[1]; - } - } - } - } - - // set the number of udp interfaces (changes number of threads and many - // others) - if (myDetectorType == JUNGFRAU && - impl()->setNumberofUDPInterfaces(numInterfaces) == FAIL) { - throw RuntimeError("Failed to set number of interfaces"); - } - return socket.sendResult(ret, retvals, sizeof(retvals), mess); -} - int slsReceiverTCPIPInterface::set_timer(Interface &socket) { auto index = socket.Receive(); auto value = socket.Receive(); @@ -1324,4 +1232,92 @@ int slsReceiverTCPIPInterface::set_read_n_lines(Interface &socket) { validate(arg, retval, "set read n lines", DEC); FILE_LOG(logDEBUG1) << "read n lines retval:" << retval; return socket.Send(OK); +} + + +int slsReceiverTCPIPInterface::set_udp_ip(Interface &socket) { + auto arg = socket.Receive(); + VerifyIdle(socket); + FILE_LOG(logINFO) << "Received UDP IP: " << arg; + // getting eth + std::string eth = sls::IpToInterfaceName(arg.str()); + if (eth == "none") { + throw RuntimeError("Failed to get udp ethernet interface from IP " + arg.str()); + } + if (eth.find('.') != std::string::npos) { + eth = ""; + FILE_LOG(logERROR) << "Failed to get udp ethernet interface from IP " << arg << ". Got " << eth; + } + impl()->setEthernetInterface(eth); + if (myDetectorType == EIGER) { + impl()->setEthernetInterface2(eth); + } + // get mac address + auto retval = sls::InterfaceNameToMac(eth); + if (retval == 0) { + throw RuntimeError("Failed to get udp mac adddress to listen to\n"); + } + FILE_LOG(logINFO) << "Receiver MAC Address: " << retval; + return socket.sendResult(retval); +} + + +int slsReceiverTCPIPInterface::set_udp_ip2(Interface &socket) { + auto arg = socket.Receive(); + VerifyIdle(socket); + if (myDetectorType != JUNGFRAU) { + throw RuntimeError("UDP Destination IP2 not implemented for this detector"); + } + FILE_LOG(logINFO) << "Received UDP IP2: " << arg; + // getting eth + std::string eth = sls::IpToInterfaceName(arg.str()); + if (eth == "none") { + throw RuntimeError("Failed to get udp ethernet interface2 from IP " + arg.str()); + } + if (eth.find('.') != std::string::npos) { + eth = ""; + FILE_LOG(logERROR) << "Failed to get udp ethernet interface2 from IP " << arg << ". Got " << eth; + } + impl()->setEthernetInterface2(eth); + + // get mac address + auto retval = sls::InterfaceNameToMac(eth); + if (retval == 0) { + throw RuntimeError("Failed to get udp mac adddress2 to listen to\n"); + } + FILE_LOG(logINFO) << "Receiver MAC Address2: " << retval; + return socket.sendResult(retval); +} + +int slsReceiverTCPIPInterface::set_udp_port(Interface &socket) { + auto arg = socket.Receive(); + VerifyIdle(socket); + FILE_LOG(logDEBUG1) << "Setting UDP Port:" << arg; + impl()->setUDPPortNumber(arg); + return socket.Send(OK); +} + +int slsReceiverTCPIPInterface::set_udp_port2(Interface &socket) { + auto arg = socket.Receive(); + VerifyIdle(socket); + if (myDetectorType != JUNGFRAU && myDetectorType != EIGER) { + throw RuntimeError("UDP Destination Port2 not implemented for this detector"); + } + FILE_LOG(logDEBUG1) << "Setting UDP Port:" << arg; + impl()->setUDPPortNumber2(arg); + return socket.Send(OK); +} + +int slsReceiverTCPIPInterface::set_num_interfaces(Interface &socket) { + auto arg = socket.Receive(); + arg = (arg > 1 ? 2 : 1); + VerifyIdle(socket); + if (myDetectorType != JUNGFRAU) { + throw RuntimeError("Number of interfaces not implemented for this detector"); + } + FILE_LOG(logDEBUG1) << "Setting Number of UDP Interfaces:" << arg; + if (impl()->setNumberofUDPInterfaces(arg) == FAIL) { + throw RuntimeError("Failed to set number of interfaces"); + } + return socket.Send(OK); } \ No newline at end of file diff --git a/slsSupportLib/include/sls_detector_funcs.h b/slsSupportLib/include/sls_detector_funcs.h index d8b8789ba..4271dc68d 100755 --- a/slsSupportLib/include/sls_detector_funcs.h +++ b/slsSupportLib/include/sls_detector_funcs.h @@ -41,7 +41,6 @@ enum detFuncs{ F_GET_LAST_CLIENT_IP, /**< returns the IP of the client last connected to the detector */ F_SET_PORT, /**< Changes communication port of the server */ F_UPDATE_CLIENT, /**< Returns all the important parameters to update the shared memory of the client */ - F_CONFIGURE_MAC, /**< Configures MAC */ F_ENABLE_TEN_GIGA, /**< enable 10Gbe */ F_SET_ALL_TRIMBITS, /** < set all trimbits to this value */ F_SET_PATTERN_IO_CONTROL, /** < set pattern i/o control */ @@ -92,6 +91,31 @@ enum detFuncs{ F_GET_INTERRUPT_SUBFRAME, F_SET_READ_N_LINES, F_GET_READ_N_LINES, + F_SET_POSITION, + F_SET_SOURCE_UDP_MAC, + F_GET_SOURCE_UDP_MAC, + F_SET_SOURCE_UDP_MAC2, + F_GET_SOURCE_UDP_MAC2, + F_SET_SOURCE_UDP_IP, + F_GET_SOURCE_UDP_IP, + F_SET_SOURCE_UDP_IP2, + F_GET_SOURCE_UDP_IP2, + F_SET_DEST_UDP_MAC, + F_GET_DEST_UDP_MAC, + F_SET_DEST_UDP_MAC2, + F_GET_DEST_UDP_MAC2, + F_SET_DEST_UDP_IP, + F_GET_DEST_UDP_IP, + F_SET_DEST_UDP_IP2, + F_GET_DEST_UDP_IP2, + F_SET_DEST_UDP_PORT, + F_GET_DEST_UDP_PORT, + F_SET_DEST_UDP_PORT2, + F_GET_DEST_UDP_PORT2, + F_SET_NUM_INTERFACES, + F_GET_NUM_INTERFACES, + F_SET_INTERFACE_SEL, + F_GET_INTERFACE_SEL, F_SET_PARALLEL_MODE, F_GET_PARALLEL_MODE, F_SET_OVERFLOW_MODE, @@ -113,7 +137,6 @@ enum detFuncs{ F_GET_RECEIVER_TYPE, /**< return receiver type */ F_SEND_RECEIVER_DETHOSTNAME, /**< set detector hostname to receiver */ F_RECEIVER_SET_ROI, /**< Sets receiver ROI */ - F_SETUP_RECEIVER_UDP, /**< sets the receiver udp connection and returns receiver mac address */ F_SET_RECEIVER_TIMER, /**< set/get timer value */ F_SET_RECEIVER_DYNAMIC_RANGE, /**< set/get detector dynamic range */ F_RECEIVER_STREAMING_FREQUENCY, /**< sets the frequency of receiver sending frames to gui */ @@ -159,6 +182,11 @@ enum detFuncs{ F_RECEIVER_DBIT_OFFSET, /** < set/get reciever digital bit offset */ F_SET_RECEIVER_QUAD, F_SET_RECEIVER_READ_N_LINES, + F_SET_RECEIVER_UDP_IP, + F_SET_RECEIVER_UDP_IP2, + F_SET_RECEIVER_UDP_PORT, + F_SET_RECEIVER_UDP_PORT2, + F_SET_RECEIVER_NUM_INTERFACES, NUM_REC_FUNCTIONS }; @@ -196,7 +224,6 @@ static const char* getFunctionNameFromEnum(enum detFuncs func) { case F_GET_LAST_CLIENT_IP: return "F_GET_LAST_CLIENT_IP"; case F_SET_PORT: return "F_SET_PORT"; case F_UPDATE_CLIENT: return "F_UPDATE_CLIENT"; - case F_CONFIGURE_MAC: return "F_CONFIGURE_MAC"; case F_ENABLE_TEN_GIGA: return "F_ENABLE_TEN_GIGA"; case F_SET_ALL_TRIMBITS: return "F_SET_ALL_TRIMBITS"; case F_SET_PATTERN_IO_CONTROL: return "F_SET_PATTERN_IO_CONTROL"; @@ -247,6 +274,31 @@ static const char* getFunctionNameFromEnum(enum detFuncs func) { case F_GET_INTERRUPT_SUBFRAME: return "F_GET_INTERRUPT_SUBFRAME"; case F_SET_READ_N_LINES: return "F_SET_READ_N_LINES"; case F_GET_READ_N_LINES: return "F_GET_READ_N_LINES"; + case F_SET_POSITION: return "F_SET_POSITION"; + case F_SET_SOURCE_UDP_MAC: return "F_SET_SOURCE_UDP_MAC"; + case F_GET_SOURCE_UDP_MAC: return "F_GET_SOURCE_UDP_MAC"; + case F_SET_SOURCE_UDP_MAC2: return "F_SET_SOURCE_UDP_MAC2"; + case F_GET_SOURCE_UDP_MAC2: return "F_GET_SOURCE_UDP_MAC2"; + case F_SET_SOURCE_UDP_IP: return "F_SET_SOURCE_UDP_IP"; + case F_GET_SOURCE_UDP_IP: return "F_GET_SOURCE_UDP_IP"; + case F_SET_SOURCE_UDP_IP2: return "F_SET_SOURCE_UDP_IP2"; + case F_GET_SOURCE_UDP_IP2: return "F_GET_SOURCE_UDP_IP2"; + case F_SET_DEST_UDP_MAC: return "F_SET_DEST_UDP_MAC"; + case F_GET_DEST_UDP_MAC: return "F_GET_DEST_UDP_MAC"; + case F_SET_DEST_UDP_MAC2: return "F_SET_DEST_UDP_MAC2"; + case F_GET_DEST_UDP_MAC2: return "F_GET_DEST_UDP_MAC2"; + case F_SET_DEST_UDP_IP: return "F_SET_DEST_UDP_IP"; + case F_GET_DEST_UDP_IP: return "F_GET_DEST_UDP_IP"; + case F_SET_DEST_UDP_IP2: return "F_SET_DEST_UDP_IP2"; + case F_GET_DEST_UDP_IP2: return "F_GET_DEST_UDP_IP2"; + case F_SET_DEST_UDP_PORT: return "F_SET_DEST_UDP_PORT"; + case F_GET_DEST_UDP_PORT: return "F_GET_DEST_UDP_PORT"; + case F_SET_DEST_UDP_PORT2: return "F_SET_DEST_UDP_PORT2"; + case F_GET_DEST_UDP_PORT2: return "F_GET_DEST_UDP_PORT2"; + case F_SET_NUM_INTERFACES: return "F_SET_NUM_INTERFACES"; + case F_GET_NUM_INTERFACES: return "F_GET_NUM_INTERFACES"; + case F_SET_INTERFACE_SEL: return "F_SET_INTERFACE_SEL"; + case F_GET_INTERFACE_SEL: return "F_GET_INTERFACE_SEL"; case F_SET_PARALLEL_MODE: return "F_SET_PARALLEL_MODE"; case F_GET_PARALLEL_MODE: return "F_GET_PARALLEL_MODE"; case F_SET_OVERFLOW_MODE: return "F_SET_OVERFLOW_MODE"; @@ -268,7 +320,6 @@ static const char* getFunctionNameFromEnum(enum detFuncs func) { case F_GET_RECEIVER_TYPE: return "F_GET_RECEIVER_TYPE"; case F_SEND_RECEIVER_DETHOSTNAME: return "F_SEND_RECEIVER_DETHOSTNAME"; case F_RECEIVER_SET_ROI: return "F_RECEIVER_SET_ROI"; - case F_SETUP_RECEIVER_UDP: return "F_SETUP_RECEIVER_UDP"; case F_SET_RECEIVER_TIMER: return "F_SET_RECEIVER_TIMER"; case F_SET_RECEIVER_DYNAMIC_RANGE: return "F_SET_RECEIVER_DYNAMIC_RANGE"; case F_RECEIVER_STREAMING_FREQUENCY: return "F_RECEIVER_STREAMING_FREQUENCY"; @@ -314,6 +365,11 @@ static const char* getFunctionNameFromEnum(enum detFuncs func) { case F_RECEIVER_DBIT_OFFSET: return "F_RECEIVER_DBIT_OFFSET"; case F_SET_RECEIVER_QUAD: return "F_SET_RECEIVER_QUAD"; case F_SET_RECEIVER_READ_N_LINES: return "F_SET_RECEIVER_READ_N_LINES"; + case F_SET_RECEIVER_UDP_IP: return "F_SET_RECEIVER_UDP_IP"; + case F_SET_RECEIVER_UDP_IP2: return "F_SET_RECEIVER_UDP_IP2"; + case F_SET_RECEIVER_UDP_PORT: return "F_SET_RECEIVER_UDP_PORT"; + case F_SET_RECEIVER_UDP_PORT2: return "F_SET_RECEIVER_UDP_PORT2"; + case F_SET_RECEIVER_NUM_INTERFACES: return "F_SET_RECEIVER_NUM_INTERFACES"; case NUM_REC_FUNCTIONS: return "NUM_REC_FUNCTIONS"; default: return "Unknown Function"; diff --git a/slsSupportLib/include/versionAPI.h b/slsSupportLib/include/versionAPI.h index 23570536f..5921be8d1 100644 --- a/slsSupportLib/include/versionAPI.h +++ b/slsSupportLib/include/versionAPI.h @@ -4,9 +4,9 @@ #define APIRECEIVER 0x190722 #define APIGUI 0x190723 #define APIMOENCH 0x190820 -#define APICTB 0x190902 -#define APIGOTTHARD 0x190902 -#define APIJUNGFRAU 0x190902 -#define APIEIGER 0x190902 -#define APIGOTTHARD2 0x190927 +#define APIJUNGFRAU 0x190927 +#define APIGOTTHARD 0x190927 #define APIMYTHEN3 0x190930 +#define APIEIGER 0x190926 +#define APIGOTTHARD2 0x190927 +#define APICTB 0x190927