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 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 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 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), };
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 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 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 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 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 err = dev.reset_buffer();
139 match err {
140 Error::NoError => println!("reset_buffer successful..."),
141 _ => return err,
142 };
143
144 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 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 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 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}