Control Surface
main
MIDI Control Surface library for Arduino
Toggle main menu visibility
Loading...
Searching...
No Matches
src
MIDI_Interfaces
USBMIDI
mbed
PluggableUSBMIDI.hpp
Go to the documentation of this file.
1
#pragma once
2
3
#include <
AH/Arduino-Wrapper.h
>
4
5
#include <cstdint>
6
#include <utility>
7
8
#include <USB/PluggableUSBDevice.h>
9
#include <drivers/Timeout.h>
10
#include <platform/Callback.h>
11
12
#include <
MIDI_Interfaces/USBMIDI/LowLevel/BulkRX.hpp
>
13
#include <
MIDI_Interfaces/USBMIDI/LowLevel/BulkTX.hpp
>
14
#include <
Settings/NamespaceSettings.hpp
>
15
16
BEGIN_CS_NAMESPACE
17
18
class
PluggableUSBMIDI
:
protected
arduino::internal::PluggableUSBModule,
19
protected
BulkRX
<PluggableUSBMIDI, uint32_t, 64>,
20
protected
BulkTX
<PluggableUSBMIDI, uint32_t, 64> {
21
public
:
22
PluggableUSBMIDI
();
23
~PluggableUSBMIDI
();
24
25
public
:
26
using
setup_packet_t
= USBDevice::setup_packet_t;
27
using
DeviceState
= USBDevice::DeviceState;
28
using
microseconds
= std::chrono::microseconds;
29
30
private
:
31
// BulkTX/RX API
32
friend
class
BulkTX
<
PluggableUSBMIDI
, uint32_t, 64>;
33
friend
class
BulkRX
<
PluggableUSBMIDI
, uint32_t, 64>;
34
static
constexpr
uint32_t
get_packet_size
() {
return
64; }
35
36
void
start_timeout
() {
37
auto
cb = mbed::callback(
this
, &
PluggableUSBMIDI::timeout_callback
);
38
timeout
.attach(std::move(cb),
timeout_duration
);
39
}
40
void
cancel_timeout
() {
timeout
.detach(); }
41
void
tx_start
(
const
void
*data, uint32_t size) {
42
auto
data_u8 =
reinterpret_cast<
uint8_t *
>
(
const_cast<
void
*
>
(data));
43
write_start(
bulk_in_ep
, data_u8, size);
44
}
45
void
tx_start_timeout
(
const
void
*data, uint32_t size) {
46
tx_start
(data, size);
47
}
48
void
tx_start_isr
(
const
void
*data, uint32_t size) {
tx_start
(data, size); }
49
void
rx_start
(
void
*data, uint32_t size) {
50
read_start(
bulk_out_ep
,
reinterpret_cast<
uint8_t *
>
(data), size);
51
}
52
void
rx_start_isr
(
void
*data, uint32_t size) {
rx_start
(data, size); }
53
54
public
:
56
bool
connected
()
const
;
57
bool
connectedForWrite
()
const
{
return
connected
(); }
58
62
uint32_t
read
() {
63
uint32_t data = 0;
64
read
(data);
65
return
data;
66
}
67
68
using
BulkRX
<
PluggableUSBMIDI
, uint32_t, 64>
::read
;
69
using
BulkTX
<
PluggableUSBMIDI
, uint32_t, 64>
::write
;
70
using
BulkTX
<
PluggableUSBMIDI
, uint32_t, 64>
::write_nonblock
;
71
using
BulkTX
<
PluggableUSBMIDI
, uint32_t, 64>
::send_now
;
72
using
BulkTX
<
PluggableUSBMIDI
, uint32_t, 64>
::getWriteError
;
73
using
BulkTX
<
PluggableUSBMIDI
, uint32_t, 64>
::clearWriteError
;
74
78
void
setTimeout
(
microseconds
timeout
) {
timeout_duration
=
timeout
; }
80
void
setErrorTimeout
(
microseconds
timeout
) {
81
error_timeout_duration
=
timeout
;
82
}
83
84
protected
:
85
void
init
(EndpointResolver &resolver)
override
;
86
void
callback_state_change
(
DeviceState
new_state)
override
;
87
uint32_t
callback_request
(
const
setup_packet_t
*setup,
88
USBDevice::RequestResult *result,
89
uint8_t **data)
override
;
90
bool
callback_request_xfer_done
(
const
setup_packet_t
*setup,
91
bool
aborted)
override
;
92
bool
callback_set_configuration
(uint8_t configuration)
override
;
93
void
callback_set_interface
(uint16_t interface, uint8_t alternate)
override
;
94
95
const
uint8_t *
string_iinterface_desc
()
override
;
96
const
uint8_t *
configuration_desc
(uint8_t index)
override
;
97
uint8_t
getProductVersion
()
override
{
return
16; }
98
99
protected
:
100
interrupt_atomic<bool>
usb_connected
{
false
};
101
microseconds
timeout_duration
{1'000};
102
microseconds
error_timeout_duration
{40'000};
103
mbed::Timeout
timeout
;
104
105
usb_ep_t
bulk_in_ep
;
106
usb_ep_t
bulk_out_ep
;
107
uint8_t
config_descriptor
[0x65];
108
109
// Interrupt handlers
110
void
timeout_callback
() {
111
BulkTX<PluggableUSBMIDI, uint32_t, 64>::timeout_callback
();
112
}
113
void
in_callback
() {
114
assert_locked();
115
write_finish(
bulk_in_ep
);
116
BulkTX<PluggableUSBMIDI, uint32_t, 64>::tx_callback
();
117
}
118
void
out_callback
() {
119
assert_locked();
120
uint32_t num_bytes_read = read_finish(
bulk_out_ep
);
121
BulkRX::rx_callback
(num_bytes_read);
122
}
123
};
124
125
END_CS_NAMESPACE
Arduino-Wrapper.h
BulkRX.hpp
BulkTX.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
PluggableUSBMIDI
Definition
PluggableUSBMIDI.hpp:20
PluggableUSBMIDI::PluggableUSBMIDI
PluggableUSBMIDI()
PluggableUSBMIDI::setErrorTimeout
void setErrorTimeout(microseconds timeout)
Definition
PluggableUSBMIDI.hpp:80
PluggableUSBMIDI::setup_packet_t
USBDevice::setup_packet_t setup_packet_t
Definition
PluggableUSBMIDI.hpp:26
PluggableUSBMIDI::cancel_timeout
void cancel_timeout()
Definition
PluggableUSBMIDI.hpp:40
PluggableUSBMIDI::out_callback
void out_callback()
Definition
PluggableUSBMIDI.hpp:118
PluggableUSBMIDI::getProductVersion
uint8_t getProductVersion() override
Definition
PluggableUSBMIDI.hpp:97
PluggableUSBMIDI::bulk_in_ep
usb_ep_t bulk_in_ep
Definition
PluggableUSBMIDI.hpp:105
PluggableUSBMIDI::error_timeout_duration
microseconds error_timeout_duration
Definition
PluggableUSBMIDI.hpp:102
PluggableUSBMIDI::timeout_callback
void timeout_callback()
Definition
PluggableUSBMIDI.hpp:110
PluggableUSBMIDI::rx_start
void rx_start(void *data, uint32_t size)
Definition
PluggableUSBMIDI.hpp:49
PluggableUSBMIDI::rx_start_isr
void rx_start_isr(void *data, uint32_t size)
Definition
PluggableUSBMIDI.hpp:52
PluggableUSBMIDI::DeviceState
USBDevice::DeviceState DeviceState
Definition
PluggableUSBMIDI.hpp:27
PluggableUSBMIDI::read
uint32_t read()
Try reading a 4-byte MIDI USB message.
Definition
PluggableUSBMIDI.hpp:62
PluggableUSBMIDI::callback_state_change
void callback_state_change(DeviceState new_state) override
PluggableUSBMIDI::start_timeout
void start_timeout()
Definition
PluggableUSBMIDI.hpp:36
PluggableUSBMIDI::timeout
mbed::Timeout timeout
Definition
PluggableUSBMIDI.hpp:103
PluggableUSBMIDI::configuration_desc
const uint8_t * configuration_desc(uint8_t index) override
PluggableUSBMIDI::timeout_duration
microseconds timeout_duration
Definition
PluggableUSBMIDI.hpp:101
PluggableUSBMIDI::callback_set_interface
void callback_set_interface(uint16_t interface, uint8_t alternate) override
PluggableUSBMIDI::usb_connected
interrupt_atomic< bool > usb_connected
Definition
PluggableUSBMIDI.hpp:100
PluggableUSBMIDI::setTimeout
void setTimeout(microseconds timeout)
Set the timeout, the number of microseconds to buffer the outgoing MIDI messages.
Definition
PluggableUSBMIDI.hpp:78
PluggableUSBMIDI::callback_set_configuration
bool callback_set_configuration(uint8_t configuration) override
PluggableUSBMIDI::connected
bool connected() const
Check if this class is connected and ready.
PluggableUSBMIDI::init
void init(EndpointResolver &resolver) override
PluggableUSBMIDI::connectedForWrite
bool connectedForWrite() const
Definition
PluggableUSBMIDI.hpp:57
PluggableUSBMIDI::callback_request
uint32_t callback_request(const setup_packet_t *setup, USBDevice::RequestResult *result, uint8_t **data) override
PluggableUSBMIDI::in_callback
void in_callback()
Definition
PluggableUSBMIDI.hpp:113
PluggableUSBMIDI::tx_start_isr
void tx_start_isr(const void *data, uint32_t size)
Definition
PluggableUSBMIDI.hpp:48
PluggableUSBMIDI::callback_request_xfer_done
bool callback_request_xfer_done(const setup_packet_t *setup, bool aborted) override
PluggableUSBMIDI::tx_start_timeout
void tx_start_timeout(const void *data, uint32_t size)
Definition
PluggableUSBMIDI.hpp:45
PluggableUSBMIDI::config_descriptor
uint8_t config_descriptor[0x65]
Definition
PluggableUSBMIDI.hpp:107
PluggableUSBMIDI::string_iinterface_desc
const uint8_t * string_iinterface_desc() override
PluggableUSBMIDI::bulk_out_ep
usb_ep_t bulk_out_ep
Definition
PluggableUSBMIDI.hpp:106
PluggableUSBMIDI::~PluggableUSBMIDI
~PluggableUSBMIDI()
PluggableUSBMIDI::microseconds
std::chrono::microseconds microseconds
Definition
PluggableUSBMIDI.hpp:28
PluggableUSBMIDI::get_packet_size
static constexpr uint32_t get_packet_size()
Definition
PluggableUSBMIDI.hpp:34
PluggableUSBMIDI::tx_start
void tx_start(const void *data, uint32_t size)
Definition
PluggableUSBMIDI.hpp:41
interrupt_atomic
Wrapper that provides atomic access to variables shared between the main program and interrupt handle...
Definition
Atomic.hpp:81
BulkRX
Receives Bulk packets (OUT for device mode, IN for host mode).
Definition
BulkRX.hpp:12
BulkRX::rx_callback
void rx_callback(uint32_t num_bytes_read)
BulkTX
Sends Bulk packets (IN for device mode, OUT for host mode).
Definition
BulkTX.hpp:12
BulkTX::tx_callback
void tx_callback()
BulkTX< PluggableUSBMIDI, uint32_t, 64 >::write_nonblock
uint32_t write_nonblock(const MessageType *msgs, uint32_t num_msgs)
BulkTX::timeout_callback
void timeout_callback()
BulkTX< PluggableUSBMIDI, uint32_t, 64 >::send_now
void send_now()
BulkTX< PluggableUSBMIDI, uint32_t, 64 >::getWriteError
uint32_t getWriteError() const
Definition
BulkTX.hpp:54
BulkTX< PluggableUSBMIDI, uint32_t, 64 >::write
void write(MessageType msg)
BulkTX< PluggableUSBMIDI, uint32_t, 64 >::clearWriteError
uint32_t clearWriteError()
Definition
BulkTX.hpp:56
Generated by
1.17.0