diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h index e3dbc06f9..58a127c50 100644 --- a/slsDetectorSoftware/include/Detector.h +++ b/slsDetectorSoftware/include/Detector.h @@ -338,6 +338,9 @@ class Detector { * Only for virtual servers */ void setImageTestMode(const int value, Positions pos = {}); + /** gets list of temperature indices for this detector */ + std::vector getTemperatureList() const; + /** * (Degrees) * [Gotthard] Options: TEMPERATURE_ADC, TEMPERATURE_FPGA diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index dfbfd934f..efd75fe49 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -850,6 +850,36 @@ std::string CmdProxy::ExternalSignal(int action) { } /** temperature */ +std::string CmdProxy::TemperatureValues(int action) { + std::ostringstream os; + os << cmd << ' '; + if (action == defs::HELP_ACTION) { + os << "\n\tGets the values for every temperature for this detector." + << '\n'; + } else if (action == defs::GET_ACTION) { + if (args.size() != 0) { + WrongNumberOfParameters(0); + } + auto t = det->getTemperatureList(); + os << '['; + if (t.size() > 0) { + auto it = t.cbegin(); + os << ToString(*it) << ' '; + os << OutString(det->getTemperature(*it++, {det_id})) << " °C"; + while (it != t.cend()) { + os << ", " << ToString(*it) << ' '; + os << OutString(det->getTemperature(*it++, {det_id})) << " °C"; + } + } + os << "]\n"; + } else if (action == defs::PUT_ACTION) { + throw sls::RuntimeError("Cannot put"); + } else { + throw sls::RuntimeError("Unknown action"); + } + return os.str(); +} + /* dacs */ std::string CmdProxy::Dac(int action) { std::ostringstream os; @@ -902,7 +932,7 @@ std::string CmdProxy::DacValues(int action) { std::ostringstream os; os << cmd << ' '; if (action == defs::HELP_ACTION) { - os << "[(optional unit) mv] \n\tGets the list of commands for every " + os << "[(optional unit) mv] \n\tGets the values for every " "dac for this detector." << '\n'; } else if (action == defs::GET_ACTION) { diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index c2641bc40..28e4a0ea7 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -684,6 +684,8 @@ class CmdProxy { {"extsig", &CmdProxy::ExternalSignal}, /** temperature */ + {"templist", &CmdProxy::templist}, + {"tempvalues", &CmdProxy::TemperatureValues}, {"temp_adc", &CmdProxy::temp_adc}, {"temp_fpga", &CmdProxy::temp_fpga}, {"temp_fpgaext", &CmdProxy::temp_fpgaext}, @@ -693,6 +695,7 @@ class CmdProxy { {"temp_sodr", &CmdProxy::temp_sodr}, {"temp_fpgafl", &CmdProxy::temp_fpgafl}, {"temp_fpgafr", &CmdProxy::temp_fpgafr}, + {"temp_slowadc", &CmdProxy::temp_slowadc}, /* dacs */ {"vthreshold", &CmdProxy::vthreshold}, @@ -1031,6 +1034,7 @@ class CmdProxy { std::string ClockDivider(int action); std::string ExternalSignal(int action); /** temperature */ + std::string TemperatureValues(int action); /* dacs */ std::string Dac(int action); std::string DacValues(int action); @@ -1243,6 +1247,9 @@ class CmdProxy { "intensity incremented by 1. If 1, all pixels almost saturated."); /** temperature */ + GET_COMMAND_NOID( + templist, getTemperatureList, + "\n\tList of temperature commands implemented for this detector."); GET_IND_COMMAND(temp_adc, getTemperature, slsDetectorDefs::TEMPERATURE_ADC, " °C", "[n_value]\n\t[Jungfrau][Gotthard] ADC Temperature"); @@ -1279,6 +1286,10 @@ class CmdProxy { temp_fpgafr, getTemperature, slsDetectorDefs::TEMPERATURE_FPGA3, " °C", "[n_value]\n\t[Eiger]Temperature of the left front end board fpga"); + GET_IND_COMMAND(temp_slowadc, getTemperature, + slsDetectorDefs::SLOW_ADC_TEMP, " °C", + "[n_value]\n\t[Ctb]Temperature of the slow adc"); + /* dacs */ DAC_COMMAND(vthreshold, getDAC, setDAC, defs::VTHRESHOLD, diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 80117ef01..5a02a29a5 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -445,6 +445,26 @@ void Detector::setImageTestMode(int value, Positions pos) { pimpl->Parallel(&Module::setImageTestMode, pos, value); } +std::vector Detector::getTemperatureList() const { + std::vector retval; + switch (getDetectorType().squash()) { + case defs::CHIPTESTBOARD: + return std::vector{defs::SLOW_ADC_TEMP}; + case defs::JUNGFRAU: + case defs::GOTTHARD: + return std::vector{defs::TEMPERATURE_ADC, + defs::TEMPERATURE_FPGA}; + case defs::EIGER: + return std::vector{ + defs::TEMPERATURE_FPGA, defs::TEMPERATURE_FPGAEXT, + defs::TEMPERATURE_10GE, defs::TEMPERATURE_DCDC, + defs::TEMPERATURE_SODL, defs::TEMPERATURE_SODR, + defs::TEMPERATURE_FPGA2, defs::TEMPERATURE_FPGA3}; + default: + return std::vector{}; + } +} + Result Detector::getTemperature(defs::dacIndex index, Positions pos) const { switch (index) { diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index d98337fca..f88718248 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -1047,6 +1047,20 @@ TEST_CASE("extsig", "[.cmd][.new]") { /** temperature */ +TEST_CASE("templist", "[.cmd][.new]") { + Detector det; + CmdProxy proxy(&det); + REQUIRE_NOTHROW(proxy.Call("templist", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("templist", {}, -1, PUT)); +} + +TEST_CASE("tempvalues", "[.cmd][.new]") { + Detector det; + CmdProxy proxy(&det); + REQUIRE_NOTHROW(proxy.Call("tempvalues", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("tempvalues", {}, -1, PUT)); +} + TEST_CASE("temp_adc", "[.cmd][.new]") { Detector det; CmdProxy proxy(&det); diff --git a/slsSupportLib/src/ToString.cpp b/slsSupportLib/src/ToString.cpp index 18e38a0d5..4692a7343 100644 --- a/slsSupportLib/src/ToString.cpp +++ b/slsSupportLib/src/ToString.cpp @@ -515,6 +515,26 @@ std::string ToString(const defs::dacIndex s) { return std::string("highvoltage"); case defs::IO_DELAY: return std::string("iodelay"); + case defs::TEMPERATURE_ADC: + return std::string("temp_adc"); + case defs::TEMPERATURE_FPGA: + return std::string("temp_fpga"); + case defs::TEMPERATURE_FPGAEXT: + return std::string("temp_fpgaext"); + case defs::TEMPERATURE_10GE: + return std::string("temp_10ge"); + case defs::TEMPERATURE_DCDC: + return std::string("temp_dcdc"); + case defs::TEMPERATURE_SODL: + return std::string("temp_sodl"); + case defs::TEMPERATURE_SODR: + return std::string("temp_sodr"); + case defs::TEMPERATURE_FPGA2: + return std::string("temp_fpgafl"); + case defs::TEMPERATURE_FPGA3: + return std::string("temp_fpgafr"); + case defs::SLOW_ADC_TEMP: + return std::string("temp_slowadc"); default: return std::string("Unknown"); } @@ -874,7 +894,26 @@ template <> defs::dacIndex StringTo(const std::string &s) { return defs::HIGH_VOLTAGE; if (s == "iodelay") return defs::IO_DELAY; - + if (s == "temp_adc") + return defs::TEMPERATURE_ADC; + if (s == "temp_fpga") + return defs::TEMPERATURE_FPGA; + if (s == "temp_fpgaext") + return defs::TEMPERATURE_FPGAEXT; + if (s == "temp_10ge") + return defs::TEMPERATURE_10GE; + if (s == "temp_dcdc") + return defs::TEMPERATURE_DCDC; + if (s == "temp_sodl") + return defs::TEMPERATURE_SODL; + if (s == "temp_sodr") + return defs::TEMPERATURE_SODR; + if (s == "temp_fpgafl") + return defs::TEMPERATURE_FPGA2; + if (s == "temp_fpgafr") + return defs::TEMPERATURE_FPGA3; + if (s == "temp_slowadc") + return defs::SLOW_ADC_TEMP; throw sls::RuntimeError("Unknown dac Index " + s); }