// Copyright (2019-2023) Paul Scherrer Institute #include "ZMQPreviewPublisher.h" #include "CBORStream2Serializer.h" ZMQPreviewPublisher::ZMQPreviewPublisher(ZMQContext& context, const std::string& addr) : socket(context, ZMQSocketType::Pub) { socket.SendWaterMark(2).NoLinger(); socket.Bind(addr); } void ZMQPreviewPublisher::SetPreviewStride(int64_t preview_stride) { std::unique_lock ul(m); stride = preview_stride; } void ZMQPreviewPublisher::StartDataCollection(const StartMessage& message) { std::unique_lock ul(m); current_part = -1; size_t approx_size = 1024*1024; for (const auto &x : message.pixel_mask) approx_size += x.size; for (const auto &x : message.calibration) approx_size += x.size; std::vector serialization_buffer(approx_size); CBORStream2Serializer serializer(serialization_buffer.data(), serialization_buffer.size()); serializer.SerializeSequenceStart(message); socket.Send(serialization_buffer.data(), serializer.GetBufferSize()); } void ZMQPreviewPublisher::SendImage(const DataMessage& message) { { std::unique_lock ul(m); int64_t part = message.number / stride; if (current_part >= part) return; else current_part = part; } size_t approx_size = message.image.size + 2*1024*1024; std::vector serialization_buffer(approx_size); CBORStream2Serializer serializer(serialization_buffer.data(), serialization_buffer.size()); serializer.SerializeImage(message); socket.Send(serialization_buffer.data(), serializer.GetBufferSize()); }