diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h index 5e254c46d..403fc8671 100644 --- a/slsDetectorSoftware/include/Detector.h +++ b/slsDetectorSoftware/include/Detector.h @@ -922,6 +922,33 @@ class Detector { void setActive(bool active, Positions pos = {}); Result getActive(Positions pos = {}) const; + + /** [Gotthard][Jungfrau][CTB] not possible to read back*/ + void writeAdcRegister(uint32_t addr, uint32_t value, Positions pos = {}); + + /** [CTB] How much digital data in bytes is skipped */ + Result getReceiverDbitOffset(Positions pos = {}) const; + + /** [CTB] Set how many bytes of digital data to skip */ + void setReceiverDbitOffset(int value, Positions pos = {}); + + /** [CTB] Which of the bits 0-63 to save*/ + Result> getReceiverDbitList(Positions pos = {}) const; + + /** [CTB] Which of the bits 0-63 to save*/ + void setReceiverDbitList(std::vector list, Positions pos = {}); + + /** [CTB] */ + Result getExternalSampling(Positions pos = {}) const; + + /** [CTB] */ + void setExternalSampling(bool value, Positions pos = {}); + + /** [CTB] */ + Result getExternalSamplingSource(Positions pos = {}) const; + + /** [CTB] Value between 0-63 */ + void setExternalSamplingSource(int value, Positions pos = {}); }; } // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/include/Result.h b/slsDetectorSoftware/include/Result.h index 33ce0c04a..9127ddfc1 100644 --- a/slsDetectorSoftware/include/Result.h +++ b/slsDetectorSoftware/include/Result.h @@ -105,11 +105,19 @@ template > class Result { */ T squash() const { return Squash(vec); } + T tsquash(const std::string &error_msg) { + if (equal()) + return vec.front(); + else + throw RuntimeError(error_msg); + } /** * If all elements are equal return the front value, otherwise * return the supplied default value */ - T squash(T default_value) const { return Squash(vec, default_value); } + T squash(const T &default_value) const { + return Squash(vec, default_value); + } /** Test whether all elements of the result are equal */ bool equal() const noexcept { return allEqual(vec); } diff --git a/slsDetectorSoftware/include/multiSlsDetector.h b/slsDetectorSoftware/include/multiSlsDetector.h index 69695075c..1cf4076a0 100755 --- a/slsDetectorSoftware/include/multiSlsDetector.h +++ b/slsDetectorSoftware/include/multiSlsDetector.h @@ -1476,49 +1476,51 @@ class multiSlsDetector : public virtual slsDetectorDefs { * @param detPos -1 for all detectors in list or specific detector position * @returns external sampling source */ - int getExternalSamplingSource(int detPos = -1); + int getExternalSamplingSource(int detPos = -1); // + + /** * Set external sampling enable (CTB only) * @param value external sampling source (Option: 0-63) * @param detPos -1 for all detectors in list or specific detector position */ - void setExternalSampling(bool value, int detPos = -1); + void setExternalSampling(bool value, int detPos = -1); // /** * Get external sampling source (CTB only) * @param detPos -1 for all detectors in list or specific detector position * @returns external sampling enable */ - int getExternalSampling(int detPos = -1); + int getExternalSampling(int detPos = -1); // /** * Set external sampling enable (CTB only) * @param list external sampling source (Option: 0-63) * @param detPos -1 for all detectors in list or specific detector position */ - void setReceiverDbitList(std::vector list, int detPos = -1); + void setReceiverDbitList(std::vector list, int detPos = -1); // /** * Get external sampling source (CTB only) * @param detPos -1 for all detectors in list or specific detector position * @returns external sampling enable */ - std::vector getReceiverDbitList(int detPos = -1); + std::vector getReceiverDbitList(int detPos = -1); // /** * Set digital data offset in bytes (CTB only) * @param value digital data offset in bytes * @param detPos -1 for all detectors in list or specific detector position */ - void setReceiverDbitOffset(int value, int detPos = -1); + void setReceiverDbitOffset(int value, int detPos = -1); // /** * Get digital data offset in bytes (CTB only) * @param detPos -1 for all detectors in list or specific detector position * @returns digital data offset in bytes */ - int getReceiverDbitOffset(int detPos = -1); + int getReceiverDbitOffset(int detPos = -1); // /** * Write to ADC register (Gotthard, Jungfrau, ChipTestBoard). For expert @@ -1527,7 +1529,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { * @param val value * @param detPos -1 for all detectors in list or specific detector position */ - void writeAdcRegister(uint32_t addr, uint32_t val, int detPos = -1); + void writeAdcRegister(uint32_t addr, uint32_t val, int detPos = -1); // /** * Activates/Deactivates the detector (Eiger only) @@ -1535,7 +1537,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { * @param detPos -1 for all detectors in list or specific detector position * @returns 0 (inactive) or 1 (active)for activate mode */ - int activate(int const enable = -1, int detPos = -1); + int activate(int const enable = -1, int detPos = -1); // /** * Set deactivated Receiver padding mode (Eiger only) @@ -1581,6 +1583,8 @@ class multiSlsDetector : public virtual slsDetectorDefs { */ int enableGapPixels(int val = -1, int detPos = -1); // + + void setGapPixelsEnable(bool enable, sls::Positions pos = {}); /** * Sets the number of trim energies and their value (Eiger) * diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index ddf4797f7..4741a3bdd 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -631,7 +631,14 @@ Result Detector::getAutoCompDisable(Positions pos) const { } void Detector::setPowerChip(bool on, Positions pos) { - pimpl->Parallel(&slsDetector::powerChip, pos, static_cast(on)); + if (on && pimpl->getNumberOfDetectors() > 3) { + for (int i = 0; i != pimpl->getNumberOfDetectors(); ++i) { + pimpl->powerChip(static_cast(on), i); + usleep(1000 * 1000); + } + } else { + pimpl->Parallel(&slsDetector::powerChip, pos, static_cast(on)); + } } Result Detector::getPowerChip(Positions pos) const { @@ -719,8 +726,7 @@ void Detector::setTrimEn(std::vector energies, Positions pos) { } void Detector::setGapPixelsEnable(bool enable, Positions pos) { - pimpl->Parallel(&slsDetector::enableGapPixels, pos, - static_cast(enable)); + pimpl->setGapPixelsEnable(enable, pos); } Result Detector::getGapPixelEnable(Positions pos) const { @@ -757,4 +763,40 @@ Result Detector::getActive(Positions pos) const { return pimpl->Parallel(&slsDetector::activate, pos, -1); } +void Detector::writeAdcRegister(uint32_t addr, uint32_t value, Positions pos) { + pimpl->Parallel(&slsDetector::writeAdcRegister, pos, addr, value); +} + +Result Detector::getReceiverDbitOffset(Positions pos) const { + return pimpl->Parallel(&slsDetector::getReceiverDbitOffset, pos); +} + +void Detector::setReceiverDbitOffset(int value, Positions pos) { + pimpl->Parallel(&slsDetector::setReceiverDbitOffset, pos, value); +} + +Result> Detector::getReceiverDbitList(Positions pos) const { + return pimpl->Parallel(&slsDetector::getReceiverDbitList, pos); +} + +void Detector::setReceiverDbitList(std::vector list, Positions pos) { + pimpl->Parallel(&slsDetector::setReceiverDbitList, pos, list); +} + +Result Detector::getExternalSampling(Positions pos) const { + return pimpl->Parallel(&slsDetector::getExternalSampling, pos); +} + +void Detector::setExternalSampling(bool value, Positions pos) { + pimpl->Parallel(&slsDetector::setExternalSampling, pos, value); +} + +Result Detector::getExternalSamplingSource(Positions pos) const { + return pimpl->Parallel(&slsDetector::getExternalSamplingSource, pos); +} + +void Detector::setExternalSamplingSource(int value, Positions pos) { + pimpl->Parallel(&slsDetector::setExternalSamplingSource, pos, value); +} + } // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/src/multiSlsDetector.cpp b/slsDetectorSoftware/src/multiSlsDetector.cpp index ca9221a06..58fd11603 100755 --- a/slsDetectorSoftware/src/multiSlsDetector.cpp +++ b/slsDetectorSoftware/src/multiSlsDetector.cpp @@ -2710,6 +2710,16 @@ int multiSlsDetector::enableGapPixels(int val, int detPos) { return ret; } +void multiSlsDetector::setGapPixelsEnable(bool enable, Positions pos){ + Parallel(&slsDetector::enableGapPixels, pos, static_cast(enable)); + + // update data bytes incl gap pixels + auto r2 = serialCall(&slsDetector::getDataBytesInclGapPixels); + multi_shm()->dataBytesInclGapPixels = sls::sum(r2); + updateOffsets(); + +} + int multiSlsDetector::setTrimEn(std::vector energies, int detPos) { if (detPos >= 0) { return detectors[detPos]->setTrimEn(energies); diff --git a/slsDetectorSoftware/tests/test-Result.cpp b/slsDetectorSoftware/tests/test-Result.cpp index 73e3878df..88fb762bc 100644 --- a/slsDetectorSoftware/tests/test-Result.cpp +++ b/slsDetectorSoftware/tests/test-Result.cpp @@ -2,6 +2,7 @@ #include "catch.hpp" #include +#include using sls::Result; @@ -73,3 +74,13 @@ TEST_CASE("equal", "[n2]"){ res.push_back(1.3); REQUIRE(res.equal() == false); } + +TEST_CASE("throws for tsquash", "[n2]"){ + Result res{1,2,3}; + REQUIRE_THROWS(res.tsquash("something is wrong")); +} + +TEST_CASE("", "[n2]"){ + Result res{"hej", "hej", "hej"}; + REQUIRE(res.squash() == "hej"); +} \ No newline at end of file diff --git a/slsSupportLib/include/sls_detector_defs.h b/slsSupportLib/include/sls_detector_defs.h index 673e32715..141ccd768 100755 --- a/slsSupportLib/include/sls_detector_defs.h +++ b/slsSupportLib/include/sls_detector_defs.h @@ -68,6 +68,8 @@ // typedef char mystring[MAX_STR_LENGTH]; + + #ifdef __cplusplus class slsDetectorDefs { public: @@ -1297,3 +1299,13 @@ typedef struct { #else } sls_detector_module; #endif + + +#ifdef __cplusplus +//TODO! discuss this +#include //hmm... but currently no way around +namespace sls{ +using Positions = const std::vector &; +using defs = slsDetectorDefs; +} +#endif