DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
TimingHardwareManagerBase.hpp
Go to the documentation of this file.
1
11
12#ifndef TIMINGLIBS_SRC_TIMINGHARDWAREMANAGER_HPP_
13#define TIMINGLIBS_SRC_TIMINGHARDWAREMANAGER_HPP_
14
15#include "InfoGatherer.hpp"
21
22#include "appfwk/DAQModule.hpp"
23#include "ers/Issue.hpp"
25#include "logging/Logging.hpp"
26
29
33#include "timing/TimingNode.hpp"
35
36#include "uhal/ConnectionManager.hpp"
38
39#include <map>
40#include <memory>
41#include <regex>
42#include <string>
43#include <vector>
44
45namespace dunedaq {
46namespace timinglibs {
47
53 : public dunedaq::appfwk::DAQModule
55{
56public:
61 explicit TimingHardwareManagerBase(const std::string& name);
62
64 delete;
66 delete;
68 delete;
70 delete;
72
73 void init(std::shared_ptr<appfwk::ConfigurationManager> mcfg) override;
74 virtual void conf(const CommandData_t& data);
75
76protected:
77 // Commands
78 // virtual void do_configure(const CommandData_t&);
79 // virtual void do_start(const CommandData_t&);
80 // virtual void do_stop(const CommandData_t&);
81 virtual void do_scrap(const CommandData_t&);
82
83 virtual void process_hardware_command(timingcmd::TimingHwCmd& timing_hw_cmd);
84
85 // Configuration
88 std::shared_ptr<source_t> m_hw_command_receiver;
89
90 // hardware polling intervals [us]
91 // TODO change to duration::milliseconds
94
95 // uhal members
96 std::map<std::string, std::unique_ptr<uhal::HwInterface>> m_hw_device_map;
98
99 // managed timing devices
101 std::map<uint, std::string> m_monitored_device_names_fanout;
104
109
110 // retrieve top level/design object for a timing device
111 template<class TIMING_DEV>
112 TIMING_DEV get_timing_device(const std::string& device_name);
113 const timing::TimingNode* get_timing_device_plain(const std::string& device_name);
114
115 // timing hw cmds stuff
117
118 template<typename Child>
119 void register_timing_hw_command(const std::string& hw_cmd_id, void (Child::*f)(const timingcmd::TimingHwCmd&));
120
121 // timing common commands
122 void io_reset(const timingcmd::TimingHwCmd& hw_cmd);
123 void print_status(const timingcmd::TimingHwCmd& hw_cmd);
124
125 // timing master commands
126 void set_timestamp(const timingcmd::TimingHwCmd& hw_cmd);
127 void set_endpoint_delay(const timingcmd::TimingHwCmd& hw_cmd);
128 void send_fl_cmd(const timingcmd::TimingHwCmd& hw_cmd);
130
131 // timing partition commands
132 virtual void partition_configure(const timingcmd::TimingHwCmd& hw_cmd) = 0;
133
134 // timing endpoint commands
135 void endpoint_enable(const timingcmd::TimingHwCmd& hw_cmd);
136 void endpoint_disable(const timingcmd::TimingHwCmd& hw_cmd);
137 void endpoint_reset(const timingcmd::TimingHwCmd& hw_cmd);
138
139 // hsi
140 void hsi_reset(const timingcmd::TimingHwCmd& hw_cmd);
141 void hsi_configure(const timingcmd::TimingHwCmd& hw_cmd);
142 void hsi_start(const timingcmd::TimingHwCmd& hw_cmd);
143 void hsi_stop(const timingcmd::TimingHwCmd& hw_cmd);
144 void hsi_print_status(const timingcmd::TimingHwCmd& hw_cmd);
145
146 // opmon stuff
147 std::atomic<uint64_t> m_received_hw_commands_counter; // NOLINT(build/unsigned)
148 std::atomic<uint64_t> m_accepted_hw_commands_counter; // NOLINT(build/unsigned)
149 std::atomic<uint64_t> m_rejected_hw_commands_counter; // NOLINT(build/unsigned)
150 std::atomic<uint64_t> m_failed_hw_commands_counter; // NOLINT(build/unsigned)
151
152 // monitoring
153 std::map<std::string, std::unique_ptr<InfoGatherer>> m_info_gatherers;
154
155 void register_info_gatherer(uint gather_interval, const std::string& device_name, int op_mon_level);
156 void gather_monitor_data(InfoGatherer& gatherer);
157
158 virtual void start_hw_mon_gathering(const std::string& device_name = "");
159 virtual void stop_hw_mon_gathering(const std::string& device_name = "");
160 virtual std::vector<std::string> check_hw_mon_gatherer_is_running(const std::string& device_name);
161
163 std::map<std::string, std::unique_ptr<std::thread>> m_command_threads;
165 virtual void perform_endpoint_scan(const timingcmd::TimingHwCmd& hw_cmd);
166 virtual void clean_endpoint_scan_threads();
167 std::unique_ptr<dunedaq::utilities::ReusableThread> m_endpoint_scan_threads_clean_up_thread;
171};
172
173} // namespace timinglibs
174} // namespace dunedaq
175
177
178#endif // TIMINGLIBS_SRC_TIMINGHARDWAREMANAGER_HPP_
179
180// Local Variables:
181// c-basic-offset: 2
182// End:
Base class for timing nodes.
TimingHardwareInterface sets up IPBus UHAL interface.
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)
dunedaq::iomanager::ReceiverConcept< timingcmd::TimingHwCmd > source_t
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)
TimingHardwareManagerBase(const TimingHardwareManagerBase &)=delete
TimingHardwareManagerBase is not copy-constructible.
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)
virtual void partition_configure(const timingcmd::TimingHwCmd &hw_cmd)=0
void set_timestamp(const timingcmd::TimingHwCmd &hw_cmd)
TimingHardwareManagerBase(TimingHardwareManagerBase &&)=delete
TimingHardwareManagerBase is not move-constructible.
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)
TimingHardwareManagerBase & operator=(TimingHardwareManagerBase &&)=delete
TimingHardwareManagerBase is not move-assignable.
std::map< std::string, std::unique_ptr< std::thread > > m_command_threads
void register_timing_hw_command(const std::string &hw_cmd_id, void(Child::*f)(const timingcmd::TimingHwCmd &))
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)
TimingHardwareManagerBase & operator=(const TimingHardwareManagerBase &)=delete
TimingHardwareManagerBase is not copy-assignable.
void master_endpoint_scan(const timingcmd::TimingHwCmd &hw_cmd)
std::map< std::string, std::unique_ptr< InfoGatherer > > m_info_gatherers
void init(unordered_map< std::string, std::string > params)
The DUNE-DAQ namespace.