// SPDX-FileCopyrightText: 2024 Filip Leonarski, Paul Scherrer Institute // SPDX-License-Identifier: GPL-3.0-only #ifndef JFJOCH_HDF5FILEPUSHER_H #define JFJOCH_HDF5FILEPUSHER_H #include #include "ImagePusher.h" #include "../writer/FileWriter.h" #include "../common/ThreadSafeFIFO.h" #include "../common/ZMQWrappers.h" #include "../common/Logger.h" class HDF5FilePusher : public ImagePusher { std::unique_ptr writer; std::mutex m; std::future writer_future; ThreadSafeFIFO writer_queue; void WriterThread(); std::atomic images_written = 0; static constexpr uint32_t default_repub_watermark = 220; static constexpr auto RepubTimeout = std::chrono::milliseconds(100); std::unique_ptr repub_socket; bool repub_active = false; Logger logger{"HDF5FilePusher"}; public: explicit HDF5FilePusher(const std::string &repub_address = "", const std::optional &repub_watermark = {}); // Thread safety: StartDataCollection, EndDataCollection and SendCalibration must run poorly in serial context // SendImage can be executed in parallel void StartDataCollection(StartMessage &message) override; bool EndDataCollection(const EndMessage &message) override; bool SendImage(const uint8_t *image_data, size_t image_size, int64_t image_number) override; void SendImage(ZeroCopyReturnValue &z) override; bool SendCalibration(const CompressedImage &message) override; std::string PrintSetup() const override; std::optional GetImagesWritten() const override; size_t GetConnectedWriters() const override; ImagePusherType GetType() const override { return ImagePusherType::HDF5; } }; #endif //JFJOCH_HDF5FILEPUSHER_H