summaryrefslogtreecommitdiff
path: root/gr-uhd/lib/usrp_block_impl.cc
diff options
context:
space:
mode:
authorNiki <niki@aveer.io>2020-07-09 17:27:52 -0400
committerMartin Braun <martin@gnuradio.org>2021-01-14 08:32:51 -0800
commit9aac44a5d4af07254b446c5e77237e8707325cb6 (patch)
tree682ed08514caf7e5923cae103c4ff24d6533b101 /gr-uhd/lib/usrp_block_impl.cc
parent7bd7a81370d1ef1fb15240fa0a6d52fda0ee6dc1 (diff)
uhd: Add GPIO handlers for messages
This allows toggling GPIOs via messages. 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.cc43
1 files changed, 43 insertions, 0 deletions
diff --git a/gr-uhd/lib/usrp_block_impl.cc b/gr-uhd/lib/usrp_block_impl.cc
index f258e2ae80..c117b8651e 100644
--- a/gr-uhd/lib/usrp_block_impl.cc
+++ b/gr-uhd/lib/usrp_block_impl.cc
@@ -102,6 +102,12 @@ const pmt::pmt_t gr::uhd::cmd_tag_key()
return val;
}
+const pmt::pmt_t gr::uhd::cmd_gpio_key()
+{
+ static const pmt::pmt_t val = pmt::mp("gpio");
+ return val;
+}
+
const pmt::pmt_t gr::uhd::ant_direction_rx()
{
static const pmt::pmt_t val = pmt::mp("RX");
@@ -150,6 +156,7 @@ usrp_block_impl::usrp_block_impl(const ::uhd::device_addr_t& device_addr,
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);
+ REGISTER_CMD_HANDLER(cmd_gpio_key(), _cmd_handler_gpio);
}
usrp_block_impl::~usrp_block_impl()
@@ -693,6 +700,42 @@ void usrp_block_impl::_cmd_handler_antenna(const pmt::pmt_t& ant,
set_antenna(antenna, chan);
}
+void usrp_block_impl::_cmd_handler_gpio(const pmt::pmt_t& gpio_attr,
+ int chan,
+ const pmt::pmt_t& msg)
+{
+ size_t mboard = pmt::to_long(pmt::dict_ref(
+ msg,
+ cmd_mboard_key(),
+ // pmt::from_long(::uhd::usrp::multi_usrp::ALL_MBOARDS) // Default to all mboards
+ pmt::from_long(0) // default to first mboard
+ ));
+
+ if (!pmt::is_dict(gpio_attr)) {
+ GR_LOG_ERROR(d_logger,
+ boost::format("gpio_attr in message is neither dict nor pair: %s") %
+ gpio_attr);
+ return;
+ }
+ if (!pmt::dict_has_key(gpio_attr, pmt::mp("bank")) ||
+ !pmt::dict_has_key(gpio_attr, pmt::mp("attr")) ||
+ !pmt::dict_has_key(gpio_attr, pmt::mp("value")) ||
+ !pmt::dict_has_key(gpio_attr, pmt::mp("mask"))) {
+ GR_LOG_ERROR(
+ d_logger,
+ boost::format("gpio_attr message must include bank, attr, value and mask"));
+ return;
+ }
+ std::string bank =
+ pmt::symbol_to_string(pmt::dict_ref(gpio_attr, pmt::mp("bank"), pmt::mp("")));
+ std::string attr =
+ pmt::symbol_to_string(pmt::dict_ref(gpio_attr, pmt::mp("attr"), pmt::mp("")));
+ uint32_t value = pmt::to_double(pmt::dict_ref(gpio_attr, pmt::mp("value"), 0));
+ uint32_t mask = pmt::to_double(pmt::dict_ref(gpio_attr, pmt::mp("mask"), 0));
+
+ set_gpio_attr(bank, attr, value, mask, mboard);
+}
+
void usrp_block_impl::_cmd_handler_rate(const pmt::pmt_t& rate_, int, const pmt::pmt_t&)
{
const double rate = pmt::to_double(rate_);