co_usb
Loading...
Searching...
No Matches
complete_io.hpp
Go to the documentation of this file.
1
6#pragma once
7
14#include <boost/capy/io_task.hpp>
15#include <memory_resource>
16
18{
19
20namespace detail
21{
57template <detail::TransferSequence TSeq> struct complete_io_base : public partial_io_base<TSeq>
58{
59 explicit complete_io_base (boost::capy::executor_ref exec, TSeq const &tfer_seq,
60 size_t single_transfer_limit,
61 std::pmr::memory_resource *memres = std::pmr::get_default_resource())
62 : partial_io_base<TSeq>(exec, tfer_seq), m_memres(memres),
63 m_single_transfer_limit(single_transfer_limit)
64 {
65 }
66
67 template <detail::AnyBufferSequence BuffersTy>
68 auto complete_submit (BuffersTy const &buffers) -> boost::capy::io_task<size_t>
69 {
70 auto exec = co_await boost::capy::this_coro::executor;
71 auto stop = co_await boost::capy::this_coro::stop_token;
72
73 const size_t transfers_used =
74 std::min(boost::capy::buffer_length(buffers), this->m_view.size());
75 std::stop_callback sb{stop, [&] ()
76 {
77 const auto end = this->m_view.begin() + transfers_used;
78 for (auto iter = this->m_view.begin(); iter != end; iter++)
79 {
80 libusb_transfer *tfer = detail::transfer_of(*iter);
81 cancel_transfer(tfer);
82 }
83 }};
85 typename awaitable_t::await_state_t await_state(m_memres);
86 co_return co_await awaitable_t(&await_state, &this->m_view, buffers, transfers_used,
87 m_single_transfer_limit);
88 }
89
90 private:
91 std::pmr::memory_resource *m_memres;
92 size_t m_single_transfer_limit;
93};
94
106template <TransferSequence TSeq, endpoint_direction EpDirection> struct direction_complete_io_base
107{
109 boost::capy::executor_ref exec, TSeq const &tfer_seq, size_t single_transfer_limit,
110 std::pmr::memory_resource *memres = std::pmr::get_default_resource())
111 : m_raw(exec, tfer_seq, single_transfer_limit, memres)
112 {
113 }
114
120 template <boost::capy::MutableBufferSequence BuffersTy>
121 requires(EpDirection == endpoint_direction::in)
122 inline auto read_some (BuffersTy const &buffers) -> boost::capy::io_task<size_t>
123 {
124 return m_raw.submit(buffers);
125 }
126
133 template <boost::capy::MutableBufferSequence BuffersTy>
134 requires(EpDirection == endpoint_direction::in)
135 inline auto read (BuffersTy const &buffers) -> boost::capy::io_task<size_t>
136 {
137 return m_raw.complete_submit(buffers);
138 }
139
140 template <boost::capy::ConstBufferSequence BuffersTy>
141 requires(EpDirection == endpoint_direction::out)
142 inline auto write_some (BuffersTy const &buffers) -> boost::capy::io_task<size_t>
143 {
144 return m_raw.submit(buffers);
145 }
146
153 template <boost::capy::ConstBufferSequence BuffersTy>
154 requires(EpDirection == endpoint_direction::out)
155 inline auto write (BuffersTy const &buffers) -> boost::capy::io_task<size_t>
156 {
157 return m_raw.complete_submit(buffers);
158 }
159
168 template <boost::capy::ConstBufferSequence BuffersTy>
169 requires(EpDirection == endpoint_direction::out)
170 inline auto write_eof (BuffersTy const &buffers) -> boost::capy::io_task<size_t>
171 {
172 return m_raw.complete_submit(buffers);
173 }
174
180 template <boost::capy::ConstBufferSequence BuffersTy>
181 requires(EpDirection == endpoint_direction::out)
182 inline auto write_eof () -> boost::capy::io_task<>
183 {
184 co_return {{}};
185 }
186
187 private:
189};
190
191} // namespace detail
192
201template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
203{
205 boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint<EpDirection> endpoint,
206 size_t single_transfer_limit,
207 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0},
208 std::pmr::memory_resource *memres = std::pmr::get_default_resource())
209 : detail::direction_complete_io_base<TSeq, EpDirection>(exec, tfer_seq,
210 single_transfer_limit, memres)
211 {
212 prefill_control(tfer_seq, endpoint, timeout_ms);
213 }
214};
215
222template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
224{
225 explicit bulk_complete_io (boost::capy::executor_ref exec, TSeq const &tfer_seq,
226 endpoint<EpDirection> endpoint, size_t single_transfer_limit,
227 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0},
228 std::pmr::memory_resource *memres = std::pmr::get_default_resource())
229 : detail::direction_complete_io_base<TSeq, EpDirection>(exec, tfer_seq,
230 single_transfer_limit, memres)
231 {
232 prefill_bulk(tfer_seq, endpoint, timeout_ms);
233 }
234};
235
242template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
244{
246 boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint<EpDirection> endpoint,
247 size_t single_transfer_limit,
248 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0},
249 std::pmr::memory_resource *memres = std::pmr::get_default_resource())
250 : detail::direction_complete_io_base<TSeq, EpDirection>(exec, tfer_seq,
251 single_transfer_limit, memres)
252 {
253 prefill_interrupt(tfer_seq, endpoint, timeout_ms);
254 }
255};
256
266template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
268{
270 boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint<EpDirection> endpoint,
271 int iso_packets, size_t single_transfer_limit,
272 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0},
273 std::pmr::memory_resource *memres = std::pmr::get_default_resource())
274 : detail::direction_complete_io_base<TSeq, EpDirection>(exec, tfer_seq,
275 single_transfer_limit, memres)
276 {
277 prefill_isochronous(tfer_seq, endpoint, iso_packets, timeout_ms);
278 }
279};
280
289template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
291{
293 boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint<EpDirection> endpoint,
294 uint32_t stream_id, size_t single_transfer_limit,
295 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0},
296 std::pmr::memory_resource *memres = std::pmr::get_default_resource())
297 : detail::direction_complete_io_base<TSeq, EpDirection>(exec, tfer_seq,
298 single_transfer_limit, memres)
299 {
300 prefill_bulk_stream(tfer_seq, endpoint, stream_id, timeout_ms);
301 }
302};
303
309template <detail::TransferSequence TSeq>
311
317template <detail::TransferSequence TSeq>
319
325template <detail::TransferSequence TSeq>
327
333template <detail::TransferSequence TSeq>
335
341template <detail::TransferSequence TSeq>
343
349template <detail::TransferSequence TSeq>
351
357template <detail::TransferSequence TSeq>
359
365template <detail::TransferSequence TSeq>
367
373template <detail::TransferSequence TSeq>
375
381template <detail::TransferSequence TSeq>
383
384} // namespace co_usb::transfer
Unified concept for buffer sequences.
Implementation detail for co_usb::transfer::detail::complete_io_base.
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
Definition complete_io.hpp:18
Operations on transfer sequences.
Partial I/O adapters for transfer sequences.
Prefills the transfer sequence as bulk transfers and provides complete I/O operations.
Definition complete_io.hpp:224
bulk_complete_io(boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint< EpDirection > endpoint, size_t single_transfer_limit, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0}, std::pmr::memory_resource *memres=std::pmr::get_default_resource())
Definition complete_io.hpp:225
Prefills the transfer sequence as bulk stream transfers and provides complete I/O operations.
Definition complete_io.hpp:291
bulk_stream_complete_io(boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint< EpDirection > endpoint, uint32_t stream_id, size_t single_transfer_limit, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0}, std::pmr::memory_resource *memres=std::pmr::get_default_resource())
Definition complete_io.hpp:292
Prefills the transfer sequence as control transfers and provides complete I/O operations.
Definition complete_io.hpp:203
control_complete_io(boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint< EpDirection > endpoint, size_t single_transfer_limit, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0}, std::pmr::memory_resource *memres=std::pmr::get_default_resource())
Definition complete_io.hpp:204
Complete I/O adapter for transfer sequences.
Definition complete_io.hpp:58
complete_io_base(boost::capy::executor_ref exec, TSeq const &tfer_seq, size_t single_transfer_limit, std::pmr::memory_resource *memres=std::pmr::get_default_resource())
Definition complete_io.hpp:59
auto complete_submit(BuffersTy const &buffers) -> boost::capy::io_task< size_t >
Definition complete_io.hpp:68
Definition complete_sequence_awaitable.hpp:31
Interface complying with Boost.Http's ReadSource and WriteSink concepts.
Definition complete_io.hpp:107
auto read(BuffersTy const &buffers) -> boost::capy::io_task< size_t >
Performs complete read to a buffer sequence.
Definition complete_io.hpp:135
auto write_eof() -> boost::capy::io_task<>
Indicates EOF and closes the sink.
Definition complete_io.hpp:182
auto write(BuffersTy const &buffers) -> boost::capy::io_task< size_t >
Performs complete write from a buffer sequence.
Definition complete_io.hpp:155
auto read_some(BuffersTy const &buffers) -> boost::capy::io_task< size_t >
Performs partial read to a buffer sequence.
Definition complete_io.hpp:122
direction_complete_io_base(boost::capy::executor_ref exec, TSeq const &tfer_seq, size_t single_transfer_limit, std::pmr::memory_resource *memres=std::pmr::get_default_resource())
Definition complete_io.hpp:108
auto write_some(BuffersTy const &buffers) -> boost::capy::io_task< size_t >
Definition complete_io.hpp:142
Zero-allocation adapter around a transfer sequence enabling the use of asynchronous partial I/O opera...
Definition partial_io.hpp:62
sequence_view< TSeq > m_view
Definition partial_io.hpp:96
USB endpoint aggregate templated on its direction.
Definition endpoint.hpp:44
Prefills the transfer sequence as interrupt transfers and provides complete I/O operations.
Definition complete_io.hpp:244
interrupt_complete_io(boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint< EpDirection > endpoint, size_t single_transfer_limit, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0}, std::pmr::memory_resource *memres=std::pmr::get_default_resource())
Definition complete_io.hpp:245
Prefills the transfer sequence as isochronous transfers and provides complete I/O operations.
Definition complete_io.hpp:268
isochronous_complete_io(boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint< EpDirection > endpoint, int iso_packets, size_t single_transfer_limit, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0}, std::pmr::memory_resource *memres=std::pmr::get_default_resource())
Definition complete_io.hpp:269
auto size() const noexcept -> size_t
Definition sequence_view.hpp:43
auto begin() const noexcept
Definition sequence_view.hpp:48
Transfer resource and transfer sequence concepts.