This commit is contained in:
Erik Frojdh 2019-08-08 10:18:21 +02:00
parent bba6e1667b
commit 095a7eac05
5 changed files with 103 additions and 87 deletions

View File

@ -209,29 +209,44 @@ class Detector {
*/ */
Result<std::string> getDetectorTypeAsString(Positions pos = {}) const; Result<std::string> getDetectorTypeAsString(Positions pos = {}) const;
// Erik // Erik
/** CTB only.Sets the mask applied to every pattern. */
void setPatternMask(uint64_t mask, Positions pos = {});
/** CTB only. Gets the mask applied to every pattern. */
Result<uint64_t> getPatternMask(Positions pos = {});
/** /**
* Set LED Enable for CTB * CTB only. Sets the bitmask that the mask will be applied to for every
* pattern.
* @param mask mask to select bits
*/
void setPatternBitMask(uint64_t mask, Positions pos = {});
/**
* CTB only. Gets the bits that the mask will be applied to for every
* pattern
*/
Result<uint64_t> getPatternBitMask(Positions pos = {}) const;
/**
* CTB only. Enable or disable the LED
* @param enable true to switch on, false to switch off * @param enable true to switch on, false to switch off
*/ */
void setLEDEnable(bool enable, Positions pos = {}); void setLEDEnable(bool enable, Positions pos = {});
/** /**
* Get LED enable for CTB * CTB only. Get LED enable.
*/ */
Result<bool> getLEDEnable(Positions pos = {}) const; Result<bool> getLEDEnable(Positions pos = {}) const;
/** /**
* Set Digital IO Delay CTB * CTB only. Set Digital IO Delay
* @param digital IO mask to select the pins * @param digital IO mask to select the pins
* @param delay delay in ps(1 bit=25ps, max of 775 ps) * @param delay delay in ps(1 bit=25ps, max of 775 ps)
*/ */
void setDigitalIODelay(uint64_t pinMask, int delay, Positions pos = {}); void setDigitalIODelay(uint64_t pinMask, int delay, Positions pos = {});
}; };
} // namespace sls } // namespace sls

View File

@ -2106,14 +2106,14 @@ class multiSlsDetector : public virtual slsDetectorDefs {
* @param mask mask to be applied * @param mask mask to be applied
* @param detPos -1 for all detectors in list or specific detector position * @param detPos -1 for all detectors in list or specific detector position
*/ */
void setPatternMask(uint64_t mask, int detPos = -1); void setPatternMask(uint64_t mask, int detPos = -1); //
/** /**
* Gets the mask applied to every pattern (CTB/ Moench) * Gets the mask applied to every pattern (CTB/ Moench)
* @param detPos -1 for all detectors in list or specific detector position * @param detPos -1 for all detectors in list or specific detector position
* @returns mask set * @returns mask set
*/ */
uint64_t getPatternMask(int detPos = -1); uint64_t getPatternMask(int detPos = -1); //
/** /**
* Selects the bits that the mask will be applied to for every pattern (CTB/ * Selects the bits that the mask will be applied to for every pattern (CTB/
@ -2121,7 +2121,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
* @param mask mask to select bits * @param mask mask to select bits
* @param detPos -1 for all detectors in list or specific detector position * @param detPos -1 for all detectors in list or specific detector position
*/ */
void setPatternBitMask(uint64_t mask, int detPos = -1); void setPatternBitMask(uint64_t mask, int detPos = -1);//
/** /**
* Gets the bits that the mask will be applied to for every pattern (CTB/ * Gets the bits that the mask will be applied to for every pattern (CTB/
@ -2129,7 +2129,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
* @param detPos -1 for all detectors in list or specific detector position * @param detPos -1 for all detectors in list or specific detector position
* @returns mask of bits selected * @returns mask of bits selected
*/ */
uint64_t getPatternBitMask(int detPos = -1); uint64_t getPatternBitMask(int detPos = -1);//
/** /**
* Set LED Enable (Moench, CTB only) * Set LED Enable (Moench, CTB only)
@ -2137,7 +2137,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
* @param detPos -1 for all detectors in list or specific detector position * @param detPos -1 for all detectors in list or specific detector position
* @returns LED enable * @returns LED enable
*/ */
int setLEDEnable(int enable = -1, int detPos = -1); int setLEDEnable(int enable = -1, int detPos = -1); //
/** /**
* Set Digital IO Delay (Moench, CTB only) * Set Digital IO Delay (Moench, CTB only)
@ -2145,7 +2145,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
* @param delay delay in ps(1 bit=25ps, max of 775 ps) * @param delay delay in ps(1 bit=25ps, max of 775 ps)
* @param detPos -1 for all detectors in list or specific detector position * @param detPos -1 for all detectors in list or specific detector position
*/ */
void setDigitalIODelay(uint64_t pinMask, int delay, int detPos = -1); void setDigitalIODelay(uint64_t pinMask, int delay, int detPos = -1); //
/** /**
* Loads the detector setup from file * Loads the detector setup from file
@ -2209,8 +2209,7 @@ class multiSlsDetector : public virtual slsDetectorDefs {
* or just gives progress of acquisition by polling receivers * or just gives progress of acquisition by polling receivers
*/ */
void processData(); void processData();
void addSlsDetector(std::unique_ptr<slsDetector> det);
private: private:
/** /**

View File

@ -171,6 +171,19 @@ Result<std::string> Detector::getDetectorTypeAsString(Positions pos) const {
// Erik // Erik
Result<uint64_t> Detector::getPatternMask(Positions pos){
return pimpl->Parallel(&slsDetector::getPatternMask, pos);
}
void Detector::setPatternBitMask(uint64_t mask, Positions pos){
pimpl->Parallel(&slsDetector::setPatternBitMask, pos, mask);
}
Result<uint64_t> Detector::getPatternBitMask(Positions pos) const{
return pimpl->Parallel(&slsDetector::getPatternBitMask, pos);
}
void Detector::setLEDEnable(bool enable, Positions pos) { void Detector::setLEDEnable(bool enable, Positions pos) {
pimpl->Parallel(&slsDetector::setLEDEnable, pos, static_cast<int>(enable)); pimpl->Parallel(&slsDetector::setLEDEnable, pos, static_cast<int>(enable));
} }

View File

@ -476,17 +476,6 @@ void multiSlsDetector::addSlsDetector(const std::string &hostname) {
multi_shm()->multiDetectorType = getDetectorTypeAsEnum(-1);// -1 needed here multi_shm()->multiDetectorType = getDetectorTypeAsEnum(-1);// -1 needed here
} }
void multiSlsDetector::addSlsDetector(std::unique_ptr<slsDetector> det) {
detectors.push_back(std::move(det));
multi_shm()->numberOfDetectors = detectors.size();
multi_shm()->dataBytes += detectors.back()->getDataBytes();
multi_shm()->dataBytesInclGapPixels +=
detectors.back()->getDataBytesInclGapPixels();
multi_shm()->numberOfChannels +=
detectors.back()->getTotalNumberOfChannels();
multi_shm()->multiDetectorType = getDetectorTypeAsEnum(-1);// -1 needed here
}
slsDetectorDefs::detectorType multiSlsDetector::getDetectorTypeAsEnum() const { slsDetectorDefs::detectorType multiSlsDetector::getDetectorTypeAsEnum() const {
return multi_shm()->multiDetectorType; return multi_shm()->multiDetectorType;
} }

View File

@ -9,75 +9,75 @@
using namespace sls; using namespace sls;
SCENARIO("Multi detector operation", "[detector]") { // SCENARIO("Multi detector operation", "[detector]") {
multiSlsDetector::freeSharedMemory(20, -1); // multiSlsDetector::freeSharedMemory(20, -1);
GIVEN("An empty multi detector") { // GIVEN("An empty multi detector") {
multiSlsDetector m(20); // multiSlsDetector m(20);
THEN("the size is zero") { // THEN("the size is zero") {
CHECK(m.getNumberOfDetectors() == 0); // CHECK(m.getNumberOfDetectors() == 0);
CHECK(m.getDataBytes() == 0); // CHECK(m.getDataBytes() == 0);
CHECK(m.getTotalNumberOfChannels() == 0); // CHECK(m.getTotalNumberOfChannels() == 0);
} // }
WHEN("we add a detector") { // WHEN("we add a detector") {
m.addSlsDetector(sls::make_unique<slsDetector>( // m.addSlsDetector(sls::make_unique<slsDetector>(
slsDetectorDefs::detectorType::EIGER, 20, 0)); // slsDetectorDefs::detectorType::EIGER, 20, 0));
THEN("the size and number of detector changes") { // THEN("the size and number of detector changes") {
CHECK(m.getNumberOfDetectors() == 1); // CHECK(m.getNumberOfDetectors() == 1);
CHECK(m.getTotalNumberOfChannels() == 256 * 1024); // CHECK(m.getTotalNumberOfChannels() == 256 * 1024);
} // }
WHEN("we add another detector") { // WHEN("we add another detector") {
m.addSlsDetector(sls::make_unique<slsDetector>( // m.addSlsDetector(sls::make_unique<slsDetector>(
slsDetectorDefs::detectorType::EIGER, 20, 1)); // slsDetectorDefs::detectorType::EIGER, 20, 1));
THEN("the size and number of detector changes") { // THEN("the size and number of detector changes") {
CHECK(m.getNumberOfDetectors() == 2); // CHECK(m.getNumberOfDetectors() == 2);
CHECK(m.getTotalNumberOfChannels() == 2 * 256 * 1024); // CHECK(m.getTotalNumberOfChannels() == 2 * 256 * 1024);
} // }
WHEN("We set the trimen") { // WHEN("We set the trimen") {
std::vector<int> energies{5000, 6000, 7000, 8000, 9000}; // std::vector<int> energies{5000, 6000, 7000, 8000, 9000};
m.setTrimEn(energies); // m.setTrimEn(energies);
THEN("we read back the same values") { // THEN("we read back the same values") {
CHECK(m.getTrimEn() == energies); // CHECK(m.getTrimEn() == energies);
} // }
} // }
WHEN("We set the trimen to different values") { // WHEN("We set the trimen to different values") {
std::vector<int> en0{5000, 6000, 7000, 8000, 9000}; // std::vector<int> en0{5000, 6000, 7000, 8000, 9000};
std::vector<int> en1{6000, 7000, 8000, 9000}; // std::vector<int> en1{6000, 7000, 8000, 9000};
m.setTrimEn(en0, 0); // m.setTrimEn(en0, 0);
m.setTrimEn(en1, 1); // m.setTrimEn(en1, 1);
THEN("we read back the same values") { // THEN("we read back the same values") {
CHECK(m.getTrimEn(0) == en0); // CHECK(m.getTrimEn(0) == en0);
CHECK(m.getTrimEn(1) == en1); // CHECK(m.getTrimEn(1) == en1);
CHECK(m.getTrimEn() == std::vector<int>{-1}); // CHECK(m.getTrimEn() == std::vector<int>{-1});
} // }
} // }
} // }
} // }
m.freeSharedMemory(); // m.freeSharedMemory();
} // }
} // }
TEST_CASE("Set and get partialFramesPadding", "[detector][somenewtag]"){ // TEST_CASE("Set and get partialFramesPadding", "[detector][somenewtag]"){
multiSlsDetector::freeSharedMemory(20, -1); // multiSlsDetector::freeSharedMemory(20, -1);
multiSlsDetector m(20); // multiSlsDetector m(20);
m.addSlsDetector(sls::make_unique<slsDetector>( // m.addSlsDetector(sls::make_unique<slsDetector>(
slsDetectorDefs::detectorType::EIGER, 20, 0)); // slsDetectorDefs::detectorType::EIGER, 20, 0));
m.addSlsDetector(sls::make_unique<slsDetector>( // m.addSlsDetector(sls::make_unique<slsDetector>(
slsDetectorDefs::detectorType::EIGER, 20, 1)); // slsDetectorDefs::detectorType::EIGER, 20, 1));
m.setPartialFramesPadding(false); // m.setPartialFramesPadding(false);
CHECK(m.getPartialFramesPadding() == 0); // CHECK(m.getPartialFramesPadding() == 0);
m.setPartialFramesPadding(true); // m.setPartialFramesPadding(true);
CHECK(m.getPartialFramesPadding() == 1); // CHECK(m.getPartialFramesPadding() == 1);
m.setPartialFramesPadding(false, 0); // m.setPartialFramesPadding(false, 0);
CHECK(m.getPartialFramesPadding() == -1); // CHECK(m.getPartialFramesPadding() == -1);
m.freeSharedMemory(); // m.freeSharedMemory();
} // }