DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
dunedaq::flxlibs::ElinkModel< TargetPayloadType > Class Template Reference

#include <ElinkModel.hpp>

Inheritance diagram for dunedaq::flxlibs::ElinkModel< TargetPayloadType >:
[legend]
Collaboration diagram for dunedaq::flxlibs::ElinkModel< TargetPayloadType >:
[legend]

Public Types

using err_sink_t = iomanager::SenderConcept<felix::packetformat::chunk>
using inherited = ElinkConcept
using data_t = nlohmann::json
using sink_cb_t = std::shared_ptr<std::function<void(TargetPayloadType&&)>>
Public Types inherited from dunedaq::opmonlib::MonitorableObject
using NodePtr = std::weak_ptr<MonitorableObject>
using NewNodePtr = std::shared_ptr<MonitorableObject>
using ElementId = std::string

Public Member Functions

 ElinkModel ()
 ElinkModel Constructor.
 ~ElinkModel ()
std::shared_ptr< err_sink_t > & get_error_sink ()
void init (const size_t block_queue_capacity)
void conf (size_t block_size, bool is_32b_trailers)
void start ()
void stop ()
void set_running (bool should_run)
bool queue_in_block_address (uint64_t block_addr)
void acquire_callback () override
Public Member Functions inherited from dunedaq::flxlibs::ElinkConcept
 ElinkConcept ()
virtual ~ElinkConcept ()
 ElinkConcept (const ElinkConcept &)=delete
 ElinkConcept is not copy-constructible.
ElinkConcept & operator= (const ElinkConcept &)=delete
 ElinkConcept is not copy-assginable.
 ElinkConcept (ElinkConcept &&)=delete
 ElinkConcept is not move-constructible.
ElinkConcept & operator= (ElinkConcept &&)=delete
 ElinkConcept is not move-assignable.
DefaultParserImpl & get_parser ()
void set_sink_config (const appmodel::DataMoveCallbackConf *sink_conf)
void set_ids (int card, int slr, int id, int tag)
Public Member Functions inherited from dunedaq::opmonlib::MonitorableObject
 MonitorableObject (const MonitorableObject &)=delete
MonitorableObject & operator= (const MonitorableObject &)=delete
 MonitorableObject (MonitorableObject &&)=delete
MonitorableObject & operator= (MonitorableObject &&)=delete
virtual ~MonitorableObject ()=default
auto get_opmon_id () const noexcept
auto get_opmon_level () const noexcept

Public Attributes

bool m_callback_is_acquired { false }
sink_cb_t m_sink_callback
Public Attributes inherited from dunedaq::flxlibs::ElinkConcept
const appmodel::DataMoveCallbackConf * m_sink_conf

Protected Member Functions

void generate_opmon_data () override
Protected Member Functions inherited from dunedaq::opmonlib::MonitorableObject
 MonitorableObject ()=default
void register_node (ElementId name, NewNodePtr)
void publish (google::protobuf::Message &&, CustomOrigin &&co={}, OpMonLevel l=to_level(EntryOpMonLevel::kDefault)) const noexcept

Private Types

using UniqueBlockAddrQueue = std::unique_ptr<folly::ProducerConsumerQueue<uint64_t>>

Private Member Functions

void process_elink ()

Private Attributes

std::atomic< bool > m_run_marker
bool m_configured { false }
bool m_sink_is_set { false }
std::shared_ptr< err_sink_t > m_error_sink_queue
UniqueBlockAddrQueue m_block_addr_queue
utilities::ReusableThread m_parser_thread

Static Private Attributes

static const std::string m_parser_thread_name = "elinkp"

Additional Inherited Members

Static Public Member Functions inherited from dunedaq::opmonlib::MonitorableObject
static bool publishable_metric (OpMonLevel entry, OpMonLevel system) noexcept
Protected Attributes inherited from dunedaq::flxlibs::ElinkConcept
DefaultParserImpl m_parser_impl
std::unique_ptr< felix::packetformat::BlockParser< DefaultParserImpl > > m_parser
int m_card_id
int m_logical_unit
int m_link_id
int m_link_tag
std::string m_elink_str
std::string m_elink_source_tid
std::chrono::time_point< std::chrono::high_resolution_clock > m_t0

Detailed Description

template<class TargetPayloadType>
class dunedaq::flxlibs::ElinkModel< TargetPayloadType >

Definition at line 36 of file ElinkModel.hpp.

Member Typedef Documentation

◆ data_t

template<class TargetPayloadType>
using dunedaq::flxlibs::ElinkModel< TargetPayloadType >::data_t = nlohmann::json

Definition at line 41 of file ElinkModel.hpp.

◆ err_sink_t

template<class TargetPayloadType>
using dunedaq::flxlibs::ElinkModel< TargetPayloadType >::err_sink_t = iomanager::SenderConcept<felix::packetformat::chunk>

Definition at line 39 of file ElinkModel.hpp.

◆ inherited

template<class TargetPayloadType>
using dunedaq::flxlibs::ElinkModel< TargetPayloadType >::inherited = ElinkConcept

Definition at line 40 of file ElinkModel.hpp.

◆ sink_cb_t

template<class TargetPayloadType>
using dunedaq::flxlibs::ElinkModel< TargetPayloadType >::sink_cb_t = std::shared_ptr<std::function<void(TargetPayloadType&&)>>

Definition at line 130 of file ElinkModel.hpp.

◆ UniqueBlockAddrQueue

template<class TargetPayloadType>
using dunedaq::flxlibs::ElinkModel< TargetPayloadType >::UniqueBlockAddrQueue = std::unique_ptr<folly::ProducerConsumerQueue<uint64_t>>
private

Definition at line 182 of file ElinkModel.hpp.

Constructor & Destructor Documentation

◆ ElinkModel()

template<class TargetPayloadType>
dunedaq::flxlibs::ElinkModel< TargetPayloadType >::ElinkModel ( )
inline

ElinkModel Constructor.

Parameters
nameInstance name for this ElinkModel instance

Definition at line 47 of file ElinkModel.hpp.

48 : ElinkConcept()
49 , m_run_marker{ false }
51 {
52 }
utilities::ReusableThread m_parser_thread
std::atomic< bool > m_run_marker

◆ ~ElinkModel()

template<class TargetPayloadType>
dunedaq::flxlibs::ElinkModel< TargetPayloadType >::~ElinkModel ( )
inline

Definition at line 53 of file ElinkModel.hpp.

53{}

Member Function Documentation

◆ acquire_callback()

template<class TargetPayloadType>
void dunedaq::flxlibs::ElinkModel< TargetPayloadType >::acquire_callback ( )
inlineoverridevirtual

Implements dunedaq::flxlibs::ElinkConcept.

Definition at line 116 of file ElinkModel.hpp.

117 {
119 TLOG_DEBUG(5) << "SourceModel callback is already acquired!";
120 } else {
121 // Getting DataMoveCBRegistry
125 }
126 }
static std::shared_ptr< DataMoveCallbackRegistry > get()
const appmodel::DataMoveCallbackConf * m_sink_conf

◆ conf()

template<class TargetPayloadType>
void dunedaq::flxlibs::ElinkModel< TargetPayloadType >::conf ( size_t block_size,
bool is_32b_trailers )
inlinevirtual

Implements dunedaq::flxlibs::ElinkConcept.

Definition at line 62 of file ElinkModel.hpp.

63 {
64 if (m_configured) {
65 TLOG_DEBUG(5) << "ElinkModel is already configured!";
66 } else {
68 // if (inconsistency)
69 // ers::fatal(ElinkConfigurationInconsistency(ERS_HERE, m_num_links));
70
71 m_parser->configure(block_size, is_32b_trailers); // unsigned bsize, bool trailer_is_32bit
72 m_configured = true;
73 }
74 }
std::unique_ptr< felix::packetformat::BlockParser< DefaultParserImpl > > m_parser

◆ generate_opmon_data()

template<class TargetPayloadType>
void dunedaq::flxlibs::ElinkModel< TargetPayloadType >::generate_opmon_data ( )
inlineoverrideprotectedvirtual

Hook for customisable pubblication. The function can throw, exception will be caught by the monitoring thread

Reimplemented from dunedaq::opmonlib::MonitorableObject.

Definition at line 134 of file ElinkModel.hpp.

135 {
136
139 auto& stats = m_parser_impl.get_stats();
140
142
143 info.set_num_short_chunks_processed(stats.short_ctr.exchange(0));
144 info.set_num_chunks_processed(stats.chunk_ctr.exchange(0));
145 info.set_num_subchunks_processed(stats.subchunk_ctr.exchange(0));
146 info.set_num_blocks_processed(stats.block_ctr.exchange(0));
147
148 info.set_rate_blocks_processed(info.num_blocks_processed() / seconds / 1000.);
149 info.set_rate_chunks_processed(info.num_chunks_processed() / seconds / 1000.);
150
151 info.set_num_short_chunks_processed_with_error(stats.error_short_ctr.exchange(0));
152 info.set_num_chunks_processed_with_error(stats.error_chunk_ctr.exchange(0));
153 info.set_num_subchunks_processed_with_error(stats.error_subchunk_ctr.exchange(0));
154 info.set_num_blocks_processed_with_error(stats.error_block_ctr.exchange(0));
155 info.set_num_subchunk_crc_errors(stats.subchunk_crc_error_ctr.exchange(0));
156 info.set_num_subchunk_trunc_errors(stats.subchunk_trunc_error_ctr.exchange(0));
157 info.set_num_subchunk_errors(stats.subchunk_error_ctr.exchange(0));
158
159 TLOG_DEBUG(2) << inherited::m_elink_str // Move to TLVL_TAKE_NOTE from readout
160 << " Parser stats ->"
161 << " Blocks: " << info.num_blocks_processed() << " Block rate: " << info.rate_blocks_processed()
162 << " [kHz]"
163 << " Chunks: " << info.num_chunks_processed() << " Chunk rate: " << info.rate_chunks_processed()
164 << " [kHz]"
165 << " Shorts: " << info.num_short_chunks_processed() << " Subchunks:" << info.num_subchunks_processed()
166 << " Error Chunks: " << info.num_chunks_processed_with_error()
167 << " Error Shorts: " << info.num_short_chunks_processed_with_error()
168 << " Error Subchunks: " << info.num_subchunks_processed_with_error()
169 << " Error Block: " << info.num_blocks_processed_with_error();
170
171 m_t0 = now;
172
174 { { "card", std::to_string(m_card_id) },
175 { "logical_unit", std::to_string(m_logical_unit) },
176 { "link", std::to_string(m_link_id) },
177 { "tag", std::to_string(m_link_tag) } });
178 }
std::chrono::time_point< std::chrono::high_resolution_clock > m_t0
void publish(google::protobuf::Message &&, CustomOrigin &&co={}, OpMonLevel l=to_level(EntryOpMonLevel::kDefault)) const noexcept

◆ get_error_sink()

template<class TargetPayloadType>
std::shared_ptr< err_sink_t > & dunedaq::flxlibs::ElinkModel< TargetPayloadType >::get_error_sink ( )
inline

Definition at line 55 of file ElinkModel.hpp.

55{ return m_error_sink_queue; }
std::shared_ptr< err_sink_t > m_error_sink_queue

◆ init()

template<class TargetPayloadType>
void dunedaq::flxlibs::ElinkModel< TargetPayloadType >::init ( const size_t block_queue_capacity)
inlinevirtual

◆ process_elink()

template<class TargetPayloadType>
void dunedaq::flxlibs::ElinkModel< TargetPayloadType >::process_elink ( )
inlineprivate

Definition at line 198 of file ElinkModel.hpp.

199 {
200 while (m_run_marker.load()) {
201 uint64_t block_addr; // NOLINT
202 if (m_block_addr_queue->read(block_addr)) { // read success
203 const auto* block = const_cast<felix::packetformat::block*>(
204 felix::packetformat::block_from_bytes(reinterpret_cast<const char*>(block_addr)) // NOLINT
205 );
206 m_parser->process(block);
207 } else { // couldn't read from queue
209 }
210 }
211 }

◆ queue_in_block_address()

template<class TargetPayloadType>
bool dunedaq::flxlibs::ElinkModel< TargetPayloadType >::queue_in_block_address ( uint64_t block_addr)
inlinevirtual

Implements dunedaq::flxlibs::ElinkConcept.

Definition at line 107 of file ElinkModel.hpp.

108 {
109 if (m_block_addr_queue->write(block_addr)) { // ok write
110 return true;
111 } else { // failed write
112 return false;
113 }
114 }

◆ set_running()

template<class TargetPayloadType>
void dunedaq::flxlibs::ElinkModel< TargetPayloadType >::set_running ( bool should_run)
inline

Definition at line 101 of file ElinkModel.hpp.

102 {
103 bool was_running = m_run_marker.exchange(should_run);
104 TLOG_DEBUG(5) << "Active state was toggled from " << was_running << " to " << should_run;
105 }

◆ start()

template<class TargetPayloadType>
void dunedaq::flxlibs::ElinkModel< TargetPayloadType >::start ( )
inlinevirtual

Implements dunedaq::flxlibs::ElinkConcept.

Definition at line 76 of file ElinkModel.hpp.

77 {
79 if (!m_run_marker.load()) {
80 set_running(true);
82 TLOG() << "Started ElinkModel of link " << inherited::m_link_id << "...";
83 } else {
84 TLOG_DEBUG(5) << "ElinkModel of link " << inherited::m_link_id << " is already running!";
85 }
86 }
void set_running(bool should_run)

◆ stop()

template<class TargetPayloadType>
void dunedaq::flxlibs::ElinkModel< TargetPayloadType >::stop ( )
inlinevirtual

Implements dunedaq::flxlibs::ElinkConcept.

Definition at line 88 of file ElinkModel.hpp.

89 {
90 if (m_run_marker.load()) {
91 set_running(false);
92 while (!m_parser_thread.get_readiness()) {
94 }
95 TLOG_DEBUG(5) << "Stopped ElinkModel of link " << m_link_id << "!";
96 } else {
97 TLOG_DEBUG(5) << "ElinkModel of link " << m_link_id << " is already stopped!";
98 }
99 }

Member Data Documentation

◆ m_block_addr_queue

template<class TargetPayloadType>
UniqueBlockAddrQueue dunedaq::flxlibs::ElinkModel< TargetPayloadType >::m_block_addr_queue
private

Definition at line 193 of file ElinkModel.hpp.

◆ m_callback_is_acquired

template<class TargetPayloadType>
bool dunedaq::flxlibs::ElinkModel< TargetPayloadType >::m_callback_is_acquired { false }

Definition at line 129 of file ElinkModel.hpp.

◆ m_configured

template<class TargetPayloadType>
bool dunedaq::flxlibs::ElinkModel< TargetPayloadType >::m_configured { false }
private

Definition at line 186 of file ElinkModel.hpp.

◆ m_error_sink_queue

template<class TargetPayloadType>
std::shared_ptr<err_sink_t> dunedaq::flxlibs::ElinkModel< TargetPayloadType >::m_error_sink_queue
private

Definition at line 190 of file ElinkModel.hpp.

◆ m_parser_thread

template<class TargetPayloadType>
utilities::ReusableThread dunedaq::flxlibs::ElinkModel< TargetPayloadType >::m_parser_thread
private

Definition at line 197 of file ElinkModel.hpp.

◆ m_parser_thread_name

template<class TargetPayloadType>
const std::string dunedaq::flxlibs::ElinkModel< TargetPayloadType >::m_parser_thread_name = "elinkp"
inlinestaticprivate

Definition at line 196 of file ElinkModel.hpp.

◆ m_run_marker

template<class TargetPayloadType>
std::atomic<bool> dunedaq::flxlibs::ElinkModel< TargetPayloadType >::m_run_marker
private

Definition at line 185 of file ElinkModel.hpp.

◆ m_sink_callback

template<class TargetPayloadType>
sink_cb_t dunedaq::flxlibs::ElinkModel< TargetPayloadType >::m_sink_callback

Definition at line 131 of file ElinkModel.hpp.

◆ m_sink_is_set

template<class TargetPayloadType>
bool dunedaq::flxlibs::ElinkModel< TargetPayloadType >::m_sink_is_set { false }
private

Definition at line 189 of file ElinkModel.hpp.


The documentation for this class was generated from the following file: