14 releases (breaking)

0.11.0 Feb 22, 2024
0.10.0 Sep 15, 2023
0.9.0 Sep 2, 2023
0.8.0 Jun 13, 2023
0.1.0 Dec 31, 2022

#136 in Hardware support

Download history 53/week @ 2024-01-26 48/week @ 2024-02-02 183/week @ 2024-02-09 115/week @ 2024-02-16 117/week @ 2024-02-23 63/week @ 2024-03-01 295/week @ 2024-03-08 99/week @ 2024-03-15 131/week @ 2024-03-22 27/week @ 2024-03-29 22/week @ 2024-04-05

367 downloads per month
Used in futuresdr

Apache-2.0 and maybe GPL-3.0

165KB
4K SLoC

Seify! A Rusty SDR Hardware Abstraction Library

Goals

A clear path towards a great Rust SDR driver ecosystem.

  • Seify has an implementation for Soapy and, therefore, supports basically all available SDR frontends.
  • Seify supports both typed and generic devices with dynamic dispatch. There is no or minimal overhead for the typed version, i.e., there should be no reason not to use Seify.
  • Once more native Rust drivers become available, they can be added to Seify and gradually move from Soapy to pure-Rust drivers.
  • A clear path towards a proper async and WASM WebUSB.
  • Zero-installation: Rust drivers need no libraries from the base system. Either they are network/http-based or they use rusb, which vendors libusb.
  • Proper driver integration for Rust drivers (e.g., no threads in the core library).
  • Rust drivers are added with crate features per binary and do not rely on system-wide libraries.
  • Provide a framework for Rust SDR drivers, to avoid diverging concepts of driver implementations in the ecosystem.

Hardware Drivers

To add a new SDR driver, add a struct, implementing the DeviceTrait in the src/impls folder and add feature-gated logic for the driver to the probing/enumeration logic in src/device.rs.

At the moment, Seify is designed to commit the driver implementations upstream, i.e., there is no plugin system. This will probably be added but is no priority at the moment. While this concentrates maintenance efforts on Seify, it simplifies things for the user, who just add Seify to the project and enables feature flags for their SDR.

Example

use num_complex::Complex32;
use seify::Device;

pub fn main() -> Result<(), Box<dyn std::error::Error>> {
    let dev = Device::new()?;
    let mut samps = [Complex32::new(0.0, 0.0); 1024];
    let mut rx = dev.rx_streamer(&[0])?;
    rx.activate()?;
    let n = rx.read(&mut [&mut samps], 200000)?;
    println!("read {n} samples");

    Ok(())
}

Dependencies

~3–12MB
~114K SLoC