diff --git a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer index f5ef865e4..0cf3694b3 100755 Binary files a/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer and b/slsDetectorServers/ctbDetectorServer/bin/ctbDetectorServer_developer differ diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index ed694dfd8..b0eb864d4 100755 Binary files a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer and b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer differ diff --git a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer index 44269428c..ed3fb90e7 100755 Binary files a/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer and b/slsDetectorServers/gotthard2DetectorServer/bin/gotthard2DetectorServer_developer differ diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c index 39c95f0d5..00df6796b 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorFunctionList.c @@ -506,6 +506,7 @@ void setupDetector() { setCurrentSource(DEFAULT_CURRENT_SOURCE); setVetoAlgorithm(DEFAULT_ALGORITHM, LOW_LATENCY_LINK); setVetoAlgorithm(DEFAULT_ALGORITHM, ETHERNET_10GB); + setReadoutSpeed(DEFAULT_READOUT_SPEED); } void setASICDefaults() { @@ -2084,7 +2085,36 @@ int getVCOFrequency(enum CLKINDEX ind) { } int setReadoutSpeed(int val) { - switch (val) + switch (val) { + case G_108MHZ: + LOG(logINFOBLUE, ("Setting readout speed to 108 MHz\n")); + if (setClockDivider(READOUT_C0, SPEED_108_CLKDIV_0) == FAIL) { + return FAIL; + } + if (setClockDivider(READOUT_C1, SPEED_108_CLKDIV_1) == FAIL) { + return FAIL; + } + if (setPhase(READOUT_C1, SPEED_108_CLKPHASE_DEG_1, 1) == FAIL) { + return FAIL; + } + break; + case G_144MHZ: + LOG(logINFOBLUE, ("Setting readout speed to 144 MHz\n")); + if (setClockDivider(READOUT_C0, SPEED_144_CLKDIV_0) == FAIL) { + return FAIL; + } + if (setClockDivider(READOUT_C1, SPEED_144_CLKDIV_1) == FAIL) { + return FAIL; + } + if (setPhase(READOUT_C1, SPEED_144_CLKPHASE_DEG_1, 1) == FAIL) { + return FAIL; + } + break; + default: + LOG(logERROR, ("Unknown readout speed %d\n", val)); + return FAIL; + } + return OK; } int getReadoutSpeed(int* retval) { @@ -2092,13 +2122,13 @@ int getReadoutSpeed(int* retval) { // clkdiv 2, 3, 4, 5? if (clkDivider[READOUT_C0] == SPEED_108_CLKDIV_0 && clkDivider[READOUT_C1] == SPEED_108_CLKDIV_1 && - getPhase(READOUT_C0, 1) == SPEED_108_CLKPHASE_DEG_1) { + getPhase(READOUT_C1, 1) == SPEED_108_CLKPHASE_DEG_1) { *retval = G_108MHZ; } else if (clkDivider[READOUT_C0] == SPEED_144_CLKDIV_0 && clkDivider[READOUT_C1] == SPEED_144_CLKDIV_1 && - getPhase(READOUT_C0, 1) == SPEED_144_CLKPHASE_DEG_1) { + getPhase(READOUT_C1, 1) == SPEED_144_CLKPHASE_DEG_1) { *retval = G_144MHZ; } @@ -2121,7 +2151,7 @@ int setClockDivider(enum CLKINDEX ind, int val) { } char *clock_names[] = {CLK_NAMES}; - LOG(logINFO, ("\tSetting %s clock (%d) divider from %d to %d\n", + LOG(logINFOBLUE, ("Setting %s clock (%d) divider from %d to %d\n", clock_names[ind], ind, clkDivider[ind], val)); // Remembering old phases in degrees diff --git a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h index 18a935c24..139be3cac 100644 --- a/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/gotthard2DetectorServer/slsDetectorServer_defs.h @@ -59,13 +59,13 @@ #define DEFAULT_SYSTEM_C2 (5) //(144444448) // sync_clk, 144 MHz #define DEFAULT_SYSTEM_C3 (5) //(144444448) // str_clk, 144 MHz -#define DEFAULT_READOUT_SPEED (G_108MHz) +#define DEFAULT_READOUT_SPEED (G_108MHZ) #define SPEED_144_CLKDIV_0 (6) #define SPEED_144_CLKDIV_1 (6) -#define SPEED_144_CLKPHASE_DEG_1 (125) +#define SPEED_144_CLKPHASE_DEG_1 (122) // 125 not possible #define SPEED_108_CLKDIV_0 (8) #define SPEED_108_CLKDIV_1 (8) -#define SPEED_108_CLKPHASE_DEG_1 (270) +#define SPEED_108_CLKPHASE_DEG_1 (268) // 270 not possible /* Firmware Definitions */ #define FIXED_PLL_FREQUENCY (20000000) // 20MHz diff --git a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer index 4fad0385a..143e64d5d 100755 Binary files a/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer and b/slsDetectorServers/gotthardDetectorServer/bin/gotthardDetectorServer_developer differ diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer index 89b848b5b..ca3ed35af 100755 Binary files a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer and b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServer_developer differ diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index 9fa401ba6..7be1cf54a 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -1925,10 +1925,10 @@ int getReadoutSpeed(int* retval) { case CONFIG_HALF_SPEED_20MHZ_VAL: *retval = HALF_SPEED; case CONFIG_QUARTER_SPEED_10MHZ_VAL: - retval = QUARTER_SPEED; + *retval = QUARTER_SPEED; default: LOG(logERROR, ("Unknown speed val: %d\n", speed)); - *retval == -1; + *retval = -1; return FAIL; } return OK; diff --git a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer index 76bd9cefb..0d401d6d0 100755 Binary files a/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer and b/slsDetectorServers/moenchDetectorServer/bin/moenchDetectorServer_developer differ diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index 3d102c2df..c05e27411 100755 Binary files a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer and b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer differ diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index ba6531b74..2b2f39647 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -6021,9 +6021,10 @@ int set_clock_divider(int file_des) { modeNotImplemented("clock index (divider set)", args[0]); } + enum CLKINDEX c = 0; + int val = args[1]; if (ret == OK) { - enum CLKINDEX c = (enum CLKINDEX)args[0]; - int val = args[1]; + c = (enum CLKINDEX)args[0]; // validate val range if (val < 2 || val > getMaxClockDivider()) { char *clock_names[] = {CLK_NAMES}; @@ -9284,7 +9285,7 @@ int set_readout_speed(int file_des) { #endif if (ret == OK) { switch (arg) { -#if defined(EIGERD) || !defined(JUNGFRAUD) +#if defined(EIGERD) || defined(JUNGFRAUD) case FULL_SPEED: case HALF_SPEED: case QUARTER_SPEED: @@ -9297,18 +9298,21 @@ int set_readout_speed(int file_des) { modeNotImplemented("readout speed index", arg); break; } - ret = setReadoutSpeed(arg); - if (ret == FAIL) { - sprintf(mess, "Could not set readout speed to %d.\n", arg); - LOG(logERROR, (mess)); - } else { - ret = getReadoutSpeed(&retval); - LOG(logDEBUG1, ("retval readout speed: %d\n", retval)); + if (ret == OK) { + ret = setReadoutSpeed(arg); if (ret == FAIL) { - strcpy(mess, "Could not get readout speed\n"); + sprintf(mess, "Could not set readout speed to %d.\n", arg); LOG(logERROR, (mess)); + } else { + int retval = 0; + ret = getReadoutSpeed(&retval); + LOG(logDEBUG1, ("retval readout speed: %d\n", retval)); + if (ret == FAIL) { + strcpy(mess, "Could not get readout speed\n"); + LOG(logERROR, (mess)); + } + validate(&ret, mess, arg, retval, "set readout speed", DEC); } - validate(&ret, mess, arg, retval, "set readout speed", DEC); } } diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index 4f276ebe0..6680481fd 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -637,25 +637,7 @@ std::string CmdProxy::ReadoutSpeed(int action) { if (args.size() != 1) { WrongNumberOfParameters(1); } - defs::speedLevel t; - try { - int ival = StringTo(args[0]); - switch (ival) { - case 0: - t = defs::FULL_SPEED; - break; - case 1: - t = defs::HALF_SPEED; - break; - case 2: - t = defs::QUARTER_SPEED; - break; - default: - throw sls::RuntimeError("Unknown speed " + args[0]); - } - } catch (...) { - t = sls::StringTo(args[0]); - } + defs::speedLevel t = sls::StringTo(args[0]); det->setReadoutSpeed(t, std::vector{det_id}); os << sls::ToString(t) << '\n'; // no args to convert 0,1,2 as well } else { diff --git a/slsDetectorSoftware/src/CmdProxy.h b/slsDetectorSoftware/src/CmdProxy.h index eaf94819c..187c1ea90 100644 --- a/slsDetectorSoftware/src/CmdProxy.h +++ b/slsDetectorSoftware/src/CmdProxy.h @@ -793,7 +793,7 @@ class CmdProxy { {"drlist", &CmdProxy::drlist}, {"timing", &CmdProxy::timing}, {"timinglist", &CmdProxy::timinglist}, - {"speed", &CmdProxy::ReadoutSpeed}, + {"readoutspeed", &CmdProxy::ReadoutSpeed}, {"adcphase", &CmdProxy::Adcphase}, {"maxadcphaseshift", &CmdProxy::maxadcphaseshift}, {"dbitphase", &CmdProxy::Dbitphase}, diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index ec58f3a7a..60a00a7eb 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -417,7 +417,7 @@ Result Detector::getReadoutSpeed(Positions pos) const { } void Detector::setReadoutSpeed(defs::speedLevel value, Positions pos) { - pimpl->Parallel(&Module::getReadoutSpeed, pos, value); + pimpl->Parallel(&Module::setReadoutSpeed, pos, value); } diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index 71cae1b63..c2c0edf1b 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -605,7 +605,7 @@ slsDetectorDefs::speedLevel Module::getReadoutSpeed() const { } void Module::setReadoutSpeed(speedLevel value) { - sendToDetector(F_SET_READOUT_SPEED, value); + sendToDetector(F_SET_READOUT_SPEED, value, nullptr); } int Module::getClockDivider(int clkIndex) const { diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 0bd059325..19c4db3e7 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -1,13 +1,13 @@ /** API versions */ -#define GITBRANCH "udp_numdst" +#define GITBRANCH "g2speed" -#define APILIB 0x210917 -#define APIRECEIVER 0x210917 -#define APIGUI 0x210819 -#define APICTB 0x211005 -#define APIGOTTHARD 0x211005 -#define APIGOTTHARD2 0x211005 -#define APIMYTHEN3 0x211005 -#define APIMOENCH 0x210927 -#define APIEIGER 0x211005 +#define APICTB 0x211007 +#define APIGOTTHARD 0x211007 +#define APIGOTTHARD2 0x211007 #define APIJUNGFRAU 0x211007 +#define APIMYTHEN3 0x211007 +#define APIMOENCH 0x211005 +#define APIEIGER 0x211007 +#define APILIB 0x211007 +#define APIRECEIVER 0x211007 +#define APIGUI 0x210819 diff --git a/slsSupportLib/src/ToString.cpp b/slsSupportLib/src/ToString.cpp index c22406be8..67bd4aeb5 100644 --- a/slsSupportLib/src/ToString.cpp +++ b/slsSupportLib/src/ToString.cpp @@ -707,10 +707,16 @@ template <> defs::detectorSettings StringTo(const std::string &s) { template <> defs::speedLevel StringTo(const std::string &s) { if (s == "full_speed") return defs::FULL_SPEED; + if (s == "0") + return defs::FULL_SPEED; if (s == "half_speed") return defs::HALF_SPEED; + if (s == "1") + return defs::HALF_SPEED; if (s == "quarter_speed") return defs::QUARTER_SPEED; + if (s == "2") + return defs::QUARTER_SPEED; if (s == "108") return defs::G_108MHZ; if (s == "144")