1mod 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, }
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 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}