co_usb
Loading...
Searching...
No Matches
transfer_types.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "co_usb/raii.hpp"
6#include <boost/capy/buffers.hpp>
7#include <boost/capy/io_task.hpp>
8#include <chrono>
9#include <libusb-1.0/libusb.h>
10
11namespace co_usb
12{
13
20template <endpoint_type EpType, ep_direction Direction> struct basic_transfer
21{
22 explicit basic_transfer (int iso_packets = 0)
24 {
25 if (!m_tfer)
26 throw std::bad_alloc{};
27 }
28
30 {
31 return Direction;
32 }
33
35 {
36 return EpType;
37 }
38
40 {
41 return m_tfer.get();
42 }
43
52 [[nodiscard]] boost::capy::io_task<size_t> read_some (boost::capy::mutable_buffer buf)
54 {
55 auto tfer = m_tfer.get();
56 tfer->buffer = (uint8_t *)buf.data();
57 tfer->length = buf.size();
58 co_return co_await transfer_awaitable{tfer};
59 }
60
69 boost::capy::io_task<size_t> write_some (boost::capy::const_buffer buf)
71 {
72 auto tfer = m_tfer.get();
73 tfer->buffer = (uint8_t *)buf.data();
74 tfer->length = buf.size();
75 co_return co_await transfer_awaitable{tfer};
76 }
77
78 protected:
80};
81
85struct control_transfer : public basic_transfer<endpoint_type::control, ep_direction::both>
86{
88 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
90 {
91 libusb_fill_control_transfer(this->m_tfer.get(), devh, nullptr, nullptr, nullptr,
92 timeout_ms.count());
93 }
94};
95
99template <ep_direction Dir>
100 requires(Dir != ep_direction::both)
102{
104 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
106 {
107 libusb_fill_bulk_transfer(this->m_tfer.get(), ep.dev(), ep.addr(), nullptr, 0, nullptr,
108 nullptr, timeout_ms.count());
109 }
110};
111
115template <ep_direction Dir>
116 requires(Dir != ep_direction::both)
118{
120 endpoint<Dir> ep, std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
122 {
123 libusb_fill_interrupt_transfer(this->m_tfer.get(), ep.dev(), ep.addr(), nullptr, 0, nullptr,
124 nullptr, timeout_ms.count());
125 }
126};
127
131template <ep_direction Dir>
132 requires(Dir != ep_direction::both)
134{
137 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
139 {
140 libusb_fill_iso_transfer(this->m_tfer.get(), ep.dev(), ep.addr(), nullptr, 0, iso_num,
141 nullptr, nullptr, timeout_ms.count());
142 }
143};
144
148template <ep_direction Dir>
149 requires(Dir != ep_direction::both)
151{
154 std::chrono::milliseconds timeout_ms = std::chrono::milliseconds{0})
156 {
157 libusb_fill_bulk_stream_transfer(this->m_tfer.get(), ep.dev(), ep.addr(), stream_id,
158 nullptr, 0, nullptr, nullptr, timeout_ms.count());
159 }
160};
161
162} // namespace co_usb
Definition context.hpp:14
ep_direction
Definition endpoint.hpp:22
std::unique_ptr< libusb_transfer, transfer_deleter_t > unique_transfer
Definition raii.hpp:28
use_service
Definition context.hpp:17
endpoint_type
Definition endpoint.hpp:13
Base transfer type which provides Capy's ReadStream/WriteStream operations depending on the direction...
Definition transfer_types.hpp:21
boost::capy::io_task< size_t > write_some(boost::capy::const_buffer buf)
Partial write to an endpoint.
Definition transfer_types.hpp:69
auto raw() const noexcept
Definition transfer_types.hpp:39
consteval ep_direction direction() const noexcept
Definition transfer_types.hpp:29
constexpr endpoint_type ep_type() const noexcept
Definition transfer_types.hpp:34
unique_transfer m_tfer
Definition transfer_types.hpp:79
boost::capy::io_task< size_t > read_some(boost::capy::mutable_buffer buf)
Partial read from an endpoint.
Definition transfer_types.hpp:52
basic_transfer(int iso_packets=0)
Definition transfer_types.hpp:22
Transfer type for bulk stream transfers.
Definition transfer_types.hpp:151
bulk_stream_transfer(endpoint< Dir > ep, uint32_t stream_id, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Definition transfer_types.hpp:152
Transfer type for bulk transfers.
Definition transfer_types.hpp:102
bulk_transfer(endpoint< Dir > ep, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Definition transfer_types.hpp:103
Transfer type for control transfers.
Definition transfer_types.hpp:86
control_transfer(libusb_device_handle *devh, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Definition transfer_types.hpp:87
Transfer type for interrupt transfers.
Definition transfer_types.hpp:118
interrupt_transfer(endpoint< Dir > ep, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Definition transfer_types.hpp:119
Transfer type for isochronous transfers.
Definition transfer_types.hpp:134
isochronous_transfer(endpoint< Dir > ep, int iso_num, std::chrono::milliseconds timeout_ms=std::chrono::milliseconds{0})
Definition transfer_types.hpp:135
Awaitable for submitting transfers.
Definition transfer_awaitable.hpp:30