diff options
author | Derek Kozel <derek.kozel@ettus.com> | 2016-10-25 17:26:25 -0700 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2016-10-26 17:20:00 -0700 |
commit | 59aaf137b8c86028c0686258837acc7f37eb9461 (patch) | |
tree | 22dbde74e14cfda3f76041089c5f400edf3f1fcb /host/lib/usrp/dboard/twinrx | |
parent | b4d92a97b014b1de26ff658ddeb3f636d8e1ca81 (diff) | |
download | uhd-59aaf137b8c86028c0686258837acc7f37eb9461.tar.gz uhd-59aaf137b8c86028c0686258837acc7f37eb9461.tar.bz2 uhd-59aaf137b8c86028c0686258837acc7f37eb9461.zip |
TwinRX: Use command time to schedule synchronous events
Diffstat (limited to 'host/lib/usrp/dboard/twinrx')
-rw-r--r-- | host/lib/usrp/dboard/twinrx/twinrx_experts.cpp | 24 | ||||
-rw-r--r-- | host/lib/usrp/dboard/twinrx/twinrx_experts.hpp | 39 |
2 files changed, 63 insertions, 0 deletions
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_experts.cpp b/host/lib/usrp/dboard/twinrx/twinrx_experts.cpp index ddaa4211e..f0f64c7e1 100644 --- a/host/lib/usrp/dboard/twinrx/twinrx_experts.cpp +++ b/host/lib/usrp/dboard/twinrx/twinrx_experts.cpp @@ -30,6 +30,17 @@ using namespace uhd::math; using namespace uhd::usrp::dboard::twinrx; /*!--------------------------------------------------------- + * twinrx_scheduling_expert::resolve + * --------------------------------------------------------- + */ +void twinrx_scheduling_expert::resolve() +{ + // Currently a straight pass-through. To be expanded as needed + // when more advanced scheduling is needed + _rx_frontend_time = _command_time; +} + +/*!--------------------------------------------------------- * twinrx_freq_path_expert::resolve * --------------------------------------------------------- */ @@ -222,6 +233,19 @@ void twinrx_freq_coercion_expert::resolve() */ void twinrx_nyquist_expert::resolve() { + // Do not execute when clear_command_time is called. + // This is a transition of the command time from non-zero to zero. + if (_rx_frontend_time == time_spec_t(0.0) and _cached_cmd_time != time_spec_t(0.0)) { + _cached_cmd_time = _rx_frontend_time; + return; + } + + // Do not execute twice for the same command time unless untimed + if (_rx_frontend_time == _cached_cmd_time and _rx_frontend_time != time_spec_t(0.0)) { + return; + } + _cached_cmd_time = _rx_frontend_time; + double if_freq_sign = 1.0; if (_lo1_inj_side == INJ_HIGH_SIDE) if_freq_sign *= -1.0; if (_lo2_inj_side == INJ_HIGH_SIDE) if_freq_sign *= -1.0; diff --git a/host/lib/usrp/dboard/twinrx/twinrx_experts.hpp b/host/lib/usrp/dboard/twinrx/twinrx_experts.hpp index 1617c9c80..9c83dbfa8 100644 --- a/host/lib/usrp/dboard/twinrx/twinrx_experts.hpp +++ b/host/lib/usrp/dboard/twinrx/twinrx_experts.hpp @@ -52,6 +52,38 @@ static const std::string lo_stage_str(lo_stage_t stage, bool lower = false) { return prefix + ((stage == STAGE_LO1) ? "1" : "2"); } + +/*!--------------------------------------------------------- + * twinrx_scheduling_expert + * + * This expert is responsible for scheduling time sensitive actions + * in other experts. It responds to changes in the command time and + * selectively causes experts to run in order to ensure a synchronized + * system. + * + * --------------------------------------------------------- + */ +class twinrx_scheduling_expert : public experts::worker_node_t { +public: + twinrx_scheduling_expert(const experts::node_retriever_t& db, std::string ch) + : experts::worker_node_t(prepend_ch("twinrx_scheduling_expert", ch)), + _command_time (db, prepend_ch("time/cmd", ch)), + _rx_frontend_time (db, prepend_ch("time/rx_frontend", ch)) + { + bind_accessor(_command_time); + bind_accessor(_rx_frontend_time); + } + +private: + virtual void resolve(); + + //Inputs + experts::data_reader_t<time_spec_t> _command_time; + + //Outputs + experts::data_writer_t<time_spec_t> _rx_frontend_time; +}; + /*!--------------------------------------------------------- * twinrx_freq_path_expert * @@ -271,6 +303,7 @@ public: _if_freq_d (db, prepend_ch("if_freq/desired", ch)), _lo1_inj_side (db, prepend_ch("ch/LO1/inj_side", ch)), _lo2_inj_side (db, prepend_ch("ch/LO2/inj_side", ch)), + _rx_frontend_time (db, prepend_ch("time/rx_frontend", ch)), _if_freq_c (db, prepend_ch("if_freq/coerced", ch)), _db_iface (db_iface) { @@ -280,6 +313,7 @@ public: bind_accessor(_lo1_inj_side); bind_accessor(_lo2_inj_side); bind_accessor(_if_freq_c); + bind_accessor(_rx_frontend_time); } private: @@ -293,9 +327,14 @@ private: experts::data_reader_t<double> _if_freq_d; experts::data_reader_t<lo_inj_side_t> _lo1_inj_side; experts::data_reader_t<lo_inj_side_t> _lo2_inj_side; + experts::data_reader_t<time_spec_t> _rx_frontend_time; + //Outputs experts::data_writer_t<double> _if_freq_c; dboard_iface::sptr _db_iface; + + //Misc + time_spec_t _cached_cmd_time; }; /*!--------------------------------------------------------- |