exposing receiver thread ids to client (#102)

* exposing receiver thread ids to client

Co-authored-by: Erik Frojdh <erik.frojdh@gmail.com>
This commit is contained in:
Dhanya Thattil
2020-06-09 16:18:37 +02:00
committed by GitHub
parent 2a2bb5f63a
commit f5160b0978
48 changed files with 1151 additions and 580 deletions

View File

@ -331,6 +331,25 @@ std::string CmdProxy::DetectorSize(int action) {
return os.str();
}
std::string CmdProxy::SettingsList(int action) {
std::ostringstream os;
os << cmd << ' ';
if (action == defs::HELP_ACTION) {
os << "\n\tList of settings implemented for this detector" << '\n';
} else if (action == defs::GET_ACTION) {
if (!args.empty()) {
WrongNumberOfParameters(0);
}
auto t = det->getSettingsList();
os << ToString(t) << "\n";
} else if (action == defs::PUT_ACTION) {
throw sls::RuntimeError("Cannot put");
} else {
throw sls::RuntimeError("Unknown action");
}
return os.str();
}
std::string CmdProxy::GapPixels(int action) {
std::ostringstream os;
os << cmd << ' ';
@ -877,7 +896,11 @@ std::string CmdProxy::DacList(int action) {
os << "\n\tGets the list of commands for every dac for this detector."
<< '\n';
} else if (action == defs::GET_ACTION) {
os << sls::ToString(DacCommands()) << '\n';
if (!args.empty()) {
WrongNumberOfParameters(0);
}
auto t = det->getDacList();
os << ToString(t) << '\n';
} else if (action == defs::PUT_ACTION) {
throw sls::RuntimeError("Cannot put");
} else {
@ -890,29 +913,32 @@ std::string CmdProxy::DacValues(int action) {
std::ostringstream os;
os << cmd << ' ';
if (action == defs::HELP_ACTION) {
os << "\n\tGets the list of commands for every dac for this detector."
os << "[(optional unit) mv] \n\tGets the list of commands for every "
"dac for this detector."
<< '\n';
} else if (action == defs::GET_ACTION) {
std::vector<std::string> names = DacCommands();
std::vector<std::string> res(names.size());
std::vector<std::string> args;
for (size_t i = 0; i < names.size(); ++i) {
// for multiple values for each command (to use ToString on vector)
std::ostringstream each;
size_t spacepos = names[i].find(' ');
// chip test board (dac)
if (spacepos != std::string::npos) {
if (args.empty()) {
args.resize(1);
}
args[0] = names[i].substr(spacepos + 1 - 1);
names[i] = names[i].substr(0, spacepos);
bool mv = false;
if (args.size() == 1) {
if (args[0] != "mv") {
throw sls::RuntimeError("Unknown argument " + args[0] +
". Did you mean mv?");
}
Call(names[i], args, det_id, action, each);
res[i] = each.str();
res[i].pop_back(); // remove last \n character
mv = true;
} else if (args.size() > 1) {
WrongNumberOfParameters(1);
}
os << sls::ToString(res) << '\n';
auto t = det->getDacList();
os << '[';
auto it = t.cbegin();
os << ToString(*it) << ' '
<< OutString(det->getDAC(*it++, mv, {det_id}))
<< (args.size() > 0 ? " mv" : "");
while (it != t.cend()) {
os << ", " << ToString(*it) << ' '
<< OutString(det->getDAC(*it++, mv, {det_id}))
<< (args.size() > 0 ? " mv" : "");
}
os << "]\n";
} else if (action == defs::PUT_ACTION) {
throw sls::RuntimeError("Cannot put");
} else {
@ -921,53 +947,6 @@ std::string CmdProxy::DacValues(int action) {
return os.str();
}
std::vector<std::string> CmdProxy::DacCommands() {
switch (det->getDetectorType().squash(defs::GENERIC)) {
case defs::EIGER:
return std::vector<std::string>{
"vsvp", "vtr", "vrf", "vrs", "vsvn", "vtgstv",
"vcmp_ll", "vcmp_lr", "vcal", "vcmp_rl", "rxb_rb", "rxb_lb",
"vcmp_rr", "vcp", "vcn", "vis", "vthreshold"};
break;
case defs::JUNGFRAU:
return std::vector<std::string>{"vb_comp", "vdd_prot", "vin_com",
"vref_prech", "vb_pixbuf", "vb_ds",
"vref_ds", "vref_comp"};
break;
case defs::GOTTHARD:
return std::vector<std::string>{"vref_ds", "vcascn_pb", "vcascp_pb",
"vout_cm", "vcasc_out", "vin_cm",
"vref_comp", "ib_test_c"};
break;
case defs::GOTTHARD2:
return std::vector<std::string>{
"vref_h_adc", "vb_comp_fe", "vb_comp_adc", "vcom_cds",
"vref_rstore", "vb_opa_1st", "vref_comp_fe", "vcom_adc1",
"vref_prech", "vref_l_adc", "vref_cds", "vb_cs",
"vb_opa_fd", "vcom_adc2"};
break;
case defs::MYTHEN3:
return std::vector<std::string>{
"vcassh", "vth2", "vshaper", "vshaperneg", "vipre_out", "vth3",
"vth1", "vicin", "vcas", "vpreamp", "vpl", "vipre",
"viinsh", "vph", "vtrim", "vdcsh"};
break;
case defs::MOENCH:
return std::vector<std::string>{"vbp_colbuf", "vipre", "vin_cm",
"vb_sda", "vcasc_sfp", "vout_cm",
"vipre_cds", "ibias_sfp"};
break;
case defs::CHIPTESTBOARD:
return std::vector<std::string>{
"dac 0", "dac 1", "dac 2", "dac 3", "dac 4", "dac 5",
"dac 6", "dac 7", "dac 8", "dac 9", "dac 10", "dac 11",
"dac 12", "dac 13", "dac 14", "dac 15", "dac 16", "dac 17"};
break;
default:
throw sls::RuntimeError("Unknown detector type.");
}
}
/* acquisition */
std::string CmdProxy::ReceiverStatus(int action) {

View File

@ -478,8 +478,19 @@ class CmdProxy {
{"digitest", "imagetest"},
/** temperature */
/** dacs */
{"vtr", "vtrim"},
{"vrf", "vrpreamp"},
{"vrs", "vrshaper"},
{"vcall", "vcal"},
{"vis", "vishaper"},
{"vshaper", "vrshaper"},
{"vpreamp", "vrpreamp"},
{"vshaperneg", "vrshaper_n"},
{"viinsh", "vishaper"},
{"vpl", "vcal_n"},
{"vph", "vcal_p"},
/* acquisition */
{"busy", "clearbusy"},
@ -562,6 +573,7 @@ class CmdProxy {
{"detectornumber", &CmdProxy::detectornumber},
{"type", &CmdProxy::type},
{"detsize", &CmdProxy::DetectorSize},
{"settingslist", &CmdProxy::SettingsList},
{"settings", &CmdProxy::settings},
{"trimbits", &CmdProxy::trimbits},
{"trimval", &CmdProxy::trimval},
@ -608,9 +620,9 @@ class CmdProxy {
{"vthreshold", &CmdProxy::vthreshold},
{"vsvp", &CmdProxy::vsvp},
{"vsvn", &CmdProxy::vsvn},
{"vtr", &CmdProxy::vtr},
{"vrf", &CmdProxy::vrf},
{"vrs", &CmdProxy::vrs},
{"vtrim", &CmdProxy::vtrim},
{"vrpreamp", &CmdProxy::vrpreamp},
{"vrshaper", &CmdProxy::vrshaper},
{"vtgstv", &CmdProxy::vtgstv},
{"vcmp_ll", &CmdProxy::vcmp_ll},
{"vcmp_lr", &CmdProxy::vcmp_lr},
@ -621,7 +633,7 @@ class CmdProxy {
{"rxb_lb", &CmdProxy::rxb_lb},
{"vcp", &CmdProxy::vcp},
{"vcn", &CmdProxy::vcn},
{"vis", &CmdProxy::vis},
{"vishaper", &CmdProxy::vishaper},
{"iodelay", &CmdProxy::iodelay},
{"vref_ds", &CmdProxy::vref_ds},
{"vcascn_pb", &CmdProxy::vcascn_pb},
@ -631,18 +643,14 @@ class CmdProxy {
{"vin_cm", &CmdProxy::vin_cm},
{"vref_comp", &CmdProxy::vref_comp},
{"ib_test_c", &CmdProxy::ib_test_c},
{"vpreamp", &CmdProxy::vpreamp},
{"vshaper", &CmdProxy::vshaper},
{"vshaperneg", &CmdProxy::vshaperneg},
{"vrshaper_n", &CmdProxy::vrshaper_n},
{"vipre", &CmdProxy::vipre},
{"viinsh", &CmdProxy::viinsh},
{"vdcsh", &CmdProxy::vdcsh},
{"vth1", &CmdProxy::vth1},
{"vth2", &CmdProxy::vth2},
{"vth3", &CmdProxy::vth3},
{"vpl", &CmdProxy::vpl},
{"vph", &CmdProxy::vph},
{"vtrim", &CmdProxy::vtrim},
{"vcal_n", &CmdProxy::vcal_n},
{"vcal_p", &CmdProxy::vcal_p},
{"vcassh", &CmdProxy::vcassh},
{"vcas", &CmdProxy::vcas},
{"vicin", &CmdProxy::vicin},
@ -729,6 +737,7 @@ class CmdProxy {
{"rx_realudpsocksize", &CmdProxy::rx_realudpsocksize},
{"rx_lock", &CmdProxy::rx_lock},
{"rx_lastclient", &CmdProxy::rx_lastclient},
{"rx_threads", &CmdProxy::rx_threads},
/* File */
{"fformat", &CmdProxy::fformat},
@ -923,6 +932,7 @@ class CmdProxy {
std::string PackageVersion(int action);
std::string ClientVersion(int action);
std::string DetectorSize(int action);
std::string SettingsList(int action);
std::string GapPixels(int action);
/* acquisition parameters */
std::string acquire(int action);
@ -940,7 +950,6 @@ class CmdProxy {
std::string Dac(int action);
std::string DacList(int action);
std::string DacValues(int action);
std::vector<std::string> DacCommands();
/* acquisition */
std::string ReceiverStatus(int action);
std::string DetectorStatus(int action);
@ -1180,29 +1189,33 @@ class CmdProxy {
/* dacs */
DAC_COMMAND(vthreshold, getDAC, setDAC, defs::THRESHOLD,
DAC_COMMAND(vthreshold, getDAC, setDAC, defs::VTHRESHOLD,
"[dac or mv value][(optional unit) mv] \n\t[Eiger][Mythen3] "
"Detector threshold voltage for single photon counters.");
DAC_COMMAND(vsvp, getDAC, setDAC, defs::SVP,
DAC_COMMAND(vsvp, getDAC, setDAC, defs::VSVP,
"[dac or mv value][(optional unit) mv] \n\t[Eiger] Dac for "
"?? "); // TODO
DAC_COMMAND(vsvn, getDAC, setDAC, defs::SVN,
DAC_COMMAND(vsvn, getDAC, setDAC, defs::VSVN,
"[dac or mv value][(optional unit) mv] \n\t[Eiger] Dac for "
"?? "); // TODO
"?? \n\t[Mythen3] voltage "
"to define feedback resistance of the first shaper"); // TODO
DAC_COMMAND(vtr, getDAC, setDAC, defs::VTR,
DAC_COMMAND(vtrim, getDAC, setDAC, defs::VTRIM,
"[dac or mv value][(optional unit) mv] \n\t[Eiger] Dac for "
"?? "); // TODO
"?? \n\t[Mythen3] Dac for "
"the voltage defining the trim bit size."); // TODO
DAC_COMMAND(vrf, getDAC, setDAC, defs::VRF,
DAC_COMMAND(vrpreamp, getDAC, setDAC, defs::VRPREAMP,
"[dac or mv value][(optional unit) mv] \n\t[Eiger] Dac for "
"?? "); // TODO
"?? \n\t[Mythen3] voltage "
"to define the preamplifier feedback resistance."); // TODO
DAC_COMMAND(vrs, getDAC, setDAC, defs::VRS,
DAC_COMMAND(vrshaper, getDAC, setDAC, defs::VRSHAPER,
"[dac or mv value][(optional unit) mv] \n\t[Eiger] Dac for "
"?? "); // TODO
"?? \n\t[Mythen3] voltage to define feedback resistance of "
"the first shaper"); // TODO
DAC_COMMAND(vtgstv, getDAC, setDAC, defs::VTGSTV,
"[dac or mv value][(optional unit) mv] \n\t[Eiger] Dac for "
@ -1216,7 +1229,7 @@ class CmdProxy {
"[dac or mv value][(optional unit) mv] \n\t[Eiger] Dac for "
"?? "); // TODO
DAC_COMMAND(vcal, getDAC, setDAC, defs::CAL,
DAC_COMMAND(vcal, getDAC, setDAC, defs::VCAL,
"[dac or mv value][(optional unit) mv] \n\t[Eiger] Dac for "
"?? "); // TODO
@ -1244,9 +1257,10 @@ class CmdProxy {
"[dac or mv value][(optional unit) mv] \n\t[Eiger] Dac for "
"?? "); // TODO
DAC_COMMAND(vis, getDAC, setDAC, defs::VIS,
DAC_COMMAND(vishaper, getDAC, setDAC, defs::VISHAPER,
"[dac or mv value][(optional unit) mv] \n\t[Eiger] Dac for "
"?? "); // TODO
"?? \n\t[Mythen3] Dac for "
"the bias current for the shaper."); // TODO
DAC_COMMAND(iodelay, getDAC, setDAC, defs::IO_DELAY,
"[dac or mv value][(optional unit) mv] \n\t[Eiger] Dac for "
@ -1284,15 +1298,7 @@ class CmdProxy {
"[dac or mv value][(optional unit) mv] \n\t[Gotthard] Dac for "
"?? "); // TODO
DAC_COMMAND(vpreamp, getDAC, setDAC, defs::PREAMP,
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] voltage "
"to define the preamplifier feedback resistance.");
DAC_COMMAND(vshaper, getDAC, setDAC, defs::SHAPER1,
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] voltage "
"to define feedback resistance of the first shaper");
DAC_COMMAND(vshaperneg, getDAC, setDAC, defs::SHAPER2,
DAC_COMMAND(vrshaper_n, getDAC, setDAC, defs::VRSHAPER_N,
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] voltage "
"to define feedback resistance of the second shaper.");
@ -1301,15 +1307,11 @@ class CmdProxy {
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for the "
"preamplifier's input transistor current.\n\t[Moench] Dac for 1");
DAC_COMMAND(viinsh, getDAC, setDAC, defs::VIINSH,
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for "
"the bias current for the shaper.");
DAC_COMMAND(vdcsh, getDAC, setDAC, defs::VDCSH,
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for "
"the reference (DC) voltage for the shaper.");
DAC_COMMAND(vth1, getDAC, setDAC, defs::THRESHOLD,
DAC_COMMAND(vth1, getDAC, setDAC, defs::VTH1,
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for "
"first detector threshold voltage.");
@ -1321,23 +1323,19 @@ class CmdProxy {
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for "
"third detector threshold voltage.");
DAC_COMMAND(vpl, getDAC, setDAC, defs::VPL,
DAC_COMMAND(vcal_n, getDAC, setDAC, defs::VCAL_N,
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for "
"the low voltage for analog pulsing.");
DAC_COMMAND(vph, getDAC, setDAC, defs::CALIBRATION_PULSE,
DAC_COMMAND(vcal_p, getDAC, setDAC, defs::VCAL_P,
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for "
"the high voltage for analog pulsing.");
DAC_COMMAND(vtrim, getDAC, setDAC, defs::TRIMBIT_SIZE,
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for "
"the voltage defining the trim bit size.");
DAC_COMMAND(vcassh, getDAC, setDAC, defs::CASSH,
DAC_COMMAND(vcassh, getDAC, setDAC, defs::VCASSH,
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for "
"the shaper's cascode voltage.");
DAC_COMMAND(vcas, getDAC, setDAC, defs::CAS,
DAC_COMMAND(vcas, getDAC, setDAC, defs::VCAS,
"[dac or mv value][(optional unit) mv] \n\t[Mythen3] Dac for "
"the preamplifier's cascode voltage.");
@ -1663,6 +1661,14 @@ class CmdProxy {
rx_lastclient, getRxLastClientIP,
"\n\tClient IP Address that last communicated with the receiver.");
GET_COMMAND(
rx_threads, getRxThreadIds,
"\n\tGet thread ids from the receiver in order of [parent, tcp, "
"listener 0, "
"processor 0, streamer 0, listener 1, processor 1, streamer 1]. If no "
"streamer yet or there is no second interface, it gives 0 in its "
"place.");
/* File */
INTEGER_COMMAND(

View File

@ -141,6 +141,38 @@ void Detector::setDetectorSize(const defs::xy value) {
pimpl->setNumberOfChannels(value);
}
std::vector<defs::detectorSettings> Detector::getSettingsList() const {
switch (getDetectorType().squash()) {
case defs::EIGER:
return std::vector<defs::detectorSettings>{
defs::STANDARD, defs::HIGHGAIN, defs::LOWGAIN, defs::VERYHIGHGAIN,
defs::VERYLOWGAIN};
case defs::GOTTHARD:
return std::vector<defs::detectorSettings>{
defs::HIGHGAIN, defs::DYNAMICGAIN, defs::LOWGAIN, defs::MEDIUMGAIN,
defs::VERYHIGHGAIN};
case defs::JUNGFRAU:
return std::vector<defs::detectorSettings>{
defs::DYNAMICGAIN, defs::DYNAMICHG0, defs::FIXGAIN1,
defs::FIXGAIN2, defs::FORCESWITCHG1, defs::FORCESWITCHG2};
case defs::GOTTHARD2:
return std::vector<defs::detectorSettings>{
defs::DYNAMICGAIN, defs::DYNAMICHG0, defs::FIXGAIN1,
defs::FIXGAIN2};
case defs::MOENCH:
return std::vector<defs::detectorSettings>{
defs::G1_HIGHGAIN, defs::G1_LOWGAIN,
defs::G2_HIGHCAP_HIGHGAIN, defs::G2_HIGHCAP_LOWGAIN,
defs::G2_LOWCAP_HIGHGAIN, defs::G2_LOWCAP_LOWGAIN,
defs::G4_HIGHGAIN, defs::G4_LOWGAIN};
case defs::CHIPTESTBOARD:
case defs::MYTHEN3:
throw RuntimeError("Settings not implemented for this detector");
default:
throw RuntimeError("Unknown detector type");
}
}
Result<defs::detectorSettings> Detector::getSettings(Positions pos) const {
return pimpl->Parallel(&Module::getSettings, pos);
}
@ -405,6 +437,53 @@ Result<int> Detector::getTemperature(defs::dacIndex index,
return res;
}
std::vector<defs::dacIndex> Detector::getDacList() const {
std::vector<defs::dacIndex> retval;
switch (getDetectorType().squash()) {
case defs::EIGER:
return std::vector<defs::dacIndex>{
defs::VSVP, defs::VTRIM, defs::VRPREAMP, defs::VRSHAPER,
defs::VSVN, defs::VTGSTV, defs::VCMP_LL, defs::VCMP_LR,
defs::VCAL, defs::VCMP_RL, defs::RXB_RB, defs::RXB_LB,
defs::VCMP_RR, defs::VCP, defs::VCN, defs::VISHAPER,
defs::VTHRESHOLD};
case defs::GOTTHARD:
return std::vector<defs::dacIndex>{
defs::VREF_DS, defs::VCASCN_PB, defs::VCASCP_PB, defs::VOUT_CM,
defs::VCASC_OUT, defs::VIN_CM, defs::VREF_COMP, defs::IB_TESTC};
case defs::JUNGFRAU:
return std::vector<defs::dacIndex>{
defs::VB_COMP, defs::VDD_PROT, defs::VIN_COM, defs::VREF_PRECH,
defs::VB_PIXBUF, defs::VB_DS, defs::VREF_DS, defs::VREF_COMP};
case defs::GOTTHARD2:
return std::vector<defs::dacIndex>{
defs::VREF_H_ADC, defs::VB_COMP_FE, defs::VB_COMP_ADC,
defs::VCOM_CDS, defs::VREF_RSTORE, defs::VB_OPA_1ST,
defs::VREF_COMP_FE, defs::VCOM_ADC1, defs::VREF_PRECH,
defs::VREF_L_ADC, defs::VREF_CDS, defs::VB_CS,
defs::VB_OPA_FD, defs::VCOM_ADC2};
case defs::MYTHEN3:
return std::vector<defs::dacIndex>{
defs::VCASSH, defs::VTH2, defs::VRSHAPER, defs::VRSHAPER_N,
defs::VIPRE_OUT, defs::VTH3, defs::VTH1, defs::VICIN,
defs::VCAS, defs::VRPREAMP, defs::VCAL_N, defs::VIPRE,
defs::VISHAPER, defs::VCAL_P, defs::VTRIM, defs::VDCSH,
defs::VTHRESHOLD};
case defs::MOENCH:
return std::vector<defs::dacIndex>{
defs::VBP_COLBUF, defs::VIPRE, defs::VIN_CM, defs::VB_SDA,
defs::VCASC_SFP, defs::VOUT_CM, defs::VIPRE_CDS, defs::IBIAS_SFP};
case defs::CHIPTESTBOARD:
for (int i = 0; i != 18; ++i) {
retval.push_back(static_cast<defs::dacIndex>(i));
}
break;
default:
throw RuntimeError("Unknown detector type");
}
return retval;
}
Result<int> Detector::getDAC(defs::dacIndex index, bool mV,
Positions pos) const {
return pimpl->Parallel(&Module::setDAC, pos, -1, index, mV);
@ -759,6 +838,11 @@ Result<sls::IpAddr> Detector::getRxLastClientIP(Positions pos) const {
return pimpl->Parallel(&Module::getReceiverLastClientIP, pos);
}
Result<std::array<pid_t, NUM_RX_THREAD_IDS>>
Detector::getRxThreadIds(Positions pos) const {
return pimpl->Parallel(&Module::getReceiverThreadIds, pos);
}
// File
Result<defs::fileFormat> Detector::getFileFormat(Positions pos) const {

View File

@ -289,7 +289,7 @@ template <typename Ret> Ret Module::sendToReceiver(int fnum) const {
<< sizeof(Ret) << "]";
Ret retval{};
sendToReceiver(fnum, nullptr, 0, &retval, sizeof(retval));
LOG(logDEBUG1) << "Got back: " << retval;
LOG(logDEBUG1) << "Got back: " << ToString(retval);
return retval;
}
@ -2614,6 +2614,11 @@ sls::IpAddr Module::getReceiverLastClientIP() const {
return sendToReceiver<sls::IpAddr>(F_GET_LAST_RECEIVER_CLIENT_IP);
}
std::array<pid_t, NUM_RX_THREAD_IDS> Module::getReceiverThreadIds() const {
return sendToReceiver<std::array<pid_t, NUM_RX_THREAD_IDS>>(
F_GET_RECEIVER_THREAD_IDS);
}
void Module::exitReceiver() {
LOG(logDEBUG1) << "Sending exit command to receiver server";
sendToReceiver(F_EXIT_RECEIVER, nullptr, nullptr);

View File

@ -1309,6 +1309,8 @@ class Module : public virtual slsDetectorDefs {
*/
sls::IpAddr getReceiverLastClientIP() const;
std::array<pid_t, NUM_RX_THREAD_IDS> getReceiverThreadIds() const;
/**
* Exits the receiver TCP server
*/