Skip to content

Releases: MITHaystack/digital_rf

2.6.14

11 Sep 19:18
ea9b801

Choose a tag to compare

Fixed:

  • Fix ignore_existing=True when mirroring Digital Metadata files. Previously, ignore_existing=True would ignore all existing Digital Metadata files, which would skip mirroring the most recent file(s) containing metadata that still applies through forward-fill logic. This modifies the ignore_existing=True behavior to not ignore the latest existing Digital Metadata files.

Authors:

  • Ryan Volz

2.6.13

11 Aug 22:03
2fe4bb9

Choose a tag to compare

Added:

  • Added "-al" and "-ai" flags to drf_sti.py to auto estimate maximum length/integration for use when working with smaller files where it's practical to use all the data.
  • Added -exit argument to drf mirror to exit automatically when and end time has passed and no additional files have appeared. Also includes equivalent exit_on_complete argument to the DigitalRFMirror class.
  • Added ZeroMQ message passing to thor.py, connected to the USRP source, to allow controlling and receiving messages from the radio externally while the script is running.
  • Added a "-P" flag to drf_sti.py to specify the number of processes to use for the calculation, allowing speedups over the default single process.

Changed:

  • Use the HDF5 "core" file driver when writing Digital Metadata files, which keeps the file in memory until closed at which point it is flushed to disk. This results in a sample index group being written all at once instead of broken into multiple writes when the group and each dataset is created.
  • When checking for compatible versions, allow any version that is at most the current major version. Also, ignore version checks for development versions of the package (i.e. non-tagged git commits) so API bumps do not error in testing before the package version is bumped.

Fixed:

  • Fixed a bug in drf_sti.py where multiple data frames weren't being segmented in time correctly.
  • Enable editable installs of the Python package (e.g. with pip install -e . from the top-level source directory).

Authors:

  • Ryan Volz
  • Daniel Sheen

2.6.12

21 May 23:20
81a9a13

Choose a tag to compare

Changed:

  • Update required minimum CMake version to 3.5 (for C and Matlab subprojects) for compatibility with CMake 4.0. The overall project still requires at least CMake 3.20 for compatibility with scikit-build and for building the Python subproject.
  • Enforce keyword-only arguments for Python code adjacent to Digital RF's use of the watchdog library to have consistency with watchdog and try to prevent future issues.

Fixed:

  • Fix unhandled exception with watch/mirror/ringbuffer observing a non-existent directory with watchdog >= 5.0.0. Starting with watchdog 5.0.0, the ObservedWatch object requires that the recursive init argument be provided as a keyword argument.

Authors:

  • Ryan Volz

2.6.11

03 Feb 18:08
3e92402

Choose a tag to compare

Fixed:

  • Fix 'datetime.datetime' has no attribute 'timezone', affecting the 2.6.10 release after removal of pytz.
  • Fix bug in all watchdog utilities (watch/mirror/ringbuffer) with versions 4.0.0 and up of the watchdog package. Prior to this fix, file system events were triggering a spurious FileDeletedEvent that broke ringbuffer functionality.

Authors:

  • Ryan Volz
  • dependabot[bot]

2.6.10

16 Jan 04:46
1cd1779

Choose a tag to compare

Added:

  • Building of Python package wheels using cibuildwheel has been added as a GitHub Actions workflow, making use of the change in build system (see below).

Changed:

  • The build system has been updated to use pyproject.toml + scikit-build-core for the Python package, replacing the legacy setup.py + setuptools system of yore. As a result, the CMake build procedure has changed a bit, notably in that building a Python wheel using CMake is no longer supported. Use python -m build or an equivalent frontend from the source root to build Python wheels instead. The Python package can still be built and installed as before using CMake, just not as a wheel.
  • When reading Digital Metadata, convert numpy object arrays to a list for better interoperability (particularly with GNU Radio's PMT type). Also ensure that arrays of strings have the str type.

Removed:

  • Python 2 and Python < 3.8 will no longer be supported, and the README and build system has been updated accordingly.
  • The dependency on pytz has been removed in favor of equivalent functionality now in the Python standard library.

Fixed:

  • Replace deprecated use of Python datetime's utcnow() and utcfromtimestamp().
  • Fix CMake so that digital_rf.dll actually gets installed on Windows! This makes the C library usable independent of the Python bindings.
  • Fixed TypeError: unsupported operand type(s) for /: 'int' and 'numpy.longdouble' issue with gr_digital_rf.digital_rf_channel_source by converting the int to a numpy.uint64 before division.
  • Fixed aliased numpy function names for numpy 2.0 compatibility.
  • Updated to numpy 2.0's new definition for the copy keyword for np.array() by switching to np.asarray() as suggested.

Authors:

  • Ryan Volz

2.6.9

23 May 22:03
2.6.9

Choose a tag to compare

Added:

  • Add "link" method to mirror module and "ln" to drf mirror, to hard link files instead of cop
    ying. When hard linking is not possible (e.g. across different partitions), it will fall back to copying.
  • Add drf ln command to link files (hard or symbolic).
  • Added option rdcc_nbytes to DigitalRFReader to allow specification of HDF5 chunk cache size (see HDF5 documentation for details). This also increases the default chunk cache size from 1 MB to 4 MB to speed up reading of compressed or checksummed data in a typical use case.
  • The sounder/tx.py example script has been updated to accept waveform files in complex int16 format through use of the new --type int16 argument.

Fixed:

  • Fixed thorpluto.py, changed the iio.pluto_source to iio.fmcomms2_source_fc32 as the pluto_source was removed in newer versions of iio.

Authors:

  • Ryan Volz
  • John Swoboda
  • Juha Vierinen

2.6.8

07 Dec 19:04

Choose a tag to compare

Changed:

  • drf_sti: Updated to have better arguments (consistent with more recent tools), handle data gaps, and add simple channel sum beamforming.
  • thor: Swap order of setting USRP clock and time sources, time first. This should reduce the number of re-syncs necessary with modern USRPs (N3xx, X4xx) in the absence of being able to do a set_sync_source call.
  • thor: Put USRP clock, time, and lo arguments into device string, and do not set those arguments after device initialization if they do not change. This means that thor will do less re-initialization of the device settings during startup.

Fixed:

  • Fixed Python DigitalRFReader and DigitalMetadataReader for compatibility with numpy 1.23 on Windows (and possibly other platforms with np.longdouble==np.double).

Authors:

  • Ryan Volz
  • Frank Lind

2.6.7

14 Aug 21:28

Choose a tag to compare

Added:

  • Added the DigitalRFReader.read_vector_1d method for reading data and always returning a 1-D array of the smallest safe floating point type, replacing DigitalRFReader.read_vector_c81d.
  • Basic logging support has been added, with the case of failing to import the watchdog_drf module being the only instance of logged information so far. The logging level can be set using either the DRF_LOGLEVEL or LOGLEVEL environment variables. The default level is WARNING, and the watchdog_drf import error is logged at the INFO level.

Changed:

  • Renamed the GNU Radio companion block tree title from "gr_digital_rf" to "Digital RF" to better match the style of other out-of-tree modules.
  • DigitalRFReader.read_vector no longer always returns an array with a np.complex64 dtype. Instead, the array will always have be of the smallest floating point type (either complex or real) that will safely fit hold the underlying data without loss of precision. We recommend manually changing to a smaller type if a loss of precision is acceptable. The benefit over this function over DigitalRFReader.read_vector_raw is that you don't have to worry about handling complex integer data with a compound dtype.
  • The Python package now depends on oldest-supported-numpy instead of just numpy, so that source builds can maintain maximum compatibility with different numpy versions.

Deprecated:

  • The DigitalRFReader.read_vector_c81d method is deprecated and will be removed in digital_rf version 3. Use read_vector_1d instead and append .astype('c8', casting='unsafe', copy=False) if a strict return dtype of complex64 is desired.

Fixed:

  • Fixed #25 (digital_rf_sink: version check on GNU Radio causes TypeError) by removing the GNU Radio version check since it wasn't actually doing anything helpful anymore.
  • Fix thor.py failures when recording multiple channels (e.g. AttributeError: 'list_iterator' object has no attribute 'start'). Some flowgraph blocks were being garbage-collected before/during execution because no references were stored to the Python objects with GNU Radio 3.9+. Now thor.py keeps these references itself.
  • Fix thor.py error when setting a stop time with GNU Radio 3.9+.
  • Improve thor.py start time tagging with at least the B2xx radios.
  • Improve thor.py reliability with stop times by not attempting to stop at an exact time, but instead just stop when we are sure we are past the stopping time.
  • Fix stream tag handling in Digital RF Sink and Raster blocks. The get_tags_in_window function is broken in GNU Radio 3.9.2.0, so use get_tags_in_range instead.
  • The watchdog_drf module is now compatible with recent versions of the watchdog package, from version 1 up through at least version 2.1.2.

Authors:

  • Ryan Volz

2.6.6

12 Feb 22:57

Choose a tag to compare

Deprecated:

  • The digital_rf_get_unix_time function is now deprecated, as it relies on a long double sample rate. Use digital_rf_get_unix_time_rational instead.

Fixed:

  • Fix incorrect file bound calculation in digital_rf_get_subdir_file on platforms that have a long double that is different from amd64, notably at least the aarch64 ARM platform. This fixes a bug where writes failed with error messages "Failed to write data" and "Request index M before first expected index N".
  • Regularized use of 64 bit integer types and their conversion to Python values, perhaps correcting behavior when compiled on 32-bit architectures.
  • Cleaned up compiler warnings about comparing signed and unsigned values.
  • Cleaned up testing warnings about invalid values in equals comparison.

Authors:

  • Ryan Volz

2.6.5

06 Aug 14:28

Choose a tag to compare

Added:

  • Added start sample to debug printing of 'digital_rf_channel_sink' to complement the debug printing of rx_time tags.

Changed:

  • The Digital RF (Channel) Source/Sink blocks for gnuradio-companion have been modified to accept 'raw' input for the start and end identifiers instead of strings, allowing variables to be used. Existing flowgraphs may require quotes to be placed around existing string input.

Fixed:

  • The drf_watchdog module is now compatible with watchdog 0.10+. There may be a slight change of behavior (duplicate or out of order events) but the mirror and ringbuffer utilities can handle it gracefully.
  • Better error message when no samples are specified with drf_plot.py.
  • Fix the Digital RF sink blocks and GRC yaml to prevent an empty array for center_frequencies being written as Digital Metadata (currently happens with default GRC block with GNU Radio 3.8).
  • Clarified docstrings (and updated to actual modern behavior) for 'start' and 'end' in Digital RF source/sinks.

Authors:

  • Ryan Volz