diff --git a/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h b/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h index f94dc511a..cf0d895ed 100644 --- a/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/gotthard2DetectorServer/RegisterDefs.h @@ -127,6 +127,7 @@ #define MOD_ID_OFST (0) #define MOD_ID_MSK (0x0000FFFF << MOD_ID_OFST) +#define MOD_MAX_VAL (0xFFFF) /* ASIC registers --------------------------------------------------*/ diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index 8dac4acdc..e1db8b444 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -66,7 +66,6 @@ int64_t burstPeriodReg = 0; int filterResistor = 0; int cdsGain = 0; int detPos[2] = {}; -int64_t serialNumber = -1; int isInitCheckDone() { return initCheckDone; } @@ -281,21 +280,18 @@ u_int16_t getHardwareVersionNumber() { MCB_SERIAL_NO_VRSN_OFST); } -u_int32_t getDetectorNumber() { - if (serialNumber != -1) { - return serialNumber; - } -#ifdef VIRTUAL - return 0; -#endif - return bus_r(MCB_SERIAL_NO_REG); +uint16_t getSerialNumber() { + return ((bus_r(MOD_ID_REG) & MOD_ID_MSK) >> MOD_ID_OFST); } -void setSerialNumber(int64_t arg) { - LOG(logINFOBLUE, ("Setting Serial Number to 0x%llx\n", (long long int)arg)); - serialNumber = arg; +void setSerialNumber(uint16_t arg) { + LOG(logINFOBLUE, ("Setting Serial Number to 0x%x\n", arg)); + bus_w(MOD_ID_REG, bus_r(MOD_ID_REG) & ~MOD_ID_MSK); + bus_w(MOD_ID_REG, bus_r(MOD_ID_REG) | ((arg << MOD_ID_OFST) & MOD_ID_MSK)); } +int getMaxSerialNumber() { return MOD_MAX_VAL; } + u_int64_t getDetectorMAC() { #ifdef VIRTUAL return 0; diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 749cb304c..b9c7b0cc0 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -94,7 +94,9 @@ void readDetectorNumber(); #endif u_int32_t getDetectorNumber(); #ifdef GOTTHARD2D -void setSerialNumber(int64_t arg); +uint16_t getSerialNumber(); +void setSerialNumber(uint16_t arg); +int getMaxSerialNumber(); #endif u_int64_t getDetectorMAC(); u_int32_t getDetectorIP(); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 080e2d7df..fc8f03a2c 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -666,7 +666,11 @@ int get_serial_number(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); int64_t retval = -1; +#ifdef GOTTHARD2D + retval = getSerialNumber(); +#else retval = getDetectorNumber(); +#endif LOG(logDEBUG1, ("detector number retval: 0x%llx\n", (long long int)retval)); return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); } @@ -683,7 +687,14 @@ int set_serial_number(int file_des) { #ifndef GOTTHARD2D functionNotImplemented(); #else - setSerialNumber(arg); + if (arg > getMaxSerialNumber()) { + ret = FAIL; + sprintf(mess, "Could not set serial number. Max value: %d\n", + getMaxSerialNumber()); + LOG(logERROR, (mess)); + } else { + setSerialNumber(arg); + } #endif return Server_SendResult(file_des, INT64, NULL, 0); } diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 1a7e60e97..6dc2ba458 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -261,8 +261,7 @@ 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." + os << "\n\tSerial number of detector.\n\t[Gotthard2] Can overwrite" << '\n'; else if (action == slsDetectorDefs::GET_ACTION) { if (!args.empty()) { diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index d8c882713..01769f57a 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -107,11 +107,14 @@ TEST_CASE("serialnumber", "[.cmd]") { REQUIRE_NOTHROW(proxy.Call("serialnumber", {}, -1, GET)); if (det.getDetectorType().squash() == defs::GOTTHARD2) { auto prev_val = det.getSerialNumber(); - std::ostringstream oss1, oss2; + std::ostringstream oss1, oss2, oss3; 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"); + proxy.Call("serialnumber", {"0xffff"}, -1, PUT, oss3); + REQUIRE(oss3.str() == "serialnumber 0xffff\n"); + REQUIRE_THROWS(proxy.Call("serialnumber", {"65536"}, -1, PUT)); for (int i = 0; i != det.size(); ++i) { det.setSerialNumber(prev_val[i], {i}); }