serialnumber fixed to point to mod id reg

This commit is contained in:
maliakal_d 2021-08-11 19:30:25 +02:00
parent 8e6a0cbfda
commit ff9eaaf3f3
6 changed files with 29 additions and 17 deletions

View File

@ -127,6 +127,7 @@
#define MOD_ID_OFST (0) #define MOD_ID_OFST (0)
#define MOD_ID_MSK (0x0000FFFF << MOD_ID_OFST) #define MOD_ID_MSK (0x0000FFFF << MOD_ID_OFST)
#define MOD_MAX_VAL (0xFFFF)
/* ASIC registers --------------------------------------------------*/ /* ASIC registers --------------------------------------------------*/

View File

@ -66,7 +66,6 @@ int64_t burstPeriodReg = 0;
int filterResistor = 0; int filterResistor = 0;
int cdsGain = 0; int cdsGain = 0;
int detPos[2] = {}; int detPos[2] = {};
int64_t serialNumber = -1;
int isInitCheckDone() { return initCheckDone; } int isInitCheckDone() { return initCheckDone; }
@ -281,21 +280,18 @@ u_int16_t getHardwareVersionNumber() {
MCB_SERIAL_NO_VRSN_OFST); MCB_SERIAL_NO_VRSN_OFST);
} }
u_int32_t getDetectorNumber() { uint16_t getSerialNumber() {
if (serialNumber != -1) { return ((bus_r(MOD_ID_REG) & MOD_ID_MSK) >> MOD_ID_OFST);
return serialNumber;
}
#ifdef VIRTUAL
return 0;
#endif
return bus_r(MCB_SERIAL_NO_REG);
} }
void setSerialNumber(int64_t arg) { void setSerialNumber(uint16_t arg) {
LOG(logINFOBLUE, ("Setting Serial Number to 0x%llx\n", (long long int)arg)); LOG(logINFOBLUE, ("Setting Serial Number to 0x%x\n", arg));
serialNumber = 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() { u_int64_t getDetectorMAC() {
#ifdef VIRTUAL #ifdef VIRTUAL
return 0; return 0;

View File

@ -94,7 +94,9 @@ void readDetectorNumber();
#endif #endif
u_int32_t getDetectorNumber(); u_int32_t getDetectorNumber();
#ifdef GOTTHARD2D #ifdef GOTTHARD2D
void setSerialNumber(int64_t arg); uint16_t getSerialNumber();
void setSerialNumber(uint16_t arg);
int getMaxSerialNumber();
#endif #endif
u_int64_t getDetectorMAC(); u_int64_t getDetectorMAC();
u_int32_t getDetectorIP(); u_int32_t getDetectorIP();

View File

@ -666,7 +666,11 @@ int get_serial_number(int file_des) {
ret = OK; ret = OK;
memset(mess, 0, sizeof(mess)); memset(mess, 0, sizeof(mess));
int64_t retval = -1; int64_t retval = -1;
#ifdef GOTTHARD2D
retval = getSerialNumber();
#else
retval = getDetectorNumber(); retval = getDetectorNumber();
#endif
LOG(logDEBUG1, ("detector number retval: 0x%llx\n", (long long int)retval)); LOG(logDEBUG1, ("detector number retval: 0x%llx\n", (long long int)retval));
return Server_SendResult(file_des, INT64, &retval, sizeof(retval)); return Server_SendResult(file_des, INT64, &retval, sizeof(retval));
} }
@ -683,7 +687,14 @@ int set_serial_number(int file_des) {
#ifndef GOTTHARD2D #ifndef GOTTHARD2D
functionNotImplemented(); functionNotImplemented();
#else #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 #endif
return Server_SendResult(file_des, INT64, NULL, 0); return Server_SendResult(file_des, INT64, NULL, 0);
} }

View File

@ -261,8 +261,7 @@ std::string CmdProxy::SerialNumber(int action) {
std::ostringstream os; std::ostringstream os;
os << cmd << ' '; os << cmd << ' ';
if (action == slsDetectorDefs::HELP_ACTION) if (action == slsDetectorDefs::HELP_ACTION)
os << "\n\tSerial number of detector.\n\t[Gotthard2] Can overwrite, " os << "\n\tSerial number of detector.\n\t[Gotthard2] Can overwrite"
"but must do so for every detector server restart."
<< '\n'; << '\n';
else if (action == slsDetectorDefs::GET_ACTION) { else if (action == slsDetectorDefs::GET_ACTION) {
if (!args.empty()) { if (!args.empty()) {

View File

@ -107,11 +107,14 @@ TEST_CASE("serialnumber", "[.cmd]") {
REQUIRE_NOTHROW(proxy.Call("serialnumber", {}, -1, GET)); REQUIRE_NOTHROW(proxy.Call("serialnumber", {}, -1, GET));
if (det.getDetectorType().squash() == defs::GOTTHARD2) { if (det.getDetectorType().squash() == defs::GOTTHARD2) {
auto prev_val = det.getSerialNumber(); auto prev_val = det.getSerialNumber();
std::ostringstream oss1, oss2; std::ostringstream oss1, oss2, oss3;
proxy.Call("serialnumber", {"0x5d"}, -1, PUT, oss1); proxy.Call("serialnumber", {"0x5d"}, -1, PUT, oss1);
REQUIRE(oss1.str() == "serialnumber 0x5d\n"); REQUIRE(oss1.str() == "serialnumber 0x5d\n");
proxy.Call("serialnumber", {}, -1, GET, oss2); proxy.Call("serialnumber", {}, -1, GET, oss2);
REQUIRE(oss2.str() == "serialnumber 0x5d\n"); 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) { for (int i = 0; i != det.size(); ++i) {
det.setSerialNumber(prev_val[i], {i}); det.setSerialNumber(prev_val[i], {i});
} }