35TimingController::TimingController(
const std::string& name, uint number_hw_commands)
37 , m_hw_command_out_connection(
"timing_cmds")
38 , m_hw_cmd_out_timeout(100)
39 , m_hw_command_sender(nullptr)
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)
50 for (
auto it = m_sent_hw_command_counters.begin(); it != m_sent_hw_command_counters.end(); ++it) {
54 register_command(
"io_reset", &TimingController::do_io_reset);
55 register_command(
"print_status", &TimingController::do_print_status);
59TimingController::init(std::shared_ptr<appfwk::ConfigurationManager> mcfg)
61 auto mod_config = mcfg->get_dal<dal::TimingController>(get_name());
62 m_params = mod_config->get_configuration();
66TimingController::do_configure(
const nlohmann::json& )
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();
72 if (m_timing_device.empty())
74 throw UHALDeviceNameIssue(
ERS_HERE,
"Device name should not be empty");
77 if (!m_hw_command_out_connection.empty())
79 if (m_timing_session_name.empty())
81 m_hw_command_sender = iomanager::IOManager::get()->get_sender<timingcmd::TimingHwCmd>(m_hw_command_out_connection);
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} );
89 if (m_timing_session_name.empty())
91 m_device_info_receiver = iomanager::IOManager::get()->get_receiver<nlohmann::json>(m_timing_device+
"_info");
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});
98 m_device_info_receiver->add_callback(std::bind(&TimingController::process_device_info,
this, std::placeholders::_1));
103TimingController::do_scrap(
const nlohmann::json&)
105 if (m_device_info_receiver)
107 m_device_info_receiver->remove_callback();
109 m_device_infos_received_count=0;
110 m_device_ready =
false;
112 for (
auto it = m_sent_hw_command_counters.begin(); it != m_sent_hw_command_counters.end(); ++it)
119TimingController::send_hw_cmd(timingcmd::TimingHwCmd&& hw_cmd)
121 if (!m_hw_command_sender)
123 throw QueueIsNullFatalError(
ERS_HERE, get_name(), m_hw_command_out_connection);
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 <<
"\"";
134 std::chrono::duration_cast<std::chrono::milliseconds>(m_hw_cmd_out_timeout).count()));
138timingcmd::TimingHwCmd
139TimingController::construct_hw_cmd(
const std::string& cmd_id)
141 timingcmd::TimingHwCmd hw_cmd;
143 hw_cmd.device = m_timing_device;
147timingcmd::TimingHwCmd
148TimingController::construct_hw_cmd(
const std::string& cmd_id,
const nlohmann::json& payload)
150 auto hw_cmd = construct_hw_cmd(cmd_id);
156TimingController::do_io_reset(
const nlohmann::json& data)
158 timingcmd::TimingHwCmd hw_cmd =
159 construct_hw_cmd(
"io_reset", data);
161 hw_cmd.payload[
"clock_source"] = m_params->get_clock_source();
162 hw_cmd.payload[
"soft"] = m_params->get_soft();
164 send_hw_cmd(std::move(hw_cmd));
165 ++(m_sent_hw_command_counters.at(0).atomic);
169TimingController::do_print_status(
const nlohmann::json&)
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);
#define DUNE_DAQ_SERIALIZABLE(Type, typestring)
void warning(const Issue &issue)