g2: setting serialnumber allowed

This commit is contained in:
2021-08-11 18:50:49 +02:00
parent 9a777b13bb
commit 6f54402aba
12 changed files with 90 additions and 9 deletions

View File

@ -80,6 +80,9 @@ class Detector {
Result<int64_t> getSerialNumber(Positions pos = {}) const;
/** [Gotthard2] */
void setSerialNumber(const int64_t value, Positions pos = {});
Result<int64_t> getReceiverVersion(Positions pos = {}) const;
/** Options: EIGER, JUNGFRAU, GOTTHARD, MOENCH, MYTHEN3, GOTTHARD2,

View File

@ -257,6 +257,32 @@ std::string CmdProxy::FirmwareVersion(int action) {
return os.str();
}
std::string CmdProxy::SerialNumber(int action) {
std::ostringstream os;
os << cmd << ' ';
if (action == slsDetectorDefs::HELP_ACTION)
os << "\n\tSerial number of detector.\n\t[Gotthard2] Can overwrite, "
"but must do so for every detector server restart."
<< '\n';
else if (action == slsDetectorDefs::GET_ACTION) {
if (!args.empty()) {
WrongNumberOfParameters(0);
}
auto t = det->getSerialNumber(std::vector<int>{det_id});
os << OutStringHex(t) << '\n';
} else if (action == slsDetectorDefs::PUT_ACTION) {
if (args.size() != 1) {
WrongNumberOfParameters(1);
}
det->setSerialNumber(StringTo<int64_t>(args[0]),
std::vector<int>{det_id});
os << args[0] << '\n';
} else {
throw sls::RuntimeError("Unknown action");
}
return os.str();
}
std::string CmdProxy::Versions(int action) {
std::ostringstream os;
os << cmd << ' ';

View File

@ -758,7 +758,7 @@ class CmdProxy {
{"firmwareversion", &CmdProxy::FirmwareVersion},
{"detectorserverversion", &CmdProxy::detectorserverversion},
{"rx_version", &CmdProxy::rx_version},
{"serialnumber", &CmdProxy::serialnumber},
{"serialnumber", &CmdProxy::SerialNumber},
{"type", &CmdProxy::type},
{"nmod", &CmdProxy::nmod},
{"detsize", &CmdProxy::DetectorSize},
@ -1078,6 +1078,7 @@ class CmdProxy {
std::string Hostname(int action);
std::string VirtualServer(int action);
std::string FirmwareVersion(int action);
std::string SerialNumber(int action);
std::string Versions(int action);
std::string PackageVersion(int action);
std::string ClientVersion(int action);
@ -1191,9 +1192,6 @@ class CmdProxy {
GET_COMMAND_HEX(rx_version, getReceiverVersion,
"\n\tReceiver version in format [0xYYMMDD].");
GET_COMMAND_HEX(serialnumber, getSerialNumber,
"\n\tSerial number of detector.");
GET_COMMAND(type, getDetectorType,
"\n\tReturns detector type. Can be Eiger, Jungfrau, Gotthard, "
"Moench, Mythen3, Gotthard2, ChipTestBoard");

View File

@ -119,6 +119,10 @@ Result<int64_t> Detector::getSerialNumber(Positions pos) const {
return pimpl->Parallel(&Module::getSerialNumber, pos);
}
void Detector::setSerialNumber(const int64_t value, Positions pos) {
pimpl->Parallel(&Module::setSerialNumber, pos, value);
}
Result<int64_t> Detector::getReceiverVersion(Positions pos) const {
return pimpl->Parallel(&Module::getReceiverSoftwareVersion, pos);
}

View File

@ -94,6 +94,10 @@ int64_t Module::getSerialNumber() const {
return sendToDetector<int64_t>(F_GET_SERIAL_NUMBER);
}
void Module::setSerialNumber(const int64_t value) {
return sendToDetector(F_SET_SERIAL_NUMBER, value, nullptr);
}
int64_t Module::getReceiverSoftwareVersion() const {
if (shm()->useReceiverFlag) {
return sendToReceiver<int64_t>(F_GET_RECEIVER_VERSION);

View File

@ -90,6 +90,7 @@ class Module : public virtual slsDetectorDefs {
int64_t getFirmwareVersion() const;
int64_t getDetectorServerVersion() const;
int64_t getSerialNumber() const;
void setSerialNumber(const int64_t value);
int64_t getReceiverSoftwareVersion() const;
static detectorType getTypeFromDetector(const std::string &hostname,
int cport = DEFAULT_PORTNO);

View File

@ -105,7 +105,19 @@ TEST_CASE("serialnumber", "[.cmd]") {
Detector det;
CmdProxy proxy(&det);
REQUIRE_NOTHROW(proxy.Call("serialnumber", {}, -1, GET));
REQUIRE_THROWS(proxy.Call("serialnumber", {"0"}, -1, PUT));
if (det.getDetectorType().squash() == defs::GOTTHARD2) {
auto prev_val = det.getSerialNumber();
std::ostringstream oss1, oss2;
proxy.Call("serialnumber", {"0x5d"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "serialnumber 0x5d\n");
proxy.Call("serialnumber", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "serialnumber 0x5d\n");
for (int i = 0; i != det.size(); ++i) {
det.setSerialNumber(prev_val[i], {i});
}
} else {
REQUIRE_THROWS(proxy.Call("serialnumber", {"0"}, -1, PUT));
}
}
TEST_CASE("type", "[.cmd]") {