aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* python: Add find() to the Python APIMartin Braun2020-12-075-0/+34
| | | | | | | | | | | | This a mapping of uhd::device::find() into uhd.find() on the Python side. The uhd::device is intentionally not mapped into Python (prefer MultiUSRP or RfnocGraph instead), so the namespace is moved up one level. Example: >>> import uhd >>> # Now print the device args for all found B200s: >>> for dev_args in uhd.find("type=b200")): print(dev_args.to_string())
* mpm: rpc_server: fix get_log_buf for MPM ShellJoerg Hofrichter2020-12-041-1/+2
| | | | | Fix the issue that the method 'get_log_buf' was not accessible from MPM Shell.
* fixup! mpm: Use prefs API in logging moduleJoerg Hofrichter2020-12-041-2/+2
|
* python: multi_usrp: Add get_mpm_client() API callMartin Braun2020-12-042-2/+39
| | | | | | | | | | | This is a new API call, only available on Python, and only available for MPM devices (it is added dynamically). It returns an object that allows calling RPC calls in a Pythonic manner. Example: >>> rpcc = usrp.get_mpm_client() >>> print(rpcc.get_device_info()) # Will print device info, as returned # by uhd_find_devices
* python: Add mpmtools moduleMartin Braun2020-12-041-0/+173
| | | | | This adds tools to create MPM clients and talk to MPM through Python scripts.
* mpmd: Export RPC token and mb_args to the property treeMartin Braun2020-12-043-0/+13
| | | | | | There are applications (typically for debugging purposes) which need access to the token and the mb_args. They are thus published via the property tree.
* docs: mpm: correct ? notation to display helpJoerg Hofrichter2020-12-041-2/+2
| | | | | For displaying the docstring of a command, the ? character needs to be prepended to the command, not appended.
* multi_usrp_rfnoc: Serialize make_rfnoc_deviceAaron Rossetto2020-12-041-1/+24
| | | | | | | | | | | | | | | In certain execution environments (e.g. NI's LabVIEW), the instantiation of multi_usrp objects may execute in parallel in two different threads. As the RFNoC block instances are shared between the multi_usrp instances, there is a risk that threads racing to configure the initial state of the Tx and Rx chains may operate on inconsistent or incomplete views of the state of the RFNoC blocks that make up the chain, leaving them in an invalid state that leads to client-facing errors. This commit serializes calls to make_rfnoc_device to prevent creating multiple multi_usrp objects in parallel. It also creates a map of existing multi_usrp devices and returns the existing multi_usrp object if it exists.
* fpga: lib: add glitch free mux moduleMax Köhler2020-12-032-0/+30
|
* python: Make TuneRequest implicitly convertible from doubleMartin Braun2020-12-011-0/+1
| | | | | | | | | | This allows to do the following: >>> usrp = uhd.usrp.MultiUSRP(args) >>> usrp.set_tx_frequency(1e9) In the past, you would have to manually convert the frequency to a uhd.types.TuneRequest before passing it to set_?x_frequency(). This new behaviour makes Python match the C++ behaviour.
* python: multi_usrp: Let get_tree() return a raw pointerMartin Braun2020-12-011-1/+1
| | | | | | | | | | | | | | | | | | This changes the Python version of MultiUSRP.get_tree() such that it returns a raw pointer to the tree instead of returning the sptr. This fixes an issue where calling get_tree() will reliably cause a segfault during garbage collection, at least on some USRPs. The downside of this approach is that storing the return value from get_tree() can produce a dangling pointer when the underlying object is destroyed. It's still better than segfaults, and the recommended way to use get_tree() anyway is not to store the return value (unless it's in a local scope), but tack on property tree methods to get_tree() itself. Examples: >>> usrp = uhd.usrp.MultiUSRP('...') >>> usrp.get_tree().exists('/path/to/prop') # This is fine This change has no noticable API changes.
* tools: Rfnoc dissectors are now built and named based on CHDR widthCristina Fuentes2020-12-013-158/+173
|
* tools: Update rfnoc dissector to support multiple CHDR widths.Cristina Fuentes2020-12-012-11/+31
|
* python: Improve access to device_addr_tMartin Braun2020-11-232-1/+9
| | | | | | | | This makes two changes: - Add device_addr_t as a type that the Python property tree access can handle - Add a to_dict() call to device_addr_t (in Python) that will return a regular dictionary from a device_addr_t for a more Pythonic access.
* python: multi_usrp: Fix get_radio_control()Martin Braun2020-11-231-1/+1
| | | | | | | | This function was incorrectly wrapped into Python and would fail with Python saying it can't hold a reference to the radio block. This changes the wrapping into returning a raw pointer, but also makes the return value policy reference_internal so that garbage collection happens in the right order.
* tests: Add UT for node removal prop resol'n restorationAaron Rossetto2020-11-201-0/+53
|
* graph: Restore default resolver callback at node removalAaron Rossetto2020-11-204-1/+35
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The default resolve callback behavior for a newly-instantiated `node_t` object resolves all dirty properties associated with the node, then marks the properties as clean. When the node is added to a graph, its resolver callback is updated to use the graph property propagation algorithm in `graph_t::resolve_all_properties()`, which is considerably more sophisticated and relies on the graph topology to do its work. When a connection between two nodes is broken via the `graph::disconnect()` method, nodes which no longer have incoming or outgoing edges (connections) are removed from the graph. Prior to this change, the removed node's resolver callback was left pointing at the graph property propagation algorithm. In certain use cases, this could result in unexpected client-facing behavior. Consider, for example, this code (incomplete and for illustrative purposes only) which creates a streamer on one transmit chain of a multi-channel device, destroys that streamer, then creates a stream on the other transmit chain. Attempting to set the TX rate on the first chain after destroying the streamer does not result in the expected rate change, despite the same code working correctly before creating the streamer: constexpr size_t CH0 = ..., CH1 = ...; uhd::usrp::multi_usrp::sptr usrp = uhd::usrp::multi_usrp::make(...); // Set a TX rate on both chains; this succeeds usrp->set_tx_rate(initial_rate, CH0); usrp->set_tx_rate(initial_rate, CH1); assert(initial_rate == usrp->get_tx_rate(CH0)); assert(initial_rate == usrp->get_tx_rate(CH1)); // Create a TX streamer for channel 0 std::vector<size_t> chain0_chans{CH0}; stream_args_t sa; sa.channels = chain0_chans; sa.otw_format = ...; sa.cpu_format = ...; uhd::tx_streamer::sptr txs = usrp->get_tx_stream(sa); // Destroy the first streamer (disconnecting the graph) and // create a streamer for channel 1 txs.reset(); std::vector<size_t> chain1_chans{CH1}; sa.channels = chain1_chans; txs = usrp->get_tx_stream(sa); // Now try to set a new TX rate on both chains usrp->set_tx_rate(updated_rate, CH0); usrp->set_tx_rate(updated_rate, CH1); assert(updated_rate == usrp->get_tx_rate(CH0)); // <--- FAILS assert(updated_rate == usrp->get_tx_rate(CH1)); The reason this fails is because the second call to `set_tx_rate()` on channel 0 internally sets the 'interp' (interpolation ratio) property on the DUC node via the call to the DUC block controller's `set_input_rate()` function. As the DUC node is no longer part of the graph, having been removed from it when the first streamer instance was destroyed, the graph property propagation algorithm doesn't 'see' the node with the dirty property, and the 'interp' property resolver callback is never invoked. As a result, the DUC's input rate property, which depends on the interpolation ratio value, is never updated, and thus calling the `get_tx_rate()` function to query the new rate of the TX chain results in an unexpected value. In fact, in this particular case, `set_tx_rate()` actually raises a warning that the TX rate couldn't be set, and a message is printed to the console. This commit remedies the situation by restoring the default resolve callback behavior for a node when it is removed from the graph. This allows the framework to be able to invoke the property resolver callback on that node when a property is updated, the expected behavior of a newly instantiated node.
* rfnoc: Add Makefile.srcs to switchboard.ymlWade Fife2020-11-191-0/+1
|
* examples: Fix PPS option in rfnoc_radio_loopbackLane Kolbly2020-11-171-1/+1
|
* utils: Fix GUI argument in rfnoc_image_builderMarkus Unger2020-11-161-1/+1
|
* N310: Low band IF adjustmentsmichael-west2020-11-161-18/+10
| | | | | | | - Put ADF4351 at fixed integer-n mode IF freq - Set ADF4351 in low noise mode Signed-off-by: michael-west <michael.west@ettus.com>
* fpga: e31x: Add OOT sources to Makefile.e31x.incWade Fife2020-11-131-0/+8
|
* mpm: Fix issue with check-filesystem test executionJoerg Hofrichter2020-11-111-6/+6
| | | | | | | | | | This fixes tests that are invoked with arguments `--dt-overlays-loaded`, `--dt-overlays-available`, `--systemd-init-successful`, and `--mpm-init-successful`. Without this fix, the following error is generated: `ERROR: test_mpm_init_successful (name '_assert_filesystem_root_is_not_set' is not defined)`
* python: Clean up image builder generated codeWade Fife2020-11-069-117/+142
| | | | | This updates the RFNoC image to generate code that's a bit more tidy, with consistent spacing and better alignment.
* MPMD: Reduce max frame size for 10 GbEmichael-west2020-11-061-1/+1
| | | | | | | | | | | | MTU discovery is passing on sizes beyond the maximum size, which allows packets to exceed the default MTU size of 8000 set for 10 GbE. This can cause TX to stop when using higher sample rates. Reducing the maximum frame size to 7972 (8000 minus 28 bytes for UDP and IP headers) guarantees the packet size will never exceed the default MTU for 10 GbE. Signed-off-by: michael-west <michael.west@ettus.com>
* multi_usrp: Fix typos in streamer destruction callbackmichael-west2020-11-051-4/+4
| | | | Signed-off-by: michael-west <michael.west@ettus.com>
* sim: Check for unit test prereqs and disable if unsatisfiedAaron Rossetto2020-10-281-1/+45
|
* sim: Move SelectableQueue and SendWrapperSamuel O'Brien2020-10-282-45/+45
| | | | | | | | | | | | This commit moves these two classes from chdr_stream.py to chdr_endpoint.py. ChdrEndpoint needs to be aware of the specific implementation of these classes, while ChdrInputStream and ChdrOutputStream treats them like black boxes. Therefore, it makes more sense to have these classes together with ChdrEndpoint Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* sim: Support Out of Tree Sources and SinksSamuel O'Brien2020-10-282-2/+24
| | | | | | | | This commit adds the ability to specify a path to an arbitrary python file in a simulator config file, which will be imported and used to construct a SampleSink or SampleSource for use with data streaming. Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* sim: Implement Sim > UHD Flow ControlSamuel O'Brien2020-10-283-34/+85
| | | | | | | This commit adds flow control support when streaming data from the Simulator to UHD. It no longer ignores STRS packets. Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* sim: Move Hardware Specific to Config FileSamuel O'Brien2020-10-288-66/+149
| | | | | | | | This commit moves various magic numbers and hardware specific settings into the configuration file. It also provides default presets for said configuration files which can be inherited from. Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* sim: Implement UHD > Simulator Flow ControlSamuel O'Brien2020-10-281-18/+47
| | | | | | | | | When sending data to the simulator, python simply cannot process the data as fast as UHD can send it. Flow control ensures that uhd doesn't overwhelm the simulator. Simulator > UHD flow control isn't implemented yet. Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* sim: Support Timed StreamsSamuel O'Brien2020-10-282-1/+10
| | | | | | | | The only difference between a standard and timed stream is that the first data packet of a timed stream contains a timestamp. This commit adds the necessary fields to StreamSpec to accomplish this. Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* sim: Integrate simulator into UHDSamuel O'Brien2020-10-288-5/+293
| | | | | | | | | This commit adds a device::register_device which allows uhd to start up a simulator when uhd is called with the arguments type=sim. Creating the device object creates a subprocess using pybind and an embedded interpreter, and destroying the object cleans up those subprocesses. Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* sim: Support Configuration FilesSamuel O'Brien2020-10-285-9/+68
| | | | | | | | This commit adds support for configuration files to the simulator. As of now, these files only change the source and sink of data samples, but they are easily extensible to add more configuration to the simulator. Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* sim: Support StreamingSamuel O'Brien2020-10-288-348/+860
| | | | | | This commit add support for both Tx and Rx streams to the simulator. Signed-off-by: Samuel O'Brien <sam.obrien@ni.com>
* DUC: Fix incorrect DDS_GAINmichael-west2020-10-261-1/+1
| | | | | | | Fixes incorrect value for the DDS_GAIN that was causing the TX output power to be 6 dB lower than it was supposed to be. Signed-off-by: michael-west <michael.west@ettus.com>
* multi_usrp: Fix streamer destruction callbackmichael-west2020-10-221-91/+74
| | | | | | | | | | | | | | | | | The streamers were keeping a reference to the multi_usrp object, so the object would not destruct when the user deleted or reset the shared pointer to the object. An error would occur if the user attempted to make the same device and get streamers on it without explicitly deleting the streamers first. This change refactors the code such that the streamer destructor only depends on the existence of a weak_ptr to the underlying rfnoc_graph and a vector of edges returned by the connect function. It checks to see if the graph has been deleted before calling the functions to disconnect the edges. This allows the multi_usrp object and streamer objects to be destructed in any order. Signed-off-by: michael-west <michael.west@ettus.com>
* graph: Serialize all graph-related functionsAaron Rossetto2020-10-222-8/+13
| | | | | | | | This commit expands the scope of the former _release_mutex, renaming it _graph_mutex and ensuring that all graph modification functions are serialized against each other. This ensures that callers to graph_t's public functions are always operating on a coherent view of the underlying BGL graph object.
* graph: Re-fetch dst_node descriptor after src_node potential removalAaron Rossetto2020-10-221-0/+3
| | | | | | | | | | | | | | | | | The graph_t::disconnect(src_node, dst_node) function removes connections (edges) from src_node to dst_node in the graph, and then removes the nodes (vertices) if their degree is zero after removing the connections. Because removing a vertex from the graph invalidates vertex descriptors, the graph_t::_remove_node() function resynchronizes the node-to-vertex descriptor map after removing the vertex. However, in graph_t::disconnect(), the vertex descriptor corresponding to dst_node was not being refetched after the potential removal of src_node, which results in the incorrect removal of innocent nodes under certain circumstances. This commit ensures that the node-to-vertex descriptor is reconsulted for the vertex descriptor corresponding to dst_node before removing it from the tree.
* fpga: lib: Fix axis_strm_monitor parametersWade Fife2020-10-201-2/+2
|
* fixup! rfnoc: Fix thread unsafe accesses in ctrlportCiro Nishiguchi2020-10-201-7/+5
|
* rfnoc: Fix thread unsafe accesses in ctrlportCiro Nishiguchi2020-10-201-56/+35
|
* python: Add access to the property_tree from PythonMartin Braun2020-10-167-0/+96
| | | | | | | Example: >>> usrp = uhd.usrp.multi_usrp("") >>> tree = usrp.get_tree() >>> print(tree.access_int("/name").get())
* uhd_images_downloader: Add environment variable for http authLane Kolbly2020-10-154-3/+79
| | | | | | | | | This allows the image downloader to download files from restricted sources using HTTP basic auth, specifying the credentials in the UHD_IMAGES_USER and UHD_IMAGES_PASSWORD environment variables: ``` UHD_IMAGES_USER=lane UHD_IMAGES_PASSWORD=MyS3cretPassword uhd_images_downloader.py ```
* uhd_images_downloader: Remove unused default_no parameterLane Kolbly2020-10-151-3/+2
| | | | | This parameter isn't used by any callers of the function. Additionally, it doesn't actually change the default answer.
* mpm: Add dependency on pyusrp_periphs to MPMLane Kolbly2020-10-151-1/+1
| | | | | This change makes it so that changing the USRP periphs will cause a `make install` to reinstall the libpyusrp_periphs.so library.
* utils: Improve NMEA string outputmichael-west2020-10-121-47/+42
| | | | | | | | | | Separated output of GPGGA and GPRMC strings into separate try/catch so each one would display independently. Resolves issue of GPGGA string not displaying on devices that don't support the GPRMC string. Also removed unnecessary uses of boost::format. Signed-off-by: michael-west <michael.west@ettus.com>
* python: Move multi_usrp_python to its own moduleMartin Braun2020-10-123-192/+204
| | | | | This helps with recompilation times of UHD. No functional changes.
* examples: Fix --random option in benchmark_ratemichael-west2020-10-121-5/+11
| | | | | | | | The implementation was not properly configuring the stream command if the --random flag was used. It was especially bad when multiple channels were specified. Signed-off-by: michael-west <michael.west@ettus.com>