DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
TimingEndpointControllerBase.cpp
Go to the documentation of this file.
1
9
13
17
20
21#include "appfwk/cmd/Nljs.hpp"
22#include "ers/Issue.hpp"
23#include "logging/Logging.hpp"
24
25#include <chrono>
26#include <cstdlib>
27#include <string>
28#include <thread>
29#include <vector>
30
31namespace dunedaq {
32namespace timinglibs {
33
34TimingEndpointControllerBase::TimingEndpointControllerBase(const std::string& name, uint number_hw_commands)
35 : dunedaq::timinglibs::TimingController(name,
36 number_hw_commands) // 2nd arg: how many hw commands can this module send?
37{
38 // timing endpoint hardware commands
39 register_command("endpoint_enable", &TimingEndpointControllerBase::do_endpoint_enable);
40 register_command("endpoint_disable", &TimingEndpointControllerBase::do_endpoint_disable);
41 register_command("endpoint_reset", &TimingEndpointControllerBase::do_endpoint_reset);
42}
43
44void
46{
47 auto mdal = m_params->cast<dal::TimingEndpointControllerConf>();
48
49 TimingController::do_configure(data); // configure hw command connection
50
51 // endpoint per device in config for now...
52 m_managed_endpoint_id = { mdal->get_endpoint_id() };
53
54 configure_hardware_or_recover_state<TimingEndpointNotReady>(data, "Timing endpoint", m_endpoint_state);
55
56 TLOG() << get_name() << " conf done for endpoint, device: " << m_timing_device;
57}
58
59void
61{
62 do_io_reset(data);
63 std::this_thread::sleep_for(std::chrono::microseconds(7000000));
65}
66
68TimingEndpointControllerBase::construct_endpoint_hw_cmd(const std::string& cmd_id, uint endpoint_id)
69{
72 // where to check endpoint id validity
73 cmd_payload.endpoint_id = endpoint_id;
74 timingcmd::to_json(hw_cmd.payload, cmd_payload);
75
76 hw_cmd.id = cmd_id;
77 hw_cmd.device = m_timing_device;
78 return hw_cmd;
79}
80
81void
83{
84 timingcmd::TimingHwCmd hw_cmd = construct_hw_cmd("endpoint_enable", data);
85
86 // print out some debug info
88 timingcmd::from_json(data, cmd_payload);
89
90 TLOG_DEBUG(0) << "ept enable hw cmd; a: " << cmd_payload.address;
91 send_hw_cmd(std::move(hw_cmd));
92 ++(m_sent_hw_command_counters.at(2).atomic);
93}
94
95void
97{
98 timingcmd::TimingHwCmd hw_cmd = construct_hw_cmd("endpoint_disable", data);
99 send_hw_cmd(std::move(hw_cmd));
100 ++(m_sent_hw_command_counters.at(3).atomic);
101}
102
103void
105{
106 timingcmd::TimingHwCmd hw_cmd = construct_hw_cmd("endpoint_reset", data);
107
108 send_hw_cmd(std::move(hw_cmd));
109 ++(m_sent_hw_command_counters.at(4).atomic);
110}
111
112// void
113// TimingEndpointControllerBase::get_info(opmonlib::InfoCollector& ci, int /*level*/)
114//{
115
116// send counters internal to the module
117// timingendpointcontrollerinfo::Info module_info;
118// module_info.sent_endpoint_io_reset_cmds = m_sent_hw_command_counters.at(0).atomic.load();
119// module_info.sent_endpoint_print_status_cmds = m_sent_hw_command_counters.at(1).atomic.load();
120
121// module_info.sent_endpoint_enable_cmds = m_sent_hw_command_counters.at(2).atomic.load();
122// module_info.sent_endpoint_disable_cmds = m_sent_hw_command_counters.at(3).atomic.load();
123// module_info.sent_endpoint_reset_cmds = m_sent_hw_command_counters.at(4).atomic.load();
124// module_info.sent_endpoint_print_timestamp_cmds = m_sent_hw_command_counters.at(5).atomic.load();
125// ci.add(module_info);
126//}
127
128void
130{
131 ++m_device_infos_received_count;
132
134 from_json(info, device_info);
135
136 auto ept_info = device_info.endpoint_info;
137
138 m_endpoint_state = ept_info.state;
139 bool ready = ept_info.ready;
140
141 TLOG_DEBUG(3) << "state: 0x" << std::hex << m_endpoint_state << ", ready: " << ready << std::dec
142 << ", infos received: " << m_device_infos_received_count;
143
144 if (m_endpoint_state == 0x8 && ready) {
145 if (!m_device_ready) {
146 m_device_ready = true;
147 TLOG_DEBUG(2) << "Timing endpoint became ready";
148 }
149 } else {
150 if (m_device_ready) {
151 m_device_ready = false;
152 TLOG_DEBUG(2) << "Timing endpoint no longer ready";
153 }
154 }
155}
156} // namespace timinglibs
157} // namespace dunedaq
158
159// Local Variables:
160// c-basic-offset: 2
161// End:
virtual void do_endpoint_disable(const CommandData_t &data)
timingcmd::TimingHwCmd construct_endpoint_hw_cmd(const std::string &cmd_id, uint endpoint_id)
TimingEndpointControllerBase(const std::string &name, uint number_hw_commands)
TimingEndpointControllerBase Constructor.
void send_configure_hardware_commands(const CommandData_t &data) override
#define TLOG_DEBUG(lvl,...)
Definition Logging.hpp:116
#define TLOG(...)
Definition macro.hpp:21
void from_json(const data_t &j, EndpointLocation &obj)
Definition Nljs.hpp:28
void to_json(data_t &j, const EndpointLocation &obj)
Definition Nljs.hpp:20
The DUNE-DAQ namespace.
timingendpointinfo::TimingEndpointInfo endpoint_info
Definition Structs.hpp:117