Program Listing for File config.hpp

Return to documentation for file (config/config.hpp)

#ifndef FELIX_STAR_CONFIG_H_
#define FELIX_STAR_CONFIG_H_

#include <map>
#include <vector>
#include <string>
#include <iostream>
#include <iterator>
#include <sstream>
#include <algorithm>

#include <map>
#include "block.hpp"                    //for MAX_BUF_CHUNK_SIZE
#include "felix/felix_fid.h"
#include "felix/felix_ports.h"          //PORT macros
#include "felix/felix_client_util.hpp"  //ip-iface conversion

#include "docopt/docopt.h"


enum class EventLoopType {
    netio_next,
    netio3_native,
    netio3_asio,
};

struct NetworkConfig
{
    std::string ip{"127.0.0.1"};
    std::map<int, int> ports;
    bool daq_unbuffered{false};
    bool daq_tcp{false};
    unsigned netio_pages{256};
    uint32_t netio_pagesize{65536};
    uint32_t netio_watermark{64511};
    unsigned long netio_timeout{0};

    std::string dcs_ip{""};
    std::map<int, int> dcs_ports;
    bool dcs_tcp{false};
    bool dcs_unbuffered{true};
    unsigned dcs_netio_pages{128};
    uint32_t dcs_netio_pagesize{6144};
    uint32_t dcs_netio_watermark{6100};
    unsigned long dcs_netio_timeout{10000};

    std::map<int, int> ttc_ports;
    unsigned ttc_netio_pages{64};
    uint32_t ttc_netio_pagesize{1536};
    uint32_t ttc_netio_watermark{1280};
    unsigned long ttc_netio_timeout{1000};

    std::string bus_dir{""};
    std::string bus_groupname{"FELIX"};
    bool verbose_bus{false};

    EventLoopType evloop_type{EventLoopType::netio_next};
};


struct ResourceConfig
{
    std::vector<uint16_t> device;
    std::vector<uint16_t> cid;
    std::vector<int> dma_ids;
    uint8_t vid{1};
    uint16_t did{0};
    size_t cmem_buffersize{1024*1024*1024};
    bool free_previous_cmem{true};
    bool toflx{false};
    bool use_file{false};
};


struct MonitoringConfig
{
    std::string monitoring_fifo{""};
    int monitoring_period_ms{1000};
};

class Config
{
    public:
        Config();
        virtual ~Config();
        virtual void parse(int argc, char **argv);
        virtual std::ostream& format(std::ostream& os) const;
        friend std::ostream& operator<<(std::ostream& os, const Config& c);
        int get_number_devices();
        uint16_t get_device_cid(unsigned int dev_no);
        int get_unique_dmaid(int dmaid, uint16_t device);
        int udmaid_to_deviceid(int udmaid);
        int udmaid_to_dmaid(int udmaid);

    protected:
        virtual std::string usage() { return "undefined"; } // = 0; FIXME, can only be added if we do not instantiate Config, needs to be reference (statistics, register)
        virtual std::string options();
        virtual std::string bugs();
        virtual void handle_cmd_line(std::map<std::string, docopt::value> args);

    public:
        bool verbose{false};
        std::string appname{""};
        ResourceConfig resource;
        MonitoringConfig stats;
        NetworkConfig network;

        // derived for easy class check
        bool use_file{false};
        bool vmem{false};

    private:
        [[nodiscard]] static std::string evloop_type_to_str(EventLoopType type);
        [[nodiscard]] static EventLoopType evloop_type_from_str(std::string_view type);
};


class ConfigFile : public virtual Config
{
    public:
        ConfigFile();
        virtual ~ConfigFile();
        virtual std::ostream& format(std::ostream& os) const override;
        friend std::ostream& operator<<(std::ostream& os, const ConfigFile& c);

    protected:
        virtual std::string options() override;
        virtual void handle_cmd_line(std::map<std::string, docopt::value> args) override;

    public:
        u_int    firmware{0};
        u_int    lock_mask{0};
        u_int    regmap{0};
        u_int    channels{24};
        u_int    block_size{1024};
        int      fromHostDataFormat{0};
        int      toHostDataFormat{0};
        bool     wide_mode{0};
        int      toflx_dmaid{-1};
        int      max_tlp_bytes{256};
        uint32_t status_leds{0};
        bool     fifo_as_file{false};
        std::string file{""};
        std::map<int, std::vector<uint16_t>> elinks;
        std::map<int, std::vector<uint16_t>> elinks_with_streams;
};


class ConfigToHost : public virtual Config {
    public:
        ConfigToHost();
        virtual std::ostream& format(std::ostream& os) const override;
        friend std::ostream& operator<<(std::ostream& os, const ConfigToHost& c);

    protected:
        virtual std::string usage() override;
        virtual std::string options() override;
        virtual void handle_cmd_line(std::map<std::string, docopt::value> args) override;

    public:
        unsigned int daq_threads{1};
        int dcs_rate_limit{-1};
        int l1id_check{-1};
        uint32_t max_dcs_chunk_size{UINT32_MAX};
        uint32_t max_daq_chunk_size{UINT32_MAX};
        int poll_time{10000};
};


class ConfigToFlx : public virtual Config {
    public:
        ConfigToFlx();
        virtual std::ostream& format(std::ostream& os) const override;
        friend std::ostream& operator<<(std::ostream& os, const ConfigToFlx& c);

    protected:
        virtual std::string usage() override;
        virtual std::string options() override;
        virtual void handle_cmd_line(std::map<std::string, docopt::value> args) override;

    public:
        bool unbuffered{false};
        bool trickle{false};
};


class ConfigFileToHost : public ConfigToHost, public ConfigFile {
    public:
        ConfigFileToHost();
        virtual ~ConfigFileToHost();
        virtual std::ostream& format(std::ostream& os) const override;
        friend std::ostream& operator<<(std::ostream& os, const ConfigFileToHost& c);

    protected:
        virtual std::string usage() override;
        virtual std::string options() override;
        virtual void handle_cmd_line(std::map<std::string, docopt::value> args) override;

    public:
        // alphabetical
        unsigned block_rate{0};
        bool full_mode{false};
        bool repeat{true};
};


class ConfigToFlxToFile : public ConfigToFlx, public ConfigFile {
    public:
        ConfigToFlxToFile();
        virtual ~ConfigToFlxToFile();
        virtual std::ostream& format(std::ostream& os) const override;
        friend std::ostream& operator<<(std::ostream& os, const ConfigToFlxToFile& c);

    protected:
        virtual std::string usage() override;
        virtual std::string options() override;
        virtual void handle_cmd_line(std::map<std::string, docopt::value> args) override;
};

#endif /* FELIX_STAR_CONFIG_H_ */