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 CommandData_t& )
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()) {
73 throw UHALDeviceNameIssue(
ERS_HERE,
"Device name should not be empty");
76 if (!m_hw_command_out_connection.empty()) {
77 if (m_timing_session_name.empty()) {
79 iomanager::IOManager::get()->get_sender<timingcmd::TimingHwCmd>(m_hw_command_out_connection);
81 m_hw_command_sender = iomanager::IOManager::get()->get_sender<timingcmd::TimingHwCmd>(iomanager::ConnectionId{
82 m_hw_command_out_connection, datatype_to_string<timingcmd::TimingHwCmd>(), m_timing_session_name });
85 if (m_timing_session_name.empty()) {
86 m_device_info_receiver = iomanager::IOManager::get()->get_receiver<nlohmann::json>(m_timing_device +
"_info");
88 m_device_info_receiver = iomanager::IOManager::get()->get_receiver<nlohmann::json>(iomanager::ConnectionId{
89 m_timing_device +
"_info", datatype_to_string<nlohmann::json>(), m_timing_session_name });
91 m_device_info_receiver->add_callback(
92 std::bind(&TimingController::process_device_info,
this, std::placeholders::_1));
97TimingController::do_scrap(
const CommandData_t&)
99 if (m_device_info_receiver) {
100 m_device_info_receiver->remove_callback();
102 m_device_infos_received_count = 0;
103 m_device_ready =
false;
105 for (
auto it = m_sent_hw_command_counters.begin(); it != m_sent_hw_command_counters.end(); ++it) {
111TimingController::send_hw_cmd(timingcmd::TimingHwCmd&& hw_cmd)
113 if (!m_hw_command_sender) {
114 throw QueueIsNullFatalError(
ERS_HERE, get_name(), m_hw_command_out_connection);
117 m_hw_command_sender->send(std::move(hw_cmd), m_hw_cmd_out_timeout);
118 }
catch (
const dunedaq::iomanager::TimeoutExpired& excpt) {
119 std::ostringstream oss_warn;
120 oss_warn <<
"push to output queue \"" << m_hw_command_out_connection <<
"\"";
125 std::chrono::duration_cast<std::chrono::milliseconds>(m_hw_cmd_out_timeout).count()));
129timingcmd::TimingHwCmd
130TimingController::construct_hw_cmd(
const std::string& cmd_id)
132 timingcmd::TimingHwCmd hw_cmd;
134 hw_cmd.device = m_timing_device;
138timingcmd::TimingHwCmd
139TimingController::construct_hw_cmd(
const std::string& cmd_id,
const nlohmann::json& payload)
141 auto hw_cmd = construct_hw_cmd(cmd_id);
147TimingController::do_io_reset(
const CommandData_t& data)
149 timingcmd::TimingHwCmd hw_cmd = construct_hw_cmd(
"io_reset", data);
151 hw_cmd.payload[
"clock_source"] = m_params->get_clock_source();
152 hw_cmd.payload[
"soft"] = m_params->get_soft();
154 send_hw_cmd(std::move(hw_cmd));
155 ++(m_sent_hw_command_counters.at(0).atomic);
159TimingController::do_print_status(
const CommandData_t&)
161 timingcmd::TimingHwCmd hw_cmd = construct_hw_cmd(
"print_status");
162 send_hw_cmd(std::move(hw_cmd));
163 ++(m_sent_hw_command_counters.at(1).atomic);
DUNE_DAQ_SERIALIZABLE(dfmessages::DataRequest, "DataRequest")
void warning(const Issue &issue)