diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 1c9da8946..607241c87 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -9,6 +9,8 @@ #include "Receiver.h" #include "sls_detector_defs.h" #include "versionAPI.h" +#include "Parallel.h" +#include "MaskGenerator.h" #include @@ -755,15 +757,17 @@ Result Detector::getUseReceiverFlag(Positions pos) const { } Result Detector::getRxHostname(const int udpInterface, Positions pos) const { - switch (udpInterface) { - case 1: - return pimpl->Parallel1(&Receiver::getHostname, pos, {}); - case 2: - return pimpl->Parallel2(&Receiver::getHostname, pos, {}); - default: - throw RuntimeError("Invalid udp interface number " + - std::to_string(udpInterface)); - } + // switch (udpInterface) { + // case 1: + // return pimpl->Parallel1(&Receiver::getHostname, pos, {}); + // case 2: + // return pimpl->Parallel2(&Receiver::getHostname, pos, {}); + // default: + // throw RuntimeError("Invalid udp interface number " + + // std::to_string(udpInterface)); + // } + return pimpl->getHostname(pos, udpInterface); + // return experimental::Parallel(&Receiver::getHostname, receivers, MaskGenerator(){receivers}); } void Detector::setRxHostname(const int udpInterface, const std::string &hostname, Positions pos) { diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index 7fcf72fcd..a66b03ae3 100755 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -1,5 +1,7 @@ #include "DetectorImpl.h" #include "Module.h" +#include "Parallel.h" +#include "MaskGenerator.h" #include "Receiver.h" #include "SharedMemory.h" #include "ZmqSocket.h" @@ -313,6 +315,11 @@ void DetectorImpl::setHostname(const std::vector &name) { updateDetectorSize(); } +Result DetectorImpl::getHostname(Positions pos, int udp_interface){ + LOG(logWARNING) << ToString(pos) << ": " << udp_interface; + return experimental::Parallel(&Receiver::getHostname, receivers, MaskGenerator(pos, udp_interface).mask(receivers)); +} + void DetectorImpl::setHostname(const std::vector &name, const std::vector &port) { if (name.size() != port.size()) { @@ -371,46 +378,46 @@ int DetectorImpl::getNumberofReceiversPerModule() const { } void DetectorImpl::initReceiver(const int udpInterface) { - // if (udpInterface == 1) { - // if (receivers.size() != 0) { - // throw RuntimeError("receiver vector already initialized"); - // } - // int tcpPort = DEFAULT_RX_PORTNO; - // int zmqPort = DEFAULT_ZMQ_CL_PORTNO; - // try { - // for (int iModule = 0; iModule < size(); ++iModule) { - // receivers.resize(detectors.size()); - // receivers[iModule].push_back( - // sls::make_unique(detectorId, iModule, 0, - // 0, tcpPort++, "", zmqPort++)); - // detectors[iModule]->setNumberOfReceivers(1); - // } - // } catch (...) { - // receivers.clear(); - // throw; - // } - // } else if (udpInterface == 2) { - // if (receivers2.size() != 0) { - // throw RuntimeError("receiver2 vector already initialized"); - // } - // int tcpPort = DEFAULT_RX_PORTNO + size(); - // int zmqPort = DEFAULT_ZMQ_CL_PORTNO + size(); - // try { - // for (int iModule = 0; iModule < size(); ++iModule) { - // receivers2.resize(detectors.size()); - // receivers2[iModule].push_back( - // sls::make_unique(detectorId, iModule, 1, - // 0, tcpPort++, "", zmqPort++)); - // detectors[iModule]->setNumberOfReceivers2(1); - // } - // } catch (...) { - // receivers2.clear(); - // throw; - // } - // } else { - // throw RuntimeError("Invalid udp interface number " + - // std::to_string(udpInterface)); - // } + LOG(logWARNING) << "interface" << udpInterface; + if (udpInterface == 1) { + if (receivers.size() != 0) { + throw RuntimeError("receiver vector already initialized"); + } + int tcpPort = DEFAULT_RX_PORTNO; + int zmqPort = DEFAULT_ZMQ_CL_PORTNO; + try { + for (int iModule = 0; iModule < size(); ++iModule) { + receivers.resize(detectors.size(), 1, 1); + receivers(iModule, 0, 0) = sls::make_unique( + detectorId, iModule, 0, 0, tcpPort++, "", zmqPort++); + detectors[iModule]->setNumberOfReceivers(1); + } + } catch (...) { + receivers.clear(); + throw; + } + } else if (udpInterface == 2) { + if (receivers.size(1) == 2) { + throw RuntimeError("receiver2 vector already initialized"); + } + int tcpPort = DEFAULT_RX_PORTNO + size(); + int zmqPort = DEFAULT_ZMQ_CL_PORTNO + size(); + try { + for (int iModule = 0; iModule < size(); ++iModule) { + receivers.resize(detectors.size(), 2, 1); + receivers(iModule, 1, 0) = + sls::make_unique(detectorId, iModule, 1, + 0, tcpPort++, "", zmqPort++); + detectors[iModule]->setNumberOfReceivers2(1); + } + } catch (...) { + receivers.clear(); + throw; + } + } else { + throw RuntimeError("Invalid udp interface number " + + std::to_string(udpInterface)); + } } bool DetectorImpl::isReceiverInitialized(const int udpInterface) { @@ -478,45 +485,50 @@ void DetectorImpl::configureReceiver(const int udpInterface, Positions pos, void DetectorImpl::configureReceiver(const int udpInterface, int module_id, const std::string &hostname, const int port) { - + LOG(logWARNING) << "HEY"; if (Parallel(&Module::getRunStatus, {}).squash(defs::ERROR) == defs::RUNNING) { LOG(logWARNING) << "Acquisition already running, Stopping it."; Parallel(&Module::stopAcquisition, {}); } + LOG(logWARNING) << "HEY2"; if (!isReceiverInitialized(udpInterface)) { initReceiver(udpInterface); - } + } + LOG(logWARNING) << "ds " << detectors.size() << "\nmodule id: " << module_id; auto t = detectors[module_id]->getReceiverParameters(); - - receivers(module_id, udpInterface, 0)->setTCPPort(port); - receivers(module_id, udpInterface, 0)->setHostname(hostname); - auto m = receivers(module_id, udpInterface, 0)->configure(t); + LOG(logWARNING) << "Shape: " << ToString(receivers.shape()); + //TODO! FIX!!! + receivers(module_id, udpInterface-1, 0)->setTCPPort(port); + receivers(module_id, udpInterface-1, 0)->setHostname(hostname); + LOG(logWARNING) << "HEY3"; + auto m = receivers(module_id, udpInterface-1, 0)->configure(t); + LOG(logWARNING) << "HEY4"; if (m != 0) { - if (udpInterface == 0) { + if (udpInterface == 1) { detectors[module_id]->setDestinationUDPMAC(m); - } else if (udpInterface == 1) { + } else if (udpInterface == 2) { detectors[module_id]->setDestinationUDPMAC2(m); } else { throw sls::RuntimeError("Incorrect udp interface id"); } } - // if (udpInterface == 1) { - // receivers[module_id][0]->setTCPPort(port); - // receivers[module_id][0]->setHostname(hostname); - // auto m = receivers[module_id][0]->configure(t); - // if (m != 0) { - // detectors[module_id]->setDestinationUDPMAC(m); - // } - // } else { - // receivers2[module_id][0]->setTCPPort(port); - // receivers2[module_id][0]->setHostname(hostname); - // auto m = receivers2[module_id][0]->configure(t); - // if (m != 0) { - // detectors[module_id]->setDestinationUDPMAC2(m); - // } - // } + if (udpInterface == 1) { + receivers(module_id, 0, 0)->setTCPPort(port); + receivers(module_id, 0, 0)->setHostname(hostname); + auto m = receivers(module_id,0,0)->configure(t); + if (m != 0) { + detectors[module_id]->setDestinationUDPMAC(m); + } + } else { + receivers(module_id, 1, 0)->setTCPPort(port); + receivers(module_id, 1, 0)->setHostname(hostname); + auto m = receivers(module_id, 1, 0)->configure(t); + if (m != 0) { + detectors[module_id]->setDestinationUDPMAC2(m); + } + } } void DetectorImpl::updateDetectorSize() { diff --git a/slsDetectorSoftware/src/DetectorImpl.h b/slsDetectorSoftware/src/DetectorImpl.h index 6ea39067e..cfa307853 100755 --- a/slsDetectorSoftware/src/DetectorImpl.h +++ b/slsDetectorSoftware/src/DetectorImpl.h @@ -82,6 +82,8 @@ class DetectorImpl : public virtual slsDetectorDefs { */ virtual ~DetectorImpl(); + + template struct NonDeduced { using type = CT; }; template sls::Result Parallel(RT (sls::Module::*somefunc)(CT...), @@ -302,6 +304,8 @@ class DetectorImpl : public virtual slsDetectorDefs { void setHostname(const std::vector &name, const std::vector &port); + Result getHostname(Positions pos, int udp_interface); + int getNumberofReceiversPerModule() const; void initReceiver(const int udpInterface); bool isReceiverInitialized(const int udpInterface); diff --git a/slsDetectorSoftware/src/MaskGenerator.h b/slsDetectorSoftware/src/MaskGenerator.h index 1250d169f..12439229f 100644 --- a/slsDetectorSoftware/src/MaskGenerator.h +++ b/slsDetectorSoftware/src/MaskGenerator.h @@ -9,7 +9,7 @@ class MaskGenerator { enum class OperationMode { ALL, ROW, SINGLE }; OperationMode mode_{OperationMode::ALL}; - std::vector idx0; + std::vector idx0; // hack size_t x_{0}; size_t y_{0}; size_t z_{0}; @@ -22,15 +22,21 @@ class MaskGenerator { MaskGenerator(size_t i, size_t j, size_t k) : mode_(OperationMode::SINGLE), x_(i), y_(j), z_(k) {} - explicit MaskGenerator(const std::vector vec) + explicit MaskGenerator(const std::vector vec) : mode_(OperationMode::ROW), idx0(vec) {} + explicit MaskGenerator(const std::vector vec, size_t y) + : mode_(OperationMode::ROW), idx0(vec), y_(y) {} + template Container3 mask(const Container3& cont) { return mask(cont.shape()); } Container3 mask(std::array shape) { Container3 m(shape); - + if (idx0.size()== 1 && idx0[0] == -1){ + idx0.resize(m.size(0)); + std::iota(begin(idx0), end(idx0), 0); + } switch (mode_) { case OperationMode::ALL: for (auto &item : m) diff --git a/slsDetectorSoftware/src/Parallel.h b/slsDetectorSoftware/src/Parallel.h index bb9be4686..9244cb7af 100644 --- a/slsDetectorSoftware/src/Parallel.h +++ b/slsDetectorSoftware/src/Parallel.h @@ -10,19 +10,20 @@ end up moving temporary objects into the first called function leaving the other ones with moved from args. */ -namespace experimental{ - +namespace experimental { +using sls::Container3; template struct NonDeduced { using type = CT; }; template -sls::Result -Parallel(RT (Class::*func)(CT...) const, const Container3 &objects, - const Container3 &mask, typename NonDeduced::type... Args) { +sls::Result Parallel(RT (Class::*func)(CT...) const, + const Container3> &objects, + const Container3 &mask, + typename NonDeduced::type... Args) { std::vector> futures; for (size_t i = 0; i < objects.size(); ++i) { if (mask[i]) futures.push_back( - std::async(std::launch::async, func, &objects[i], Args...)); + std::async(std::launch::async, func, objects[i].get(), Args...)); } sls::Result result; for (auto &f : futures) { @@ -32,9 +33,10 @@ Parallel(RT (Class::*func)(CT...) const, const Container3 &objects, } template -sls::Result -Parallel(RT (Class::*func)(CT...), const Container3 &objects, - const Container3 &mask, typename NonDeduced::type... Args) { +sls::Result Parallel(RT (Class::*func)(CT...), + const Container3> &objects, + const Container3 &mask, + typename NonDeduced::type... Args) { std::vector> futures; for (size_t i = 0; i < objects.size(); ++i) { if (mask[i]) @@ -50,7 +52,8 @@ Parallel(RT (Class::*func)(CT...), const Container3 &objects, template void Parallel(void (Class::*func)(CT...) const, - const Container3 &objects, const Container3 &mask, + const Container3> &objects, + const Container3 &mask, typename NonDeduced::type... Args) { std::vector> futures; for (size_t i = 0; i < objects.size(); ++i) { @@ -64,7 +67,8 @@ void Parallel(void (Class::*func)(CT...) const, } template -void Parallel(void (Class::*func)(CT...), const Container3 &objects, +void Parallel(void (Class::*func)(CT...), + const Container3> &objects, const Container3 &mask, typename NonDeduced::type... Args) { @@ -78,4 +82,4 @@ void Parallel(void (Class::*func)(CT...), const Container3 &objects, f.get(); } -} \ No newline at end of file +} // namespace experimental \ No newline at end of file diff --git a/slsDetectorSoftware/tests/test-MaskGenerator.cpp b/slsDetectorSoftware/tests/test-MaskGenerator.cpp index cbff5cfce..88dfeaff2 100644 --- a/slsDetectorSoftware/tests/test-MaskGenerator.cpp +++ b/slsDetectorSoftware/tests/test-MaskGenerator.cpp @@ -23,14 +23,14 @@ TEST_CASE("With std::vector we give back the first index and 0, 0") { Container3 rec{14, 1, 3}; - auto m = MaskGenerator(std::vector{0, 3, 5}).mask(rec.shape()); + auto m = MaskGenerator(std::vector{0, 3, 5}).mask(rec.shape()); CHECK(m.shape() == std::array{14, 1, 3}); CHECK(m(0, 0, 0) == true); CHECK(m(3, 0, 0) == true); CHECK(m(5, 0, 0) == true); - std::vector positions(rec.size(0)); + std::vector positions(rec.size(0)); std::iota(begin(positions), end(positions), 0); positions.erase(std::remove(positions.begin(), positions.end(), 0), positions.end()); @@ -81,4 +81,19 @@ TEST_CASE("With three numbers we get x,y,z") { } } } +} + +TEST_CASE("Passing in -1 as the only element in the vector gives all rows"){ + Container3 r{3,3,3}; + std::vector vec{-1}; + auto m = MaskGenerator(vec, 0).mask(r); + REQUIRE(m.shape() == std::array{3,3,3}); + CHECK(m(0,0,0) == true); + CHECK(m(1,0,0) == true); + CHECK(m(2,0,0) == true); + + CHECK(m(0,1,0) == false); + CHECK(m(0,2,0) == false); + CHECK(m(0,0,1) == false); + } \ No newline at end of file