co_usb
Loading...
Searching...
No Matches
operations.hpp
Go to the documentation of this file.
1
6#pragma once
7
12#include <chrono>
13#include <libusb.h>
14
15namespace co_usb::transfer
16{
17
28template <detail::TransferSequence TSeq> constexpr auto cancel_transfer (TSeq const &tfer_seq)
29{
30 auto it = detail::transfer_begin(tfer_seq);
31 for (; it != detail::transfer_end(tfer_seq); it++)
32 {
33 libusb_transfer *tfer = detail::transfer_of(*it);
34 libusb_cancel_transfer(tfer);
35 }
36}
37
46template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
47constexpr auto prefill_control (TSeq const &tfer_seq, endpoint<EpDirection> ep,
48 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
49{
50
51 COUSB_ASSERT((ep.addr() == 0x00) && (EpDirection == endpoint_direction::out) &&
52 "OUT control transfers must have an endpoint address of 0x00");
53 COUSB_ASSERT((ep.addr() == 0x80) && (EpDirection == endpoint_direction::in) &&
54 "IN control transfers must have an endpoint address of 0x80");
55 auto it = detail::transfer_begin(tfer_seq);
56 for (; it != detail::transfer_end(tfer_seq); it++)
57 {
58 libusb_transfer *tfer = detail::transfer_of(*it);
59 libusb_fill_control_transfer(tfer, ep.devh(), nullptr, nullptr, nullptr,
60 timeout_ms.count());
61 }
62}
63
70template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
71constexpr auto prefill_bulk (TSeq const &tfer_seq, endpoint<EpDirection> ep,
72 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
73{
74 auto it = detail::transfer_begin(tfer_seq);
75 for (; it != detail::transfer_end(tfer_seq); it++)
76 {
77 libusb_transfer *tfer = detail::transfer_of(*it);
78 libusb_fill_bulk_transfer(tfer, ep.devh(), ep.addr(), nullptr, 0, nullptr, nullptr,
79 timeout_ms.count());
80 }
81}
82
89template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
90constexpr auto
91prefill_interrupt (TSeq const &tfer_seq, endpoint<EpDirection> ep,
92 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
93{
94 auto it = detail::transfer_begin(tfer_seq);
95 for (; it != detail::transfer_end(tfer_seq); it++)
96 {
97 libusb_transfer *tfer = detail::transfer_of(*it);
98 libusb_fill_interrupt_transfer(tfer, ep.devh(), ep.addr(), nullptr, 0, nullptr, nullptr,
99 timeout_ms.count());
100 }
101}
102
112template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
113constexpr auto
114prefill_isochronous (TSeq const &tfer_seq, endpoint<EpDirection> ep, int iso_packets,
115 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
116{
117 auto it = detail::transfer_begin(tfer_seq);
118 for (; it != detail::transfer_end(tfer_seq); it++)
119 {
120 libusb_transfer *tfer = detail::transfer_of(*it);
121 libusb_fill_iso_transfer(tfer, ep.devh(), ep.addr(), nullptr, 0, iso_packets, nullptr,
122 nullptr, timeout_ms.count());
123 }
124}
125
134template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
135constexpr auto
136prefill_bulk_stream (TSeq const &tfer_seq, endpoint<EpDirection> ep, uint32_t stream_id,
137 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
138{
139 auto it = detail::transfer_begin(tfer_seq);
140 for (; it != detail::transfer_end(tfer_seq); it++)
141 {
142 libusb_transfer *tfer = detail::transfer_of(*it);
143 libusb_fill_bulk_stream_transfer(tfer, ep.devh(), ep.addr(), stream_id, nullptr, 0, nullptr,
144 nullptr, timeout_ms.count());
145 }
146}
147
148} // namespace co_usb::transfer
#define COUSB_ASSERT(...)
Definition assert.hpp:21
USB endpoint aggregate templated on its direction.
constexpr auto transfer_of(Ty const &tfer_res) -> libusb_transfer *
Uniform accessor for obtaining a libusb_transfer * from a co_usb::transfer::detail::TransferResource.
Definition transfer_sequence.hpp:41
constexpr auto 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.
Definition operations.hpp:136
constexpr auto cancel_transfer(TSeq const &tfer_seq)
Cancels transfers from a sequence.
Definition operations.hpp:28
constexpr auto prefill_interrupt(TSeq const &tfer_seq, endpoint< EpDirection > ep, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Prefills transfer sequence as interrupt transfers.
Definition operations.hpp:91
constexpr auto prefill_bulk(TSeq const &tfer_seq, endpoint< EpDirection > ep, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Prefills transfer sequence as bulk transfers.
Definition operations.hpp:71
constexpr auto 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.
Definition operations.hpp:114
constexpr auto prefill_control(TSeq const &tfer_seq, endpoint< EpDirection > ep, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Prefills transfer sequence as control transfers.
Definition operations.hpp:47
Iterator helpers for processing transfer sequences.
constexpr struct co_usb::transfer::detail::@1 transfer_end
constexpr struct co_usb::transfer::detail::@0 transfer_begin
Definition complete_io.hpp:18
USB endpoint aggregate templated on its direction.
Definition endpoint.hpp:44
uint8_t addr() const noexcept
Definition endpoint.hpp:102
auto devh() const noexcept -> libusb_device_handle *requires(Direction !=endpoint_direction::any)
Definition endpoint.hpp:108
Transfer resource and transfer sequence concepts.