| Commit message (Collapse) | Author | Age | Files | Lines |
|
|
|
|
|
| |
This allows to treat a std::map<KeyType<std::map<KeyType, ValueType>> as
a set of x-y coordinates, and bilinearly interpolate a z-value given
four x/y pairs.
|
|
|
|
|
|
|
|
|
|
|
| |
Starting with 1.0.22, libusb considers libusb_set_debug() deprecated.
This replaces said call with libusb_set_option(), conditionally on the
libusb version. This has no effect on the execution, but will remove
some compiler versions, and make this code more future-proof.
Note that Ubuntu 18.04 ships libusb 1.0.21, so this conditional code
needs to remain until that version is deprecated and libusb version is
bumped higher.
|
| |
|
|
|
|
|
|
|
| |
It was possible that output to cout would become interleaved inside of the
uhd log messages.
Signed-off-by: mattprost <matt.prost@ni.com>
|
|
|
|
|
| |
This removes -Wmaybe-uninitialized and -Wclass-memaccess from this file
when using gcc.
|
|
|
|
|
| |
At /mboards/0/usb_version, we can now read back an int. It's either 2 or
3, depending on what we're using.
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When using multi_usrp with an RFNoC device, the previous behaviour was
to throw an exception when calling recv_async_msg() so users would know
they're not supposed to call it (calling tx_stream::recv_async_msg is
preferred). However, this breaks too many existing applications.
Instead, we keep a weak pointer to the streamer, the same way that older
devices do, and query the async message from that. This means that
calling recv_async_msg() when there are multiple streamers can lead to
unexpected behaviour, but that's a general issue with
multi_usrp::recv_async_msg() and this way, the RFNoC devices now behave
like older devices do.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This adds (and calls) methods to manually pass radio block sample rate
to the input/output properties of the ddc/duc during creation of the
multi_usrp_rfnoc object. The ddc/duc require this information in order
to return valid, possible output/input sample rates in
get_rx_rates()/get_tx_rates().
Before, the ddc/duc wouldn't have this rate until the rfnoc_graph had
been connected and committed, which happens in
get_rx_stream()/get_tx_stream(). Thus, this fixes an issue where a user
was unable to query possible sample rates prior to specifying a sample
rate and creating a stream.
|
|
|
|
|
| |
This replaces incorrect code with the proper function calls to retrieve
the range of possible sample rates.
|
| |
|
|
|
|
|
| |
The current reset routines write a '1' twice for reset, instead of '0'
then '1' (resets get triggered on a rising edge).
|
|
|
|
|
|
|
| |
If a user specifies a multi-device query, such as "serial0=1234,serial1=4321",
we have to look up the preferences for each device. To minimize the
impact to non-x400 devices, I simply push the get_usrp_args call down
into mpmd_impl and mpmd_find.
|
| |
|
|
|
|
|
| |
Pragma once is the more modern version of include guards, eliminating
any potential problems with mistyping include guards. Let's use those.
|
|
|
|
|
|
|
|
|
| |
We have integer 32-bit serial numbers for MPM devices, for example
"1234abcd". For serial numbers which have less than eight digits,
e.g. "123abcd", a user may feel inclined to prefix this number with
a 0 when they are searching for devices, e.g. "0123abcd". This change
makes it so that specifying "0123abcd" will match a device with serial
number "123ABCD".
|
| |
|
| |
|
|
|
|
|
|
|
|
| |
- Moves linear_interp from cal to utils
- Moves the interp_mode enum class to interpolation.hpp
- Adds three interpolation methods for maps: at_interpolate_1d(),
at_nearest(), at_lin_interp()
- Adds unit tests
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Up until now, we completely ignore the XDG specification.
This commit does the following to change that:
- It uses XDG_DATA_HOME and XDG_CONFIG_HOME for cal and config data,
respectively.
- If config data is in ~/.uhd/uhd.conf, that is still accepted, but if
it conflicts with $XDG_CONFIG_HOME/uhd.conf, it is ignored and a
warning is displayed
- The default location for cal data is thus ${HOME}/.local/share/uhd/cal
on Unix, and %LOCALAPPDATA%\uhd\cal on Windows. This is a change in
location!
- The UHD_CONFIG_DIR environment variable was confusingly named and is
now removed. It provided an alternative location than the home
directory. The same purpose is now much better served by XDG_DATA_HOME
and XDG_CONFIG_HOME.
The specification can be found here:
specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
|
|
|
|
|
|
|
| |
Allows RFNoC blocks to perform register peeks and pokes on blocks with
multiple channels without having to worry about handling register address
translation every time.
Signed-off-by: mattprost <matt.prost@ni.com>
|
|
|
|
|
|
|
|
|
| |
Now that we have cal::iq_cal and cal::database, there's no need to
manually wrangle CSV files for calibration data. This commit replaces
all CSV operations with cal::database calls and uses cal::iq_cal as
a container.
CSV files can still be read, but are considered deprecated.
|
|
|
|
|
|
|
|
| |
This class can be used to store calibration coefficients for the X300
DC offset and IQ imbalance calibration.
Note: This also modifies Doxyfile.in to not document files generated by
flatc.
|
|
|
|
|
|
|
|
| |
Most of the API calls that default an arg to ALL_CHANS or ALL_MBOARDS
were in fact broken. This adds a macro to efficiently mux out API calls
that take such wildcard arguments so we don't have to repeat the same
loop all over the place, even for those API calls that already correctly
implemented wildcards (for consistency).
|
| |
|
|
|
|
|
|
| |
This class contains methods to store and retrieve data from the local
calibration database. Note that in this case, the "database" is just a
bunch of files on the local filesystem.
|
|
|
|
| |
This points to the location where cal data is stored.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This results in a change of operation for LF/Basic Boards on
X300/X310 devices. The RX streaming mode will now be specified
by the antenna rather than the subdev: (AB or BA for complex
streaming, and A or B for real-mode streaming, with AB being
the default antenna value). For real-mode streaming, data is
collected as complex data with zeroed-out values in the
quadrature domain. The subdevs for these boards have been
changed to 0 and 1 for the RX channels, and 0 for the TX
channel, in order to align with subdev specs of other RFNoC
devices.
Note: the old streaming mode paradigm is still in place for
the N210.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This module allows to add binary files into UHD (e.g., for cal data
storage) in a platform-independent way.
The upstream CMakeRC.cmake is modified in the following way to allow
linkage against a shared object:
```diff
# Generate the actual static library. Each source file is just a single file
# with a character array compiled in containing the contents of the
# corresponding resource file.
add_library(${name} STATIC ${libcpp})
set_property(TARGET ${name} PROPERTY CMRC_LIBDIR "${libdir}")
set_property(TARGET ${name} PROPERTY CMRC_NAMESPACE "${ARG_NAMESPACE}")
target_link_libraries(${name} PUBLIC cmrc::base)
set_property(TARGET ${name} PROPERTY CMRC_IS_RESOURCE_LIBRARY TRUE)
+ set_property(TARGET ${name} PROPERTY POSITION_INDEPENDENT_CODE ON)
```
This forces the -fPIC flag for the static object that CMakeRC generates,
allowing to link it into a shared object file.
The version of CMakeRC used is: a7e355290, cloned from
git@github.com:vector-of-bool/cmrc.git.
|
|
|
|
|
|
|
|
|
|
| |
FlatBuffers is used to (de-)serialize calibration data. For most use
cases, only a few headers are required, so we provide them with UHD
instead of requiring all UHD users to install their own version of
FlatBuffers.
This adds the headers to host/lib/deps, and updates the Debian copyright
file appropriately.
|
|
|
|
|
|
|
| |
This modifies `constrained_device_args_t::bool_arg::parse()` to use
`uhd::cast::from_str<bool>` to interpret strings as Boolean values,
deduplicating the string parsing code and single-sourcing it from
`uhd::cast`.
|
|
|
|
|
|
|
| |
This adds a specialization to `uhd::cast::from_str()` to handle `bool`
as a target type and interpret strings like 'y', 'Y', 'n', 'No', 'True',
'False', etc. as Boolean values, as well as the traditional '0' and '1'
(which also work).
|
|
|
|
|
|
| |
Allow clients to pass a custom instance of a mock_reg_iface_t for use
with mock_block_container. This is especially useful when a block test
subclasses mock_reg_iface_t to implement specialized behaviors.
|
|
|
|
|
|
|
|
|
|
|
|
| |
For RFNoC devices, multi_usrp::get_device() no longer returns a device
pointer, rather, it returns a nullptr.
This is intentional because access to the underlying device is no longer
allowed. However, legacy code can segfault (e.g. portions ofr gr-uhd).
This patch returns a faux uhd::device class, which almost mimicks the
original behaviour perfectly, by redirecting its class methods back to
multi_usrp_rfnoc. The only exception is recv_async_msg(), which requires
a TX streamer. This function will always return false now.
|
|
|
|
|
|
|
|
|
|
| |
The introduction of multi_usrp_rfnoc caused
multi_usrp::get_device()->get_tree() to segfault for gen3 devices.
In defcb174, we introduced a fix for this (multi_usrp::get_tree()) but
we didn't apply it to internal utilities.
That means the uhd_cal_* utilties were broken, along with certain
sections of the C API, and the latency test suite. This fixes the
segfault issue.
|
|
|
|
|
|
|
|
|
| |
All of the functions defined in uhd/utils/paths.hpp are now available in
Python, with the exception of get_module_paths().
#!/usr/bin/env python3
import uhd
print(uhd.get_lib_path()) # Prints location of libuhd
|
|
|
|
|
|
| |
Whenever gains where set through a gain_group, it would output spurious
log messages that must stem from someone's debug code, since the log
messages are not very useful by themselves.
|
|
|
|
|
| |
Note: template_lvbitx.{cpp,hpp} need to be excluded from the list of
files that clang-format gets applied against.
|
| |
|
|
|
|
|
| |
Keep a reference to the graph object so that when a new multi_usrp is
opened to the same device, the same graph is also used.
|
| |
|
|
|
|
| |
Make all arguments const, in line with how other static methods are declared.
|
|
|
|
|
| |
Set error code member variable in rx_event_action_info constructor
instead of relying on the caller to set it after object creation
|
|
|
|
|
|
| |
tx_event_action_info objects were being created with uninitialized
timestamp members which led to uhd::tx_streamer::recv_async_msg()
returning with invalid timestamps
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Adds a ZPU register to control the FP GPIO source. These are 2bits
per GPIO pin, totalling 24 bits. 0 corresponds to RF-A, 1 corresponds
to RF-B. The following Python code will control the upper 6 bits of the
front-panel GPIO from the B-side radio on an X300:
>>> import uhd
>>> U = uhd.usrp.MultiUSRP("type=x300")
>>> U.get_gpio_src_banks()
['FP0']
>>> U.get_gpio_src("FP0")
['RFA', 'RFA', 'RFA', 'RFA', 'RFA', 'RFA', 'RFA', 'RFA', 'RFA', 'RFA',
'RFA', 'RFA']
>>> U.set_gpio_src("FP0", ['RFA', 'RFA', 'RFA', 'RFA', 'RFA', 'RFA',
'RFB', 'RFB', 'RFB', 'RFB', 'RFB', 'RFB'])
>>> U.get_gpio_src("FP0")
['RFA', 'RFA', 'RFA', 'RFA', 'RFA', 'RFA', 'RFB', 'RFB', 'RFB', 'RFB',
'RFB', 'RFB']
>>> # Make all GPIOs outputs:
>>> U.set_gpio_attr("FP0A", "DDR", 0xFFF)
>>> U.set_gpio_attr("FP0B", "DDR", 0xFFF)
>>> # Control all GPIOs from software (not ATR):
>>> U.set_gpio_attr("FP0A", "CTRL", 0x000)
>>> U.set_gpio_attr("FP0B", "CTRL", 0x000)
>>> # Bottom 3 pins go high from radio A
>>> U.set_gpio_attr("FP0A", "OUT", 0x007)
>>> # Top 3 pins go high from radio B
>>> U.set_gpio_attr("FP0B", "OUT", 0xE00)
Amends the gpio.cpp example to allow switching the source.
Co-authored-by: Brent Stapleton <brent.stapleton@ettus.com>
|
|
|
|
|
| |
- Apply clang-format
- Remove unnecessary boost::format
|
|
|
|
|
| |
- Apply clang-format
- Remove unnecessary boost::format
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
This replaces the package path constant with a runtime library path
lookup. The package path is taken to be the parent directory of the
library directory.
When boost >= 1.61 is not available, this maintains the current behavior
of using CMake to set path contants.
Runtime path determination is preferable for making a relocatable
library so that it is not necessary to do string substitution on
relocated binaries (as with, for example, building a conda package).
|
|
|
|
|
|
|
|
|
|
|
| |
This combines two intertwined changes:
- The scaling_in and scaling_out properties of the DDC now start off
uninitialized. This is to avoid invalid loops of property resolution:
When the block is first initialized in a graph context, the default
values for scaling over-constrain the resolution problem.
- The resolver for samp_rate_in used to prefer changing samp_rate_out,
it now prefers to modify the decimation. This is necessary to allow
calling set_output_rate() before the graph is committed.
|
|
|
|
|
|
|
|
|
| |
Before, the type was octoclock_eeprom_t, which was incompatible with
mboard_eeprom_t and would cause issues with uhd_usrp_probe.
octoclock_eeprom_t is a superset of mboard_eeprom_t, and there is no
necessity for exposing the additional features to the public. This
harmonizes the Octoclock prop tree with the rest of UHD, and fixes an
issue where the Octoclock won't allow uhd_usrp_probe on master branch.
|
|
|
|
|
|
|
|
| |
The Octoclock host code would send uninitialized memory over the
network, which would be flagged by tools such as Valgrind. This patch
creates a factory function for OctoClock packets that initializes the
memory to zero, defaults the proto version to the OctoClock default, and
can provide a random sequence number if none is given.
|