From 2f61764fd7e82f21bae21ab3a95d2c6de4867c84 Mon Sep 17 00:00:00 2001 From: Erik Frojdh Date: Fri, 9 Aug 2019 14:08:21 +0200 Subject: [PATCH] WIP --- slsDetectorSoftware/include/Detector.h | 56 ++++++++++++- .../include/multiSlsDetector.h | 20 ++--- slsDetectorSoftware/src/Detector.cpp | 84 +++++++++++++++++-- 3 files changed, 141 insertions(+), 19 deletions(-) diff --git a/slsDetectorSoftware/include/Detector.h b/slsDetectorSoftware/include/Detector.h index cbaeed1bf..3522c36d3 100644 --- a/slsDetectorSoftware/include/Detector.h +++ b/slsDetectorSoftware/include/Detector.h @@ -950,6 +950,7 @@ class Detector { /** [CTB] Value between 0-63 */ void setExternalSamplingSource(int value, Positions pos = {}); + // TODO! does any of them need the option to take positions /** [CTB] */ uint32_t getADCInvert() const; @@ -957,13 +958,62 @@ class Detector { void setADCInvert(uint32_t value); /** [CTB]*/ - uint32_t getADCEnableMask(int detPos = -1); + uint32_t getADCEnableMask() const; /** [CTB]*/ void setADCEnableMask(uint32_t mask); - /** [CTB]*/ - uint32_t getADCEnableMask() const; + /** [Gotthard] */ + Result getCounterBit(Positions pos = {}) const; + + /** [Gotthard] possible values? */ + void setCounterBit(int i, Positions pos = {}); + + /** + * [Gotthard] startACQ = 1 to start acq after resetting counter + * TODO! does it make sense to call one detector? + * + */ + void resetCounterBlock(int startACQ = 0, Positions pos = {}); + + // TODO getROI, setROI, verifyMinMaxROI + + // writeCounterBlockFile + + void loadImageToDetector(defs::imageType index, const std::string &fname, + Positions pos = {}); + + /** [Gotthard] + * @param value 1 to set or 0 to clear the digital test bit -1? + */ + Result digitalTest(defs::digitalTestMode mode, int ival = -1, + Positions pos = {}); + + /** [Eiger] */ + void setFlowControl10G(bool enable, Positions pos = {}); + + /** [Eiger] */ + Result getFlowControl10G(Positions pos = {}) const; + + Result + getReceiverRealUDPSocketBufferSize(Positions pos = {}) const; + + Result getReceiverUDPSocketBufferSize(Positions pos = {}) const; + + void setReceiverUDPSocketBufferSize(int64_t udpsockbufsize, + Positions pos = {}); + + /** [Moench] TODO! How do we do this best??? Can be refactored to something + * else? Use a generic zmq message passing system... + * For now limiting to all detectors working the same*/ + int setDetectorMode(defs::detectorModeType value); + int setFrameMode(defs::frameModeType value); + int setDetectorMinMaxEnergyThreshold(const int index, int value); + + void setAdditionalJsonHeader(const std::string &jsonheader, + Positions pos = {}); + + Result getAdditionalJsonHeader(Positions pos = {}) const; }; } // namespace sls \ No newline at end of file diff --git a/slsDetectorSoftware/include/multiSlsDetector.h b/slsDetectorSoftware/include/multiSlsDetector.h index d5d8e81e4..ca3d904b4 100755 --- a/slsDetectorSoftware/include/multiSlsDetector.h +++ b/slsDetectorSoftware/include/multiSlsDetector.h @@ -1297,7 +1297,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { */ std::string setAdditionalJsonParameter(const std::string &key, const std::string &value, - int detPos = -1); + int detPos = -1); // /** * Returns the additional json header parameter value @@ -1307,7 +1307,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { * empty if no parameter found in additional json header */ std::string getAdditionalJsonParameter(const std::string &key, - int detPos = -1); + int detPos = -1); // /** * Sets the detector minimum/maximum energy threshold in processor (for @@ -1318,7 +1318,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { * error in computing json parameter value) */ int setDetectorMinMaxEnergyThreshold(const int index, int value, - int detPos = -1); + int detPos = -1); // /** * Sets the frame mode in processor (Moench only) @@ -1345,21 +1345,21 @@ class multiSlsDetector : public virtual slsDetectorDefs { * @returns receiver udp socket buffer size */ int64_t setReceiverUDPSocketBufferSize(int64_t udpsockbufsize = -1, - int detPos = -1); + int detPos = -1); // /** * Returns the receiver UDP socket buffer size * @param detPos -1 for all detectors in list or specific detector position * @returns the receiver UDP socket buffer size */ - int64_t getReceiverUDPSocketBufferSize(int detPos = -1); + int64_t getReceiverUDPSocketBufferSize(int detPos = -1); // /** * Returns the receiver real UDP socket buffer size * @param detPos -1 for all detectors in list or specific detector position * @returns the receiver real UDP socket buffer size */ - int64_t getReceiverRealUDPSocketBufferSize(int detPos = -1); + int64_t getReceiverRealUDPSocketBufferSize(int detPos = -1); // /** (users only) * Set 10GbE Flow Control (Eiger) @@ -1367,7 +1367,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { * @param detPos -1 for all detectors in list or specific detector position * @returns 10GbE flow Control */ - int setFlowControl10G(int enable = -1, int detPos = -1); + int setFlowControl10G(int enable = -1, int detPos = -1); // /** * Execute a digital test (Gotthard) @@ -1385,7 +1385,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { * @param detPos -1 for all detectors in list or specific detector position */ void loadImageToDetector(imageType index, const std::string &fname, - int detPos = -1); + int detPos = -1); // /** * Writes the counter memory block from the detector (Gotthard) @@ -1401,7 +1401,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { * @param startACQ is 1 to start acquisition after resetting counter * @param detPos -1 for all detectors in list or specific detector position */ - void resetCounterBlock(int startACQ = 0, int detPos = -1); + void resetCounterBlock(int startACQ = 0, int detPos = -1); // /** * Set/get counter bit in detector (Gotthard) @@ -1410,7 +1410,7 @@ class multiSlsDetector : public virtual slsDetectorDefs { * @param detPos -1 for all detectors in list or specific detector position * @returns the counter bit in detector */ - int setCounterBit(int i = -1, int detPos = -1); + int setCounterBit(int i = -1, int detPos = -1); // /** * Ensures that min is less than max in both dimensions (Gotthard) diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 6e163a465..0efdd723f 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -366,15 +366,18 @@ void Detector::setNumberOfCycles(int64_t value) { } Result Detector::getNumberOfStorageCells() const { - return pimpl->Parallel(&slsDetector::setTimer, {}, defs::STORAGE_CELL_NUMBER, -1); + return pimpl->Parallel(&slsDetector::setTimer, {}, + defs::STORAGE_CELL_NUMBER, -1); } void Detector::setNumberOfStorageCells(int64_t value) { - pimpl->Parallel(&slsDetector::setTimer, {}, defs::STORAGE_CELL_NUMBER, value); + pimpl->Parallel(&slsDetector::setTimer, {}, defs::STORAGE_CELL_NUMBER, + value); } Result Detector::getNumberOfAnalogSamples(Positions pos) const { - return pimpl->Parallel(&slsDetector::setTimer, pos, defs::ANALOG_SAMPLES, -1); + return pimpl->Parallel(&slsDetector::setTimer, pos, defs::ANALOG_SAMPLES, + -1); } void Detector::setNumberOfAnalogSamples(int64_t value, Positions pos) { @@ -382,7 +385,8 @@ void Detector::setNumberOfAnalogSamples(int64_t value, Positions pos) { } Result Detector::getNumberOfDigitalSamples(Positions pos) const { - return pimpl->Parallel(&slsDetector::setTimer, pos, defs::DIGITAL_SAMPLES, -1); + return pimpl->Parallel(&slsDetector::setTimer, pos, defs::DIGITAL_SAMPLES, + -1); } void Detector::setNumberOfDigitalSamples(int64_t value, Positions pos) { @@ -800,8 +804,8 @@ void Detector::setExternalSamplingSource(int value, Positions pos) { } uint32_t Detector::getADCInvert() const { - auto res = pimpl->Parallel(&slsDetector::getADCInvert, {}); - return res.tsquash("Different Values for function getADCInvert"); + return pimpl->Parallel(&slsDetector::getADCInvert, {}) + .tsquash("Different Values for function getADCInvert"); } void Detector::setADCInvert(uint32_t value) { @@ -817,4 +821,72 @@ void Detector::setADCEnableMask(uint32_t mask) { pimpl->Parallel(&slsDetector::setADCEnableMask, {}, mask); } +Result Detector::getCounterBit(Positions pos) const { + return pimpl->Parallel(&slsDetector::setCounterBit, pos, -1); +} + +void Detector::setCounterBit(int i, Positions pos) { + pimpl->Parallel(&slsDetector::setCounterBit, pos, i); +} + +void Detector::resetCounterBlock(int startACQ, Positions pos) { + pimpl->Parallel(&slsDetector::resetCounterBlock, pos, startACQ); +} + +void Detector::loadImageToDetector(defs::imageType index, + const std::string &fname, Positions pos) { + // TODO! optimize away multiple loads + pimpl->Parallel(&slsDetector::loadImageToDetector, pos, index, fname); +} + +Result Detector::digitalTest(defs::digitalTestMode mode, int ival, + Positions pos) { + return pimpl->Parallel(&slsDetector::digitalTest, pos, mode, ival); +} + +void Detector::setFlowControl10G(bool enable, Positions pos) { + pimpl->Parallel(&slsDetector::setDetectorNetworkParameter, pos, + defs::FLOW_CONTROL_10G, static_cast(enable)); +} + +Result Detector::getFlowControl10G(Positions pos) const { + return pimpl->Parallel(&slsDetector::setDetectorNetworkParameter, pos, + defs::FLOW_CONTROL_10G, -1); +} + +Result +Detector::getReceiverRealUDPSocketBufferSize(Positions pos) const { + return pimpl->Parallel(&slsDetector::getReceiverRealUDPSocketBufferSize, + pos); +} + +Result Detector::getReceiverUDPSocketBufferSize(Positions pos) const { + return pimpl->Parallel(&slsDetector::getReceiverUDPSocketBufferSize, pos); +} + +void Detector::setReceiverUDPSocketBufferSize(int64_t udpsockbufsize, + Positions pos) { + pimpl->Parallel(&slsDetector::setReceiverUDPSocketBufferSize, pos, + udpsockbufsize); +} + +int Detector::setDetectorMode(defs::detectorModeType value) { + return pimpl->setDetectorMode(value); +} +int Detector::setFrameMode(defs::frameModeType value) { + return pimpl->setFrameMode(value); +} +int Detector::setDetectorMinMaxEnergyThreshold(const int index, int value) { + return pimpl->setDetectorMinMaxEnergyThreshold(index, value); +} + +void Detector::setAdditionalJsonHeader(const std::string &jsonheader, + Positions pos) { + pimpl->Parallel(&slsDetector::setAdditionalJsonHeader, pos, jsonheader); +} + +Result Detector::getAdditionalJsonHeader(Positions pos) const { + return pimpl->Parallel(&slsDetector::getAdditionalJsonHeader, pos); +} + } // namespace sls \ No newline at end of file