Files
Jungfraujoch/preview/ZMQPreviewSocket.cpp
2024-11-22 21:25:20 +01:00

54 lines
1.7 KiB
C++

// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute <filip.leonarski@psi.ch>
// SPDX-License-Identifier: GPL-3.0-only
#include "ZMQPreviewSocket.h"
ZMQPreviewSocket::ZMQPreviewSocket(const std::string &addr)
: counter(std::chrono::seconds(1)), enable(true), socket(ZMQSocketType::Pub), send_start_message(true)
{
socket.Conflate(true);
socket.Bind(addr);
}
ZMQPreviewSocket &ZMQPreviewSocket::Period(const std::optional<std::chrono::microseconds> &period) {
counter.Period(period);
enable = period.has_value();
return *this;
}
ZMQPreviewSocket &ZMQPreviewSocket::SendStartMessage(bool input) {
send_start_message = input;
return *this;
}
void ZMQPreviewSocket::SendImage(const uint8_t *image_data, size_t image_size) {
if (counter.GeneratePreview())
socket.Send(image_data, image_size, false);
}
void ZMQPreviewSocket::StartDataCollection(StartMessage &message) {
if (send_start_message) {
std::vector<uint8_t> serialization_buffer(256*1024*1024);
CBORStream2Serializer serializer(serialization_buffer.data(), serialization_buffer.size());
serializer.SerializeSequenceStart(message);
socket.Send(serialization_buffer.data(), serializer.GetBufferSize(), false);
}
}
std::string ZMQPreviewSocket::GetAddress() {
return socket.GetEndpointName();
}
ZMQPreviewSettings ZMQPreviewSocket::GetSettings() {
return {
.period = counter.GetPeriod(),
.address = socket.GetEndpointName(),
.send_start_message = send_start_message
};
}
ZMQPreviewSocket &ZMQPreviewSocket::ImportSettings(const ZMQPreviewSettings &settings) {
Period(settings.period);
return *this;
}