Control Surface main
MIDI Control Surface library for Arduino
Loading...
Searching...
No Matches
TeensyHostMIDI.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <USBHost_t36.h>
4#include <atomic>
5#include <chrono>
6#include <tuple>
7
10#include <Settings/NamespaceSettings.hpp>
11
13
15template <uint16_t MaxPacketSize = 512>
17 : public USBDriver,
18 protected BulkRX<TeensyHostMIDI<MaxPacketSize>, uint32_t, MaxPacketSize>,
19 protected BulkTX<TeensyHostMIDI<MaxPacketSize>, uint32_t, MaxPacketSize> {
20 public:
21 TeensyHostMIDI(USBHost &) { init(); }
22
23 using microseconds = std::chrono::microseconds;
24
28 uint32_t read() {
29 uint32_t packet = 0;
30 read(packet);
31 return packet;
32 }
33
38 void write(uint32_t msg) {
39 if (txpipe)
41 }
42
49 void write(const uint32_t *msgs, uint32_t num_msgs) {
50 if (txpipe)
52 num_msgs);
53 }
54
56 template <size_t N>
57 void write(const uint32_t (&msgs)[N]) {
58 write(msgs, N);
59 }
60
68 uint32_t write_nonblock(const uint32_t *msgs, uint32_t num_msgs) {
69 if (txpipe)
70 return BulkTX<TeensyHostMIDI, uint32_t,
71 MaxPacketSize>::write_nonblock(msgs, num_msgs);
72 return 0;
73 }
74
77
81 void setTimeout(microseconds timeout) { write_timeout_duration = timeout; }
85 }
86
88 uint32_t getWriteError() const { return write_errors; }
90 uint32_t clearWriteError() {
91 auto old = write_errors;
92 write_errors = 0;
93 return old;
94 }
95
96 protected:
97 bool claim(Device_t *device, int type, const uint8_t *descriptors,
98 uint32_t len) override;
99 void disconnect() override;
100
101 protected:
102 void timer_event(USBDriverTimer *whichtimer) override;
103
104 protected:
105 static void rx_callback(const Transfer_t *transfer);
106 static void tx_callback(const Transfer_t *transfer);
107
108 protected:
109 void write_start(uint8_t *buffer, uint32_t size);
110 void write_start_isr(uint8_t *buffer, uint32_t size);
111 uint32_t write_finish(const Transfer_t *transfer);
112
113 void read_start(uint8_t *buffer, uint32_t size);
114 void read_start_isr(uint8_t *buffer, uint32_t size);
115 uint32_t read_finish(const Transfer_t *transfer);
116
117 protected:
118 bool claim_if_midi(Device_t *device, int type, const uint8_t *descriptors,
119 uint32_t len);
120 void init();
121
122 private:
123 Pipe_t *rxpipe, *txpipe;
124 uint16_t rx_size, tx_size;
125 uint8_t rx_ep, tx_ep;
127 Pipe_t mypipes[3] __attribute__((aligned(32)));
128 Transfer_t mytransfers[7] __attribute__((aligned(32)));
129 strbuf_t mystring_bufs[1];
130
131 protected:
132 friend class BulkTX<TeensyHostMIDI, uint32_t, MaxPacketSize>;
135 void tx_start(const void *data, uint32_t size);
136 void tx_start_timeout(const void *data, uint32_t size);
137 void tx_start_isr(const void *data, uint32_t size);
138
139 USBDriverTimer write_timeout {this};
142 uint32_t write_errors {0};
143
144 protected:
145 friend class BulkRX<TeensyHostMIDI, uint32_t, MaxPacketSize>;
146 void rx_start(void *data, uint32_t size);
147 void rx_start_isr(void *data, uint32_t size);
148
149 private:
151 void in_callback(const Transfer_t *transfer);
152 void out_callback(const Transfer_t *transfer);
153
154 private:
155 template <class T, size_t N>
156 static constexpr size_t len(T (&)[N]) {
157 return N;
158 }
159};
160
162
163#include "TeensyHostMIDI.ipp"
#define END_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Teensy USB Host MIDI driver.
void disconnect() override
uint32_t read_finish(const Transfer_t *transfer)
void write(const uint32_t(&msgs)[N])
Send multiple MIDI USB messages. May block.
microseconds write_error_timeout_duration
void read_start(uint8_t *buffer, uint32_t size)
void setErrorTimeout(microseconds timeout)
uint32_t write_finish(const Transfer_t *transfer)
void cancel_timeout()
uint32_t write_nonblock(const uint32_t *msgs, uint32_t num_msgs)
Send multiple MIDI USB messages without blocking.
bool claim_if_midi(Device_t *device, int type, const uint8_t *descriptors, uint32_t len)
void timeout_callback()
void rx_start(void *data, uint32_t size)
void timer_event(USBDriverTimer *whichtimer) override
void rx_start_isr(void *data, uint32_t size)
uint32_t read()
Try reading a 4-byte MIDI USB message.
bool claim(Device_t *device, int type, const uint8_t *descriptors, uint32_t len) override
USBDriverTimer write_timeout
void in_callback(const Transfer_t *transfer)
TeensyHostMIDI(USBHost &)
void read_start_isr(uint8_t *buffer, uint32_t size)
void start_timeout()
uint32_t getWriteError() const
Count how many USB packets were dropped.
void setTimeout(microseconds timeout)
Set the timeout, the number of microseconds to buffer the outgoing MIDI messages.
static constexpr size_t len(T(&)[N])
microseconds write_timeout_duration
void write_start(uint8_t *buffer, uint32_t size)
static void tx_callback(const Transfer_t *transfer)
void write(const uint32_t *msgs, uint32_t num_msgs)
Send multiple MIDI USB messages.
void out_callback(const Transfer_t *transfer)
void tx_start_isr(const void *data, uint32_t size)
static void rx_callback(const Transfer_t *transfer)
void tx_start_timeout(const void *data, uint32_t size)
void write(uint32_t msg)
Send a MIDI USB message.
std::chrono::microseconds microseconds
strbuf_t mystring_bufs[1]
void tx_start(const void *data, uint32_t size)
void write_start_isr(uint8_t *buffer, uint32_t size)
uint32_t clearWriteError()
Clear the counter of how many USB packets were dropped.
Receives Bulk packets (OUT for device mode, IN for host mode)
Definition BulkRX.hpp:12
static constexpr uint16_t MaxPacketSize
Definition BulkRX.hpp:24
Sends Bulk packets (IN for device mode, OUT for host mode)
Definition BulkTX.hpp:12
void send_now()
Try sending the buffered data now.
void write(MessageType msg)
Send a MIDI USB message.