Control Surface
main
MIDI Control Surface library for Arduino
Loading...
Searching...
No Matches
src
MIDI_Interfaces
USBMIDI
USBMIDI_Teensy2.hpp
Go to the documentation of this file.
1
#include <
AH/Teensy/TeensyUSBTypes.hpp
>
2
3
#include <
AH/Containers/Array.hpp
>
4
#include <Settings/NamespaceSettings.hpp>
5
6
BEGIN_CS_NAMESPACE
7
8
struct
Teensy2_USBDeviceMIDIBackend
{
9
using
MIDIUSBPacket_t
=
AH::Array<uint8_t, 4>
;
10
MIDIUSBPacket_t
read
();
11
void
write
(
MIDIUSBPacket_t
data);
12
void
sendNow
();
13
bool
preferImmediateSend
();
14
};
15
16
END_CS_NAMESPACE
17
18
#ifdef TEENSY_MIDIUSB_ENABLED
19
20
#include <usb_private.h>
21
22
BEGIN_CS_NAMESPACE
23
24
inline
Teensy2_USBDeviceMIDIBackend::MIDIUSBPacket_t
25
Teensy2_USBDeviceMIDIBackend::read
() {
26
// https://github.com/PaulStoffregen/cores/blob/73ea157600a7082686d9cc48786a73caa7567da9/usb_midi/usb_api.cpp#L195
27
uint8_t
c
,
intr_state
;
28
29
intr_state
=
SREG
;
30
cli
();
31
if
(!
usb_configuration
) {
32
SREG
=
intr_state
;
33
return
MIDIUSBPacket_t
{0};
34
}
35
UENUM
=
MIDI_RX_ENDPOINT
;
36
retry
:
37
c
=
UEINTX
;
38
if
(!(
c
& (1 <<
RWAL
))) {
39
if
(
c
& (1 <<
RXOUTI
)) {
40
UEINTX
= 0x6B;
41
goto
retry
;
42
}
43
SREG
=
intr_state
;
44
return
MIDIUSBPacket_t
{0};
45
}
46
MIDIUSBPacket_t
packet;
47
packet.
data
[0] =
UEDATX
;
48
packet.
data
[1] =
UEDATX
;
49
packet.
data
[2] =
UEDATX
;
50
packet.
data
[3] =
UEDATX
;
51
if
(!(
UEINTX
& (1 <<
RWAL
)))
52
UEINTX
= 0x6B;
53
SREG
=
intr_state
;
54
55
return
packet;
56
}
57
58
inline
void
Teensy2_USBDeviceMIDIBackend::write
(
MIDIUSBPacket_t
data) {
59
uint8_t
intr_state
, timeout;
60
61
if
(!
usb_configuration
)
62
return
;
63
intr_state
=
SREG
;
64
cli
();
65
UENUM
=
MIDI_TX_ENDPOINT
;
66
timeout =
UDFNUML
+ 2;
67
while
(1) {
68
// are we ready to transmit?
69
if
(
UEINTX
& (1 <<
RWAL
))
70
break
;
71
SREG
=
intr_state
;
72
if
(
UDFNUML
== timeout)
73
return
;
74
if
(!
usb_configuration
)
75
return
;
76
intr_state
=
SREG
;
77
cli
();
78
UENUM
=
MIDI_TX_ENDPOINT
;
79
}
80
UEDATX
= data.
data
[0];
81
UEDATX
= data.
data
[1];
82
UEDATX
= data.
data
[2];
83
UEDATX
= data.
data
[3];
84
if
(!(
UEINTX
& (1 <<
RWAL
)))
85
UEINTX
= 0x3A;
86
SREG
=
intr_state
;
87
}
88
89
inline
void
Teensy2_USBDeviceMIDIBackend::sendNow
() {
90
// TODO: I think the UEINTX = 0x3A actually sends/flushes the data, but I'm
91
// not sure, and I don't have the right hardware to test it.
92
}
93
94
inline
bool
Teensy2_USBDeviceMIDIBackend::preferImmediateSend
() {
95
return
false
;
96
}
97
98
END_CS_NAMESPACE
99
100
#endif
Array.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
TeensyUSBTypes.hpp
AH::copyAs
Array< T, N > copyAs(const Array< U, N > &src)
Copy an Array to an Array of a different type.
Definition
ArrayHelpers.hpp:105
AH::Array< uint8_t, 4 >
AH::Array::data
T data[N]
Definition
Array.hpp:33
Teensy2_USBDeviceMIDIBackend
Definition
USBMIDI_Teensy2.hpp:8
Teensy2_USBDeviceMIDIBackend::sendNow
void sendNow()
Definition
USBMIDI_Teensy2.hpp:89
Teensy2_USBDeviceMIDIBackend::write
void write(MIDIUSBPacket_t data)
Definition
USBMIDI_Teensy2.hpp:58
Teensy2_USBDeviceMIDIBackend::read
MIDIUSBPacket_t read()
Definition
USBMIDI_Teensy2.hpp:25
Teensy2_USBDeviceMIDIBackend::preferImmediateSend
bool preferImmediateSend()
Definition
USBMIDI_Teensy2.hpp:94
Generated by
1.10.0