diff --git a/slsReceiverSoftware/src/DataStreamer.cpp b/slsReceiverSoftware/src/DataStreamer.cpp index 8ade0941a..6eb833aea 100644 --- a/slsReceiverSoftware/src/DataStreamer.cpp +++ b/slsReceiverSoftware/src/DataStreamer.cpp @@ -56,6 +56,8 @@ void DataStreamer::SetAdditionalJsonHeader( isAdditionalJsonUpdated = true; } +void DataStreamer::SetReceiverROI(ROI roi) { receiverRoi = roi; } + void DataStreamer::ResetParametersforNewAcquisition(const std::string &fname) { StopRunning(); startedFlag = false; @@ -249,6 +251,7 @@ int DataStreamer::SendDataHeader(sls_detector_header header, uint32_t size, isAdditionalJsonUpdated = false; } zHeader.addJsonHeader = localAdditionalJsonHeader; + zHeader.rx_roi = receiverRoi.getIntArray(); return zmqSocket->SendHeader(index, zHeader); } diff --git a/slsReceiverSoftware/src/DataStreamer.h b/slsReceiverSoftware/src/DataStreamer.h index f05c4e466..6f3fbb7d3 100644 --- a/slsReceiverSoftware/src/DataStreamer.h +++ b/slsReceiverSoftware/src/DataStreamer.h @@ -38,6 +38,7 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { void SetNumberofTotalFrames(uint64_t value); void SetAdditionalJsonHeader(const std::map &json); + void SetReceiverROI(ROI roi); void ResetParametersforNewAcquisition(const std::string &fname); /** @@ -92,6 +93,7 @@ class DataStreamer : private virtual slsDetectorDefs, public ThreadObject { uint64_t fileIndex{0}; bool flipRows{false}; std::map additionalJsonHeader; + ROI receiverRoi{}; /** Used by streamer thread to update local copy (reduce number of locks * during streaming) */ diff --git a/slsReceiverSoftware/src/Implementation.cpp b/slsReceiverSoftware/src/Implementation.cpp index 1e1337cd2..0f3b733ea 100644 --- a/slsReceiverSoftware/src/Implementation.cpp +++ b/slsReceiverSoftware/src/Implementation.cpp @@ -216,6 +216,8 @@ void Implementation::SetupDataStreamer(int i) { dataStreamer[i]->SetNumberofPorts(numPorts); dataStreamer[i]->SetQuadEnable(quadEnable); dataStreamer[i]->SetNumberofTotalFrames(numberOfTotalFrames); + dataStreamer[i]->SetReceiverROI( + portRois[i].completeRoi() ? GetMaxROIPerPort() : portRois[i]); } slsDetectorDefs::xy Implementation::getDetectorSize() const { @@ -231,6 +233,11 @@ const slsDetectorDefs::xy Implementation::GetPortGeometry() const { return portGeometry; } +const slsDetectorDefs::ROI Implementation::GetMaxROIPerPort() const { + return slsDetectorDefs::ROI{0, (int)generalData->nPixelsX - 1, 0, + (int)generalData->nPixelsY - 1}; +} + void Implementation::setDetectorSize(const slsDetectorDefs::xy size) { xy portGeometry = GetPortGeometry(); @@ -458,6 +465,10 @@ void Implementation::setReceiverROI(const slsDetectorDefs::ROI arg) { listener[i]->SetNoRoi(portRois[i].noRoi()); for (size_t i = 0; i != dataProcessor.size(); ++i) dataProcessor[i]->SetReceiverROI(portRois[i]); + for (size_t i = 0; i != dataStreamer.size(); ++i) { + dataStreamer[i]->SetReceiverROI( + portRois[i].completeRoi() ? GetMaxROIPerPort() : portRois[i]); + } LOG(logINFO) << "receiver roi: " << ToString(receiverRoi); if (generalData->numUDPInterfaces == 2 && generalData->detType != slsDetectorDefs::GOTTHARD2) { diff --git a/slsReceiverSoftware/src/Implementation.h b/slsReceiverSoftware/src/Implementation.h index 3dc3b3cda..dca7990f9 100644 --- a/slsReceiverSoftware/src/Implementation.h +++ b/slsReceiverSoftware/src/Implementation.h @@ -282,6 +282,7 @@ class Implementation : private virtual slsDetectorDefs { void SetupFifoStructure(); const xy GetPortGeometry() const; + const ROI GetMaxROIPerPort() const; void ResetParametersforNewAcquisition(); void CreateUDPSockets(); void SetupWriter(); diff --git a/slsSupportLib/include/sls/ZmqSocket.h b/slsSupportLib/include/sls/ZmqSocket.h index 3537f1f35..16c9fc5aa 100644 --- a/slsSupportLib/include/sls/ZmqSocket.h +++ b/slsSupportLib/include/sls/ZmqSocket.h @@ -13,6 +13,7 @@ #include "sls/sls_detector_exceptions.h" #include +#include #include // Selective suppression of warning in gcc, @@ -83,6 +84,8 @@ struct zmqHeader { bool completeImage{false}; /** additional json header */ std::map addJsonHeader; + /** (xmin, xmax, ymin, ymax) roi only in files written */ + std::array rx_roi{}; }; class ZmqSocket { diff --git a/slsSupportLib/src/ZmqSocket.cpp b/slsSupportLib/src/ZmqSocket.cpp index c4c024179..f0ed37fba 100644 --- a/slsSupportLib/src/ZmqSocket.cpp +++ b/slsSupportLib/src/ZmqSocket.cpp @@ -254,6 +254,8 @@ int ZmqSocket::SendHeader(int index, zmqHeader header) { } oss << " } "; } + oss << ", \"rx_roi\":[" << header.rx_roi[0] << ", " << header.rx_roi[1] + << ", " << header.rx_roi[2] << ", " << header.rx_roi[3] << "]"; oss << "}\n"; std::string message = oss.str(); int length = message.length(); @@ -375,6 +377,11 @@ int ZmqSocket::ParseHeader(const int index, int length, char *buff, } } + const Value &a = document["rx_roi"].GetArray(); + for (SizeType i = 0; i != a.Size(); ++i) { + zHeader.rx_roi[i] = a[i].GetInt(); + } + return 1; }