From 4ede10aa6a3eca5930ad7df4ca50bf3f8eb92fcf Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Thu, 5 Mar 2026 12:05:46 +0100 Subject: [PATCH] jfjoch_broker: Allow to query connected writers --- broker/JFJochServices.cpp | 8 +- broker/JFJochServices.h | 2 + broker/JFJochStateMachine.cpp | 1 + broker/OpenAPIConvert.cpp | 1 + broker/gen/model/Broker_status.cpp | 33 +++- broker/gen/model/Broker_status.h | 9 ++ broker/jfjoch_api.yaml | 7 + broker/redoc-static.html | 6 +- common/BrokerStatus.h | 1 + docs/IMAGE_STREAM.md | 158 +++++++++++++------ docs/python_client/docs/BrokerStatus.md | 1 + frontend/package-lock.json | 4 +- frontend/src/openapi/models/broker_status.ts | 7 + image_pusher/CBORFilePusher.cpp | 6 +- image_pusher/CBORFilePusher.h | 2 + image_pusher/HDF5FilePusher.cpp | 4 + image_pusher/HDF5FilePusher.h | 1 + image_pusher/ImagePusher.h | 1 + image_pusher/TCPStreamPusher.h | 2 +- image_pusher/ZMQStream2Pusher.cpp | 6 +- image_pusher/ZMQStream2Pusher.h | 2 + receiver/JFJochReceiverService.cpp | 4 + receiver/JFJochReceiverService.h | 2 + 23 files changed, 209 insertions(+), 59 deletions(-) diff --git a/broker/JFJochServices.cpp b/broker/JFJochServices.cpp index d5cd1765..088a9d72 100644 --- a/broker/JFJochServices.cpp +++ b/broker/JFJochServices.cpp @@ -269,4 +269,10 @@ void JFJochServices::LoadDetectorPixelMask(PixelMask &mask) { void JFJochServices::SetupIndexing(const IndexingSettings &input) { if (receiver) receiver->Indexing(input); -} \ No newline at end of file +} + +uint64_t JFJochServices::GetConnectedWriters() const { + if (receiver) + return receiver->GetConnectedWriters(); + return 0; +} diff --git a/broker/JFJochServices.h b/broker/JFJochServices.h index 8e697184..22dc8b1c 100644 --- a/broker/JFJochServices.h +++ b/broker/JFJochServices.h @@ -67,6 +67,8 @@ public: void LoadDetectorPixelMask(PixelMask &mask); void SetupIndexing(const IndexingSettings& input); + + uint64_t GetConnectedWriters() const; }; diff --git a/broker/JFJochStateMachine.cpp b/broker/JFJochStateMachine.cpp index 7092a98f..15d99777 100644 --- a/broker/JFJochStateMachine.cpp +++ b/broker/JFJochStateMachine.cpp @@ -554,6 +554,7 @@ BrokerStatus JFJochStateMachine::GetStatus() const { ret.progress = services.GetReceiverProgress(); ret.gpu_count = gpu_count; ret.broker_version = jfjoch_version(); + ret.connected_writers = services.GetConnectedWriters(); return ret; } diff --git a/broker/OpenAPIConvert.cpp b/broker/OpenAPIConvert.cpp index 84c78c0f..53159cef 100644 --- a/broker/OpenAPIConvert.cpp +++ b/broker/OpenAPIConvert.cpp @@ -242,6 +242,7 @@ org::openapitools::server::model::Broker_status Convert(const BrokerStatus& inpu ret.setGpuCount(input.gpu_count); ret.setBrokerVersion(input.broker_version); + ret.setConnectedWriters(input.connected_writers); return ret; } diff --git a/broker/gen/model/Broker_status.cpp b/broker/gen/model/Broker_status.cpp index 228da9cd..ef4a0640 100644 --- a/broker/gen/model/Broker_status.cpp +++ b/broker/gen/model/Broker_status.cpp @@ -32,6 +32,8 @@ Broker_status::Broker_status() m_Gpu_countIsSet = false; m_Broker_version = ""; m_Broker_versionIsSet = false; + m_Connected_writers = 0L; + m_Connected_writersIsSet = false; } @@ -73,7 +75,7 @@ bool Broker_status::validate(std::stringstream& msg, const std::string& pathPref } } - + return success; } @@ -98,7 +100,10 @@ bool Broker_status::operator==(const Broker_status& rhs) const ((!gpuCountIsSet() && !rhs.gpuCountIsSet()) || (gpuCountIsSet() && rhs.gpuCountIsSet() && getGpuCount() == rhs.getGpuCount())) && - ((!brokerVersionIsSet() && !rhs.brokerVersionIsSet()) || (brokerVersionIsSet() && rhs.brokerVersionIsSet() && getBrokerVersion() == rhs.getBrokerVersion())) + ((!brokerVersionIsSet() && !rhs.brokerVersionIsSet()) || (brokerVersionIsSet() && rhs.brokerVersionIsSet() && getBrokerVersion() == rhs.getBrokerVersion())) && + + + ((!connectedWritersIsSet() && !rhs.connectedWritersIsSet()) || (connectedWritersIsSet() && rhs.connectedWritersIsSet() && getConnectedWriters() == rhs.getConnectedWriters())) ; } @@ -122,6 +127,8 @@ void to_json(nlohmann::json& j, const Broker_status& o) j["gpu_count"] = o.m_Gpu_count; if(o.brokerVersionIsSet()) j["broker_version"] = o.m_Broker_version; + if(o.connectedWritersIsSet()) + j["connected_writers"] = o.m_Connected_writers; } @@ -153,6 +160,11 @@ void from_json(const nlohmann::json& j, Broker_status& o) j.at("broker_version").get_to(o.m_Broker_version); o.m_Broker_versionIsSet = true; } + if(j.find("connected_writers") != j.end()) + { + j.at("connected_writers").get_to(o.m_Connected_writers); + o.m_Connected_writersIsSet = true; + } } @@ -249,6 +261,23 @@ void Broker_status::unsetBroker_version() { m_Broker_versionIsSet = false; } +int64_t Broker_status::getConnectedWriters() const +{ + return m_Connected_writers; +} +void Broker_status::setConnectedWriters(int64_t const value) +{ + m_Connected_writers = value; + m_Connected_writersIsSet = true; +} +bool Broker_status::connectedWritersIsSet() const +{ + return m_Connected_writersIsSet; +} +void Broker_status::unsetConnected_writers() +{ + m_Connected_writersIsSet = false; +} } // namespace org::openapitools::server::model diff --git a/broker/gen/model/Broker_status.h b/broker/gen/model/Broker_status.h index d5552c3e..3833dd4a 100644 --- a/broker/gen/model/Broker_status.h +++ b/broker/gen/model/Broker_status.h @@ -98,6 +98,13 @@ public: void setBrokerVersion(std::string const& value); bool brokerVersionIsSet() const; void unsetBroker_version(); + /// + /// Number of connected writers For ZeroMQ image socket: number is constant For TCP/IP image socket: number is updated live during operation + /// + int64_t getConnectedWriters() const; + void setConnectedWriters(int64_t const value); + bool connectedWritersIsSet() const; + void unsetConnected_writers(); friend void to_json(nlohmann::json& j, const Broker_status& o); friend void from_json(const nlohmann::json& j, Broker_status& o); @@ -114,6 +121,8 @@ protected: bool m_Gpu_countIsSet; std::string m_Broker_version; bool m_Broker_versionIsSet; + int64_t m_Connected_writers; + bool m_Connected_writersIsSet; }; diff --git a/broker/jfjoch_api.yaml b/broker/jfjoch_api.yaml index 4e8e14a8..2046c221 100644 --- a/broker/jfjoch_api.yaml +++ b/broker/jfjoch_api.yaml @@ -1344,6 +1344,13 @@ components: type: string description: Version of the jfjoch_broker example: "1.0.0-rc.128" + connected_writers: + type: integer + format: int64 + description: | + Number of connected writers + For ZeroMQ image socket: number is constant + For TCP/IP image socket: number is updated live during operation plot: type: object required: diff --git a/broker/redoc-static.html b/broker/redoc-static.html index b234a270..a4302053 100644 --- a/broker/redoc-static.html +++ b/broker/redoc-static.html @@ -763,7 +763,7 @@ This can only be done when detector is Idle, Error or
http://localhost:5232/config/dark_mask

Response samples

Content type
application/json
{
  • "detector_threshold_keV": 3.5,
  • "frame_time_us": 10000,
  • "number_of_frames": 1000,
  • "max_allowed_pixel_count": 1,
  • "max_frames_with_signal": 10
}

Get Jungfraujoch status

Status of the data acquisition

Responses

Response samples

Content type
application/json
{
  • "state": "Inactive",
  • "progress": 1,
  • "message": "string",
  • "message_severity": "success",
  • "gpu_count": 0,
  • "broker_version": "1.0.0-rc.128"
}

Get status of FPGA devices

Responses

Response samples

Content type
application/json
{
  • "state": "Inactive",
  • "progress": 1,
  • "message": "string",
  • "message_severity": "success",
  • "gpu_count": 0,
  • "broker_version": "1.0.0-rc.128",
  • "connected_writers": 0
}

Get status of FPGA devices

Responses

Response samples

Content type
application/json
[
  • {
    }
]

Return XFEL pulse IDs for the current data acquisition

Return array of XFEL pulse IDs - (-1) if image not recorded

Responses

Request samples

Content type
application/json
{
  • "box": {
    },
  • "circle": {
    },
  • "azim": {
    }
}

Response samples

Content type
application/json
{
  • "msg": "Detector in wrong state",
  • "reason": "WrongDAQState"
}

Get general statistics

query Parameters
compression
boolean
Default: false

Enable DEFLATE compression of output data.

Responses

Response samples

Content type
application/json
{
  • "detector": {
    },
  • "detector_list": {
    },
  • "detector_settings": {
    },
  • "image_format_settings": {
    },
  • "instrument_metadata": {
    },
  • "file_writer_settings": {
    },
  • "data_processing_settings": {
    },
  • "measurement": {
    },
  • "broker": {
    },
  • "fpga": [
    ],
  • "calibration": [
    ],
  • "zeromq_preview": {
    },
  • "zeromq_metadata": {
    },
  • "dark_mask": {
    },
  • "pixel_mask": {
    },
  • "roi": {
    },
  • "az_int": {
    },
  • "buffer": {
    },
  • "indexing": {
    }
}

Get data collection statistics

Results of the last data collection

+
http://localhost:5232/statistics

Response samples

Content type
application/json
{
  • "detector": {
    },
  • "detector_list": {
    },
  • "detector_settings": {
    },
  • "image_format_settings": {
    },
  • "instrument_metadata": {
    },
  • "file_writer_settings": {
    },
  • "data_processing_settings": {
    },
  • "measurement": {
    },
  • "broker": {
    },
  • "fpga": [
    ],
  • "calibration": [
    ],
  • "zeromq_preview": {
    },
  • "zeromq_metadata": {
    },
  • "dark_mask": {
    },
  • "pixel_mask": {
    },
  • "roi": {
    },
  • "az_int": {
    },
  • "buffer": {
    },
  • "indexing": {
    }
}

Get data collection statistics

Results of the last data collection

Responses