mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-04-20 02:40:03 +02:00
M3: master starts twice (non blocking) (#444)
* start acq for master m3 was sent twice (non blocking), removed redundant code, check that there is only one master * m3 can have more than 1 master (when many master modules used independently) * fix for singe mod m3 or other dets
This commit is contained in:
parent
36a1159f38
commit
f55bdd6eae
@ -781,24 +781,7 @@ void Detector::startReceiver() { pimpl->Parallel(&Module::startReceiver, {}); }
|
|||||||
void Detector::stopReceiver() { pimpl->Parallel(&Module::stopReceiver, {}); }
|
void Detector::stopReceiver() { pimpl->Parallel(&Module::stopReceiver, {}); }
|
||||||
|
|
||||||
void Detector::startDetector(Positions pos) {
|
void Detector::startDetector(Positions pos) {
|
||||||
auto detector_type = getDetectorType(pos).squash();
|
pimpl->startAcquisition(false, pos);
|
||||||
if (detector_type == defs::MYTHEN3 && size() > 1) {
|
|
||||||
std::vector<int> slaves(pos);
|
|
||||||
auto is_master = getMaster(pos);
|
|
||||||
int masterPosition = -1;
|
|
||||||
for (unsigned int i = 0; i < is_master.size(); ++i) {
|
|
||||||
if (is_master[i]) {
|
|
||||||
masterPosition = i;
|
|
||||||
slaves.erase(slaves.begin() + i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pimpl->Parallel(&Module::startAcquisition, pos);
|
|
||||||
if (masterPosition != -1) {
|
|
||||||
pimpl->Parallel(&Module::startAcquisition, {masterPosition});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
pimpl->Parallel(&Module::startAcquisition, pos);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Detector::startDetectorReadout() {
|
void Detector::startDetectorReadout() {
|
||||||
|
@ -1124,25 +1124,7 @@ int DetectorImpl::acquire() {
|
|||||||
|
|
||||||
// start and read all
|
// start and read all
|
||||||
try {
|
try {
|
||||||
if (detector_type == defs::MYTHEN3 && modules.size() > 1) {
|
startAcquisition(true, {});
|
||||||
// Multi module mythen
|
|
||||||
std::vector<int> master;
|
|
||||||
std::vector<int> slaves;
|
|
||||||
auto is_master = Parallel(&Module::isMaster, {});
|
|
||||||
slaves.reserve(modules.size() - 1); // check this one!!
|
|
||||||
for (size_t i = 0; i < modules.size(); ++i) {
|
|
||||||
if (is_master[i])
|
|
||||||
master.push_back(i);
|
|
||||||
else
|
|
||||||
slaves.push_back(i);
|
|
||||||
}
|
|
||||||
Parallel(&Module::startAcquisition, slaves);
|
|
||||||
Parallel(&Module::startAndReadAll, master);
|
|
||||||
} else {
|
|
||||||
// Normal acquire
|
|
||||||
Parallel(&Module::startAndReadAll, {});
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
if (receiver)
|
if (receiver)
|
||||||
Parallel(&Module::stopReceiver, {});
|
Parallel(&Module::stopReceiver, {});
|
||||||
@ -1191,6 +1173,35 @@ int DetectorImpl::acquire() {
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DetectorImpl::startAcquisition(bool blocking, Positions pos) {
|
||||||
|
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 (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);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (blocking) {
|
||||||
|
Parallel(&Module::startAndReadAll, pos);
|
||||||
|
} else {
|
||||||
|
Parallel(&Module::startAcquisition, pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void DetectorImpl::printProgress(double progress) {
|
void DetectorImpl::printProgress(double progress) {
|
||||||
// spaces for python printout
|
// spaces for python printout
|
||||||
std::cout << " " << std::fixed << std::setprecision(2) << std::setw(6)
|
std::cout << " " << std::fixed << std::setprecision(2) << std::setw(6)
|
||||||
|
@ -278,6 +278,9 @@ class DetectorImpl : public virtual slsDetectorDefs {
|
|||||||
*/
|
*/
|
||||||
int acquire();
|
int acquire();
|
||||||
|
|
||||||
|
/** also takes care of master and slave for multi module mythen */
|
||||||
|
void startAcquisition(bool blocking, Positions pos);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Combines data from all readouts and gives it to the gui
|
* Combines data from all readouts and gives it to the gui
|
||||||
* or just gives progress of acquisition by polling receivers
|
* or just gives progress of acquisition by polling receivers
|
||||||
|
Loading…
x
Reference in New Issue
Block a user