diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index da20ee922..14df33e2b 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -271,6 +271,6 @@ int get_module_id(int); int get_dest_udp_list(int); int set_dest_udp_list(int); int get_num_dest_list(int); -int set_num_dest_list(int); +int clear_all_udp_dst(int); int get_udp_first_dest(int); int set_udp_first_dest(int); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index a72e05980..a3936c5e8 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -408,7 +408,7 @@ void function_table() { flist[F_GET_DEST_UDP_LIST] = &get_dest_udp_list; flist[F_SET_DEST_UDP_LIST] = &set_dest_udp_list; flist[F_GET_NUM_DEST_UDP] = &get_num_dest_list; - flist[F_SET_NUM_DEST_UDP] = &set_num_dest_list; + flist[F_CLEAR_ALL_UDP_DEST] = &clear_all_udp_dst; flist[F_GET_UDP_FIRST_DEST] = &get_udp_first_dest; flist[F_SET_UDP_FIRST_DEST] = &set_udp_first_dest; @@ -9198,7 +9198,32 @@ int set_dest_udp_list(int file_des) { } } } - configure_mac(); + // find number of destinations + int numdest = 0; + for (int i = MAX_UDP_DESTINATION; i >= 0; --i) { + if (udpDetails[i].dstip != 0) { + numdest = i + 1; + break; + } + } + // atleast 1 destination + if (numdest == 0) { + numdest = 1; + } + // set number of destinations +#if defined(JUNGFRAUD) || defined(EIGERD) + if (setNumberofDestinations(numdest) == FAIL) { + ret = FAIL; + strcpy(mess, "Could not set number of udp destinations.\n"); + LOG(logERROR, (mess)); + } else +#endif + { + numUdpDestinations = numdest; + LOG(logINFOBLUE, ("Number of UDP Destinations: %d\n", + numUdpDestinations)); + configure_mac(); + } } } } @@ -9210,10 +9235,13 @@ int get_num_dest_list(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); int retval = -1; + #if !defined(JUNGFRAUD) && !defined(EIGERD) functionNotImplemented(); #else retval = numUdpDestinations; + LOG(logDEBUG1, ("numUdpDestinations retval: 0x%x\n", retval)); + int retval1 = 0; if (getNumberofDestinations(&retval1) == FAIL || retval1 != retval) { ret = FAIL; @@ -9223,42 +9251,23 @@ int get_num_dest_list(int file_des) { LOG(logERROR, (mess)); } #endif - LOG(logDEBUG1, ("numUdpDestinations retval: 0x%x\n", retval)); + return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); } -int set_num_dest_list(int file_des) { +int clear_all_udp_dst(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); - int arg = -1; - if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) - return printSocketReadError(); - LOG(logDEBUG1, ("Setting number of udp destinations to %d\n", arg)); - -#if !defined(JUNGFRAUD) && !defined(EIGERD) - functionNotImplemented(); -#else - if (arg < 1 || arg > MAX_UDP_DESTINATION) { - ret = FAIL; - sprintf(mess, - "Could not set number of udp destinations. Options: 1-%d\n", - MAX_UDP_DESTINATION); - LOG(logERROR, (mess)); - } else { - if (check_detector_idle("set number of udp destinations") == OK) { - if (setNumberofDestinations(arg) == FAIL) { - ret = FAIL; - strcpy(mess, - "Could not set number of udp destinations.\n"); - LOG(logERROR, (mess)); - } else { - numUdpDestinations = arg; - configure_mac(); - } + LOG(logINFO, ("Clearing all udp destinations\n")); + if (Server_VerifyLock() == OK) { + if (check_detector_idle("clear all udp destinations") == OK) { + memset(udpDetails, 0, sizeof(udpDetails)); + // minimum 1 destination in fpga + numUdpDestinations = 1; + configure_mac(); } } -#endif return Server_SendResult(file_des, INT32, NULL, 0); } @@ -9295,19 +9304,22 @@ int set_udp_first_dest(int file_des) { #ifndef JUNGFRAUD functionNotImplemented(); #else - if (arg < 0 || arg >= numUdpDestinations) { - ret = FAIL; - sprintf(mess, "Could not set first destination. Options: 0-%d\n", - numUdpDestinations - 1); - LOG(logERROR, (mess)); - } else { - if (check_detector_idle("set first udp destination") == OK) { - setFirstUDPDestination(arg); - int retval = getFirstUDPDestination(); - validate(&ret, mess, arg, retval, "set udp first destination", DEC); - if (ret == OK) { - firstUDPDestination = arg; - //configure_mac(); + // only set + if (Server_VerifyLock() == OK) { + if (arg < 0 || arg >= numUdpDestinations) { + ret = FAIL; + sprintf(mess, "Could not set first destination. Options: 0-%d\n", + numUdpDestinations - 1); + LOG(logERROR, (mess)); + } else { + if (check_detector_idle("set first udp destination") == OK) { + setFirstUDPDestination(arg); + int retval = getFirstUDPDestination(); + validate(&ret, mess, arg, retval, "set udp first destination", DEC); + if (ret == OK) { + firstUDPDestination = arg; + //configure_mac(); + } } } } diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index f60b615c0..f148cf4a1 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -671,8 +671,7 @@ class Detector { /** [Jungfrau][Eiger] */ Result getNumberofUDPDestinations(Positions pos = {}) const; - /**[Jungfrau][Eiger] Options 1-32 */ - void setNumberofUDPDestinations(const int value, Positions pos = {}); + void clearUDPDestination(Positions pos = {}); /** [Jungfrau] */ Result getFirstUDPDestination(Positions pos = {}) const; diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index 43fae14be..038f3ff9e 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -861,6 +861,7 @@ class CmdProxy { {"selinterface", &CmdProxy::selinterface}, {"udp_dstlist", &CmdProxy::UDPDestinationList}, {"udp_numdst", &CmdProxy::udp_numdst}, + {"udp_cleardst", &CmdProxy::udp_cleardst}, {"udp_firstdst", &CmdProxy::udp_firstdst}, {"udp_srcip", &CmdProxy::udp_srcip}, {"udp_srcip2", &CmdProxy::udp_srcip2}, @@ -1542,6 +1543,9 @@ class CmdProxy { "destinations that the detector will stream images " "out in a round robin fashion. This is get only command. Default: 1"); + EXECUTE_SET_COMMAND(udp_cleardst, clearUDPDestination, + "\n\tClears udp destination details on the detector."); + INTEGER_COMMAND_VEC_ID( udp_firstdst, getFirstUDPDestination, setFirstUDPDestination, StringTo, diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index a1654ab59..28130a238 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -921,8 +921,8 @@ Result Detector::getNumberofUDPDestinations(Positions pos) const { return pimpl->Parallel(&Module::getNumberofUDPDestinations, pos); } -void Detector::setNumberofUDPDestinations(const int value, Positions pos) { - pimpl->Parallel(&Module::setNumberofUDPDestinations, pos, value); +void Detector::clearUDPDestination(Positions pos) { + pimpl->Parallel(&Module::clearUDPDestination, pos); } Result Detector::getFirstUDPDestination(Positions pos) const { diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index 907ce0575..02e484fc9 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -970,9 +970,7 @@ int Module::getNumberofUDPDestinations() const { return sendToDetector(F_GET_NUM_DEST_UDP); } -void Module::setNumberofUDPDestinations(const int value) { - sendToDetector(F_SET_NUM_DEST_UDP, value, nullptr); -} +void Module::clearUDPDestination() { sendToDetector(F_CLEAR_ALL_UDP_DEST); } int Module::getFirstUDPDestination() const { return sendToDetector(F_GET_UDP_FIRST_DEST); diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index 49a2e2593..21462cf3c 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -224,7 +224,7 @@ class Module : public virtual slsDetectorDefs { sls::UdpDestination getDestinationUDPList(const uint32_t entry) const; void setDestinationUDPList(const sls::UdpDestination dest); int getNumberofUDPDestinations() const; - void setNumberofUDPDestinations(const int value); + void clearUDPDestination(); int getFirstUDPDestination() const; void setFirstUDPDestination(const int value); sls::IpAddr getDestinationUDPIP() const; diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index 0fdeaccec..5351f5570 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -2229,33 +2229,20 @@ TEST_CASE("udp_numdst", "[.cmd]") { CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::JUNGFRAU || det_type == defs::EIGER) { - auto prev_val = det.getNumberofUDPDestinations(); - { - std::ostringstream oss; - proxy.Call("udp_numdst", {"10"}, -1, PUT, oss); - REQUIRE(oss.str() == "udp_numdst 10\n"); - } - { - std::ostringstream oss; - proxy.Call("udp_numdst", {}, -1, GET, oss); - REQUIRE(oss.str() == "udp_numdst 10\n"); - } - { - std::ostringstream oss; - proxy.Call("udp_numdst", {"32"}, -1, PUT, oss); - REQUIRE(oss.str() == "udp_numdst 32\n"); - } - REQUIRE_THROWS(proxy.Call("udp_numdst", {"0"}, -1, PUT)); - REQUIRE_THROWS(proxy.Call("udp_numdst", {"33"}, -1, PUT)); - - for (int i = 0; i != det.size(); ++i) { - det.setNumberofUDPDestinations(prev_val[i], {i}); - } + REQUIRE_NOTHROW(proxy.Call("udp_numdst", {}, -1, GET)); } else { REQUIRE_THROWS(proxy.Call("udp_numdst", {}, -1, GET)); } } + +TEST_CASE("udp_cleardst", "[.cmd]") { + Detector det; + CmdProxy proxy(&det); + REQUIRE_THROWS(proxy.Call("udp_cleardst", {}, -1, GET)); + REQUIRE_NOTHROW(proxy.Call("udp_cleardst", {}, -1, PUT)); +} + TEST_CASE("udp_firstdst", "[.cmd]") { Detector det; CmdProxy proxy(&det); diff --git a/slsSupportLib/include/sls/sls_detector_funcs.h b/slsSupportLib/include/sls/sls_detector_funcs.h index 4a4fd8f61..cd0fe477e 100755 --- a/slsSupportLib/include/sls/sls_detector_funcs.h +++ b/slsSupportLib/include/sls/sls_detector_funcs.h @@ -247,7 +247,7 @@ enum detFuncs { F_GET_DEST_UDP_LIST, F_SET_DEST_UDP_LIST, F_GET_NUM_DEST_UDP, - F_SET_NUM_DEST_UDP, + F_CLEAR_ALL_UDP_DEST, F_GET_UDP_FIRST_DEST, F_SET_UDP_FIRST_DEST, @@ -604,7 +604,7 @@ const char* getFunctionNameFromEnum(enum detFuncs func) { case F_GET_DEST_UDP_LIST: return "F_GET_DEST_UDP_LIST"; case F_SET_DEST_UDP_LIST: return "F_SET_DEST_UDP_LIST"; case F_GET_NUM_DEST_UDP: return "F_GET_NUM_DEST_UDP"; - case F_SET_NUM_DEST_UDP: return "F_SET_NUM_DEST_UDP"; + case F_CLEAR_ALL_UDP_DEST: return "F_CLEAR_ALL_UDP_DEST"; case F_GET_UDP_FIRST_DEST: return "F_GET_UDP_FIRST_DEST"; case F_SET_UDP_FIRST_DEST: return "F_SET_UDP_FIRST_DEST";