DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
MasterDesign.cpp
Go to the documentation of this file.
2
3#include <sstream>
4#include <string>
5
6namespace dunedaq::timing {
7
8UHAL_REGISTER_DERIVED_NODE(MasterDesign)
9
10//-----------------------------------------------------------------------------
11MasterDesign::MasterDesign(const uhal::Node& node)
12 : TopDesignInterface(node)
14 , TopDesign(node)
15{}
16//-----------------------------------------------------------------------------
17
18//-----------------------------------------------------------------------------
21//-----------------------------------------------------------------------------
22
23//-----------------------------------------------------------------------------
24std::string
25MasterDesign::get_status(bool print_out) const
26{
27 std::stringstream status;
28 status << this->get_io_node_plain()->get_pll_status();
29 status << get_master_node_plain()->get_status();
30
31 if (print_out)
32 TLOG() << status.str();
33 return status.str();
34}
35//-----------------------------------------------------------------------------
36
37//-----------------------------------------------------------------------------
38void
40{
41 // Hard resets
42 TopDesign::configure(clock_source);
43
44 this->sync_timestamp(ts_source); // keep previous behaviour for now, TODO: pass through correct parameter
45}
46//-----------------------------------------------------------------------------
47
48//-----------------------------------------------------------------------------
49uint64_t
54//-----------------------------------------------------------------------------
55
56//-----------------------------------------------------------------------------
57void
62//-----------------------------------------------------------------------------
63
64//-----------------------------------------------------------------------------
65uint32_t
66MasterDesign::measure_endpoint_rtt(uint32_t address, bool control_sfp, int /*sfp_mux*/) const
67{
69}
70//-----------------------------------------------------------------------------
71
72//-----------------------------------------------------------------------------
73void
75 uint32_t coarse_delay,
76 uint32_t fine_delay,
77 uint32_t phase_delay,
78 bool measure_rtt,
79 bool control_sfp,
80 int /*sfp_mux*/) const
81{
82 get_master_node_plain()->apply_endpoint_delay(address, coarse_delay, fine_delay, phase_delay, measure_rtt, control_sfp);
83}
84//-----------------------------------------------------------------------------
85
86//-----------------------------------------------------------------------------
87void
88MasterDesign::enable_periodic_fl_cmd(uint32_t channel, double rate, bool poisson) const // NOLINT(build/unsigned)
89{
90 auto dts_clock_frequency = this->get_io_node_plain()->read_firmware_frequency();
91 get_master_node_plain()->enable_periodic_fl_cmd(channel, rate, poisson, dts_clock_frequency);
92}
93//-----------------------------------------------------------------------------
94
95//-----------------------------------------------------------------------------
96void
97MasterDesign::enable_periodic_fl_cmd(uint32_t command, uint32_t channel, double rate, bool poisson) const // NOLINT(build/unsigned)
98{
99 auto dts_clock_frequency = this->get_io_node_plain()->read_firmware_frequency();
100 get_master_node_plain()->enable_periodic_fl_cmd(command, channel, rate, poisson, dts_clock_frequency);
101}
102//-----------------------------------------------------------------------------
103
104//-----------------------------------------------------------------------------
105uint32_t
106MasterDesign::read_firmware_version() const // NOLINT(build/unsigned)
107{
108 auto firmware_version = this->get_master_node_plain()->getNode("global.version").read();
109 uhal::Node::getClient().dispatch();
110
111 return firmware_version.value();
112}
113//-----------------------------------------------------------------------------
114
115//-----------------------------------------------------------------------------
116void
118{
119 auto firmware_version = read_firmware_version();
120
121 uint32_t major_firmware_version = (firmware_version >> 16) & 0xff;
122 uint32_t minor_firmware_version = (firmware_version >> 8) & 0xff;
123 uint32_t patch_firmware_version = (firmware_version >> 0) & 0xff;
124
125 if (major_firmware_version != get_master_node_plain()->get_required_major_firmware_version())
126 ers::error(IncompatibleMajorMasterFirmwareVersion(ERS_HERE, major_firmware_version, get_master_node_plain()->get_required_major_firmware_version()));
127 if (minor_firmware_version != get_master_node_plain()->get_required_minor_firmware_version())
128 ers::warning(IncompatibleMinorMasterFirmwareVersion(ERS_HERE, minor_firmware_version, get_master_node_plain()->get_required_minor_firmware_version()));
129 if (patch_firmware_version != get_master_node_plain()->get_required_patch_firmware_version())
130 ers::warning(IncompatiblePatchMasterFirmwareVersion(ERS_HERE, patch_firmware_version, get_master_node_plain()->get_required_patch_firmware_version()));
131}
132//-----------------------------------------------------------------------------
133
134//-----------------------------------------------------------------------------
135void
141//-----------------------------------------------------------------------------
142}
#define ERS_HERE
virtual std::string get_pll_status(bool print_out=false) const
Print status of on-board PLL.
Definition IONode.cpp:288
Base class for timing master designs.
Base class for timing master designs.
void get_info(timingfirmwareinfo::TimingDeviceInfo &mon_data) const override
Give info to collector.
std::string get_status(bool print_out=false) const override
Get status string, optionally print.
const MasterNodeInterface * get_master_node_plain() const override
Get master node pointer.
void apply_endpoint_delay(uint32_t address, uint32_t coarse_delay, uint32_t fine_delay, uint32_t phase_delay, bool measure_rtt=false, bool control_sfp=true, int sfp_mux=-1) const override
Apply delay to endpoint.
uint32_t measure_endpoint_rtt(uint32_t address, bool control_sfp=true, int sfp_mux=-1) const override
Measure the endpoint round trip time.
void sync_timestamp(TimestampSource source) const override
Sync timestamp to current machine value.
void validate_firmware_version() const override
Validate master firmware version.
void enable_periodic_fl_cmd(uint32_t channel, double rate, bool poisson=false) const override
Configure fake trigger generator.
uint32_t read_firmware_version() const override
Read master firmware version.
void configure(ClockSource clock_source, TimestampSource ts_source) const override
Prepare the timing master for data taking.
uint64_t read_master_timestamp() const override
Read the current timestamp.
virtual void apply_endpoint_delay(uint32_t address, uint32_t coarse_delay, uint32_t fine_delay, uint32_t phase_delay, bool measure_rtt=false, bool control_sfp=true) const =0
Apply delay to endpoint.
virtual uint32_t measure_endpoint_rtt(uint32_t address, bool control_sfp=true) const =0
Measure the endpoint round trip time.
virtual uint64_t read_timestamp() const =0
Read the current timestamp word.
virtual void sync_timestamp(TimestampSource source) const =0
Set timestamp, enable transmission.
virtual std::string get_status(bool print_out=false) const =0
Get the status string of the timing node. Optionally print it.
Base class for timing top design nodes.
Base class for timing top design nodes with IO class.
Definition TopDesign.hpp:39
void configure(ClockSource clock_source) const override
Prepare the timing device for data taking.
Definition TopDesign.hpp:81
void get_info(timingfirmwareinfo::TimingDeviceInfo &mon_data) const override
Give info to collector.
const IONode * get_io_node_plain() const override
Get io node pointer.
Definition TopDesign.hpp:48
#define TLOG(...)
Definition macro.hpp:22
< Message parameters
void warning(const Issue &issue)
Definition ers.hpp:115
void error(const Issue &issue)
Definition ers.hpp:81