From af16ad4040f8a96851a548d5f24160640766404a Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 20 Jul 2021 12:58:05 +0200 Subject: [PATCH 1/8] vetoalg: wip --- python/scripts/generate_enums.py | 6 +- python/src/detector.cpp | 4 +- python/src/enums.cpp | 18 +++--- .../src/slsDetectorServer_funcs.c | 4 +- slsDetectorSoftware/include/sls/Detector.h | 15 ++++- slsDetectorSoftware/src/CmdProxy.cpp | 64 +++++++++++++++---- slsDetectorSoftware/src/CmdProxy.h | 3 + slsDetectorSoftware/src/Detector.cpp | 34 +++++++--- slsDetectorSoftware/src/Module.cpp | 11 ++++ slsDetectorSoftware/src/Module.h | 5 ++ .../tests/test-CmdProxy-gotthard2.cpp | 52 +++++++++++++++ slsReceiverSoftware/src/ClientInterface.cpp | 6 +- slsReceiverSoftware/src/Implementation.cpp | 8 +-- slsReceiverSoftware/src/Implementation.h | 8 +-- slsSupportLib/include/sls/ToString.h | 6 +- slsSupportLib/include/sls/sls_detector_defs.h | 24 ++++--- slsSupportLib/src/ToString.cpp | 35 +++++++--- slsSupportLib/tests/test-ToString.cpp | 12 ++-- 18 files changed, 237 insertions(+), 78 deletions(-) diff --git a/python/scripts/generate_enums.py b/python/scripts/generate_enums.py index 7abb7cfc1..25769e429 100644 --- a/python/scripts/generate_enums.py +++ b/python/scripts/generate_enums.py @@ -11,7 +11,7 @@ import subprocess from parse import remove_comments -allow_bitwise_op = ["EthernetInterface"] +allow_bitwise_op = ["ethernetInterface"] op_key = {"operator|": "__or__", "operator&" : "__and__"} @@ -22,7 +22,7 @@ def single_line_enum(line): def extract_enums(lines): - # deal with enum class EthernetInterface : int32_t + # deal with enum class ethernetInterface : int32_t # and normal enum burstMode { line_iter = iter(lines) @@ -89,7 +89,7 @@ def generate_enum_string(enums): #Here add the operators for op in operators: - data.append(f"\n\t.def(\"{op_key[op]}\", py::overload_cast< const slsDetectorDefs::EthernetInterface&, const slsDetectorDefs::EthernetInterface&>(&{op}))") + data.append(f"\n\t.def(\"{op_key[op]}\", py::overload_cast< const slsDetectorDefs::ethernetInterface&, const slsDetectorDefs::ethernetInterface&>(&{op}))") data.append(';\n\n') diff --git a/python/src/detector.cpp b/python/src/detector.cpp index 6ebae6255..f2f5cc07b 100644 --- a/python/src/detector.cpp +++ b/python/src/detector.cpp @@ -1075,12 +1075,12 @@ void init_det(py::module &m) { Detector::setVeto, py::arg(), py::arg() = Positions{}) .def("getVetoStream", - (Result(Detector::*)(sls::Positions) + (Result(Detector::*)(sls::Positions) const) & Detector::getVetoStream, py::arg() = Positions{}) .def("setVetoStream", - (void (Detector::*)(const defs::EthernetInterface, + (void (Detector::*)(const defs::ethernetInterface, sls::Positions)) & Detector::setVetoStream, py::arg(), py::arg() = Positions{}) diff --git a/python/src/enums.cpp b/python/src/enums.cpp index 7e2093224..5ce843b6f 100644 --- a/python/src/enums.cpp +++ b/python/src/enums.cpp @@ -278,19 +278,19 @@ void init_enums(py::module &m) { slsDetectorDefs::timingSourceType::TIMING_EXTERNAL) .export_values(); - py::enum_(Defs, "EthernetInterface", + py::enum_(Defs, "ethernetInterface", py::arithmetic()) - .value("NONE", slsDetectorDefs::EthernetInterface::NONE) - .value("I3GBE", slsDetectorDefs::EthernetInterface::I3GBE) - .value("I10GBE", slsDetectorDefs::EthernetInterface::I10GBE) - .value("ALL", slsDetectorDefs::EthernetInterface::ALL) + .value("NONE", slsDetectorDefs::ethernetInterface::NONE) + .value("I3GBE", slsDetectorDefs::ethernetInterface::I3GBE) + .value("I10GBE", slsDetectorDefs::ethernetInterface::I10GBE) + .value("ALL", slsDetectorDefs::ethernetInterface::ALL) .export_values() .def("__or__", - py::overload_cast( + py::overload_cast( &operator|)) .def("__and__", - py::overload_cast( + py::overload_cast( &operator&)); } diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 07abf900b..e6d8091eb 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -8412,7 +8412,7 @@ int get_master(int file_des){ int get_veto_stream(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); - enum EthernetInterface retval = NONE; + enum ethernetInterface retval = NONE; LOG(logDEBUG1, ("Getting veto stream\n")); @@ -8429,7 +8429,7 @@ int get_veto_stream(int file_des) { int set_veto_stream(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); - enum EthernetInterface arg = 0; + enum ethernetInterface arg = 0; if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) return printSocketReadError(); diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 1c582085e..c05ac6d04 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -1248,7 +1248,7 @@ class Detector { void setVeto(const bool enable, Positions pos = {}); /** [Gotthard2] */ - Result getVetoStream(Positions pos = {}) const; + Result getVetoStream(Positions pos = {}) const; /** [Gotthard2] Options: NONE (Default), I3GBE, I10GBE (debugging), ALL * Enable or disable the 2 veto streaming interfaces available. Can @@ -1257,7 +1257,18 @@ class Detector { * interface in receiver for listening to veto packets (writes a separate * file if writing enabled). Also restarts client and receiver zmq sockets * if zmq streaming enabled.*/ - void setVetoStream(const defs::EthernetInterface value, Positions pos = {}); + void setVetoStream(const defs::ethernetInterface value, Positions pos = {}); + + /** [Gotthard2] */ + Result + getVetoAlgorithm(const defs::ethernetInterface value, + Positions pos = {}) const; + + /** [Gotthard2] Options(vetoAlgorithm): DEFAULT_ALGORITHM. + * Options(ethernetInterface): I3GBE, I10GBE */ + void setVetoAlgorithm(const defs::vetoAlgorithm alg, + const defs::ethernetInterface value, + Positions pos = {}); /** [Gotthard2] */ Result getADCConfiguration(const int chipIndex, const int adcIndex, diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 34dcc73db..4e2efacec 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -1825,19 +1825,7 @@ std::string CmdProxy::VetoStreaming(int action) { if (args.empty()) { WrongNumberOfParameters(1); } - defs::EthernetInterface interface = defs::EthernetInterface::NONE; - for (const auto &arg : args) { - if (arg == "none") { - if (args.size() > 1) { - throw sls::RuntimeError( - "cannot have other arguments with 'none'. args: " + - ToString(args)); - } - break; - } - StringTo(arg); - interface = interface | (StringTo(arg)); - } + defs::ethernetInterface interface = GetVetoInterface(true); det->setVetoStream(interface, std::vector{det_id}); os << ToString(interface) << '\n'; } else { @@ -1846,6 +1834,56 @@ std::string CmdProxy::VetoStreaming(int action) { return os.str(); } +defs::ethernetInterface CmdProxy::GetVetoInterface(bool isNoneAllowed) { + defs::ethernetInterface interface = defs::ethernetInterface::NONE; + for (const auto &arg : args) { + if (arg == "none") { + if (!isNoneAllowed) { + throw sls::RuntimeError("Must specifiy an interface"); + } else { + if (args.size() > 1) { + throw sls::RuntimeError( + std::string( + "cannot have other arguments with 'none'. args: ") + + ToString(args)); + } + } + break; + } + interface = interface | (StringTo(arg)); + } + return interface; +} + +std::string CmdProxy::VetoAlgorithm(int action) { + std::ostringstream os; + os << cmd << ' '; + if (action == defs::HELP_ACTION) { + os << "[default] [3gbe|10gbe|...]\n\t[Gotthard2] Set the veto " + "algorithm." + << '\n'; + } else if (action == defs::GET_ACTION) { + if (args.size() < 1) { + WrongNumberOfParameters(1); + } + defs::ethernetInterface interface = GetVetoInterface(false); + auto t = det->getVetoAlgorithm(interface, std::vector{det_id}); + os << OutString(t) << ' ' << ToString(interface) << '\n'; + } else if (action == defs::PUT_ACTION) { + if (args.size() < 2) { + WrongNumberOfParameters(2); + } + defs::vetoAlgorithm alg = StringTo(args[0]); + args.erase(args.begin()); + defs::ethernetInterface interface = GetVetoInterface(false); + det->setVetoAlgorithm(alg, interface, std::vector{det_id}); + os << ToString(alg) << ' ' << ToString(interface) << '\n'; + } else { + throw sls::RuntimeError("Unknown action"); + } + return os.str(); +} + std::string CmdProxy::ConfigureADC(int action) { std::ostringstream os; os << cmd << ' '; diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index 6af69775d..abe96765f 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -958,6 +958,7 @@ class CmdProxy { {"timingsource", &CmdProxy::timingsource}, {"veto", &CmdProxy::veto}, {"vetostream", &CmdProxy::VetoStreaming}, + {"vetoalg", &CmdProxy::VetoAlgorithm}, {"confadc", &CmdProxy::ConfigureADC}, {"badchannels", &CmdProxy::BadChannels}, @@ -1134,6 +1135,8 @@ class CmdProxy { std::string VetoFile(int action); std::string BurstMode(int action); std::string VetoStreaming(int action); + defs::ethernetInterface GetVetoInterface(bool isNoneAllowed); + std::string VetoAlgorithm(int action); std::string ConfigureADC(int action); std::string BadChannels(int action); /* Mythen3 Specific */ diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 0106f2f1c..1a6bd84fc 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -1565,36 +1565,52 @@ void Detector::setVeto(bool enable, Positions pos) { pimpl->Parallel(&Module::setVeto, pos, enable); } -Result Detector::getVetoStream(Positions pos) const { +Result Detector::getVetoStream(Positions pos) const { // 3gbe auto r3 = pimpl->Parallel(&Module::getVetoStream, pos); // 10gbe (debugging interface) opens 2nd udp interface in receiver auto r10 = getNumberofUDPInterfaces_(pos); - Result res(r3.size()); + Result res(r3.size()); for (unsigned int i = 0; i < res.size(); ++i) { - res[i] = (r3[i] ? defs::EthernetInterface::I3GBE - : defs::EthernetInterface::NONE); + res[i] = (r3[i] ? defs::ethernetInterface::I3GBE + : defs::ethernetInterface::NONE); if (r10[i] == 2) { - res[i] = res[i] | defs::EthernetInterface::I10GBE; + res[i] = res[i] | defs::ethernetInterface::I10GBE; } } return res; } -void Detector::setVetoStream(defs::EthernetInterface interface, Positions pos) { +void Detector::setVetoStream(defs::ethernetInterface interface, Positions pos) { // 3gbe - bool i3gbe = (interface & defs::EthernetInterface::I3GBE) == defs::EthernetInterface::I3GBE; + bool i3gbe = (interface & defs::ethernetInterface::I3GBE) == + defs::ethernetInterface::I3GBE; pimpl->Parallel(&Module::setVetoStream, pos, i3gbe); // 10gbe (debugging interface) opens 2nd udp interface in receiver int old_numinterfaces = getNumberofUDPInterfaces_(pos).tsquash( "retrieved inconsistent number of udp interfaces"); - int numinterfaces = ((interface & defs::EthernetInterface::I10GBE) == defs::EthernetInterface::I3GBE) ? 2 : 1; + int numinterfaces = ((interface & defs::ethernetInterface::I10GBE) == + defs::ethernetInterface::I3GBE) + ? 2 + : 1; if (numinterfaces != old_numinterfaces) { setNumberofUDPInterfaces_(numinterfaces, pos); } - } +} + +Result +Detector::getVetoAlgorithm(const defs::ethernetInterface interface, + Positions pos) const { + return pimpl->Parallel(&Module::getVetoAlgorithm, pos, interface); +} + +void Detector::setVetoAlgorithm(const defs::vetoAlgorithm alg, + defs::ethernetInterface interface, + Positions pos) { + pimpl->Parallel(&Module::setVetoAlgorithm, pos, alg, interface); +} Result Detector::getADCConfiguration(const int chipIndex, const int adcIndex, diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index c93fca57b..0de9af07f 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -1878,6 +1878,17 @@ void Module::setVetoStream(const bool value) { sendToDetector(F_SET_VETO_STREAM, static_cast(value), nullptr); } +slsDetectorDefs::vetoAlgorithm +Module::getVetoAlgorithm(const slsDetectorDefs::ethernetInterface) const { + return alg_; +} + +void Module::setVetoAlgorithm( + const slsDetectorDefs::vetoAlgorithm alg, + const slsDetectorDefs::ethernetInterface interface) { + alg_ = alg; +} + int Module::getADCConfiguration(const int chipIndex, const int adcIndex) const { int args[]{chipIndex, adcIndex}; return sendToDetector(F_GET_ADC_CONFIGURATION, args); diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index 81f6bfee1..f0ee9bc18 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -408,6 +408,10 @@ class Module : public virtual slsDetectorDefs { void setVeto(bool enable); bool getVetoStream() const; void setVetoStream(const bool value); + slsDetectorDefs::vetoAlgorithm + getVetoAlgorithm(const slsDetectorDefs::ethernetInterface) const; + void setVetoAlgorithm(const slsDetectorDefs::vetoAlgorithm alg, + const slsDetectorDefs::ethernetInterface interface); int getADCConfiguration(const int chipIndex, const int adcIndex) const; void setADCConfiguration(const int chipIndex, const int adcIndex, int value); @@ -721,6 +725,7 @@ class Module : public virtual slsDetectorDefs { const int moduleId; mutable sls::SharedMemory shm{0, 0}; + slsDetectorDefs::vetoAlgorithm alg_{slsDetectorDefs::DEFAULT_ALGORITHM}; }; } // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp b/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp index a42de01a8..a71994b8f 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp @@ -686,6 +686,58 @@ TEST_CASE("vetostream", "[.cmd]") { REQUIRE_THROWS(proxy.Call("vetostream", {"dfgd"}, -1, GET)); } +TEST_CASE("vetoalg", "[.cmd]") { + Detector det; + CmdProxy proxy(&det); + auto det_type = det.getDetectorType().squash(); + if (det_type == defs::GOTTHARD2) { + auto prev_val_3g = det.getVetoAlgorithm(defs::ethernetInterface::I3GBE); + auto prev_val_10g = + det.getVetoAlgorithm(defs::ethernetInterface::I10GBE); + { + std::ostringstream oss; + proxy.Call("vetoalg", {"default", "3gbe"}, -1, PUT, oss); + REQUIRE(oss.str() == "vetoalg default 3gbe\n"); + } + { + std::ostringstream oss; + proxy.Call("vetoalg", {"3gbe"}, -1, GET, oss); + REQUIRE(oss.str() == "vetoalg default 3gbe\n"); + } + { + std::ostringstream oss; + proxy.Call("vetoalg", {"default", "10gbe"}, -1, PUT, oss); + REQUIRE(oss.str() == "vetoalg default 10gbe\n"); + } + { + std::ostringstream oss; + proxy.Call("vetoalg", {"10gbe"}, -1, GET, oss); + REQUIRE(oss.str() == "vetoalg default 10gbe\n"); + } + { + std::ostringstream oss; + proxy.Call("vetoalg", {"default", "3gbe", "10gbe"}, -1, PUT, oss); + REQUIRE(oss.str() == "vetoalg default 3gbe, 10gbe\n"); + } + { + std::ostringstream oss; + proxy.Call("vetoalg", {"3gbe", "10gbe"}, -1, GET, oss); + REQUIRE(oss.str() == "vetoalg default 3gbe, 10gbe\n"); + } + REQUIRE_THROWS(proxy.Call("vetostream", {"3gbe", "none"}, -1, PUT)); + for (int i = 0; i != det.size(); ++i) { + det.setVetoAlgorithm(prev_val_3g[i], defs::ethernetInterface::I3GBE, + {i}); + det.setVetoAlgorithm(prev_val_10g[i], + defs::ethernetInterface::I10GBE, {i}); + } + } else { + REQUIRE_THROWS(proxy.Call("vetoalg", {"3gbe"}, -1, GET)); + REQUIRE_THROWS(proxy.Call("vetoalg", {"none"}, -1, PUT)); + } + REQUIRE_THROWS(proxy.Call("vetoalg", {"dfgd"}, -1, GET)); +} + TEST_CASE("confadc", "[.cmd]") { Detector det; CmdProxy proxy(&det); diff --git a/slsReceiverSoftware/src/ClientInterface.cpp b/slsReceiverSoftware/src/ClientInterface.cpp index 8f644000e..620a03026 100644 --- a/slsReceiverSoftware/src/ClientInterface.cpp +++ b/slsReceiverSoftware/src/ClientInterface.cpp @@ -1412,9 +1412,9 @@ sls::MacAddr ClientInterface::setUdpIp(sls::IpAddr arg) { LOG(logERROR) << "Failed to get udp ethernet interface from IP " << arg << ". Got " << eth; } - impl()->setEthernetInterface(eth); + impl()->setethernetInterface(eth); if (myDetectorType == EIGER) { - impl()->setEthernetInterface2(eth); + impl()->setethernetInterface2(eth); } // get mac address auto retval = sls::InterfaceNameToMac(eth); @@ -1446,7 +1446,7 @@ sls::MacAddr ClientInterface::setUdpIp2(sls::IpAddr arg) { LOG(logERROR) << "Failed to get udp ethernet interface2 from IP " << arg << ". Got " << eth; } - impl()->setEthernetInterface2(eth); + impl()->setethernetInterface2(eth); // get mac address auto retval = sls::InterfaceNameToMac(eth); diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index daa5c14f3..903c6a66f 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -939,16 +939,16 @@ void Implementation::setNumberofUDPInterfaces(const int n) { LOG(logINFO) << "Number of Interfaces: " << numUDPInterfaces; } -std::string Implementation::getEthernetInterface() const { return eth[0]; } +std::string Implementation::getethernetInterface() const { return eth[0]; } -void Implementation::setEthernetInterface(const std::string &c) { +void Implementation::setethernetInterface(const std::string &c) { eth[0] = c; LOG(logINFO) << "Ethernet Interface: " << eth[0]; } -std::string Implementation::getEthernetInterface2() const { return eth[1]; } +std::string Implementation::getethernetInterface2() const { return eth[1]; } -void Implementation::setEthernetInterface2(const std::string &c) { +void Implementation::setethernetInterface2(const std::string &c) { eth[1] = c; LOG(logINFO) << "Ethernet Interface 2: " << eth[1]; } diff --git a/slsReceiverSoftware/src/Implementation.h b/slsReceiverSoftware/src/Implementation.h index 1a82e1c03..b9663c530 100644 --- a/slsReceiverSoftware/src/Implementation.h +++ b/slsReceiverSoftware/src/Implementation.h @@ -98,11 +98,11 @@ class Implementation : private virtual slsDetectorDefs { int getNumberofUDPInterfaces() const; /* [Jungfrau] */ void setNumberofUDPInterfaces(const int n); - std::string getEthernetInterface() const; - void setEthernetInterface(const std::string &c); - std::string getEthernetInterface2() const; + std::string getethernetInterface() const; + void setethernetInterface(const std::string &c); + std::string getethernetInterface2() const; /* [Jungfrau] */ - void setEthernetInterface2(const std::string &c); + void setethernetInterface2(const std::string &c); uint32_t getUDPPortNumber() const; void setUDPPortNumber(const uint32_t i); uint32_t getUDPPortNumber2() const; diff --git a/slsSupportLib/include/sls/ToString.h b/slsSupportLib/include/sls/ToString.h index 65ace1e8c..868ac94ec 100644 --- a/slsSupportLib/include/sls/ToString.h +++ b/slsSupportLib/include/sls/ToString.h @@ -36,7 +36,8 @@ std::string ToString(const defs::dacIndex s); std::string ToString(const std::vector &vec); std::string ToString(const defs::burstMode s); std::string ToString(const defs::timingSourceType s); -std::string ToString(const defs::EthernetInterface s); +std::string ToString(const defs::ethernetInterface s); +std::string ToString(const defs::vetoAlgorithm s); std::string ToString(const slsDetectorDefs::xy &coord); std::ostream &operator<<(std::ostream &os, const slsDetectorDefs::xy &coord); @@ -298,7 +299,8 @@ template <> defs::readoutMode StringTo(const std::string &s); template <> defs::dacIndex StringTo(const std::string &s); template <> defs::burstMode StringTo(const std::string &s); template <> defs::timingSourceType StringTo(const std::string &s); -template <> defs::EthernetInterface StringTo(const std::string &s); +template <> defs::ethernetInterface StringTo(const std::string &s); +template <> defs::vetoAlgorithm StringTo(const std::string &s); template <> uint32_t StringTo(const std::string &s); template <> uint64_t StringTo(const std::string &s); diff --git a/slsSupportLib/include/sls/sls_detector_defs.h b/slsSupportLib/include/sls/sls_detector_defs.h index 13d7f89e2..52f022182 100644 --- a/slsSupportLib/include/sls/sls_detector_defs.h +++ b/slsSupportLib/include/sls/sls_detector_defs.h @@ -395,9 +395,9 @@ typedef struct { enum timingSourceType { TIMING_INTERNAL, TIMING_EXTERNAL }; #ifdef __cplusplus - enum class EthernetInterface { + enum class ethernetInterface { #else - enum EthernetInterface { + enum ethernetInterface { #endif NONE = 0, I3GBE = 1 << 1, @@ -405,6 +405,8 @@ typedef struct { ALL = I3GBE | I10GBE }; + enum vetoAlgorithm { DEFAULT_ALGORITHM }; + #ifdef __cplusplus /** scan structure */ @@ -496,16 +498,18 @@ typedef struct { #ifdef __cplusplus }; -inline slsDetectorDefs::EthernetInterface -operator|( const slsDetectorDefs::EthernetInterface &a, - const slsDetectorDefs::EthernetInterface &b) { - return slsDetectorDefs::EthernetInterface(static_cast(a) | +inline slsDetectorDefs::ethernetInterface +operator|(const slsDetectorDefs::ethernetInterface &a, + const slsDetectorDefs::ethernetInterface &b) { + return slsDetectorDefs::ethernetInterface(static_cast(a) | static_cast(b)); }; -inline slsDetectorDefs::EthernetInterface operator&( const slsDetectorDefs::EthernetInterface &a, - const slsDetectorDefs::EthernetInterface &b) { - return slsDetectorDefs::EthernetInterface(static_cast(a) & static_cast(b)); +inline slsDetectorDefs::ethernetInterface +operator&(const slsDetectorDefs::ethernetInterface &a, + const slsDetectorDefs::ethernetInterface &b) { + return slsDetectorDefs::ethernetInterface(static_cast(a) & + static_cast(b)); }; #endif @@ -583,7 +587,7 @@ struct detParameters { #ifdef __cplusplus struct sls_detector_module { #else -typedef struct { + typedef struct { #endif int serialnumber; /**< is the module serial number */ int nchan; /**< is the number of channels on the module*/ diff --git a/slsSupportLib/src/ToString.cpp b/slsSupportLib/src/ToString.cpp index 4db40a60b..4c038541a 100644 --- a/slsSupportLib/src/ToString.cpp +++ b/slsSupportLib/src/ToString.cpp @@ -519,16 +519,18 @@ std::string ToString(const defs::timingSourceType s) { } } -std::string ToString(const defs::EthernetInterface s) { +std::string ToString(const defs::ethernetInterface s) { std::ostringstream os; std::string rs; switch (s) { - case defs::EthernetInterface::NONE: + case defs::ethernetInterface::NONE: return std::string("none"); default: - if ((s & defs::EthernetInterface::I3GBE)!=defs::EthernetInterface::NONE) + if ((s & defs::ethernetInterface::I3GBE) != + defs::ethernetInterface::NONE) os << "3gbe, "; - if ((s & defs::EthernetInterface::I10GBE)!=defs::EthernetInterface::NONE) + if ((s & defs::ethernetInterface::I10GBE) != + defs::ethernetInterface::NONE) os << "10gbe, "; auto rs = os.str(); rs.erase(rs.end() - 2, rs.end()); @@ -536,6 +538,15 @@ std::string ToString(const defs::EthernetInterface s) { } } +std::string ToString(const defs::vetoAlgorithm s) { + switch (s) { + case defs::DEFAULT_ALGORITHM: + return std::string("default"); + default: + return std::string("Unknown"); + } +} + const std::string &ToString(const std::string &s) { return s; } template <> defs::detectorType StringTo(const std::string &s) { @@ -876,17 +887,23 @@ template <> defs::timingSourceType StringTo(const std::string &s) { throw sls::RuntimeError("Unknown timing source type " + s); } -template <> defs::EthernetInterface StringTo(const std::string &s) { +template <> defs::ethernetInterface StringTo(const std::string &s) { std::string rs = s; if (s.find(',') != std::string::npos) rs.erase(rs.find(',')); if (rs == "none") - return defs::EthernetInterface::NONE; + return defs::ethernetInterface::NONE; if (rs == "3gbe") - return defs::EthernetInterface::I3GBE; + return defs::ethernetInterface::I3GBE; if (rs == "10gbe") - return defs::EthernetInterface::I10GBE; - throw sls::RuntimeError("Unknown EthernetInterface type " + s); + return defs::ethernetInterface::I10GBE; + throw sls::RuntimeError("Unknown ethernetInterface type " + s); +} + +template <> defs::vetoAlgorithm StringTo(const std::string &s) { + if (s == "default") + return defs::DEFAULT_ALGORITHM; + throw sls::RuntimeError("Unknown veto algorithm " + s); } template <> uint32_t StringTo(const std::string &s) { diff --git a/slsSupportLib/tests/test-ToString.cpp b/slsSupportLib/tests/test-ToString.cpp index e372f9336..c8e720734 100644 --- a/slsSupportLib/tests/test-ToString.cpp +++ b/slsSupportLib/tests/test-ToString.cpp @@ -324,10 +324,10 @@ TEST_CASE("Print a member of patternParameters") { REQUIRE(ToString(pat->limits) == "[4, 100]"); } -TEST_CASE("EthernetInterface") { - REQUIRE(ToString(sls::defs::EthernetInterface::NONE) == "none"); - REQUIRE(ToString(sls::defs::EthernetInterface::I10GBE) == "10gbe"); - REQUIRE(ToString(sls::defs::EthernetInterface::I3GBE) == "3gbe"); - REQUIRE(ToString(sls::defs::EthernetInterface::I3GBE | - sls::defs::EthernetInterface::I10GBE) == "3gbe, 10gbe"); +TEST_CASE("ethernetInterface") { + REQUIRE(ToString(sls::defs::ethernetInterface::NONE) == "none"); + REQUIRE(ToString(sls::defs::ethernetInterface::I10GBE) == "10gbe"); + REQUIRE(ToString(sls::defs::ethernetInterface::I3GBE) == "3gbe"); + REQUIRE(ToString(sls::defs::ethernetInterface::I3GBE | + sls::defs::ethernetInterface::I10GBE) == "3gbe, 10gbe"); } \ No newline at end of file From e02493d4e4e1eb671580ce44a479e474c5869791 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 20 Jul 2021 14:57:31 +0200 Subject: [PATCH 2/8] veotalg for g2 --- .../gotthard2DetectorServer/RegisterDefs.h | 6 ++ .../slsDetectorFunctionList.c | 30 ++++++++ .../include/slsDetectorFunctionList.h | 2 + .../include/slsDetectorServer_funcs.h | 4 +- .../src/slsDetectorServer_funcs.c | 69 +++++++++++++++++++ slsDetectorSoftware/src/CmdProxy.cpp | 56 +++++++-------- slsDetectorSoftware/src/CmdProxy.h | 1 - slsDetectorSoftware/src/Module.cpp | 10 +-- slsDetectorSoftware/src/Module.h | 3 +- .../tests/test-CmdProxy-gotthard2.cpp | 14 +--- .../include/sls/sls_detector_funcs.h | 5 +- 11 files changed, 152 insertions(+), 48 deletions(-) diff --git a/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h b/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h index 8f9204c3b..1d1274e5f 100644 --- a/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h @@ -90,8 +90,14 @@ #define CONFIG_VETO_ENBL_OFST (0) #define CONFIG_VETO_ENBL_MSK (0x00000001 << CONFIG_VETO_ENBL_OFST) +#define CONFIG_VETO_CH_3GB_ALG_OFST (8) +#define CONFIG_VETO_CH_3GB_ALG_MSK (0x00000007 << CONFIG_VETO_CH_3GB_ALG_OFST) +#define CONFIG_VETO_CH_3GB_ALG_DEFAULT_VAL ((0x0 << CONFIG_VETO_CH_3GB_ALG_OFST) & CONFIG_VETO_CH_3GB_ALG_MSK) #define CONFIG_VETO_CH_3GB_ENBL_OFST (11) #define CONFIG_VETO_CH_3GB_ENBL_MSK (0x00000001 << CONFIG_VETO_CH_3GB_ENBL_OFST) +#define CONFIG_VETO_CH_10GB_ALG_OFST (12) +#define CONFIG_VETO_CH_10GB_ALG_MSK (0x00000007 << CONFIG_VETO_CH_10GB_ALG_OFST) +#define CONFIG_VETO_CH_10GB_ALG_DEFAULT_VAL ((0x0 << CONFIG_VETO_CH_10GB_ALG_OFST) & CONFIG_VETO_CH_10GB_ALG_MSK) #define CONFIG_VETO_CH_10GB_ENBL_OFST (15) #define CONFIG_VETO_CH_10GB_ENBL_MSK (0x00000001 << CONFIG_VETO_CH_10GB_ENBL_OFST) diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index 2ecc00439..e09a53146 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -2595,6 +2595,36 @@ int getVetoStream() { return ((bus_r(CONFIG_REG) & CONFIG_VETO_CH_3GB_ENBL_MSK) ? 1 : 0); } +enum vetoAlgorithm getVetoAlgorithm(enum ethernetInterface interface) { + // 3gbe + if (interface == I3GBE) { + int retval = ((bus_r(CONFIG_REG) & CONFIG_VETO_CH_3GB_ALG_MSK) >> + CONFIG_VETO_CH_3GB_ALG_OFST); + switch (retval) { + // more to follow + case CONFIG_VETO_CH_3GB_ALG_DEFAULT_VAL: + return DEFAULT_ALGORITHM; + default: + LOG(logERROR, ("unknown algorithm %d for 3gbe\n", retval)); + return -1; + } + } + // 10gbe + int retval = ((bus_r(CONFIG_REG) & CONFIG_VETO_CH_10GB_ALG_MSK) >> + CONFIG_VETO_CH_10GB_ALG_OFST); + switch (retval) { + // more to follow + case CONFIG_VETO_CH_10GB_ALG_DEFAULT_VAL: + return DEFAULT_ALGORITHM; + default: + LOG(logERROR, ("unknown algorithm %d for 3gbe\n", retval)); + return -1; + } +} + +void setVetoAlgorithm(enum ethernetInterface interface, + enum vetoAlgorithm alg) {} + void setBadChannels(int nch, int *channels) { LOG(logINFO, ("Setting %d bad channels\n", nch)); diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 72401feed..58090a24d 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -542,6 +542,8 @@ void setVeto(int enable); int getVeto(); void setVetoStream(int value); int getVetoStream(); +enum vetoAlgorithm getVetoAlgorithm(enum ethernetInterface interface); +void setVetoAlgorithm(enum ethernetInterface interface, enum vetoAlgorithm alg); void setBadChannels(int nch, int *channels); int *getBadChannels(int *nch); #endif diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index 36a8c96b7..5cea24d8b 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -248,4 +248,6 @@ int load_default_pattern(int); int get_all_threshold_energy(int); int get_master(int); int get_veto_stream(int); -int set_veto_stream(int); \ No newline at end of file +int set_veto_stream(int); +int get_veto_algorithm(int); +int set_veto_algorithm(int); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index e6d8091eb..083bee508 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -371,6 +371,8 @@ void function_table() { flist[F_GET_MASTER] = &get_master; flist[F_GET_VETO_STREAM] = &get_veto_stream; flist[F_SET_VETO_STREAM] = &set_veto_stream; + flist[F_GET_VETO_ALGORITHM] = &get_veto_algorithm; + flist[F_SET_VETO_ALGORITHM] = &set_veto_algorithm; // check if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) { @@ -8456,4 +8458,71 @@ int set_veto_stream(int file_des) { } #endif return Server_SendResult(file_des, INT32, NULL, 0); +} + +int get_veto_algorithm(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + enum ethernetInterface arg = NONE; + enum vetoAlgorithm retval = DEFAULT_ALGORITHM; + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + + LOG(logDEBUG1, ("Getting veto algorithm for interface %d\n", arg)); + +#ifndef GOTTHARD2D + functionNotImplemented(); +#else + // get only + if (arg != I3GBE && arg != I10GBE) { + ret = FAIL; + sprintf(mess, "Could not get vetoalgorithm. Invalid interface %d.\n", + arg); + LOG(logERROR, (mess)); + } else { + retval = getVetoAlgorithm(arg); + LOG(logDEBUG1, ("vetoalgorithm retval: %u\n", retval)); + } +#endif + return Server_SendResult(file_des, INT32, &retval, sizeof(retval)); +} + +int set_veto_algorithm(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int args[2] = {-1, -1}; + if (receiveData(file_des, args, sizeof(args), INT32) < 0) + return printSocketReadError(); + + enum vetoAlgorithm alg = args[0]; + enum ethernetInterface interface = args[1]; + LOG(logINFO, ("Setting vetoalgorithm (interface: %d): %u\n", (int)interface, + (int)alg)); + +#ifndef GOTTHARD2D + functionNotImplemented(); +#else + // only set + if (Server_VerifyLock() == OK) { + if (interface != I3GBE && interface != I10GBE) { + ret = FAIL; + sprintf(mess, + "Could not set vetoalgorithm. Invalid interface %d.\n", + interface); + LOG(logERROR, (mess)); + } else if (alg != DEFAULT_ALGORITHM) { + ret = FAIL; + sprintf(mess, + "Could not set vetoalgorithm. Invalid algorithm %d.\n", + alg); + LOG(logERROR, (mess)); + } else { + setVetoAlgorithm(alg, interface); + int retval = getVetoAlgorithm(interface); + LOG(logDEBUG1, ("vetoalgorithm retval: %u\n", retval)); + validate(alg, retval, "set veto algorithm", DEC); + } + } +#endif + return Server_SendResult(file_des, INT32, NULL, 0); } \ No newline at end of file diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 4e2efacec..f44885396 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -1825,7 +1825,19 @@ std::string CmdProxy::VetoStreaming(int action) { if (args.empty()) { WrongNumberOfParameters(1); } - defs::ethernetInterface interface = GetVetoInterface(true); + defs::ethernetInterface interface = defs::ethernetInterface::NONE; + for (const auto &arg : args) { + if (arg == "none") { + if (args.size() > 1) { + throw sls::RuntimeError( + std::string( + "cannot have other arguments with 'none'. args: ") + + ToString(args)); + } + break; + } + interface = interface | (StringTo(arg)); + } det->setVetoStream(interface, std::vector{det_id}); os << ToString(interface) << '\n'; } else { @@ -1834,48 +1846,36 @@ std::string CmdProxy::VetoStreaming(int action) { return os.str(); } -defs::ethernetInterface CmdProxy::GetVetoInterface(bool isNoneAllowed) { - defs::ethernetInterface interface = defs::ethernetInterface::NONE; - for (const auto &arg : args) { - if (arg == "none") { - if (!isNoneAllowed) { - throw sls::RuntimeError("Must specifiy an interface"); - } else { - if (args.size() > 1) { - throw sls::RuntimeError( - std::string( - "cannot have other arguments with 'none'. args: ") + - ToString(args)); - } - } - break; - } - interface = interface | (StringTo(arg)); - } - return interface; -} - std::string CmdProxy::VetoAlgorithm(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[default] [3gbe|10gbe|...]\n\t[Gotthard2] Set the veto " + os << "[default] [3gbe|10gbe]\n\t[Gotthard2] Set the veto " "algorithm." << '\n'; } else if (action == defs::GET_ACTION) { - if (args.size() < 1) { + if (args.size() != 1) { WrongNumberOfParameters(1); } - defs::ethernetInterface interface = GetVetoInterface(false); + defs::ethernetInterface interface = + StringTo(args[0]); + if (interface == defs::ethernetInterface::NONE) { + throw sls::RuntimeError( + "Must specify an interface to set algorithm"); + } auto t = det->getVetoAlgorithm(interface, std::vector{det_id}); os << OutString(t) << ' ' << ToString(interface) << '\n'; } else if (action == defs::PUT_ACTION) { - if (args.size() < 2) { + if (args.size() != 2) { WrongNumberOfParameters(2); } defs::vetoAlgorithm alg = StringTo(args[0]); - args.erase(args.begin()); - defs::ethernetInterface interface = GetVetoInterface(false); + defs::ethernetInterface interface = + StringTo(args[1]); + if (interface == defs::ethernetInterface::NONE) { + throw sls::RuntimeError( + "Must specify an interface to set algorithm"); + } det->setVetoAlgorithm(alg, interface, std::vector{det_id}); os << ToString(alg) << ' ' << ToString(interface) << '\n'; } else { diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index abe96765f..9c33f2775 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -1135,7 +1135,6 @@ class CmdProxy { std::string VetoFile(int action); std::string BurstMode(int action); std::string VetoStreaming(int action); - defs::ethernetInterface GetVetoInterface(bool isNoneAllowed); std::string VetoAlgorithm(int action); std::string ConfigureADC(int action); std::string BadChannels(int action); diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index 0de9af07f..2221092c3 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -1878,15 +1878,17 @@ void Module::setVetoStream(const bool value) { sendToDetector(F_SET_VETO_STREAM, static_cast(value), nullptr); } -slsDetectorDefs::vetoAlgorithm -Module::getVetoAlgorithm(const slsDetectorDefs::ethernetInterface) const { - return alg_; +slsDetectorDefs::vetoAlgorithm Module::getVetoAlgorithm( + const slsDetectorDefs::ethernetInterface interface) const { + return sendToDetector(F_GET_VETO_ALGORITHM, + static_cast(interface)); } void Module::setVetoAlgorithm( const slsDetectorDefs::vetoAlgorithm alg, const slsDetectorDefs::ethernetInterface interface) { - alg_ = alg; + int args[]{static_cast(alg), static_cast(interface)}; + sendToDetector(F_SET_VETO_ALGORITHM, args, nullptr); } int Module::getADCConfiguration(const int chipIndex, const int adcIndex) const { diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index f0ee9bc18..a05e49012 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -409,7 +409,7 @@ class Module : public virtual slsDetectorDefs { bool getVetoStream() const; void setVetoStream(const bool value); slsDetectorDefs::vetoAlgorithm - getVetoAlgorithm(const slsDetectorDefs::ethernetInterface) const; + getVetoAlgorithm(const slsDetectorDefs::ethernetInterface interface) const; void setVetoAlgorithm(const slsDetectorDefs::vetoAlgorithm alg, const slsDetectorDefs::ethernetInterface interface); int getADCConfiguration(const int chipIndex, const int adcIndex) const; @@ -725,7 +725,6 @@ class Module : public virtual slsDetectorDefs { const int moduleId; mutable sls::SharedMemory shm{0, 0}; - slsDetectorDefs::vetoAlgorithm alg_{slsDetectorDefs::DEFAULT_ALGORITHM}; }; } // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp b/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp index a71994b8f..089d8b68b 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy-gotthard2.cpp @@ -714,17 +714,9 @@ TEST_CASE("vetoalg", "[.cmd]") { proxy.Call("vetoalg", {"10gbe"}, -1, GET, oss); REQUIRE(oss.str() == "vetoalg default 10gbe\n"); } - { - std::ostringstream oss; - proxy.Call("vetoalg", {"default", "3gbe", "10gbe"}, -1, PUT, oss); - REQUIRE(oss.str() == "vetoalg default 3gbe, 10gbe\n"); - } - { - std::ostringstream oss; - proxy.Call("vetoalg", {"3gbe", "10gbe"}, -1, GET, oss); - REQUIRE(oss.str() == "vetoalg default 3gbe, 10gbe\n"); - } - REQUIRE_THROWS(proxy.Call("vetostream", {"3gbe", "none"}, -1, PUT)); + REQUIRE_THROWS( + proxy.Call("vetoalg", {"default", "3gbe", "10gbe"}, -1, PUT)); + REQUIRE_THROWS(proxy.Call("vetoalg", {"default", "none"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { det.setVetoAlgorithm(prev_val_3g[i], defs::ethernetInterface::I3GBE, {i}); diff --git a/slsSupportLib/include/sls/sls_detector_funcs.h b/slsSupportLib/include/sls/sls_detector_funcs.h index 34a772671..93fc842b5 100755 --- a/slsSupportLib/include/sls/sls_detector_funcs.h +++ b/slsSupportLib/include/sls/sls_detector_funcs.h @@ -223,6 +223,8 @@ enum detFuncs { F_GET_MASTER, F_GET_VETO_STREAM, F_SET_VETO_STREAM, + F_GET_VETO_ALGORITHM, + F_SET_VETO_ALGORITHM, NUM_DET_FUNCTIONS, RECEIVER_ENUM_START = 256, /**< detector function should not exceed this @@ -552,7 +554,8 @@ const char* getFunctionNameFromEnum(enum detFuncs func) { case F_GET_MASTER: return "F_GET_MASTER"; case F_GET_VETO_STREAM: return "F_GET_VETO_STREAM"; case F_SET_VETO_STREAM: return "F_SET_VETO_STREAM"; - + case F_GET_VETO_ALGORITHM: return "F_GET_VETO_ALGORITHM"; + case F_SET_VETO_ALGORITHM: return "F_SET_VETO_ALGORITHM"; case NUM_DET_FUNCTIONS: return "NUM_DET_FUNCTIONS"; case RECEIVER_ENUM_START: return "RECEIVER_ENUM_START"; From efe26b2b0dfc4044bfceedf29873b74b8065eae8 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 20 Jul 2021 14:59:42 +0200 Subject: [PATCH 3/8] minor enum modif --- slsSupportLib/include/sls/sls_detector_defs.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/slsSupportLib/include/sls/sls_detector_defs.h b/slsSupportLib/include/sls/sls_detector_defs.h index 52f022182..8cbaf372c 100644 --- a/slsSupportLib/include/sls/sls_detector_defs.h +++ b/slsSupportLib/include/sls/sls_detector_defs.h @@ -400,8 +400,8 @@ typedef struct { enum ethernetInterface { #endif NONE = 0, - I3GBE = 1 << 1, - I10GBE = 1 << 2, + I3GBE = 1 << 0, + I10GBE = 1 << 1, ALL = I3GBE | I10GBE }; From d40d9d122b6e53702a085b6aa504085a9b576a25 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 20 Jul 2021 15:05:43 +0200 Subject: [PATCH 4/8] replace error --- slsReceiverSoftware/src/ClientInterface.cpp | 6 +++--- slsReceiverSoftware/src/Implementation.cpp | 8 ++++---- slsReceiverSoftware/src/Implementation.h | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/slsReceiverSoftware/src/ClientInterface.cpp b/slsReceiverSoftware/src/ClientInterface.cpp index 620a03026..8f644000e 100644 --- a/slsReceiverSoftware/src/ClientInterface.cpp +++ b/slsReceiverSoftware/src/ClientInterface.cpp @@ -1412,9 +1412,9 @@ sls::MacAddr ClientInterface::setUdpIp(sls::IpAddr arg) { LOG(logERROR) << "Failed to get udp ethernet interface from IP " << arg << ". Got " << eth; } - impl()->setethernetInterface(eth); + impl()->setEthernetInterface(eth); if (myDetectorType == EIGER) { - impl()->setethernetInterface2(eth); + impl()->setEthernetInterface2(eth); } // get mac address auto retval = sls::InterfaceNameToMac(eth); @@ -1446,7 +1446,7 @@ sls::MacAddr ClientInterface::setUdpIp2(sls::IpAddr arg) { LOG(logERROR) << "Failed to get udp ethernet interface2 from IP " << arg << ". Got " << eth; } - impl()->setethernetInterface2(eth); + impl()->setEthernetInterface2(eth); // get mac address auto retval = sls::InterfaceNameToMac(eth); diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index 903c6a66f..daa5c14f3 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -939,16 +939,16 @@ void Implementation::setNumberofUDPInterfaces(const int n) { LOG(logINFO) << "Number of Interfaces: " << numUDPInterfaces; } -std::string Implementation::getethernetInterface() const { return eth[0]; } +std::string Implementation::getEthernetInterface() const { return eth[0]; } -void Implementation::setethernetInterface(const std::string &c) { +void Implementation::setEthernetInterface(const std::string &c) { eth[0] = c; LOG(logINFO) << "Ethernet Interface: " << eth[0]; } -std::string Implementation::getethernetInterface2() const { return eth[1]; } +std::string Implementation::getEthernetInterface2() const { return eth[1]; } -void Implementation::setethernetInterface2(const std::string &c) { +void Implementation::setEthernetInterface2(const std::string &c) { eth[1] = c; LOG(logINFO) << "Ethernet Interface 2: " << eth[1]; } diff --git a/slsReceiverSoftware/src/Implementation.h b/slsReceiverSoftware/src/Implementation.h index b9663c530..1a82e1c03 100644 --- a/slsReceiverSoftware/src/Implementation.h +++ b/slsReceiverSoftware/src/Implementation.h @@ -98,11 +98,11 @@ class Implementation : private virtual slsDetectorDefs { int getNumberofUDPInterfaces() const; /* [Jungfrau] */ void setNumberofUDPInterfaces(const int n); - std::string getethernetInterface() const; - void setethernetInterface(const std::string &c); - std::string getethernetInterface2() const; + std::string getEthernetInterface() const; + void setEthernetInterface(const std::string &c); + std::string getEthernetInterface2() const; /* [Jungfrau] */ - void setethernetInterface2(const std::string &c); + void setEthernetInterface2(const std::string &c); uint32_t getUDPPortNumber() const; void setUDPPortNumber(const uint32_t i); uint32_t getUDPPortNumber2() const; From cba49fbeae8c7e305d37631aa304be315a62a846 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Tue, 20 Jul 2021 15:26:03 +0200 Subject: [PATCH 5/8] release update --- RELEASE.txt | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/RELEASE.txt b/RELEASE.txt index ff623ecca..9327b5496 100755 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -1,4 +1,4 @@ -SLS Detector Package 5.2.0 released on 15.07.2021 (Minor Release) +SLS Detector Package 5.2.0 released on 28.07.2021 (Minor Release) =================================================================== This document describes the differences between 5.2.0 and 5.1.0 releases. @@ -27,6 +27,10 @@ This document describes the differences between 5.2.0 and 5.1.0 releases. Command: vetostream, Detector::setVetoStream + 2. (Gotthard2) veto algorithm + New command to set veto algorithm for 2.5GbE or 10GbE (debugging). + Command: vetoalg, Detector::setVetoAlgorithm + Gotthard2 server ---------------- @@ -37,18 +41,6 @@ This document describes the differences between 5.2.0 and 5.1.0 releases. 2. Resolved Issues ================== - - Receiver - -------- - - 1. - - - Client - ------ - - 1. - Gotthard2 Server ---------------- From 91eba6a8b8107a897afa5f6867e49a50237ab463 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 21 Jul 2021 12:32:04 +0200 Subject: [PATCH 6/8] binaries in --- .../bin/gotthard2DetectorServer_developer | Bin 224960 -> 225096 bytes slsSupportLib/include/sls/versionAPI.h | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index 4816705658b699a57f8a1e5fa119dbda37f6a0c5..52e4823a2eb22302799c276213ef0cdf1fc19701 100755 GIT binary patch delta 57230 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 No|q0fA8gb4{1=~VSl0jm delta 56199 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 X<}s_BiFv#3b=(KJDCGX&T<*{R2xTNR diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index c3c69e557..ff5a1fe4d 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -9,4 +9,4 @@ #define APILIB 0x210225 #define APIRECEIVER 0x210225 #define APIGUI 0x210225 -#define APIGOTTHARD2 0x210715 +#define APIGOTTHARD2 0x210721 From ae0d1cc0d4ce4326033e130c55b3d13cb1725b04 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Wed, 21 Jul 2021 14:38:45 +0200 Subject: [PATCH 7/8] python support for vetoalg --- python/slsdet/detector.py | 20 ++++++++++++++++++++ python/src/detector.cpp | 11 +++++++++++ python/src/enums.cpp | 5 +++++ 3 files changed, 36 insertions(+) diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 689c49911..93428a0d4 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -7,6 +7,7 @@ timingMode = slsDetectorDefs.timingMode speedLevel = slsDetectorDefs.speedLevel dacIndex = slsDetectorDefs.dacIndex detectorType = slsDetectorDefs.detectorType +ethernetInterface = slsDetectorDefs.ethernetInterface from .utils import element_if_equal, all_equal, get_set_bits, list_to_bitmask from .utils import Geometry, to_geo, element, reduce_time, is_iterable @@ -2343,6 +2344,25 @@ class Detector(CppDetectorApi): args = (args,) ut.set_using_dict(self.setVetoStream, *args) + @property + def vetoalg(self): + """[Gotthard2] Algorithm used for veto + Example + ---------- + >>> d.vetoalg = defs.DEFAULT_ALGORITHM, defs.I10GBE + """ + result = {} + interface = [ethernetInterface.I3GBE, ethernetInterface.I10GBE] + for eth in interface: + result[eth] = element_if_equal(self.getVetoAlgorithm(eth)) + return result + + + @vetoalg.setter + def vetoalg(self, args): + if not isinstance(args, tuple): + args = (args,) + ut.set_using_dict(self.setVetoAlgorithm, *args) """ Mythen3 specific diff --git a/python/src/detector.cpp b/python/src/detector.cpp index f2f5cc07b..e4762d7a4 100644 --- a/python/src/detector.cpp +++ b/python/src/detector.cpp @@ -1084,6 +1084,17 @@ void init_det(py::module &m) { sls::Positions)) & Detector::setVetoStream, py::arg(), py::arg() = Positions{}) + .def("getVetoAlgorithm", + (Result(Detector::*)( + const defs::ethernetInterface, sls::Positions) const) & + Detector::getVetoAlgorithm, + py::arg(), py::arg() = Positions{}) + .def("setVetoAlgorithm", + (void (Detector::*)(const defs::vetoAlgorithm, + const defs::ethernetInterface, + sls::Positions)) & + Detector::setVetoAlgorithm, + py::arg(), py::arg(), py::arg() = Positions{}) .def("getADCConfiguration", (Result(Detector::*)(const int, const int, sls::Positions) const) & diff --git a/python/src/enums.cpp b/python/src/enums.cpp index 5ce843b6f..23278cd5d 100644 --- a/python/src/enums.cpp +++ b/python/src/enums.cpp @@ -293,4 +293,9 @@ void init_enums(py::module &m) { py::overload_cast( &operator&)); + + py::enum_(Defs, "vetoAlgorithm") + .value("DEFAULT_ALGORITHM", + slsDetectorDefs::vetoAlgorithm::DEFAULT_ALGORITHM) + .export_values(); } From 10455b284e22f86d5b20fd489a780e96c3191d92 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 21 Jul 2021 15:41:52 +0200 Subject: [PATCH 8/8] minor comment in python --- python/slsdet/detector.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 93428a0d4..919e9c86f 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -2336,6 +2336,13 @@ class Detector(CppDetectorApi): @property @element def vetostream(self): + """[Gotthard2] Enabling/ disabling veto interface + Note + ---- + Default: both off + Options: NONE, I3GBE, 10GBE (debugging) + Debugging interface also enables second interface in receiver (separate file), which also restarts zmq streaming if enabled. + """ return self.getVetoStream() @vetostream.setter