From 0a89472e5235bb9d3b6872271c23cb167c5d430c Mon Sep 17 00:00:00 2001
From: Josh Morman <mormjb@gmail.com>
Date: Fri, 26 Jun 2020 09:08:55 -0400
Subject: uhd: wrap get_usrp_info to compatible return type

- Move get_usrp_info() to usrp_block
- Casts the return value to std::map so PyBind11 can turn it into
  a dictionary in Python

This fixes an issue where get_usrp_info() would cause an Exception with
PyBind11.

Co-authored-by: Martin Braun <martin.braun@ettus.com>
---
 .../uhd/bindings/docstrings/usrp_block_pydoc_template.h     |  3 +++
 .../uhd/bindings/docstrings/usrp_sink_pydoc_template.h      |  3 ---
 .../uhd/bindings/docstrings/usrp_source_pydoc_template.h    |  3 ---
 gr-uhd/python/uhd/bindings/usrp_block_python.cc             | 13 ++++++++++++-
 gr-uhd/python/uhd/bindings/usrp_sink_python.cc              |  6 ------
 gr-uhd/python/uhd/bindings/usrp_source_python.cc            |  6 ------
 6 files changed, 15 insertions(+), 19 deletions(-)

(limited to 'gr-uhd/python/uhd')

diff --git a/gr-uhd/python/uhd/bindings/docstrings/usrp_block_pydoc_template.h b/gr-uhd/python/uhd/bindings/docstrings/usrp_block_pydoc_template.h
index 3ef0dd728b..ed951cc3a3 100644
--- a/gr-uhd/python/uhd/bindings/docstrings/usrp_block_pydoc_template.h
+++ b/gr-uhd/python/uhd/bindings/docstrings/usrp_block_pydoc_template.h
@@ -186,6 +186,9 @@ static const char* __doc_gr_uhd_usrp_block_set_filter = R"doc()doc";
 static const char* __doc_gr_uhd_usrp_block_get_filter = R"doc()doc";
 
 
+static const char* __doc_gr_uhd_usrp_block_get_usrp_info = R"doc()doc";
+
+
 static const char* __doc_gr_uhd_cmd_chan_key = R"doc()doc";
 
 
diff --git a/gr-uhd/python/uhd/bindings/docstrings/usrp_sink_pydoc_template.h b/gr-uhd/python/uhd/bindings/docstrings/usrp_sink_pydoc_template.h
index 233a1f4c3c..3227dede50 100644
--- a/gr-uhd/python/uhd/bindings/docstrings/usrp_sink_pydoc_template.h
+++ b/gr-uhd/python/uhd/bindings/docstrings/usrp_sink_pydoc_template.h
@@ -30,9 +30,6 @@ static const char* __doc_gr_uhd_usrp_sink_make = R"doc()doc";
 static const char* __doc_gr_uhd_usrp_sink_set_start_time = R"doc()doc";
 
 
-static const char* __doc_gr_uhd_usrp_sink_get_usrp_info = R"doc()doc";
-
-
 static const char* __doc_gr_uhd_usrp_sink_get_lo_names = R"doc()doc";
 
 
diff --git a/gr-uhd/python/uhd/bindings/docstrings/usrp_source_pydoc_template.h b/gr-uhd/python/uhd/bindings/docstrings/usrp_source_pydoc_template.h
index f2d93f03a0..6eb5584be6 100644
--- a/gr-uhd/python/uhd/bindings/docstrings/usrp_source_pydoc_template.h
+++ b/gr-uhd/python/uhd/bindings/docstrings/usrp_source_pydoc_template.h
@@ -36,9 +36,6 @@ static const char* __doc_gr_uhd_usrp_source_issue_stream_cmd = R"doc()doc";
 static const char* __doc_gr_uhd_usrp_source_set_recv_timeout = R"doc()doc";
 
 
-static const char* __doc_gr_uhd_usrp_source_get_usrp_info = R"doc()doc";
-
-
 static const char* __doc_gr_uhd_usrp_source_get_lo_names = R"doc()doc";
 
 
diff --git a/gr-uhd/python/uhd/bindings/usrp_block_python.cc b/gr-uhd/python/uhd/bindings/usrp_block_python.cc
index d816a1668d..876dfb52d0 100644
--- a/gr-uhd/python/uhd/bindings/usrp_block_python.cc
+++ b/gr-uhd/python/uhd/bindings/usrp_block_python.cc
@@ -388,7 +388,18 @@ void bind_usrp_block(py::module& m)
              py::arg("path"),
              D(usrp_block, get_filter))
 
-        ;
+        .def(
+            "get_usrp_info",
+            [](usrp_block& self, const size_t chan = 0) {
+                std::map<std::string, std::string> new_map;
+                auto usrp_info = self.get_usrp_info(chan);
+                for (const auto& k : self.get_usrp_info(chan).keys()) {
+                    new_map[k] = usrp_info[k];
+                }
+                return new_map;
+            },
+            py::arg("chan") = 0,
+            D(usrp_block, get_usrp_info));
 
 
     m.def("cmd_chan_key", &::gr::uhd::cmd_chan_key, D(cmd_chan_key));
diff --git a/gr-uhd/python/uhd/bindings/usrp_sink_python.cc b/gr-uhd/python/uhd/bindings/usrp_sink_python.cc
index d0a7dc482d..2ad0c599d1 100644
--- a/gr-uhd/python/uhd/bindings/usrp_sink_python.cc
+++ b/gr-uhd/python/uhd/bindings/usrp_sink_python.cc
@@ -57,12 +57,6 @@ void bind_usrp_sink(py::module& m)
              D(usrp_sink, set_start_time))
 
 
-        .def("get_usrp_info",
-             &usrp_sink::get_usrp_info,
-             py::arg("chan") = 0,
-             D(usrp_sink, get_usrp_info))
-
-
         .def("get_lo_names",
              &usrp_sink::get_lo_names,
              py::arg("chan") = 0,
diff --git a/gr-uhd/python/uhd/bindings/usrp_source_python.cc b/gr-uhd/python/uhd/bindings/usrp_source_python.cc
index 19f3d6017d..29cd19e267 100644
--- a/gr-uhd/python/uhd/bindings/usrp_source_python.cc
+++ b/gr-uhd/python/uhd/bindings/usrp_source_python.cc
@@ -70,12 +70,6 @@ void bind_usrp_source(py::module& m)
              D(usrp_source, set_recv_timeout))
 
 
-        .def("get_usrp_info",
-             &usrp_source::get_usrp_info,
-             py::arg("chan") = 0,
-             D(usrp_source, get_usrp_info))
-
-
         .def("get_lo_names",
              &usrp_source::get_lo_names,
              py::arg("chan") = 0,
-- 
cgit v1.2.3