Updated list command to handle errors

This commit is contained in:
2025-04-30 21:49:09 -04:00
parent aa38d3c29c
commit 973054517c
2 changed files with 51 additions and 27 deletions

View File

@@ -18,10 +18,17 @@ pub struct RtlSdrDevice {
impl RtlSdrDevice {
/// List devices
pub fn list() -> Result<()> {
for device in DeviceList::new()?.iter() {
let device_desc = device.device_descriptor()?;
pub fn list() {
let device_list = match DeviceList::new() {
Ok(d) => d,
Err(err) => {
eprintln!("Unable to get device list: {:?}", err);
return;
}
};
for device in device_list.iter() {
match device.device_descriptor() {
Ok(device_desc) => {
println!(
"Bus: {:03}, Device: {:03} VID: 0x{:04X}, PID: 0x{:04X}",
device.bus_number(),
@@ -30,11 +37,22 @@ impl RtlSdrDevice {
device_desc.product_id()
);
let handle = device.open()?;
println!("{}", device_info(&handle, &device_desc, " ", true)?);
match device.open() {
Ok(handle) => {
println!("{}", device_info(&handle, &device_desc, " ", true));
},
Err(err) => {
eprintln!(" Unable to open device: {:?}", err);
continue;
}
};
}
Err(err) => {
eprintln!("Unable to get device descriptor: {:?}", err);
continue;
}
};
}
Ok(())
}
/// Open the USB device and return a wrapper
@@ -67,10 +85,7 @@ impl RtlSdrDevice {
transfer_type
);
log::debug!(
"{}",
device_info(&self.handle, &self.device_desc, "", false)?
);
log::debug!("{}", device_info(&self.handle, &self.device_desc, "", false));
// Read endpoint
match Endpoint::find_readable(&self.device, &self.device_desc, transfer_type) {
@@ -87,8 +102,13 @@ fn device_info<T: UsbContext>(
device_desc: &DeviceDescriptor,
offset: &str,
full: bool,
) -> Result<String> {
let languages = handle.read_languages(TIMEOUT)?;
) -> String {
let languages = match handle.read_languages(TIMEOUT) {
Ok(l) => l,
Err(err) => {
return format!("{} Unable to get languages: {:?}", offset, err);
},
};
let descriptor_type = device_desc.descriptor_type();
let mut output = String::new();
if full {
@@ -96,9 +116,12 @@ fn device_info<T: UsbContext>(
}
if !languages.is_empty() {
for language in languages {
let manufacturer = handle.read_manufacturer_string(language, device_desc, TIMEOUT)?;
let product = handle.read_product_string(language, device_desc, TIMEOUT)?;
let serial_number = handle.read_serial_number_string(language, device_desc, TIMEOUT)?;
let manufacturer = handle.read_manufacturer_string(language, device_desc, TIMEOUT)
.unwrap_or_else(|err| err.to_string());
let product = handle.read_product_string(language, device_desc, TIMEOUT)
.unwrap_or_else(|err| err.to_string());
let serial_number = handle.read_serial_number_string(language, device_desc, TIMEOUT)
.unwrap_or_else(|err| err.to_string());
output.push_str(&format!(
"{}{}Manufacturer: {}, Product: {}, Serial Number: {}",
offset, offset, manufacturer, product, serial_number
@@ -121,13 +144,13 @@ fn device_info<T: UsbContext>(
let protocol = device_desc.protocol_code();
let max_packet_size = device_desc.max_packet_size();
output.push_str(&format!(
"{}{}Class: {:#04x}, Subclass: {:#04x}, Protocol: {:#04x}, Max Packet Size: {}",
"{}{}Class: {:#04x}, Subclass: {:#04x}, Protocol: {:#04x}, Max Packet Size: {}\n",
offset, offset, class, sub_class, protocol, max_packet_size
))
}
}
}
Ok(output)
output
}
#[derive(Debug)]

View File

@@ -49,7 +49,8 @@ fn main() -> Result<()> {
}
// List devices
else if args.list {
RtlSdrDevice::list()
RtlSdrDevice::list();
Ok(())
}
// Handle decode mode
else if let Some(mut hex_string) = args.decode {