From 8916126e04fe26f175b108d587f495f49e1b619c Mon Sep 17 00:00:00 2001 From: Kevin Mehall Date: Sun, 28 Apr 2024 16:44:35 -0600 Subject: [PATCH] Add Interface::{interface_number, descriptors} --- src/device.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/device.rs b/src/device.rs index dfa58d3..f146a93 100644 --- a/src/device.rs +++ b/src/device.rs @@ -3,7 +3,7 @@ use std::{io::ErrorKind, sync::Arc, time::Duration}; use log::error; use crate::{ - descriptors::{ActiveConfigurationError, Configuration}, + descriptors::{ActiveConfigurationError, Configuration, InterfaceAltSetting}, platform, transfer::{ Control, ControlIn, ControlOut, EndpointType, Queue, RequestBuffer, TransferError, @@ -535,6 +535,30 @@ impl Interface { pub fn clear_halt(&self, endpoint: u8) -> Result<(), Error> { self.backend.clear_halt(endpoint) } + + /// Get the interface number. + pub fn interface_number(&self) -> u8 { + self.backend.interface_number + } + + /// Get the interface descriptors for the alternate settings of this interface. + /// + /// This returns cached data and does not perform IO. + pub fn descriptors(&self) -> impl Iterator { + let active = self.backend.device.active_configuration_value(); + + let configuration = self + .backend + .device + .configuration_descriptors() + .map(Configuration::new) + .find(|c| c.configuration_value() == active); + + configuration + .into_iter() + .flat_map(|i| i.interface_alt_settings()) + .filter(|g| g.interface_number() == self.backend.interface_number) + } } #[test]