co_usb
Loading...
Searching...
No Matches
Async transfer adapters

Coroutine adapters for async transfer API. More...

Concepts

concept  co_usb::transfer::detail::AnyBufferSequence
 Unified concept for buffer sequences.
 
concept  co_usb::transfer::detail::TransferResource
 A type which can provide a libusb_transfer *.
 
concept  co_usb::transfer::detail::TransferSequence
 A sequence of co_usb::transfer::detail::TransferResource.
 

Classes

struct  co_usb::transfer::detail::complete_io_base< TSeq >
 Complete I/O adapter for transfer sequences. More...
 
struct  co_usb::transfer::detail::direction_complete_io_base< TSeq, EpDirection >
 Interface complying with Boost.Http's ReadSource and WriteSink concepts. More...
 
struct  co_usb::transfer::control_complete_io< TSeq, EpDirection >
 Prefills the transfer sequence as control transfers and provides complete I/O operations. More...
 
struct  co_usb::transfer::bulk_complete_io< TSeq, EpDirection >
 Prefills the transfer sequence as bulk transfers and provides complete I/O operations. More...
 
struct  co_usb::transfer::interrupt_complete_io< TSeq, EpDirection >
 Prefills the transfer sequence as interrupt transfers and provides complete I/O operations. More...
 
struct  co_usb::transfer::isochronous_complete_io< TSeq, EpDirection >
 Prefills the transfer sequence as isochronous transfers and provides complete I/O operations. More...
 
struct  co_usb::transfer::bulk_stream_complete_io< TSeq, EpDirection >
 Prefills the transfer sequence as bulk stream transfers and provides complete I/O operations. More...
 
struct  co_usb::transfer::endpoint< Direction >
 USB endpoint aggregate templated on its direction. More...
 
struct  co_usb::transfer::detail::partial_io_base< TSeq >
 Zero-allocation adapter around a transfer sequence enabling the use of asynchronous partial I/O operations on a given transfer sequence. More...
 
struct  co_usb::transfer::detail::direction_partial_io_base< TSeq, EpDirection >
 Provides Capy ReadStream-/WriteStream-compliant interface for partial transfer I/O. More...
 
struct  co_usb::transfer::control_partial_io< TSeq, EpDirection >
 Prefills the transfer sequence as control transfers and provides partial I/O operations. More...
 
struct  co_usb::transfer::bulk_partial_io< TSeq, EpDirection >
 Prefills the transfer sequence as bulk transfers and provides partial I/O operations. More...
 
struct  co_usb::transfer::interrupt_partial_io< TSeq, EpDirection >
 Prefills the transfer sequence as interrupt transfers and provides partial I/O operations. More...
 
struct  co_usb::transfer::isochronous_partial_io< TSeq, EpDirection >
 Prefills the transfer sequence as isochronous transfers and provides partial I/O operations. More...
 
struct  co_usb::transfer::bulk_stream_partial_io< TSeq, EpDirection >
 Prefills the transfer sequence as bulk stream transfers and provides partial I/O operations. More...
 
struct  co_usb::transfer::resource
 RAII wrapper over a transfer allocation. More...
 
struct  co_usb::transfer::sequence_view< Seq >
 View of a certain transfer sequence. Provides a uniform range interface. More...
 

Typedefs

template<detail::TransferSequence TSeq>
using co_usb::transfer::control_sink = control_complete_io< TSeq, endpoint_direction::out >
 Write specialization of co_usb::transfer::control_complete_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::control_source = control_complete_io< TSeq, endpoint_direction::in >
 Read specialization of co_usb::transfer::control_complete_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_sink = bulk_complete_io< TSeq, endpoint_direction::out >
 Write specialization of co_usb::transfer::bulk_complete_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_source = bulk_complete_io< TSeq, endpoint_direction::in >
 Read specialization of co_usb::transfer::bulk_complete_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::interrupt_sink = interrupt_complete_io< TSeq, endpoint_direction::out >
 Write specialization of co_usb::transfer::interrupt_complete_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::interrupt_source = interrupt_complete_io< TSeq, endpoint_direction::in >
 Read specialization of co_usb::transfer::interrupt_complete_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::isochronous_sink = isochronous_complete_io< TSeq, endpoint_direction::out >
 Write specialization of co_usb::transfer::isochronous_complete_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::isochronous_source = isochronous_complete_io< TSeq, endpoint_direction::in >
 Read specialization of co_usb::transfer::isochronous_complete_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_stream_sink = bulk_stream_complete_io< TSeq, endpoint_direction::out >
 Write specialization of co_usb::transfer::bulk_stream_complete_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_stream_source = bulk_stream_complete_io< TSeq, endpoint_direction::in >
 Read specialization of co_usb::transfer::bulk_stream_complete_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::control_out = control_partial_io< TSeq, endpoint_direction::out >
 Write specialization of co_usb::transfer::control_partial_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::control_in = control_partial_io< TSeq, endpoint_direction::in >
 Read specialization of co_usb::transfer::control_partial_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_out = bulk_partial_io< TSeq, endpoint_direction::out >
 Write specialization of co_usb::transfer::bulk_partial_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_in = bulk_partial_io< TSeq, endpoint_direction::in >
 Read specialization of co_usb::transfer::bulk_partial_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::interrupt_out = interrupt_partial_io< TSeq, endpoint_direction::out >
 Write specialization of co_usb::transfer::interrupt_partial_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::interrupt_in = interrupt_partial_io< TSeq, endpoint_direction::in >
 Read specialization of co_usb::transfer::interrupt_partial_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::isochronous_out = isochronous_partial_io< TSeq, endpoint_direction::out >
 Write specialization of co_usb::transfer::isochronous_partial_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::isochronous_in = isochronous_partial_io< TSeq, endpoint_direction::in >
 Read specialization of co_usb::transfer::isochronous_partial_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_stream_out = bulk_stream_partial_io< TSeq, endpoint_direction::out >
 Write specialization of co_usb::transfer::bulk_stream_partial_io.
 
template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_stream_in = bulk_stream_partial_io< TSeq, endpoint_direction::in >
 Read specialization of co_usb::transfer::bulk_stream_partial_io.
 

Enumerations

enum class  co_usb::transfer::endpoint_direction { co_usb::transfer::endpoint_direction::out = 0x00 , co_usb::transfer::endpoint_direction::in = 0x80 , co_usb::transfer::endpoint_direction::any = 0xFF }
 Direction of an endpoint. More...
 
enum class  co_usb::transfer::status {
  co_usb::transfer::status::completed = LIBUSB_TRANSFER_COMPLETED , co_usb::transfer::status::error = LIBUSB_TRANSFER_ERROR , co_usb::transfer::status::timed_out = LIBUSB_TRANSFER_TIMED_OUT , co_usb::transfer::status::cancelled = LIBUSB_TRANSFER_CANCELLED ,
  co_usb::transfer::status::stall = LIBUSB_TRANSFER_STALL , co_usb::transfer::status::no_device = LIBUSB_TRANSFER_NO_DEVICE , co_usb::transfer::status::overflow = LIBUSB_TRANSFER_OVERFLOW
}
 Status codes for transfers. More...
 

Functions

template<TransferResource Ty>
constexpr auto co_usb::transfer::detail::transfer_of (Ty const &tfer_res) -> libusb_transfer *
 Uniform accessor for obtaining a libusb_transfer * from a co_usb::transfer::detail::TransferResource.
 
template<detail::TransferSequence TSeq>
constexpr auto co_usb::transfer::cancel_transfer (TSeq const &tfer_seq)
 Cancels transfers from a sequence.
 
template<detail::TransferSequence TSeq, endpoint_direction EpDirection>
constexpr auto co_usb::transfer::prefill_control (TSeq const &tfer_seq, endpoint< EpDirection > ep, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
 Prefills transfer sequence as control transfers.
 
template<detail::TransferSequence TSeq, endpoint_direction EpDirection>
constexpr auto co_usb::transfer::prefill_bulk (TSeq const &tfer_seq, endpoint< EpDirection > ep, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
 Prefills transfer sequence as bulk transfers.
 
template<detail::TransferSequence TSeq, endpoint_direction EpDirection>
constexpr auto co_usb::transfer::prefill_interrupt (TSeq const &tfer_seq, endpoint< EpDirection > ep, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
 Prefills transfer sequence as interrupt transfers.
 
template<detail::TransferSequence TSeq, endpoint_direction EpDirection>
constexpr auto co_usb::transfer::prefill_isochronous (TSeq const &tfer_seq, endpoint< EpDirection > ep, int iso_packets, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
 Prefills transfer sequence as isochronous transfers.
 
template<detail::TransferSequence TSeq, endpoint_direction EpDirection>
constexpr auto co_usb::transfer::prefill_bulk_stream (TSeq const &tfer_seq, endpoint< EpDirection > ep, uint32_t stream_id, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
 Prefills transfer sequence as bulk stream transfers.
 

Detailed Description

Coroutine adapters for async transfer API.

Typedef Documentation

◆ bulk_in

template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_in = typedef bulk_partial_io<TSeq, endpoint_direction::in>

Read specialization of co_usb::transfer::bulk_partial_io.

◆ bulk_out

template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_out = typedef bulk_partial_io<TSeq, endpoint_direction::out>

Write specialization of co_usb::transfer::bulk_partial_io.

◆ bulk_sink

template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_sink = typedef bulk_complete_io<TSeq, endpoint_direction::out>

Write specialization of co_usb::transfer::bulk_complete_io.

◆ bulk_source

template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_source = typedef bulk_complete_io<TSeq, endpoint_direction::in>

Read specialization of co_usb::transfer::bulk_complete_io.

◆ bulk_stream_in

template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_stream_in = typedef bulk_stream_partial_io<TSeq, endpoint_direction::in>

◆ bulk_stream_out

template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_stream_out = typedef bulk_stream_partial_io<TSeq, endpoint_direction::out>

Write specialization of co_usb::transfer::bulk_stream_partial_io.

◆ bulk_stream_sink

template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_stream_sink = typedef bulk_stream_complete_io<TSeq, endpoint_direction::out>

◆ bulk_stream_source

template<detail::TransferSequence TSeq>
using co_usb::transfer::bulk_stream_source = typedef bulk_stream_complete_io<TSeq, endpoint_direction::in>

◆ control_in

template<detail::TransferSequence TSeq>
using co_usb::transfer::control_in = typedef control_partial_io<TSeq, endpoint_direction::in>

Read specialization of co_usb::transfer::control_partial_io.

◆ control_out

template<detail::TransferSequence TSeq>
using co_usb::transfer::control_out = typedef control_partial_io<TSeq, endpoint_direction::out>

Write specialization of co_usb::transfer::control_partial_io.

◆ control_sink

template<detail::TransferSequence TSeq>
using co_usb::transfer::control_sink = typedef control_complete_io<TSeq, endpoint_direction::out>

Write specialization of co_usb::transfer::control_complete_io.

◆ control_source

template<detail::TransferSequence TSeq>
using co_usb::transfer::control_source = typedef control_complete_io<TSeq, endpoint_direction::in>

Read specialization of co_usb::transfer::control_complete_io.

◆ interrupt_in

template<detail::TransferSequence TSeq>
using co_usb::transfer::interrupt_in = typedef interrupt_partial_io<TSeq, endpoint_direction::in>

Read specialization of co_usb::transfer::interrupt_partial_io.

◆ interrupt_out

template<detail::TransferSequence TSeq>
using co_usb::transfer::interrupt_out = typedef interrupt_partial_io<TSeq, endpoint_direction::out>

Write specialization of co_usb::transfer::interrupt_partial_io.

◆ interrupt_sink

template<detail::TransferSequence TSeq>
using co_usb::transfer::interrupt_sink = typedef interrupt_complete_io<TSeq, endpoint_direction::out>

Write specialization of co_usb::transfer::interrupt_complete_io.

◆ interrupt_source

template<detail::TransferSequence TSeq>
using co_usb::transfer::interrupt_source = typedef interrupt_complete_io<TSeq, endpoint_direction::in>

Read specialization of co_usb::transfer::interrupt_complete_io.

◆ isochronous_in

template<detail::TransferSequence TSeq>
using co_usb::transfer::isochronous_in = typedef isochronous_partial_io<TSeq, endpoint_direction::in>

◆ isochronous_out

template<detail::TransferSequence TSeq>
using co_usb::transfer::isochronous_out = typedef isochronous_partial_io<TSeq, endpoint_direction::out>

Write specialization of co_usb::transfer::isochronous_partial_io.

◆ isochronous_sink

template<detail::TransferSequence TSeq>
using co_usb::transfer::isochronous_sink = typedef isochronous_complete_io<TSeq, endpoint_direction::out>

◆ isochronous_source

template<detail::TransferSequence TSeq>
using co_usb::transfer::isochronous_source = typedef isochronous_complete_io<TSeq, endpoint_direction::in>

Enumeration Type Documentation

◆ endpoint_direction

Direction of an endpoint.

Enumerator
out 

OUT endpoint (0x80 is not set)

in 

IN endpoint (0x80 is set)

any 

any/unknown direction

◆ status

enum class co_usb::transfer::status
strong

Status codes for transfers.

Note
Can be casted from libusb_transfer_status
Enumerator
completed 
error 

Transfer failed

timed_out 

Transfer timed out

cancelled 

Transfer was cancelled

stall 

For bulk/interrupt endpoints: halt condition detected (endpoint stalled). For control endpoints: control request not supported.

no_device 

Device was disconnected

overflow 

Device sent more data than requested

Function Documentation

◆ cancel_transfer()

template<detail::TransferSequence TSeq>
constexpr auto co_usb::transfer::cancel_transfer ( TSeq const &  tfer_seq)
constexpr

Cancels transfers from a sequence.

Template Parameters
TSeqTransfer sequence type.

Calls libusb_cancel_transfer on all transfers obtained from transfer resources from a given sequence. It is safe to call while the transfers are in flight.

◆ prefill_bulk()

template<detail::TransferSequence TSeq, endpoint_direction EpDirection>
constexpr auto co_usb::transfer::prefill_bulk ( TSeq const &  tfer_seq,
endpoint< EpDirection >  ep,
std::chrono::milliseconds  timeout_ms = std::chrono::milliseconds{0} 
)
constexpr

Prefills transfer sequence as bulk transfers.

Template Parameters
TSeqTransfer sequence type.

◆ prefill_bulk_stream()

template<detail::TransferSequence TSeq, endpoint_direction EpDirection>
constexpr auto co_usb::transfer::prefill_bulk_stream ( TSeq const &  tfer_seq,
endpoint< EpDirection >  ep,
uint32_t  stream_id,
std::chrono::milliseconds  timeout_ms = std::chrono::milliseconds{0} 
)
constexpr

Prefills transfer sequence as bulk stream transfers.

Template Parameters
TSeqTransfer sequence type.
Note
Requires libusb_alloc_streams to be called for a given stream_id.

◆ prefill_control()

template<detail::TransferSequence TSeq, endpoint_direction EpDirection>
constexpr auto co_usb::transfer::prefill_control ( TSeq const &  tfer_seq,
endpoint< EpDirection >  ep,
std::chrono::milliseconds  timeout_ms = std::chrono::milliseconds{0} 
)
constexpr

Prefills transfer sequence as control transfers.

Template Parameters
TSeqTransfer sequence type.
Note
Control transfers are only valid for endpoints 0x00 (OUT) and 0x80 (IN).

◆ prefill_interrupt()

template<detail::TransferSequence TSeq, endpoint_direction EpDirection>
constexpr auto co_usb::transfer::prefill_interrupt ( TSeq const &  tfer_seq,
endpoint< EpDirection >  ep,
std::chrono::milliseconds  timeout_ms = std::chrono::milliseconds{0} 
)
constexpr

Prefills transfer sequence as interrupt transfers.

Template Parameters
TSeqTransfer sequence type.

◆ prefill_isochronous()

template<detail::TransferSequence TSeq, endpoint_direction EpDirection>
constexpr auto co_usb::transfer::prefill_isochronous ( TSeq const &  tfer_seq,
endpoint< EpDirection >  ep,
int  iso_packets,
std::chrono::milliseconds  timeout_ms = std::chrono::milliseconds{0} 
)
constexpr

Prefills transfer sequence as isochronous transfers.

Template Parameters
TSeqTransfer sequence type.
Note
Requires all transfers in a transfer sequence to be allocated with the number of iso packets valid for a given iso_packets value.

◆ transfer_of()

template<TransferResource Ty>
constexpr auto co_usb::transfer::detail::transfer_of ( Ty const &  tfer_res) -> libusb_transfer *
inlineconstexpr

Uniform accessor for obtaining a libusb_transfer * from a co_usb::transfer::detail::TransferResource.

Returns
libusb_transfer *