diff options
author | Mark Meserve <mark.meserve@ni.com> | 2019-01-08 16:03:57 -0600 |
---|---|---|
committer | Brent Stapleton <brent.stapleton@ettus.com> | 2019-01-10 09:50:16 -0800 |
commit | 3ac6448a8647e41db130449bf2ba1866059a09b1 (patch) | |
tree | e1056cdee2aa57fc15ae003fd56dc4fda906e195 | |
parent | 9b9da62e800ed88123c3bae7abecd5603ead0f7e (diff) | |
download | uhd-3ac6448a8647e41db130449bf2ba1866059a09b1.tar.gz uhd-3ac6448a8647e41db130449bf2ba1866059a09b1.tar.bz2 uhd-3ac6448a8647e41db130449bf2ba1866059a09b1.zip |
rh: add support for identify arg
-rw-r--r-- | host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.cpp | 49 | ||||
-rw-r--r-- | host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.hpp | 3 |
2 files changed, 40 insertions, 12 deletions
diff --git a/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.cpp b/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.cpp index 61e2d2550..17c645270 100644 --- a/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.cpp +++ b/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.cpp @@ -34,7 +34,7 @@ namespace { constexpr char TX_FE_CONNECTION_LOWBAND[] = "QI"; constexpr char TX_FE_CONNECTION_HIGHBAND[] = "IQ"; - constexpr int DEFAULT_IDENTIFY_DURATION = 5; // seconds + constexpr double DEFAULT_IDENTIFY_DURATION = 5.0; // seconds const fs_path TX_FE_PATH = fs_path("tx_frontends") / 0 / "tune_args"; const fs_path RX_FE_PATH = fs_path("rx_frontends") / 0 / "tune_args"; @@ -362,6 +362,26 @@ double rhodium_radio_ctrl_impl::set_rx_gain( return index; } +void rhodium_radio_ctrl_impl::_identify_with_leds( + double identify_duration +) { + auto duration_ms = static_cast<uint64_t>(identify_duration * 1000); + auto end_time = + std::chrono::steady_clock::now() + std::chrono::milliseconds(duration_ms); + bool led_state = true; + { + std::lock_guard<std::mutex> lock(_ant_mutex); + while (std::chrono::steady_clock::now() < end_time) { + auto atr = led_state ? (LED_RX | LED_RX2 | LED_TX) : 0; + _gpio->set_atr_reg(gpio_atr::ATR_REG_IDLE, atr, RHODIUM_GPIO_MASK); + led_state = !led_state; + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + } + } + _update_atr(get_tx_antenna(0), TX_DIRECTION); + _update_atr(get_rx_antenna(0), RX_DIRECTION); +} + void rhodium_radio_ctrl_impl::_update_atr( const std::string& ant, const direction_t dir @@ -616,19 +636,24 @@ void rhodium_radio_ctrl_impl::set_rpc_client( _init_defaults(); _init_peripherals(); _init_prop_tree(); - } - if (block_args.has_key("identify")) { - const std::string identify_val = block_args.get("identify"); - int identify_duration = std::atoi(identify_val.c_str()); - if (identify_duration == 0) { - identify_duration = DEFAULT_IDENTIFY_DURATION; + if (block_args.has_key("identify")) { + const std::string identify_val = block_args.get("identify"); + double identify_duration = 0.0; + try { + identify_duration = std::stod(identify_val); + if (!std::isnormal(identify_duration)) { + identify_duration = DEFAULT_IDENTIFY_DURATION; + } + } catch (std::invalid_argument) { + identify_duration = DEFAULT_IDENTIFY_DURATION; + } + + UHD_LOG_INFO(unique_id(), + "Running LED identification process for " << identify_duration + << " seconds."); + _identify_with_leds(identify_duration); } - // TODO: Update this when LED control is added - //UHD_LOG_INFO(unique_id(), - // "Running LED identification process for " << identify_duration - // << " seconds."); - //_identify_with_leds(identify_duration); } } diff --git a/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.hpp b/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.hpp index 0cd29cc99..aaa48564e 100644 --- a/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.hpp +++ b/host/lib/usrp/dboard/rhodium/rhodium_radio_ctrl_impl.hpp @@ -210,6 +210,9 @@ private: const direction_t dir ); + //! Flash all front end LEDs at 1 Hz for the specified amount of time + void _identify_with_leds(double identify_duration); + //! Configure ATR registers and update the cached antenna value from the // new antenna value. // ATR registers control SW10 and the frontend LEDs. |