Control Surface
main
MIDI Control Surface library for Arduino
Toggle main menu visibility
Loading...
Searching...
No Matches
src
MIDI_Interfaces
USBMIDI
LowLevel
BulkRX.hpp
Go to the documentation of this file.
1
#pragma once
2
3
#include <cstdint>
4
5
#include <
MIDI_Interfaces/USBMIDI/util/Atomic.hpp
>
6
#include <
Settings/NamespaceSettings.hpp
>
7
8
BEGIN_CS_NAMESPACE
9
11
template
<
class
Derived,
class
MessageTypeT, u
int
16_t MaxPacketSizeV>
12
struct
BulkRX
{
13
public
:
14
using
MessageType
= MessageTypeT;
15
18
bool
read
(
MessageType
&message);
19
20
protected
:
21
void
reset
(uint16_t packet_size =
MaxPacketSize
);
22
23
private
:
24
static
constexpr
uint16_t
MaxPacketSize
= MaxPacketSizeV;
25
static
constexpr
uint16_t
SizeReserved
=
MaxPacketSize
+ 1;
26
static
constexpr
uint16_t
NumRxPackets
=
MaxPacketSize
== 64 ? 16 : 4;
27
28
protected
:
29
// Derived should implement the following methods:
30
32
void
rx_start
(
void
*data, uint32_t size) =
delete
;
34
void
rx_start_isr
(
void
*data, uint32_t size) =
delete
;
35
36
private
:
37
constexpr
static
std::memory_order
mo_seq
= std::memory_order_seq_cst;
38
constexpr
static
std::memory_order
mo_rel
= std::memory_order_release;
39
constexpr
static
std::memory_order
mo_acq
= std::memory_order_acquire;
40
constexpr
static
std::memory_order
mo_rlx
= std::memory_order_relaxed;
41
constexpr
static
std::memory_order
mo_acq_rel
= std::memory_order_acq_rel;
42
44
struct
Reading
{
45
struct
Buffer
{
46
uint16_t
size
= 0;
47
uint16_t
index
= 0;
48
alignas
(uint32_t) uint8_t
buffer
[
MaxPacketSize
];
49
}
buffers
[
NumRxPackets
];
50
interrupt_atomic<uint32_t>
available
{0};
51
uint32_t
read_idx
{0};
52
interrupt_atomic<uint32_t>
write_idx
{0};
53
interrupt_atomic<bool>
reading
{
false
};
54
uint16_t
packet_size
=
MaxPacketSize
;
55
}
reading
;
56
using
rbuffer_t
= std::remove_reference_t<
decltype
(
reading
.buffers[0])>;
57
58
protected
:
59
void
rx_callback
(uint32_t num_bytes_read);
60
};
61
62
END_CS_NAMESPACE
63
64
#include "BulkRX.ipp"
Atomic.hpp
NamespaceSettings.hpp
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition
Settings/NamespaceSettings.hpp:14
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition
Settings/NamespaceSettings.hpp:11
interrupt_atomic
Wrapper that provides atomic access to variables shared between the main program and interrupt handle...
Definition
Atomic.hpp:81
BulkRX::Reading::Buffer
Definition
BulkRX.hpp:45
BulkRX::Reading::Buffer::buffer
uint8_t buffer[MaxPacketSize]
Definition
BulkRX.hpp:48
BulkRX::Reading::Buffer::index
uint16_t index
Definition
BulkRX.hpp:47
BulkRX::Reading::Buffer::size
uint16_t size
Definition
BulkRX.hpp:46
BulkRX::Reading
State for reading incoming USB data.
Definition
BulkRX.hpp:44
BulkRX::Reading::buffers
struct BulkRX::Reading::Buffer buffers[NumRxPackets]
BulkRX::Reading::read_idx
uint32_t read_idx
Definition
BulkRX.hpp:51
BulkRX::Reading::available
interrupt_atomic< uint32_t > available
Definition
BulkRX.hpp:50
BulkRX::Reading::reading
interrupt_atomic< bool > reading
Definition
BulkRX.hpp:53
BulkRX::Reading::write_idx
interrupt_atomic< uint32_t > write_idx
Definition
BulkRX.hpp:52
BulkRX::Reading::packet_size
uint16_t packet_size
Definition
BulkRX.hpp:54
BulkRX
Receives Bulk packets (OUT for device mode, IN for host mode).
Definition
BulkRX.hpp:12
BulkRX::mo_seq
static constexpr std::memory_order mo_seq
Definition
BulkRX.hpp:37
BulkRX::reading
struct BulkRX::Reading reading
BulkRX::mo_acq
static constexpr std::memory_order mo_acq
Definition
BulkRX.hpp:39
BulkRX::rx_start_isr
void rx_start_isr(void *data, uint32_t size)=delete
Start a USB transfer (from the USB interrupt handler).
BulkRX::mo_rlx
static constexpr std::memory_order mo_rlx
Definition
BulkRX.hpp:40
BulkRX::rx_callback
void rx_callback(uint32_t num_bytes_read)
BulkRX::rbuffer_t
std::remove_reference_t< decltype(reading.buffers[0])> rbuffer_t
Definition
BulkRX.hpp:56
BulkRX::MessageType
MessageTypeT MessageType
Definition
BulkRX.hpp:14
BulkRX::mo_acq_rel
static constexpr std::memory_order mo_acq_rel
Definition
BulkRX.hpp:41
BulkRX::read
bool read(MessageType &message)
Try reading a single message.
BulkRX::MaxPacketSize
static constexpr uint16_t MaxPacketSize
Definition
BulkRX.hpp:24
BulkRX::reset
void reset(uint16_t packet_size=MaxPacketSize)
BulkRX::rx_start
void rx_start(void *data, uint32_t size)=delete
Start a USB transfer (from the main program).
BulkRX::SizeReserved
static constexpr uint16_t SizeReserved
Definition
BulkRX.hpp:25
BulkRX::NumRxPackets
static constexpr uint16_t NumRxPackets
Definition
BulkRX.hpp:26
BulkRX::mo_rel
static constexpr std::memory_order mo_rel
Definition
BulkRX.hpp:38
Generated by
1.17.0