Line data Source code
1 : #include "timing/KerberosDesign.hpp"
2 :
3 : #include <sstream>
4 : #include <string>
5 :
6 : namespace dunedaq::timing {
7 :
8 0 : UHAL_REGISTER_DERIVED_NODE(KerberosDesign)
9 :
10 : //-----------------------------------------------------------------------------
11 0 : KerberosDesign::KerberosDesign(const uhal::Node& node)
12 : : TopDesignInterface(node)
13 : , MasterDesignInterface(node)
14 : , MuxDesignInterface(node)
15 : , MasterDesign(node)
16 : , EndpointDesignInterface(node)
17 : , CDRMuxDesignInterface(node)
18 0 : , TimingSourceMuxDesignInterface(node)
19 0 : {}
20 : //-----------------------------------------------------------------------------
21 :
22 : //-----------------------------------------------------------------------------
23 0 : KerberosDesign::~KerberosDesign()
24 0 : {}
25 : //-----------------------------------------------------------------------------
26 :
27 : //-----------------------------------------------------------------------------
28 : std::string
29 0 : KerberosDesign::get_status(bool print_out) const
30 : {
31 0 : std::stringstream status;
32 0 : status << get_io_node_plain()->get_pll_status();
33 0 : status << MasterDesign::get_master_node_plain()->get_status();
34 : // TODO fanout specific status
35 0 : if (print_out)
36 0 : TLOG() << status.str();
37 0 : return status.str();
38 0 : }
39 : //-----------------------------------------------------------------------------
40 :
41 : //-----------------------------------------------------------------------------
42 : void
43 0 : KerberosDesign::configure(ClockSource clock_source, TimestampSource ts_source) const
44 : {
45 0 : if (clock_source == kFreeRun)
46 : {
47 0 : TopDesign::configure(clock_source); // kerberos normally takes clock from upstream SFP
48 0 : this->sync_timestamp(ts_source);
49 : }
50 : else
51 : {
52 0 : switch_timing_source(clock_source);
53 :
54 0 : for (uint i=0; i < get_number_of_endpoint_nodes(); ++i)
55 : {
56 0 : try
57 : {
58 0 : get_endpoint_node_plain(i)->reset(0x10+i);
59 0 : std::this_thread::sleep_for(std::chrono::milliseconds(1500));
60 0 : get_endpoint_node_plain(i)->get_status(true);
61 :
62 0 : if (!get_endpoint_node_plain(i)->endpoint_ready())
63 : {
64 0 : if (i==clock_source)
65 : {
66 0 : ers::error(EndpointNotReady(ERS_HERE, "MIB endpoint "+std::to_string(i)+" not ready!", get_endpoint_node_plain(i)->read_endpoint_state()));
67 : }
68 : else
69 : {
70 0 : ers::warning(EndpointNotReady(ERS_HERE, "MIB endpoint "+std::to_string(i)+" not ready!", get_endpoint_node_plain(i)->read_endpoint_state()));
71 : }
72 : }
73 : }
74 0 : catch (const std::exception& e)
75 : {
76 0 : if (i==clock_source)
77 : {
78 0 : ers::error(EndpointNotReady(ERS_HERE, "MIB endpoint "+std::to_string(i)+" has no clock!", get_endpoint_node_plain(i)->read_endpoint_state(),e));
79 : }
80 : else
81 : {
82 0 : ers::warning(EndpointNotReady(ERS_HERE, "MIB endpoint "+std::to_string(i)+" has no clock!", get_endpoint_node_plain(i)->read_endpoint_state(), e));
83 : }
84 0 : }
85 : }
86 :
87 0 : this->sync_timestamp(ts_source);
88 : }
89 0 : }
90 : //-----------------------------------------------------------------------------
91 :
92 : //-----------------------------------------------------------------------------
93 : void
94 0 : KerberosDesign::switch_timing_source(ClockSource clock_source) const
95 : {
96 : // Hard reset
97 0 : TopDesign::configure(clock_source); //TODO add option not to reprogram pll config
98 :
99 0 : switch_timing_source_mux(clock_source);
100 0 : }
101 : //-----------------------------------------------------------------------------
102 :
103 : //-----------------------------------------------------------------------------
104 : //void
105 : //KerberosDesign::get_info(opmonlib::InfoCollector& ci, int level) const
106 : //{
107 : // opmonlib::InfoCollector master_collector;
108 : // this->get_master_node_plain()->get_info(master_collector, level);
109 : // ci.add("master", master_collector);
110 :
111 : // opmonlib::InfoCollector hardware_collector;
112 : // this->get_io_node_plain()->get_info(hardware_collector, level);
113 : // ci.add("io", hardware_collector);
114 :
115 : // opmonlib::InfoCollector endpoint_collector;
116 : // get_endpoint_node_plain(0)->get_info(endpoint_collector, level);
117 : // ci.add("endpoint", endpoint_collector);
118 : // }
119 : //-----------------------------------------------------------------------------
120 :
121 : }
|