// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #ifndef JUNGFRAUJOCH_ZMQIMAGEPULLER_H #define JUNGFRAUJOCH_ZMQIMAGEPULLER_H #include #include "../common/ZMQWrappers.h" #include "../common/Logger.h" #include "../common/SpotToSave.h" #include "../frame_serialize/CBORStream2Deserializer.h" #include "../common/ThreadSafeFIFO.h" #include "ImagePuller.h" class ZMQImagePuller : public ImagePuller { const uint32_t default_receive_watermark = 100; const uint32_t default_repub_watermark = 220; // ZeroMQ receive timeout allows to check for abort value from time to time constexpr static auto ReceiveTimeout = std::chrono::milliseconds(100); constexpr static auto RepubTimeout = std::chrono::milliseconds(100); ZMQSocket socket; std::string addr; std::atomic disconnect = 0; std::unique_ptr repub_socket; ThreadSafeFIFO cbor_fifo{200}; ThreadSafeFIFO repub_fifo{200}; std::thread puller_thread; std::thread cbor_thread; std::thread repub_thread; void PullerThread(); void CBORThread(); void RepubThread(); Logger logger{"ZMQImagePuller"}; public: explicit ZMQImagePuller( const std::string &zmq_addr, const std::string &repub_address = "", const std::optional &rcv_watermark = {}, const std::optional &repub_watermark = {}); ~ZMQImagePuller(); void Disconnect() override; }; #endif //JUNGFRAUJOCH_ZMQIMAGEPULLER_H