EndpointRead / EndpointWrite examples with tokio and smol
This commit is contained in:
parent
eb12376bc2
commit
371b91c85f
4 changed files with 221 additions and 1 deletions
10
Cargo.toml
10
Cargo.toml
|
|
@ -19,6 +19,7 @@ slab = "0.4.9"
|
|||
[dev-dependencies]
|
||||
env_logger = "0.11"
|
||||
futures-lite = "2.0"
|
||||
tokio = { version = "1", features = ["rt", "macros", "io-util", "rt-multi-thread"] }
|
||||
|
||||
[target.'cfg(any(target_os="linux", target_os="android"))'.dependencies]
|
||||
rustix = { version = "1.0.1", features = ["fs", "event", "net", "time", "mm"] }
|
||||
|
|
@ -49,3 +50,12 @@ unexpected_cfgs = { level = "warn", check-cfg = ['cfg(fuzzing)'] }
|
|||
|
||||
[package.metadata.docs.rs]
|
||||
all-features = true
|
||||
|
||||
[[example]]
|
||||
name = "bulk_io_smol"
|
||||
required-features = ["smol"]
|
||||
|
||||
[[example]]
|
||||
name = "bulk_io_tokio"
|
||||
required-features = ["tokio"]
|
||||
|
||||
|
|
|
|||
|
|
@ -31,7 +31,8 @@ fn main() {
|
|||
let mut reader = main_interface
|
||||
.endpoint::<Bulk, In>(0x83)
|
||||
.unwrap()
|
||||
.reader(128);
|
||||
.reader(128)
|
||||
.with_num_transfers(8);
|
||||
|
||||
writer.write_all(&[1; 16]).unwrap();
|
||||
writer.write_all(&[2; 256]).unwrap();
|
||||
|
|
@ -47,6 +48,21 @@ fn main() {
|
|||
|
||||
dbg!(reader.fill_buf().unwrap().len());
|
||||
|
||||
let mut buf = [0; 1000];
|
||||
for len in 0..1000 {
|
||||
reader.read_exact(&mut buf[..len]).unwrap();
|
||||
writer.write_all(&buf[..len]).unwrap();
|
||||
}
|
||||
|
||||
reader.cancel_all();
|
||||
loop {
|
||||
let n = reader.read(&mut buf).unwrap();
|
||||
dbg!(n);
|
||||
if n == 0 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let echo_interface = device.claim_interface(1).wait().unwrap();
|
||||
echo_interface.set_alt_setting(1).wait().unwrap();
|
||||
|
||||
|
|
|
|||
99
examples/bulk_io_smol.rs
Normal file
99
examples/bulk_io_smol.rs
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
use std::time::Duration;
|
||||
|
||||
use nusb::{
|
||||
transfer::{Bulk, In, Out},
|
||||
MaybeFuture,
|
||||
};
|
||||
|
||||
use futures_lite::io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt};
|
||||
|
||||
fn main() {
|
||||
env_logger::init();
|
||||
let di = nusb::list_devices()
|
||||
.wait()
|
||||
.unwrap()
|
||||
.find(|d| d.vendor_id() == 0x59e3 && d.product_id() == 0x00aa)
|
||||
.expect("device should be connected");
|
||||
|
||||
println!("Device info: {di:?}");
|
||||
|
||||
futures_lite::future::block_on(async {
|
||||
let device = di.open().await.unwrap();
|
||||
|
||||
let main_interface = device.claim_interface(0).await.unwrap();
|
||||
|
||||
let mut writer = main_interface
|
||||
.endpoint::<Bulk, Out>(0x03)
|
||||
.unwrap()
|
||||
.writer(128)
|
||||
.with_num_transfers(8);
|
||||
|
||||
let mut reader = main_interface
|
||||
.endpoint::<Bulk, In>(0x83)
|
||||
.unwrap()
|
||||
.reader(128)
|
||||
.with_num_transfers(8);
|
||||
|
||||
writer.write_all(&[1; 16]).await.unwrap();
|
||||
writer.write_all(&[2; 256]).await.unwrap();
|
||||
writer.flush().await.unwrap();
|
||||
writer.write_all(&[3; 64]).await.unwrap();
|
||||
writer.flush_end_async().await.unwrap();
|
||||
|
||||
let mut buf = [0; 16];
|
||||
reader.read_exact(&mut buf).await.unwrap();
|
||||
|
||||
let mut buf = [0; 64];
|
||||
reader.read_exact(&mut buf).await.unwrap();
|
||||
|
||||
dbg!(reader.fill_buf().await.unwrap().len());
|
||||
|
||||
let mut buf = [0; 1000];
|
||||
for len in 0..1000 {
|
||||
reader.read_exact(&mut buf[..len]).await.unwrap();
|
||||
writer.write_all(&buf[..len]).await.unwrap();
|
||||
}
|
||||
|
||||
reader.cancel_all();
|
||||
loop {
|
||||
let n = reader.read(&mut buf).await.unwrap();
|
||||
dbg!(n);
|
||||
if n == 0 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let echo_interface = device.claim_interface(1).await.unwrap();
|
||||
echo_interface.set_alt_setting(1).await.unwrap();
|
||||
|
||||
let mut writer = echo_interface
|
||||
.endpoint::<Bulk, Out>(0x01)
|
||||
.unwrap()
|
||||
.writer(64)
|
||||
.with_num_transfers(1);
|
||||
let mut reader = echo_interface
|
||||
.endpoint::<Bulk, In>(0x81)
|
||||
.unwrap()
|
||||
.reader(64)
|
||||
.with_num_transfers(8)
|
||||
.with_read_timeout(Duration::from_millis(100));
|
||||
|
||||
let mut pkt_reader = reader.until_short_packet();
|
||||
|
||||
writer.write_all(&[1; 16]).await.unwrap();
|
||||
writer.flush_end_async().await.unwrap();
|
||||
|
||||
writer.write_all(&[2; 128]).await.unwrap();
|
||||
writer.flush_end_async().await.unwrap();
|
||||
|
||||
let mut v = Vec::new();
|
||||
pkt_reader.read_to_end(&mut v).await.unwrap();
|
||||
assert_eq!(&v[..], &[1; 16]);
|
||||
pkt_reader.consume_end().unwrap();
|
||||
|
||||
let mut v = Vec::new();
|
||||
pkt_reader.read_to_end(&mut v).await.unwrap();
|
||||
assert_eq!(&v[..], &[2; 128]);
|
||||
pkt_reader.consume_end().unwrap();
|
||||
})
|
||||
}
|
||||
95
examples/bulk_io_tokio.rs
Normal file
95
examples/bulk_io_tokio.rs
Normal file
|
|
@ -0,0 +1,95 @@
|
|||
use std::time::Duration;
|
||||
|
||||
use nusb::transfer::{Bulk, In, Out};
|
||||
|
||||
use tokio::io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt};
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
env_logger::init();
|
||||
let di = nusb::list_devices()
|
||||
.await
|
||||
.unwrap()
|
||||
.find(|d| d.vendor_id() == 0x59e3 && d.product_id() == 0x00aa)
|
||||
.expect("device should be connected");
|
||||
|
||||
println!("Device info: {di:?}");
|
||||
|
||||
let device = di.open().await.unwrap();
|
||||
|
||||
let main_interface = device.claim_interface(0).await.unwrap();
|
||||
|
||||
let mut writer = main_interface
|
||||
.endpoint::<Bulk, Out>(0x03)
|
||||
.unwrap()
|
||||
.writer(128)
|
||||
.with_num_transfers(8);
|
||||
|
||||
let mut reader = main_interface
|
||||
.endpoint::<Bulk, In>(0x83)
|
||||
.unwrap()
|
||||
.reader(128)
|
||||
.with_num_transfers(8);
|
||||
|
||||
writer.write_all(&[1; 16]).await.unwrap();
|
||||
writer.write_all(&[2; 256]).await.unwrap();
|
||||
writer.flush().await.unwrap();
|
||||
writer.write_all(&[3; 64]).await.unwrap();
|
||||
writer.flush_end_async().await.unwrap();
|
||||
|
||||
let mut buf = [0; 16];
|
||||
reader.read_exact(&mut buf).await.unwrap();
|
||||
|
||||
let mut buf = [0; 64];
|
||||
reader.read_exact(&mut buf).await.unwrap();
|
||||
|
||||
dbg!(reader.fill_buf().await.unwrap().len());
|
||||
|
||||
let mut buf = [0; 1000];
|
||||
for len in 0..1000 {
|
||||
reader.read_exact(&mut buf[..len]).await.unwrap();
|
||||
writer.write_all(&buf[..len]).await.unwrap();
|
||||
}
|
||||
|
||||
reader.cancel_all();
|
||||
loop {
|
||||
let n = reader.read(&mut buf).await.unwrap();
|
||||
dbg!(n);
|
||||
if n == 0 {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
let echo_interface = device.claim_interface(1).await.unwrap();
|
||||
echo_interface.set_alt_setting(1).await.unwrap();
|
||||
|
||||
let mut writer = echo_interface
|
||||
.endpoint::<Bulk, Out>(0x01)
|
||||
.unwrap()
|
||||
.writer(64)
|
||||
.with_num_transfers(1);
|
||||
let mut reader = echo_interface
|
||||
.endpoint::<Bulk, In>(0x81)
|
||||
.unwrap()
|
||||
.reader(64)
|
||||
.with_num_transfers(8)
|
||||
.with_read_timeout(Duration::from_millis(100));
|
||||
|
||||
let mut pkt_reader = reader.until_short_packet();
|
||||
|
||||
writer.write_all(&[1; 16]).await.unwrap();
|
||||
writer.flush_end_async().await.unwrap();
|
||||
|
||||
writer.write_all(&[2; 128]).await.unwrap();
|
||||
writer.flush_end_async().await.unwrap();
|
||||
|
||||
let mut v = Vec::new();
|
||||
pkt_reader.read_to_end(&mut v).await.unwrap();
|
||||
assert_eq!(&v[..], &[1; 16]);
|
||||
pkt_reader.consume_end().unwrap();
|
||||
|
||||
let mut v = Vec::new();
|
||||
pkt_reader.read_to_end(&mut v).await.unwrap();
|
||||
assert_eq!(&v[..], &[2; 128]);
|
||||
pkt_reader.consume_end().unwrap();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue