DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
TimingController.hpp
Go to the documentation of this file.
1
11
12#ifndef TIMINGLIBS_INCLUDE_TIMINGLIBS_TIMINGCONTROLLER_HPP_
13#define TIMINGLIBS_INCLUDE_TIMINGLIBS_TIMINGCONTROLLER_HPP_
14
17
20
21#include "appfwk/DAQModule.hpp"
22#include "ers/Issue.hpp"
24#include "iomanager/Sender.hpp"
25#include "logging/Logging.hpp" // NOTE: if ISSUES ARE DECLARED BEFORE include logging/Logging.hpp, TLOG_DEBUG<<issue wont work.
27
30
31#include <memory>
32#include <string>
33#include <vector>
34
35namespace dunedaq {
37 TimingEndpointNotReady,
38 endpoint << " timing endpoint did not become ready in time. State 0x" << std::hex
39 << state,
40 ((std::string)endpoint)((uint)state)
41)
42namespace timinglibs {
43
44template<typename T>
45struct MobileAtomic
46{
47 std::atomic<T> atomic;
48
49 MobileAtomic()
50 : atomic(T())
51 {
52 }
53
54 explicit MobileAtomic(T const& v)
55 : atomic(v)
56 {
57 }
58 explicit MobileAtomic(std::atomic<T> const& a)
59 : atomic(a.load())
60 {
61 }
62
63 virtual ~MobileAtomic() = default;
64
65 MobileAtomic(MobileAtomic const& other)
66 : atomic(other.atomic.load())
67 {
68 }
69
70 MobileAtomic& operator=(MobileAtomic const& other)
71 {
72 atomic.store(other.atomic.load());
73 return *this;
74 }
75
76 MobileAtomic(MobileAtomic&&) = default;
77 MobileAtomic& operator=(MobileAtomic&&) = default;
78};
79
80typedef MobileAtomic<uint64_t> AtomicUInt64; // NOLINT(build/unsigned)
81
86class TimingController : public dunedaq::appfwk::DAQModule
87{
88public:
93 explicit TimingController(const std::string& name, uint number_hw_commands);
94
95 TimingController(const TimingController&) = delete;
96 TimingController& operator=(const TimingController&) = delete;
97 TimingController(TimingController&&) = delete;
98 TimingController& operator=(TimingController&&) = delete;
99
100 void init(std::shared_ptr<appfwk::ConfigurationManager> mcfg) override;
101
102protected:
103 // DAQModule commands
104 virtual void do_configure(const CommandData_t&);
105 virtual void do_start(const CommandData_t&) {}
106 virtual void do_stop(const CommandData_t&) {}
107 virtual void do_scrap(const CommandData_t&);
108
109 template<class T, class... Vs>
110 void configure_hardware_or_recover_state(const nlohmann::json& data,
111 std::string timing_entity_description,
112 const Vs&... args);
113
114 // Configuration
115 std::string m_hw_command_out_connection;
116 std::chrono::milliseconds m_hw_cmd_out_timeout;
118 std::shared_ptr<sink_t> m_hw_command_sender;
119 std::string m_timing_device;
120 std::string m_timing_session_name;
122 std::shared_ptr<source_t> m_device_info_receiver;
123
124 virtual void send_hw_cmd(timingcmd::TimingHwCmd&& hw_cmd);
125 virtual void send_configure_hardware_commands(const CommandData_t& data) = 0;
126
127 // opmon
128 uint m_number_hw_commands;
129 std::vector<AtomicUInt64> m_sent_hw_command_counters;
130
131 // Interpert device opmon info
132 virtual void process_device_info(nlohmann::json /*message*/) = 0;
133 std::chrono::milliseconds m_device_ready_timeout;
134 std::atomic<bool> m_device_ready;
135 std::atomic<uint> m_device_infos_received_count;
136 std::atomic<bool> m_hardware_state_recovery_enabled;
137
138 // common commands
139 timingcmd::TimingHwCmd construct_hw_cmd(const std::string& cmd_id);
140 timingcmd::TimingHwCmd construct_hw_cmd(const std::string& cmd_id, const nlohmann::json& payload);
141 virtual void do_io_reset(const CommandData_t& data);
142 virtual void do_print_status(const CommandData_t& data);
143 const dal::TimingControllerConf* m_params;
144};
145} // namespace timinglibs
146} // namespace dunedaq
147
149
150#endif // TIMINGLIBS_INCLUDE_TIMINGLIBS_TIMINGCONTROLLER_HPP_
151
152// Local Variables:
153// c-basic-offset: 2
154// End:
void init(unordered_map< std::string, std::string > params)
The DUNE-DAQ namespace.
ERS_DECLARE_ISSUE(cibmodules, CIBCommunicationError, " CIB Hardware Communication Error: "<< descriptor,((std::string) descriptor)) ERS_DECLARE_ISSUE(cibmodules
default char v[0]