DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
TimingHardwareManagerBase.cpp
Go to the documentation of this file.
1
10
13
15#include "logging/Logging.hpp"
17
20
24
25#include <memory>
26#include <string>
27#include <utility>
28#include <vector>
29
30#define TRACE_NAME "TimingHardwareManagerBase" // NOLINT
31
32namespace dunedaq {
33
34DUNE_DAQ_SERIALIZABLE(timinglibs::timingcmd::TimingHwCmd, "TimingHwCmd");
35DUNE_DAQ_SERIALIZABLE(nlohmann::json, "JSON");
36
37namespace timinglibs {
38
40 : dunedaq::appfwk::DAQModule(name)
41 , m_hw_cmd_connection("timing_cmds")
42 , m_hw_command_receiver(nullptr)
43 , m_gather_interval(1e6)
44 , m_gather_interval_debug(10e6)
45 , m_monitored_device_name_master("")
46 , m_monitored_device_name_endpoint("")
47 , m_monitored_device_name_hsi("")
48 , m_received_hw_commands_counter{ 0 }
49 , m_accepted_hw_commands_counter{ 0 }
50 , m_rejected_hw_commands_counter{ 0 }
51 , m_failed_hw_commands_counter{ 0 }
52 , m_endpoint_scan_threads_clean_up_thread(nullptr)
53{
54 // register_command("start", &TimingHardwareManagerBase::do_start);
55 // register_command("stop", &TimingHardwareManagerBase::do_stop);
56 register_command("scrap", &TimingHardwareManagerBase::do_scrap);
57}
58
59void
60TimingHardwareManagerBase::init(std::shared_ptr<appfwk::ConfigurationManager> mcfg)
61{
62 auto mod_config = mcfg->get_dal<timinglibs::dal::TimingHardwareManagerBase>(get_name());
63 m_params = mod_config->get_configuration();
64
65 // set up queues
66 for (auto con : mod_config->get_inputs())
67 {
68 if (con->get_data_type() == datatype_to_string<timingcmd::TimingHwCmd>()) {
69 m_hw_cmd_connection = con->UID();
70 TLOG() << "m_hw_cmd_connection: " << m_hw_cmd_connection;
71 }
72 }
73
74 try
75 {
77 } catch (const ers::Issue& excpt) {
78 throw InvalidQueueFatalError(ERS_HERE, get_name(), "input", excpt);
79 }
80
81 m_endpoint_scan_threads_clean_up_thread = std::make_unique<dunedaq::utilities::ReusableThread>(0);
82}
83
84void
112
113void
114TimingHardwareManagerBase::do_scrap(const CommandData_t& /*data*/)
115{
116 m_hw_command_receiver->remove_callback();
117
118 auto time_of_scrap = std::chrono::high_resolution_clock::now();
119 while(m_command_threads.size())
120 {
121 auto now = std::chrono::high_resolution_clock::now();
122 auto ms_since_scrap = std::chrono::duration_cast<std::chrono::milliseconds>(now - time_of_scrap);
123 TLOG_DEBUG(0) << "Have been waiting for " << ms_since_scrap.count() << " ms for " << m_command_threads.size() << " command threads to finish...";
124 std::this_thread::sleep_for(std::chrono::microseconds(250000));
125 }
127
129
130 scrap_uhal();
131
132 m_command_threads.clear();
133 m_info_gatherers.clear();
134 m_timing_hw_cmd_map_.clear();
135 m_hw_device_map.clear();
136 m_connection_manager.reset();
137}
138
141{
142
143 if (!device_name.compare("")) {
144 std::stringstream message;
145 message << "UHAL device name is an empty string";
146 throw UHALDeviceNameIssue(ERS_HERE, message.str());
147 }
148
149 if (auto hw_device_entry = m_hw_device_map.find(device_name); hw_device_entry != m_hw_device_map.end()) {
150 return dynamic_cast<const timing::TimingNode*>(&hw_device_entry->second->getNode(""));
151 } else {
152 TLOG_DEBUG(0) << get_name() << ": hw device interface for: " << device_name
153 << " does not exist. I will try to create it.";
154
155 try {
156 std::lock_guard<std::mutex> hw_device_map_guard(m_hw_device_map_mutex);
157 m_hw_device_map.emplace(device_name,
158 std::make_unique<uhal::HwInterface>(m_connection_manager->getDevice(device_name)));
159 } catch (const uhal::exception::ConnectionUIDDoesNotExist& exception) {
160 std::stringstream message;
161 message << "UHAL device name not " << device_name << " in connections file";
162 throw UHALDeviceNameIssue(ERS_HERE, message.str(), exception);
163 }
164
165 TLOG_DEBUG(0) << get_name() << ": hw device interface for: " << device_name << " successfully created.";
166
167 return dynamic_cast<const timing::TimingNode*>(&m_hw_device_map.find(device_name)->second->getNode(""));
168 }
169}
170
171void
173{
174 auto device_name = gatherer.get_device_name();
175
176 while (gatherer.run_gathering()) {
177
178 // collect the data from the hardware
179 try {
181
182 gatherer.collect_info_from_device(*design);
183 } catch (const std::exception& excpt) {
184 ers::warning(FailedToCollectOpMonInfo(ERS_HERE, device_name, excpt));
185 }
186
187 auto prev_gather_time = std::chrono::steady_clock::now();
188 auto next_gather_time = prev_gather_time + std::chrono::microseconds(gatherer.get_gather_interval());
189
190 // check running_flag periodically
191 auto slice_period = std::chrono::microseconds(10000);
192 auto next_slice_gather_time = prev_gather_time + slice_period;
193
194 bool break_flag = false;
195 while (next_gather_time > next_slice_gather_time + slice_period) {
196 if (!gatherer.run_gathering()) {
197 TLOG_DEBUG(0) << "while waiting to gather data, negative run gatherer flag detected.";
198 break_flag = true;
199 break;
200 }
201 std::this_thread::sleep_until(next_slice_gather_time);
202 next_slice_gather_time = next_slice_gather_time + slice_period;
203 }
204 if (break_flag == false) {
205 std::this_thread::sleep_until(next_gather_time);
206 }
207 }
208}
209
210void
211TimingHardwareManagerBase::register_info_gatherer(uint gather_interval, const std::string& device_name, int op_mon_level)
212{
213 std::string gatherer_name = device_name + "_level_" + std::to_string(op_mon_level);
214 if (m_info_gatherers.find(gatherer_name) == m_info_gatherers.end()) {
215 std::unique_ptr<InfoGatherer> gatherer = std::make_unique<InfoGatherer>(
216 std::bind(&TimingHardwareManagerBase::gather_monitor_data, this, std::placeholders::_1),
217 gather_interval,
218 device_name,
219 op_mon_level);
220
221 TLOG_DEBUG(0) << "Registering info gatherer: " << gatherer_name;
222 m_info_gatherers.emplace(std::make_pair(gatherer_name, std::move(gatherer)));
223 } else {
224 TLOG() << "Skipping registration of " << gatherer_name << ". Already exists.";
225 }
226}
227
228void
230{
231 // start all gatherers if no device name is given
232 if (!device_name.compare("")) {
233 TLOG_DEBUG(0) << get_name() << " Starting all info gatherers";
234 for (auto it = m_info_gatherers.begin(); it != m_info_gatherers.end(); ++it)
235 it->second.get()->start_gathering_thread();
236 } else {
237 // find gatherer for suppled device name and start it
238 bool gatherer_found=false;
239 for (auto it = m_info_gatherers.lower_bound(device_name); it != m_info_gatherers.end(); ++it) {
240 TLOG_DEBUG(0) << get_name() << " Starting info gatherer: " << it->first;
241 it->second.get()->start_gathering_thread();
242 gatherer_found=true;
243 }
244 if (!gatherer_found) ers::warning(AttemptedToControlNonExantInfoGatherer(ERS_HERE, "start", device_name));
245 }
246}
247
248void
250{
251 // stop all gatherers if no device name is given
252 if (!device_name.compare("")) {
253 TLOG_DEBUG(0) << get_name() << " Stopping all info gatherers";
254 for (auto it = m_info_gatherers.begin(); it != m_info_gatherers.end(); ++it)
255 it->second.get()->stop_gathering_thread();
256 } else {
257 // find gatherer for suppled device name and stop it
258 bool gatherer_found=false;
259 for (auto it = m_info_gatherers.lower_bound(device_name); it != m_info_gatherers.end(); ++it) {
260 TLOG_DEBUG(0) << get_name() << " Stopping info gatherer: " << it->first;
261 it->second.get()->stop_gathering_thread();
262 gatherer_found=true;
263 }
264 if (!gatherer_found) ers::warning(AttemptedToControlNonExantInfoGatherer(ERS_HERE, "stop", device_name));
265 }
266}
267
268std::vector<std::string>
270{
271 std::vector<std::string> running_gatherers;
272 for (auto it = m_info_gatherers.lower_bound(device_name); it != m_info_gatherers.end(); ++it)
273 {
274 TLOG_DEBUG(0) << get_name() << " Checking run state of info gatherer: " << it->first << ", and the state is " << it->second.get()->run_gathering();
275 if (it->second.get()->run_gathering())
276 {
277 running_gatherers.push_back(it->first);
278 }
279 }
280 return running_gatherers;
281}
282
283// cmd stuff
284
285void
287{
288 std::ostringstream starting_stream;
289 starting_stream << ": Executing process_hardware_command() callback.";
290 TLOG_DEBUG(0) << get_name() << starting_stream.str();
291
293
294 TLOG_DEBUG(0) << get_name() << ": Received hardware command #" << m_received_hw_commands_counter.load()
295 << ", it is of type: " << timing_hw_cmd.id << ", targeting device: " << timing_hw_cmd.device << ", with payload: " << timing_hw_cmd.payload.dump();
296
297 std::string hw_cmd_name = timing_hw_cmd.id;
298 if (auto cmd = m_timing_hw_cmd_map_.find(hw_cmd_name); cmd != m_timing_hw_cmd_map_.end()) {
299
301
302 TLOG_DEBUG(0) << "Found hw cmd: " << hw_cmd_name;
303 try {
304 std::invoke(cmd->second, timing_hw_cmd);
305 } catch (const std::exception& exception) {
306 ers::error(FailedToExecuteHardwareCommand(ERS_HERE, hw_cmd_name, timing_hw_cmd.device, exception));
308 }
309 } else {
310 ers::error(InvalidHardwareCommandID(ERS_HERE, hw_cmd_name));
312 }
313
314 std::ostringstream exiting_stream;
315 exiting_stream << ": Finished executing process_hardware_command() callback. Received " << m_received_hw_commands_counter.load()
316 << " commands";
317 TLOG_DEBUG(0) << get_name() << exiting_stream.str();
318}
319
320// common commands
321void
323{
325 timingcmd::from_json(hw_cmd.payload, cmd_payload);
326
327 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " io reset";
328
329 // io reset disrupts hw mon gathering, so stop if running
330 auto running_hw_gatherers = check_hw_mon_gatherer_is_running(hw_cmd.device);
331 for (auto& gatherer: running_hw_gatherers)
332 {
333 stop_hw_mon_gathering(gatherer);
334 }
335
337
338 if (cmd_payload.soft) {
339 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " soft io reset";
340 design->soft_reset_io();
341 } else if (!cmd_payload.clock_config.empty()) {
342 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device
343 << " io reset, with supplied clk file: " << cmd_payload.clock_config;
344 design->reset_io(cmd_payload.clock_config);
345 }
346 else
347 {
348 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device
349 << " io reset, with supplied clk source: " << cmd_payload.clock_source;
350 design->reset_io(static_cast<timing::ClockSource>(cmd_payload.clock_source));
351 }
352
353 // if hw mon gathering was running previously, start it again
354 for (auto& gatherer: running_hw_gatherers)
355 {
356 start_hw_mon_gathering(gatherer);
357 }
358}
359
360void
362{
363 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " print status";
364
366 TLOG() << std::endl << design->get_status();
367}
368
369// master commands
370void
372{
374 timingcmd::from_json(hw_cmd.payload, cmd_payload);
375
376 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device
377 << " set timestamp, with supplied ts source: " << cmd_payload.timestamp_source;
378
380 design->sync_timestamp(static_cast<timing::TimestampSource>(cmd_payload.timestamp_source));
381}
382
383void
385{
386 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " master_endpoint_scan";
387
388 std::stringstream command_thread_uid;
389 auto t = std::time(nullptr);
390 auto tm = *std::localtime(&t);
391 command_thread_uid << "enpoint_scan_cmd_at_" << std::put_time(&tm, "%d-%m-%Y %H-%M-%S") << "_cmd_num_" << m_accepted_hw_commands_counter.load();
392
393 if (m_command_threads.size() > 5)
394 {
395 ers::warning(TooManyEndpointScanThreadsQueued(ERS_HERE, m_command_threads.size()));
396 }
397 else
398 {
399 TLOG_DEBUG(1) << "Queuing: " << command_thread_uid.str();
400
401 auto thread_key = command_thread_uid.str();
402 std::unique_lock map_lock(m_command_threads_map_mutex);
403
404 m_command_threads.emplace(thread_key, std::make_unique<std::thread>(std::bind(&TimingHardwareManagerBase::perform_endpoint_scan, this, hw_cmd)));
405 }
406}
407
409{
411 timingcmd::from_json(hw_cmd.payload, cmd_payload);
412
413 for (auto& endpoint_location : cmd_payload.endpoints)
414 {
415 auto endpoint_address = endpoint_location.address;
416 auto fanout_slot = endpoint_location.fanout_slot;
417 auto sfp_slot = endpoint_location.sfp_slot;
418
419 std::unique_lock<std::mutex> master_sfp_lock(master_sfp_mutex);
420
421 TLOG_DEBUG(1) << get_name() << ": " << hw_cmd.device << " master_endpoint_scan starting: ept adr: " << endpoint_address << ", ept sfp: " << sfp_slot << ", fanout slot: " << fanout_slot;
422
424 try
425 {
426 //master_design->get_master_node_plain()->switch_endpoint_sfp(endpoint_address, true);
427
428 if (sfp_slot >= 0)
429 {
430 if (fanout_slot >= 0)
431 {
432 // configure fanout/FIB
433 try
434 {
436 }
437 catch(const UHALDeviceClassIssue& e)
438 {
439 ers::error(e);
440 continue;
441 }
442
443 // slot 0 for board without multiple data tx paths, e.g. FMC, TLU
444 if (fanout_slot != 0)
445 {
446 // configure GIB/MIB
447 try
448 {
449 get_timing_device<const timing::MuxDesignInterface*>(hw_cmd.device)->switch_mux(fanout_slot-1);
450 }
451 catch(const UHALDeviceClassIssue& e)
452 {
453 ers::error(e);
454 continue;
455 }
456 }
457 }
458 else
459 {
460 dynamic_cast<const timing::MuxDesignInterface*>(master_design)->switch_mux(sfp_slot);
461 }
462 }
463
464 auto scan_result = master_design->get_master_node_plain()->scan_endpoint(endpoint_address, true);
465 if (scan_result.alive)
466 {
467 auto current_rtt = scan_result.round_trip_time;
468 ers::info(EndpointRTTMeasurement(ERS_HERE,fanout_slot,sfp_slot,endpoint_address,current_rtt));
469 if (m_monitored_endpoints_round_trip_times.count(endpoint_address))
470 {
471 auto previous_rtt = m_monitored_endpoints_round_trip_times[endpoint_address];
472 if (previous_rtt != current_rtt)
473 {
474 //TLOG() << "New round trip time for endpoint " << endpoint_address << " measured. Previous: "
475 // << m_monitored_endpoints_round_trip_times[endpoint_address] << ", current: " << current_rtt;
476 ers::warning(ChangedEndpointRTTMeasurement(ERS_HERE,fanout_slot,sfp_slot,endpoint_address,current_rtt,previous_rtt));
477 }
478 }
479 else
480 {
481 //TLOG() << "First measured round trip time for endpoint " << endpoint_address << " is: " << current_rtt;
482 }
483 m_monitored_endpoints_round_trip_times[endpoint_address]=current_rtt;
484 }
485 else
486 {
487 ers::error(EndpointUnresponsive(ERS_HERE,fanout_slot,sfp_slot,endpoint_address));
488 //TLOG() << endpoint_address << " endpoint was not alive...";
489 }
490 //master_design->get_master_node_plain()->switch_endpoint_sfp(endpoint_address, false);
491 }
492 catch(std::exception& e)
493 {
494 ers::error(EndpointScanFailure(ERS_HERE,e));
495 master_design->get_master_node_plain()->switch_endpoint_sfp(endpoint_address, false);
496 }
497 }
498}
499
501{
502 TLOG_DEBUG(0) << "Entering clean_endpoint_scan_threads()";
503 bool break_flag = false;
504 while (!break_flag)
505 {
506 for (auto& thread : m_command_threads)
507 {
508 if (thread.second->joinable())
509 {
510 std::unique_lock map_lock(m_command_threads_map_mutex);
511 TLOG_DEBUG(2) << thread.first << " thread ready. Cleaning up.";
512 thread.second->join();
513 m_command_threads.erase(thread.first);
514 }
515 }
516
517 auto prev_clean_time = std::chrono::steady_clock::now();
518 auto next_clean_time = prev_clean_time + std::chrono::milliseconds(30);
519
520 // check running_flag periodically
521 auto flag_check_period = std::chrono::milliseconds(1);
522 auto next_flag_check_time = prev_clean_time + flag_check_period;
523
524 while (next_clean_time > next_flag_check_time + flag_check_period) {
526 TLOG_DEBUG(2) << "while waiting to clean up endpoint scan threads, negative run gatherer flag detected.";
527 break_flag = true;
528 break;
529 }
530 std::this_thread::sleep_until(next_flag_check_time);
531 next_flag_check_time = next_flag_check_time + flag_check_period;
532 }
533 if (break_flag == false) {
534 std::this_thread::sleep_until(next_clean_time);
535 }
536 }
537 TLOG_DEBUG(0) << "Exiting clean_endpoint_scan_threads()";
538}
539
540// master commands
541void
543{
544 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " set endpoint delay";
545
547 timingcmd::from_json(hw_cmd.payload, cmd_payload);
548
550 design->apply_endpoint_delay(cmd_payload.address, cmd_payload.coarse_delay, cmd_payload.fine_delay, cmd_payload.phase_delay, cmd_payload.measure_rtt, cmd_payload.control_sfp, cmd_payload.sfp_mux);
551}
552
553void
555{
557 timingcmd::from_json(hw_cmd.payload, cmd_payload);
558
559 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " send fl cmd. Payload: " << hw_cmd.payload.dump()
560 << ", parsed data: " << cmd_payload.fl_cmd_id
561 << ", " << cmd_payload.channel
562 << ", " << cmd_payload.number_of_commands_to_send;
563
565 design->get_master_node_plain()->send_fl_cmd(cmd_payload.fl_cmd_id, cmd_payload.channel, cmd_payload.number_of_commands_to_send);
566}
567
568// endpoint commands
569void
571{
573 timingcmd::from_json(hw_cmd.payload, cmd_payload);
574
575 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " ept enable, adr: " << cmd_payload.address
576 << ", part: " << cmd_payload.partition;
577
579 design->get_endpoint_node_plain(cmd_payload.endpoint_id)->enable(cmd_payload.address, cmd_payload.partition);
580}
581
582void
584{
586 timingcmd::from_json(hw_cmd.payload, cmd_payload);
587
588 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " ept disable";
589
591 design->get_endpoint_node_plain(cmd_payload.endpoint_id)->disable();
592}
593
594void
596{
598 timingcmd::from_json(hw_cmd.payload, cmd_payload);
599
600 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " ept reset, adr: " << cmd_payload.address
601 << ", part: " << cmd_payload.partition;
602
604 design->get_endpoint_node_plain(cmd_payload.endpoint_id)->reset(cmd_payload.address, cmd_payload.partition);
605}
606
607// hsi commands
608void
610{
611 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " hsi reset";
612
614 design->get_hsi_node().reset_hsi();
615}
616
617void
619{
621 timingcmd::from_json(hw_cmd.payload, cmd_payload);
622
623 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " hsi configure";
624
626 design->configure_hsi(
627 cmd_payload.data_source, cmd_payload.rising_edge_mask, cmd_payload.falling_edge_mask, cmd_payload.invert_edge_mask, cmd_payload.random_rate);
628}
629
630void
632{
633 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " hsi start";
634
636 design->get_hsi_node().start_hsi();
637}
638
639void
641{
642 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " hsi stop";
643
645 design->get_hsi_node().stop_hsi();
646}
647
648void
650{
651 TLOG_DEBUG(0) << get_name() << ": " << hw_cmd.device << " hsi print status";
652
654 TLOG() << std::endl << design->get_hsi_node().get_status();
655}
656
657} // namespace timinglibs
658} // namespace dunedaq
#define ERS_HERE
#define DUNE_DAQ_SERIALIZABLE(Type, typestring)
Macro to define a type as serializable, so it can be sent over the network.
static std::shared_ptr< IOManager > get()
Definition IOManager.hpp:40
Base class for timing endpoint design nodes.
Base class for timing nodes.
std::unique_ptr< uhal::ConnectionManager > m_connection_manager
void configure_uhal(const dunedaq::timinglibs::dal::TimingHardwareInterfaceConf *mdal)
const timing::TimingNode * get_timing_device_plain(const std::string &device_name)
void hsi_stop(const timingcmd::TimingHwCmd &hw_cmd)
void io_reset(const timingcmd::TimingHwCmd &hw_cmd)
void print_status(const timingcmd::TimingHwCmd &hw_cmd)
void register_info_gatherer(uint gather_interval, const std::string &device_name, int op_mon_level)
TIMING_DEV get_timing_device(const std::string &device_name)
std::map< std::string, std::unique_ptr< uhal::HwInterface > > m_hw_device_map
virtual void perform_endpoint_scan(const timingcmd::TimingHwCmd &hw_cmd)
void endpoint_reset(const timingcmd::TimingHwCmd &hw_cmd)
void init(std::shared_ptr< appfwk::ConfigurationManager > mcfg) override
void hsi_reset(const timingcmd::TimingHwCmd &hw_cmd)
void set_endpoint_delay(const timingcmd::TimingHwCmd &hw_cmd)
virtual void process_hardware_command(timingcmd::TimingHwCmd &timing_hw_cmd)
std::unique_ptr< dunedaq::utilities::ReusableThread > m_endpoint_scan_threads_clean_up_thread
void hsi_configure(const timingcmd::TimingHwCmd &hw_cmd)
void set_timestamp(const timingcmd::TimingHwCmd &hw_cmd)
virtual void start_hw_mon_gathering(const std::string &device_name="")
virtual void stop_hw_mon_gathering(const std::string &device_name="")
void hsi_print_status(const timingcmd::TimingHwCmd &hw_cmd)
void send_fl_cmd(const timingcmd::TimingHwCmd &hw_cmd)
void hsi_start(const timingcmd::TimingHwCmd &hw_cmd)
std::map< std::string, std::unique_ptr< std::thread > > m_command_threads
std::map< timingcmd::TimingHwCmdId, std::function< void(const timingcmd::TimingHwCmd &)> > m_timing_hw_cmd_map_
void endpoint_enable(const timingcmd::TimingHwCmd &hw_cmd)
TimingHardwareManagerBase(const std::string &name)
TimingHardwareManagerBase Constructor.
void endpoint_disable(const timingcmd::TimingHwCmd &hw_cmd)
const timinglibs::dal::TimingHardwareManagerConf * m_params
virtual std::vector< std::string > check_hw_mon_gatherer_is_running(const std::string &device_name)
void master_endpoint_scan(const timingcmd::TimingHwCmd &hw_cmd)
std::map< std::string, std::unique_ptr< InfoGatherer > > m_info_gatherers
uint32_t get_gather_interval() const
Get "gather_interval" attribute value. Hardware device data gather interval [us].
const std::string & get_monitored_device_name_hsi() const
Get "monitored_device_name_hsi" attribute value. Name of hsi device to be monitored.
const std::string & get_monitored_device_name_endpoint() const
Get "monitored_device_name_endpoint" attribute value. Name of timing endpoint device to be monitored.
uint32_t get_gather_interval_debug() const
Get "gather_interval_debug" attribute value. Hardware device data gather debug interval [us].
const std::string & get_monitored_device_name_master() const
Get "monitored_device_name_master" attribute value. Name of timing master device to be monitored.
const std::vector< const dunedaq::timinglibs::dal::TimingFanoutDevice * > & get_monitored_device_names_fanout() const
Get "monitored_device_names_fanout" relationship value. Timing fanout devices to be monitored.
Base class for any user define issue.
Definition Issue.hpp:69
caught dunedaq::conffwk::Exception exception
static int64_t now()
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:112
#define TLOG(...)
Definition macro.hpp:22
void from_json(const data_t &j, EndpointLocation &obj)
Definition Nljs.hpp:26
The DUNE-DAQ namespace.
void warning(const Issue &issue)
Definition ers.hpp:115
void info(const Issue &issue)
Definition ers.hpp:95
void error(const Issue &issue)
Definition ers.hpp:81