DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
TimingController.cpp
Go to the documentation of this file.
1
15
16#include "appfwk/cmd/Nljs.hpp"
17#include "ers/Issue.hpp"
19#include "logging/Logging.hpp"
21
22#include <chrono>
23#include <cstdlib>
24#include <string>
25#include <thread>
26#include <vector>
27
28namespace dunedaq {
29
31DUNE_DAQ_SERIALIZABLE(nlohmann::json, "JSON");
32
33namespace timinglibs {
34
35TimingController::TimingController(const std::string& name, uint number_hw_commands)
36 : dunedaq::appfwk::DAQModule(name)
37 , m_hw_command_out_connection("timing_cmds")
38 , m_hw_cmd_out_timeout(100)
39 , m_hw_command_sender(nullptr)
40 , m_timing_device("")
41 , m_timing_session_name("")
42 , m_device_info_receiver(nullptr)
43 , m_number_hw_commands(number_hw_commands)
44 , m_sent_hw_command_counters(m_number_hw_commands)
45 , m_device_ready_timeout(10000)
46 , m_device_ready(false)
47 , m_device_infos_received_count(0)
48 , m_hardware_state_recovery_enabled(false)
49{
50 for (auto it = m_sent_hw_command_counters.begin(); it != m_sent_hw_command_counters.end(); ++it) {
51 it->atomic.store(0);
52 }
53
54 register_command("io_reset", &TimingController::do_io_reset);
55 register_command("print_status", &TimingController::do_print_status);
56}
57
58void
59TimingController::init(std::shared_ptr<appfwk::ConfigurationManager> mcfg)
60{
61 auto mod_config = mcfg->get_dal<dal::TimingController>(get_name());
62 m_params = mod_config->get_configuration();
63}
64
65void
66TimingController::do_configure(const nlohmann::json& /*data*/)
67{
68 m_timing_device = m_params->get_device();
69 m_hardware_state_recovery_enabled = m_params->get_hardware_state_recovery_enabled();
70 m_timing_session_name = m_params->get_timing_session_name();
71
72 if (m_timing_device.empty())
73 {
74 throw UHALDeviceNameIssue(ERS_HERE, "Device name should not be empty");
75 }
76
77 if (!m_hw_command_out_connection.empty())
78 {
79 if (m_timing_session_name.empty())
80 {
81 m_hw_command_sender = iomanager::IOManager::get()->get_sender<timingcmd::TimingHwCmd>(m_hw_command_out_connection);
82 }
83 else
84 {
85 m_hw_command_sender = iomanager::IOManager::get()->get_sender<timingcmd::TimingHwCmd>(
86 iomanager::ConnectionId{m_hw_command_out_connection, datatype_to_string<timingcmd::TimingHwCmd>(), m_timing_session_name} );
87 }
88
89 if (m_timing_session_name.empty())
90 {
91 m_device_info_receiver = iomanager::IOManager::get()->get_receiver<nlohmann::json>(m_timing_device+"_info");
92 }
93 else
94 {
95 m_device_info_receiver = iomanager::IOManager::get()->get_receiver<nlohmann::json>(
96 iomanager::ConnectionId{m_timing_device+"_info", datatype_to_string<nlohmann::json>(), m_timing_session_name});
97 }
98 m_device_info_receiver->add_callback(std::bind(&TimingController::process_device_info, this, std::placeholders::_1));
99 }
100}
101
102void
103TimingController::do_scrap(const nlohmann::json&)
104{
105 if (m_device_info_receiver)
106 {
107 m_device_info_receiver->remove_callback();
108 }
109 m_device_infos_received_count=0;
110 m_device_ready = false;
111
112 for (auto it = m_sent_hw_command_counters.begin(); it != m_sent_hw_command_counters.end(); ++it)
113 {
114 it->atomic.store(0);
115 }
116}
117
118void
119TimingController::send_hw_cmd(timingcmd::TimingHwCmd&& hw_cmd)
120{
121 if (!m_hw_command_sender)
122 {
123 throw QueueIsNullFatalError(ERS_HERE, get_name(), m_hw_command_out_connection);
124 }
125 try {
126 m_hw_command_sender->send(std::move(hw_cmd), m_hw_cmd_out_timeout);
127 } catch (const dunedaq::iomanager::TimeoutExpired& excpt) {
128 std::ostringstream oss_warn;
129 oss_warn << "push to output queue \"" << m_hw_command_out_connection << "\"";
130 ers::warning(dunedaq::iomanager::TimeoutExpired(
131 ERS_HERE,
132 get_name(),
133 oss_warn.str(),
134 std::chrono::duration_cast<std::chrono::milliseconds>(m_hw_cmd_out_timeout).count()));
135 }
136}
137
138timingcmd::TimingHwCmd
139TimingController::construct_hw_cmd( const std::string& cmd_id)
140{
141 timingcmd::TimingHwCmd hw_cmd;
142 hw_cmd.id = cmd_id;
143 hw_cmd.device = m_timing_device;
144 return hw_cmd;
145}
146
147timingcmd::TimingHwCmd
148TimingController::construct_hw_cmd( const std::string& cmd_id, const nlohmann::json& payload)
149{
150 auto hw_cmd = construct_hw_cmd(cmd_id);
151 hw_cmd.payload = payload;
152 return hw_cmd;
153}
154
155void
156TimingController::do_io_reset(const nlohmann::json& data)
157{
158 timingcmd::TimingHwCmd hw_cmd =
159 construct_hw_cmd( "io_reset", data);
160
161 hw_cmd.payload["clock_source"] = m_params->get_clock_source();
162 hw_cmd.payload["soft"] = m_params->get_soft();
163
164 send_hw_cmd(std::move(hw_cmd));
165 ++(m_sent_hw_command_counters.at(0).atomic);
166}
167
168void
169TimingController::do_print_status(const nlohmann::json&)
170{
171 timingcmd::TimingHwCmd hw_cmd =
172 construct_hw_cmd( "print_status");
173 send_hw_cmd(std::move(hw_cmd));
174 ++(m_sent_hw_command_counters.at(1).atomic);
175}
176
177} // namespace timinglibs
178} // namespace dunedaq
179
180// Local Variables:
181// c-basic-offset: 2
182// End:
#define ERS_HERE
#define DUNE_DAQ_SERIALIZABLE(Type, typestring)
Including Qt Headers.
void warning(const Issue &issue)
Definition ers.hpp:115