seify_rtlsdr/
lib.rs

1//! # rtlsdr Library
2//! Library for interfacing with an RTL-SDR device.
3
4mod device;
5pub mod error;
6mod rtlsdr;
7mod tuners;
8
9use device::Device;
10use device::KNOWN_DEVICES;
11use error::Result;
12use rtlsdr::RtlSdr as Sdr;
13
14use rusb::{Context, UsbContext};
15
16pub const DEFAULT_BUF_LENGTH: usize = 16 * 16384;
17
18#[derive(Debug, Clone)]
19pub enum TunerGain {
20    Auto,
21    Manual(i32),
22}
23#[derive(Debug, Clone, Copy)]
24pub enum DirectSampleMode {
25    Off,
26    On,
27    OnSwap, // Swap I and Q ADC, allowing to select between two inputs
28}
29
30#[derive(Debug, Clone)]
31pub struct DeviceInfo {
32    pub index: usize,
33    pub serial: String,
34}
35
36pub fn enumerate() -> Result<Vec<DeviceInfo>> {
37    let context = Context::new()?;
38    let devices = context.devices()?;
39
40    let mut devs = Vec::new();
41    let mut index = 0;
42
43    for found in devices.iter() {
44        let device_desc = found.device_descriptor()?;
45        for dev in KNOWN_DEVICES.iter() {
46            if device_desc.vendor_id() == dev.vid && device_desc.product_id() == dev.pid {
47                let dev = found.open()?;
48                let serial = dev.read_serial_number_string_ascii(&device_desc)?;
49                devs.push(DeviceInfo { index, serial });
50                index += 1;
51            }
52        }
53    }
54    Ok(devs)
55}
56
57pub struct RtlSdr {
58    sdr: Sdr,
59}
60impl RtlSdr {
61    pub fn open(index: usize) -> Result<RtlSdr> {
62        let dev = Device::new(index)?;
63        let mut sdr = Sdr::new(dev);
64        sdr.init()?;
65        Ok(RtlSdr { sdr })
66    }
67    pub fn close(&mut self) -> Result<()> {
68        // TODO: wait until async is inactive
69        self.sdr.deinit_baseband()
70    }
71    pub fn reset_buffer(&self) -> Result<()> {
72        self.sdr.reset_buffer()
73    }
74    pub fn read_sync(&self, buf: &mut [u8]) -> Result<usize> {
75        self.sdr.read_sync(buf)
76    }
77    pub fn get_center_freq(&self) -> u32 {
78        self.sdr.get_center_freq()
79    }
80    pub fn set_center_freq(&self, freq: u32) -> Result<()> {
81        self.sdr.set_center_freq(freq)
82    }
83    pub fn get_tuner_gains(&self) -> Result<Vec<i32>> {
84        self.sdr.get_tuner_gains()
85    }
86    pub fn set_tuner_gain(&self, gain: TunerGain) -> Result<()> {
87        self.sdr.set_tuner_gain(gain)
88    }
89    pub fn get_freq_correction(&self) -> i32 {
90        self.sdr.get_freq_correction()
91    }
92    pub fn set_freq_correction(&self, ppm: i32) -> Result<()> {
93        self.sdr.set_freq_correction(ppm)
94    }
95    pub fn get_sample_rate(&self) -> u32 {
96        self.sdr.get_sample_rate()
97    }
98    pub fn set_sample_rate(&self, rate: u32) -> Result<()> {
99        self.sdr.set_sample_rate(rate)
100    }
101    pub fn set_tuner_bandwidth(&self, bw: u32) -> Result<()> {
102        self.sdr.set_tuner_bandwidth(bw)
103    }
104    pub fn set_testmode(&self, on: bool) -> Result<()> {
105        self.sdr.set_testmode(on)
106    }
107    pub fn set_direct_sampling(&self, mode: DirectSampleMode) -> Result<()> {
108        self.sdr.set_direct_sampling(mode)
109    }
110    pub fn set_bias_tee(&self, on: bool) -> Result<()> {
111        self.sdr.set_bias_tee(on)
112    }
113}