From 8833ccf5cc79ddace3efdac94301f2b1a125511e Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 8 May 2023 12:11:19 +0200 Subject: [PATCH] 7.0.2.rc (#721) * 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 --- RELEASE.txt | 36 +---- serverBin/jungfrauDetectorServerv7.0.0 | 1 - serverBin/jungfrauDetectorServerv7.0.2 | 1 + ...verv7.0.0 => jungfrauDetectorServerv7.0.2} | Bin 302992 -> 302992 bytes .../slsDetectorFunctionList.c | 46 +++--- slsDetectorSoftware/src/Detector.cpp | 17 ++- slsDetectorSoftware/src/DetectorImpl.cpp | 139 +++++++++++++----- slsDetectorSoftware/src/DetectorImpl.h | 15 +- slsDetectorSoftware/src/Module.cpp | 7 + slsDetectorSoftware/src/Module.h | 1 + slsSupportLib/include/sls/network_utils.h | 1 + slsSupportLib/include/sls/versionAPI.h | 4 +- 12 files changed, 164 insertions(+), 104 deletions(-) delete mode 120000 serverBin/jungfrauDetectorServerv7.0.0 create mode 120000 serverBin/jungfrauDetectorServerv7.0.2 rename slsDetectorServers/jungfrauDetectorServer/bin/{jungfrauDetectorServerv7.0.0 => jungfrauDetectorServerv7.0.2} (70%) diff --git a/RELEASE.txt b/RELEASE.txt index f2e6ffb0e..89f0184cc 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -19,36 +19,10 @@ This document describes the differences between v7.0.1 and v7.0.0 1 Resolved Issues ================= - - Receiver - -------- - - - * HDF5 Compilation - Compilation issues from 7.0.0 fixed. - - - * Arping error - Cmdline: rx_arping - API: setRxArping/ getRxArping - Even if arping was successful, it gave an error. Fixed. - - - - Client - ------ - - - * Detector Server Version from previous Releases - Hostname command would hang with 7.0.0 client if the detector server - was from a previous release (eg. 6.1.2). In this case, the user cannot - get the detector server version. - - Fixed that the hostname command will throw an exception about - incompatible server with its version in the message. Now, the user can - get the version number without having to telnet or ssh to the detector. - With this info, one can then update to matching client for that server - and start the detector updation process. + - row and col for multi mod junngfrau single interface (gui) + - jungfrau multi mod sync mode (start, trigger, stop) + - set/get timing jungfrau does not give error when syc enabled + - switching between 1 and 2 interfaces did not set gui/client zmq port properly. Resulted in dummy streaming forever. 2 On-board Detector Server Compatibility @@ -56,7 +30,7 @@ This document describes the differences between v7.0.1 and v7.0.0 Eiger 7.0.0 - Jungfrau 7.0.0 + Jungfrau 7.0.2 Mythen3 7.0.0 Gotthard2 7.0.0 Gotthard 7.0.0 diff --git a/serverBin/jungfrauDetectorServerv7.0.0 b/serverBin/jungfrauDetectorServerv7.0.0 deleted file mode 120000 index c91c000b3..000000000 --- a/serverBin/jungfrauDetectorServerv7.0.0 +++ /dev/null @@ -1 +0,0 @@ -../slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv7.0.0 \ No newline at end of file diff --git a/serverBin/jungfrauDetectorServerv7.0.2 b/serverBin/jungfrauDetectorServerv7.0.2 new file mode 120000 index 000000000..b0e1b3fe4 --- /dev/null +++ b/serverBin/jungfrauDetectorServerv7.0.2 @@ -0,0 +1 @@ +../slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv7.0.2 \ No newline at end of file diff --git a/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv7.0.0 b/slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv7.0.2 similarity index 70% rename from slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv7.0.0 rename to slsDetectorServers/jungfrauDetectorServer/bin/jungfrauDetectorServerv7.0.2 index f4e3b91f4ef51361fb6dc7d0310f5bfa85a8e16f..820c9cb9e56b8da122f0caeb4b299a3ebf497d55 100755 GIT binary patch delta 54555 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

#dht$dOTzN?>d`A4SIEhUfm#LgNzL{XrMvE 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 delta 54419 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�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 diff --git a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c index 62ea6fe04..c34db22d4 100644 --- a/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/jungfrauDetectorServer/slsDetectorFunctionList.c @@ -1449,7 +1449,7 @@ void setTiming(enum timingMode arg) { } enum timingMode getTiming() { - if (bus_r(EXT_SIGNAL_REG) == EXT_SIGNAL_MSK) + if ((bus_r(EXT_SIGNAL_REG) & EXT_SIGNAL_MSK) >> EXT_SIGNAL_OFST) return TRIGGER_EXPOSURE; return AUTO_TIMING; } @@ -1736,40 +1736,40 @@ int setDetectorPosition(int pos[]) { detPos[2] = outerPos[X]; detPos[3] = outerPos[Y]; - // row + // row [Y] // outer uint32_t addr = COORD_ROW_REG; bus_w(addr, (bus_r(addr) & ~COORD_ROW_OUTER_MSK) | - ((outerPos[X] << COORD_ROW_OUTER_OFST) & COORD_ROW_OUTER_MSK)); + ((outerPos[Y] << COORD_ROW_OUTER_OFST) & COORD_ROW_OUTER_MSK)); if (((bus_r(addr) & COORD_ROW_OUTER_MSK) >> COORD_ROW_OUTER_OFST) != - outerPos[X]) - ret = FAIL; - // inner - bus_w(addr, - (bus_r(addr) & ~COORD_ROW_INNER_MSK) | - ((innerPos[X] << COORD_ROW_INNER_OFST) & COORD_ROW_INNER_MSK)); - if (((bus_r(addr) & COORD_ROW_INNER_MSK) >> COORD_ROW_INNER_OFST) != - innerPos[X]) - ret = FAIL; - - // col - // outer - addr = COORD_COL_REG; - bus_w(addr, - (bus_r(addr) & ~COORD_COL_OUTER_MSK) | - ((outerPos[Y] << COORD_COL_OUTER_OFST) & COORD_COL_OUTER_MSK)); - if (((bus_r(addr) & COORD_COL_OUTER_MSK) >> COORD_COL_OUTER_OFST) != outerPos[Y]) ret = FAIL; // inner bus_w(addr, - (bus_r(addr) & ~COORD_COL_INNER_MSK) | - ((innerPos[Y] << COORD_COL_INNER_OFST) & COORD_COL_INNER_MSK)); - if (((bus_r(addr) & COORD_COL_INNER_MSK) >> COORD_COL_INNER_OFST) != + (bus_r(addr) & ~COORD_ROW_INNER_MSK) | + ((innerPos[Y] << COORD_ROW_INNER_OFST) & COORD_ROW_INNER_MSK)); + if (((bus_r(addr) & COORD_ROW_INNER_MSK) >> COORD_ROW_INNER_OFST) != innerPos[Y]) ret = FAIL; + // col [X] + // outer + addr = COORD_COL_REG; + bus_w(addr, + (bus_r(addr) & ~COORD_COL_OUTER_MSK) | + ((outerPos[X] << COORD_COL_OUTER_OFST) & COORD_COL_OUTER_MSK)); + if (((bus_r(addr) & COORD_COL_OUTER_MSK) >> COORD_COL_OUTER_OFST) != + outerPos[X]) + ret = FAIL; + // inner + bus_w(addr, + (bus_r(addr) & ~COORD_COL_INNER_MSK) | + ((innerPos[X] << COORD_COL_INNER_OFST) & COORD_COL_INNER_MSK)); + if (((bus_r(addr) & COORD_COL_INNER_MSK) >> COORD_COL_INNER_OFST) != + innerPos[X]) + ret = FAIL; + if (ret == OK) { if (getNumberofUDPInterfaces() == 1) { LOG(logINFOBLUE, ("Position set to [%d, %d] #(col, row)\n", diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index 0692b0d09..32e7ab047 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -855,7 +855,7 @@ void Detector::stopDetector(Positions pos) { throw RuntimeError( "Could not stop detector. Returned error status."); } - pimpl->Parallel(&Module::stopAcquisition, pos); + pimpl->stopDetector(pos); status = getDetectorStatus().squash(defs::runStatus::RUNNING); ++retries; @@ -914,7 +914,7 @@ void Detector::setNextFrameNumber(uint64_t value, Positions pos) { } void Detector::sendSoftwareTrigger(const bool block, Positions pos) { - pimpl->Parallel(&Module::sendSoftwareTrigger, pos, block); + pimpl->sendSoftwareTrigger(block, pos); } Result Detector::getScan(Positions pos) const { @@ -951,18 +951,23 @@ void Detector::setNumberofUDPInterfaces(int n, Positions pos) { } void Detector::setNumberofUDPInterfaces_(int n, Positions pos) { + if (!size()) { + throw RuntimeError("No modules added."); + } bool previouslyClientStreaming = pimpl->getDataStreamingToClient(); + int clientStartingPort = getClientZmqPort({0}).squash(0); bool useReceiver = getUseReceiverFlag().squash(false); bool previouslyReceiverStreaming = false; - int startingPort = 0; + int rxStartingPort = 0; if (useReceiver) { previouslyReceiverStreaming = getRxZmqDataStream(pos).squash(true); - startingPort = getRxZmqPort({0}).squash(0); + rxStartingPort = getRxZmqPort({0}).squash(0); } pimpl->Parallel(&Module::setNumberofUDPInterfaces, pos, n); // ensure receiver zmq socket ports are multiplied by 2 (2 interfaces) - if (getUseReceiverFlag().squash(false) && size()) { - setRxZmqPort(startingPort, -1); + setClientZmqPort(clientStartingPort, -1); + if (getUseReceiverFlag().squash(false)) { + setRxZmqPort(rxStartingPort, -1); } // redo the zmq sockets if enabled if (previouslyClientStreaming) { diff --git a/slsDetectorSoftware/src/DetectorImpl.cpp b/slsDetectorSoftware/src/DetectorImpl.cpp index 12bbb9a45..43b9e168b 100644 --- a/slsDetectorSoftware/src/DetectorImpl.cpp +++ b/slsDetectorSoftware/src/DetectorImpl.cpp @@ -769,7 +769,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; @@ -808,7 +808,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:" @@ -1256,43 +1256,104 @@ int DetectorImpl::acquire() { return OK; } -void DetectorImpl::startAcquisition(bool blocking, std::vector positions) { - // handle Mythen3 synchronization - if (shm()->detType == defs::MYTHEN3 && size() > 1) { - std::vector master; - std::vector 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: + if (Parallel(&Module::getSynchronizationFromStopServer, pos) + .tsquash("Inconsistent synchronization among modules")) { + handleSync = true; + } + break; + default: + break; } + } + return handleSync; +} +void DetectorImpl::getMasterSlaveList(std::vector positions, + std::vector &masters, + std::vector &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 masters; + std::vector 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 masters; + std::vector 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 masters; + std::vector 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) { @@ -1397,7 +1458,8 @@ std::vector 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."; @@ -1425,10 +1487,9 @@ std::vector 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 @@ -1480,8 +1541,8 @@ std::vector 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) { diff --git a/slsDetectorSoftware/src/DetectorImpl.h b/slsDetectorSoftware/src/DetectorImpl.h index cb1394640..710ad00fe 100644 --- a/slsDetectorSoftware/src/DetectorImpl.h +++ b/slsDetectorSoftware/src/DetectorImpl.h @@ -278,7 +278,13 @@ class DetectorImpl : public virtual slsDetectorDefs { int acquire(); /** also takes care of master and slave for multi module mythen */ - void startAcquisition(bool blocking, std::vector positions); + void startAcquisition(const bool blocking, Positions pos); + + /** also takes care of master and slave for multi module mythen */ + void sendSoftwareTrigger(const bool block, Positions pos); + + /** also takes care of master and slave for multi module mythen */ + void stopDetector(Positions pos); /** * Combines data from all readouts and gives it to the gui @@ -368,9 +374,14 @@ class DetectorImpl : public virtual slsDetectorDefs { * @param nPixelsy number of pixels in Y axis (updated) * @returns total data bytes for updated image */ - int InsertGapPixels(char *image, char *&gpImage, bool quadEnable, int dr, + int insertGapPixels(char *image, char *&gpImage, bool quadEnable, int dr, int &nPixelsx, int &nPixelsy); + bool handleSynchronization(Positions pos); + void getMasterSlaveList(std::vector positions, + std::vector &masters, + std::vector &slaves); + void printProgress(double progress); void startProcessingThread(bool receiver); diff --git a/slsDetectorSoftware/src/Module.cpp b/slsDetectorSoftware/src/Module.cpp index c2b27c613..8249ef1e8 100644 --- a/slsDetectorSoftware/src/Module.cpp +++ b/slsDetectorSoftware/src/Module.cpp @@ -538,8 +538,15 @@ bool Module::getSynchronization() const { return sendToDetector(F_GET_SYNCHRONIZATION); } +bool Module::getSynchronizationFromStopServer() const { + return sendToDetectorStop(F_GET_SYNCHRONIZATION); +} + void Module::setSynchronization(const bool value) { sendToDetector(F_SET_SYNCHRONIZATION, static_cast(value), nullptr); + // to deal with virtual servers as well + // (get sync from stop server during blocking acquisition) + sendToDetectorStop(F_SET_SYNCHRONIZATION, static_cast(value), nullptr); } std::vector Module::getBadChannels() const { diff --git a/slsDetectorSoftware/src/Module.h b/slsDetectorSoftware/src/Module.h index 37cd00a08..a0e4fcc80 100644 --- a/slsDetectorSoftware/src/Module.h +++ b/slsDetectorSoftware/src/Module.h @@ -129,6 +129,7 @@ class Module : public virtual slsDetectorDefs { bool isMaster() const; void setMaster(const bool master); bool getSynchronization() const; + bool getSynchronizationFromStopServer() const; void setSynchronization(const bool value); std::vector getBadChannels() const; void setBadChannels(std::vector list); diff --git a/slsSupportLib/include/sls/network_utils.h b/slsSupportLib/include/sls/network_utils.h index aeaed5aa9..e0e48c416 100644 --- a/slsSupportLib/include/sls/network_utils.h +++ b/slsSupportLib/include/sls/network_utils.h @@ -2,6 +2,7 @@ // Copyright (C) 2021 Contributors to the SLS Detector Package #pragma once #include +#include #include #include diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index e392dc101..03f4d373f 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -5,9 +5,9 @@ #define APICTB "7.0.0 0x230222" #define APIGOTTHARD "7.0.0 0x230222" #define APIGOTTHARD2 "7.0.0 0x230222" -#define APIJUNGFRAU "7.0.0 0x230222" #define APIMYTHEN3 "7.0.0 0x230222" #define APIMOENCH "7.0.0 0x230222" #define APIEIGER "7.0.0 0x230222" #define APIRECEIVER "7.0.0 0x230222" -#define APILIB "7.0.1 0x230323" +#define APIJUNGFRAU "7.0.2 0x230420" +#define APILIB "7.0.2 0x230421"