From 6f54402aba403a72650f8aa9edfa38676fdbf9e8 Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Wed, 11 Aug 2021 18:50:49 +0200 Subject: [PATCH] g2: setting serialnumber allowed --- .../slsDetectorFunctionList.c | 9 +++++++ .../include/slsDetectorFunctionList.h | 3 +++ .../include/slsDetectorServer_funcs.h | 3 ++- .../src/slsDetectorServer_funcs.c | 24 ++++++++++++++--- slsDetectorSoftware/include/sls/Detector.h | 3 +++ slsDetectorSoftware/src/CmdProxy.cpp | 26 +++++++++++++++++++ slsDetectorSoftware/src/CmdProxy.h | 6 ++--- slsDetectorSoftware/src/Detector.cpp | 4 +++ slsDetectorSoftware/src/Module.cpp | 4 +++ slsDetectorSoftware/src/Module.h | 1 + slsDetectorSoftware/tests/test-CmdProxy.cpp | 14 +++++++++- .../include/sls/sls_detector_funcs.h | 2 ++ 12 files changed, 90 insertions(+), 9 deletions(-) diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index ff45cce6e..8dac4acdc 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -66,6 +66,7 @@ int64_t burstPeriodReg = 0; int filterResistor = 0; int cdsGain = 0; int detPos[2] = {}; +int64_t serialNumber = -1; int isInitCheckDone() { return initCheckDone; } @@ -281,12 +282,20 @@ u_int16_t getHardwareVersionNumber() { } u_int32_t getDetectorNumber() { + if (serialNumber != -1) { + return serialNumber; + } #ifdef VIRTUAL return 0; #endif return bus_r(MCB_SERIAL_NO_REG); } +void setSerialNumber(int64_t arg) { + LOG(logINFOBLUE, ("Setting Serial Number to 0x%llx\n", (long long int)arg)); + serialNumber = arg; +} + u_int64_t getDetectorMAC() { #ifdef VIRTUAL return 0; diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 5a01aa509..749cb304c 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -93,6 +93,9 @@ int getChipVersion(); void readDetectorNumber(); #endif u_int32_t getDetectorNumber(); +#ifdef GOTTHARD2D +void setSerialNumber(int64_t arg); +#endif u_int64_t getDetectorMAC(); u_int32_t getDetectorIP(); #ifdef GOTTHARDD diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index b57b5a2bc..c9733a823 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -266,4 +266,5 @@ int set_filter_cell(int); int set_adc_pipeline(int); int get_adc_pipeline(int); int set_dbit_pipeline(int); -int get_dbit_pipeline(int); \ No newline at end of file +int get_dbit_pipeline(int); +int set_serial_number(int); \ No newline at end of file diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 9271b7285..080e2d7df 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -392,6 +392,7 @@ void function_table() { flist[F_GET_ADC_PIPELINE] = &get_adc_pipeline; flist[F_SET_DBIT_PIPELINE] = &set_dbit_pipeline; flist[F_GET_DBIT_PIPELINE] = &get_dbit_pipeline; + flist[F_SET_SERIAL_NUMBER] = &set_serial_number; // check if (NUM_DET_FUNCTIONS >= RECEIVER_ENUM_START) { @@ -670,6 +671,23 @@ int get_serial_number(int file_des) { return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); } +int set_serial_number(int file_des) { + ret = OK; + memset(mess, 0, sizeof(mess)); + int64_t arg = -1; + + if (receiveData(file_des, &arg, sizeof(arg), INT64) < 0) + return printSocketReadError(); + LOG(logDEBUG1, ("Setting serial number to 0x%llx\n", (long long int)arg)); + +#ifndef GOTTHARD2D + functionNotImplemented(); +#else + setSerialNumber(arg); +#endif + return Server_SendResult(file_des, INT64, NULL, 0); +} + int set_firmware_test(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); @@ -4250,7 +4268,7 @@ int copy_detector_server(int file_des) { strcat(cmd, sname); executeCommand(cmd, retvals, logDEBUG1); -#if !defined(GOTTHAR2D) && !defined(MYTHEN3D) +#if !defined(GOTTHARD2D) && !defined(MYTHEN3D) // edit /etc/inittab // find line numbers in /etc/inittab where DetectorServer strcpy(cmd, "sed -n '/DetectorServer/=' /etc/inittab"); @@ -7796,7 +7814,7 @@ int get_filter_resistor(int file_des) { LOG(logDEBUG1, ("Getting filter resistor\n")); -#if !defined(GOTTHAR2D) && !defined(JUNGFRAUD) +#if !defined(GOTTHARD2D) && !defined(JUNGFRAUD) functionNotImplemented(); #else // get only @@ -7825,7 +7843,7 @@ int set_filter_resistor(int file_des) { return printSocketReadError(); LOG(logINFO, ("Setting filter resistor: %u\n", arg)); -#if !defined(GOTTHAR2D) && !defined(JUNGFRAUD) +#if !defined(GOTTHARD2D) && !defined(JUNGFRAUD) functionNotImplemented(); #else // only set diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index e5ee174d0..9859eb897 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -80,6 +80,9 @@ class Detector { Result getSerialNumber(Positions pos = {}) const; + /** [Gotthard2] */ + void setSerialNumber(const int64_t value, Positions pos = {}); + Result getReceiverVersion(Positions pos = {}) const; /** Options: EIGER, JUNGFRAU, GOTTHARD, MOENCH, MYTHEN3, GOTTHARD2, diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index a2862c45a..1a7e60e97 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -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{det_id}); + os << OutStringHex(t) << '\n'; + } else if (action == slsDetectorDefs::PUT_ACTION) { + if (args.size() != 1) { + WrongNumberOfParameters(1); + } + det->setSerialNumber(StringTo(args[0]), + std::vector{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 << ' '; diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index d772ff1bf..156022636 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -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"); diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 5652f85af..900965db4 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -119,6 +119,10 @@ Result 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 Detector::getReceiverVersion(Positions pos) const { return pimpl->Parallel(&Module::getReceiverSoftwareVersion, pos); } diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index 98bb9f400..250e846f0 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -94,6 +94,10 @@ int64_t Module::getSerialNumber() const { return sendToDetector(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(F_GET_RECEIVER_VERSION); diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index a4dc82410..a7a247baf 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -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); diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index a018e20cc..d8c882713 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -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]") { diff --git a/slsSupportLib/include/sls/sls_detector_funcs.h b/slsSupportLib/include/sls/sls_detector_funcs.h index 6e0e43fde..3db523882 100755 --- a/slsSupportLib/include/sls/sls_detector_funcs.h +++ b/slsSupportLib/include/sls/sls_detector_funcs.h @@ -243,6 +243,7 @@ enum detFuncs { F_GET_ADC_PIPELINE, F_SET_DBIT_PIPELINE, F_GET_DBIT_PIPELINE, + F_SET_SERIAL_NUMBER, NUM_DET_FUNCTIONS, RECEIVER_ENUM_START = 256, /**< detector function should not exceed this @@ -593,6 +594,7 @@ const char* getFunctionNameFromEnum(enum detFuncs func) { case F_GET_ADC_PIPELINE: return "F_GET_ADC_PIPELINE"; case F_SET_DBIT_PIPELINE: return "F_SET_DBIT_PIPELINE"; case F_GET_DBIT_PIPELINE: return "F_GET_DBIT_PIPELINE"; + case F_SET_SERIAL_NUMBER: return "F_SET_SERIAL_NUMBER"; case NUM_DET_FUNCTIONS: return "NUM_DET_FUNCTIONS"; case RECEIVER_ENUM_START: return "RECEIVER_ENUM_START";