co_usb
Loading...
Searching...
No Matches
endpoint.hpp
Go to the documentation of this file.
1
6#pragma once
7
9#include <cstdint>
10#include <optional>
11#include <stdexcept>
12
13namespace co_usb::transfer
14{
15
22{
24 out = 0x00,
26 in = 0x80,
28 any = 0xFF,
29};
30
43template <endpoint_direction Direction = endpoint_direction::any> struct endpoint
44{
53 template <co_usb::detail::DeviceHandleSource DevSourceTy>
54 static endpoint<Direction> make_safe (uint8_t ep, DevSourceTy const &dev_source) noexcept
55 requires(Direction != endpoint_direction::any)
56 {
57 if constexpr (Direction == endpoint_direction::out)
58 {
59 return endpoint<Direction>{static_cast<uint8_t>(ep & ~LIBUSB_ENDPOINT_IN),
61 }
62 else if constexpr (Direction == endpoint_direction::in)
63 {
64 return endpoint<Direction>{static_cast<uint8_t>(ep | LIBUSB_ENDPOINT_IN),
66 }
68 }
69
70 template <co_usb::detail::DeviceHandleSource DevSourceTy>
71 static endpoint<Direction> make_unsafe (uint8_t ep, DevSourceTy const &devh) noexcept
72 {
74 }
75
81 template <co_usb::detail::DeviceHandleSource DevSourceTy>
82 static endpoint<Direction> make_throwing (uint8_t ep, DevSourceTy const &devh)
83 requires(Direction != endpoint_direction::any)
84 {
85 if constexpr (Direction == endpoint_direction::out)
86 {
87 if (ep & LIBUSB_ENDPOINT_IN)
88 {
89 throw std::invalid_argument{"Cannot use IN endpoint for OUT"};
90 }
91 }
92 else if constexpr (Direction == endpoint_direction::in)
93 {
94 if (!(ep & LIBUSB_ENDPOINT_IN))
95 {
96 throw std::invalid_argument{"Cannot use OUT endpoint for IN"};
97 }
98 }
100 }
101
102 uint8_t addr () const noexcept
103 requires(Direction != endpoint_direction::any)
104 {
105 return m_ep;
106 }
107
108 auto devh () const noexcept -> libusb_device_handle *
109 requires(Direction != endpoint_direction::any)
110 {
111 return m_devh;
112 }
113
123 template <endpoint_direction ToDirection>
124 std::optional<endpoint<ToDirection>> as () const noexcept
125 requires(Direction == endpoint_direction::any && ToDirection != endpoint_direction::any)
126 {
127 if constexpr (ToDirection == endpoint_direction::in)
128 {
129 if (m_ep & LIBUSB_ENDPOINT_IN)
130 {
132 }
133 return std::nullopt;
134 }
135 else if constexpr (ToDirection == endpoint_direction::out)
136 {
137 if (m_ep & LIBUSB_ENDPOINT_IN)
138 {
139 return std::nullopt;
140 }
142 }
143 }
144
145 private:
146 endpoint (uint8_t ep, libusb_device_handle *devh) noexcept : m_devh(devh), m_ep(ep)
147 {
148 }
149
150 private:
151 libusb_device_handle *m_devh;
152 uint8_t m_ep;
153};
154
155inline auto ep_out (uint8_t ep_addr, co_usb::detail::DeviceHandleSource auto const &devh_src)
157{
158 return endpoint<endpoint_direction::out>::make_safe(ep_addr, devh_src);
159}
160
161inline auto ep_in (uint8_t ep_addr, co_usb::detail::DeviceHandleSource auto const &devh_src)
163{
164 return endpoint<endpoint_direction::in>::make_safe(ep_addr, devh_src);
165}
166
167inline auto ep_any (uint8_t ep_addr, co_usb::detail::DeviceHandleSource auto const &devh_src)
169{
171 ep_addr, co_usb::detail::device_handle_of(devh_src));
172}
173
174} // namespace co_usb::transfer
A type which can provide a co_usb::detail::DeviceHandlePointer.
Definition device_handle_source.hpp:42
endpoint_direction
Direction of an endpoint.
Definition endpoint.hpp:22
auto device_handle_of(Ty &&devh) -> libusb_device_handle *
Obtains a libusb_device_handle * from a co_usb::detail::DeviceHandlePointer.
Definition device_handle_source.hpp:57
Definition complete_io.hpp:18
auto ep_any(uint8_t ep_addr, co_usb::detail::DeviceHandleSource auto const &devh_src) -> endpoint< endpoint_direction::any >
Definition endpoint.hpp:167
auto ep_out(uint8_t ep_addr, co_usb::detail::DeviceHandleSource auto const &devh_src) -> endpoint< endpoint_direction::out >
Definition endpoint.hpp:155
auto ep_in(uint8_t ep_addr, co_usb::detail::DeviceHandleSource auto const &devh_src) -> endpoint< endpoint_direction::in >
Definition endpoint.hpp:161
USB endpoint aggregate templated on its direction.
Definition endpoint.hpp:44
static endpoint< Direction > make_unsafe(uint8_t ep, DevSourceTy const &devh) noexcept
Definition endpoint.hpp:71
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
static endpoint< Direction > make_throwing(uint8_t ep, DevSourceTy const &devh)
Creates an endpoint or throws if the address doesn't match expected direction.
Definition endpoint.hpp:82
static endpoint< Direction > make_safe(uint8_t ep, DevSourceTy const &dev_source) noexcept
Makes an endpoint and completes address to proper value.
Definition endpoint.hpp:54
std::optional< endpoint< ToDirection > > as() const noexcept
Cast an any endpoint to a concrete direction.
Definition endpoint.hpp:124