aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/dboard/twinrx
diff options
context:
space:
mode:
authorDerek Kozel <derek.kozel@ettus.com>2016-10-25 17:26:25 -0700
committerMartin Braun <martin.braun@ettus.com>2016-10-26 17:20:00 -0700
commit59aaf137b8c86028c0686258837acc7f37eb9461 (patch)
tree22dbde74e14cfda3f76041089c5f400edf3f1fcb /host/lib/usrp/dboard/twinrx
parentb4d92a97b014b1de26ff658ddeb3f636d8e1ca81 (diff)
downloaduhd-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.cpp24
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_experts.hpp39
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;
};
/*!---------------------------------------------------------