co_usb
Loading...
Searching...
No Matches
partial_io.hpp
Go to the documentation of this file.
1
6#pragma once
7
16#include <boost/capy/buffers.hpp>
17#include <boost/capy/ex/executor_ref.hpp>
18#include <boost/capy/ex/this_coro.hpp>
19#include <boost/capy/io_task.hpp>
20
21namespace co_usb::transfer
22{
23
24namespace detail
25{
61template <detail::TransferSequence TSeq> struct partial_io_base
62{
63 explicit partial_io_base (boost::capy::executor_ref exec, TSeq const &tfer_seq)
64 : m_ev_ref(::co_usb::ev::detail::get_handler_service(exec).handler()), m_view(tfer_seq)
65 {
66 }
67
73 template <detail::AnyBufferSequence BuffersTy>
74 auto submit (BuffersTy const &buffers) -> boost::capy::io_task<size_t>
75 {
76 auto exec = co_await boost::capy::this_coro::executor;
77 auto stop = co_await boost::capy::this_coro::stop_token;
78
79 const size_t transfers_used = std::min(boost::capy::buffer_length(buffers), m_view.size());
80 std::stop_callback sb{stop, [&] ()
81 {
82 const auto end = m_view.begin() + transfers_used;
83 for (auto iter = m_view.begin(); iter != end; iter++)
84 {
85 libusb_transfer *tfer = detail::transfer_of(*iter);
86 cancel_transfer(tfer);
87 }
88 }};
90 typename awaitable_t::await_state_t await_state;
91 co_return co_await awaitable_t(&await_state, &m_view, buffers, transfers_used);
92 }
93
94 protected:
97};
98
104template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
106{
107 explicit direction_partial_io_base (boost::capy::executor_ref exec, TSeq const &tfer_seq)
108 : m_stream(exec, tfer_seq)
109 {
110 }
111
117 template <boost::capy::MutableBufferSequence BuffersTy>
118 requires(EpDirection == endpoint_direction::in)
119 inline auto read_some (BuffersTy const &buffers) -> boost::capy::io_task<size_t>
120 {
121 return m_stream.submit(buffers);
122 }
123
129 template <boost::capy::ConstBufferSequence BuffersTy>
130 requires(EpDirection == endpoint_direction::out)
131 inline auto write_some (BuffersTy const &buffers) -> boost::capy::io_task<size_t>
132 {
133 return m_stream.submit(buffers);
134 }
135
136 private:
137 partial_io_base<TSeq> m_stream;
138};
139} // namespace detail
140
149template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
151{
153 boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint<EpDirection> endpoint,
154 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
155 : detail::direction_partial_io_base<TSeq, EpDirection>(exec, tfer_seq)
156 {
157 prefill_control(tfer_seq, endpoint, timeout_ms);
158 }
159};
160
168template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
170{
171 explicit bulk_partial_io (boost::capy::executor_ref exec, TSeq const &tfer_seq,
173 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
174 : detail::direction_partial_io_base<TSeq, EpDirection>(exec, tfer_seq)
175 {
176 prefill_bulk(tfer_seq, endpoint, timeout_ms);
177 }
178};
179
186template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
188{
190 boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint<EpDirection> endpoint,
191 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
192 : detail::direction_partial_io_base<TSeq, EpDirection>(exec, tfer_seq)
193 {
194 prefill_interrupt(tfer_seq, endpoint, timeout_ms);
195 }
196};
197
208template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
210{
212 boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint<EpDirection> endpoint,
213 int iso_packets, std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
214 : detail::direction_partial_io_base<TSeq, EpDirection>(exec, tfer_seq)
215 {
216 prefill_isochronous(tfer_seq, endpoint, iso_packets, timeout_ms);
217 }
218};
219
228template <detail::TransferSequence TSeq, endpoint_direction EpDirection>
230{
232 boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint<EpDirection> endpoint,
233 uint32_t stream_id, std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
234 : detail::direction_partial_io_base<TSeq, EpDirection>(exec, tfer_seq)
235 {
236 prefill_bulk_stream(tfer_seq, endpoint, stream_id, timeout_ms);
237 }
238};
239
245template <detail::TransferSequence TSeq>
247
253template <detail::TransferSequence TSeq>
255
261template <detail::TransferSequence TSeq>
263
269template <detail::TransferSequence TSeq>
271
277template <detail::TransferSequence TSeq>
279
285template <detail::TransferSequence TSeq>
287
293template <detail::TransferSequence TSeq>
295
301template <detail::TransferSequence TSeq>
303
309template <detail::TransferSequence TSeq>
311
317template <detail::TransferSequence TSeq>
319
320} // namespace co_usb::transfer
Unified concept for buffer sequences.
USB endpoint aggregate templated on its direction.
Type-erased reference to any event handler.
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
Capy execution_context service wrapping a libusb event handler.
Definition complete_io.hpp:18
Definition flag_type.hpp:6
Operations on transfer sequences.
Implementation detail for co_usb::transfer::detail::partial_io_base.
View of a certain transfer sequence. Provides a uniform range interface.
Type-erased reference to any event handler.
Definition event_handler_ref.hpp:34
Prefills the transfer sequence as bulk transfers and provides partial I/O operations.
Definition partial_io.hpp:170
bulk_partial_io(boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint< EpDirection > endpoint, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Definition partial_io.hpp:171
Prefills the transfer sequence as bulk stream transfers and provides partial I/O operations.
Definition partial_io.hpp:230
bulk_stream_partial_io(boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint< EpDirection > endpoint, uint32_t stream_id, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Definition partial_io.hpp:231
Prefills the transfer sequence as control transfers and provides partial I/O operations.
Definition partial_io.hpp:151
control_partial_io(boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint< EpDirection > endpoint, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Definition partial_io.hpp:152
Provides Capy ReadStream-/WriteStream-compliant interface for partial transfer I/O.
Definition partial_io.hpp:106
auto read_some(BuffersTy const &buffers) -> boost::capy::io_task< size_t >
Performs partial read to a buffer sequence.
Definition partial_io.hpp:119
auto write_some(BuffersTy const &buffers) -> boost::capy::io_task< size_t >
Performs partial read to a buffer sequence.
Definition partial_io.hpp:131
direction_partial_io_base(boost::capy::executor_ref exec, TSeq const &tfer_seq)
Definition partial_io.hpp:107
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
ev::event_handler_ref m_ev_ref
Definition partial_io.hpp:95
partial_io_base(boost::capy::executor_ref exec, TSeq const &tfer_seq)
Definition partial_io.hpp:63
auto submit(BuffersTy const &buffers) -> boost::capy::io_task< size_t >
Submit a transfer sequence for a buffer sequence.
Definition partial_io.hpp:74
Definition sequence_awaitable.hpp:28
USB endpoint aggregate templated on its direction.
Definition endpoint.hpp:44
Prefills the transfer sequence as interrupt transfers and provides partial I/O operations.
Definition partial_io.hpp:188
interrupt_partial_io(boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint< EpDirection > endpoint, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Definition partial_io.hpp:189
Prefills the transfer sequence as isochronous transfers and provides partial I/O operations.
Definition partial_io.hpp:210
isochronous_partial_io(boost::capy::executor_ref exec, TSeq const &tfer_seq, endpoint< EpDirection > endpoint, int iso_packets, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Definition partial_io.hpp:211
View of a certain transfer sequence. Provides a uniform range interface.
Definition sequence_view.hpp:28
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.