diff options
Diffstat (limited to 'Transceiver52M/UHDDevice.cpp')
-rw-r--r-- | Transceiver52M/UHDDevice.cpp | 50 |
1 files changed, 37 insertions, 13 deletions
diff --git a/Transceiver52M/UHDDevice.cpp b/Transceiver52M/UHDDevice.cpp index e943e73..3b9012a 100644 --- a/Transceiver52M/UHDDevice.cpp +++ b/Transceiver52M/UHDDevice.cpp @@ -58,6 +58,11 @@ struct uhd_dev_offset { const std::string desc; }; +struct tune_result { + uhd::tune_result_t uhd; + double freq; +}; + /* * Tx / Rx sample offset values. In a perfect world, there is no group delay * though analog components, and behaviour through digital filters exactly @@ -282,6 +287,7 @@ public: bool setTxFreq(double wFreq, size_t chan); bool setRxFreq(double wFreq, size_t chan); + bool setRxOffset(double wOffset, size_t chan); inline TIMESTAMP initialWriteTimestamp() { return ts_initial * sps; } inline TIMESTAMP initialReadTimestamp() { return ts_initial; } @@ -332,7 +338,7 @@ private: double offset; std::vector<double> tx_gains, rx_gains; - std::vector<double> tx_freqs, rx_freqs; + std::vector<tune_result> tx_freqs, rx_freqs; size_t tx_spp, rx_spp; bool started; @@ -1004,7 +1010,7 @@ bool uhd_device::updateAlignment(TIMESTAMP timestamp) uhd::tune_request_t uhd_device::select_freq(double freq, size_t chan, bool tx) { double rf_spread, rf_freq; - std::vector<double> freqs; + std::vector<tune_result> freqs; uhd::tune_request_t treq(freq); if ((chans == 1) || ((chans == 2) && dev_type == UMTRX)) { @@ -1023,17 +1029,17 @@ uhd::tune_request_t uhd_device::select_freq(double freq, size_t chan, bool tx) freqs = rx_freqs; /* Tune directly if other channel isn't tuned */ - if (freqs[!chan] < 10.0) + if (freqs[!chan].freq < 10.0) return treq; /* Find center frequency between channels */ - rf_spread = fabs(freqs[!chan] - freq); + rf_spread = fabs(freqs[!chan].freq - freq); if (rf_spread > B2XX_CLK_RT) { LOG(ALERT) << rf_spread << "Hz tuning spread not supported\n"; return treq; } - rf_freq = (freqs[!chan] + freq) / 2.0f; + rf_freq = (freqs[!chan].freq + freq) / 2.0f; treq.rf_freq_policy = uhd::tune_request_t::POLICY_MANUAL; treq.target_freq = freq; @@ -1050,10 +1056,12 @@ bool uhd_device::set_freq(double freq, size_t chan, bool tx) if (tx) { tres = usrp_dev->set_tx_freq(treq, chan); - tx_freqs[chan] = usrp_dev->get_tx_freq(chan); + tx_freqs[chan].uhd = tres; + tx_freqs[chan].freq = usrp_dev->get_tx_freq(chan); } else { tres = usrp_dev->set_rx_freq(treq, chan); - rx_freqs[chan] = usrp_dev->get_rx_freq(chan); + rx_freqs[chan].uhd = tres; + rx_freqs[chan].freq = usrp_dev->get_rx_freq(chan); } LOG(INFO) << "\n" << tres.to_pp_string() << std::endl; @@ -1066,13 +1074,15 @@ bool uhd_device::set_freq(double freq, size_t chan, bool tx) */ if (treq.rf_freq_policy == uhd::tune_request_t::POLICY_MANUAL) { if (tx) { - treq = select_freq(tx_freqs[!chan], !chan, true); + treq = select_freq(tx_freqs[!chan].freq, !chan, true); tres = usrp_dev->set_tx_freq(treq, !chan); - tx_freqs[!chan] = usrp_dev->get_tx_freq(!chan); + tx_freqs[!chan].uhd = tres; + tx_freqs[!chan].freq = usrp_dev->get_tx_freq(!chan); } else { - treq = select_freq(rx_freqs[!chan], !chan, false); + treq = select_freq(rx_freqs[!chan].freq, !chan, false); tres = usrp_dev->set_rx_freq(treq, !chan); - rx_freqs[!chan] = usrp_dev->get_rx_freq(!chan); + rx_freqs[!chan].uhd = tres; + rx_freqs[!chan].freq = usrp_dev->get_rx_freq(!chan); } LOG(INFO) << "\n" << tres.to_pp_string() << std::endl; @@ -1091,6 +1101,20 @@ bool uhd_device::setTxFreq(double wFreq, size_t chan) return set_freq(wFreq, chan, true); } +bool uhd_device::setRxOffset(double wOffset, size_t chan) +{ + uhd::tune_result_t tres; + uhd::tune_request_t treq(rx_freqs[chan].freq - wOffset); + + treq.rf_freq_policy = uhd::tune_request_t::POLICY_MANUAL; + treq.rf_freq = rx_freqs[chan].uhd.actual_rf_freq; + + tres = usrp_dev->set_rx_freq(treq, chan); + rx_freqs[chan].freq = usrp_dev->get_rx_freq(chan); + + return true; +} + bool uhd_device::setRxFreq(double wFreq, size_t chan) { if (chan >= rx_freqs.size()) { @@ -1108,7 +1132,7 @@ double uhd_device::getTxFreq(size_t chan) return 0.0; } - return tx_freqs[chan]; + return tx_freqs[chan].freq; } double uhd_device::getRxFreq(size_t chan) @@ -1118,7 +1142,7 @@ double uhd_device::getRxFreq(size_t chan) return 0.0; } - return rx_freqs[chan]; + return rx_freqs[chan].freq; } bool uhd_device::recv_async_msg() |