diff --git a/RELEASE.txt b/RELEASE.txt index 07682d45c..ce989bf9b 100755 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -33,6 +33,7 @@ This document describes the differences between v6.1.0 and v6.0.0. - fixed datastream disabling for eiger. Its only available in 10g mode. - m3 server crash (vthrehsold) - allow vtrim to be interpolated for Eiger settings +- m3 setThresholdEnergy and setAllThresholdEnergy was overwriting gaincaps with settings enum 2. Resolved Issues diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 1efa837e5..c4618760a 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -1924,7 +1924,7 @@ class Detector(CppDetectorApi): def datastream(self): """ datastream [left|right] [0, 1] - [Eiger] Enables or disables data streaming from left or/and right side of detector. 1 (enabled) by default. + [Eiger] Enables or disables data streaming from left or/and right side of detector for 10GbE mode. 1 (enabled) by default. """ result = {} for port in [defs.LEFT, defs.RIGHT]: diff --git a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer index d180ff497..c41f2ede9 100755 Binary files a/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer and b/slsDetectorServers/eigerDetectorServer/bin/eigerDetectorServer_developer differ diff --git a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c index 0b936a856..0955523a1 100644 --- a/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/eigerDetectorServer/slsDetectorFunctionList.c @@ -2105,6 +2105,9 @@ int setDataStream(enum portPosition port, int enable) { LOG(logERROR, ("Invalid setDataStream enable argument: %d\n", enable)); return FAIL; } + LOG(logINFO, + ("%s 10GbE %s datastream\n", (enable ? "Enabling" : "Disabling"), + (port == LEFT ? "left" : "right"))); #ifdef VIRTUAL if (port == LEFT) { eiger_virtual_left_datastream = enable; diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 519080e97..9450d01f5 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -8266,9 +8266,6 @@ int get_datastream(int file_des) { "Only left and right allowed\n", arg); LOG(logERROR, (mess)); - } else if (enableTenGigabitEthernet(GET_FLAG) == 0) { - retval = 1; - LOG(logINFO, ("Datastream always enabled for 1g\n")); } else { ret = getDataStream(arg, &retval); LOG(logDEBUG1, ("datastream (%s) retval: %u\n", @@ -8315,14 +8312,6 @@ int set_datastream(int file_des) { ret = FAIL; sprintf(mess, "Could not %s. Invalid enable %d. \n", msg, enable); LOG(logERROR, (mess)); - } else if (enableTenGigabitEthernet(GET_FLAG) == 0 && enable == 0) { - ret = FAIL; - sprintf(mess, - "Could not %s. Disabling is only enabled in 10g mode.\n", - msg); - LOG(logERROR, (mess)); - } else if (enableTenGigabitEthernet(GET_FLAG) == 0 && enable == 1) { - LOG(logINFO, ("Datastream always enabled for 1g\n")); } else { ret = setDataStream(port, enable); if (ret == FAIL) { diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 1f16b7269..91f420716 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -1147,8 +1147,8 @@ class Detector { Result getDataStream(const defs::portPosition port, Positions pos = {}) const; - /** [Eiger] enable or disable data streaming from left or right of detector. - * Default: enabled + /** [Eiger] enable or disable data streaming from left or right of detector + * for 10GbE. Default: enabled */ void setDataStream(const defs::portPosition port, const bool enable, Positions pos = {}); diff --git a/slsDetectorSoftware/src/CmdProxy.cpp b/slsDetectorSoftware/src/CmdProxy.cpp index c320f1435..a4c08c50c 100644 --- a/slsDetectorSoftware/src/CmdProxy.cpp +++ b/slsDetectorSoftware/src/CmdProxy.cpp @@ -1804,7 +1804,9 @@ std::string CmdProxy::DataStream(int action) { os << cmd << ' '; if (action == defs::HELP_ACTION) { os << "[left|right] [0, 1]\n\t[Eiger] Enables or disables data " - "streaming from left or/and right side of detector. 1 (enabled) " + "streaming from left or/and right side of detector for 10 GbE " + "mode. " + "1 (enabled) " "by default." << '\n'; } else if (action == defs::GET_ACTION) { diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index ef2c1633c..517535279 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -214,9 +214,21 @@ void Module::setThresholdEnergy(int e_eV, detectorSettings isettings, myMod.iodelay = myMod1.iodelay; myMod.tau = linearInterpolation(e_eV, trim1, trim2, myMod1.tau, myMod2.tau); + // m3, reg is used for gaincaps + if (shm()->detType == MYTHEN3) { + if (myMod1.reg != myMod2.reg) { + throw RuntimeError( + "setThresholdEnergyAndSettings: gaincaps do not " + "match between files"); + } + myMod.reg = myMod1.reg; + } + } + // m3, reg is used for gaincaps + if (shm()->detType != MYTHEN3) { + myMod.reg = isettings; } - myMod.reg = isettings; myMod.eV[0] = e_eV; setModule(myMod, trimbits); if (getSettings() != isettings) { @@ -231,6 +243,7 @@ void Module::setThresholdEnergy(int e_eV, detectorSettings isettings, void Module::setAllThresholdEnergy(std::array e_eV, detectorSettings isettings, bool trimbits) { + // only mythen3 if (shm()->trimEnergies.empty()) { throw RuntimeError( "Trim energies have not been defined for this module yet!"); @@ -311,6 +324,13 @@ void Module::setAllThresholdEnergy(std::array e_eV, myMods[i] = interpolateTrim(&myMod1, &myMod2, energy[i], trim1, trim2, trimbits); + // gaincaps + if (myMod1.reg != myMod2.reg) { + throw RuntimeError("setAllThresholdEnergy: gaincaps do not " + "match between files for energy (eV) " + + std::to_string(energy[i])); + } + myMods[i].reg = myMod1.reg; } } @@ -357,6 +377,11 @@ void Module::setAllThresholdEnergy(std::array e_eV, for (int i = 0; i < myMod.nchan; ++i) { myMod.chanregs[i] = myMods[i % 3].chanregs[i]; } + // gain caps + if (myMods[0].reg != myMods[1].reg || myMods[1].reg != myMods[2].reg) { + throw RuntimeError("setAllThresholdEnergy: gaincaps do not " + "match between files for all energies"); + } } myMod.reg = isettings; @@ -3330,9 +3355,9 @@ sls_detector_module Module::interpolateTrim(sls_detector_module *a, dacs_to_copy.end(), {E_SVP, E_SVN, E_VTGSTV, E_RXB_RB, E_RXB_LB, E_VCN, E_VIS}); // interpolate vrf, vcmp, vcp - dacs_to_interpolate.insert( - dacs_to_interpolate.end(), - {E_VTR, E_VRF, E_VCMP_LL, E_VCMP_LR, E_VCMP_RL, E_VCMP_RR, E_VCP, E_VRS}); + dacs_to_interpolate.insert(dacs_to_interpolate.end(), + {E_VTR, E_VRF, E_VCMP_LL, E_VCMP_LR, + E_VCMP_RL, E_VCMP_RR, E_VCP, E_VRS}); } else { dacs_to_copy.insert(dacs_to_copy.end(), {M_VCASSH, M_VRSHAPER, M_VRSHAPER_N, M_VIPRE_OUT, diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index 0fdcee058..fae4c1180 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -1466,6 +1466,21 @@ void Implementation::setTenGigaEnable(const bool b) { generalData->SetTenGigaEnable(b); SetupFifoStructure(); + + // datastream can be disabled/enabled only for Eiger 10GbE + if (detType == EIGER) { + if (!b) { + detectorDataStream[LEFT] = 1; + detectorDataStream[RIGHT] = 1; + } else { + detectorDataStream[LEFT] = detectorDataStream10GbE[LEFT]; + detectorDataStream[RIGHT] = detectorDataStream10GbE[RIGHT]; + } + LOG(logINFO) << "Detector datastream updated [Left: " + << sls::ToString(detectorDataStream[LEFT]) + << ", Right: " + << sls::ToString(detectorDataStream[RIGHT]) << "]"; + } } LOG(logINFO) << "Ten Giga: " << (tengigaEnable ? "enabled" : "disabled"); LOG(logINFO) << "Packets per Frame: " << (generalData->packetsPerFrame); @@ -1532,9 +1547,9 @@ bool Implementation::getDetectorDataStream(const portPosition port) const { void Implementation::setDetectorDataStream(const portPosition port, const bool enable) { int index = (port == LEFT ? 0 : 1); - detectorDataStream[index] = enable; - LOG(logINFO) << "Detector datastream (" << sls::ToString(port) - << " Port): " << sls::ToString(detectorDataStream[index]); + detectorDataStream10GbE[index] = enable; + LOG(logINFO) << "Detector 10GbE datastream (" << sls::ToString(port) + << " Port): " << sls::ToString(detectorDataStream10GbE[index]); } int Implementation::getReadNRows() const { return readNRows; } diff --git a/slsReceiverSoftware/src/Implementation.h b/slsReceiverSoftware/src/Implementation.h index 442f1b4db..757d64d05 100644 --- a/slsReceiverSoftware/src/Implementation.h +++ b/slsReceiverSoftware/src/Implementation.h @@ -356,6 +356,7 @@ class Implementation : private virtual slsDetectorDefs { bool quadEnable{false}; bool activated{true}; std::array detectorDataStream = {{true, true}}; + std::array detectorDataStream10GbE = {{true, true}}; int readNRows{0}; int thresholdEnergyeV{-1}; std::array thresholdAllEnergyeV = {{-1, -1, -1}}; diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 9b9902df8..c1723fbcb 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -12,4 +12,4 @@ #define APIJUNGFRAU 0x220203 #define APIMYTHEN3 0x220203 #define APIMOENCH 0x220203 -#define APIEIGER 0x220204 +#define APIEIGER 0x220207