ex1/
ex1.rs

1extern crate rtlsdr;
2
3use std::os::raw::{c_void, c_uchar};
4use std::ptr;
5use rtlsdr::Error;
6use std::time::Duration;
7use std::thread;
8
9
10fn sdr_config(dev: &rtlsdr::Device) -> Error {
11    let (m, p, s, mut err) = dev.get_usb_strings();
12    match err {
13        Error::NoError => println!("set_xtal_freq successful"),
14        _ => return err,
15    };
16    println!("m: {}\n p: {}\n s: {}\n err: {:?}\n", m, p, s, err);
17
18    // ---------- Get/Set/Get Hardware Info ----------
19    println!("1. Getting hardware info...");
20    let (mut hw_info, mut err) = dev.get_hw_info();
21
22    println!("Error: {:?}", err);
23    println!("Vendor ID:             {:?}", hw_info.vendor_id);
24    println!("Product ID:            {:?}", hw_info.product_id);
25    println!("Manufacturer:          {:?}", hw_info.manufact);
26    println!("Product:               {:?}", hw_info.product);
27    println!("Serial number:         {:?}", hw_info.serial);
28    println!("Serial number enabled: {:?}", hw_info.have_serial);
29    println!("IR endpoint enabled:   {:?}", hw_info.enable_ir);
30    println!("Remote wakeup enabled: {:?}", hw_info.remote_wakeup);
31    println!("");
32
33    println!("Writing hardware info...");
34    err = dev.set_hw_info(&hw_info);
35    println!("Writing hardware info return message: {:?}\n", err);
36
37    println!("2. Getting hardware info...");
38    let (hw_info, mut err) = dev.get_hw_info();
39
40    println!("Error: {:?}", err);
41    println!("Vendor ID:             {:?}", hw_info.vendor_id);
42    println!("Product ID:            {:?}", hw_info.product_id);
43    println!("Manufacturer:          {:?}", hw_info.manufact);
44    println!("Product:               {:?}", hw_info.product);
45    println!("Serial number:         {:?}", hw_info.serial);
46    println!("Serial number enabled: {:?}", hw_info.have_serial);
47    println!("IR endpoint enabled:   {:?}", hw_info.enable_ir);
48    println!("Remote wakeup enabled: {:?}", hw_info.remote_wakeup);
49    println!("");
50
51    // ---------- Get Tuner Gain ----------
52    println!("get_tuner_type: {}", dev.get_tuner_type());
53    err = dev.set_xtal_freq(28800000, 28800000);
54    match err {
55        Error::NoError => println!("set_xtal_freq - 28800000"),
56        _ => return err,
57    };
58    println!("");
59
60    // ---------- Set Tuner Gain ----------
61    err = dev.set_tuner_gain_mode(true);
62    match err {
63        Error::NoError => println!("set_tuner_gain_mode successful..."),
64        _ => return err,
65    };
66
67    let (gains, mut err) = dev.get_tuner_gains();
68    match err {
69        Error::NoError => println!("get_tuner_gains successful..."),
70        _ => println!("get_tuner_gains failed - {:?}", err), // return err,
71    };
72
73    println!("\ntuner gains:  {:?}\n", gains);
74
75    err = dev.set_tuner_gain(gains[2]);
76    match err {
77        Error::NoError => println!("set_tuner_gain {:?} successful...", gains[2]),
78        _ => return err,
79    };
80    println!("");
81
82    // ---------- Get/Set Sample Rate ----------
83    let samplerate: i32 = 2083334;
84    err = dev.set_sample_rate(samplerate);
85    match err {
86        Error::NoError => println!("set_sample_rate {} successful...", samplerate),
87        _ => return err,
88    };
89
90    println!("get_sample_rate {} successful...\n", dev.get_sample_rate());
91
92    // ---------- Get/Set Xtal Freq ----------
93    let (mut rtl_freq, mut tuner_freq, mut err) = dev.get_xtal_freq();
94    match err {
95        Error::NoError => {
96            println!("get_xtal_freq successful - rtl_freq: {}, tuner_freq: {}",
97                     rtl_freq,
98                     tuner_freq)
99        }
100        _ => return err,
101    };
102
103    rtl_freq = 28800000;
104    tuner_freq = 28800000;
105
106    err = dev.set_xtal_freq(rtl_freq, tuner_freq);
107    match err {
108        Error::NoError => {
109            println!("set_xtal_freq successful - rtl_freq: {}, tuner_freq: {}",
110                     rtl_freq,
111                     tuner_freq)
112        }
113        _ => return err,
114    };
115    println!("");
116
117    // ---------- Get/Set Center Freq ----------
118    err = dev.set_center_freq(978000000);
119    match err {
120        Error::NoError => println!("set_center_freq successful - 978000000"),
121        _ => return err,
122    };
123
124    println!("get_center_freq: {}\n", dev.get_center_freq());
125
126    // ---------- Set Tuner Bandwidth ----------
127    let bw: i32 = 1000000;
128    println!("Setting bandwidth: {}", bw);
129
130    err = dev.set_tuner_bandwidth(bw);
131    match err {
132        Error::NoError => println!("set_tuner_bandwidth {} Successful", bw),
133        _ => return err,
134    };
135    println!("");
136
137    // ---------- Buffer Reset ----------
138    err = dev.reset_buffer();
139    match err {
140        Error::NoError => println!("reset_buffer successful..."),
141        _ => return err,
142    };
143
144    // ---------- Get/Set Freq Correction ----------
145    let mut freq_corr = dev.get_freq_correction();
146    println!("get_freq_correction - {}", freq_corr);
147
148    freq_corr += 1;
149    let err = dev.set_freq_correction(freq_corr);
150    match err {
151        Error::NoError => println!("set_freq_correction successful - {}", freq_corr),
152        _ => return err,
153    };
154    println!("");
155    // ----------  ----------
156    Error::NoError
157}
158
159unsafe extern "C" fn read_async_callback(buf: *mut c_uchar, len: u32, ctx: *mut c_void) {
160    let _ = ctx;
161    let v = Vec::<u8>::from_raw_parts(buf, len as usize, len as usize);
162    println!("----- read_async_callback buffer size - {}", len);
163    println!("----- {} {} {} {} {} {}",
164             v[0],
165             v[1],
166             v[2],
167             v[3],
168             v[4],
169             v[5]);
170}
171
172
173fn main() {
174    // ---------- Device Check ----------
175    let count = rtlsdr::get_device_count();
176    if count == 0 {
177        println!("No devices found, exiting.");
178        return;
179    }
180
181    for i in 0..count {
182        let (m, p, s, err) = rtlsdr::get_device_usb_strings(i);
183        println!("get_device_usb_strings: {:?} - {} {} {}", err, m, p, s);
184    }
185
186    let index = 0;
187    println!("===== Device name, index {}: {} =====",
188             index,
189             rtlsdr::get_device_name(0));
190    println!("===== Running tests using device indx: 0 =====\n");
191
192    let (dev, mut err) = rtlsdr::open(index);
193    match err {
194        Error::NoError => println!("open successful"),
195        _ => return,
196    }
197
198    err = sdr_config(&dev);
199    match err {
200        Error::NoError => println!("sdr_config successful..."),
201        _ => return,
202    }
203
204    println!("calling read_sync...");
205    for i in 0..10 {
206        let (_, read_count, err) = dev.read_sync(rtlsdr::DEFAULT_BUF_LENGTH);
207        println!("----- read_sync requested iteration {} -----", i);
208        println!("\tread_sync requested - {}", rtlsdr::DEFAULT_BUF_LENGTH);
209        println!("\tread_sync received  - {}", read_count);
210        println!("\tread_sync err msg   - {:?}", err);
211    }
212
213    dev.reset_buffer();
214
215    // read_async is a blocking call and doesn't return until
216    // async_stop is called , so we spawn a thread that sleeps
217    // for a bit while our async callback is called...
218    let d = dev.clone();
219    thread::spawn(move || {
220        println!("async_stop thread sleeping for 5 seconds...");
221        thread::sleep(Duration::from_millis(5000));
222        println!("async_stop thread awake, canceling read async...");
223        d.cancel_async();
224    });
225
226    println!("calling read_async...");
227    err = dev.read_async(Some(read_async_callback),
228                         ptr::null_mut(),
229                         rtlsdr::DEFAULT_ASYNC_BUF_NUMBER,
230                         rtlsdr::DEFAULT_BUF_LENGTH);
231    match err {
232        Error::NoError => println!("device close successful..."),
233        _ => println!("dev close error - {:?}", err),
234    }
235
236    err = dev.close();
237    match err {
238        Error::NoError => println!("device close successful..."),
239        _ => println!("dev close error - {:?}", err),
240    }
241}