aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2020-10-12 12:22:00 +0200
committerAaron Rossetto <aaron.rossetto@ni.com>2020-10-16 14:58:15 -0500
commit7ee106187e1d0991e7ae79abd905a79dc5760b5f (patch)
tree4cf445e5b170817692567120e8506e20f5afb878
parent0167ad7608adb170970458b19735738808f0c5c8 (diff)
downloaduhd-7ee106187e1d0991e7ae79abd905a79dc5760b5f.tar.gz
uhd-7ee106187e1d0991e7ae79abd905a79dc5760b5f.tar.bz2
uhd-7ee106187e1d0991e7ae79abd905a79dc5760b5f.zip
python: Add access to the property_tree from Python
Example: >>> usrp = uhd.usrp.multi_usrp("") >>> tree = usrp.get_tree() >>> print(tree.access_int("/name").get())
-rw-r--r--host/lib/property_tree_python.cpp61
-rw-r--r--host/lib/property_tree_python.hpp11
-rw-r--r--host/lib/usrp/multi_usrp_python.cpp4
-rw-r--r--host/python/CMakeLists.txt1
-rw-r--r--host/python/pyuhd.cpp4
-rw-r--r--host/python/uhd/__init__.py3
-rw-r--r--host/python/uhd/property_tree.py12
7 files changed, 96 insertions, 0 deletions
diff --git a/host/lib/property_tree_python.cpp b/host/lib/property_tree_python.cpp
new file mode 100644
index 000000000..0b7f18aa2
--- /dev/null
+++ b/host/lib/property_tree_python.cpp
@@ -0,0 +1,61 @@
+//
+// Copyright 2020 Ettus Research, a National Instruments Brand
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+
+#include "property_tree_python.hpp"
+#include <uhd/property_tree.hpp>
+#include <pybind11/pybind11.h>
+#include <pybind11/stl.h>
+#include <string>
+
+namespace py = pybind11;
+
+template <typename T>
+void export_property(py::module& m, const std::string& type_str)
+{
+ const std::string classname = std::string("property__") + type_str;
+ py::class_<uhd::property<T>>(m, classname.c_str())
+ .def("get", &uhd::property<T>::get)
+ .def("get_desired", &uhd::property<T>::get_desired)
+ .def("set", &uhd::property<T>::set)
+ .def("set_coerced", &uhd::property<T>::set_coerced);
+}
+
+void export_property_tree(py::module& m)
+{
+ using property_tree = uhd::property_tree;
+ using fs_path = uhd::fs_path;
+
+ py::class_<fs_path>(m, "fs_path")
+ // Constructors
+ .def(py::init<>())
+ .def(py::init<std::string>());
+ py::implicitly_convertible<std::string, fs_path>();
+
+ // Per type we want to expose, add one line here, and one accessor below
+ export_property<int>(m, "int");
+ export_property<double>(m, "double");
+ export_property<std::string>(m, "str");
+ export_property<bool>(m, "bool");
+
+ py::class_<property_tree>(m, "property_tree")
+ .def("subtree", &property_tree::subtree, py::arg("path"))
+ .def("exists", &property_tree::exists, py::arg("path"))
+ .def("list", &property_tree::list, py::arg("path"))
+ // One line per type
+ .def(
+ "access_int", &property_tree::access<int>, py::return_value_policy::reference)
+ .def("access_double",
+ &property_tree::access<double>,
+ py::return_value_policy::reference)
+ .def("access_str",
+ &property_tree::access<std::string>,
+ py::return_value_policy::reference)
+ .def("access_bool",
+ &property_tree::access<bool>,
+ py::return_value_policy::reference)
+ // End of types
+ ;
+}
diff --git a/host/lib/property_tree_python.hpp b/host/lib/property_tree_python.hpp
new file mode 100644
index 000000000..c16dacfe3
--- /dev/null
+++ b/host/lib/property_tree_python.hpp
@@ -0,0 +1,11 @@
+//
+// Copyright 2020 Ettus Research, a National Instruments Brand
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+
+#pragma once
+
+#include <pybind11/pybind11.h>
+
+void export_property_tree(pybind11::module& m);
diff --git a/host/lib/usrp/multi_usrp_python.cpp b/host/lib/usrp/multi_usrp_python.cpp
index 602fc5178..c1ee17d0b 100644
--- a/host/lib/usrp/multi_usrp_python.cpp
+++ b/host/lib/usrp/multi_usrp_python.cpp
@@ -5,7 +5,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include <pybind11/complex.h>
#include <pybind11/pybind11.h>
+#include <pybind11/stl.h>
namespace py = pybind11;
@@ -27,6 +29,8 @@ void export_multi_usrp(py::module& m)
.def(py::init(&multi_usrp::make))
// clang-format off
+ .def("get_tree" , &multi_usrp::get_tree)
+
// General USRP methods
.def("get_rx_freq" , &multi_usrp::get_rx_freq, py::arg("chan") = 0)
.def("get_rx_num_channels" , &multi_usrp::get_rx_num_channels)
diff --git a/host/python/CMakeLists.txt b/host/python/CMakeLists.txt
index d4417903d..1e9fefa43 100644
--- a/host/python/CMakeLists.txt
+++ b/host/python/CMakeLists.txt
@@ -31,6 +31,7 @@ execute_process(
# Build pyuhd library
add_library(pyuhd SHARED
pyuhd.cpp
+ ${CMAKE_SOURCE_DIR}/lib/property_tree_python.cpp
${CMAKE_SOURCE_DIR}/lib/usrp/multi_usrp_python.cpp
)
# python expects extension modules with a particular suffix
diff --git a/host/python/pyuhd.cpp b/host/python/pyuhd.cpp
index bb564c276..eadb88d40 100644
--- a/host/python/pyuhd.cpp
+++ b/host/python/pyuhd.cpp
@@ -14,6 +14,7 @@
namespace py = pybind11;
#include "cal/cal_python.hpp"
+#include "property_tree_python.hpp"
#include "rfnoc/ddc_block_control_python.hpp"
#include "rfnoc/duc_block_control_python.hpp"
#include "rfnoc/fft_block_control_python.hpp"
@@ -110,4 +111,7 @@ PYBIND11_MODULE(libpyuhd, m)
auto chdr_module = m.def_submodule("chdr", "CHDR Parsing");
export_utils(chdr_module);
+
+ // Register property tree
+ export_property_tree(m);
}
diff --git a/host/python/uhd/__init__.py b/host/python/uhd/__init__.py
index 99c10c3b1..bf11ac513 100644
--- a/host/python/uhd/__init__.py
+++ b/host/python/uhd/__init__.py
@@ -14,3 +14,6 @@ from . import rfnoc
from . import dsp
from . import chdr
from .libpyuhd.paths import *
+from .property_tree import PropertyTree
+
+
diff --git a/host/python/uhd/property_tree.py b/host/python/uhd/property_tree.py
new file mode 100644
index 000000000..02c6d108c
--- /dev/null
+++ b/host/python/uhd/property_tree.py
@@ -0,0 +1,12 @@
+#
+# Copyright 2020 Ettus Research, a National Instruments Brand
+#
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+"""
+Access to the property tree
+"""
+
+from . import libpyuhd as lib
+
+PropertyTree = lib.property_tree