WIP: none to remove receivers

This commit is contained in:
maliakal_d 2020-04-17 10:34:10 +02:00
parent 9a208caca8
commit cfa9049ed3
5 changed files with 127 additions and 100 deletions

View File

@ -505,6 +505,10 @@ class Detector {
* * * *
* ************************************************/ * ************************************************/
/** interface is by 1 (primary udp interface),
* 2 for second udp interface [Eiger][Jungfrau] */
void removeReceivers(const int udpInterface);
/** true when slsReceiver is used */ /** true when slsReceiver is used */
Result<bool> getUseReceiverFlag(Positions pos = {}) const; Result<bool> getUseReceiverFlag(Positions pos = {}) const;

View File

@ -955,6 +955,7 @@ std::string CmdProxy::ReceiverHostname(int action) {
os << "[hostname or ip address]\n\t" os << "[hostname or ip address]\n\t"
"[hostname or ip address]:[tcp port]\n\t" "[hostname or ip address]:[tcp port]\n\t"
"Receiver hostname or IP. Port is the receiver tcp port (optional).\n\t" "Receiver hostname or IP. Port is the receiver tcp port (optional).\n\t"
"Use 'none' to remove receivers\n\t"
"Used for TCP control communication between client and receiver " "Used for TCP control communication between client and receiver "
"to configure receiver. Also updates receiver with detector parameters.\n\t" "to configure receiver. Also updates receiver with detector parameters.\n\t"
"TCP port must be unique, if included.\n\t" "TCP port must be unique, if included.\n\t"
@ -967,6 +968,7 @@ std::string CmdProxy::ReceiverHostname(int action) {
"[hostname or ip address]:[tcp port]\n\t" "[hostname or ip address]:[tcp port]\n\t"
"[Eiger][Jungfrau] Receiver hostname or IP for the second udp port. " "[Eiger][Jungfrau] Receiver hostname or IP for the second udp port. "
"Port is the receiver tcp port (optional).\n\t" "Port is the receiver tcp port (optional).\n\t"
"Use 'none' to remove receivers\n\t"
"Refer rx_hostname help for details" "Refer rx_hostname help for details"
<< '\n'; << '\n';
} }
@ -984,19 +986,27 @@ std::string CmdProxy::ReceiverHostname(int action) {
throw sls::RuntimeError("Cannot concatenate receiver hostnames"); throw sls::RuntimeError("Cannot concatenate receiver hostnames");
} }
std::pair<std::string, int> res = parseHostnameAndPort(args[0]); std::pair<std::string, int> res = parseHostnameAndPort(args[0]);
std::string hostname = res.first; // removing receivers
int port = res.second; if (res.first == "none") {
if (port == 0) { det->removeReceivers(udpInterface);
det->setRxHostname(udpInterface, hostname, {det_id}); os << "removed" << '\n';
} else { }
if (det_id == -1 && det->size() > 1) { // adding receivers
throw sls::RuntimeError("Cannot set same tcp port " else {
"for all receiver hostnames"); std::string hostname = res.first;
} int port = res.second;
det->setRxHostname(udpInterface, hostname, port, det_id); if (port == 0) {
det->setRxHostname(udpInterface, hostname, {det_id});
} else {
if (det_id == -1 && det->size() > 1) {
throw sls::RuntimeError("Cannot set same tcp port "
"for all receiver hostnames");
}
det->setRxHostname(udpInterface, hostname, port, det_id);
}
auto t = det->getRxHostname(udpInterface, {det_id});
os << OutString(t) << '\n';
} }
auto t = det->getRxHostname(udpInterface, {det_id});
os << OutString(t) << '\n';
} else { } else {
throw sls::RuntimeError("Unknown action"); throw sls::RuntimeError("Unknown action");
} }

View File

@ -691,6 +691,11 @@ void Detector::setTransmissionDelayRight(int value, Positions pos) {
// Receiver // Receiver
void Detector::removeReceivers(const int udpInterface) {
pimpl->removeReceivers(udpInterface);
}
Result<bool> Detector::getUseReceiverFlag(Positions pos) const { Result<bool> Detector::getUseReceiverFlag(Positions pos) const {
return pimpl->Parallel(&Module::getUseReceiverFlag, pos); return pimpl->Parallel(&Module::getUseReceiverFlag, pos);
} }
@ -702,48 +707,33 @@ Result<std::string> Detector::getRxHostname(const int udpInterface, Positions po
case 2: case 2:
return pimpl->Parallel2(&Receiver::getHostname, pos, {0}); return pimpl->Parallel2(&Receiver::getHostname, pos, {0});
default: default:
throw RuntimeError("Invalid udp interface number"); throw RuntimeError("Invalid udp interface number " +
std::to_string(udpInterface));
} }
} }
void Detector::setRxHostname(const int udpInterface, const std::string &hostname, Positions pos) { void Detector::setRxHostname(const int udpInterface, const std::string &hostname, Positions pos) {
switch (udpInterface) { if (!pimpl->isReceiverInitialized(udpInterface)) {
case 1: pimpl->initReceiver(udpInterface);
if (!pimpl->isReceiverInitialized()) { }
pimpl->initReceiver(); if (udpInterface == 1) {
} pimpl->Parallel1(&Receiver::setHostname, pos, {0}, hostname);
pimpl->Parallel1(&Receiver::setHostname, pos, {0}, hostname); } else {
break; pimpl->Parallel2(&Receiver::setHostname, pos, {0}, hostname);
case 2:
if (!pimpl->isReceiver2Initialized()) {
pimpl->initReceiver2();
}
pimpl->Parallel2(&Receiver::setHostname, pos, {0}, hostname);
break;
default:
throw RuntimeError("Invalid udp interface number");
} }
} }
void Detector::setRxHostname(const int udpInterface, const std::string &hostname, const int port, void Detector::setRxHostname(const int udpInterface, const std::string &hostname, const int port,
int module_id) { int module_id) {
switch (udpInterface) { if (!pimpl->isReceiverInitialized(udpInterface)) {
case 1: pimpl->initReceiver(udpInterface);
if (!pimpl->isReceiverInitialized()) { }
pimpl->initReceiver(); if (udpInterface == 1) {
} pimpl->Parallel1(&Receiver::setTCPPort, {module_id}, {0}, port);
pimpl->Parallel1(&Receiver::setTCPPort, {module_id}, {0}, port); pimpl->Parallel1(&Receiver::setHostname, {module_id}, {0}, hostname);
pimpl->Parallel1(&Receiver::setHostname, {module_id}, {0}, hostname); } else {
break; pimpl->Parallel2(&Receiver::setTCPPort, {module_id}, {0}, port);
case 2: pimpl->Parallel2(&Receiver::setHostname, {module_id}, {0}, hostname);
if (!pimpl->isReceiver2Initialized()) {
pimpl->initReceiver2();
}
pimpl->Parallel2(&Receiver::setTCPPort, {module_id}, {0}, port);
pimpl->Parallel2(&Receiver::setHostname, {module_id}, {0}, hostname);
break;
default:
throw RuntimeError("Invalid udp interface number");
} }
} }
@ -754,15 +744,16 @@ Result<int> Detector::getRxPort(const int udpInterface, Positions pos) const {
case 2: case 2:
return pimpl->Parallel2(&Receiver::getTCPPort, pos, {0}); return pimpl->Parallel2(&Receiver::getTCPPort, pos, {0});
default: default:
throw RuntimeError("Invalid udp interface number"); throw RuntimeError("Invalid udp interface number " +
std::to_string(udpInterface));
} }
} }
void Detector::setRxPort(const int udpInterface, int port, int module_id) { void Detector::setRxPort(const int udpInterface, int port, int module_id) {
if (!pimpl->isReceiverInitialized(udpInterface)) {
pimpl->initReceiver(udpInterface);
}
if (udpInterface == 1) { if (udpInterface == 1) {
if (!pimpl->isReceiverInitialized()) {
pimpl->initReceiver();
}
if (module_id == -1) { if (module_id == -1) {
std::vector<int> port_list = getPortNumbers(port); std::vector<int> port_list = getPortNumbers(port);
for (int idet = 0; idet < size(); ++idet) { for (int idet = 0; idet < size(); ++idet) {
@ -772,10 +763,7 @@ void Detector::setRxPort(const int udpInterface, int port, int module_id) {
} else { } else {
pimpl->Parallel1(&Receiver::setTCPPort, {module_id}, {0}, port); pimpl->Parallel1(&Receiver::setTCPPort, {module_id}, {0}, port);
} }
} else if (udpInterface == 2) { } else {
if (!pimpl->isReceiver2Initialized()) {
pimpl->initReceiver2();
}
if (module_id == -1) { if (module_id == -1) {
std::vector<int> port_list = getPortNumbers(port); std::vector<int> port_list = getPortNumbers(port);
for (int idet = 0; idet < size(); ++idet) { for (int idet = 0; idet < size(); ++idet) {
@ -785,8 +773,6 @@ void Detector::setRxPort(const int udpInterface, int port, int module_id) {
} else { } else {
pimpl->Parallel2(&Receiver::setTCPPort, {module_id}, {0}, port); pimpl->Parallel2(&Receiver::setTCPPort, {module_id}, {0}, port);
} }
} else {
throw RuntimeError("Invalid udp interface number");
} }
} }

View File

@ -361,52 +361,80 @@ void DetectorImpl::addModule(const std::string &hostname,
detectors[pos]->updateNumberOfChannels(); detectors[pos]->updateNumberOfChannels();
} }
void DetectorImpl::initReceiver() { void DetectorImpl::initReceiver(const int udpInterface) {
if (receivers.size() != 0) { if (udpInterface == 1) {
throw RuntimeError("receiver vector already initialized"); 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<Receiver>(detectorId, iModule, 0,
true, tcpPort++, "", zmqPort++));
detectors[iModule]->setNumberOfReceivers(1);
} }
} catch (...) { int tcpPort = DEFAULT_RX_PORTNO;
receivers.clear(); int zmqPort = DEFAULT_ZMQ_CL_PORTNO;
throw; try {
} for (int iModule = 0; iModule < size(); ++iModule) {
} receivers.resize(detectors.size());
receivers[iModule].push_back(
bool DetectorImpl::isReceiverInitialized() { sls::make_unique<Receiver>(detectorId, iModule, 0,
return (receivers.size() > 0); true, tcpPort++, "", zmqPort++));
} detectors[iModule]->setNumberOfReceivers(1);
}
void DetectorImpl::initReceiver2() { } catch (...) {
if (receivers2.size() != 0) { receivers.clear();
throw RuntimeError("receiver2 vector already initialized"); throw;
}
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<Receiver>(detectorId, iModule, 0,
false, tcpPort++, "", zmqPort++));
detectors[iModule]->setNumberOfReceivers2(1);
} }
} catch (...) { } else if (udpInterface == 2) {
receivers.clear(); if (receivers2.size() != 0) {
throw; 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<Receiver>(detectorId, iModule, 0,
false, tcpPort++, "", zmqPort++));
detectors[iModule]->setNumberOfReceivers2(1);
}
} catch (...) {
receivers2.clear();
throw;
}
} else {
throw RuntimeError("Invalid udp interface number " +
std::to_string(udpInterface));
} }
} }
bool DetectorImpl::isReceiver2Initialized() { bool DetectorImpl::isReceiverInitialized(const int udpInterface) {
return (receivers2.size() > 0); switch (udpInterface) {
case 1:
return (receivers.size() > 0);
case 2:
return (receivers2.size() > 0);
default:
throw RuntimeError("Invalid udp interface number " +
std::to_string(udpInterface));
}
}
void DetectorImpl::removeReceivers(const int udpInterface) {
if (udpInterface == 1) {
for (auto & dr: receivers) {
for (auto & r : dr) {
r->freeSharedMemory();
}
}
receivers.clear();
} else if (udpInterface == 2) {
for (auto & dr: receivers2) {
for (auto & r : dr) {
r->freeSharedMemory();
}
}
receivers2.clear();
} else {
throw RuntimeError("Invalid udp interface number " +
std::to_string(udpInterface));
}
} }
void DetectorImpl::updateDetectorSize() { void DetectorImpl::updateDetectorSize() {

View File

@ -528,10 +528,9 @@ class DetectorImpl : public virtual slsDetectorDefs {
void setHostname(const std::vector<std::string> &name, void setHostname(const std::vector<std::string> &name,
const std::vector<int> &port); const std::vector<int> &port);
void initReceiver(); void initReceiver(const int udpInterface);
bool isReceiverInitialized(); bool isReceiverInitialized(const int udpInterface);
void initReceiver2(); void removeReceivers(const int udpInterface);
bool isReceiver2Initialized();
/** Gets the total number of detectors */ /** Gets the total number of detectors */
int size() const; int size() const;