29TimingMasterControllerBase::TimingMasterControllerBase(
const std::string& name)
31 , m_endpoint_scan_period(0)
32 , endpoint_scan_thread(
std::bind(&TimingMasterControllerBase::endpoint_scan, this,
std::placeholders::_1))
34 register_command(
"conf", &TimingMasterControllerBase::do_configure);
35 register_command(
"scrap", &TimingMasterControllerBase::do_scrap);
37 register_command(
"start_scanning_endpoints", &TimingMasterControllerBase::do_start);
38 register_command(
"stop_scanning_endpoints", &TimingMasterControllerBase::do_stop);
41 register_command(
"master_set_timestamp", &TimingMasterControllerBase::do_master_set_timestamp);
42 register_command(
"master_set_endpoint_delay", &TimingMasterControllerBase::do_master_set_endpoint_delay);
43 register_command(
"master_send_fl_command", &TimingMasterControllerBase::do_master_send_fl_command);
44 register_command(
"master_measure_endpoint_rtt", &TimingMasterControllerBase::do_master_measure_endpoint_rtt);
45 register_command(
"master_endpoint_scan", &TimingMasterControllerBase::do_master_endpoint_scan);
49TimingMasterControllerBase::do_configure(
const nlohmann::json& data)
51 auto mdal = m_params->cast<dal::TimingMasterControllerConf>();
53 auto monitored_endpoints = mdal->get_monitored_endpoints();
55 for (
auto endpoint : monitored_endpoints) {
56 timingcmd::EndpointLocation endpoint_location;
57 endpoint_location.address =
endpoint->get_address();
58 endpoint_location.fanout_slot =
endpoint->get_fanout_slot();
59 endpoint_location.sfp_slot =
endpoint->get_sfp_slot();
60 m_monitored_endpoint_locations.push_back(endpoint_location);
63 TimingController::do_configure(data);
65 configure_hardware_or_recover_state<TimingMasterNotReady>(data,
"Timing master");
67 TLOG() << get_name() <<
" conf done on master, device: " << m_timing_device;
69 m_endpoint_scan_period = mdal->get_endpoint_scan_period();
70 if (m_endpoint_scan_period)
72 TLOG() << get_name() <<
" conf: master, will send delays with period [ms] " << m_endpoint_scan_period;
76 TLOG() << get_name() <<
" conf: master, will not send delays";
81TimingMasterControllerBase::do_start(
const nlohmann::json& data)
83 TimingController::do_start(data);
84 if (m_endpoint_scan_period) endpoint_scan_thread.start_working_thread();
85 TLOG() <<
"Endpoint monitoring started";
89TimingMasterControllerBase::do_stop(
const nlohmann::json& )
91 if (endpoint_scan_thread.thread_running()) endpoint_scan_thread.stop_working_thread();
92 TLOG() <<
"Endpoint monitoring stopped";
96TimingMasterControllerBase::send_configure_hardware_commands(
const nlohmann::json& data)
99 do_master_set_timestamp(data);
103TimingMasterControllerBase::do_master_set_timestamp(
const nlohmann::json&)
105 timingcmd::TimingHwCmd hw_cmd =
106 construct_hw_cmd(
"set_timestamp");
108 auto mdal = m_params->cast<dal::TimingMasterControllerConf>();
109 hw_cmd.payload[
"timestamp_source"] = mdal->get_timestamp_source();
111 send_hw_cmd(std::move(hw_cmd));
112 ++(m_sent_hw_command_counters.at(1).atomic);
116TimingMasterControllerBase::do_master_set_endpoint_delay(
const nlohmann::json& data)
118 timingcmd::TimingHwCmd hw_cmd =
119 construct_hw_cmd(
"set_endpoint_delay", data);
123 send_hw_cmd(std::move(hw_cmd));
124 ++(m_sent_hw_command_counters.at(3).atomic);
128TimingMasterControllerBase::do_master_send_fl_command(
const nlohmann::json& data)
130 timingcmd::TimingHwCmd hw_cmd =
131 construct_hw_cmd(
"send_fl_command", data);
135 send_hw_cmd(std::move(hw_cmd));
136 ++(m_sent_hw_command_counters.at(4).atomic);
140TimingMasterControllerBase::do_master_measure_endpoint_rtt(
const nlohmann::json& data)
142 timingcmd::TimingHwCmd hw_cmd =
143 construct_hw_cmd(
"master_measure_endpoint_rtt");
147 send_hw_cmd(std::move(hw_cmd));
148 ++(m_sent_hw_command_counters.at(5).atomic);
152TimingMasterControllerBase::do_master_endpoint_scan(
const nlohmann::json& data)
154 timingcmd::TimingHwCmd hw_cmd =
155 construct_hw_cmd(
"master_endpoint_scan");
159 send_hw_cmd(std::move(hw_cmd));
160 ++(m_sent_hw_command_counters.at(6).atomic);
182TimingMasterControllerBase::endpoint_scan(std::atomic<bool>& running_flag)
185 std::ostringstream starting_stream;
186 starting_stream <<
": Starting endpoint_scan() method.";
187 TLOG_DEBUG(0) << get_name() << starting_stream.str();
189 while (running_flag.load() && m_endpoint_scan_period) {
191 timingcmd::TimingHwCmd hw_cmd =
192 construct_hw_cmd(
"master_endpoint_scan");
194 timingcmd::TimingMasterEndpointScanPayload cmd_payload;
195 cmd_payload.endpoints = m_monitored_endpoint_locations;
200 hw_cmd.payload = cmd_payload;
201 send_hw_cmd(std::move(hw_cmd));
203 ++(m_sent_hw_command_counters.at(3).atomic);
204 if (m_endpoint_scan_period)
206 auto prev_gather_time = std::chrono::steady_clock::now();
207 auto next_gather_time = prev_gather_time + std::chrono::milliseconds(m_endpoint_scan_period);
210 auto slice_period = std::chrono::microseconds(10000);
211 auto next_slice_gather_time = prev_gather_time + slice_period;
213 bool break_flag =
false;
214 while (next_gather_time > next_slice_gather_time + slice_period) {
215 if (!running_flag.load()) {
216 TLOG_DEBUG(0) <<
"while waiting to send delays, negative run gatherer flag detected.";
220 std::this_thread::sleep_until(next_slice_gather_time);
221 next_slice_gather_time = next_slice_gather_time + slice_period;
223 if (break_flag ==
false) {
224 std::this_thread::sleep_until(next_gather_time);
229 TLOG() <<
"m_endpoint_scan_period is 0 and send delays thread is running! breaking loop!";
234 std::ostringstream exiting_stream;
235 exiting_stream <<
": Exiting endpoint_scan() method. Received " << m_sent_hw_command_counters.at(3).atomic.load()
237 TLOG_DEBUG(0) << get_name() << exiting_stream.str();
#define TLOG_DEBUG(lvl,...)
endpoint(obj, id, device)