diff options
author | Marcus Müller <mmueller@gnuradio.org> | 2019-08-07 21:45:12 +0200 |
---|---|---|
committer | Marcus Müller <marcus@hostalia.de> | 2019-08-09 23:04:28 +0200 |
commit | f7bbf2c1d8d780294f3e016aff239ca35eb6516e (patch) | |
tree | e09ab6112e02b2215b2d59ac24d3d6ea2edac745 /gr-uhd/lib/usrp_block_impl.cc | |
parent | 78431dc6941e3acc67c858277dfe4a0ed583643c (diff) |
Tree: clang-format without the include sorting
Diffstat (limited to 'gr-uhd/lib/usrp_block_impl.cc')
-rw-r--r-- | gr-uhd/lib/usrp_block_impl.cc | 924 |
1 files changed, 462 insertions, 462 deletions
diff --git a/gr-uhd/lib/usrp_block_impl.cc b/gr-uhd/lib/usrp_block_impl.cc index d6b948ba9e..8b60a4338a 100644 --- a/gr-uhd/lib/usrp_block_impl.cc +++ b/gr-uhd/lib/usrp_block_impl.cc @@ -30,698 +30,698 @@ const double usrp_block_impl::LOCK_TIMEOUT = 1.5; /********************************************************************** * Structors *********************************************************************/ -usrp_block::usrp_block( - const std::string &name, - gr::io_signature::sptr input_signature, - gr::io_signature::sptr output_signature -) : sync_block(name, input_signature, output_signature) +usrp_block::usrp_block(const std::string& name, + gr::io_signature::sptr input_signature, + gr::io_signature::sptr output_signature) + : sync_block(name, input_signature, output_signature) { - // nop + // nop } const pmt::pmt_t gr::uhd::cmd_chan_key() { - static const pmt::pmt_t val = pmt::mp("chan"); - return val; + static const pmt::pmt_t val = pmt::mp("chan"); + return val; } const pmt::pmt_t gr::uhd::cmd_gain_key() { - static const pmt::pmt_t val = pmt::mp("gain"); - return val; + static const pmt::pmt_t val = pmt::mp("gain"); + return val; } const pmt::pmt_t gr::uhd::cmd_freq_key() { - static const pmt::pmt_t val = pmt::mp("freq"); - return val; + static const pmt::pmt_t val = pmt::mp("freq"); + return val; } const pmt::pmt_t gr::uhd::cmd_lo_offset_key() { - static const pmt::pmt_t val = pmt::mp("lo_offset"); - return val; + static const pmt::pmt_t val = pmt::mp("lo_offset"); + return val; } const pmt::pmt_t gr::uhd::cmd_tune_key() { - static const pmt::pmt_t val = pmt::mp("tune"); - return val; + static const pmt::pmt_t val = pmt::mp("tune"); + return val; } const pmt::pmt_t gr::uhd::cmd_lo_freq_key() { - static const pmt::pmt_t val = pmt::mp("lo_freq"); - return val; + static const pmt::pmt_t val = pmt::mp("lo_freq"); + return val; } const pmt::pmt_t gr::uhd::cmd_dsp_freq_key() { - static const pmt::pmt_t val = pmt::mp("dsp_freq"); - return val; + static const pmt::pmt_t val = pmt::mp("dsp_freq"); + return val; } const pmt::pmt_t gr::uhd::cmd_rate_key() { - static const pmt::pmt_t val = pmt::mp("rate"); - return val; + static const pmt::pmt_t val = pmt::mp("rate"); + return val; } const pmt::pmt_t gr::uhd::cmd_bandwidth_key() { - static const pmt::pmt_t val = pmt::mp("bandwidth"); - return val; + static const pmt::pmt_t val = pmt::mp("bandwidth"); + return val; } const pmt::pmt_t gr::uhd::cmd_time_key() { - static const pmt::pmt_t val = pmt::mp("time"); - return val; + static const pmt::pmt_t val = pmt::mp("time"); + return val; } const pmt::pmt_t gr::uhd::cmd_mboard_key() { - static const pmt::pmt_t val = pmt::mp("mboard"); - return val; + static const pmt::pmt_t val = pmt::mp("mboard"); + return val; } const pmt::pmt_t gr::uhd::cmd_antenna_key() { - static const pmt::pmt_t val = pmt::mp("antenna"); - return val; + static const pmt::pmt_t val = pmt::mp("antenna"); + return val; } const pmt::pmt_t gr::uhd::cmd_direction_key() { - static const pmt::pmt_t val = pmt::mp("direction"); - return val; + static const pmt::pmt_t val = pmt::mp("direction"); + return val; } const pmt::pmt_t gr::uhd::cmd_tag_key() { - static const pmt::pmt_t val = pmt::mp("tag"); - return val; + static const pmt::pmt_t val = pmt::mp("tag"); + return val; } const pmt::pmt_t gr::uhd::ant_direction_rx() { - static const pmt::pmt_t val = pmt::mp("RX"); - return val; + static const pmt::pmt_t val = pmt::mp("RX"); + return val; } const pmt::pmt_t gr::uhd::ant_direction_tx() { - static const pmt::pmt_t val = pmt::mp("TX"); - return val; + static const pmt::pmt_t val = pmt::mp("TX"); + return val; } -usrp_block_impl::usrp_block_impl( - const ::uhd::device_addr_t &device_addr, - const ::uhd::stream_args_t &stream_args, - const std::string &ts_tag_name -) : _stream_args(stream_args), - _nchan(stream_args.channels.size()), - _stream_now(_nchan == 1 and ts_tag_name.empty()), - _start_time_set(false), - _curr_tune_req(stream_args.channels.size(), ::uhd::tune_request_t()), - _chans_to_tune(stream_args.channels.size()) +usrp_block_impl::usrp_block_impl(const ::uhd::device_addr_t& device_addr, + const ::uhd::stream_args_t& stream_args, + const std::string& ts_tag_name) + : _stream_args(stream_args), + _nchan(stream_args.channels.size()), + _stream_now(_nchan == 1 and ts_tag_name.empty()), + _start_time_set(false), + _curr_tune_req(stream_args.channels.size(), ::uhd::tune_request_t()), + _chans_to_tune(stream_args.channels.size()) { - _dev = ::uhd::usrp::multi_usrp::make(device_addr); + _dev = ::uhd::usrp::multi_usrp::make(device_addr); - _check_mboard_sensors_locked(); + _check_mboard_sensors_locked(); - // Set up message ports: - message_port_register_in(pmt::mp("command")); - set_msg_handler( - pmt::mp("command"), - boost::bind(&usrp_block_impl::msg_handler_command, this, _1) - ); + // Set up message ports: + message_port_register_in(pmt::mp("command")); + set_msg_handler(pmt::mp("command"), + boost::bind(&usrp_block_impl::msg_handler_command, this, _1)); // cuz we lazy: -#define REGISTER_CMD_HANDLER(key, _handler) register_msg_cmd_handler(key, boost::bind(&usrp_block_impl::_handler, this, _1, _2, _3)) - // Register default command handlers: - REGISTER_CMD_HANDLER(cmd_freq_key(), _cmd_handler_freq); - REGISTER_CMD_HANDLER(cmd_gain_key(), _cmd_handler_gain); - REGISTER_CMD_HANDLER(cmd_lo_offset_key(), _cmd_handler_looffset); - REGISTER_CMD_HANDLER(cmd_tune_key(), _cmd_handler_tune); - REGISTER_CMD_HANDLER(cmd_lo_freq_key(), _cmd_handler_lofreq); - REGISTER_CMD_HANDLER(cmd_dsp_freq_key(), _cmd_handler_dspfreq); - REGISTER_CMD_HANDLER(cmd_rate_key(), _cmd_handler_rate); - REGISTER_CMD_HANDLER(cmd_bandwidth_key(), _cmd_handler_bw); - REGISTER_CMD_HANDLER(cmd_antenna_key(), _cmd_handler_antenna); +#define REGISTER_CMD_HANDLER(key, _handler) \ + register_msg_cmd_handler(key, \ + boost::bind(&usrp_block_impl::_handler, this, _1, _2, _3)) + // Register default command handlers: + REGISTER_CMD_HANDLER(cmd_freq_key(), _cmd_handler_freq); + REGISTER_CMD_HANDLER(cmd_gain_key(), _cmd_handler_gain); + REGISTER_CMD_HANDLER(cmd_lo_offset_key(), _cmd_handler_looffset); + REGISTER_CMD_HANDLER(cmd_tune_key(), _cmd_handler_tune); + REGISTER_CMD_HANDLER(cmd_lo_freq_key(), _cmd_handler_lofreq); + REGISTER_CMD_HANDLER(cmd_dsp_freq_key(), _cmd_handler_dspfreq); + REGISTER_CMD_HANDLER(cmd_rate_key(), _cmd_handler_rate); + REGISTER_CMD_HANDLER(cmd_bandwidth_key(), _cmd_handler_bw); + REGISTER_CMD_HANDLER(cmd_antenna_key(), _cmd_handler_antenna); } usrp_block_impl::~usrp_block_impl() { - // nop + // nop } /********************************************************************** * Helpers *********************************************************************/ -void usrp_block_impl::_update_stream_args(const ::uhd::stream_args_t &stream_args_) -{ - ::uhd::stream_args_t stream_args(stream_args_); - if (stream_args.channels.empty()) { - stream_args.channels = _stream_args.channels; - } - if (stream_args.cpu_format != _stream_args.cpu_format || - stream_args.channels.size() != _stream_args.channels.size()) { - throw std::runtime_error("Cannot change I/O signatures while updating stream args!"); - } - _stream_args = stream_args; -} - -bool usrp_block_impl::_wait_for_locked_sensor( - std::vector<std::string> sensor_names, - const std::string &sensor_name, - get_sensor_fn_t get_sensor_fn -){ - if (std::find(sensor_names.begin(), sensor_names.end(), sensor_name) == sensor_names.end()) - return true; +void usrp_block_impl::_update_stream_args(const ::uhd::stream_args_t& stream_args_) +{ + ::uhd::stream_args_t stream_args(stream_args_); + if (stream_args.channels.empty()) { + stream_args.channels = _stream_args.channels; + } + if (stream_args.cpu_format != _stream_args.cpu_format || + stream_args.channels.size() != _stream_args.channels.size()) { + throw std::runtime_error( + "Cannot change I/O signatures while updating stream args!"); + } + _stream_args = stream_args; +} - boost::system_time start = boost::get_system_time(); - boost::system_time first_lock_time; +bool usrp_block_impl::_wait_for_locked_sensor(std::vector<std::string> sensor_names, + const std::string& sensor_name, + get_sensor_fn_t get_sensor_fn) +{ + if (std::find(sensor_names.begin(), sensor_names.end(), sensor_name) == + sensor_names.end()) + return true; - while (true) { - if ((not first_lock_time.is_not_a_date_time()) and - (boost::get_system_time() > (first_lock_time + boost::posix_time::seconds(static_cast<long>(LOCK_TIMEOUT))))) { - break; - } + boost::system_time start = boost::get_system_time(); + boost::system_time first_lock_time; - if (get_sensor_fn(sensor_name).to_bool()) { - if (first_lock_time.is_not_a_date_time()) - first_lock_time = boost::get_system_time(); - } - else { - first_lock_time = boost::system_time(); //reset to 'not a date time' + while (true) { + if ((not first_lock_time.is_not_a_date_time()) and + (boost::get_system_time() > + (first_lock_time + + boost::posix_time::seconds(static_cast<long>(LOCK_TIMEOUT))))) { + break; + } - if (boost::get_system_time() > (start + boost::posix_time::seconds(static_cast<long>(LOCK_TIMEOUT)))) { - return false; - } - } + if (get_sensor_fn(sensor_name).to_bool()) { + if (first_lock_time.is_not_a_date_time()) + first_lock_time = boost::get_system_time(); + } else { + first_lock_time = boost::system_time(); // reset to 'not a date time' - boost::this_thread::sleep(boost::posix_time::milliseconds(100)); - } - - return true; -} - -bool usrp_block_impl::_unpack_chan_command( - std::string &command, - pmt::pmt_t &cmd_val, - int &chan, - const pmt::pmt_t &cmd_pmt -) { - try { - chan = -1; // Default value - if (pmt::is_tuple(cmd_pmt) and (pmt::length(cmd_pmt) == 2 or pmt::length(cmd_pmt) == 3)) { - command = pmt::symbol_to_string(pmt::tuple_ref(cmd_pmt, 0)); - cmd_val = pmt::tuple_ref(cmd_pmt, 1); - if (pmt::length(cmd_pmt) == 3) { - chan = pmt::to_long(pmt::tuple_ref(cmd_pmt, 2)); - } - } - else if (pmt::is_pair(cmd_pmt)) { - command = pmt::symbol_to_string(pmt::car(cmd_pmt)); - cmd_val = pmt::cdr(cmd_pmt); - if (pmt::is_pair(cmd_val)) { - chan = pmt::to_long(pmt::car(cmd_val)); - cmd_val = pmt::cdr(cmd_val); - } + if (boost::get_system_time() > + (start + boost::posix_time::seconds(static_cast<long>(LOCK_TIMEOUT)))) { + return false; + } + } + + boost::this_thread::sleep(boost::posix_time::milliseconds(100)); } - else { - return false; + + return true; +} + +bool usrp_block_impl::_unpack_chan_command(std::string& command, + pmt::pmt_t& cmd_val, + int& chan, + const pmt::pmt_t& cmd_pmt) +{ + try { + chan = -1; // Default value + if (pmt::is_tuple(cmd_pmt) and + (pmt::length(cmd_pmt) == 2 or pmt::length(cmd_pmt) == 3)) { + command = pmt::symbol_to_string(pmt::tuple_ref(cmd_pmt, 0)); + cmd_val = pmt::tuple_ref(cmd_pmt, 1); + if (pmt::length(cmd_pmt) == 3) { + chan = pmt::to_long(pmt::tuple_ref(cmd_pmt, 2)); + } + } else if (pmt::is_pair(cmd_pmt)) { + command = pmt::symbol_to_string(pmt::car(cmd_pmt)); + cmd_val = pmt::cdr(cmd_pmt); + if (pmt::is_pair(cmd_val)) { + chan = pmt::to_long(pmt::car(cmd_val)); + cmd_val = pmt::cdr(cmd_val); + } + } else { + return false; + } + } catch (pmt::wrong_type w) { + return false; } - } catch (pmt::wrong_type w) { - return false; - } - return true; + return true; } bool usrp_block_impl::_check_mboard_sensors_locked() { - bool clocks_locked = true; - - // Check ref lock for all mboards - for (size_t mboard_index = 0; mboard_index < _dev->get_num_mboards(); mboard_index++) { - std::string sensor_name = "ref_locked"; - if (_dev->get_clock_source(mboard_index) == "internal") { - continue; - } - else if (_dev->get_clock_source(mboard_index) == "mimo") { - sensor_name = "mimo_locked"; + bool clocks_locked = true; + + // Check ref lock for all mboards + for (size_t mboard_index = 0; mboard_index < _dev->get_num_mboards(); + mboard_index++) { + std::string sensor_name = "ref_locked"; + if (_dev->get_clock_source(mboard_index) == "internal") { + continue; + } else if (_dev->get_clock_source(mboard_index) == "mimo") { + sensor_name = "mimo_locked"; + } + if (not _wait_for_locked_sensor( + get_mboard_sensor_names(mboard_index), + sensor_name, + boost::bind( + &usrp_block_impl::get_mboard_sensor, this, _1, mboard_index))) { + GR_LOG_WARN( + d_logger, + boost::format( + "Sensor '%s' failed to lock within timeout on motherboard %d.") % + sensor_name % mboard_index); + clocks_locked = false; + } } - if (not _wait_for_locked_sensor( - get_mboard_sensor_names(mboard_index), - sensor_name, - boost::bind(&usrp_block_impl::get_mboard_sensor, this, _1, mboard_index) - )) { - GR_LOG_WARN(d_logger, boost::format("Sensor '%s' failed to lock within timeout on motherboard %d.") % sensor_name % mboard_index); - clocks_locked = false; - } - } - return clocks_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(pmt::pmt_t direction) { - while (_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); - } + while (_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); + } } /********************************************************************** * Public API calls *********************************************************************/ -::uhd::sensor_value_t -usrp_block_impl::get_mboard_sensor(const std::string &name, - size_t mboard) +::uhd::sensor_value_t usrp_block_impl::get_mboard_sensor(const std::string& name, + size_t mboard) { - return _dev->get_mboard_sensor(name, mboard); + return _dev->get_mboard_sensor(name, mboard); } -std::vector<std::string> -usrp_block_impl::get_mboard_sensor_names(size_t mboard) +std::vector<std::string> usrp_block_impl::get_mboard_sensor_names(size_t mboard) { - return _dev->get_mboard_sensor_names(mboard); + return _dev->get_mboard_sensor_names(mboard); } -void -usrp_block_impl::set_time_source(const std::string &source, - const size_t mboard) +void usrp_block_impl::set_time_source(const std::string& source, const size_t mboard) { - return _dev->set_time_source(source, mboard); + return _dev->set_time_source(source, mboard); } -std::string -usrp_block_impl::get_time_source(const size_t mboard) +std::string usrp_block_impl::get_time_source(const size_t mboard) { - return _dev->get_time_source(mboard); + return _dev->get_time_source(mboard); } -std::vector<std::string> -usrp_block_impl::get_time_sources(const size_t mboard) +std::vector<std::string> usrp_block_impl::get_time_sources(const size_t mboard) { - return _dev->get_time_sources(mboard); + return _dev->get_time_sources(mboard); } -void -usrp_block_impl::set_clock_source(const std::string &source, - const size_t mboard) +void usrp_block_impl::set_clock_source(const std::string& source, const size_t mboard) { - return _dev->set_clock_source(source, mboard); + return _dev->set_clock_source(source, mboard); } -std::string -usrp_block_impl::get_clock_source(const size_t mboard) +std::string usrp_block_impl::get_clock_source(const size_t mboard) { - return _dev->get_clock_source(mboard); + return _dev->get_clock_source(mboard); } -std::vector<std::string> -usrp_block_impl::get_clock_sources(const size_t mboard) +std::vector<std::string> usrp_block_impl::get_clock_sources(const size_t mboard) { - return _dev->get_clock_sources(mboard); + return _dev->get_clock_sources(mboard); } -double -usrp_block_impl::get_clock_rate(size_t mboard) +double usrp_block_impl::get_clock_rate(size_t mboard) { - return _dev->get_master_clock_rate(mboard); + return _dev->get_master_clock_rate(mboard); } -void -usrp_block_impl::set_clock_rate(double rate, size_t mboard) +void usrp_block_impl::set_clock_rate(double rate, size_t mboard) { - return _dev->set_master_clock_rate(rate, mboard); + return _dev->set_master_clock_rate(rate, mboard); } -::uhd::time_spec_t -usrp_block_impl::get_time_now(size_t mboard) +::uhd::time_spec_t usrp_block_impl::get_time_now(size_t mboard) { - return _dev->get_time_now(mboard); + return _dev->get_time_now(mboard); } -::uhd::time_spec_t -usrp_block_impl::get_time_last_pps(size_t mboard) +::uhd::time_spec_t usrp_block_impl::get_time_last_pps(size_t mboard) { - return _dev->get_time_last_pps(mboard); + return _dev->get_time_last_pps(mboard); } -std::vector<std::string> -usrp_block_impl::get_gpio_banks(const size_t mboard) +std::vector<std::string> usrp_block_impl::get_gpio_banks(const size_t mboard) { #ifdef UHD_USRP_MULTI_USRP_GPIO_API - return _dev->get_gpio_banks(mboard); + return _dev->get_gpio_banks(mboard); #else - throw std::runtime_error("not implemented in this version"); + throw std::runtime_error("not implemented in this version"); #endif } -boost::uint32_t -usrp_block_impl::get_gpio_attr( - const std::string &bank, - const std::string &attr, - const size_t mboard -) { +boost::uint32_t usrp_block_impl::get_gpio_attr(const std::string& bank, + const std::string& attr, + const size_t mboard) +{ #ifdef UHD_USRP_MULTI_USRP_GPIO_API - return _dev->get_gpio_attr(bank, attr, mboard); + return _dev->get_gpio_attr(bank, attr, mboard); #else - throw std::runtime_error("not implemented in this version"); + throw std::runtime_error("not implemented in this version"); #endif } -void -usrp_block_impl::set_time_now(const ::uhd::time_spec_t &time_spec, - size_t mboard) +void usrp_block_impl::set_time_now(const ::uhd::time_spec_t& time_spec, size_t mboard) { - return _dev->set_time_now(time_spec, mboard); + return _dev->set_time_now(time_spec, mboard); } -void -usrp_block_impl::set_time_next_pps(const ::uhd::time_spec_t &time_spec) +void usrp_block_impl::set_time_next_pps(const ::uhd::time_spec_t& time_spec) { - return _dev->set_time_next_pps(time_spec); + return _dev->set_time_next_pps(time_spec); } -void -usrp_block_impl::set_time_unknown_pps(const ::uhd::time_spec_t &time_spec) +void usrp_block_impl::set_time_unknown_pps(const ::uhd::time_spec_t& time_spec) { - return _dev->set_time_unknown_pps(time_spec); + return _dev->set_time_unknown_pps(time_spec); } -void -usrp_block_impl::set_command_time(const ::uhd::time_spec_t &time_spec, - size_t mboard) +void usrp_block_impl::set_command_time(const ::uhd::time_spec_t& time_spec, size_t mboard) { - return _dev->set_command_time(time_spec, mboard); + return _dev->set_command_time(time_spec, mboard); } -void -usrp_block_impl::clear_command_time(size_t mboard) +void usrp_block_impl::clear_command_time(size_t mboard) { - return _dev->clear_command_time(mboard); + return _dev->clear_command_time(mboard); } -void -usrp_block_impl::set_user_register(const uint8_t addr, - const uint32_t data, - size_t mboard) +void usrp_block_impl::set_user_register(const uint8_t addr, + const uint32_t data, + size_t mboard) { - _dev->set_user_register(addr, data, mboard); + _dev->set_user_register(addr, data, mboard); } -void -usrp_block_impl::set_gpio_attr( - const std::string &bank, - const std::string &attr, - const boost::uint32_t value, - const boost::uint32_t mask, - const size_t mboard -) { +void usrp_block_impl::set_gpio_attr(const std::string& bank, + const std::string& attr, + const boost::uint32_t value, + const boost::uint32_t mask, + const size_t mboard) +{ #ifdef UHD_USRP_MULTI_USRP_GPIO_API - return _dev->set_gpio_attr(bank, attr, value, mask, mboard); + return _dev->set_gpio_attr(bank, attr, value, mask, mboard); #else - throw std::runtime_error("not implemented in this version"); + throw std::runtime_error("not implemented in this version"); #endif } -::uhd::usrp::multi_usrp::sptr -usrp_block_impl::get_device(void) -{ - return _dev; -} +::uhd::usrp::multi_usrp::sptr usrp_block_impl::get_device(void) { return _dev; } -size_t -usrp_block_impl::get_num_mboards() -{ - return _dev->get_num_mboards(); -} +size_t usrp_block_impl::get_num_mboards() { return _dev->get_num_mboards(); } /********************************************************************** * External Interfaces *********************************************************************/ -void -usrp_block_impl::setup_rpc() +void usrp_block_impl::setup_rpc() { #ifdef GR_CTRLPORT - add_rpc_variable( - rpcbasic_sptr(new rpcbasic_register_get<usrp_block, double>( - alias(), "samp_rate", - &usrp_block::get_samp_rate, - pmt::mp(100000.0f), pmt::mp(25000000.0f), pmt::mp(1000000.0f), - "sps", "Sample Rate", RPC_PRIVLVL_MIN, - DISPTIME | DISPOPTSTRIP)) - ); - - add_rpc_variable( - rpcbasic_sptr(new rpcbasic_register_set<usrp_block, double>( - alias(), "samp_rate", - &usrp_block::set_samp_rate, - pmt::mp(100000.0f), pmt::mp(25000000.0f), pmt::mp(1000000.0f), - "sps", "Sample Rate", - RPC_PRIVLVL_MIN, DISPNULL)) - ); + add_rpc_variable(rpcbasic_sptr( + new rpcbasic_register_get<usrp_block, double>(alias(), + "samp_rate", + &usrp_block::get_samp_rate, + pmt::mp(100000.0f), + pmt::mp(25000000.0f), + pmt::mp(1000000.0f), + "sps", + "Sample Rate", + RPC_PRIVLVL_MIN, + DISPTIME | DISPOPTSTRIP))); + + add_rpc_variable(rpcbasic_sptr( + new rpcbasic_register_set<usrp_block, double>(alias(), + "samp_rate", + &usrp_block::set_samp_rate, + pmt::mp(100000.0f), + pmt::mp(25000000.0f), + pmt::mp(1000000.0f), + "sps", + "Sample Rate", + RPC_PRIVLVL_MIN, + DISPNULL))); #endif /* GR_CTRLPORT */ } void usrp_block_impl::msg_handler_command(pmt::pmt_t msg) { - // Legacy code back compat: If we receive a tuple, we convert - // it to a dict, and call the function again. Yep, this comes - // at a slight performance hit. Sometime in the future, we can - // hopefully remove this: - if (pmt::is_tuple(msg)) { - if (pmt::length(msg) != 2 && pmt::length(msg) != 3) { - GR_LOG_ALERT(d_logger, boost::format("Error while unpacking command PMT: %s") % msg); - return; - } - pmt::pmt_t new_msg = pmt::make_dict(); - new_msg = pmt::dict_add(new_msg, pmt::tuple_ref(msg, 0), pmt::tuple_ref(msg, 1)); - if (pmt::length(msg) == 3) { - new_msg = pmt::dict_add(new_msg, cmd_chan_key(), pmt::tuple_ref(msg, 2)); + // Legacy code back compat: If we receive a tuple, we convert + // it to a dict, and call the function again. Yep, this comes + // at a slight performance hit. Sometime in the future, we can + // hopefully remove this: + if (pmt::is_tuple(msg)) { + if (pmt::length(msg) != 2 && pmt::length(msg) != 3) { + GR_LOG_ALERT(d_logger, + boost::format("Error while unpacking command PMT: %s") % msg); + return; + } + pmt::pmt_t new_msg = pmt::make_dict(); + new_msg = pmt::dict_add(new_msg, pmt::tuple_ref(msg, 0), pmt::tuple_ref(msg, 1)); + if (pmt::length(msg) == 3) { + new_msg = pmt::dict_add(new_msg, cmd_chan_key(), pmt::tuple_ref(msg, 2)); + } + GR_LOG_WARN(d_debug_logger, + boost::format("Using legacy message format (tuples): %s") % msg); + return msg_handler_command(new_msg); } - GR_LOG_WARN(d_debug_logger, boost::format("Using legacy message format (tuples): %s") % msg); - return msg_handler_command(new_msg); - } - // End of legacy backward compat code. - - // Turn pair into dict - if (!pmt::is_dict(msg)) { - GR_LOG_ERROR(d_logger, boost::format("Command message is neither dict nor pair: %s") % msg); - return; - } - - // OK, here comes the horrible part. Pairs pass is_dict(), but they're not dicts. Such dicks. - try { - // This will fail if msg is a pair: - pmt::pmt_t keys = pmt::dict_keys(msg); - } catch (const pmt::wrong_type &e) { - // So we fix it: - GR_LOG_DEBUG(d_debug_logger, boost::format("Converting pair to dict: %s") % msg); - msg = pmt::dict_add(pmt::make_dict(), pmt::car(msg), pmt::cdr(msg)); - } - - /*** Start the actual message processing *************************/ - /// 1) Check if there's a time stamp - if (pmt::dict_has_key(msg, cmd_time_key())) { - size_t mboard_index = pmt::to_long( - pmt::dict_ref( - msg, cmd_mboard_key(), - pmt::from_long( ::uhd::usrp::multi_usrp::ALL_MBOARDS ) // Default to all mboards - ) - ); - pmt::pmt_t timespec_p = pmt::dict_ref(msg, cmd_time_key(), pmt::PMT_NIL); - if (timespec_p == pmt::PMT_NIL) { - clear_command_time(mboard_index); - } else { - ::uhd::time_spec_t timespec( - time_t(pmt::to_uint64(pmt::car(timespec_p))), // Full secs - pmt::to_double(pmt::cdr(timespec_p)) // Frac secs - ); - GR_LOG_DEBUG(d_debug_logger, boost::format("Setting command time on mboard %d") % mboard_index); - set_command_time(timespec, mboard_index); + // End of legacy backward compat code. + + // Turn pair into dict + if (!pmt::is_dict(msg)) { + GR_LOG_ERROR(d_logger, + boost::format("Command message is neither dict nor pair: %s") % msg); + return; } - } - - /// 2) Read chan value - int chan = int(pmt::to_long( - pmt::dict_ref( - msg, cmd_chan_key(), - pmt::from_long(-1) // Default to all chans - ) - )); - - /// 3) Loop through all the values - GR_LOG_DEBUG(d_debug_logger, boost::format("Processing command message %s") % msg); - pmt::pmt_t msg_items = pmt::dict_items(msg); - for (size_t i = 0; i < pmt::length(msg_items); i++) { + + // OK, here comes the horrible part. Pairs pass is_dict(), but they're not dicts. Such + // dicks. try { - dispatch_msg_cmd_handler( - pmt::car(pmt::nth(i, msg_items)), - pmt::cdr(pmt::nth(i, msg_items)), - chan, msg - ); - } catch (pmt::wrong_type &e) { - GR_LOG_ALERT(d_logger, boost::format("Invalid command value for key %s: %s") % pmt::car(pmt::nth(i, msg_items)) % pmt::cdr(pmt::nth(i, msg_items))); - break; + // This will fail if msg is a pair: + pmt::pmt_t keys = pmt::dict_keys(msg); + } catch (const pmt::wrong_type& e) { + // So we fix it: + GR_LOG_DEBUG(d_debug_logger, boost::format("Converting pair to dict: %s") % msg); + msg = pmt::dict_add(pmt::make_dict(), pmt::car(msg), pmt::cdr(msg)); } - } - /// 4) 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" - ); + /*** Start the actual message processing *************************/ + /// 1) Check if there's a time stamp + if (pmt::dict_has_key(msg, cmd_time_key())) { + size_t mboard_index = pmt::to_long(pmt::dict_ref( + msg, + cmd_mboard_key(), + pmt::from_long(::uhd::usrp::multi_usrp::ALL_MBOARDS) // Default to all mboards + )); + pmt::pmt_t timespec_p = pmt::dict_ref(msg, cmd_time_key(), pmt::PMT_NIL); + if (timespec_p == pmt::PMT_NIL) { + clear_command_time(mboard_index); + } else { + ::uhd::time_spec_t timespec( + time_t(pmt::to_uint64(pmt::car(timespec_p))), // Full secs + pmt::to_double(pmt::cdr(timespec_p)) // Frac secs + ); + GR_LOG_DEBUG(d_debug_logger, + boost::format("Setting command time on mboard %d") % + mboard_index); + set_command_time(timespec, mboard_index); + } + } + + /// 2) Read chan value + int chan = int(pmt::to_long(pmt::dict_ref(msg, + cmd_chan_key(), + pmt::from_long(-1) // Default to all chans + ))); + + /// 3) Loop through all the values + GR_LOG_DEBUG(d_debug_logger, boost::format("Processing command message %s") % msg); + pmt::pmt_t msg_items = pmt::dict_items(msg); + for (size_t i = 0; i < pmt::length(msg_items); i++) { + try { + dispatch_msg_cmd_handler(pmt::car(pmt::nth(i, msg_items)), + pmt::cdr(pmt::nth(i, msg_items)), + chan, + msg); + } catch (pmt::wrong_type& e) { + GR_LOG_ALERT(d_logger, + boost::format("Invalid command value for key %s: %s") % + pmt::car(pmt::nth(i, msg_items)) % + pmt::cdr(pmt::nth(i, msg_items))); + break; + } + } - /// 5) Check if we need to re-tune - _set_center_freq_from_internals_allchans(direction); + /// 4) 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" + ); + + /// 5) Check if we need to re-tune + _set_center_freq_from_internals_allchans(direction); } -void usrp_block_impl::dispatch_msg_cmd_handler(const pmt::pmt_t &cmd, const pmt::pmt_t &val, int chan, pmt::pmt_t &msg) +void usrp_block_impl::dispatch_msg_cmd_handler(const pmt::pmt_t& cmd, + const pmt::pmt_t& val, + int chan, + pmt::pmt_t& msg) { - if (_msg_cmd_handlers.has_key(cmd)) { - _msg_cmd_handlers[cmd](val, chan, msg); - } + if (_msg_cmd_handlers.has_key(cmd)) { + _msg_cmd_handlers[cmd](val, chan, msg); + } } -void usrp_block_impl::register_msg_cmd_handler(const pmt::pmt_t &cmd, cmd_handler_t handler) +void usrp_block_impl::register_msg_cmd_handler(const pmt::pmt_t& cmd, + cmd_handler_t handler) { - _msg_cmd_handlers[cmd] = handler; + _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) { - if (chan == -1) { - for (size_t i = 0; i < _nchan; i++) { - _update_curr_tune_req(tune_req, int(i)); + if (chan == -1) { + for (size_t i = 0; i < _nchan; i++) { + _update_curr_tune_req(tune_req, int(i)); + } + return; } - 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 - ) { - _curr_tune_req[chan] = tune_req; - _chans_to_tune.set(chan); - } + 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) { + _curr_tune_req[chan] = tune_req; + _chans_to_tune.set(chan); + } } // Default handlers: -void usrp_block_impl::_cmd_handler_freq(const pmt::pmt_t &freq_, int chan, const pmt::pmt_t &msg) -{ - double freq = pmt::to_double(freq_); - ::uhd::tune_request_t new_tune_reqest(freq); - if (pmt::dict_has_key(msg, cmd_lo_offset_key())) { - double lo_offset = pmt::to_double(pmt::dict_ref(msg, cmd_lo_offset_key(), pmt::PMT_NIL)); - new_tune_reqest = ::uhd::tune_request_t(freq, lo_offset); - } +void usrp_block_impl::_cmd_handler_freq(const pmt::pmt_t& freq_, + int chan, + const pmt::pmt_t& msg) +{ + double freq = pmt::to_double(freq_); + ::uhd::tune_request_t new_tune_reqest(freq); + if (pmt::dict_has_key(msg, cmd_lo_offset_key())) { + double lo_offset = + pmt::to_double(pmt::dict_ref(msg, cmd_lo_offset_key(), pmt::PMT_NIL)); + new_tune_reqest = ::uhd::tune_request_t(freq, lo_offset); + } - _update_curr_tune_req(new_tune_reqest, chan); + _update_curr_tune_req(new_tune_reqest, chan); } -void usrp_block_impl::_cmd_handler_looffset(const pmt::pmt_t &lo_offset, int chan, const pmt::pmt_t &msg) +void usrp_block_impl::_cmd_handler_looffset(const pmt::pmt_t& lo_offset, + int chan, + const pmt::pmt_t& msg) { - if (pmt::dict_has_key(msg, cmd_freq_key())) { - // Then it's already taken care of - return; - } + 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]; - 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; + double lo_offs = pmt::to_double(lo_offset); + ::uhd::tune_request_t new_tune_request = _curr_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); } -void usrp_block_impl::_cmd_handler_gain(const pmt::pmt_t &gain_, int chan, const pmt::pmt_t &msg) +void usrp_block_impl::_cmd_handler_gain(const pmt::pmt_t& gain_, + int chan, + const pmt::pmt_t& msg) { - double gain = pmt::to_double(gain_); - if (chan == -1) { - for (size_t i = 0; i < _nchan; i++) { - set_gain(gain, i); + double gain = pmt::to_double(gain_); + if (chan == -1) { + for (size_t i = 0; i < _nchan; i++) { + set_gain(gain, i); + } + return; } - return; - } - set_gain(gain, chan); + set_gain(gain, chan); } -void usrp_block_impl::_cmd_handler_antenna(const pmt::pmt_t &ant, int chan, const pmt::pmt_t &msg) +void usrp_block_impl::_cmd_handler_antenna(const pmt::pmt_t& ant, + int chan, + const pmt::pmt_t& msg) { - const std::string antenna(pmt::symbol_to_string(ant)); - if (chan == -1) { - for (size_t i = 0; i < _nchan; i++) { - set_antenna(antenna, i); + const std::string antenna(pmt::symbol_to_string(ant)); + if (chan == -1) { + for (size_t i = 0; i < _nchan; i++) { + set_antenna(antenna, i); + } + return; } - return; - } - set_antenna(antenna, chan); + set_antenna(antenna, chan); } -void usrp_block_impl::_cmd_handler_rate(const pmt::pmt_t &rate_, int, const pmt::pmt_t &) +void usrp_block_impl::_cmd_handler_rate(const pmt::pmt_t& rate_, int, const pmt::pmt_t&) { - const double rate = pmt::to_double(rate_); - set_samp_rate(rate); + const double rate = pmt::to_double(rate_); + set_samp_rate(rate); } -void usrp_block_impl::_cmd_handler_tune(const pmt::pmt_t &tune, int chan, const pmt::pmt_t &msg) +void usrp_block_impl::_cmd_handler_tune(const pmt::pmt_t& tune, + int chan, + const pmt::pmt_t& msg) { - double freq = pmt::to_double(pmt::car(tune)); - double lo_offset = pmt::to_double(pmt::cdr(tune)); - ::uhd::tune_request_t new_tune_reqest(freq, lo_offset); - _update_curr_tune_req(new_tune_reqest, chan); + double freq = pmt::to_double(pmt::car(tune)); + double lo_offset = pmt::to_double(pmt::cdr(tune)); + ::uhd::tune_request_t new_tune_reqest(freq, lo_offset); + _update_curr_tune_req(new_tune_reqest, chan); } -void usrp_block_impl::_cmd_handler_bw(const pmt::pmt_t &bw, int chan, const pmt::pmt_t &msg) +void usrp_block_impl::_cmd_handler_bw(const pmt::pmt_t& bw, + int chan, + const pmt::pmt_t& msg) { - double bandwidth = pmt::to_double(bw); - if (chan == -1) { - for (size_t i = 0; i < _nchan; i++) { - set_bandwidth(bandwidth, i); + double bandwidth = pmt::to_double(bw); + if (chan == -1) { + for (size_t i = 0; i < _nchan; i++) { + set_bandwidth(bandwidth, i); + } + return; } - return; - } - set_bandwidth(bandwidth, chan); + set_bandwidth(bandwidth, chan); } -void usrp_block_impl::_cmd_handler_lofreq(const pmt::pmt_t &lofreq, int chan, const pmt::pmt_t &msg) +void usrp_block_impl::_cmd_handler_lofreq(const pmt::pmt_t& lofreq, + int chan, + const pmt::pmt_t& msg) { - if (chan == -1) { - for (size_t i = 0; i < _nchan; i++) { - _cmd_handler_lofreq(lofreq, int(i), msg); + if (chan == -1) { + for (size_t i = 0; i < _nchan; i++) { + _cmd_handler_lofreq(lofreq, int(i), msg); + } + return; } - return; - } - ::uhd::tune_request_t new_tune_request = _curr_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 = pmt::to_double(pmt::dict_ref(msg, cmd_dsp_freq_key(), pmt::PMT_NIL)); - } - new_tune_request.rf_freq_policy = ::uhd::tune_request_t::POLICY_MANUAL; - new_tune_request.dsp_freq_policy = ::uhd::tune_request_t::POLICY_MANUAL; + ::uhd::tune_request_t new_tune_request = _curr_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 = + pmt::to_double(pmt::dict_ref(msg, cmd_dsp_freq_key(), pmt::PMT_NIL)); + } + 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); } -void usrp_block_impl::_cmd_handler_dspfreq(const pmt::pmt_t &dspfreq, int chan, const pmt::pmt_t &msg) +void usrp_block_impl::_cmd_handler_dspfreq(const pmt::pmt_t& dspfreq, + int chan, + const pmt::pmt_t& msg) { - if (pmt::dict_has_key(msg, cmd_lo_freq_key())) { - // Then it's already dealt with - return; - } + if (pmt::dict_has_key(msg, cmd_lo_freq_key())) { + // Then it's already dealt with + return; + } - if (chan == -1) { - for (size_t i = 0; i < _nchan; i++) { - _cmd_handler_dspfreq(dspfreq, int(i), msg); + if (chan == -1) { + for (size_t i = 0; i < _nchan; i++) { + _cmd_handler_dspfreq(dspfreq, int(i), msg); + } + return; } - return; - } - ::uhd::tune_request_t new_tune_request = _curr_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; + ::uhd::tune_request_t new_tune_request = _curr_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); } |