Control Surface  1.2.0
MIDI Control Surface library for Arduino
USBMIDI_Teensy2.ipp
Go to the documentation of this file.
1 #include "USBMIDI.hpp"
3 
4 #ifdef TEENSY_MIDIUSB_ENABLED
5 
6 #include <usb_private.h>
7 
9 
10 namespace USBMIDI {
11 
13 
14  // https://github.com/PaulStoffregen/cores/blob/73ea157600a7082686d9cc48786a73caa7567da9/usb_midi/usb_api.cpp#L195
15  uint8_t c, intr_state;
16 
17  intr_state = SREG;
18  cli();
19  if (!usb_configuration) {
20  SREG = intr_state;
21  return MIDIUSBPacket_t{0};
22  }
23  UENUM = MIDI_RX_ENDPOINT;
24 retry:
25  c = UEINTX;
26  if (!(c & (1 << RWAL))) {
27  if (c & (1 << RXOUTI)) {
28  UEINTX = 0x6B;
29  goto retry;
30  }
31  SREG = intr_state;
32  return MIDIUSBPacket_t{0};
33  }
34  MIDIUSBPacket_t packet;
35  packet.data[0] = UEDATX;
36  packet.data[1] = UEDATX;
37  packet.data[2] = UEDATX;
38  packet.data[3] = UEDATX;
39  if (!(UEINTX & (1 << RWAL)))
40  UEINTX = 0x6B;
41  SREG = intr_state;
42 
43  return packet;
44 }
45 
46 void write(uint8_t cn, uint8_t cin, uint8_t d0, uint8_t d1, uint8_t d2) {
47  uint8_t intr_state, timeout;
48 
49  if (!usb_configuration)
50  return;
51  intr_state = SREG;
52  cli();
53  UENUM = MIDI_TX_ENDPOINT;
54  timeout = UDFNUML + 2;
55  while (1) {
56  // are we ready to transmit?
57  if (UEINTX & (1 << RWAL))
58  break;
59  SREG = intr_state;
60  if (UDFNUML == timeout)
61  return;
62  if (!usb_configuration)
63  return;
64  intr_state = SREG;
65  cli();
66  UENUM = MIDI_TX_ENDPOINT;
67  }
68  UEDATX = (cn << 4) | cin;
69  UEDATX = d0;
70  UEDATX = d1;
71  UEDATX = d2;
72  if (!(UEINTX & (1 << RWAL)))
73  UEINTX = 0x3A;
74  SREG = intr_state;
75 }
76 
77 void flush() {
78  // TODO: I think the UEINTX = 0x3A actually sends/flushes the data, but I'm
79  // not sure, and I don't have the right hardware to test it.
80 }
81 
82 } // namespace USBMIDI
83 
85 
86 #endif
USBMIDI
Definition: USBMIDI.hpp:6
USBMIDI.hpp
BEGIN_CS_NAMESPACE
#define BEGIN_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:9
END_CS_NAMESPACE
#define END_CS_NAMESPACE
Definition: Settings/NamespaceSettings.hpp:10
TeensyUSBTypes.hpp
USBMIDI::flush
void flush()
Definition: USBMIDI_MIDIUSB.ipp:24
USBMIDI::MIDIUSBPacket_t
AH::Array< uint8_t, 4 > MIDIUSBPacket_t
Definition: USBMIDI.hpp:8
USBMIDI::read
MIDIUSBPacket_t read()
Definition: USBMIDI_MIDIUSB.ipp:8
USBMIDI::write
void write(uint8_t cn, uint8_t cin, uint8_t d0, uint8_t d1, uint8_t d2)
Definition: USBMIDI_MIDIUSB.ipp:14