aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/UHDDevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Transceiver52M/UHDDevice.cpp')
-rw-r--r--Transceiver52M/UHDDevice.cpp50
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()