mirror of
https://github.com/slsdetectorgroup/slsDetectorPackage.git
synced 2025-06-20 00:37:12 +02:00
* merge fix from #721 PR (sync) 7.0.2.rc -> developer * row and column for jungfrau mixed up * multi module jungfrau sync must do slaves first then master for start acquisition and send software trigger, and master first and then slaves for stopacquisition * non blocking to slaves first and only then blocking/nonblocking to the master for sending software trigger(jungfrau multi mod sync) * fixed get/set timing jungfrau when sync enabled, getsync during blocking acquire (for trigger or stop) will get stuck as it should ask the stop server * switching between 1 and 2 interfaces did not set gui/client zmq port properly. Resulted in dummy streaming forever. fixed * formatting, refactoring: const & for positions, multi mod M3 stop first master first * adding missing cstdint for gcc 13 * Refactoring handle sync out, handling synchronization also for softwaretrigger for m3, for start/sync/stop for g2/g1 --------- Co-authored-by: Erik Frojdh <erik.frojdh@gmail.com> * fixed row and col for moench 2 interfaces * fix moench getTiming and also allow moench to handle sync --------- Co-authored-by: Erik Frojdh <erik.frojdh@gmail.com>
This commit is contained in:
@ -755,7 +755,7 @@ void DetectorImpl::readFrameFromReceiver() {
|
||||
int nDetActualPixelsY = nDetPixelsY;
|
||||
|
||||
if (gapPixels) {
|
||||
int n = InsertGapPixels(multiframe.get(), multigappixels,
|
||||
int n = insertGapPixels(multiframe.get(), multigappixels,
|
||||
quadEnable, dynamicRange,
|
||||
nDetActualPixelsX, nDetActualPixelsY);
|
||||
callbackImage = multigappixels;
|
||||
@ -794,7 +794,7 @@ void DetectorImpl::readFrameFromReceiver() {
|
||||
delete[] multigappixels;
|
||||
}
|
||||
|
||||
int DetectorImpl::InsertGapPixels(char *image, char *&gpImage, bool quadEnable,
|
||||
int DetectorImpl::insertGapPixels(char *image, char *&gpImage, bool quadEnable,
|
||||
int dr, int &nPixelsx, int &nPixelsy) {
|
||||
|
||||
LOG(logDEBUG) << "Insert Gap pixels:"
|
||||
@ -1242,43 +1242,105 @@ int DetectorImpl::acquire() {
|
||||
return OK;
|
||||
}
|
||||
|
||||
void DetectorImpl::startAcquisition(bool blocking, std::vector<int> positions) {
|
||||
// handle Mythen3 synchronization
|
||||
if (shm()->detType == defs::MYTHEN3 && size() > 1) {
|
||||
std::vector<int> master;
|
||||
std::vector<int> slaves;
|
||||
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);
|
||||
bool DetectorImpl::handleSynchronization(Positions pos) {
|
||||
bool handleSync = false;
|
||||
// multi module m3 or multi module sync enabled jungfrau
|
||||
if (size() > 1) {
|
||||
switch (shm()->detType) {
|
||||
case defs::MYTHEN3:
|
||||
case defs::GOTTHARD2:
|
||||
case defs::GOTTHARD:
|
||||
handleSync = true;
|
||||
break;
|
||||
case defs::JUNGFRAU:
|
||||
case defs::MOENCH:
|
||||
if (Parallel(&Module::getSynchronizationFromStopServer, pos)
|
||||
.tsquash("Inconsistent synchronization among modules")) {
|
||||
handleSync = true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return handleSync;
|
||||
}
|
||||
|
||||
void DetectorImpl::getMasterSlaveList(std::vector<int> positions,
|
||||
std::vector<int> &masters,
|
||||
std::vector<int> &slaves) {
|
||||
// expand positions list
|
||||
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])
|
||||
masters.push_back(i);
|
||||
else
|
||||
slaves.push_back(i);
|
||||
}
|
||||
}
|
||||
|
||||
void DetectorImpl::startAcquisition(const bool blocking, Positions pos) {
|
||||
|
||||
// slaves first
|
||||
if (handleSynchronization(pos)) {
|
||||
std::vector<int> masters;
|
||||
std::vector<int> slaves;
|
||||
getMasterSlaveList(pos, masters, slaves);
|
||||
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, positions);
|
||||
} else {
|
||||
Parallel(&Module::startAcquisition, positions);
|
||||
if (!masters.empty()) {
|
||||
Parallel((blocking ? &Module::startAndReadAll
|
||||
: &Module::startAcquisition),
|
||||
pos);
|
||||
}
|
||||
}
|
||||
// all in parallel
|
||||
else {
|
||||
Parallel(
|
||||
(blocking ? &Module::startAndReadAll : &Module::startAcquisition),
|
||||
pos);
|
||||
}
|
||||
}
|
||||
|
||||
void DetectorImpl::sendSoftwareTrigger(const bool block, Positions pos) {
|
||||
// slaves first
|
||||
if (handleSynchronization(pos)) {
|
||||
std::vector<int> masters;
|
||||
std::vector<int> slaves;
|
||||
getMasterSlaveList(pos, masters, slaves);
|
||||
if (!slaves.empty())
|
||||
Parallel(&Module::sendSoftwareTrigger, slaves, false);
|
||||
if (!masters.empty())
|
||||
Parallel(&Module::sendSoftwareTrigger, masters, block);
|
||||
}
|
||||
// all in parallel
|
||||
else {
|
||||
Parallel(&Module::sendSoftwareTrigger, pos, block);
|
||||
}
|
||||
}
|
||||
|
||||
void DetectorImpl::stopDetector(Positions pos) {
|
||||
// masters first
|
||||
if (handleSynchronization(pos)) {
|
||||
std::vector<int> masters;
|
||||
std::vector<int> slaves;
|
||||
getMasterSlaveList(pos, masters, slaves);
|
||||
if (!masters.empty())
|
||||
Parallel(&Module::stopAcquisition, masters);
|
||||
if (!slaves.empty())
|
||||
Parallel(&Module::stopAcquisition, slaves);
|
||||
}
|
||||
// all in parallel
|
||||
else {
|
||||
Parallel(&Module::stopAcquisition, pos);
|
||||
}
|
||||
}
|
||||
|
||||
void DetectorImpl::printProgress(double progress) {
|
||||
@ -1383,7 +1445,8 @@ std::vector<char> DetectorImpl::readProgrammingFile(const std::string &fname) {
|
||||
default:
|
||||
throw RuntimeError(
|
||||
"Unknown detector type. Did the 'hostname' command execute "
|
||||
"successfully? Or use update mode in the detector server side.");
|
||||
"successfully? Or use update mode in the detector server "
|
||||
"side.");
|
||||
}
|
||||
|
||||
LOG(logINFO) << "This can take awhile. Please be patient.";
|
||||
@ -1411,10 +1474,9 @@ std::vector<char> DetectorImpl::readProgrammingFile(const std::string &fname) {
|
||||
int dst = mkstemp(destfname); // create temporary file and open it in r/w
|
||||
if (dst == -1) {
|
||||
fclose(src);
|
||||
throw RuntimeError(
|
||||
std::string(
|
||||
"Could not create destination file in /tmp for programming: ") +
|
||||
destfname);
|
||||
throw RuntimeError(std::string("Could not create destination file "
|
||||
"in /tmp for programming: ") +
|
||||
destfname);
|
||||
}
|
||||
|
||||
// convert src to dst rawbin
|
||||
@ -1466,8 +1528,8 @@ std::vector<char> DetectorImpl::readProgrammingFile(const std::string &fname) {
|
||||
}
|
||||
// validate pof: read less than footer offset
|
||||
if (isPof && dstFilePos < pofFooterOfst) {
|
||||
throw RuntimeError(
|
||||
"Could not convert programming file. EOF before end of flash");
|
||||
throw RuntimeError("Could not convert programming file. EOF "
|
||||
"before end of flash");
|
||||
}
|
||||
}
|
||||
if (fclose(src) != 0) {
|
||||
|
Reference in New Issue
Block a user