diff options
| author | Yuval Adam <_@yuv.al> | 2021-04-17 11:39:57 +0300 |
|---|---|---|
| committer | Yuval Adam <_@yuv.al> | 2021-04-17 11:39:57 +0300 |
| commit | 4314ac519efce972760ecf302e290d0c38f31b65 (patch) | |
| tree | 4fac5f56ea52fc1e90e1393e4f2462963c7bc836 /src | |
| parent | 6199b1482e21f578cd64e5977a7a83a61d542cb5 (diff) | |
Fix tuner probing logic
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib.rs | 49 | ||||
| -rw-r--r-- | src/tuners/fc0013.rs | 4 | ||||
| -rw-r--r-- | src/tuners/mod.rs | 1 | ||||
| -rw-r--r-- | src/tuners/r820t.rs | 4 |
4 files changed, 43 insertions, 15 deletions
@@ -5,7 +5,7 @@ extern crate rusb; mod tuners; mod usb; -use log::{error, info, trace}; +use log::{error, info, trace, warn}; use tuners::*; use usb::RtlSdrDeviceHandle; @@ -44,7 +44,7 @@ impl RtlSdr { for kd in KNOWN_DEVICES.iter() { if kd.0 == vid && kd.1 == pid { - info!("Found {} {{{:04x}:{:04x}}}", kd.2, vid, pid); + info!("Found device {} {{{:04x}:{:04x}}}", kd.2, vid, pid); let usb_handle = dev.open().unwrap(); let mut handle = RtlSdrDeviceHandle::new(usb_handle, self.iface_id); // let kernel_driver_attached = handle.detach_kernel_driver(); @@ -58,40 +58,59 @@ impl RtlSdr { handle.set_i2c_repeater(true); { - let tuner: Box<dyn Tuner> = match self.search_tuner(&handle) { - Some(tuner) => match tuner { - r820t::TUNER_ID => Box::new(r820t::R820T::new(&handle)), - fc0013::TUNER_ID => Box::new(fc0013::FC0013::new(&handle)), - _ => { - error!("Could not find any valid tuner, aborting."); - return; - } - }, + let tuner_id = match self.search_tuner(&handle) { + Some(tid) => { + info!("Got tuner ID {}", tid); + tid + } None => { + error!("Could not find a value tuner, aborting."); + return; + } + }; + + let tuner: Box<dyn Tuner> = match tuner_id { + r820t::TUNER_ID => Box::new(r820t::R820T::new(&handle)), + fc0013::TUNER_ID => Box::new(fc0013::FC0013::new(&handle)), + _ => { error!("Could not find any valid tuner, aborting."); return; } }; + info!("Found tuner {}", tuner.display()); + tuner.init(); } } } } - error!("Could not find any RTL-SDR device, aborting.") } /// 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) { + let regval = handle.i2c_read_reg(tuner_info.i2c_addr, tuner_info.check_addr); + trace!( + "Probing I2C address {:#02x} checking address {:#02x}", + tuner_info.i2c_addr, + tuner_info.check_addr, + ); + match regval { Ok(val) => { + trace!( + "Expecting value {:#02x}, got value {:#02x}", + tuner_info.check_val, + val + ); if val == tuner_info.check_val { - return Some(tuner_info.name); + return Some(tuner_info.id); } } - Err(_) => {} + Err(_) => { + warn!("Reading failed, continuing"); + } }; } None diff --git a/src/tuners/fc0013.rs b/src/tuners/fc0013.rs index 9eb03f4..9534b7d 100644 --- a/src/tuners/fc0013.rs +++ b/src/tuners/fc0013.rs @@ -53,4 +53,8 @@ impl<'a> Tuner for FC0013<'a> { fn set_gain_mode(&self, _mode: bool) { unimplemented!() } + + fn display(&self) -> &str { + self.device.name + } } diff --git a/src/tuners/mod.rs b/src/tuners/mod.rs index cbd7edf..0739fad 100644 --- a/src/tuners/mod.rs +++ b/src/tuners/mod.rs @@ -17,4 +17,5 @@ pub trait Tuner { fn set_gain(&self, gain: u32); fn set_if_gain(&self, if_gain: u32); fn set_gain_mode(&self, mode: bool); + fn display(&self) -> &str; } diff --git a/src/tuners/r820t.rs b/src/tuners/r820t.rs index 2638917..74ac740 100644 --- a/src/tuners/r820t.rs +++ b/src/tuners/r820t.rs @@ -70,4 +70,8 @@ impl<'a> Tuner for R820T<'a> { fn set_gain_mode(&self, _mode: bool) { unimplemented!() } + + fn display(&self) -> &str { + self.device.name + } } |
