unit mr.dev.usb.configuration; interface uses Generics.Collections, mr.drv.usb, mr.drv.usb.types, mr.dev.usb.pipe, mr.dev.usb.pipe0; type TUsbConfiguration = class strict protected type TPipeMap = TObjectDictionary; strict protected fDriver : TUsbDriver; fPipeMap : TPipeMap; fConfiguration : TUsbConfigurationDescriptor; strict protected function GetPipe( id: byte): TPipe; public constructor Create( Driver: TUsbDriver); destructor Destroy; override; procedure AfterConstruction; override; procedure BeforeDestruction; override; public property Pipes[i:byte] : TPipe read GetPipe; end; implementation uses SysUtils, Windows; { TUsbConfiguration } // @@@: Construction / destruction ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // // Construction / destruction // // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // ================================================================================================ // Constructor // ================================================================================================ constructor TUsbConfiguration.Create(Driver: TUsbDriver); begin fDriver := Driver; fPipeMap := TPipeMap.Create([doOwnsValues]); end; // ================================================================================================ // Destructor // ================================================================================================ destructor TUsbConfiguration.Destroy; begin FreeAndNil(fPipeMap); inherited; end; // ================================================================================================ // After construction // ================================================================================================ procedure TUsbConfiguration.AfterConstruction; var intf : TUsbAlternateSettingDescriptor; info : TusbPipeInformation; pipe : TPipe; len : cardinal; i : integer; begin inherited; if Assigned( fDriver) then begin // ------------------------------------------------------------ // Get configuration // ------------------------------------------------------------ fDriver.GetDescriptor( DSCR_CONFIGURATION, 0, 0, @fConfiguration, sizeof( TUsbConfigurationDescriptor), len); // ------------------------------------------------------------ // Query interface/alternate settings // ------------------------------------------------------------ if fDriver.QueryInterfaceSettings(0,intf) then begin for i:=0 to intf.EndpointCount-1 do begin info.PipeType := ptIsochronous; info.PipeId := $FF; info.MaxPacketSize := $AABB; info.Interval := $CC; if fDriver.QueryPipe( 0, i, info) then begin pipe := TPipe.Create( fDriver, info); fPipeMap.Add( info.PipeId, pipe); end; end; end; end end; // ================================================================================================ // Before destruction // ================================================================================================ procedure TUsbConfiguration.BeforeDestruction; begin inherited end; // ================================================================================================ // Get Pipe by ID // ================================================================================================ function TUsbConfiguration.GetPipe(id: byte): TPipe; begin if not fPipeMap.TryGetValue( id, result) then result := nil; end; end.