diff --git a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c
index 4e8b39684..70185def6 100644
--- a/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c
+++ b/slsDetectorServers/ctbDetectorServer/slsDetectorFunctionList.c
@@ -1523,7 +1523,7 @@ long int calcChecksum(int sourceip, int destip) {
-int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2){
+int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport){
#ifdef VIRTUAL
return OK;
#endif
@@ -2152,6 +2152,7 @@ int stopStateMachine(){
bus_w(CONTROL_REG, bus_r(CONTROL_REG) & ~CONTROL_STP_ACQSTN_MSK);
FILE_LOG(logINFO, ("Status Register: %08x\n",bus_r(STATUS_REG)));
+
return OK;
}
diff --git a/slsDetectorServers/eigerDetectorServer/Beb.c b/slsDetectorServers/eigerDetectorServer/Beb.c
index 6ed288e9a..a97483810 100644
--- a/slsDetectorServers/eigerDetectorServer/Beb.c
+++ b/slsDetectorServers/eigerDetectorServer/Beb.c
@@ -1188,11 +1188,10 @@ void Beb_SetDetectorNumber(uint32_t detid) {
int Beb_SetDetectorPosition(int pos[]) {
if (!Beb_activated)
return OK;
- FILE_LOG(logINFO, ("Got Position values %d %d %d...\n", pos[0],pos[1], pos[2]));
+ FILE_LOG(logINFO, ("Got Position values %d %d...\n", pos[0],pos[1]));
pos[0] = Beb_swap_uint16(pos[0]);
//pos[1] = Beb_swap_uint16(pos[1]);
- pos[2] = Beb_swap_uint16(pos[2]);
int ret = FAIL;
//mapping new memory to read master top module configuration
@@ -1224,37 +1223,21 @@ int Beb_SetDetectorPosition(int pos[]) {
// y left (column)
- // overwriting z anyway, so no need to look at previous z value
int posval = Beb_swap_uint16(Beb_top ? pos[1] : (pos[1]+1));
- Beb_Write32(csp0base, UDP_HEADER_B_LEFT_OFST, ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK));
value = Beb_Read32(csp0base, UDP_HEADER_B_LEFT_OFST);
- if (value != ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK))
+ value &= UDP_HEADER_Z_MSK; // to keep previous z value
+ Beb_Write32(csp0base, UDP_HEADER_B_LEFT_OFST, value | ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK));
+ value = Beb_Read32(csp0base, UDP_HEADER_B_LEFT_OFST);
+ if ((value & UDP_HEADER_Z_MSK) != ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK))
ret = FAIL;
// y right
- // overwriting z anyway, so no need to look at previous z value
+ value = Beb_Read32(csp0base, UDP_HEADER_B_RIGHT_OFST);
+ value &= UDP_HEADER_Z_MSK; // to keep previous z value
posval = Beb_swap_uint16(Beb_top ? (pos[1]+1) : pos[1]);
- Beb_Write32(csp0base, UDP_HEADER_B_RIGHT_OFST, ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK));
+ Beb_Write32(csp0base, UDP_HEADER_B_RIGHT_OFST, value | ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK));
value = Beb_Read32(csp0base, UDP_HEADER_B_RIGHT_OFST);
- if (value != ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK))
- ret = FAIL;
-
-
-
- // z left
- value = Beb_Read32(csp0base, UDP_HEADER_B_LEFT_OFST);
- value &= UDP_HEADER_Y_MSK; // to keep previous y value
- Beb_Write32(csp0base, UDP_HEADER_B_LEFT_OFST, value | ((pos[2] << UDP_HEADER_Z_OFST) & UDP_HEADER_Z_MSK));
- value = Beb_Read32(csp0base, UDP_HEADER_B_LEFT_OFST);
- if ((value & UDP_HEADER_Z_MSK) != ((pos[2] << UDP_HEADER_Z_OFST) & UDP_HEADER_Z_MSK))
- ret = FAIL;
-
- // z right
- value = Beb_Read32(csp0base, UDP_HEADER_B_RIGHT_OFST);
- value &= UDP_HEADER_Y_MSK; // to keep previous y value
- Beb_Write32(csp0base, UDP_HEADER_B_RIGHT_OFST, value | ((pos[2] << UDP_HEADER_Z_OFST) & UDP_HEADER_Z_MSK));
- value = Beb_Read32(csp0base, UDP_HEADER_B_RIGHT_OFST);
- if ((value & UDP_HEADER_Z_MSK) != ((pos[2] << UDP_HEADER_Z_OFST) & UDP_HEADER_Z_MSK))
+ if ((value & UDP_HEADER_Z_MSK) != ((posval << UDP_HEADER_Y_OFST) & UDP_HEADER_Y_MSK))
ret = FAIL;
@@ -1263,10 +1246,10 @@ int Beb_SetDetectorPosition(int pos[]) {
}
if (ret == OK) {
FILE_LOG(logINFO, ("Position set to...\n"
- "\tLeft: [%d, %d, %d]\n"
- "\tRight:[%d, %d, %d]\n",
- Beb_swap_uint16(pos[0]), Beb_top ? pos[1] : (pos[1]+1), Beb_swap_uint16(pos[2]),
- Beb_swap_uint16(pos[0]), Beb_top ? (pos[1]+1) : pos[1], Beb_swap_uint16(pos[2])));
+ "\tLeft: [%d, %d]\n"
+ "\tRight:[%d, %d]\n",
+ Beb_swap_uint16(pos[0]), Beb_top ? pos[1] : (pos[1]+1)),
+ Beb_swap_uint16(pos[0]), Beb_top ? (pos[1]+1) : pos[1]);
}
return ret;
diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_refactor b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_refactor
index 3ccc9226c..2954eb05a 100755
Binary files a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_refactor and b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_refactor differ
diff --git a/slsDetectorServers/eigerDetectorServer/gitInfo.txt b/slsDetectorServers/eigerDetectorServer/gitInfo.txt
index 0cef631d7..5b9a3350e 100644
--- a/slsDetectorServers/eigerDetectorServer/gitInfo.txt
+++ b/slsDetectorServers/eigerDetectorServer/gitInfo.txt
@@ -1,9 +1,9 @@
Path: slsDetectorPackage/slsDetectorServers/eigerDetectorServer
URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
-Repsitory UUID: d9503bebf9aed76490b8166ef233e5ceeff97547
-Revision: 29
-Branch: refactor
+Repsitory UUID: cd5aea895b07b7af25e3fb74a341a861f9aa291c
+Revision: 30
+Branch: jungfrau
Last Changed Author: Dhanya_Thattil
-Last Changed Rev: 4465
-Last Changed Date: 2019-03-21 14:03:50.000000002 +0100 ../slsDetectorServer/ALTERA_PLL.h
+Last Changed Rev: 4473
+Last Changed Date: 2019-03-22 17:13:44.000000002 +0100 ../slsDetectorServer/slsDetectorServer_funcs.c
diff --git a/slsDetectorServers/eigerDetectorServer/gitInfoEiger.h b/slsDetectorServers/eigerDetectorServer/gitInfoEiger.h
index 980278001..540b4d733 100644
--- a/slsDetectorServers/eigerDetectorServer/gitInfoEiger.h
+++ b/slsDetectorServers/eigerDetectorServer/gitInfoEiger.h
@@ -1,6 +1,6 @@
#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
-#define GITREPUUID "d9503bebf9aed76490b8166ef233e5ceeff97547"
+#define GITREPUUID "cd5aea895b07b7af25e3fb74a341a861f9aa291c"
#define GITAUTH "Dhanya_Thattil"
-#define GITREV 0x4465
-#define GITDATE 0x20190321
-#define GITBRANCH "refactor"
+#define GITREV 0x4473
+#define GITDATE 0x20190322
+#define GITBRANCH "jungfrau"
diff --git a/slsDetectorServers/gotthardDetectorServer/gitInfo.txt b/slsDetectorServers/gotthardDetectorServer/gitInfo.txt
index b21c49227..5fbf2fea2 100644
--- a/slsDetectorServers/gotthardDetectorServer/gitInfo.txt
+++ b/slsDetectorServers/gotthardDetectorServer/gitInfo.txt
@@ -1,9 +1,9 @@
Path: slsDetectorPackage/slsDetectorServers/gotthardDetectorServer
URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
-Repsitory UUID: 0765b330f116fd47b84c065d89789f4996573f23
-Revision: 24
-Branch: refactor
+Repsitory UUID: cd5aea895b07b7af25e3fb74a341a861f9aa291c
+Revision: 26
+Branch: jungfrau
Last Changed Author: Dhanya_Thattil
-Last Changed Rev: 4381
-Last Changed Date: 2019-03-06 13:42:29.000000002 +0100 ./.target-makefrag
+Last Changed Rev: 4473
+Last Changed Date: 2019-03-22 17:13:44.000000002 +0100 ../slsDetectorServer/slsDetectorServer_funcs.c
diff --git a/slsDetectorServers/gotthardDetectorServer/gitInfoGotthard.h b/slsDetectorServers/gotthardDetectorServer/gitInfoGotthard.h
index 00178b691..540b4d733 100644
--- a/slsDetectorServers/gotthardDetectorServer/gitInfoGotthard.h
+++ b/slsDetectorServers/gotthardDetectorServer/gitInfoGotthard.h
@@ -1,6 +1,6 @@
#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
-#define GITREPUUID "0765b330f116fd47b84c065d89789f4996573f23"
+#define GITREPUUID "cd5aea895b07b7af25e3fb74a341a861f9aa291c"
#define GITAUTH "Dhanya_Thattil"
-#define GITREV 0x4381
-#define GITDATE 0x20190306
-#define GITBRANCH "refactor"
+#define GITREV 0x4473
+#define GITDATE 0x20190322
+#define GITBRANCH "jungfrau"
diff --git a/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c
index 817d08543..ae8dcf1b3 100644
--- a/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c
+++ b/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c
@@ -1350,7 +1350,7 @@ 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, uint32_t udpport2) {
+int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport) {
#ifdef VIRTUAL
return OK;
#endif
diff --git a/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt b/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt
index 6bbce7a54..410105732 100644
--- a/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt
+++ b/slsDetectorServers/jungfrauDetectorServer/gitInfo.txt
@@ -1,9 +1,9 @@
Path: slsDetectorPackage/slsDetectorServers/jungfrauDetectorServer
URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
-Repsitory UUID: 6cb043b2d999f9a15edb3a554ad91fbcded10f72
-Revision: 28
+Repsitory UUID: cd5aea895b07b7af25e3fb74a341a861f9aa291c
+Revision: 30
Branch: jungfrau
Last Changed Author: Dhanya_Thattil
-Last Changed Rev: 4471
-Last Changed Date: 2019-03-22 11:20:39.000000002 +0100 ./slsDetectorFunctionList.c
+Last Changed Rev: 4473
+Last Changed Date: 2019-03-26 14:19:40.000000002 +0100 ./slsDetectorFunctionList.c
diff --git a/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h b/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h
index 69511b6dc..0fd1683cd 100644
--- a/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h
+++ b/slsDetectorServers/jungfrauDetectorServer/gitInfoJungfrau.h
@@ -1,6 +1,6 @@
#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
-#define GITREPUUID "6cb043b2d999f9a15edb3a554ad91fbcded10f72"
+#define GITREPUUID "cd5aea895b07b7af25e3fb74a341a861f9aa291c"
#define GITAUTH "Dhanya_Thattil"
-#define GITREV 0x4471
-#define GITDATE 0x20190322
+#define GITREV 0x4473
+#define GITDATE 0x20190326
#define GITBRANCH "jungfrau"
diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c
index 379edc8f3..b54a49d46 100644
--- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c
+++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c
@@ -1021,13 +1021,19 @@ long int calcChecksum(int sourceip, int destip) {
-int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2){
+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) {
#ifdef VIRTUAL
return OK;
#endif
FILE_LOG(logINFOBLUE, ("Configuring MAC\n"));
+
uint32_t sourceport = DEFAULT_TX_UDP_PORT;
+ FILE_LOG(logINFO, ("\t#Interfaces : %d\n", numInterfaces));
+ FILE_LOG(logINFO, ("\tInterface : %d\n\n", selInterface));
+
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));
FILE_LOG(logINFO, ("\tSource MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n",
@@ -1040,7 +1046,7 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t
(long long unsigned int)sourcemac));
FILE_LOG(logINFO, ("\tSource Port : %d \t\t\t(0x%08x)\n",sourceport, sourceport));
- FILE_LOG(logINFO, ("\tDest. IP : %d.%d.%d.%d \t\t(0x%08x)\n",
+ 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. MAC : %02x:%02x:%02x:%02x:%02x:%02x \t(0x%010llx)\n",
(unsigned int)((destmac>>40)&0xFF),
@@ -1050,7 +1056,32 @@ 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\n",udpport, udpport));
+
+ uint32_t sourceport2 = DEFAULT_TX_UDP_PORT + 1;
+ 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));
+ 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));
+
+ 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. 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));
long int checksum=calcChecksum(sourceip, destip);
bus_w(TX_IP_REG, sourceip);
@@ -1090,21 +1121,20 @@ int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t
int setDetectorPosition(int pos[]) {
int ret = OK;
- FILE_LOG(logDEBUG1, ("Setting detector position: (%d, %d), reserved: %d\n", pos[0], pos[1], pos[2]));
+ FILE_LOG(logDEBUG1, ("Setting detector position: (%d, %d)\n", pos[0], pos[1]));
+
+ bus_w(COORD_0_REG, bus_r(COORD_0_REG) & (~(COORD_0_X_MSK)));
bus_w(COORD_0_REG, bus_r(COORD_0_REG) | ((pos[0] << COORD_0_X_OFST) & COORD_0_X_MSK));
if ((bus_r(COORD_0_REG) & COORD_0_X_MSK) != ((pos[0] << COORD_0_X_OFST) & COORD_0_X_MSK))
ret = FAIL;
+ bus_w(COORD_0_REG, bus_r(COORD_0_REG) & (~(COORD_0_Y_MSK)));
bus_w(COORD_0_REG, bus_r(COORD_0_REG) | ((pos[1] << COORD_0_Y_OFST) & COORD_0_Y_MSK));
if ((bus_r(COORD_0_REG) & COORD_0_Y_MSK) != ((pos[1] << COORD_0_Y_OFST) & COORD_0_Y_MSK))
ret = FAIL;
- bus_w(COORD_1_REG, bus_r(COORD_1_REG) | ((pos[2] << COORD_0_Z_OFST) & COORD_0_Z_MSK));
- if ((bus_r(COORD_1_REG) & COORD_0_Z_MSK) != ((pos[2] << COORD_0_Z_OFST) & COORD_0_Z_MSK))
- ret = FAIL;
-
if (ret == OK) {
- FILE_LOG(logINFO, ("Position set to [%d, %d, %d]\n", pos[0], pos[1], pos[2]));
+ FILE_LOG(logINFO, ("Position set to [%d, %d]\n", pos[0], pos[1]));
}
return ret;
}
diff --git a/slsDetectorServers/moenchDetectorServer/gitInfo.txt b/slsDetectorServers/moenchDetectorServer/gitInfo.txt
index ac12c4a00..a7a56f57f 100644
--- a/slsDetectorServers/moenchDetectorServer/gitInfo.txt
+++ b/slsDetectorServers/moenchDetectorServer/gitInfo.txt
@@ -1,9 +1,9 @@
Path: slsDetectorPackage/slsDetectorServers/moenchDetectorServer
-URL: origin https://www.github.com/slsdetectorgroup/slsDetectorPackage
-Repository Root: origin https://www.github.com/slsdetectorgroup/slsDetectorPackage
-Repsitory UUID: 6765fd0dc89176b4eceaf5e2304ef808a316ba9b
-Revision: 16
-Branch: refactor
+URL: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
+Repository Root: origin git@github.com:slsdetectorgroup/slsDetectorPackage.git
+Repsitory UUID: cd5aea895b07b7af25e3fb74a341a861f9aa291c
+Revision: 21
+Branch: jungfrau
Last Changed Author: Dhanya_Thattil
-Last Changed Rev: 4394
-Last Changed Date: 2019-03-13 08:04:56.000000002 +0100 ./RegisterDefs.h
+Last Changed Rev: 4473
+Last Changed Date: 2019-03-22 17:13:44.000000002 +0100 ../slsDetectorServer/slsDetectorServer_funcs.c
diff --git a/slsDetectorServers/moenchDetectorServer/gitInfoMoench.h b/slsDetectorServers/moenchDetectorServer/gitInfoMoench.h
index 9c24f9052..540b4d733 100644
--- a/slsDetectorServers/moenchDetectorServer/gitInfoMoench.h
+++ b/slsDetectorServers/moenchDetectorServer/gitInfoMoench.h
@@ -1,6 +1,6 @@
-#define GITURL "https://www.github.com/slsdetectorgroup/slsDetectorPackage"
-#define GITREPUUID "6765fd0dc89176b4eceaf5e2304ef808a316ba9b"
+#define GITURL "git@github.com:slsdetectorgroup/slsDetectorPackage.git"
+#define GITREPUUID "cd5aea895b07b7af25e3fb74a341a861f9aa291c"
#define GITAUTH "Dhanya_Thattil"
-#define GITREV 0x4394
-#define GITDATE 0x20190313
-#define GITBRANCH "refactor"
+#define GITREV 0x4473
+#define GITDATE 0x20190322
+#define GITBRANCH "jungfrau"
diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c
index 8f1d1996a..49343265b 100644
--- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c
+++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c
@@ -1143,7 +1143,7 @@ long int calcChecksum(int sourceip, int destip) {
-int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport, uint32_t udpport2){
+int configureMAC(uint32_t destip, uint64_t destmac, uint64_t sourcemac, uint32_t sourceip, uint32_t udpport){
#ifdef VIRTUAL
return OK;
#endif
@@ -1926,69 +1926,25 @@ void unsetFifoReadStrobes() {
}
void readSample(int ns) {
- uint32_t addr = DUMMY_REG;
+ uint32_t addr = DUMMY_REG;
- // read adcs
- if (analogEnable) {
+ // read digital output
+ // read strobe to digital fifo
+ bus_w(addr, bus_r(addr) | DUMMY_DGTL_FIFO_RD_STRBE_MSK);
+ bus_w(addr, bus_r(addr) & (~DUMMY_DGTL_FIFO_RD_STRBE_MSK));
+ // wait as it is connected directly to fifo running on a different clock
+ if (!(ns%1000)) {
+ FILE_LOG(logDEBUG1, ("Reading sample ns:%d of %d DEmtpy:%d DFull:%d Status:0x%x\n",
+ ns, nSamples,
+ ((bus_r(FIFO_DIN_STATUS_REG) & FIFO_DIN_STATUS_FIFO_EMPTY_MSK) >> FIFO_DIN_STATUS_FIFO_EMPTY_OFST),
+ ((bus_r(FIFO_DIN_STATUS_REG) & FIFO_DIN_STATUS_FIFO_FULL_MSK) >> FIFO_DIN_STATUS_FIFO_FULL_OFST),
+ bus_r(STATUS_REG)));
+ }
- uint32_t fifoAddr = FIFO_DATA_REG;
+ // read fifo and write it to current position of data pointer
+ *((uint64_t*)now_ptr) = get64BitReg(FIFO_DIN_LSB_REG, FIFO_DIN_MSB_REG);
+ now_ptr += 8;
- // read strobe to all analog fifos
- bus_w(addr, bus_r(addr) | DUMMY_ANLG_FIFO_RD_STRBE_MSK);
- bus_w(addr, bus_r(addr) & (~DUMMY_ANLG_FIFO_RD_STRBE_MSK));
- // wait as it is connected directly to fifo running on a different clock
- //usleep(WAIT_TIME_FIFO_RD_STROBE);
- if (!(ns%1000)) {
- FILE_LOG(logDEBUG1, ("Reading sample ns:%d of %d AEmtpy:0x%x AFull:0x%x Status:0x%x\n",
- ns, nSamples, bus_r(FIFO_EMPTY_REG), bus_r(FIFO_FULL_REG), bus_r(STATUS_REG)));
- }
-
- // loop through all channels
- int ich = 0;
- for (ich = 0; ich < NCHAN_ANALOG; ++ich) {
-
- // if channel is in ROI
- if ((1 << ich) & ~(adcDisableMask)) {
-
- // unselect channel
- bus_w(addr, bus_r(addr) & ~(DUMMY_FIFO_CHNNL_SLCT_MSK));
-
- // select channel
- bus_w(addr, bus_r(addr) | ((ich << DUMMY_FIFO_CHNNL_SLCT_OFST) & DUMMY_FIFO_CHNNL_SLCT_MSK));
-
- // read fifo and write it to current position of data pointer
- *((uint16_t*)now_ptr) = bus_r16(fifoAddr);
-
- // keep reading till the value is the same
- /* while (*((uint16_t*)now_ptr) != bus_r16(fifoAddr)) {
- FILE_LOG(logDEBUG1, ("%d ", ich));
- *((uint16_t*)now_ptr) = bus_r16(fifoAddr);
- }*/
-
- // increment pointer to data out destination
- now_ptr += 2;
- }
- }
- }
-
- // read digital output
- if (digitalEnable) {
- // read strobe to digital fifo
- bus_w(addr, bus_r(addr) | DUMMY_DGTL_FIFO_RD_STRBE_MSK);
- bus_w(addr, bus_r(addr) & (~DUMMY_DGTL_FIFO_RD_STRBE_MSK));
- // wait as it is connected directly to fifo running on a different clock
- if (!(ns%1000)) {
- FILE_LOG(logDEBUG1, ("Reading sample ns:%d of %d DEmtpy:%d DFull:%d Status:0x%x\n",
- ns, nSamples,
- ((bus_r(FIFO_DIN_STATUS_REG) & FIFO_DIN_STATUS_FIFO_EMPTY_MSK) >> FIFO_DIN_STATUS_FIFO_EMPTY_OFST),
- ((bus_r(FIFO_DIN_STATUS_REG) & FIFO_DIN_STATUS_FIFO_FULL_MSK) >> FIFO_DIN_STATUS_FIFO_FULL_OFST),
- bus_r(STATUS_REG)));
- }
-
- // read fifo and write it to current position of data pointer
- *((uint64_t*)now_ptr) = get64BitReg(FIFO_DIN_LSB_REG, FIFO_DIN_MSB_REG);
- now_ptr += 8;
- }
}
uint32_t checkDataInFifo() {
diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h
index 3fe157e18..3cdfe9236 100644
--- a/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h
+++ b/slsDetectorServers/slsDetectorServer/slsDetectorFunctionList.h
@@ -210,7 +210,17 @@ long int calcChecksum(int sourceip, int destip);
#ifdef GOTTHARDD
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 setDetectorPosition(int pos[]);
#endif
diff --git a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c
index d675286db..c7946c4f4 100755
--- a/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c
+++ b/slsDetectorServers/slsDetectorServer/slsDetectorServer_funcs.c
@@ -152,6 +152,19 @@ const char* getSpeedName(enum speedVariable ind) {
}
}
+const char* getRunStateName(enum runStatus ind) {
+ switch (ind) {
+ case IDLE: return "idle";
+ case ERROR: return "error";
+ case WAITING: return "waiting";
+ case RUN_FINISHED: return "run_finished";
+ case TRANSMITTING: return "transmitting";
+ case RUNNING: return "running";
+ case STOPPED: return "stopped";
+ default: return "unknown";
+ }
+}
+
const char* getFunctionName(enum detFuncs func) {
switch (func) {
case F_EXEC_COMMAND: return "F_EXEC_COMMAND";
@@ -2239,24 +2252,35 @@ int send_update(int file_des) {
int configure_mac(int file_des) {
ret = OK;
memset(mess, 0, sizeof(mess));
- char args[9][50];
+ const size_t array_size = 50;
+ const size_t n_args = 14;
+ const size_t n_retvals = 2;
+ char args[n_args][array_size];
+ char retvals[n_retvals][array_size];
+
memset(args, 0, sizeof(args));
- char retvals[2][50];
memset(retvals, 0, sizeof(retvals));
if (receiveData(file_des, args, sizeof(args), OTHER) < 0)
return printSocketReadError();
FILE_LOG(logDEBUG1, ("\n Configuring MAC\n"));
+
+ // dest port
+ uint32_t dstPort = 0;
+ sscanf(args[0], "%x", &dstPort);
+ FILE_LOG(logDEBUG1, ("Dst Port: %x\n", dstPort));
+ // dest ip
uint32_t dstIp = 0;
- sscanf(args[0], "%x", &dstIp);
+ sscanf(args[1], "%x", &dstIp);
FILE_LOG(logDEBUG1, ("Dst Ip Addr: %d.%d.%d.%d = 0x%x \n",
(dstIp >> 24) & 0xff, (dstIp >> 16) & 0xff, (dstIp >> 8) & 0xff, (dstIp) & 0xff,
dstIp));
+ // dest mac
uint64_t dstMac = 0;
#ifdef VIRTUAL
- sscanf(args[1], "%lx", &dstMac);
+ sscanf(args[2], "%lx", &dstMac);
#else
- sscanf(args[1], "%llx", &dstMac);
+ sscanf(args[2], "%llx", &dstMac);
#endif
FILE_LOG(logDEBUG1, ("Dst Mac Addr: (0x) "));
{
@@ -2269,17 +2293,18 @@ int configure_mac(int file_des) {
}
}
FILE_LOG(logDEBUG1, (" = %llx\n", dstMac));
- uint32_t dstPort = 0;
- sscanf(args[2], "%x", &dstPort);
- FILE_LOG(logDEBUG1, ("Dst Port: %x\n", dstPort));
- uint32_t dstPort2 = 0;
- sscanf(args[5], "%x", &dstPort2);
- FILE_LOG(logDEBUG1, ("Dst Port2: %x\n", dstPort2));
+ // source ip
+ uint32_t srcIp = 0;
+ sscanf(args[3], "%x", &srcIp);
+ FILE_LOG(logDEBUG1, ("Src Ip Addr: %d.%d.%d.%d = 0x%x \n",
+ (srcIp >> 24) & 0xff, (srcIp >> 16) & 0xff, (srcIp >> 8) & 0xff, (srcIp) & 0xff,
+ srcIp));
+ // source mac
uint64_t srcMac = 0;
#ifdef VIRTUAL
- sscanf(args[3], "%lx", &srcMac);
+ sscanf(args[4], "%lx", &srcMac);
#else
- sscanf(args[3], "%llx", &srcMac);
+ sscanf(args[4], "%llx", &srcMac);
#endif
FILE_LOG(logDEBUG1, ("Src Mac Addr: (0x) "));
{
@@ -2292,30 +2317,98 @@ int configure_mac(int file_des) {
}
}
FILE_LOG(logDEBUG1, (" = %llx\n", srcMac));
- uint32_t srcIp = 0;
- sscanf(args[4], "%x", &srcIp);
- FILE_LOG(logDEBUG1, ("Src Ip Addr: %d.%d.%d.%d = 0x%x \n",
- (srcIp >> 24) & 0xff, (srcIp >> 16) & 0xff, (srcIp >> 8) & 0xff, (srcIp) & 0xff,
- srcIp));
+
#if defined(JUNGFRAUD) || defined(EIGERD)
- int pos[3] = {0, 0, 0};
- sscanf(args[6], "%x", &pos[0]);
- sscanf(args[7], "%x", &pos[1]);
- sscanf(args[8], "%x", &pos[2]);
- FILE_LOG(logDEBUG1, ("Position: [%d, %d, %d]\n", pos[0], pos[1], pos[2]));
+ // source port 2
+ uint32_t dstPort2 = 0;
+ sscanf(args[5], "%x", &dstPort2);
+ FILE_LOG(logDEBUG1, ("Dst Port2: %x\n", dstPort2));
#endif
+#ifdef JUNGFRAUD
+ // dest ip2
+ uint32_t dstIp2 = 0;
+ sscanf(args[6], "%x", &dstIp2);
+ FILE_LOG(logDEBUG1, ("Dst Ip Addr: %d.%d.%d.%d = 0x%x \n",
+ (dstIp2 >> 24) & 0xff, (dstIp2 >> 16) & 0xff, (dstIp2 >> 8) & 0xff, (dstIp2) & 0xff,
+ dstIp2));
+ // dest mac2
+ uint64_t dstMac2 = 0;
+#ifdef VIRTUAL
+ sscanf(args[7], "%lx", &dstMac2);
+#else
+ sscanf(args[7], "%llx", &dstMac2);
+#endif
+ FILE_LOG(logDEBUG1, ("Dst Mac Addr: (0x) "));
+ {
+ int iloop = 5;
+ for (iloop = 5; iloop >= 0; --iloop) {
+ printf ("%x", (unsigned int)(((dstMac2 >> (8 * iloop)) & 0xFF)));
+ if (iloop > 0) {
+ printf(":");
+ }
+ }
+ }
+ FILE_LOG(logDEBUG1, (" = %llx\n", dstMac2));
+ // source ip2
+ uint32_t srcIp2 = 0;
+ sscanf(args[8], "%x", &srcIp2);
+ FILE_LOG(logDEBUG1, ("Src Ip Addr: %d.%d.%d.%d = 0x%x \n",
+ (srcIp2 >> 24) & 0xff, (srcIp2 >> 16) & 0xff, (srcIp2 >> 8) & 0xff, (srcIp2) & 0xff,
+ srcIp2));
+ // source mac2
+ uint64_t srcMac2 = 0;
+#ifdef VIRTUAL
+ sscanf(args[9], "%lx", &srcMac2);
+#else
+ sscanf(args[9], "%llx", &srcMac2);
+#endif
+ FILE_LOG(logDEBUG1, ("Src Mac Addr: (0x) "));
+ {
+ int iloop = 5;
+ for (iloop = 5; iloop >= 0; --iloop) {
+ printf("%x", (unsigned int)(((srcMac2 >> (8 * iloop)) & 0xFF)));
+ if (iloop > 0) {
+ printf(":");
+ }
+ }
+ }
+ FILE_LOG(logDEBUG1, (" = %llx\n", srcMac2));
+
+ // number of interfaces
+ int numInterfaces = 0;
+ sscanf(args[10], "%d", &numInterfaces);
+ int selInterface = 1;
+ sscanf(args[11], "%d", &selInterface);
+
+#endif
+#if defined(JUNGFRAUD) || defined(EIGERD)
+ int pos[2] = {0, 0};
+ sscanf(args[12], "%x", &pos[0]);
+ sscanf(args[13], "%x", &pos[1]);
+ FILE_LOG(logDEBUG1, ("Position: [%d, %d]\n", pos[0], pos[1]));
+#endif
+
// set only
if ((Server_VerifyLock() == OK)) {
// stop detector if it was running
- if (getRunStatus() != IDLE) {
- ret = FAIL;
- sprintf(mess, "Cannot configure mac when detector is not idle\n");
- FILE_LOG(logERROR,(mess));
+ enum runStatus status = getRunStatus();
+ if (status != IDLE && status != RUN_FINISHED && status != STOPPED) {
+ if (status == RUNNING)
+ stopStateMachine();
+#ifndef EIGERD
+ cleanFifos();
+#endif
+ 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));
+ }
}
- else {
+ if (ret == OK) {
#ifdef EIGERD
// change mac to hardware mac
if (srcMac != getDetectorMAC()) {
@@ -2339,9 +2432,12 @@ int configure_mac(int file_des) {
// 10 gbe (use ip given from client)
else
srcIp = dhcpipad;
-
+ ret = configureMAC(dstIp, dstMac, srcMac, srcIp, dstPort, dstPort2);
+#elif JUNGFRAUD
+ ret = configureMAC(numInterfaces, selInterface, dstIp, dstMac, srcMac, srcIp, dstPort, dstIp2, dstMac2, srcMac2, srcIp2, dstPort2);
+#else
+ ret = configureMAC(dstIp, dstMac, srcMac, srcIp, dstPort);
#endif
- ret = configureMAC(dstIp, dstMac, srcMac, srcIp, dstPort, dstPort2);
#if defined(CHIPTESTBOARDD) || defined(MOENCHD)
if (ret != OK) {
if (ret == FAIL)
diff --git a/slsDetectorSoftware/include/multiSlsDetector.h b/slsDetectorSoftware/include/multiSlsDetector.h
index 0eddf81ad..0edce98da 100644
--- a/slsDetectorSoftware/include/multiSlsDetector.h
+++ b/slsDetectorSoftware/include/multiSlsDetector.h
@@ -860,6 +860,21 @@ class multiSlsDetector : public virtual slsDetectorDefs {
*/
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);
+
/**
* Validates the format of the detector IP address and sets it
* @param detectorIP detector IP address
@@ -875,6 +890,21 @@ class multiSlsDetector : public virtual slsDetectorDefs {
*/
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 significant for the receiver
@@ -907,6 +937,21 @@ class multiSlsDetector : public virtual slsDetectorDefs {
*/
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
@@ -922,6 +967,21 @@ class multiSlsDetector : public virtual slsDetectorDefs {
*/
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
@@ -938,7 +998,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
int getReceiverUDPPort(int detPos = -1) const;
/**
- * Sets the receiver UDP port 2
+ * 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
@@ -946,12 +1006,42 @@ class multiSlsDetector : public virtual slsDetectorDefs {
int setReceiverUDPPort2(int udpport, int detPos = -1);
/**
- * Returns the receiver UDP port 2 of same interface
+ * 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 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);
+
+ /**
+ * Returns the number of UDP interfaces to stream data from detector (Jungfrau only)
+ * @param detPos -1 for all detectors in list or specific detector position
+ * @returns the number of interfaces
+ */
+ int getNumberofUDPInterfaces(int detPos = -1) const;
+
+ /**
+ * 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);
+
+ /**
+ * Returns the UDP interfaces to stream data from detector. Effective only when number of interfaces is 1. (Jungfrau only)
+ * @param detPos -1 for all detectors in list or specific detector position
+ * @returns the interface selected
+ */
+ int getSelectedUDPInterface(int detPos = -1) const;
+
/**
* (advanced users)
* Set/Get client streaming in ZMQ port and restarts client sockets
diff --git a/slsDetectorSoftware/include/slsDetector.h b/slsDetectorSoftware/include/slsDetector.h
index 56d1565e1..9026c6b97 100644
--- a/slsDetectorSoftware/include/slsDetector.h
+++ b/slsDetectorSoftware/include/slsDetector.h
@@ -141,21 +141,39 @@ struct sharedSlsDetector {
int receiverUDPPort;
/** is the port used to communicate between second half module of
- * Eiger detector and the receiver*/
+ * Eiger/ Jungfrau detector and the receiver*/
int receiverUDPPort2;
/** ip address of the receiver for the detector to send packets to**/
char receiverUDPIP[MAX_STR_LENGTH];
+ /** ip address of the receiver for the 2nd interface of the detector to send packets to**/
+ char receiverUDPIP2[MAX_STR_LENGTH];
+
/** mac address of receiver for the detector to send packets to **/
char receiverUDPMAC[MAX_STR_LENGTH];
+ /** mac address of receiver for the 2nd interface of the detector to send packets to **/
+ char receiverUDPMAC2[MAX_STR_LENGTH];
+
/** mac address of the detector **/
char detectorMAC[MAX_STR_LENGTH];
+ /** mac address of the 2nd interface of the detector **/
+ char detectorMAC2[MAX_STR_LENGTH];
+
/** ip address of the detector **/
char detectorIP[MAX_STR_LENGTH];
+ /** ip address of the 2nd interface of the detector **/
+ char detectorIP2[MAX_STR_LENGTH];
+
+ /** number of udp interface */
+ int numUDPInterfaces;
+
+ /** selected udp interface */
+ int selectedUDPInterface;
+
/** online flag - is set if the receiver is connected,
* unset if socket connection is not possible */
int receiverOnlineFlag;
@@ -788,6 +806,19 @@ class slsDetector : public virtual slsDetectorDefs{
*/
std::string 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)
+ */
+ std::string getDetectorMAC2();
+
/**
* Validates the format of the detector IP address and sets it \sa sharedSlsDetector
* @param detectorIP detector IP address
@@ -801,6 +832,19 @@ class slsDetector : public virtual slsDetectorDefs{
*/
std::string 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)
+ */
+ std::string getDetectorIP2() const;
+
/**
* Validates and sets the receiver.
* Also updates the receiver with all the shared memory parameters significant for the receiver
@@ -829,6 +873,19 @@ class slsDetector : public virtual slsDetectorDefs{
*/
std::string getReceiverUDPIP() 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)
+ * @returns the receiver UDP IP address (bottom half)
+ */
+ std::string setReceiverUDPIP2(const std::string &udpip);
+
+ /**
+ * Returns the receiver UDP IP address (bottom half) Jungfrau only
+ * @returns the receiver UDP IP address (bottom half)
+ */
+ std::string getReceiverUDPIP2() const;
+
/**
* Validates the format of the receiver UDP MAC address and sets it \sa sharedSlsDetector
* @param udpmac receiver UDP MAC address
@@ -842,6 +899,19 @@ class slsDetector : public virtual slsDetectorDefs{
*/
std::string getReceiverUDPMAC() 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)
+ * @returns the receiver UDP MAC address (bottom half)
+ */
+ std::string setReceiverUDPMAC2(const std::string &udpmac);
+
+ /**
+ * Returns the receiver UDP MAC address (bottom half) Jungfrau only
+ * @returns the receiver UDP MAC address (bottom half)
+ */
+ std::string getReceiverUDPMAC2() const;
+
/**
* Sets the receiver UDP port\sa sharedSlsDetector
* @param udpport receiver UDP port
@@ -856,18 +926,44 @@ class slsDetector : public virtual slsDetectorDefs{
int getReceiverUDPPort() const;
/**
- * Sets the receiver UDP port 2\sa sharedSlsDetector
+ * 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);
/**
- * Returns the receiver UDP port 2 of same interface\sa sharedSlsDetector
+ * 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;
+ /**
+ * 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
+ */
+ int setNumberofUDPInterfaces(int n);
+
+ /**
+ * Returns the number of UDP interfaces to stream data from detector (Jungfrau only)
+ * @returns the number of interfaces
+ */
+ int getNumberofUDPInterfaces() const;
+
+ /**
+ * 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.
+ * @returns the interface selected
+ */
+ int 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;
+
/**
* Sets the client zmq port\sa sharedSlsDetector
* @param port client zmq port
diff --git a/slsDetectorSoftware/src/multiSlsDetector.cpp b/slsDetectorSoftware/src/multiSlsDetector.cpp
index c28ef5029..4393659e2 100644
--- a/slsDetectorSoftware/src/multiSlsDetector.cpp
+++ b/slsDetectorSoftware/src/multiSlsDetector.cpp
@@ -1438,6 +1438,28 @@ std::string multiSlsDetector::getDetectorMAC(int detPos) {
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();
+ }
+
+ // multi
+ auto r = serialCall(&slsDetector::getDetectorMAC2);
+ return sls::concatenateIfDifferent(r);
+}
+
std::string multiSlsDetector::setDetectorIP(const std::string &detectorIP, int detPos) {
// single
if (detPos >= 0) {
@@ -1460,6 +1482,29 @@ std::string multiSlsDetector::getDetectorIP(int detPos) const {
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();
+ }
+
+ // multi
+ auto r = serialCall(&slsDetector::getDetectorIP2);
+ return sls::concatenateIfDifferent(r);
+}
+
+
std::string multiSlsDetector::setReceiverHostname(const std::string &receiver, int detPos) {
// single
if (detPos >= 0) {
@@ -1504,6 +1549,28 @@ std::string multiSlsDetector::getReceiverUDPIP(int detPos) const {
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();
+ }
+
+ // multi
+ auto r = serialCall(&slsDetector::getReceiverUDPIP2);
+ return sls::concatenateIfDifferent(r);
+}
+
std::string multiSlsDetector::setReceiverUDPMAC(const std::string &udpmac, int detPos) {
// single
if (detPos >= 0) {
@@ -1526,6 +1593,28 @@ std::string multiSlsDetector::getReceiverUDPMAC(int detPos) const {
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();
+ }
+
+ // multi
+ auto r = serialCall(&slsDetector::getReceiverUDPMAC2);
+ return sls::concatenateIfDifferent(r);
+}
+
int multiSlsDetector::setReceiverUDPPort(int udpport, int detPos) {
// single
if (detPos >= 0) {
@@ -1570,6 +1659,71 @@ int multiSlsDetector::getReceiverUDPPort2(int detPos) const {
return sls::minusOneIfDifferent(r);
}
+int multiSlsDetector::setNumberofUDPInterfaces(int n, int detPos) {
+
+ int previouslyClientStreaming = enableDataStreamingToClient();
+ int previouslyReceiverStreaming = enableDataStreamingFromReceiver();
+
+ // single
+ int ret = OK;
+ if (detPos >= 0) {
+ ret = detectors[detPos]->setNumberofUDPInterfaces(n);
+ }
+
+ // multi
+ auto r = parallelCall(&slsDetector::setNumberofUDPInterfaces,n);
+
+ // redo the zmq sockets
+ if (previouslyClientStreaming) {
+ enableDataStreamingToClient(0);
+ enableDataStreamingToClient(1);
+ }
+ if (previouslyReceiverStreaming) {
+ enableDataStreamingFromReceiver(0);
+ enableDataStreamingFromReceiver(1);
+ }
+
+ // return single
+ if (detPos >= 0)
+ return ret;
+
+ // return multi
+ return sls::minusOneIfDifferent(r);
+}
+
+int multiSlsDetector::getNumberofUDPInterfaces(int detPos) const {
+ // single
+ if (detPos >= 0) {
+ return detectors[detPos]->getNumberofUDPInterfaces();
+ }
+
+ // multi
+ auto r = serialCall(&slsDetector::getNumberofUDPInterfaces);
+ return sls::minusOneIfDifferent(r);
+}
+
+int multiSlsDetector::selectUDPInterface(int n, int detPos) {
+ // single
+ if (detPos >= 0) {
+ return detectors[detPos]->selectUDPInterface(n);
+ }
+
+ // multi
+ auto r = parallelCall(&slsDetector::selectUDPInterface,n);
+ return sls::minusOneIfDifferent(r);
+}
+
+int multiSlsDetector::getSelectedUDPInterface(int detPos) const {
+ // single
+ if (detPos >= 0) {
+ return detectors[detPos]->getSelectedUDPInterface();
+ }
+
+ // multi
+ auto r = serialCall(&slsDetector::getSelectedUDPInterface);
+ return sls::minusOneIfDifferent(r);
+}
+
void multiSlsDetector::setClientDataStreamingInPort(int i, int detPos) {
if (i >= 0) {
int prev_streaming = enableDataStreamingToClient();
@@ -1583,6 +1737,8 @@ void multiSlsDetector::setClientDataStreamingInPort(int i, int detPos) {
// calculate ports individually
int firstPort = i;
int numSockets = (getDetectorTypeAsEnum() == EIGER) ? 2 : 1;
+ if (getNumberofUDPInterfaces() == 2)
+ numSockets *= 2;
for (size_t idet = 0; idet < detectors.size(); ++idet) {
auto port = firstPort + (idet * numSockets);
@@ -1621,6 +1777,8 @@ void multiSlsDetector::setReceiverDataStreamingOutPort(int i, int detPos) {
// calculate ports individually
int firstPort = i;
int numSockets = (getDetectorTypeAsEnum() == EIGER) ? 2 : 1;
+ if (getNumberofUDPInterfaces() == 2)
+ numSockets *= 2;
for (size_t idet = 0; idet < detectors.size(); ++idet) {
auto port = firstPort + (idet * numSockets);
@@ -2848,6 +3006,9 @@ int multiSlsDetector::createReceivingDataSockets(const bool destroy) {
if (getDetectorTypeAsEnum() == EIGER) {
numSocketsPerDetector = 2;
}
+ if (getNumberofUDPInterfaces() == 2) {
+ numSocketsPerDetector = 2;
+ }
numSockets *= numSocketsPerDetector;
for (size_t iSocket = 0; iSocket < numSockets; ++iSocket) {
@@ -2882,6 +3043,9 @@ void multiSlsDetector::readFrameFromReceiver() {
nX *= 2;
gappixelsenable = detectors[0]->enableGapPixels(-1) >= 1 ? true : false;
}
+ if (getNumberofUDPInterfaces() == 2) {
+ nY *= 2;
+ }
bool runningList[zmqSocket.size()], connectList[zmqSocket.size()];
int numRunning = 0;
diff --git a/slsDetectorSoftware/src/slsDetector.cpp b/slsDetectorSoftware/src/slsDetector.cpp
index 2edbccae8..a1847d903 100644
--- a/slsDetectorSoftware/src/slsDetector.cpp
+++ b/slsDetectorSoftware/src/slsDetector.cpp
@@ -318,9 +318,15 @@ void slsDetector::initializeDetectorStructure(detectorType type) {
detector_shm()->receiverUDPPort = DEFAULT_UDP_PORTNO;
detector_shm()->receiverUDPPort2 = DEFAULT_UDP_PORTNO + 1;
sls::strcpy_safe(detector_shm()->receiverUDPIP, "none");
+ sls::strcpy_safe(detector_shm()->receiverUDPIP2, "none");
sls::strcpy_safe(detector_shm()->receiverUDPMAC, "none");
+ sls::strcpy_safe(detector_shm()->receiverUDPMAC2, "none");
sls::strcpy_safe(detector_shm()->detectorMAC, DEFAULT_DET_MAC);
+ sls::strcpy_safe(detector_shm()->detectorMAC2, DEFAULT_DET_MAC2);
sls::strcpy_safe(detector_shm()->detectorIP, DEFAULT_DET_IP);
+ sls::strcpy_safe(detector_shm()->detectorIP2, DEFAULT_DET_IP2);
+ detector_shm()->numUDPInterfaces = 1;
+ detector_shm()->selectedUDPInterface = 1;
detector_shm()->receiverOnlineFlag = OFFLINE_FLAG;
detector_shm()->tenGigaEnable = 0;
detector_shm()->flippedData[X] = 0;
@@ -1010,38 +1016,73 @@ int slsDetector::writeConfigurationFile(std::ofstream &outfile, multiSlsDetector
names.emplace_back("outdir");
names.emplace_back("lock");
// receiver config
- names.emplace_back("detectormac");
- names.emplace_back("detectorip");
names.emplace_back("zmqport");
names.emplace_back("rx_zmqport");
names.emplace_back("zmqip");
names.emplace_back("rx_zmqip");
names.emplace_back("rx_tcpport");
- names.emplace_back("rx_udpport");
- names.emplace_back("rx_udpport2");
- names.emplace_back("rx_udpip");
- names.emplace_back("rx_hostname");
- names.emplace_back("r_readfreq");
+
// detector specific config
switch (detector_shm()->myDetectorType) {
case GOTTHARD:
+ names.emplace_back("detectormac");
+ names.emplace_back("detectorip");
+ names.emplace_back("rx_udpport");
+ names.emplace_back("rx_udpip");
+ names.emplace_back("rx_udpmac");
+ names.emplace_back("rx_hostname");
+
names.emplace_back("extsig:0");
names.emplace_back("vhighvoltage");
break;
case EIGER:
+ names.emplace_back("detectormac");
+ names.emplace_back("detectorip");
+ names.emplace_back("rx_udpport");
+ names.emplace_back("rx_udpport2");
+ names.emplace_back("rx_udpip");
+ names.emplace_back("rx_udpmac");
+ names.emplace_back("rx_hostname");
+
names.emplace_back("vhighvoltage");
names.emplace_back("trimen");
names.emplace_back("iodelay");
names.emplace_back("tengiga");
break;
case JUNGFRAU:
+ names.emplace_back("detectormac");
+ names.emplace_back("detectormac2");
+ names.emplace_back("detectorip");
+ names.emplace_back("detectorip2");
+ names.emplace_back("rx_udpport");
+ names.emplace_back("rx_udpport2");
+ names.emplace_back("rx_udpip");
+ names.emplace_back("rx_udpip2");
+ names.emplace_back("rx_udpmac");
+ names.emplace_back("rx_udpmac2");
+ names.emplace_back("rx_hostname");
+
names.emplace_back("powerchip");
names.emplace_back("vhighvoltage");
break;
case CHIPTESTBOARD:
+ names.emplace_back("detectormac");
+ names.emplace_back("detectorip");
+ names.emplace_back("rx_udpport");
+ names.emplace_back("rx_udpip");
+ names.emplace_back("rx_udpmac");
+ names.emplace_back("rx_hostname");
+
names.emplace_back("vhighvoltage");
break;
case MOENCH:
+ names.emplace_back("detectormac");
+ names.emplace_back("detectorip");
+ names.emplace_back("rx_udpport");
+ names.emplace_back("rx_udpip");
+ names.emplace_back("rx_udpmac");
+ names.emplace_back("rx_hostname");
+
names.emplace_back("powerchip");
names.emplace_back("vhighvoltage");
break;
@@ -1050,6 +1091,10 @@ int slsDetector::writeConfigurationFile(std::ofstream &outfile, multiSlsDetector
std::to_string(detector_shm()->myDetectorType));
}
+ names.emplace_back("r_readfreq");
+ names.emplace_back("rx_udpsocksize");
+ names.emplace_back("rx_realudpsocksize");
+
auto cmd = slsDetectorCommand(m);
for (auto &name : names) {
char *args[] = {(char *)name.c_str()};
@@ -1516,7 +1561,7 @@ int slsDetector::configureMAC() {
int fnum = F_CONFIGURE_MAC;
int ret = FAIL;
const size_t array_size = 50;
- const size_t n_args = 9;
+ const size_t n_args = 14;
const size_t n_retvals = 2;
char args[n_args][array_size] = {};
char retvals[n_retvals][array_size] = {};
@@ -1538,59 +1583,108 @@ int slsDetector::configureMAC() {
if (sls::ConvertInternetAddresstoIpString(result, detector_shm()->receiverUDPIP,
MAX_STR_LENGTH)) {
sls::strcpy_safe(detector_shm()->receiverUDPIP, "none");
+ throw RuntimeError("configureMAC: Error. Receiver UDP IP Address not set");
}
}
}
}
- // rx_udpip and rx_udpmac is none
- if ((!strcmp(detector_shm()->receiverUDPIP, "none")) ||
- (!strcmp(detector_shm()->receiverUDPMAC, "none"))) {
- throw RuntimeError("configureMAC: Error. IP/MAC Addresses not set");
+
+ // rx_udpmac is none
+ if (!strcmp(detector_shm()->receiverUDPMAC, "none")) {
+ throw RuntimeError("configureMAC: Error. Receiver UDP MAC Addresses not set");
}
- FILE_LOG(logDEBUG1) << "rx_hostname and rx_udpip is valid ";
+ FILE_LOG(logDEBUG1) << "rx_hostname and rx_udpmac are valid ";
+
+ // jungfrau 2 interfaces
+ // validate for the second interface
+ if (detector_shm()->numUDPInterfaces == 2) {
+ // copy from udpip (done here as well if udpconnection avoided (no slsrxr)
+ if (!strcmp(detector_shm()->receiverUDPIP2, "none")) {
+ sls::strcpy_safe(detector_shm()->receiverUDPIP2, detector_shm()->receiverUDPIP);
+ }
+ // rx_udpmac2 (udpip2 will be copied from udpip if empty)
+ if (!strcmp(detector_shm()->receiverUDPMAC2, "none")) {
+ throw RuntimeError("configureMAC: Error. Receiver UDP MAC Addresses 2 not set");
+ }
+ FILE_LOG(logDEBUG1) << "rx_udpmac2 are valid ";
+ }
+
// copy to args
- sls::strcpy_safe(args[0], detector_shm()->receiverUDPIP);
- sls::strcpy_safe(args[1], detector_shm()->receiverUDPMAC);
- snprintf(args[2], array_size, "%x", detector_shm()->receiverUDPPort);
- sls::strcpy_safe(args[3], detector_shm()->detectorMAC);
- sls::strcpy_safe(args[4], detector_shm()->detectorIP);
+ snprintf(args[0], array_size, "%x", detector_shm()->receiverUDPPort);
+ sls::strcpy_safe(args[1], detector_shm()->receiverUDPIP);
+ sls::strcpy_safe(args[2], detector_shm()->receiverUDPMAC);
+ sls::strcpy_safe(args[3], detector_shm()->detectorIP);
+ sls::strcpy_safe(args[4], detector_shm()->detectorMAC);
+
snprintf(args[5], array_size, "%x", detector_shm()->receiverUDPPort2);
+ sls::strcpy_safe(args[6], detector_shm()->receiverUDPIP2);
+ sls::strcpy_safe(args[7], detector_shm()->receiverUDPMAC2);
+ sls::strcpy_safe(args[8], detector_shm()->detectorIP2);
+ sls::strcpy_safe(args[9], detector_shm()->detectorMAC2);
+
+ // number of interfaces and which one
+ snprintf(args[10], array_size, "%x", detector_shm()->numUDPInterfaces);
+ snprintf(args[11], array_size, "%x", detector_shm()->selectedUDPInterface);
+
// 2d positions to detector to put into udp header
{
- int pos[3] = {0, 0, 0};
- int max = detector_shm()->multiSize[1];
+ int pos[2] = {0, 0};
+ int max = detector_shm()->multiSize[1] * (detector_shm()->numUDPInterfaces);
// row
pos[0] = (detId % max);
// col for horiz. udp ports
pos[1] = (detId / max) * ((detector_shm()->myDetectorType == EIGER) ? 2 : 1);
// pos[2] (z is reserved)
FILE_LOG(logDEBUG1) << "Detector [" << detId << "] - (" << pos[0] << "," << pos[1] << ")";
- snprintf(args[6], array_size, "%x", pos[0]);
- snprintf(args[7], array_size, "%x", pos[1]);
- snprintf(args[8], array_size, "%x", pos[2]);
+ snprintf(args[12], array_size, "%x", pos[0]);
+ snprintf(args[13], array_size, "%x", pos[1]);
}
+
+ FILE_LOG(logDEBUG1) << "receiver udp port:" << std::dec << args[0] << "-";
// converting receiverUDPIP to string hex
- sls::strcpy_safe(args[0], sls::stringIpToHex(args[0]).c_str());
- FILE_LOG(logDEBUG1) << "receiver udp ip:" << args[0] << "-";
-
+ sls::strcpy_safe(args[1], sls::stringIpToHex(args[1]).c_str());
+ FILE_LOG(logDEBUG1) << "receiver udp ip:" << args[1] << "-";
// MAC already in hex removing :
- sls::removeChar(args[1], ':');
- FILE_LOG(logDEBUG1) << "receiver udp mac:" << args[1] << "-";
- FILE_LOG(logDEBUG1) << "receiver udp port:" << args[2] << "-";
-
- // MAC already in hex removing :
- sls::removeChar(args[3], ':');
- FILE_LOG(logDEBUG1) << "detector udp mac:" << args[3] << "-";
+ sls::removeChar(args[2], ':');
+ FILE_LOG(logDEBUG1) << "receiver udp mac:" << args[2] << "-";
// converting detectorIP to string hex
- sls::strcpy_safe(args[4], sls::stringIpToHex(args[4]).c_str());
- FILE_LOG(logDEBUG1) << "detecotor udp ip:" << args[4] << "-";
+ sls::strcpy_safe(args[3], sls::stringIpToHex(args[3]).c_str());
+ FILE_LOG(logDEBUG1) << "detecotor udp ip:" << args[3] << "-";
+ // MAC already in hex removing :
+ sls::removeChar(args[4], ':');
+ FILE_LOG(logDEBUG1) << "detector udp mac:" << args[4] << "-";
+
+
+ FILE_LOG(logDEBUG1) << "receiver udp port2:" << std::dec << args[5] << "-";
+ if (!strcmp(args[6], "none")) {
+ sprintf(args[6], "%d", 0);
+ } else {
+ sls::strcpy_safe(args[6], sls::stringIpToHex(args[6]).c_str());
+ }
+ FILE_LOG(logDEBUG1) << "receiver udp ip2:" << args[6] << "-";
+ // MAC already in hex removing :
+ sls::removeChar(args[7], ':');
+ FILE_LOG(logDEBUG1) << "receiver udp mac2:" << args[7] << "-";
+ // converting detectorIP to string hex
+ if (!strcmp(args[8], "none")) {
+ sprintf(args[8], "%d", 0);
+ } else {
+ sls::strcpy_safe(args[8], sls::stringIpToHex(args[8]).c_str());
+ }
+ FILE_LOG(logDEBUG1) << "detecotor udp ip2:" << args[8] << "-";
+ // MAC already in hex removing :
+ sls::removeChar(args[9], ':');
+ FILE_LOG(logDEBUG1) << "detector udp mac2:" << args[9] << "-";
+
+
+ FILE_LOG(logDEBUG1) << "number of udp interfaces:" << std::dec << args[10] << "-";
+ FILE_LOG(logDEBUG1) << "selected udp interface:" << std::dec << args[11] << "-";
+
+ FILE_LOG(logDEBUG1) << "row:" << args[12] << "-";
+ FILE_LOG(logDEBUG1) << "col:" << args[13] << "-";
- FILE_LOG(logDEBUG1) << "receiver udp port2:" << args[5] << "-";
- FILE_LOG(logDEBUG1) << "row:" << args[6] << "-";
- FILE_LOG(logDEBUG1) << "col:" << args[7] << "-";
- FILE_LOG(logDEBUG1) << "reserved:" << args[8] << "-";
// send to server
if (detector_shm()->onlineFlag == ONLINE_FLAG) {
@@ -2012,7 +2106,31 @@ std::string slsDetector::setDetectorMAC(const std::string &detectorMAC) {
return std::string(detector_shm()->detectorMAC);
}
-std::string slsDetector::getDetectorMAC() { return std::string(detector_shm()->detectorMAC); }
+std::string slsDetector::getDetectorMAC() {
+ return std::string(detector_shm()->detectorMAC);
+}
+
+std::string slsDetector::setDetectorMAC2(const std::string &detectorMAC) {
+ // invalid format
+ if ((detectorMAC.length() != 17) || (detectorMAC[2] != ':') || (detectorMAC[5] != ':') ||
+ (detectorMAC[8] != ':') || (detectorMAC[11] != ':') || (detectorMAC[14] != ':')) {
+ throw RuntimeError("server MAC Address 2 should be in xx:xx:xx:xx:xx:xx format");
+ }
+ // valid format
+ else {
+ sls::strcpy_safe(detector_shm()->detectorMAC2, detectorMAC.c_str());
+ if (!strcmp(detector_shm()->receiver_hostname, "none")) {
+ FILE_LOG(logDEBUG1) << "Receiver hostname not set yet";
+ } else if (setUDPConnection() == FAIL) {
+ FILE_LOG(logWARNING) << "UDP connection set up failed";
+ }
+ }
+ return std::string(detector_shm()->detectorMAC2);
+}
+
+std::string slsDetector::getDetectorMAC2() {
+ return std::string(detector_shm()->detectorMAC2);
+}
std::string slsDetector::setDetectorIP(const std::string &detectorIP) {
struct sockaddr_in sa;
@@ -2033,7 +2151,32 @@ std::string slsDetector::setDetectorIP(const std::string &detectorIP) {
return std::string(detector_shm()->detectorIP);
}
-std::string slsDetector::getDetectorIP() const { return std::string(detector_shm()->detectorIP); }
+std::string slsDetector::getDetectorIP() const {
+ return std::string(detector_shm()->detectorIP);
+}
+
+std::string slsDetector::setDetectorIP2(const std::string &detectorIP) {
+ struct sockaddr_in sa;
+ if (detectorIP.length() && detectorIP.length() < 16) {
+ int result = inet_pton(AF_INET, detectorIP.c_str(), &(sa.sin_addr));
+ if (result == 0) {
+ throw RuntimeError(
+ "setDetectorIP: IP Address 2 should be VALID and in xxx.xxx.xxx.xxx format");
+ } else {
+ sls::strcpy_safe(detector_shm()->detectorIP2, detectorIP.c_str());
+ if (!strcmp(detector_shm()->receiver_hostname, "none")) {
+ FILE_LOG(logDEBUG1) << "Receiver hostname not set yet";
+ } else if (setUDPConnection() == FAIL) {
+ FILE_LOG(logWARNING) << "UDP connection set up failed";
+ }
+ }
+ }
+ return std::string(detector_shm()->detectorIP2);
+}
+
+std::string slsDetector::getDetectorIP2() const {
+ return std::string(detector_shm()->detectorIP2);
+}
std::string slsDetector::setReceiverHostname(const std::string &receiverIP) {
FILE_LOG(logDEBUG1) << "Setting up Receiver with " << receiverIP;
@@ -2095,6 +2238,7 @@ std::string slsDetector::setReceiverHostname(const std::string &receiverIP) {
setDetectorId();
setDetectorHostname();
setUDPConnection();
+ setReceiverUDPSocketBufferSize(0);
setFilePath(detector_shm()->receiver_filePath);
setFileName(detector_shm()->receiver_fileName);
setFileIndex(detector_shm()->receiver_fileIndex);
@@ -2183,6 +2327,29 @@ std::string slsDetector::getReceiverUDPIP() const {
return std::string(detector_shm()->receiverUDPIP);
}
+std::string slsDetector::setReceiverUDPIP2(const std::string &udpip) {
+ struct sockaddr_in sa;
+ if (udpip.length() && udpip.length() < 16) {
+ int result = inet_pton(AF_INET, udpip.c_str(), &(sa.sin_addr));
+ if (result == 0) {
+ throw ReceiverError(
+ "setReceiverUDPIP: UDP IP Address 2 should be VALID and in xxx.xxx.xxx.xxx format");
+ } else {
+ sls::strcpy_safe(detector_shm()->receiverUDPIP2, udpip.c_str());
+ if (!strcmp(detector_shm()->receiver_hostname, "none")) {
+ FILE_LOG(logDEBUG1) << "Receiver hostname not set yet";
+ } else if (setUDPConnection() == FAIL) {
+ FILE_LOG(logWARNING) << "UDP connection set up failed";
+ }
+ }
+ }
+ return std::string(detector_shm()->receiverUDPIP2);
+}
+
+std::string slsDetector::getReceiverUDPIP2() const {
+ return std::string(detector_shm()->receiverUDPIP2);
+}
+
std::string slsDetector::setReceiverUDPMAC(const std::string &udpmac) {
// invalid format
if ((udpmac.length() != 17) || (udpmac[2] != ':') || (udpmac[5] != ':') || (udpmac[8] != ':') ||
@@ -2206,6 +2373,29 @@ std::string slsDetector::getReceiverUDPMAC() const {
return std::string(detector_shm()->receiverUDPMAC);
}
+std::string slsDetector::setReceiverUDPMAC2(const std::string &udpmac) {
+ // invalid format
+ if ((udpmac.length() != 17) || (udpmac[2] != ':') || (udpmac[5] != ':') || (udpmac[8] != ':') ||
+ (udpmac[11] != ':') || (udpmac[14] != ':')) {
+ throw ReceiverError(
+ "setReceiverUDPMAC: udp MAC Address 2 should be in xx:xx:xx:xx:xx:xx format");
+ }
+ // valid format
+ else {
+ sls::strcpy_safe(detector_shm()->receiverUDPMAC2, udpmac.c_str());
+ if (!strcmp(detector_shm()->receiver_hostname, "none")) {
+ FILE_LOG(logDEBUG1) << "Receiver hostname not set yet";
+ }
+ // not doing setUDPConnection as rx_udpmac will get replaced,(must use configuremac)
+ sls::strcpy_safe(detector_shm()->receiverUDPMAC2, udpmac.c_str());
+ }
+ return std::string(detector_shm()->receiverUDPMAC2);
+}
+
+std::string slsDetector::getReceiverUDPMAC2() const {
+ return std::string(detector_shm()->receiverUDPMAC2);
+}
+
int slsDetector::setReceiverUDPPort(int udpport) {
detector_shm()->receiverUDPPort = udpport;
if (!strcmp(detector_shm()->receiver_hostname, "none")) {
@@ -2216,12 +2406,11 @@ int slsDetector::setReceiverUDPPort(int udpport) {
return detector_shm()->receiverUDPPort;
}
-int slsDetector::getReceiverUDPPort() const { return detector_shm()->receiverUDPPort; }
+int slsDetector::getReceiverUDPPort() const {
+ return detector_shm()->receiverUDPPort;
+}
int slsDetector::setReceiverUDPPort2(int udpport) {
- if (detector_shm()->myDetectorType != EIGER) {
- return setReceiverUDPPort(udpport);
- }
detector_shm()->receiverUDPPort2 = udpport;
if (!strcmp(detector_shm()->receiver_hostname, "none")) {
FILE_LOG(logDEBUG1) << "Receiver hostname not set yet";
@@ -2231,7 +2420,43 @@ int slsDetector::setReceiverUDPPort2(int udpport) {
return detector_shm()->receiverUDPPort2;
}
-int slsDetector::getReceiverUDPPort2() const { return detector_shm()->receiverUDPPort2; }
+int slsDetector::getReceiverUDPPort2() const {
+ return detector_shm()->receiverUDPPort2;
+}
+
+int slsDetector::setNumberofUDPInterfaces(int n) {
+ if (detector_shm()->myDetectorType != JUNGFRAU) {
+ throw RuntimeError("Cannot choose number of interfaces for this detector");
+ }
+ detector_shm()->numUDPInterfaces = (n > 1 ? 2 : 1);
+ if (!strcmp(detector_shm()->receiver_hostname, "none")) {
+ FILE_LOG(logDEBUG1) << "Receiver hostname not set yet";
+ } else if (setUDPConnection() == FAIL) {
+ FILE_LOG(logWARNING) << "UDP connection set up failed";
+ }
+ return detector_shm()->numUDPInterfaces;
+}
+
+int slsDetector::getNumberofUDPInterfaces() const {
+ return detector_shm()->numUDPInterfaces;
+}
+
+int slsDetector::selectUDPInterface(int n) {
+ if (detector_shm()->myDetectorType != JUNGFRAU) {
+ throw RuntimeError("Cannot select an interface for this detector");
+ }
+ detector_shm()->selectedUDPInterface = (n > 1 ? 2 : 1);
+ if (!strcmp(detector_shm()->receiver_hostname, "none")) {
+ FILE_LOG(logDEBUG1) << "Receiver hostname not set yet";
+ } else if (setUDPConnection() == FAIL) {
+ FILE_LOG(logWARNING) << "UDP connection set up failed";
+ }
+ return detector_shm()->selectedUDPInterface;
+}
+
+int slsDetector::getSelectedUDPInterface() const {
+ return detector_shm()->selectedUDPInterface;
+}
void slsDetector::setClientStreamingPort(int port) { detector_shm()->zmqport = port; }
@@ -2511,8 +2736,8 @@ int64_t slsDetector::getReceiverRealUDPSocketBufferSize() {
int slsDetector::setUDPConnection() {
int fnum = F_SETUP_RECEIVER_UDP;
int ret = FAIL;
- char args[3][MAX_STR_LENGTH] = {{}, {}, {}};
- char retvals[MAX_STR_LENGTH] = {};
+ char args[6][MAX_STR_LENGTH] = {{}, {}, {}, {}, {}, {}};
+ char retvals[2][MAX_STR_LENGTH] = {{}, {}};
FILE_LOG(logDEBUG1) << "Setting UDP Connection";
// called before set up
@@ -2536,15 +2761,32 @@ int slsDetector::setUDPConnection() {
if (sls::ConvertInternetAddresstoIpString(result, detector_shm()->receiverUDPIP,
MAX_STR_LENGTH)) {
sls::strcpy_safe(detector_shm()->receiverUDPIP, "none");
+ throw RuntimeError("setUDPConnection: Error. Receiver UDP IP Address not set");
}
}
}
}
+
+ // jungfrau 2 interfaces or (1 interface and 2nd interface), copy udpip if udpip2 empty
+ if (detector_shm()->numUDPInterfaces == 2 || detector_shm()->selectedUDPInterface == 2) {
+ // copy from udpip
+ if (!strcmp(detector_shm()->receiverUDPIP2, "none")) {
+ sls::strcpy_safe(detector_shm()->receiverUDPIP2, detector_shm()->receiverUDPIP);
+ }
+
+ }
+
// copy arguments to args[][]
- sls::strcpy_safe(args[0], detector_shm()->receiverUDPIP);
- snprintf(args[1], sizeof(args[2]), "%d", detector_shm()->receiverUDPPort);
- snprintf(args[2], sizeof(args[2]), "%d", detector_shm()->receiverUDPPort2);
+ snprintf(args[0], sizeof(args[0]), "%d", detector_shm()->numUDPInterfaces);
+ snprintf(args[1], sizeof(args[1]), "%d", detector_shm()->selectedUDPInterface);
+ sls::strcpy_safe(args[2], detector_shm()->receiverUDPIP);
+ sls::strcpy_safe(args[3], detector_shm()->receiverUDPIP2);
+ snprintf(args[4], sizeof(args[4]), "%d", detector_shm()->receiverUDPPort);
+ snprintf(args[5], sizeof(args[5]), "%d", detector_shm()->receiverUDPPort2);
+ FILE_LOG(logDEBUG1) << "Receiver Number of UDP Interfaces: " << detector_shm()->numUDPInterfaces;
+ FILE_LOG(logDEBUG1) << "Receiver Selected Interface: " << detector_shm()->selectedUDPInterface;
FILE_LOG(logDEBUG1) << "Receiver udp ip address: " << detector_shm()->receiverUDPIP;
+ FILE_LOG(logDEBUG1) << "Receiver udp ip address2: " << detector_shm()->receiverUDPIP2;
FILE_LOG(logDEBUG1) << "Receiver udp port: " << detector_shm()->receiverUDPPort;
FILE_LOG(logDEBUG1) << "Receiver udp port2: " << detector_shm()->receiverUDPPort2;
@@ -2552,16 +2794,23 @@ int slsDetector::setUDPConnection() {
auto receiver =
ReceiverSocket(detector_shm()->receiver_hostname, detector_shm()->receiverTCPPort);
ret = receiver.sendCommandThenRead(fnum, args, sizeof(args), retvals, sizeof(retvals));
- FILE_LOG(logDEBUG1) << "Receiver UDP MAC returned : " << retvals;
- memset(detector_shm()->receiverUDPMAC, 0, MAX_STR_LENGTH);
- sls::strcpy_safe(detector_shm()->receiverUDPMAC, retvals);
+ if (strlen(retvals[0])) {
+ FILE_LOG(logDEBUG1) << "Receiver UDP MAC returned : " << retvals[0];
+ memset(detector_shm()->receiverUDPMAC, 0, MAX_STR_LENGTH);
+ sls::strcpy_safe(detector_shm()->receiverUDPMAC, retvals[0]);
+ }
+ if (strlen(retvals[1])) {
+ FILE_LOG(logDEBUG1) << "Receiver UDP MAC2 returned : " << retvals[1];
+ memset(detector_shm()->receiverUDPMAC2, 0, MAX_STR_LENGTH);
+ sls::strcpy_safe(detector_shm()->receiverUDPMAC2, retvals[1]);
+ }
if (ret == FORCE_UPDATE) {
receiver.close();
ret = updateCachedReceiverVariables();
}
// configure detector with udp details
if (configureMAC() == FAIL) {
- setReceiverOnline(OFFLINE_FLAG); // FIXME: Needed??
+ setReceiverOnline(OFFLINE_FLAG);
}
} else {
throw ReceiverError("setUDPConnection: Receiver is OFFLINE");
@@ -3516,10 +3765,15 @@ int64_t slsDetector::getRateCorrection() {
void slsDetector::printReceiverConfiguration(TLogLevel level) {
FILE_LOG(level) << "#Detector " << detId << ":\n Receiver Hostname:\t" << getReceiverHostname()
<< "\nDetector UDP IP (Source):\t\t" << getDetectorIP()
- << "\nDetector UDP MAC:\t\t" << getDetectorMAC() << "\nReceiver UDP IP:\t"
- << getReceiverUDPIP() << "\nReceiver UDP MAC:\t" << getReceiverUDPMAC()
- << "\nReceiver UDP Port:\t" << getReceiverUDPPort() << "\nReceiver UDP Port2:\t"
- << getReceiverUDPPort2();
+ << "\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();
}
int slsDetector::setReceiverOnline(int value) {
diff --git a/slsDetectorSoftware/src/slsDetectorCommand.cpp b/slsDetectorSoftware/src/slsDetectorCommand.cpp
index d77c50673..520a3f7dd 100644
--- a/slsDetectorSoftware/src/slsDetectorCommand.cpp
+++ b/slsDetectorSoftware/src/slsDetectorCommand.cpp
@@ -1535,6 +1535,7 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) {
descrToFuncMap[i].m_pFuncName = "rx_hostname"; //
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)
*/
@@ -1542,6 +1543,13 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) {
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 bottom 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)
*/
@@ -1549,6 +1557,13 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) {
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 bottom 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)
*/
@@ -1557,7 +1572,7 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) {
++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. Used for EIGER only. \c Returns \c (int)
+ - 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. Used for EIGERand JUNGFRAU only. \c Returns \c (int)
*/
descrToFuncMap[i].m_pFuncName = "rx_udpport2"; //
descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter;
@@ -1585,12 +1600,40 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) {
++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)
+ - detectormac2 [mac] sets/gets the mac address of the second half of the detector UDP interface from where the bottom 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 bottom half of 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 second half of the detector UDP interface from where the bottom 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, 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 the 1st or the 2nd interface to use to stream data out of the detector. Options: 1, 2. 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)
*/
@@ -1606,7 +1649,7 @@ slsDetectorCommand::slsDetectorCommand(multiSlsDetector *det) {
++i;
/*! \page network
- - txndelay_frame [delay] sets/gets the transmission frame period of entire frame being streamed out from the detector for both ports. Use single-detector command. Used for EIGER only. \c Returns \c (int)
+ - txndelay_frame [delay] sets/gets the transmission frame period of entire frame being streamed out from the detector for both ports. Use single-detector command. Used for EIGER and JUNGFRAU only. \c Returns \c (int)
*/
descrToFuncMap[i].m_pFuncName = "txndelay_frame"; //
descrToFuncMap[i].m_pFuncPtr = &slsDetectorCommand::cmdNetworkParameter;
@@ -2789,11 +2832,21 @@ std::string slsDetectorCommand::cmdNetworkParameter(int narg, char *args[], int
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);
+ 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 (action == PUT_ACTION) {
myDet->setReceiverHostname(args[1], detPos);
@@ -2804,11 +2857,21 @@ std::string slsDetectorCommand::cmdNetworkParameter(int narg, char *args[], int
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->getReceiverUDPIP(detPos);
} else if (cmd == "rx_udpmac") {
- if (action == PUT_ACTION) {
+ 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->getReceiverUDPMAC(detPos);
} else if (cmd == "rx_udpport") {
if (action == PUT_ACTION) {
if (!(sscanf(args[1], "%d", &i))) {
@@ -2827,6 +2890,24 @@ std::string slsDetectorCommand::cmdNetworkParameter(int narg, char *args[], int
}
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") {
if (action == PUT_ACTION) {
int64_t ival = -1;
@@ -2921,12 +3002,18 @@ 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 second half module and for other detectors, same as rx_udpport" << std::endl;
+ os << "rx_udpport2 port \n sets receiver udp port to port. For Eiger and Jungfrau, it is the second 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, 2. JUNGFRAU only. " << std::endl;
+ os << "selinterface n \n sets the 1st or the 2nd interface to use to stream data out of the detector. Options: 1, 2. 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;
@@ -2955,11 +3042,18 @@ std::string slsDetectorCommand::helpNetworkParameter(int action) {
}
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. For Eiger, it is the second half module and for other detectors, same as rx_udpport" << std::endl;
+ os << "rx_udpport2 \n gets receiver udp port of 2nd udp interface. For Eiger and Jungfrau, it is the second 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, 2. JUNGFRAU only. " << std::endl;
+ os << "selinterface \n gets the interface selected to use to stream data out of the detector. Options: 1, 2. 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;
diff --git a/slsReceiverSoftware/include/GeneralData.h b/slsReceiverSoftware/include/GeneralData.h
index 28e26969c..87b4b60ec 100644
--- a/slsReceiverSoftware/include/GeneralData.h
+++ b/slsReceiverSoftware/include/GeneralData.h
@@ -217,6 +217,14 @@ public:
cprintf(RED,"setImageSize is a generic function that should be overloaded by a derived class\n");
};
+ /**
+ * set number of interfaces (jungfrau)
+ * @param number of interfaces
+ */
+ virtual void SetNumberofInterfaces(const int n) {
+ cprintf(RED,"SetNumberofInterfaces is a generic function that should be overloaded by a derived class\n");
+ }
+
/**
* Print all variables
*/
@@ -508,14 +516,38 @@ class JungfrauData : public GeneralData {
dataSize = 8192;
packetSize = headerSizeinPacket + dataSize;
packetsPerFrame = 128;
- imageSize = dataSize*packetsPerFrame;
+ imageSize = dataSize * packetsPerFrame;
maxFramesPerFile = JFRAU_MAX_FRAMES_PER_FILE;
fifoBufferHeaderSize= FIFO_HEADER_NUMBYTES + sizeof(slsDetectorDefs::sls_receiver_header);
defaultFifoDepth = 2500;
standardheader = true;
- defaultUdpSocketBufferSize = (2000 * 1024 * 1024);
+ defaultUdpSocketBufferSize = (1000 * 1024 * 1024);
};
+
+ /**
+ * set number of interfaces (jungfrau)
+ * @param number of interfaces
+ */
+ void SetNumberofInterfaces(const int n) {
+ // 2 interfaces
+ if (n == 2) {
+ nPixelsY = 256;
+ packetsPerFrame = 64;
+ imageSize = dataSize * packetsPerFrame;
+ threadsPerReceiver = 2;
+ defaultUdpSocketBufferSize = (500 * 1024 * 1024);
+
+ }
+ // 1 interface
+ else {
+ nPixelsY = 512;
+ packetsPerFrame = 128;
+ imageSize = dataSize * packetsPerFrame;
+ threadsPerReceiver = 1;
+ defaultUdpSocketBufferSize = (1000 * 1024 * 1024);
+ }
+ }
};
diff --git a/slsReceiverSoftware/include/slsReceiverImplementation.h b/slsReceiverSoftware/include/slsReceiverImplementation.h
index 05ebcce88..df00459c3 100644
--- a/slsReceiverSoftware/include/slsReceiverImplementation.h
+++ b/slsReceiverSoftware/include/slsReceiverImplementation.h
@@ -163,17 +163,29 @@ class slsReceiverImplementation: private virtual slsDetectorDefs {
uint32_t getUDPPortNumber() const;
/**
- * Get Second UDP Port Number (eiger specific)
+ * Get Second UDP Port Number (eiger/jungfrau specific)
* @return second udp port number
*/
uint32_t getUDPPortNumber2() const;
/**
* Get Ehernet Interface
- * @ethernet interface. eg. eth0 or "" if listening to all
+ * @return ethernet interface. eg. eth0 or "" if listening to all
*/
std::string getEthernetInterface() const;
+ /**
+ * Get Ehernet Interface 2 (jungfrau specific)
+ * @return ethernet interface 2. eg. eth0 or "" if listening to all
+ */
+ std::string getEthernetInterface2() const;
+
+ /**
+ * Get number of UDP Interfaces (jungfrau specific)
+ * @return number of udp interfaces. Options (1-2)
+ */
+ int getNumberofUDPInterfaces() const;
+
//***acquisition parameters***
/**
@@ -422,7 +434,7 @@ class slsReceiverImplementation: private virtual slsDetectorDefs {
void setUDPPortNumber(const uint32_t i);
/**
- * Set Second UDP Port Number (eiger specific)
+ * Set Second UDP Port Number (eiger/jungfrau specific)
* @return second udp port number
*/
void setUDPPortNumber2(const uint32_t i);
@@ -433,6 +445,19 @@ class slsReceiverImplementation: private virtual slsDetectorDefs {
*/
void setEthernetInterface(const char* c);
+ /**
+ * Set second Ethernet Interface to listen to (jungfrau specific)
+ * @param c second ethernet inerface eg. eth0 (max of 1000 characters)
+ */
+ void setEthernetInterface2(const char* c);
+
+ /**
+ * Set number of UDP Interfaces (jungfrau specific)
+ * @param n number of udp interfaces. Options (1-2)
+ * @return OK or FAIL for fifo structure creation
+ */
+ int setNumberofUDPInterfaces(const int n);
+
/** (not saved in client shared memory)
* Set UDP Socket Buffer Size
* @param s UDP Socket Buffer Size
@@ -591,9 +616,9 @@ class slsReceiverImplementation: private virtual slsDetectorDefs {
/**
* Set detector position id and construct filewriter
- * @param i position id
+ * @param id position id
*/
- void setDetectorPositionId(const int i);
+ void setDetectorPositionId(const int id);
//***acquisition functions***
/**
@@ -800,8 +825,10 @@ private:
bool silentMode;
//***connection parameters***
+ /** Number of UDP Interfaces */
+ int numUDPInterfaces;
/** Ethernet Interface */
- char eth[MAX_STR_LENGTH];
+ char eth[MAX_NUMBER_OF_LISTENING_THREADS][MAX_STR_LENGTH];
/** Server UDP Port Number*/
uint32_t udpPortNum[MAX_NUMBER_OF_LISTENING_THREADS];
/** udp socket buffer size */
diff --git a/slsReceiverSoftware/src/slsReceiverImplementation.cpp b/slsReceiverSoftware/src/slsReceiverImplementation.cpp
index f3788bde5..3535ea293 100644
--- a/slsReceiverSoftware/src/slsReceiverImplementation.cpp
+++ b/slsReceiverSoftware/src/slsReceiverImplementation.cpp
@@ -81,8 +81,9 @@ void slsReceiverImplementation::InitializeMembers() {
silentMode = false;
//***connection parameters***
- strcpy(eth,"");
+ numUDPInterfaces = 1;
for(int i=0;iSetNumberofInterfaces(n);
+ numThreads = generalData->threadsPerReceiver;
+ udpSocketBufferSize = generalData->defaultUdpSocketBufferSize;
+
+ // fifo
+ if (SetupFifoStructure() == FAIL)
+ return FAIL;
+
+ //create threads
+ for ( int i = 0; i < numThreads; ++i ) {
+ // listener and dataprocessor threads
+ try {
+ auto fifo_ptr = fifo[i].get();
+ listener.push_back(sls::make_unique(i, myDetectorType, fifo_ptr, &status,
+ &udpPortNum[i], eth[i], &numberOfFrames, &dynamicRange,
+ &udpSocketBufferSize, &actualUDPSocketBufferSize, &framesPerFile,
+ &frameDiscardMode, &activated, &deactivatedPaddingEnable, &silentMode));
+ listener[i]->SetGeneralData(generalData);
+
+ dataProcessor.push_back(sls::make_unique(i, myDetectorType, fifo_ptr, &fileFormatType,
+ fileWriteEnable, &dataStreamEnable, &gapPixelsEnable,
+ &dynamicRange, &streamingFrequency, &streamingTimerInMs,
+ &framePadding, &activated, &deactivatedPaddingEnable, &silentMode));
+ dataProcessor[i]->SetGeneralData(generalData);
+ }
+ catch (...) {
+ FILE_LOG(logERROR) << "Could not create listener/dataprocessor threads (index:" << i << ")";
+ listener.clear();
+ dataProcessor.clear();
+ return FAIL;
+ }
+ // streamer threads
+ if (dataStreamEnable) {
+ try {
+
+ dataStreamer.push_back(sls::make_unique(i, fifo[i].get(), &dynamicRange,
+ &roi, &fileIndex, flippedData, additionalJsonHeader));
+ dataStreamer[i]->SetGeneralData(generalData);
+ dataStreamer[i]->CreateZmqSockets(&numThreads, streamingPort, streamingSrcIP);
+
+ } catch(...) {
+ FILE_LOG(logERROR) << "Could not create datastreamer threads (index:" << i << ")";
+ if (dataStreamEnable) {
+ dataStreamer.clear();
+ dataStreamEnable = false;
+ }
+ return FAIL;
+ }
+ }
+ }
+
+ SetThreadPriorities();
+
+ // update (from 1 to 2 interface) & also for printout
+ setMultiDetectorSize(numDet);
+ // update row and column in dataprocessor
+ setDetectorPositionId(detID);
+
+ // test socket buffer size with current set up
+ if (setUDPSocketBufferSize(0) == FAIL) {
+ return FAIL;
+ }
+ }
+
+ FILE_LOG(logINFO) << "Number of Interfaces: " << numUDPInterfaces;
+ return OK;
}
int slsReceiverImplementation::setUDPSocketBufferSize(const int64_t s) {
- if (listener.size())
- return listener[0]->CreateDummySocketForUDPSocketBufferSize(s);
- return FAIL;
+ int64_t size = (s == 0) ? udpSocketBufferSize : s;
+ size_t listSize = listener.size();
+
+ if ((int)listSize != numUDPInterfaces)
+ return FAIL;
+
+ for (unsigned int i = 0; i < listSize; ++i) {
+ if (listener[i]->CreateDummySocketForUDPSocketBufferSize(size) == FAIL)
+ return FAIL;
+ }
+
+ return OK;
}
@@ -940,7 +1057,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, &numberOfFrames, &dynamicRange,
+ &udpPortNum[i], eth[i], &numberOfFrames, &dynamicRange,
&udpSocketBufferSize, &actualUDPSocketBufferSize, &framesPerFile,
&frameDiscardMode, &activated, &deactivatedPaddingEnable, &silentMode));
dataProcessor.push_back(sls::make_unique(i, myDetectorType, fifo_ptr, &fileFormatType,
@@ -964,9 +1081,6 @@ int slsReceiverImplementation::setDetectorType(const detectorType d) {
it->SetGeneralData(generalData);
SetThreadPriorities();
- // check udp socket buffer size
- setUDPSocketBufferSize(udpSocketBufferSize);
-
FILE_LOG(logDEBUG) << " Detector type set to " << detectorTypeToString(d);
return OK;
}
@@ -974,9 +1088,9 @@ int slsReceiverImplementation::setDetectorType(const detectorType d) {
-void slsReceiverImplementation::setDetectorPositionId(const int i) {
+void slsReceiverImplementation::setDetectorPositionId(const int id) {
FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called";
- detID = i;
+ detID = id;
FILE_LOG(logINFO) << "Detector Position Id:" << detID;
for (unsigned int i = 0; i < dataProcessor.size(); ++i) {
dataProcessor[i]->SetupFileWriter(fileWriteEnable, (int*)numDet,
@@ -987,7 +1101,7 @@ void slsReceiverImplementation::setDetectorPositionId(const int i) {
for (unsigned int i = 0; i < listener.size(); ++i) {
uint16_t row = 0, col = 0;
- row = detID % numDet[1]; // row
+ row = (detID % numDet[1]) * ((numUDPInterfaces == 2) ? 2 : 1); // row
col = (detID / numDet[1]) * ((myDetectorType == EIGER) ? 2 : 1) + i; // col for horiz. udp ports
listener[i]->SetHardCodedPosition(row, col);
}
@@ -1112,6 +1226,7 @@ void slsReceiverImplementation::stopReceiver() {
int64_t missingpackets = numberOfFrames*generalData->packetsPerFrame-listener[i]->GetPacketsCaught();
TLogLevel lev = (((int64_t)missingpackets) > 0) ? logINFORED : logINFOGREEN;
FILE_LOG(lev) <<
+ // udp port number could be the second if selected interface is 2 for jungfrau
"Summary of Port " << udpPortNum[i] <<
"\n\tMissing Packets\t\t: " << missingpackets <<
"\n\tComplete Frames\t\t: " << dataProcessor[i]->GetNumFramesCaught() <<
@@ -1328,11 +1443,15 @@ void slsReceiverImplementation::ResetParametersforNewMeasurement() {
int slsReceiverImplementation::CreateUDPSockets() {
FILE_LOG(logDEBUG3) << __SHORT_AT__ << " called";
bool error = false;
- for (unsigned int i = 0; i < listener.size(); ++i)
+
+ for (unsigned int i = 0; i < listener.size(); ++i) {
if (listener[i]->CreateUDPSockets() == FAIL) {
error = true;
break;
}
+ }
+
+
if (error) {
shutDownUDPSockets();
return FAIL;
diff --git a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp
index dfe694f18..e1d219f11 100644
--- a/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp
+++ b/slsReceiverSoftware/src/slsReceiverTCPIPInterface.cpp
@@ -710,8 +710,8 @@ int slsReceiverTCPIPInterface::set_roi() {
int slsReceiverTCPIPInterface::setup_udp(){
ret = OK;
memset(mess, 0, sizeof(mess));
- char args[3][MAX_STR_LENGTH] = {{""}, {""}, {""}};
- char retvals[MAX_STR_LENGTH] = {""};
+ char args[6][MAX_STR_LENGTH] = {{""}, {""}, {""}, {""}, {""}, {""}};
+ char retvals[2][MAX_STR_LENGTH] = {{""}, {""}};
// get args, return if socket crashed, ret is fail if receiver is not null
if (interface->Server_ReceiveArg(ret, mess, args, sizeof(args), true, receiver) == FAIL)
@@ -722,48 +722,108 @@ int slsReceiverTCPIPInterface::setup_udp(){
// only set
// verify if receiver is unlocked and idle
if (interface->Server_VerifyLockAndIdle(ret, mess, lockStatus, receiver->getStatus(), fnum) == OK) {
- //set up udp port
- int udpport=-1,udpport2=-1;
- sscanf(args[1],"%d",&udpport);
- sscanf(args[2],"%d",&udpport2);
- receiver->setUDPPortNumber(udpport);
- if (myDetectorType == EIGER)
- receiver->setUDPPortNumber2(udpport2);
- //setup udpip
- //get ethernet interface or IP to listen to
- FILE_LOG(logINFO) << "Receiver UDP IP: " << args[0];
- std::string temp = genericSocket::ipToName(args[0]);
+ //setup interfaces count
+ int numInterfaces = atoi(args[0]) > 1 ? 2 : 1;
+ int selInterface = atoi(args[1]) > 1 ? 2 : 1;
+
+ char* ip1 = args[2];
+ char* ip2 = args[3];
+ uint32_t port1 = atoi(args[4]);
+ uint32_t port2 = atoi(args[5]);
+
+ // using the 2nd interface only
+ if (numInterfaces == 1 && selInterface == 2) {
+ ip1 = ip2;
+ port1 = port2;
+ }
+
+ // 1st interface
+ receiver->setUDPPortNumber(port1);
+ FILE_LOG(logINFO) << "Receiver UDP IP: " << ip1;
+ // get eth
+ std::string temp = genericSocket::ipToName(ip1);
if (temp == "none"){
ret = FAIL;
- strcpy(mess, "Failed to get ethernet interface or IP\n");
+ strcpy(mess, "Failed to get ethernet interface or IP \n");
FILE_LOG(logERROR) << mess;
- }
- else {
- char eth[MAX_STR_LENGTH];
- memset(eth,0,sizeof(eth));
- strcpy(eth,temp.c_str());
- if (strchr(eth,'.') != nullptr) {
- strcpy(eth,"");
+ } else {
+ char eth[MAX_STR_LENGTH] = {""};
+ memset(eth, 0, MAX_STR_LENGTH);
+ strcpy(eth, temp.c_str());
+ // if there is a dot in eth name
+ if (strchr(eth, '.') != nullptr) {
+ strcpy(eth, "");
ret = FAIL;
- strcpy(mess, "Failed to get ethernet interface\n");
+ sprintf(mess, "Failed to get ethernet interface from IP. Got %s\n", temp.c_str());
FILE_LOG(logERROR) << mess;
}
receiver->setEthernetInterface(eth);
- //get mac address from ethernet interface
- if (ret != FAIL)
+ //get mac address
+ if (ret != FAIL) {
temp = genericSocket::nameToMac(eth);
+ if (temp=="00:00:00:00:00:00") {
+ ret = FAIL;
+ strcpy(mess,"failed to get mac adddress to listen to\n");
+ FILE_LOG(logERROR) << mess;
+ } else {
+ // using the 2nd interface only
+ if (numInterfaces == 1 && selInterface == 2) {
+ strcpy(retvals[1],temp.c_str());
+ FILE_LOG(logINFO) << "Receiver MAC Address: " << retvals[1];
+ }
+ else {
+ strcpy(retvals[0],temp.c_str());
+ FILE_LOG(logINFO) << "Receiver MAC Address: " << retvals[0];
+ }
+ }
+ }
+ }
- if ((temp=="00:00:00:00:00:00") || (ret == FAIL)){
+ // 2nd interface
+ if (numInterfaces == 2) {
+ receiver->setUDPPortNumber2(port2);
+ FILE_LOG(logINFO) << "Receiver UDP IP 2: " << ip2;
+ // get eth
+ std::string temp = genericSocket::ipToName(ip2);
+ if (temp == "none"){
ret = FAIL;
- strcpy(mess,"failed to get mac adddress to listen to\n");
+ strcpy(mess, "Failed to get 2nd ethernet interface or IP \n");
FILE_LOG(logERROR) << mess;
+ } else {
+ char eth[MAX_STR_LENGTH] = {""};
+ memset(eth, 0, MAX_STR_LENGTH);
+ strcpy(eth, temp.c_str());
+ // if there is a dot in eth name
+ if (strchr(eth, '.') != nullptr) {
+ strcpy(eth, "");
+ ret = FAIL;
+ sprintf(mess, "Failed to get 2nd ethernet interface from IP. Got %s\n", temp.c_str());
+ FILE_LOG(logERROR) << mess;
+ }
+ receiver->setEthernetInterface2(eth);
+
+ //get mac address
+ if (ret != FAIL) {
+ temp = genericSocket::nameToMac(eth);
+ if (temp=="00:00:00:00:00:00") {
+ ret = FAIL;
+ strcpy(mess,"failed to get 2nd mac adddress to listen to\n");
+ FILE_LOG(logERROR) << mess;
+ } else {
+ strcpy(retvals[1],temp.c_str());
+ FILE_LOG(logINFO) << "Receiver MAC Address 2: " << retvals[1];
+ }
+ }
}
- else {
- strcpy(retvals,temp.c_str());
- FILE_LOG(logINFO) << "Receiver MAC Address: " << retvals;
- }
+ }
+
+ // set the number of udp interfaces (changes number of threads and many others)
+ if (receiver->setNumberofUDPInterfaces(numInterfaces) == FAIL) {
+ ret = FAIL;
+ sprintf(mess, "Failed to set number of interfaces\n");
+ FILE_LOG(logERROR) << mess;
}
}
}
@@ -1752,7 +1812,8 @@ int slsReceiverTCPIPInterface::set_udp_socket_buffer_size() {
}
// get
retval = receiver->getUDPSocketBufferSize();
- validate(index, retval, std::string("set udp socket buffer size (No CAP_NET_ADMIN privileges?)"), DEC);
+ if (index != 0)
+ validate(index, retval, std::string("set udp socket buffer size (No CAP_NET_ADMIN privileges?)"), DEC);
FILE_LOG(logDEBUG1) << "UDP Socket Buffer Size:" << retval;
}
return interface->Server_SendResult(true, ret, &retval, sizeof(retval), mess);
diff --git a/slsSupportLib/include/sls_detector_defs.h b/slsSupportLib/include/sls_detector_defs.h
index e9175388b..0d98a46cf 100755
--- a/slsSupportLib/include/sls_detector_defs.h
+++ b/slsSupportLib/include/sls_detector_defs.h
@@ -52,7 +52,9 @@ typedef int int32_t;
#define GET_FLAG -1
#define DEFAULT_DET_MAC "00:aa:bb:cc:dd:ee"
-#define DEFAULT_DET_IP "129.129.202.46"
+#define DEFAULT_DET_IP "129.129.202.45"
+#define DEFAULT_DET_MAC2 "00:aa:bb:cc:dd:ff"
+#define DEFAULT_DET_IP2 "129.129.202.46"
/** default maximum string length */
#define MAX_STR_LENGTH 1000