summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2021-04-18 10:09:43 +0300
committerYuval Adam <_@yuv.al>2021-04-18 10:09:43 +0300
commit4965dfdb43111d002c262c4de3011359e41bd2c3 (patch)
tree3da7f36b3a698805eb8d05b95d88f93877a41bec
parent23dd9ed9eede40d033c22645fdc3eec310901b9b (diff)
Handle refactoring WIP
-rw-r--r--src/lib.rs20
-rw-r--r--src/usb.rs18
-rw-r--r--src/utils/rustl_test.rs15
3 files changed, 38 insertions, 15 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 1a5e6b2..c5a6499 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -19,19 +19,18 @@ const KNOWN_DEVICES: [(u16, u16, &str); 2] = [
const KNOWN_TUNERS: [TunerInfo; 2] = [r820t::TUNER_INFO, fc0013::TUNER_INFO];
pub struct RtlSdr {
- // ctx: rusb::Context,
- // device: UsbDevice,
iface_id: u8,
tuner: Option<Box<dyn Tuner>>,
+ handle: Option<RtlSdrDeviceHandle>,
}
impl RtlSdr {
pub fn new() -> RtlSdr {
pretty_env_logger::init();
RtlSdr {
- // ctx: rusb::Context::new().unwrap(),
iface_id: INTERFACE_ID,
tuner: None,
+ handle: None,
}
}
@@ -49,6 +48,7 @@ impl RtlSdr {
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);
+ self.handle = Some(handle);
// let kernel_driver_attached = handle.detach_kernel_driver();
let _iface = handle.claim_interface();
@@ -117,7 +117,19 @@ impl RtlSdr {
}
pub fn set_sample_rate(&self, samp_rate: u32) {
- self.handle.set_sample_rate(samp_rate);
+ self.handle.unwrap().set_sample_rate(samp_rate);
+ }
+
+ pub fn set_test_mode(&self, on: bool) {
+ let val = match on {
+ true => 0x03,
+ false => 0x05,
+ };
+ self.handle.unwrap().demod_write_reg(0, 0x19, val, 1);
+ }
+
+ pub fn reset_buffer(&self) {
+ self.handle.unwrap().reset_buffer();
}
}
diff --git a/src/usb.rs b/src/usb.rs
index a83c853..463bb5d 100644
--- a/src/usb.rs
+++ b/src/usb.rs
@@ -4,6 +4,7 @@ extern crate rusb;
use log::{error, info};
use rusb::{DeviceHandle, Direction, GlobalContext, Recipient, RequestType};
+use std::convert::TryInto;
use std::time::Duration;
// const BLOCK_DEMODB: u16 = 0;
@@ -269,23 +270,22 @@ impl RtlSdrDeviceHandle {
info!("Exact sample rate is: {} Hz", real_rate);
self.set_i2c_repeater(true);
- self.tuner.set_bw(self.handle);
+ // self.tuner.set_bw(self.handle);
self.set_i2c_repeater(false);
- let mut tmp: u16 = rsamp_ratio >> 16;
- self.handle.demod_write_reg(1, 0x9f, tmp, 2);
- tmp = rsamp_ratio & 0xffff;
- self.handle.demod_write_reg(1, 0xa1, tmp, 2);
+ let mut tmp: u16 = (rsamp_ratio >> 16).try_into().unwrap();
+ self.demod_write_reg(1, 0x9f, tmp, 2);
+ tmp = (rsamp_ratio & 0xffff).try_into().unwrap();
+ self.demod_write_reg(1, 0xa1, tmp, 2);
// self.set_sample_freq_corr();
// reset demod (bit 3, soft_rst)
- self.handle.demod_write_reg(1, 0x01, 0x14, 1);
- self.handle.demod_write_reg(1, 0x01, 0x10, 1);
-
+ self.demod_write_reg(1, 0x01, 0x14, 1);
+ self.demod_write_reg(1, 0x01, 0x10, 1);
+
// self.set_offset_tuning();
}
-
pub fn reset_buffer(&self) {
self.write_reg(BLOCK_USBB, ADDR_USB_EPA_CTL, 0x1002, 2);
self.write_reg(BLOCK_USBB, ADDR_USB_EPA_CTL, 0x0000, 2);
diff --git a/src/utils/rustl_test.rs b/src/utils/rustl_test.rs
index 7d6309f..e9a8bf7 100644
--- a/src/utils/rustl_test.rs
+++ b/src/utils/rustl_test.rs
@@ -1,9 +1,20 @@
-const _DEFAULT_SAMPLE_RATE: u32 = 2048000;
+const DEFAULT_SAMPLE_RATE: u32 = 2048000;
const DEFAULT_BUF_LENGTH: usize = 16 * 16384;
pub fn main() {
println!("Starting rustl_test");
- let _buffer: [u8; DEFAULT_BUF_LENGTH];
let mut r = rustl_sdr::RtlSdr::new();
r.open();
+ r.set_sample_rate(DEFAULT_SAMPLE_RATE);
+ r.set_test_mode(true);
+ r.reset_buffer();
+ println!("Reading buffers in sync mode");
+ loop {
+ let samples = r.read_sync(DEFAULT_BUF_LENGTH);
+ println!(
+ "Expected {} samples and got {}",
+ DEFAULT_BUF_LENGTH,
+ samples.len()
+ )
+ }
}