diff options
Diffstat (limited to 'gr-uhd/python/uhd/bindings')
-rw-r--r-- | gr-uhd/python/uhd/bindings/CMakeLists.txt | 1 | ||||
-rw-r--r-- | gr-uhd/python/uhd/bindings/python_bindings.cc | 9 | ||||
-rw-r--r-- | gr-uhd/python/uhd/bindings/uhd_types_python.cc | 155 | ||||
-rw-r--r-- | gr-uhd/python/uhd/bindings/usrp_sink_python.cc | 22 | ||||
-rw-r--r-- | gr-uhd/python/uhd/bindings/usrp_source_python.cc | 22 |
5 files changed, 203 insertions, 6 deletions
diff --git a/gr-uhd/python/uhd/bindings/CMakeLists.txt b/gr-uhd/python/uhd/bindings/CMakeLists.txt index 880885462d..8d123da16c 100644 --- a/gr-uhd/python/uhd/bindings/CMakeLists.txt +++ b/gr-uhd/python/uhd/bindings/CMakeLists.txt @@ -5,6 +5,7 @@ include(GrPybind) ######################################################################## list(APPEND uhd_python_files + uhd_types_python.cc amsg_source_python.cc usrp_block_python.cc usrp_sink_python.cc diff --git a/gr-uhd/python/uhd/bindings/python_bindings.cc b/gr-uhd/python/uhd/bindings/python_bindings.cc index eeb7c6e430..e32d1b48cc 100644 --- a/gr-uhd/python/uhd/bindings/python_bindings.cc +++ b/gr-uhd/python/uhd/bindings/python_bindings.cc @@ -13,8 +13,11 @@ #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION #include <numpy/arrayobject.h> +#include <uhd/version.hpp> + namespace py = pybind11; +void bind_uhd_types(py::module&); void bind_amsg_source(py::module&); void bind_usrp_block(py::module&); void bind_usrp_sink(py::module&); @@ -39,8 +42,14 @@ PYBIND11_MODULE(uhd_python, m) // Allow access to base block methods py::module::import("gnuradio.gr"); + bind_uhd_types(m); bind_amsg_source(m); bind_usrp_block(m); bind_usrp_sink(m); bind_usrp_source(m); + + m.def( + "get_version_string", + []() { return ::uhd::get_version_string(); }, + "Returns UHD Version String"); } diff --git a/gr-uhd/python/uhd/bindings/uhd_types_python.cc b/gr-uhd/python/uhd/bindings/uhd_types_python.cc new file mode 100644 index 0000000000..fc4cfb86f2 --- /dev/null +++ b/gr-uhd/python/uhd/bindings/uhd_types_python.cc @@ -0,0 +1,155 @@ +/* + * Copyright 2020 Free Software Foundation, Inc. + * + * This file is part of GNU Radio + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +/* This file is automatically generated using bindtool */ + +#include <pybind11/complex.h> +#include <pybind11/operators.h> +#include <pybind11/pybind11.h> +#include <pybind11/stl.h> + +namespace py = pybind11; + +#include <gnuradio/uhd/uhd_types.h> + +void bind_uhd_types(py::module& m) +{ + // Bindings copied from UHD + + using str_map = std::map<std::string, std::string>; + + py::class_<::uhd::device_addr_t>(m, "device_addr_t") + // Constructors + .def(py::init<>()) + .def(py::init<std::string>()) + .def(py::init<str_map>()) + + // Methods + .def("__str__", &uhd::device_addr_t::to_pp_string) + .def("to_string", &uhd::device_addr_t::to_string) + .def("to_pp_string", &uhd::device_addr_t::to_pp_string); + + // This will allow functions in Python that take a device_addr to also take + // a string: + py::implicitly_convertible<std::string, uhd::device_addr_t>(); + + using stream_args_t = ::uhd::stream_args_t; + py::class_<stream_args_t>(m, "stream_args_t") + .def(py::init<const std::string&, const std::string&>()) + // Properties + .def_readwrite("cpu_format", &stream_args_t::cpu_format) + .def_readwrite("otw_format", &stream_args_t::otw_format) + .def_readwrite("args", &stream_args_t::args) + .def_readwrite("channels", &stream_args_t::channels); + + + // ::uhd::time_spec_t + using time_spec_t = ::uhd::time_spec_t; + + py::class_<time_spec_t>(m, "time_spec_t") + // Additional constructors + .def(py::init<double>()) + .def(py::init<int64_t, double>()) + .def(py::init<int64_t, long, double>()) + + // Methods + .def_static("from_ticks", &time_spec_t::from_ticks) + + .def("get_tick_count", &time_spec_t::get_tick_count) + .def("to_ticks", &time_spec_t::to_ticks) + .def("get_real_secs", &time_spec_t::get_real_secs) + .def("get_full_secs", &time_spec_t::get_full_secs) + .def("get_frac_secs", &time_spec_t::get_frac_secs) + + .def(py::self += time_spec_t()) + .def(py::self -= time_spec_t()) + .def(py::self + time_spec_t()) + .def(py::self - time_spec_t()) + .def(py::self += double()) + .def(py::self -= double()) + .def(py::self + double()) + .def(py::self - double()); + + // ::uhd::stream_cmd_t + using stream_cmd_t = ::uhd::stream_cmd_t; + py::class_<stream_cmd_t>(m, "stream_cmd_t") + .def(py::init<stream_cmd_t::stream_mode_t>()) + // Properties + .def_readwrite("num_samps", &stream_cmd_t::num_samps) + .def_readwrite("time_spec", &stream_cmd_t::time_spec) + .def_readwrite("stream_now", &stream_cmd_t::stream_now); + + // ::uhd::meta_range_t + using meta_range_t = ::uhd::meta_range_t; + + py::class_<meta_range_t>(m, "meta_range_t") + // Constructors + .def(py::init<>()) + .def(py::init<double, double>()) + .def(py::init<double, double, double>()) + + // Methods + .def("start", &meta_range_t::start) + .def("stop", &meta_range_t::stop) + .def("step", &meta_range_t::step) + .def("clip", &meta_range_t::clip, py::arg("value"), py::arg("clip_step") = false) + .def("__str__", &meta_range_t::to_pp_string); + + // ::uhd::tune_result_t + using tune_result_t = ::uhd::tune_result_t; + py::class_<tune_result_t>(m, "tune_result_t") + .def(py::init<>()) + .def_readwrite("clipped_rf_freq", &tune_result_t::clipped_rf_freq) + .def_readwrite("target_rf_freq", &tune_result_t::target_rf_freq) + .def_readwrite("actual_rf_freq", &tune_result_t::actual_rf_freq) + .def_readwrite("target_dsp_freq", &tune_result_t::target_dsp_freq) + .def_readwrite("actual_dsp_freq", &tune_result_t::actual_dsp_freq) + .def("__str__", &tune_result_t::to_pp_string); + + // ::uhd::tune_request_t + using tune_request_t = ::uhd::tune_request_t; + py::class_<tune_request_t>(m, "tune_request_t") + .def(py::init<double, double>()) + .def(py::init<double>(), py::arg("target_freq") = 0.0) + .def_readwrite("target_freq", &tune_request_t::target_freq) + .def_readwrite("rf_freq_policy", &tune_request_t::rf_freq_policy) + .def_readwrite("dsp_freq_policy", &tune_request_t::dsp_freq_policy) + .def_readwrite("rf_freq", &tune_request_t::rf_freq) + .def_readwrite("dsp_freq", &tune_request_t::dsp_freq) + .def_readwrite("args", &tune_request_t::args); + + + // ::uhd::sensor_value_t + using sensor_value_t = uhd::sensor_value_t; + + py::class_<sensor_value_t>(m, "sensor_value_t") + // Constructors + .def(py::init<const std::string&, bool, const std::string&, const std::string&>()) + .def(py::init<const std::string&, + signed, + const std::string&, + const std::string&>()) + .def(py::init<const std::string&, + double, + const std::string&, + const std::string&>()) + .def(py::init<const std::string&, const std::string&, const std::string&>()) + + // Methods + .def("to_bool", &sensor_value_t::to_bool) + .def("to_int", &sensor_value_t::to_int) + .def("to_real", &sensor_value_t::to_real) + .def("__str__", &sensor_value_t::to_pp_string) + + // Properties + .def_readwrite("name", &sensor_value_t::name) + .def_readwrite("value", &sensor_value_t::value) + .def_readwrite("unit", &sensor_value_t::unit) + .def_readwrite("type", &sensor_value_t::type); +} diff --git a/gr-uhd/python/uhd/bindings/usrp_sink_python.cc b/gr-uhd/python/uhd/bindings/usrp_sink_python.cc index bbc8ee0fe4..d0a7dc482d 100644 --- a/gr-uhd/python/uhd/bindings/usrp_sink_python.cc +++ b/gr-uhd/python/uhd/bindings/usrp_sink_python.cc @@ -25,10 +25,26 @@ void bind_usrp_sink(py::module& m) using usrp_sink = ::gr::uhd::usrp_sink; - py::class_<usrp_sink, gr::uhd::usrp_block, std::shared_ptr<usrp_sink>>( - m, "usrp_sink", D(usrp_sink)) + py::class_<usrp_sink, + gr::uhd::usrp_block, + gr::sync_block, + gr::block, + gr::basic_block, + std::shared_ptr<usrp_sink>>(m, "usrp_sink", D(usrp_sink)) + + .def(py::init((std::shared_ptr<gr::uhd::usrp_sink>(*)(const ::uhd::device_addr_t&, + const ::uhd::stream_args_t&, + const std::string&)) & + usrp_sink::make), + py::arg("device_addr"), + py::arg("stream_args"), + py::arg("tsb_tag_name") = "", + D(usrp_sink, make)) - .def(py::init(&usrp_sink::make), + .def(py::init((std::shared_ptr<gr::uhd::usrp_sink>(*)(const std::string&, + const ::uhd::stream_args_t&, + const std::string&)) & + usrp_sink::make), py::arg("device_addr"), py::arg("stream_args"), py::arg("tsb_tag_name") = "", diff --git a/gr-uhd/python/uhd/bindings/usrp_source_python.cc b/gr-uhd/python/uhd/bindings/usrp_source_python.cc index 6834e23cd8..19f3d6017d 100644 --- a/gr-uhd/python/uhd/bindings/usrp_source_python.cc +++ b/gr-uhd/python/uhd/bindings/usrp_source_python.cc @@ -25,10 +25,26 @@ void bind_usrp_source(py::module& m) using usrp_source = ::gr::uhd::usrp_source; - py::class_<usrp_source, gr::uhd::usrp_block, std::shared_ptr<usrp_source>>( - m, "usrp_source", D(usrp_source)) + py::class_<usrp_source, + gr::uhd::usrp_block, + gr::sync_block, + gr::block, + gr::basic_block, + std::shared_ptr<usrp_source>>(m, "usrp_source", D(usrp_source)) + + .def(py::init( + (std::shared_ptr<gr::uhd::usrp_source>(*)(const ::uhd::device_addr_t&, + const ::uhd::stream_args_t&, + const bool)) & + usrp_source::make), + py::arg("device_addr"), + py::arg("stream_args"), + py::arg("issue_stream_cmd_on_start") = true, + D(usrp_source, make)) - .def(py::init(&usrp_source::make), + .def(py::init((std::shared_ptr<gr::uhd::usrp_source>(*)( + const std::string&, const ::uhd::stream_args_t&, const bool)) & + usrp_source::make), py::arg("device_addr"), py::arg("stream_args"), py::arg("issue_stream_cmd_on_start") = true, |