diff --git a/Cargo.lock b/Cargo.lock index 98f3d4f3..6b89cb29 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2109,13 +2109,13 @@ dependencies = [ [[package]] name = "heapless" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1edcd5a338e64688fbdcb7531a846cfd3476a54784dcb918a0844682bc7ada5" +checksum = "2af2455f757db2b292a9b1768c4b70186d443bcb3b316252d6b540aec1cd89ed" dependencies = [ "defmt", "hash32 0.3.1", - "serde", + "serde_core", "stable_deref_trait", ] @@ -3751,21 +3751,20 @@ dependencies = [ [[package]] name = "nusb" -version = "0.1.14" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f861541f15de120eae5982923d073bfc0c1a65466561988c82d6e197734c19e" +checksum = "d0226f4db3ee78f820747cf713767722877f6449d7a0fcfbf2ec3b840969763f" dependencies = [ - "atomic-waker", - "core-foundation 0.9.4", + "core-foundation 0.10.1", "core-foundation-sys", "futures-core", "io-kit-sys", - "libc", + "linux-raw-sys 0.9.4", "log", "once_cell", - "rustix 0.38.44", + "rustix 1.0.7", "slab", - "windows-sys 0.48.0", + "windows-sys 0.60.2", ] [[package]] @@ -4243,7 +4242,7 @@ name = "pigdef" version = "0.7.3" dependencies = [ "embassy-time", - "heapless 0.9.1", + "heapless 0.9.2", "serde", "tempfile", ] diff --git a/pigdef/Cargo.toml b/pigdef/Cargo.toml index 2476b36f..404e03c7 100644 --- a/pigdef/Cargo.toml +++ b/pigdef/Cargo.toml @@ -24,7 +24,7 @@ std = ["serde/std"] serde = { version = "1.0.228", default-features = false, features = ["derive"] } # Optional Dependencies for "no_std" case -heapless = { version = "0.9.1", default-features = false, features = ["serde", "defmt"], optional = true } +heapless = { version = "0.9.2", default-features = false, features = ["serde", "defmt"], optional = true } embassy-time = { version = "0.5.0", default-features = false, features = ["defmt", "defmt-timestamp-uptime"], optional = true } [target.'cfg(not(target_arch = "wasm32"))'.dev-dependencies] diff --git a/pignet/Cargo.toml b/pignet/Cargo.toml index 252dcffb..8b1dec8c 100644 --- a/pignet/Cargo.toml +++ b/pignet/Cargo.toml @@ -28,7 +28,7 @@ async-std = "1.13.2" iroh = { version = "0.95.1", default-features = false, optional = true } tokio = { version = "1.48.0", default-features = false, features = ["time"], optional = true } -nusb = { version = "0.1.14", default-features = false, optional = true } +nusb = { version = "0.2.1", default-features = false, optional = true } serde = { version = "1.0.228", default-features = false, features = ["derive"], optional = true } rand = { version = "0.9.2", default-features = false, features = ["std", "std_rng"], optional = true } rand_core = { version = "0.6.4", optional = true } diff --git a/pignet/src/usb_host.rs b/pignet/src/usb_host.rs index f3f0508d..38ad7b0e 100644 --- a/pignet/src/usb_host.rs +++ b/pignet/src/usb_host.rs @@ -5,8 +5,12 @@ use crate::discovery::DiscoveryMethod::USBRaw; #[cfg(all(feature = "usb", feature = "discovery"))] use crate::HardwareConnection; use anyhow::{anyhow, Error}; -use nusb::transfer::{ControlIn, ControlOut, ControlType, Recipient, RequestBuffer}; +use nusb::transfer::Buffer; +use nusb::transfer::In; +use nusb::transfer::Interrupt; +use nusb::transfer::{ControlIn, ControlOut, ControlType, Recipient}; use nusb::Interface; +use nusb::MaybeFuture; use pigdef::config::HardwareConfigMessage::Disconnect; use pigdef::config::{HardwareConfig, HardwareConfigMessage}; #[cfg(feature = "discovery")] @@ -30,6 +34,9 @@ use std::collections::HashMap; use std::net::IpAddr; use std::time::Duration; +const CONTROL_IN_TIMEOUT: Duration = Duration::from_secs(10); +const CONTROL_OUT_TIMEOUT: Duration = Duration::from_secs(10); + /// [ControlIn] "command" to request the [HardwareDescription] const GET_HARDWARE_DESCRIPTION: ControlIn = ControlIn { control_type: ControlType::Vendor, @@ -77,9 +84,8 @@ async fn receive_control_in(porky: &Interface, control_in: ControlIn) -> Resu where T: for<'a> Deserialize<'a>, { - let response = porky.control_in(control_in).await; - response.status?; - let data = response.data; + let response = porky.control_in(control_in, CONTROL_IN_TIMEOUT).await; + let data = response?; let length = data.len(); Ok(postcard::from_bytes(&data[0..length])?) } @@ -115,20 +121,21 @@ pub async fn get_wifi_details(porky: &Interface) -> Result { /// Generic request to send data to device over USB [ControlOut] async fn send_control_out(porky: &Interface, control_out: ControlOut<'_>) -> Result<(), Error> { - Ok(porky.control_out(control_out).await.status?) + Ok(porky.control_out(control_out, CONTROL_OUT_TIMEOUT).await?) } /// Get the [Interface] of a specific USB device using its [SerialNumber] /// NOTE: The `target_serial` could be a partial serial number, to make life easier async fn interface_from_serial(target_serial: &SerialNumber) -> Result { - for device_info in - nusb::list_devices()?.filter(|d| d.vendor_id() == 0xbabe && d.product_id() == 0xface) + for device_info in nusb::list_devices() + .wait()? + .filter(|d| d.vendor_id() == 0xbabe && d.product_id() == 0xface) { if let Some(serial_number) = device_info.serial_number() { if serial_number.contains(target_serial) { - let device = device_info.open()?; - let interface = device.claim_interface(0)?; - interface.set_alt_setting(1)?; + let device = device_info.open().wait()?; + let interface = device.claim_interface(0).wait()?; + interface.set_alt_setting(1).wait()?; return Ok(interface); } } @@ -174,11 +181,16 @@ pub async fn wait_for_remote_message(porky: &UsbConnection) -> Result(0x81)?; + loop { - let buf = RequestBuffer::new(1024); - let bytes = porky.interface.interrupt_in(0x81, buf).await; - if bytes.status.is_ok() { - let msg = postcard::from_bytes(&bytes.data)?; + endpoint.submit(Buffer::new(1024)); + let completion = endpoint.next_complete().await; + if completion.status.is_ok() { + let msg = postcard::from_bytes(&completion.buffer)?; return Ok(msg); } tokio::time::sleep(Duration::from_secs(1)).await; @@ -227,7 +239,8 @@ pub async fn connect( /// Return a Vec of the [SerialNumber] of all compatible connected devices #[cfg(all(feature = "usb", feature = "discovery"))] pub async fn get_serials() -> Result, Error> { - Ok(nusb::list_devices()? + Ok(nusb::list_devices() + .wait()? .filter(|d| d.vendor_id() == 0xbabe && d.product_id() == 0xface) .filter_map(|device_info| { device_info @@ -242,7 +255,7 @@ pub async fn get_serials() -> Result, Error> { pub async fn get_details( serial_numbers: &[SerialNumber], ) -> Result, Error> { - let device_list = nusb::list_devices()?; + let device_list = nusb::list_devices().wait()?; let mut devices = HashMap::::new(); for device_info in device_list.filter(|d| d.vendor_id() == 0xbabe && d.product_id() == 0xface) { @@ -250,9 +263,9 @@ pub async fn get_details( .serial_number() .ok_or(anyhow!("Could not get device serial_number"))?; if serial_numbers.contains(&serial_number.to_string()) { - let device = device_info.open()?; - let interface = device.claim_interface(0)?; - interface.set_alt_setting(1)?; + let device = device_info.open().wait()?; + let interface = device.claim_interface(0).wait()?; + interface.set_alt_setting(1).wait()?; let hardware_details = get_hardware_details(&interface).await?; let wifi_details = if hardware_details.wifi { diff --git a/porky/Cargo.lock b/porky/Cargo.lock index 4b9fee98..612eccdb 100644 --- a/porky/Cargo.lock +++ b/porky/Cargo.lock @@ -985,13 +985,13 @@ dependencies = [ [[package]] name = "heapless" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1edcd5a338e64688fbdcb7531a846cfd3476a54784dcb918a0844682bc7ada5" +checksum = "2af2455f757db2b292a9b1768c4b70186d443bcb3b316252d6b540aec1cd89ed" dependencies = [ "defmt 1.0.1", "hash32 0.3.1", - "serde", + "serde_core", "stable_deref_trait", ] @@ -1256,7 +1256,7 @@ name = "pigdef" version = "0.7.3" dependencies = [ "embassy-time 0.5.0", - "heapless 0.9.1", + "heapless 0.9.2", "serde", ] @@ -1344,7 +1344,7 @@ dependencies = [ "embedded-io-async", "embedded-storage", "faster-hex", - "heapless 0.9.1", + "heapless 0.9.2", "panic-probe", "pigdef", "portable-atomic", diff --git a/porky/Cargo.toml b/porky/Cargo.toml index 1bf37dfd..d94e2ec4 100644 --- a/porky/Cargo.toml +++ b/porky/Cargo.toml @@ -57,7 +57,7 @@ faster-hex = { version = "0.10.0", default-features = false } serde = { version = "1.0.208", default-features = false, features = ["derive"] } postcard = { version = "1.0.10", default-features = false, features = ["heapless"] } -heapless = { version = "0.9.1", default-features = false, features = ["serde", "defmt"] } +heapless = { version = "0.9.2", default-features = false, features = ["serde", "defmt"] } edge-mdns = { version = "0.5.0", default-features = false, optional = true, features = ["io"] } #TODO check out "embassy" https://github.com/ivmarkov/edge-net/issues/63 edge-nal-embassy = { version = "0.5.0", default-features = false, optional = true }