POC Rust reading card with disconnect

This commit is contained in:
Martin Quarda 2025-05-08 13:42:25 +02:00
parent de55f7fd49
commit c832a15c16
2 changed files with 35 additions and 6 deletions

View File

@ -4,4 +4,6 @@ version = "0.1.0"
edition = "2024"
[dependencies]
env_logger = "0.11.8"
futures-lite = "2.6.0"
nusb = "0.1.13"

View File

@ -1,11 +1,38 @@
use nusb;
use futures_lite::future::block_on;
use nusb::{transfer::{ RequestBuffer, TransferError }, Interface};
use std::{thread, time};
static USB_VENDOR: u16 = 0xffff;
static USB_PRODUCT: u16 = 0x0035;
fn main() {
let dev = nusb::list_devices().unwrap().find(|dev| dev.vendor_id() == USB_VENDOR && dev.product_id() == USB_PRODUCT).expect("Device not connected!");
let device = dev.open().expect("failed to open device");
let interface = device.claim_interface(0).expect("failed to claim interface");
println!("Success")
fn get_interface() -> Option<Interface> {
let dev = nusb::list_devices().ok()?.find(|dev| dev.vendor_id() == USB_VENDOR && dev.product_id() == USB_PRODUCT)?;
let device = dev.open().ok()?;
device.detach_and_claim_interface(0).ok()
}
fn main() {
env_logger::init();
let mut interface = get_interface().unwrap();
loop {
let buf = RequestBuffer::new(8);
let data = block_on(interface.interrupt_in(
0x81, buf
));
match data.status {
Err(TransferError::Disconnected) => {
interface = (||{loop{
if let Some(intfc) = get_interface(){
return intfc;
}
let ten_milis = time::Duration::from_millis(10);
thread::sleep(ten_milis);
}})()
}
Ok(()) => {
println!("{:?}", data.data);
}
_ => todo!()
}
}
}