M3: master starts twice (non blocking) part 2 (#445)

* slaves and master vectors empty means all positions included: fixing double acquisition in masters

* debug print out
This commit is contained in:
Dhanya Thattil 2022-05-10 15:23:39 +02:00 committed by GitHub
parent f55bdd6eae
commit 0129c2c686
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 13 deletions

View File

@ -1173,31 +1173,40 @@ int DetectorImpl::acquire() {
return OK;
}
void DetectorImpl::startAcquisition(bool blocking, Positions pos) {
void DetectorImpl::startAcquisition(bool blocking, std::vector<int> positions) {
if (shm()->detType == defs::MYTHEN3 && size() > 1) {
std::vector<int> master;
std::vector<int> slaves;
auto is_master = Parallel(&Module::isMaster, pos);
// could be all slaves in pos
slaves.reserve(pos.size());
for (size_t i = 0; i != pos.size(); ++i) {
if (positions.empty() ||
(positions.size() == 1 && positions[0] == -1)) {
positions.resize(modules.size());
std::iota(begin(positions), end(positions), 0);
}
// could be all slaves in positions
slaves.reserve(positions.size());
auto is_master = Parallel(&Module::isMaster, positions);
for (size_t i : positions) {
if (is_master[i])
master.push_back(i);
else
slaves.push_back(i);
}
Parallel(&Module::startAcquisition, slaves);
if (blocking) {
Parallel(&Module::startAndReadAll, master);
} else {
Parallel(&Module::startAcquisition, master);
if (!slaves.empty()) {
Parallel(&Module::startAcquisition, slaves);
}
if (!master.empty()) {
if (blocking) {
Parallel(&Module::startAndReadAll, master);
} else {
Parallel(&Module::startAcquisition, master);
}
}
} else {
if (blocking) {
Parallel(&Module::startAndReadAll, pos);
Parallel(&Module::startAndReadAll, positions);
} else {
Parallel(&Module::startAcquisition, pos);
Parallel(&Module::startAcquisition, positions);
}
}
}

View File

@ -279,7 +279,7 @@ class DetectorImpl : public virtual slsDetectorDefs {
int acquire();
/** also takes care of master and slave for multi module mythen */
void startAcquisition(bool blocking, Positions pos);
void startAcquisition(bool blocking, std::vector<int> positions);
/**
* Combines data from all readouts and gives it to the gui