DUNE-DAQ
DUNE Trigger and Data Acquisition software
Loading...
Searching...
No Matches
IRIGTimestampNode.cpp
Go to the documentation of this file.
1
10
11#include "timing/toolbox.hpp"
12#include "logging/Logging.hpp"
13
14#include <string>
15
16namespace dunedaq {
17namespace timing {
18
19UHAL_REGISTER_DERIVED_NODE(IRIGTimestampNode)
20
21//-----------------------------------------------------------------------------
23 : TimingNode(node)
24{}
25//-----------------------------------------------------------------------------
26
27//-----------------------------------------------------------------------------
29//-----------------------------------------------------------------------------
30
31//-----------------------------------------------------------------------------
32std::string
33IRIGTimestampNode::get_status(bool print_out) const
34{
35 std::stringstream status;
36 status << "Timestamp: 0x" << std::hex << read_timestamp() << std::endl;
37
38 auto ctrl_subnodes = read_sub_nodes(getNode("csr.ctrl"));
39 status << format_reg_table(ctrl_subnodes, "IRIG ts ctrl");
40
41 auto stat_subnodes = read_sub_nodes(getNode("csr.stat"));
42 status << format_reg_table(stat_subnodes, "IRIG ts state");
43
44 auto date_subnodes = read_sub_nodes(getNode("csr.irig_date"));
45 status << format_reg_table(date_subnodes, "IRIG date");
46
47 auto time_subnodes = read_sub_nodes(getNode("csr.irig_time"));
48 status << format_reg_table(time_subnodes, "IRIG time");
49
50 auto sbs_subnodes = read_sub_nodes(getNode("csr.irig_sbs"));
51 status << format_reg_table(sbs_subnodes, "IRIG SBS");
52
53 status << "PPS counter: 0x" << std::hex << read_pps_counter() << std::endl;
54
55 status << "Seconds since epoch: 0x" << std::hex << read_seconds_since_epoch() << std::endl;
56
57 if (print_out)
58 TLOG() << status.str();
59 return status.str();
60}
61//-----------------------------------------------------------------------------
62
63//-----------------------------------------------------------------------------
64uhal::ValVector<uint32_t> // NOLINT(build/unsigned)
66{
67 auto timestamp = getNode("tstamp").readBlock(2);
68 if (dispatch)
69 getClient().dispatch();
70 return timestamp;
71}
72//-----------------------------------------------------------------------------
73
74//-----------------------------------------------------------------------------
75uint64_t // NOLINT(build/unsigned)
80//-----------------------------------------------------------------------------
81
82//-----------------------------------------------------------------------------
83void
84IRIGTimestampNode::set_ts_timebase(TimestampTimebase timebase) const // NOLINT(build/unsigned)
85{
86 getNode("csr.ctrl.ts_timebase").write(timebase);
87 getClient().dispatch();
88}
89//-----------------------------------------------------------------------------
90
91//-----------------------------------------------------------------------------
92void
93IRIGTimestampNode::set_ts_epoch(TimestampEpoch epoch) const // NOLINT(build/unsigned)
94{
95 getNode("csr.ctrl.ts_epoch").write(epoch);
96 getClient().dispatch();
97}
98//-----------------------------------------------------------------------------
99
100//-----------------------------------------------------------------------------
101void
102IRIGTimestampNode::set_ts_epoch_value(uint64_t epoch_to_2000_seconds_tai, uint8_t epoch_to_2000_leap_seconds) const // NOLINT(build/unsigned)
103{
104 uint32_t epoch_l = epoch_to_2000_seconds_tai;
105 uint32_t epoch_h = epoch_to_2000_seconds_tai >> 32;
106 getNode("csr.seconds_from_sw_epoch_l").write(epoch_l);
107 getNode("csr.seconds_from_sw_epoch_h").write(epoch_h);
108 getNode("csr.offsets.leap_seconds_from_sw_epoch").write(epoch_to_2000_leap_seconds);
109 getClient().dispatch();
110}
111//-----------------------------------------------------------------------------
112
113//-----------------------------------------------------------------------------
114uint32_t // NOLINT(build/unsigned)
116{
117 auto counter = getNode("pps_ctr").read();
118 getClient().dispatch();
119 return counter.value();
120}
121//-----------------------------------------------------------------------------
122
123//-----------------------------------------------------------------------------
124uint64_t // NOLINT(build/unsigned)
126{
127 auto seconds_since_epoch = getNode("seconds_since_epoch").readBlock(2);
128 getClient().dispatch();
129 return tstamp2int(seconds_since_epoch);
130}
131//-----------------------------------------------------------------------------
132
133//-----------------------------------------------------------------------------
134void
135IRIGTimestampNode::set_ts_seconds_offset(int8_t seconds_offset) const // NOLINT(build/signed)
136{
137 // cast to uint8_t to avoid erroneous auto conversion
138 getNode("csr.offsets.seconds_offset").write((uint8_t)seconds_offset);
139 getClient().dispatch();
140}
141//-----------------------------------------------------------------------------
142
143//-----------------------------------------------------------------------------
144void
145IRIGTimestampNode::set_ts_ticks_offset(int16_t ticks_offset) const // NOLINT(build/signed)
146{
147 // cast to uint16_t to avoid erroneous auto conversion
148 getNode("csr.offsets.ticks_offset").write((uint16_t)ticks_offset); // NOLINT(build/unsigned)
149 getClient().dispatch();
150}
151//-----------------------------------------------------------------------------
152
153} // namespace timing
154} // namespace dunedaq
Class for timestamp generator node.
std::string get_status(bool print_out=false) const override
Print the status of the timing node.
uint64_t read_timestamp() const
Read the current timestamp words.
void set_ts_ticks_offset(int16_t ticks_offset) const
Set ticks offset.
void set_ts_epoch_value(uint64_t epoch_to_2000_seconds_tai, uint8_t epoch_to_2000_leap_seconds) const
Set custom epoch value.
void set_ts_seconds_offset(int8_t seconds_offset) const
Set seconds offset.
void set_ts_timebase(TimestampTimebase ts_timebase) const
Set custom epoch date.
uint64_t read_seconds_since_epoch() const
Read the current seconds since epoch words.
void set_ts_epoch(TimestampEpoch ts_epoch) const
Set epoch: UNIX/custom.
uhal::ValVector< uint32_t > read_raw_timestamp(bool dispatch=true) const
Read the current timestamp words.
uint32_t read_pps_counter() const
Read the current pps ctr word.
Base class for timing nodes.
std::map< std::string, uhal::ValWord< uint32_t > > read_sub_nodes(const uhal::Node &node, bool dispatch=true) const
Read subnodes.
#define TLOG(...)
Definition macro.hpp:22
std::string format_reg_table(T data, std::string title, std::vector< std::string > headers)
Format reg-value table.
Definition toolbox.hxx:166
uint64_t tstamp2int(uhal::ValVector< uint32_t > raw_timestamp)
Definition toolbox.cpp:175
The DUNE-DAQ namespace.
Definition DataStore.hpp:57