summaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2021-04-16 17:23:10 +0300
committerYuval Adam <_@yuv.al>2021-04-17 10:33:57 +0300
commit01824ebaa3096d40a962b921ed239241f92e1076 (patch)
tree1b3d9f810b5086e52678fbed7f6e96e9e39d4cdf /src/lib.rs
parent199f7cfb5749a1810db7923780e5a65eb17b8e11 (diff)
Implement search_tuner()
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs57
1 files changed, 33 insertions, 24 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 41aede9..b3c2a05 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -13,7 +13,7 @@ const KNOWN_DEVICES: [(u16, u16, &str); 2] = [
(0x0bda, 0x2838, "Generic RTL2832U OEM"),
];
-const KNOWN_TUNERS: [DeviceInfo; 2] = [r820t::DEVICE_INFO, fc0013::DEVICE_INFO];
+const KNOWN_TUNERS: [TunerInfo; 2] = [r820t::TUNER_INFO, fc0013::TUNER_INFO];
pub struct RtlSdr {
// ctx: rusb::Context,
@@ -29,8 +29,8 @@ impl RtlSdr {
}
}
- pub fn open(&mut self) -> bool {
- let mut found = false;
+ /// Open a new RTL-SDR device
+ pub fn open(&mut self) {
for dev in rusb::devices().unwrap().iter() {
let desc = dev.device_descriptor().unwrap();
let vid = desc.vendor_id();
@@ -51,28 +51,22 @@ impl RtlSdr {
handle.init_baseband();
handle.set_i2c_repeater(true);
- for tuner_info in KNOWN_TUNERS.iter() {
- match handle.i2c_read_reg(tuner_info.i2c_addr, tuner_info.check_addr) {
- Ok(val) => {
- if val == tuner_info.check_val {
- println!("Found {} tuner\n", tuner_info.name);
- found = true;
- break;
- } else {
- println!(
- "Mismatch in {} tuner expected {} found {}\n",
- tuner_info.name, tuner_info.check_val, val
- );
- }
+ let tuner = match self.search_tuner(&handle) {
+ Some(tuner) => match tuner {
+ "r820t" => Some(r820t::R820T::new(&handle)),
+ _ => {
+ println!("No valid tuner found");
+ return;
}
- Err(_) => {}
- };
- }
+ },
+ None => {
+ println!("No valid tuner found");
+ return;
+ }
+ };
- // {
- // let d = r820t::R820T::new(&handle);
- // d.init();
- // }
+ let tuner = tuner.unwrap();
+ tuner.init();
// handle.deinit_baseband();
@@ -84,7 +78,22 @@ impl RtlSdr {
}
}
}
- found
+ }
+
+ /// Probe all known tuners at their I2C addresses
+ /// and search for expected return values
+ fn search_tuner(&mut self, handle: &RtlSdrDeviceHandle) -> Option<&str> {
+ for tuner_info in KNOWN_TUNERS.iter() {
+ match handle.i2c_read_reg(tuner_info.i2c_addr, tuner_info.check_addr) {
+ Ok(val) => {
+ if val == tuner_info.check_val {
+ return Some(tuner_info.name);
+ }
+ }
+ Err(_) => {}
+ };
+ }
+ None
}
}