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 sink_t = iomanager::SenderConcept<TargetPayloadType>
 
using err_sink_t = iomanager::SenderConcept<felix::packetformat::chunk>
 
using inherited = ElinkConcept
 
using data_t = nlohmann::json
 
- 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 ()
 
void set_sink (const std::string &sink_name) override
 
std::shared_ptr< sink_t > & get_sink ()
 
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)
 
- Public Member Functions inherited from dunedaq::flxlibs::ElinkConcept
 ElinkConcept ()
 
virtual ~ElinkConcept ()
 
 ElinkConcept (const ElinkConcept &)=delete
 ElinkConcept is not copy-constructible.
 
ElinkConceptoperator= (const ElinkConcept &)=delete
 ElinkConcept is not copy-assginable.
 
 ElinkConcept (ElinkConcept &&)=delete
 ElinkConcept is not move-constructible.
 
ElinkConceptoperator= (ElinkConcept &&)=delete
 ElinkConcept is not move-assignable.
 
DefaultParserImplget_parser ()
 
void set_ids (int card, int slr, int id, int tag)
 
- Public Member Functions inherited from dunedaq::opmonlib::MonitorableObject
 MonitorableObject (const MonitorableObject &)=delete
 
MonitorableObjectoperator= (const MonitorableObject &)=delete
 
 MonitorableObject (MonitorableObject &&)=delete
 
MonitorableObjectoperator= (MonitorableObject &&)=delete
 
virtual ~MonitorableObject ()=default
 
auto get_opmon_id () const noexcept
 
auto get_opmon_level () const noexcept
 

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< sink_tm_sink_queue
 
std::shared_ptr< err_sink_tm_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 34 of file ElinkModel.hpp.

Member Typedef Documentation

◆ data_t

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

Definition at line 40 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 38 of file ElinkModel.hpp.

◆ inherited

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

Definition at line 39 of file ElinkModel.hpp.

◆ sink_t

template<class TargetPayloadType >
using dunedaq::flxlibs::ElinkModel< TargetPayloadType >::sink_t = iomanager::SenderConcept<TargetPayloadType>

Definition at line 37 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 177 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 46 of file ElinkModel.hpp.

47 : ElinkConcept()
48 , m_run_marker{ false }
50 {}
utilities::ReusableThread m_parser_thread
std::atomic< bool > m_run_marker

◆ ~ElinkModel()

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

Definition at line 51 of file ElinkModel.hpp.

51{}

Member Function Documentation

◆ 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 72 of file ElinkModel.hpp.

73 {
74 if (m_configured) {
75 TLOG_DEBUG(5) << "ElinkModel is already configured!";
76 } else {
78 // if (inconsistency)
79 // ers::fatal(ElinkConfigurationInconsistency(ERS_HERE, m_num_links));
80
81 m_parser->configure(block_size, is_32b_trailers); // unsigned bsize, bool trailer_is_32bit
82 m_configured = true;
83 }
84 }
std::unique_ptr< felix::packetformat::BlockParser< DefaultParserImpl > > m_parser
void set_name(const std::string &name, int tid)
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:112

◆ 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 128 of file ElinkModel.hpp.

128 {
129
130 opmon::CardReaderInfo info;
131 auto now = std::chrono::high_resolution_clock::now();
132 auto& stats = m_parser_impl.get_stats();
133
134 double seconds = std::chrono::duration_cast<std::chrono::microseconds>(now - m_t0).count() / 1000000.;
135
136 info.set_num_short_chunks_processed( stats.short_ctr.exchange(0) );
137 info.set_num_chunks_processed( stats.chunk_ctr.exchange(0) );
138 info.set_num_subchunks_processed(stats.subchunk_ctr.exchange(0));
139 info.set_num_blocks_processed(stats.block_ctr.exchange(0));
140
141 info.set_rate_blocks_processed(info.num_blocks_processed() / seconds / 1000. );
142 info.set_rate_chunks_processed(info.num_chunks_processed() / seconds / 1000. );
143
144 info.set_num_short_chunks_processed_with_error(stats.error_short_ctr.exchange(0));
145 info.set_num_chunks_processed_with_error(stats.error_chunk_ctr.exchange(0));
146 info.set_num_subchunks_processed_with_error(stats.error_subchunk_ctr.exchange(0));
147 info.set_num_blocks_processed_with_error(stats.error_block_ctr.exchange(0));
148 info.set_num_subchunk_crc_errors(stats.subchunk_crc_error_ctr.exchange(0));
149 info.set_num_subchunk_trunc_errors(stats.subchunk_trunc_error_ctr.exchange(0));
150 info.set_num_subchunk_errors(stats.subchunk_error_ctr.exchange(0));
151
152
153 TLOG_DEBUG(2) << inherited::m_elink_str // Move to TLVL_TAKE_NOTE from readout
154 << " Parser stats ->"
155 << " Blocks: " << info.num_blocks_processed() << " Block rate: " << info.rate_blocks_processed()
156 << " [kHz]"
157 << " Chunks: " << info.num_chunks_processed() << " Chunk rate: " << info.rate_chunks_processed()
158 << " [kHz]"
159 << " Shorts: " << info.num_short_chunks_processed() << " Subchunks:" << info.num_subchunks_processed()
160 << " Error Chunks: " << info.num_chunks_processed_with_error()
161 << " Error Shorts: " << info.num_short_chunks_processed_with_error()
162 << " Error Subchunks: " << info.num_subchunks_processed_with_error()
163 << " Error Block: " << info.num_blocks_processed_with_error();
164
165 m_t0 = now;
166
167 publish( std::move(info),
168 { { "card", std::to_string(m_card_id) },
169 { "logical_unit", std::to_string(m_logical_unit) },
170 { "link", std::to_string(m_link_id) },
171 { "tag", std::to_string(m_link_tag) } } );
172
173 }
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
static int64_t now()

◆ get_error_sink()

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

Definition at line 65 of file ElinkModel.hpp.

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

◆ get_sink()

template<class TargetPayloadType >
std::shared_ptr< sink_t > & dunedaq::flxlibs::ElinkModel< TargetPayloadType >::get_sink ( )
inline

Definition at line 63 of file ElinkModel.hpp.

63{ return m_sink_queue; }
std::shared_ptr< sink_t > m_sink_queue

◆ init()

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

Implements dunedaq::flxlibs::ElinkConcept.

Definition at line 67 of file ElinkModel.hpp.

68 {
69 m_block_addr_queue = std::make_unique<folly::ProducerConsumerQueue<uint64_t>>(block_queue_capacity); // NOLINT
70 }
UniqueBlockAddrQueue m_block_addr_queue

◆ process_elink()

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

Definition at line 194 of file ElinkModel.hpp.

195 {
196 while (m_run_marker.load()) {
197 uint64_t block_addr; // NOLINT
198 if (m_block_addr_queue->read(block_addr)) { // read success
199 const auto* block = const_cast<felix::packetformat::block*>(
200 felix::packetformat::block_from_bytes(reinterpret_cast<const char*>(block_addr)) // NOLINT
201 );
202 m_parser->process(block);
203 } else { // couldn't read from queue
204 std::this_thread::sleep_for(std::chrono::milliseconds(10));
205 }
206 }
207 }

◆ 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 117 of file ElinkModel.hpp.

118 {
119 if (m_block_addr_queue->write(block_addr)) { // ok write
120 return true;
121 } else { // failed write
122 return false;
123 }
124 }

◆ set_running()

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

Definition at line 111 of file ElinkModel.hpp.

112 {
113 bool was_running = m_run_marker.exchange(should_run);
114 TLOG_DEBUG(5) << "Active state was toggled from " << was_running << " to " << should_run;
115 }

◆ set_sink()

template<class TargetPayloadType >
void dunedaq::flxlibs::ElinkModel< TargetPayloadType >::set_sink ( const std::string & sink_name)
inlineoverridevirtual

Implements dunedaq::flxlibs::ElinkConcept.

Definition at line 53 of file ElinkModel.hpp.

54 {
55 if (m_sink_is_set) {
56 TLOG_DEBUG(5) << "ElinkModel sink is already set in initialized!";
57 } else {
59 m_sink_is_set = true;
60 }
61 }
static std::shared_ptr< iomanager::SenderConcept< Datatype > > get_iom_sender(iomanager::ConnectionId const &id)

◆ start()

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

Implements dunedaq::flxlibs::ElinkConcept.

Definition at line 86 of file ElinkModel.hpp.

87 {
88 m_t0 = std::chrono::high_resolution_clock::now();
89 if (!m_run_marker.load()) {
90 set_running(true);
92 TLOG() << "Started ElinkModel of link " << inherited::m_link_id << "...";
93 } else {
94 TLOG_DEBUG(5) << "ElinkModel of link " << inherited::m_link_id << " is already running!";
95 }
96 }
void set_running(bool should_run)
bool set_work(Function &&f, Args &&... args)
#define TLOG(...)
Definition macro.hpp:22

◆ stop()

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

Implements dunedaq::flxlibs::ElinkConcept.

Definition at line 98 of file ElinkModel.hpp.

99 {
100 if (m_run_marker.load()) {
101 set_running(false);
102 while (!m_parser_thread.get_readiness()) {
103 std::this_thread::sleep_for(std::chrono::milliseconds(10));
104 }
105 TLOG_DEBUG(5) << "Stopped ElinkModel of link " << m_link_id << "!";
106 } else {
107 TLOG_DEBUG(5) << "ElinkModel of link " << m_link_id << " is already stopped!";
108 }
109 }

Member Data Documentation

◆ m_block_addr_queue

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

Definition at line 189 of file ElinkModel.hpp.

◆ m_configured

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

Definition at line 181 of file ElinkModel.hpp.

181{ false };

◆ 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 186 of file ElinkModel.hpp.

◆ m_parser_thread

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

Definition at line 193 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 192 of file ElinkModel.hpp.

◆ m_run_marker

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

Definition at line 180 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 184 of file ElinkModel.hpp.

184{ false };

◆ m_sink_queue

template<class TargetPayloadType >
std::shared_ptr<sink_t> dunedaq::flxlibs::ElinkModel< TargetPayloadType >::m_sink_queue
private

Definition at line 185 of file ElinkModel.hpp.


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