Program Listing for File config_to_host.cpp
↰ Return to documentation for file (config/config_to_host.cpp
)
#include "config.hpp"
#include <cstdint>
ConfigToHost::ConfigToHost() : Config() {
use_file = false;
resource.toflx = false;
}
//ConfigToHost::~ConfigToHost() {}
std::ostream& ConfigToHost::format(std::ostream& os) const {
os << "ConfigToHost" << std::endl;
os << "cmem_buffersize: " << resource.cmem_buffersize << std::endl;
os << "netio_watermark: " << network.netio_watermark << std::endl;
os << "daq_unbuffered: " << network.daq_unbuffered << std::endl;
os << "dcs_ip: " << network.dcs_ip << std::endl;
os << "dcs_tcp: " << network.dcs_tcp << std::endl;
os << "dcs_netio_pages: " << network.dcs_netio_pages << std::endl;
os << "dcs_netio_pagesize: " << network.dcs_netio_pagesize << std::endl;
os << "max_dcs_chunk_size: " << max_dcs_chunk_size << std::endl;
os << "dcs_netio_timeout: " << network.dcs_netio_timeout << std::endl;
os << "dcs_unbuffered: " << network.dcs_unbuffered << std::endl;
os << "dcs_netio_watermark: " << network.dcs_netio_watermark << std::endl;
os << "dmaid: ";
std::copy(resource.dma_ids.begin(), resource.dma_ids.end(), std::ostream_iterator<int>(os, " "));
os << std::endl;
os << "l1id_check: " << l1id_check << std::endl;
os << "max_daq_chunk_size: " << max_daq_chunk_size << std::endl;
os << "poll_time (us): "<< poll_time << std::endl;
os << "ttc_netio_pages: " << network.netio_pages << std::endl;
os << "ttc_netio_pagesize: " << network.ttc_netio_pagesize << std::endl;
os << "ttc_netio_timeout: " << network.ttc_netio_timeout << std::endl;
os << "ttc_netio_watermark: " << network.ttc_netio_watermark << std::endl;
os << std::endl;
return Config::format(os);
}
std::ostream& operator<<(std::ostream& os, const ConfigToHost& c) {
return c.format(os);
}
std::string ConfigToHost::usage() {
return
R"(felix-tohost - FELIX central data acquisition application
Usage:
felix-tohost [options --device=<device>... --cid=<cid>... --dma=<id>...]
)";
}
std::string ConfigToHost::options() {
return Config::options() +
R"(
ToHost Options:
-D, --dma=<id> Use DMA descriptor ID. [default: 0]
-c, --cmem=SIZE CMEM buffer size in MB. [default: 512]
--daq-unbuffered DAQ unbuffered mode: zero-copy readout (max O(100) kHz rate per link, useful for >O(kB) messages)
-T, --netio-timeout=SIZE NetIO timeout in ms for DAQ traffic. [default: 2]
-w, --netio-watermark=SIZE NetIO watermark in Byte for DAQ traffic. [default: 57344]
--dcs-iface=IFACE Use this network interface for DCS traffic. [calculated: use libfabric on main iface]
--dcs-pages=SIZE DCS Number of NetIO pages. [default: 64]
--dcs-pagesize=SIZE DCS NetIO page size in Byte. [default: 1024]
-s, --dcs-port=PORT Publish DCS data on port PORT. [calculated: 53500 + 10*device + dma]
--dcs-size-limit=LIMIT Truncate DCS messages when size is above LIMIT in bytes [default: 65536]
--dcs-timeout=SIZE DCS NetIO timeout in ms. [default: 1]
--dcs-unbuffered DCS unbuffered mode.
--dcs-watermark=SIZE DCS NetIO watermark in Byte. [default: 972]
-l, --l1id-check=FORMAT Check L1ID sequence. Formats: 1=TTC2H only, 2=LATOME, 3=FMEMU, 4=FELIG, 5=NSWVMM, 6=NSWTP.
Slow for unbuffered DAQ. [default: 0]
-M, --max-chunk-size=LIMIT Maximum chunk size in Bytes for DAQ traffic. Larger chunks are truncated. [calculated from network page size]
-p, --port=PORT Publish DAQ data on port PORT. [calculated: 53100 + 10*device + dma]
-P, --poll-period=us Polling instead of interrupt-driven readout with the given poll period in microseconds [default: 1000]
--threads=THREADS Number of threads per DMA to read DAQ links [default: 1]
--ttc-netio-pages=SIZE TTC Number of NetIO pages. [default: 64]
--ttc-netio-pagesize=SIZE TTC NetIO page size in Byte. [default: 1536]
--ttc-netio-timeout=SIZE TTC NetIO timeout in ms. Not necessary as TTC2H buffers are flushed at end-of-block. [default: 0]
--ttc-netio-watermark=SIZE TTC NetIO watermark in Byte. [default: 1248]
-t, --ttc-port=PORT Publish TTC2H data on port PORT. [calculated: 53300 + 10*device + dma]
)";
}
void ConfigToHost::handle_cmd_line(std::map<std::string, docopt::value> args)
{
Config::handle_cmd_line(args);
if (not args["--dma"].asStringList().empty()){
for(const auto& i : args["--dma"].asStringList()){
resource.dma_ids.push_back(stoi(i));
}
} else {
resource.dma_ids = {0};
}
resource.cmem_buffersize = args["--cmem"].asLong() * 1024*1024;
daq_threads = args["--threads"].asLong();
int base_daq_port = args["--port"] ? args["--port"].asLong() : PORT_TOHOST_OFFSET;
int base_dcs_port = args["--dcs-port"] ? args["--dcs-port"].asLong() : PORT_DCS_OFFSET;
int base_ttc_port = args["--ttc-port"] ? args["--ttc-port"].asLong() : PORT_TTC2HOST_OFFSET;
for(auto dev : resource.device){
for ( auto dmaid : resource.dma_ids){
int unique_id = get_unique_dmaid(dmaid, dev);
network.ports.emplace(unique_id, PORT(base_daq_port, dev, dmaid));
network.dcs_ports.emplace(unique_id, PORT(base_dcs_port, dev, dmaid));
network.ttc_ports.emplace(unique_id, PORT(base_ttc_port, dev, dmaid));
}
}
// derive dcs-ip
if (args["--dcs-iface"]) {
network.dcs_ip = get_value_from_getifaddrs(args["--dcs-iface"].asString(), true);
network.dcs_tcp = true;
} else {
network.dcs_ip = network.ip;
network.dcs_tcp = false;
}
network.daq_unbuffered = args["--daq-unbuffered"].asBool();
network.netio_timeout = args["--netio-timeout"].asLong();
network.netio_watermark = args["--netio-watermark"].asLong();
network.dcs_unbuffered = args["--dcs-unbuffered"].asBool();
network.dcs_netio_pages = args["--dcs-pages"].asLong();
network.dcs_netio_pagesize = args["--dcs-pagesize"].asLong();
network.dcs_netio_timeout = args["--dcs-timeout"].asLong();
network.dcs_netio_watermark = args["--dcs-watermark"].asLong();
network.ttc_netio_pages = args["--ttc-netio-pages"].asLong();
network.ttc_netio_pagesize = args["--ttc-netio-pagesize"].asLong();
network.ttc_netio_timeout = args["--ttc-netio-timeout"].asLong();
network.ttc_netio_watermark = args["--ttc-netio-watermark"].asLong();
poll_time = args["--poll-period"].asLong();
l1id_check = args["--l1id-check"].asLong();
max_dcs_chunk_size = args["--dcs-size-limit"].asLong();
max_daq_chunk_size = args["--max-chunk-size"] ? args["--max-chunk-size"].asLong() : UINT32_MAX;
}