diff options
| author | Yuval Adam <_@yuv.al> | 2021-04-16 16:23:40 +0300 |
|---|---|---|
| committer | Yuval Adam <_@yuv.al> | 2021-04-17 10:33:57 +0300 |
| commit | 199f7cfb5749a1810db7923780e5a65eb17b8e11 (patch) | |
| tree | b0d5bb4587aee70e31a8c3d92f846da7f56c26b1 | |
| parent | 10d566acd2bcd35c8969fc7991b050da01ceb74c (diff) | |
Device open logic works
| -rw-r--r-- | src/devices/fc0013.rs | 88 | ||||
| -rw-r--r-- | src/lib.rs | 59 |
2 files changed, 80 insertions, 67 deletions
diff --git a/src/devices/fc0013.rs b/src/devices/fc0013.rs index a8302b4..3a26218 100644 --- a/src/devices/fc0013.rs +++ b/src/devices/fc0013.rs @@ -1,54 +1,54 @@ -// use super::{Device, DeviceInfo}; +use super::{Device, DeviceInfo}; -// #[allow(dead_code)] -// pub struct FC0013 { -// pub device: DeviceInfo, -// } +#[allow(dead_code)] +pub struct FC0013 { + pub device: DeviceInfo, +} -// #[allow(dead_code)] -// pub const DEVICE_INFO: DeviceInfo = DeviceInfo { -// id: "fc0013", -// name: "Fitipower FC0013", -// i2c_addr: 0xc6, -// check_addr: 0x00, -// check_val: 0xa3, -// }; +#[allow(dead_code)] +pub const DEVICE_INFO: DeviceInfo = DeviceInfo { + id: "fc0013", + name: "Fitipower FC0013", + i2c_addr: 0xc6, + check_addr: 0x00, + check_val: 0xa3, +}; -// #[allow(dead_code)] -// impl FC0013 { -// pub fn new() -> FC0013 { -// FC0013 { -// device: DEVICE_INFO, -// } -// } -// } +#[allow(dead_code)] +impl FC0013 { + pub fn new() -> FC0013 { + FC0013 { + device: DEVICE_INFO, + } + } +} -// impl Device for FC0013 { -// fn init(&self) { -// println!("Init {}", self.device.name); -// } +impl Device for FC0013 { + fn init(&self) { + println!("Init {}", self.device.name); + } -// fn exit(&self) { -// unimplemented!() -// } + fn exit(&self) { + unimplemented!() + } -// fn set_freq(&self, _freq: u32) { -// unimplemented!() -// } + fn set_freq(&self, _freq: u32) { + unimplemented!() + } -// fn set_bw(&self, _bw: u32) { -// unimplemented!() -// } + fn set_bw(&self, _bw: u32) { + unimplemented!() + } -// fn set_gain(&self, _gain: u32) { -// unimplemented!() -// } + fn set_gain(&self, _gain: u32) { + unimplemented!() + } -// fn set_if_gain(&self, _if_gain: u32) { -// unimplemented!() -// } + fn set_if_gain(&self, _if_gain: u32) { + unimplemented!() + } -// fn set_gain_mode(&self, _mode: bool) { -// unimplemented!() -// } -// } + fn set_gain_mode(&self, _mode: bool) { + unimplemented!() + } +} @@ -13,6 +13,8 @@ const KNOWN_DEVICES: [(u16, u16, &str); 2] = [ (0x0bda, 0x2838, "Generic RTL2832U OEM"), ]; +const KNOWN_TUNERS: [DeviceInfo; 2] = [r820t::DEVICE_INFO, fc0013::DEVICE_INFO]; + pub struct RtlSdr { // ctx: rusb::Context, // device: UsbDevice, @@ -27,7 +29,8 @@ impl RtlSdr { } } - pub fn open(&mut self) { + pub fn open(&mut self) -> bool { + let mut found = false; for dev in rusb::devices().unwrap().iter() { let desc = dev.device_descriptor().unwrap(); let vid = desc.vendor_id(); @@ -35,9 +38,10 @@ impl RtlSdr { for kd in KNOWN_DEVICES.iter() { if kd.0 == vid && kd.1 == pid { + println!("Found USB device with vid {} and pid {}", 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(); + // let kernel_driver_attached = handle.detach_kernel_driver(); let _iface = handle.claim_interface(); @@ -47,31 +51,40 @@ impl RtlSdr { handle.init_baseband(); handle.set_i2c_repeater(true); - { - let d = r820t::R820T::new(&handle); - // let _found = match handle.i2c_read_reg(d.device.i2c_addr, d.device.check_addr) { - // Ok(reg) => { - // if reg == d.device.check_val { - // println!("Found {} tuner\n", d.device.name); - // true - // } else { - // false - // } - // } - // Err(_) => false, - // }; - - d.init(); + 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 + ); + } + } + Err(_) => {} + }; } - handle.deinit_baseband(); + // { + // let d = r820t::R820T::new(&handle); + // d.init(); + // } - if kernel_driver_attached { - handle.attach_kernel_driver(); - } + // handle.deinit_baseband(); + + // if kernel_driver_attached { + // handle.attach_kernel_driver(); + // } + } else { + println!("No match for vid {} and pid {}", vid, pid); } } } + found } } @@ -82,7 +95,7 @@ mod tests { #[test] fn test_init() { let mut rtlsdr = RtlSdr::new(); - let x = rtlsdr.open(); - assert_eq!(x, 1); + let found = rtlsdr.open(); + assert_eq!(found, true); } } |
