diff options
author | Niki <niki@aveer.io> | 2020-07-13 21:37:02 -0400 |
---|---|---|
committer | Martin Braun <martin@gnuradio.org> | 2021-01-24 10:57:00 -0800 |
commit | f17a453de62681141641f1da414bdbed56a2e5a9 (patch) | |
tree | 24265e90ac1801b074f2bc73658773534038e3be /gr-uhd/lib/usrp_block_impl.cc | |
parent | c40e82ae17a9dfefc95b15ab22eaf8dbf1a45d29 (diff) |
uhd: Control of frequency and gain in both directions at the same moment
It implements the ability to control frequency and gain in both
directions (Tx and Rx) with use of a single UHD source or sink - in the
same moment. It is possible to do that in separate moments with current
UHD blocks but this way it is not possible to change both Rx and Tx
settings for the same burst. Now, a single message can do that.
Note that there is a bit of an oddity here: The GNU Radio USRP blocks
are either Rx or Tx (source or sink). However, they all encapsulate an
underlying multi_usrp object. That means that under the hood, a USRP
source or a USRP sink potentially has access to the "other" direction.
This is made use in this patch.
To use this feature, add a direction key to the message dictionary going
to the block.
Signed-off-by: Martin Braun <martin@gnuradio.org>
Diffstat (limited to 'gr-uhd/lib/usrp_block_impl.cc')
-rw-r--r-- | gr-uhd/lib/usrp_block_impl.cc | 145 |
1 files changed, 120 insertions, 25 deletions
diff --git a/gr-uhd/lib/usrp_block_impl.cc b/gr-uhd/lib/usrp_block_impl.cc index dcb2108994..c8073ebd3c 100644 --- a/gr-uhd/lib/usrp_block_impl.cc +++ b/gr-uhd/lib/usrp_block_impl.cc @@ -137,8 +137,10 @@ usrp_block_impl::usrp_block_impl(const ::uhd::device_addr_t& device_addr, _stream_now(_nchan == 1 and ts_tag_name.empty()), _start_time_set(false), _force_tune(false), - _curr_tune_req(stream_args.channels.size(), ::uhd::tune_request_t()), - _chans_to_tune(stream_args.channels.size()) + _curr_tx_tune_req(stream_args.channels.size(), ::uhd::tune_request_t()), + _curr_rx_tune_req(stream_args.channels.size(), ::uhd::tune_request_t()), + _tx_chans_to_tune(stream_args.channels.size()), + _rx_chans_to_tune(stream_args.channels.size()) { _dev = ::uhd::usrp::multi_usrp::make(device_addr); @@ -292,11 +294,22 @@ bool usrp_block_impl::_check_mboard_sensors_locked() return clocks_locked; } -void usrp_block_impl::_set_center_freq_from_internals_allchans(pmt::pmt_t direction) +void usrp_block_impl::_set_center_freq_from_internals_allchans() { - while (_chans_to_tune.any()) { + unsigned int chan; + while (_rx_chans_to_tune.any()) { // This resets() bits, so this loop should not run indefinitely - _set_center_freq_from_internals(_chans_to_tune.find_first(), direction); + chan = _rx_chans_to_tune.find_first(); + _set_center_freq_from_internals(chan, ant_direction_rx()); + _rx_chans_to_tune.reset(chan); + } + + while (_tx_chans_to_tune.any()) { + // This resets() bits, so this loop should not run indefinitely + chan = _tx_chans_to_tune.find_first(); + _set_center_freq_from_internals(_tx_chans_to_tune.find_first(), + ant_direction_tx()); + _tx_chans_to_tune.reset(chan); } } @@ -592,8 +605,9 @@ void usrp_block_impl::msg_handler_command(pmt::pmt_t msg) break; } } + /// 5) Check if we need to re-tune - _set_center_freq_from_internals_allchans(direction); + _set_center_freq_from_internals_allchans(); _force_tune = false; } @@ -614,22 +628,37 @@ void usrp_block_impl::register_msg_cmd_handler(const pmt::pmt_t& cmd, _msg_cmd_handlers[cmd] = handler; } -void usrp_block_impl::_update_curr_tune_req(::uhd::tune_request_t& tune_req, int chan) +void usrp_block_impl::_update_curr_tune_req(::uhd::tune_request_t& tune_req, + int chan, + pmt::pmt_t direction) { if (chan == -1) { for (size_t i = 0; i < _nchan; i++) { - _update_curr_tune_req(tune_req, int(i)); + _update_curr_tune_req(tune_req, int(i), direction); } return; } - if (tune_req.target_freq != _curr_tune_req[chan].target_freq || - tune_req.rf_freq_policy != _curr_tune_req[chan].rf_freq_policy || - tune_req.rf_freq != _curr_tune_req[chan].rf_freq || - tune_req.dsp_freq != _curr_tune_req[chan].dsp_freq || - tune_req.dsp_freq_policy != _curr_tune_req[chan].dsp_freq_policy || _force_tune) { - _curr_tune_req[chan] = tune_req; - _chans_to_tune.set(chan); + if (pmt::eqv(direction, ant_direction_rx())) { + if (tune_req.target_freq != _curr_rx_tune_req[chan].target_freq || + tune_req.rf_freq_policy != _curr_rx_tune_req[chan].rf_freq_policy || + tune_req.rf_freq != _curr_rx_tune_req[chan].rf_freq || + tune_req.dsp_freq != _curr_rx_tune_req[chan].dsp_freq || + tune_req.dsp_freq_policy != _curr_rx_tune_req[chan].dsp_freq_policy || + _force_tune) { + _curr_rx_tune_req[chan] = tune_req; + _rx_chans_to_tune.set(chan); + } + } else { + if (tune_req.target_freq != _curr_tx_tune_req[chan].target_freq || + tune_req.rf_freq_policy != _curr_tx_tune_req[chan].rf_freq_policy || + tune_req.rf_freq != _curr_tx_tune_req[chan].rf_freq || + tune_req.dsp_freq != _curr_tx_tune_req[chan].dsp_freq || + tune_req.dsp_freq_policy != _curr_tx_tune_req[chan].dsp_freq_policy || + _force_tune) { + _curr_tx_tune_req[chan] = tune_req; + _tx_chans_to_tune.set(chan); + } } } @@ -638,6 +667,14 @@ void usrp_block_impl::_cmd_handler_freq(const pmt::pmt_t& freq_, int chan, const pmt::pmt_t& msg) { + // See if a direction was specified + pmt::pmt_t direction = + pmt::dict_ref(msg, + cmd_direction_key(), + pmt::PMT_NIL // Anything except "TX" or "RX will default to the + // messaged block direction" + ); + double freq = pmt::to_double(freq_); ::uhd::tune_request_t new_tune_request(freq); if (pmt::dict_has_key(msg, cmd_lo_offset_key())) { @@ -646,40 +683,62 @@ void usrp_block_impl::_cmd_handler_freq(const pmt::pmt_t& freq_, new_tune_request = ::uhd::tune_request_t(freq, lo_offset); } - _update_curr_tune_req(new_tune_request, chan); + _update_curr_tune_req(new_tune_request, chan, direction); } void usrp_block_impl::_cmd_handler_looffset(const pmt::pmt_t& lo_offset, int chan, const pmt::pmt_t& msg) { + // See if a direction was specified + pmt::pmt_t direction = + pmt::dict_ref(msg, + cmd_direction_key(), + pmt::PMT_NIL // Anything except "TX" or "RX" will default to the + // messaged block direction + ); + if (pmt::dict_has_key(msg, cmd_freq_key())) { // Then it's already taken care of return; } double lo_offs = pmt::to_double(lo_offset); - ::uhd::tune_request_t new_tune_request = _curr_tune_req[chan]; + ::uhd::tune_request_t new_tune_request; + if (pmt::eqv(direction, ant_direction_rx())) { + new_tune_request = _curr_rx_tune_req[chan]; + } else { + new_tune_request = _curr_tx_tune_req[chan]; + } + new_tune_request.rf_freq = new_tune_request.target_freq + lo_offs; new_tune_request.rf_freq_policy = ::uhd::tune_request_t::POLICY_MANUAL; new_tune_request.dsp_freq_policy = ::uhd::tune_request_t::POLICY_AUTO; - _update_curr_tune_req(new_tune_request, chan); + _update_curr_tune_req(new_tune_request, chan, direction); } void usrp_block_impl::_cmd_handler_gain(const pmt::pmt_t& gain_, int chan, const pmt::pmt_t& msg) { + // See if a direction was specified + pmt::pmt_t direction = + pmt::dict_ref(msg, + cmd_direction_key(), + pmt::PMT_NIL // Anything except "TX" or "RX will default to the + // messaged block direction" + ); + double gain = pmt::to_double(gain_); if (chan == -1) { for (size_t i = 0; i < _nchan; i++) { - set_gain(gain, i); + set_gain(gain, i, direction); } return; } - set_gain(gain, chan); + set_gain(gain, chan, direction); } void usrp_block_impl::_cmd_handler_power(const pmt::pmt_t& power_dbm_, @@ -770,10 +829,18 @@ void usrp_block_impl::_cmd_handler_tune(const pmt::pmt_t& tune, int chan, const pmt::pmt_t& msg) { + // See if a direction was specified + pmt::pmt_t direction = + pmt::dict_ref(msg, + cmd_direction_key(), + pmt::PMT_NIL // Anything except "TX" or "RX will default to the + // messaged block direction" + ); + double freq = pmt::to_double(pmt::car(tune)); double lo_offset = pmt::to_double(pmt::cdr(tune)); ::uhd::tune_request_t new_tune_request(freq, lo_offset); - _update_curr_tune_req(new_tune_request, chan); + _update_curr_tune_req(new_tune_request, chan, direction); } void usrp_block_impl::_cmd_handler_mtune(const pmt::pmt_t& tune, @@ -842,6 +909,14 @@ void usrp_block_impl::_cmd_handler_lofreq(const pmt::pmt_t& lofreq, int chan, const pmt::pmt_t& msg) { + // See if a direction was specified + pmt::pmt_t direction = + pmt::dict_ref(msg, + cmd_direction_key(), + pmt::PMT_NIL // Anything except "TX" or "RX will default to the + // messaged block direction" + ); + if (chan == -1) { for (size_t i = 0; i < _nchan; i++) { _cmd_handler_lofreq(lofreq, int(i), msg); @@ -849,7 +924,13 @@ void usrp_block_impl::_cmd_handler_lofreq(const pmt::pmt_t& lofreq, return; } - ::uhd::tune_request_t new_tune_request = _curr_tune_req[chan]; + ::uhd::tune_request_t new_tune_request; + if (pmt::eqv(direction, ant_direction_rx())) { + new_tune_request = _curr_rx_tune_req[chan]; + } else { + new_tune_request = _curr_tx_tune_req[chan]; + } + new_tune_request.rf_freq = pmt::to_double(lofreq); if (pmt::dict_has_key(msg, cmd_dsp_freq_key())) { new_tune_request.dsp_freq = @@ -858,13 +939,21 @@ void usrp_block_impl::_cmd_handler_lofreq(const pmt::pmt_t& lofreq, new_tune_request.rf_freq_policy = ::uhd::tune_request_t::POLICY_MANUAL; new_tune_request.dsp_freq_policy = ::uhd::tune_request_t::POLICY_MANUAL; - _update_curr_tune_req(new_tune_request, chan); + _update_curr_tune_req(new_tune_request, chan, direction); } void usrp_block_impl::_cmd_handler_dspfreq(const pmt::pmt_t& dspfreq, int chan, const pmt::pmt_t& msg) { + // See if a direction was specified + pmt::pmt_t direction = + pmt::dict_ref(msg, + cmd_direction_key(), + pmt::PMT_NIL // Anything except "TX" or "RX will default to the + // messaged block direction" + ); + if (pmt::dict_has_key(msg, cmd_lo_freq_key())) { // Then it's already dealt with return; @@ -877,10 +966,16 @@ void usrp_block_impl::_cmd_handler_dspfreq(const pmt::pmt_t& dspfreq, return; } - ::uhd::tune_request_t new_tune_request = _curr_tune_req[chan]; + ::uhd::tune_request_t new_tune_request; + if (pmt::eqv(direction, ant_direction_rx())) { + new_tune_request = _curr_rx_tune_req[chan]; + } else { + new_tune_request = _curr_tx_tune_req[chan]; + } + new_tune_request.dsp_freq = pmt::to_double(dspfreq); new_tune_request.rf_freq_policy = ::uhd::tune_request_t::POLICY_MANUAL; new_tune_request.dsp_freq_policy = ::uhd::tune_request_t::POLICY_MANUAL; - _update_curr_tune_req(new_tune_request, chan); + _update_curr_tune_req(new_tune_request, chan, direction); } |