Program Listing for File publisher.hpp

Return to documentation for file (publisher.hpp)

#ifndef FELIX_DATAPUBLISHER_H_
#define FELIX_DATAPUBLISHER_H_

#include <sys/uio.h>

#include <cstdint>
#include <functional>
#include <vector>

#include "elink.hpp"
#include "completion_table.hpp"

class Publisher
{
    protected:
        size_t m_max_msg_size{};
        uint32_t m_max_iov_len{};
        [[nodiscard]] std::uint8_t truncate_msg_if_too_large(iovec *iov, uint32_t &size, std::uint8_t status);

    public:
        using Callback = std::function<bool()>;

        enum Result
        {
            OK = 0,
            ERROR = 1,
            AGAIN = 2,
            PARTIAL = 3,
            ERROR_TOO_BIG = 4,
            NO_SUBSCRIBERS = 5,
            DECODING_ERROR = 7
        };

        virtual ~Publisher() = default;

        virtual bool declare(const std::vector<Elink> &elinks) = 0;

        virtual Result publish(felix_id_t fid, iovec *iov, uint32_t iovlen, size_t bytes, uint32_t block_addr, std::uint8_t status) = 0;

        virtual Result publish(felix_id_t fid, uint8_t *data, size_t len) = 0;

        virtual Result flush(felix_id_t fid) = 0;

        virtual void set_periodic_callback(uint32_t period_us, Callback callback) = 0;

        virtual void set_asynch_callback(Callback callback) = 0;

        virtual void fire_asynch_callback() = 0;

        virtual const CompletionTable* get_completion_table() = 0;

        // monitoring
        virtual uint32_t get_resource_counter() = 0;

        virtual uint32_t get_subscription_number() = 0;

        virtual uint64_t get_resource_available_calls() = 0;
};

#endif /* FELIX_DATAPUBLISHER_H_ */