diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 469e14de9..a48e40d8a 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -686,7 +686,7 @@ void allocateDetectorStructureMemory() { void setupDetector() { allocateDetectorStructureMemory(); - setDefaultDacs(); + resetToDefaultDacs(false); #ifdef VIRTUAL sharedMemory_setStatus(IDLE); #endif @@ -748,7 +748,15 @@ void setupDetector() { LOG(logDEBUG1, ("Setup detector done\n\n")); } -int setDefaultDacs() { +int resetToDefaultDacs(int hardReset) { + // reset defaults to hardcoded defaults + if (hardReset) { + const int vals[] = DEFAULT_DAC_VALS; + for (int i = 0; i < NDAC; ++i) { + defaultDacValues[i] = vals[i]; + } + } + // reset dacs to defaults int ret = OK; LOG(logINFOBLUE, ("Setting Default Dac values\n")); for (int i = 0; i < NDAC; ++i) { diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index 4c477828f..cbfb85690 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -481,7 +481,15 @@ void setupDetector() { setCurrentSource(DEFAULT_CURRENT_SOURCE); } -int setDefaultDacs() { +int resetToDefaultDacs(int hardReset) { + // reset defaults to hardcoded defaults + if (hardReset) { + const int vals[] = DEFAULT_DAC_VALS; + for (int i = 0; i < NDAC; ++i) { + defaultDacValues[i] = vals[i]; + } + } + // reset dacs to defaults int ret = OK; LOG(logINFOBLUE, ("Setting Default Dac values\n")); for (int i = 0; i < NDAC; ++i) { diff --git a/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c index c78130e24..eabe0ad9b 100644 --- a/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthardDetectorServer/slsDetectorFunctionList.c @@ -406,7 +406,7 @@ void setupDetector() { DAC_MAX_MV); LTC2620_Disable(); LTC2620_Configure(); - setDefaultDacs(); + resetToDefaultDacs(false); // temp bus_w(TEMP_SPI_IN_REG, TEMP_SPI_IN_IDLE_MSK); @@ -434,7 +434,15 @@ void setupDetector() { setDelayAfterTrigger(DEFAULT_DELAY); } -int setDefaultDacs() { +int resetToDefaultDacs(int hardReset) { + // reset defaults to hardcoded defaults + if (hardReset) { + const int vals[] = DEFAULT_DAC_VALS; + for (int i = 0; i < NDAC; ++i) { + defaultDacValues[i] = vals[i]; + } + } + // reset dacs to defaults int ret = OK; LOG(logINFOBLUE, ("Setting Default Dac values\n")); for (int i = 0; i < NDAC; ++i) { diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index efd143ad4..82ef4c7ae 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -426,7 +426,7 @@ void setupDetector() { DAC_MAX_MV); LTC2620_Disable(); LTC2620_Configure(); - setDefaultDacs(); + resetToDefaultDacs(false); // altera pll ALTERA_PLL_SetDefines( @@ -470,7 +470,15 @@ void setupDetector() { setTemperatureEvent(0); } -int setDefaultDacs() { +int resetToDefaultDacs(int hardReset) { + // reset defaults to hardcoded defaults + if (hardReset) { + const int vals[] = DEFAULT_DAC_VALS; + for (int i = 0; i < NDAC; ++i) { + defaultDacValues[i] = vals[i]; + } + } + // reset dacs to defaults int ret = OK; LOG(logINFOBLUE, ("Setting Default Dac values\n")); for (int i = 0; i < NDAC; ++i) { diff --git a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c index 67db5dada..a0daec6bd 100644 --- a/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/moenchDetectorServer/slsDetectorFunctionList.c @@ -517,7 +517,7 @@ void setupDetector() { DAC_MAX_MV); // has to be before setvchip LTC2620_Disable(); LTC2620_Configure(); - setDefaultDacs(); + resetToDefaultDacs(false); // altera pll ALTERA_PLL_SetDefines(PLL_CNTRL_REG, PLL_PARAM_REG, @@ -614,7 +614,15 @@ void updateDataBytes() { dataBytes = analogDataBytes; } -int setDefaultDacs() { +int resetToDefaultDacs(int hardReset) { + // reset defaults to hardcoded defaults + if (hardReset) { + const int vals[] = DEFAULT_DAC_VALS; + for (int i = 0; i < NDAC; ++i) { + defaultDacValues[i] = vals[i]; + } + } + // reset dacs to defaults int ret = OK; LOG(logINFOBLUE, ("Setting Default Dac values\n")); for (int i = 0; i < NDAC; ++i) { diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c index 3dd83bb0f..9ccbb4a55 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -450,7 +450,7 @@ void setupDetector() { // defaults setHighVoltage(DEFAULT_HIGH_VOLTAGE); - setDefaultDacs(); + resetToDefaultDacs(false); setASICDefaults(); setADIFDefaults(); @@ -527,7 +527,15 @@ void setupDetector() { setAllTrimbits(DEFAULT_TRIMBIT_VALUE); } -int setDefaultDacs() { +int resetToDefaultDacs(int hardReset) { + // reset defaults to hardcoded defaults + if (hardReset) { + const int vals[] = DEFAULT_DAC_VALS; + for (int i = 0; i < NDAC; ++i) { + defaultDacValues[i] = vals[i]; + } + } + // reset dacs to defaults int ret = OK; LOG(logINFOBLUE, ("Setting Default Dac values\n")); { diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index 066f73132..6edd11497 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -117,7 +117,7 @@ void updateDataBytes(); #endif #ifndef CHIPTESTBOARDD -int setDefaultDacs(); +int resetToDefaultDacs(int hardReset); int getDefaultDac(enum DACINDEX index, enum detectorSettings sett, int *retval); int setDefaultDac(enum DACINDEX index, enum detectorSettings sett, int value); #endif diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h index cf96c4b07..9313284af 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorServer_funcs.h @@ -239,7 +239,7 @@ int reconfigure_udp(int); int validate_udp_configuration(int); int get_bursts_left(int); int start_readout(int); -int set_default_dacs(int); +int reset_to_default_dacs(int); int is_virtual(int); int get_pattern(int); int load_default_pattern(int); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 9751877d1..5ca9df10b 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -364,7 +364,7 @@ void function_table() { flist[F_VALIDATE_UDP_CONFIG] = &validate_udp_configuration; flist[F_GET_BURSTS_LEFT] = &get_bursts_left; flist[F_START_READOUT] = &start_readout; - flist[F_SET_DEFAULT_DACS] = &set_default_dacs; + flist[F_RESET_TO_DEFAULT_DACS] = &reset_to_default_dacs; flist[F_IS_VIRTUAL] = &is_virtual; flist[F_GET_PATTERN] = &get_pattern; flist[F_LOAD_DEFAULT_PATTERN] = &load_default_pattern; @@ -1627,7 +1627,7 @@ int set_settings(int file_des) { validate(&ret, mess, (int)isett, (int)retval, "set settings", DEC); #ifdef GOTTHARDD if (ret == OK) { - ret = setDefaultDacs(); + ret = resetToDefaultDacs(false); if (ret == FAIL) { strcpy(mess, "Could change settings, but could not set to " "default dacs\n"); @@ -8090,17 +8090,22 @@ int start_readout(int file_des) { return Server_SendResult(file_des, INT32, NULL, 0); } -int set_default_dacs(int file_des) { +int reset_to_default_dacs(int file_des) { ret = OK; memset(mess, 0, sizeof(mess)); + int arg = -1; + if (receiveData(file_des, &arg, sizeof(arg), INT32) < 0) + return printSocketReadError(); + LOG(logINFO, ("Resetting dacs to defaults (hard reset: %d)\n", arg)); #ifdef CHIPTESTBOARDD functionNotImplemented(); #else if (Server_VerifyLock() == OK) { - if (setDefaultDacs() == FAIL) { + if (resetToDefaultDacs(arg) == FAIL) { ret = FAIL; - strcpy(mess, "Could not set default dacs"); + sprintf(mess, "Could not %s reset default dacs", + (arg == 1 ? "hard" : "")); LOG(logERROR, (mess)); } } diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 81b7ea70d..2e169f8e9 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -427,8 +427,10 @@ class Detector { void setDefaultDac(defs::dacIndex index, int defaultValue, defs::detectorSettings sett, Positions pos = {}); - /** [Eiger][Jungfrau][Moench][Gotthard][Gotthard2][Mythen3] */ - void setDefaultDacs(Positions pos = {}); + /** [Eiger][Jungfrau][Moench][Gotthard][Gotthard2][Mythen3] + reset to defaults, hardReset will reset to hardcoded defaults on on-board + server */ + void resetToDefaultDacs(const bool hardReset, Positions pos = {}); Result getDAC(defs::dacIndex index, bool mV = false, Positions pos = {}) const; diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index a51bf437d..3f8b93659 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -1095,6 +1095,37 @@ std::string CmdProxy::DacValues(int action) { return os.str(); } +std::string CmdProxy::ResetDacs(int action) { + std::ostringstream os; + os << cmd << ' '; + if (action == defs::HELP_ACTION) { + os << "[(optional) hard] " + "\n\t[Eiger][Jungfrau][Gotthard][Moench][Gotthard2][" + "Mythen3]Reset dac values to the defaults. A 'hard' optional " + "reset will reset the dacs to the hardcoded defaults in on-board " + "detector server." + << '\n'; + } else if (action == defs::GET_ACTION) { + throw sls::RuntimeError("Cannot get"); + } else if (action == defs::PUT_ACTION) { + bool hardReset = false; + if (args.size() == 1) { + if (args[0] != "hard") { + throw sls::RuntimeError("Unknown argument " + args[0] + + ". Did you mean hard?"); + } + hardReset = true; + } else if (args.size() > 1) { + WrongNumberOfParameters(1); + } + det->resetToDefaultDacs(hardReset, std::vector{det_id}); + os << "successful\n"; + } else { + throw sls::RuntimeError("Unknown action"); + } + return os.str(); +} + std::string CmdProxy::DefaultDac(int action) { std::ostringstream os; os << cmd << ' '; @@ -1111,10 +1142,12 @@ std::string CmdProxy::DefaultDac(int action) { if (args.size() == 2) { auto t = det->getDefaultDac( StringTo(args[0]), - sls::StringTo(args[1])); + sls::StringTo(args[1]), + std::vector{det_id}); os << args[0] << ' ' << args[1] << ' ' << OutString(t) << '\n'; } else { - auto t = det->getDefaultDac(StringTo(args[0])); + auto t = det->getDefaultDac(StringTo(args[0]), + std::vector{det_id}); os << args[0] << ' ' << OutString(t) << '\n'; } } else if (action == defs::PUT_ACTION) { @@ -1125,7 +1158,8 @@ std::string CmdProxy::DefaultDac(int action) { if (args.size() == 3) { det->setDefaultDac( StringTo(args[0]), StringTo(args[1]), - sls::StringTo(args[2])); + sls::StringTo(args[2]), + std::vector{det_id}); os << args[0] << ' ' << args[2] << ' ' << args[1] << '\n'; } else { det->setDefaultDac(StringTo(args[0]), diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index ced9be101..6575fcf24 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -671,6 +671,8 @@ class CmdProxy { {"vipre_cds", "dac"}, {"ibias_sfp", "dac"}, + {"defaultdacs", "resetdacs"}, + /* acquisition */ {"busy", "clearbusy"}, {"receiver", "rx_status"}, @@ -816,7 +818,7 @@ class CmdProxy { {"dac", &CmdProxy::Dac}, {"daclist", &CmdProxy::daclist}, {"dacvalues", &CmdProxy::DacValues}, - {"defaultdacs", &CmdProxy::defaultdacs}, + {"resetdacs", &CmdProxy::ResetDacs}, {"defaultdac", &CmdProxy::DefaultDac}, /* on chip dacs */ @@ -1095,6 +1097,7 @@ class CmdProxy { /* dacs */ std::string Dac(int action); std::string DacValues(int action); + std::string ResetDacs(int action); std::string DefaultDac(int action); /* acquisition */ std::string ReceiverStatus(int action); @@ -1383,10 +1386,6 @@ class CmdProxy { daclist, getDacList, "\n\tGets the list of commands for every dac for this detector."); - EXECUTE_SET_COMMAND(defaultdacs, setDefaultDacs, - "\n\t[Eiger][Jungfrau][Gotthard][Moench][Gotthard2][" - "Mythen3]Sets default dacs on to the detector."); - /* on chip dacs */ INTEGER_USER_IND_COMMAND( vchip_comp_fe, getOnChipDAC, setOnChipDAC, StringTo, diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 6d4d0462b..b2fde0519 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -657,8 +657,8 @@ void Detector::setDefaultDac_(defs::dacIndex index, int defaultValue, pimpl->Parallel(&Module::setDefaultDac, pos, index, defaultValue, sett); } -void Detector::setDefaultDacs(Positions pos) { - pimpl->Parallel(&Module::setDefaultDacs, pos); +void Detector::resetToDefaultDacs(const bool hardReset, Positions pos) { + pimpl->Parallel(&Module::resetToDefaultDacs, hardReset, pos); } Result Detector::getDAC(defs::dacIndex index, bool mV, diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index e06775498..bb46d9ee2 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -629,7 +629,10 @@ void Module::setDefaultDac(slsDetectorDefs::dacIndex index, int defaultValue, return sendToDetector(F_SET_DEFAULT_DAC, args, nullptr); } -void Module::setDefaultDacs() { sendToDetector(F_SET_DEFAULT_DACS); } +void Module::resetToDefaultDacs(const bool hardReset) { + sendToDetector(F_RESET_TO_DEFAULT_DACS, static_cast(hardReset), + nullptr); +} void Module::setDAC(int val, dacIndex index, bool mV) { int args[]{static_cast(index), static_cast(mV), val}; diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index f3fda46a1..2e7248120 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -152,7 +152,7 @@ class Module : public virtual slsDetectorDefs { slsDetectorDefs::detectorSettings sett); void setDefaultDac(slsDetectorDefs::dacIndex index, int defaultValue, defs::detectorSettings sett); - void setDefaultDacs(); + void resetToDefaultDacs(const bool hardReset); int getDAC(dacIndex index, bool mV) const; void setDAC(int val, dacIndex index, bool mV); bool getPowerChip() const; diff --git a/slsDetectorSoftware/tests/test-CmdProxy.cpp b/slsDetectorSoftware/tests/test-CmdProxy.cpp index ab769e71c..cb89887b5 100644 --- a/slsDetectorSoftware/tests/test-CmdProxy.cpp +++ b/slsDetectorSoftware/tests/test-CmdProxy.cpp @@ -1466,16 +1466,17 @@ TEST_CASE("defaultdac", "[.cmd]") { } } -TEST_CASE("defaultdacs", "[.cmd]") { +TEST_CASE("resetdacs", "[.cmd]") { Detector det; CmdProxy proxy(&det); auto det_type = det.getDetectorType().squash(); if (det_type != defs::CHIPTESTBOARD) { - REQUIRE_THROWS(proxy.Call("defaultdacs", {}, -1, GET)); - REQUIRE_NOTHROW(proxy.Call("defaultdacs", {}, -1, PUT)); + REQUIRE_THROWS(proxy.Call("resetdacs", {}, -1, GET)); + REQUIRE_NOTHROW(proxy.Call("resetdacs", {}, -1, PUT)); + REQUIRE_NOTHROW(proxy.Call("resetdacs", {"hard"}, -1, PUT)); } else { - REQUIRE_THROWS(proxy.Call("defaultdacs", {}, -1, GET)); - REQUIRE_THROWS(proxy.Call("defaultdacs", {}, -1, PUT)); + REQUIRE_THROWS(proxy.Call("resetdacs", {}, -1, GET)); + REQUIRE_THROWS(proxy.Call("resetdacs", {}, -1, PUT)); } } diff --git a/slsSupportLib/include/sls/sls_detector_funcs.h b/slsSupportLib/include/sls/sls_detector_funcs.h index 27d783094..db452dcf0 100755 --- a/slsSupportLib/include/sls/sls_detector_funcs.h +++ b/slsSupportLib/include/sls/sls_detector_funcs.h @@ -215,7 +215,7 @@ enum detFuncs { F_VALIDATE_UDP_CONFIG, F_GET_BURSTS_LEFT, F_START_READOUT, - F_SET_DEFAULT_DACS, + F_RESET_TO_DEFAULT_DACS, F_IS_VIRTUAL, F_GET_PATTERN, F_LOAD_DEFAULT_PATTERN, @@ -555,7 +555,7 @@ const char* getFunctionNameFromEnum(enum detFuncs func) { case F_VALIDATE_UDP_CONFIG: return "F_VALIDATE_UDP_CONFIG"; case F_GET_BURSTS_LEFT: return "F_GET_BURSTS_LEFT"; case F_START_READOUT: return "F_START_READOUT"; - case F_SET_DEFAULT_DACS: return "F_SET_DEFAULT_DACS"; + case F_RESET_TO_DEFAULT_DACS: return "F_RESET_TO_DEFAULT_DACS"; case F_IS_VIRTUAL: return "F_IS_VIRTUAL"; case F_GET_PATTERN: return "F_GET_PATTERN"; case F_LOAD_DEFAULT_PATTERN: return "F_LOAD_DEFAULT_PATTERN";