Control Surface main
MIDI Control Surface library for Arduino
Loading...
Searching...
No Matches
BulkTX.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstddef>
4
6#include <Settings/NamespaceSettings.hpp>
7
9
11template <class Derived, class MessageTypeT, uint16_t MaxPacketSizeV>
12struct BulkTX {
13 public:
14 using MessageType = MessageTypeT;
15
20 void write(MessageType msg);
21
28 void write(const MessageType *msgs, uint32_t num_msgs);
29
31 template <size_t N>
32 void write(const MessageType (&msgs)[N]) {
33 write(msgs, N);
34 }
35
43 uint32_t write_nonblock(const MessageType *msgs, uint32_t num_msgs);
44
48 void send_now();
49
51 bool is_done() const;
52
53 protected:
54 void reset(uint16_t packet_size = MaxPacketSize);
55
56 private:
57 static constexpr uint16_t MaxPacketSize = MaxPacketSizeV;
58 static constexpr uint16_t SizeReserved = MaxPacketSize + 1;
59
60 protected:
61 // Derived should implement the following methods:
62
65 void start_timeout() = delete;
67 void cancel_timeout() = delete;
69 void tx_start(const void *data, uint32_t size) = delete;
71 void tx_start_timeout(const void *data, uint32_t size) = delete;
73 void tx_start_isr(const void *data, uint32_t size) = delete;
74
75 private:
76 constexpr static std::memory_order mo_seq = std::memory_order_seq_cst;
77 constexpr static std::memory_order mo_rel = std::memory_order_release;
78 constexpr static std::memory_order mo_acq = std::memory_order_acquire;
79 constexpr static std::memory_order mo_rlx = std::memory_order_relaxed;
80 constexpr static std::memory_order mo_acq_rel = std::memory_order_acq_rel;
81
94 using wbuffer_t = typename Writing::Buffer;
95
96 uint32_t index_of(wbuffer_t *p) const { return p - writing.buffers; }
98 return &writing.buffers[!index_of(p)];
99 }
100 uint32_t write_impl(const MessageType *msgs, uint32_t num_msgs);
101
102 protected:
105};
106
108
109#include "BulkTX.ipp"
#define END_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Wrapper that provides atomic access to variables shared between the main program and interrupt handle...
Definition Atomic.hpp:81
uint8_t buffer[MaxPacketSize]
Definition BulkTX.hpp:86
State for writing outgoing USB-MIDI data.
Definition BulkTX.hpp:83
interrupt_atomic< Buffer * > send_later
Definition BulkTX.hpp:90
interrupt_atomic< Buffer * > active_writebuffer
Definition BulkTX.hpp:88
interrupt_atomic< Buffer * > send_now
Definition BulkTX.hpp:91
uint16_t packet_size
Definition BulkTX.hpp:92
interrupt_atomic< Buffer * > sending
Definition BulkTX.hpp:89
struct BulkTX::Writing::Buffer buffers[2]
Sends Bulk packets (IN for device mode, OUT for host mode)
Definition BulkTX.hpp:12
void cancel_timeout()=delete
Cancel the timeout started by timeout_callback().
static constexpr std::memory_order mo_seq
Definition BulkTX.hpp:76
void tx_callback()
uint32_t index_of(wbuffer_t *p) const
Definition BulkTX.hpp:96
static constexpr std::memory_order mo_acq
Definition BulkTX.hpp:78
static constexpr std::memory_order mo_rlx
Definition BulkTX.hpp:79
void start_timeout()=delete
Start a timeout (e.g.
uint32_t write_nonblock(const MessageType *msgs, uint32_t num_msgs)
Send multiple MIDI USB messages without blocking.
MessageTypeT MessageType
Definition BulkTX.hpp:14
void timeout_callback()
void tx_start_isr(const void *data, uint32_t size)=delete
Start a USB transfer (from the USB interrupt handler).
void send_now()
Try sending the buffered data now.
static constexpr std::memory_order mo_acq_rel
Definition BulkTX.hpp:80
wbuffer_t * other_buf(wbuffer_t *p)
Definition BulkTX.hpp:97
bool is_done() const
Check if all transfers have completed.
void write(const MessageType(&msgs)[N])
Send multiple MIDI USB messages. May block.
Definition BulkTX.hpp:32
struct BulkTX::Writing writing
static constexpr uint16_t MaxPacketSize
Definition BulkTX.hpp:57
void reset(uint16_t packet_size=MaxPacketSize)
typename Writing::Buffer wbuffer_t
Definition BulkTX.hpp:94
void tx_start(const void *data, uint32_t size)=delete
Start a USB transfer (from the main program).
static constexpr uint16_t SizeReserved
Definition BulkTX.hpp:58
void write(const MessageType *msgs, uint32_t num_msgs)
Send multiple MIDI USB messages.
void write(MessageType msg)
Send a MIDI USB message.
static constexpr std::memory_order mo_rel
Definition BulkTX.hpp:77
void tx_start_timeout(const void *data, uint32_t size)=delete
Start a USB transfer (from the timeout callback).
uint32_t write_impl(const MessageType *msgs, uint32_t num_msgs)