From 6112e6590db491350442b574566cb7a55c0e9bfd Mon Sep 17 00:00:00 2001 From: Martin Braun Date: Wed, 12 Oct 2016 15:36:46 -0700 Subject: rfnoc radio: Minor adjustment of time setters in header --- host/lib/rfnoc/radio_ctrl_impl.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'host/lib') diff --git a/host/lib/rfnoc/radio_ctrl_impl.hpp b/host/lib/rfnoc/radio_ctrl_impl.hpp index 4224ec5c4..881cce3b4 100644 --- a/host/lib/rfnoc/radio_ctrl_impl.hpp +++ b/host/lib/rfnoc/radio_ctrl_impl.hpp @@ -60,7 +60,6 @@ public: virtual double set_rx_frequency(const double freq, const size_t chan); virtual double set_tx_gain(const double gain, const size_t chan); virtual double set_rx_gain(const double gain, const size_t chan); - virtual void set_time_sync(const uhd::time_spec_t &time); virtual double get_rate() const; virtual std::string get_tx_antenna(const size_t chan) /* const */; @@ -72,6 +71,7 @@ public: void set_time_now(const time_spec_t &time_spec); void set_time_next_pps(const time_spec_t &time_spec); + void set_time_sync(const uhd::time_spec_t &time); time_spec_t get_time_now(); time_spec_t get_time_last_pps(); -- cgit v1.2.3 From 3bc168d7d3333a93e3f4b77a213d4b7ac0bc594f Mon Sep 17 00:00:00 2001 From: Martin Braun Date: Wed, 12 Oct 2016 15:37:16 -0700 Subject: x300: Add time sync procedure to device initialization Reviewed-By: Derek Kozel --- host/lib/usrp/x300/x300_impl.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'host/lib') diff --git a/host/lib/usrp/x300/x300_impl.cpp b/host/lib/usrp/x300/x300_impl.cpp index e4f6d6fb8..776fac928 100644 --- a/host/lib/usrp/x300/x300_impl.cpp +++ b/host/lib/usrp/x300/x300_impl.cpp @@ -986,9 +986,17 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr) mb.radios.at(i)->self_test_adc(); } } + + //////////////////////////////////////////////////////////////////// + // Synchronize times (dboard initialization can desynchronize them) + //////////////////////////////////////////////////////////////////// + if (radio_ids.size() == 2) { + this->sync_times(mb, mb.radios[0]->get_time_now()); + } + } else { UHD_MSG(status) << "No Radio Block found. Assuming radio-less operation." << std::endl; - } + } /* end of radio block(s) initialization */ mb.initialization_done = true; } -- cgit v1.2.3 From 8d9ae5b37b4f0c5339fffc138332c9afdf65b11d Mon Sep 17 00:00:00 2001 From: Martin Braun Date: Thu, 29 Sep 2016 14:23:50 -0700 Subject: rfnoc nodes: Disconnect on destruct --- host/include/uhd/rfnoc/node_ctrl_base.hpp | 16 +++++++++-- host/lib/rfnoc/node_ctrl_base.cpp | 47 +++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) (limited to 'host/lib') diff --git a/host/include/uhd/rfnoc/node_ctrl_base.hpp b/host/include/uhd/rfnoc/node_ctrl_base.hpp index 82e095b1d..071de803c 100644 --- a/host/include/uhd/rfnoc/node_ctrl_base.hpp +++ b/host/include/uhd/rfnoc/node_ctrl_base.hpp @@ -65,6 +65,18 @@ public: node_map_t list_downstream_nodes() { return _downstream_nodes; }; node_map_t list_upstream_nodes() { return _upstream_nodes; }; + /*! Disconnect this node from all neighbouring nodes. + */ + void disconnect(); + + /*! Identify \p output_port as unconnected + */ + void disconnect_output_port(const size_t output_port); + + /*! Identify \p input_port as unconnected + */ + void disconnect_input_port(const size_t input_port); + // TODO we need a more atomic connect procedure, this is too error-prone. /*! For an existing connection, store the remote port number. @@ -156,8 +168,8 @@ protected: /*********************************************************************** * Structors **********************************************************************/ - node_ctrl_base(void) {}; - virtual ~node_ctrl_base() {}; + node_ctrl_base(void) {} + virtual ~node_ctrl_base() { disconnect(); } /*********************************************************************** * Protected members diff --git a/host/lib/rfnoc/node_ctrl_base.cpp b/host/lib/rfnoc/node_ctrl_base.cpp index 6e19d276a..b4d0a30ff 100644 --- a/host/lib/rfnoc/node_ctrl_base.cpp +++ b/host/lib/rfnoc/node_ctrl_base.cpp @@ -17,6 +17,7 @@ #include #include +#include using namespace uhd::rfnoc; @@ -101,3 +102,49 @@ size_t node_ctrl_base::get_upstream_port(const size_t this_port) return _upstream_ports[this_port]; } +void node_ctrl_base::disconnect() +{ + // Notify neighbours: + for (node_map_t::iterator i = _downstream_nodes.begin(); i != _downstream_nodes.end(); ++i) { + sptr downstream_node = i->second.lock(); + if (not downstream_node) { + // Actually this is not OK + continue; + } + downstream_node->disconnect_input_port(_downstream_ports[i->first]); + } + for (node_map_t::iterator i = _upstream_nodes.begin(); i != _upstream_nodes.end(); ++i) { + sptr upstream_node = i->second.lock(); + if (not upstream_node) { + // Actually this is not OK + continue; + } + upstream_node->disconnect_output_port(_upstream_ports[i->first]); + } + // Clear own maps: + _downstream_nodes.clear(); + _downstream_ports.clear(); + _upstream_nodes.clear(); + _upstream_ports.clear(); +} + +void node_ctrl_base::disconnect_output_port(const size_t output_port) +{ + if (_downstream_nodes.count(output_port) == 0 or + _downstream_ports.count(output_port) == 0) { + throw uhd::assertion_error(str(boost::format("[%s] Attempting to disconnect output port %u, which is not registered as connected!") % unique_id() % output_port)); + } + _downstream_nodes.erase(output_port); + _downstream_ports.erase(output_port); +} + +void node_ctrl_base::disconnect_input_port(const size_t input_port) +{ + if (_upstream_nodes.count(input_port) == 0 or + _upstream_ports.count(input_port) == 0) { + throw uhd::assertion_error(str(boost::format("[%s] Attempting to disconnect input port %u, which is not registered as connected!") % unique_id() % input_port)); + } + _upstream_nodes.erase(input_port); + _upstream_ports.erase(input_port); +} + -- cgit v1.2.3