Libraries/USB/src/USB/MIDI/Device.h
Go to the documentation of this file.
1 /****
2  * MIDI/Device.h
3  *
4  * Copyright 2023 mikee47 <mike@sillyhouse.net>
5  *
6  * This file is part of the Sming USB Library
7  *
8  * This library is free software: you can redistribute it and/or modify it under the terms of the
9  * GNU General Public License as published by the Free Software Foundation, version 3 or later.
10  *
11  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  * See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along with this library.
16  * If not, see <https://www.gnu.org/licenses/>.
17  *
18  ****/
19 
20 #pragma once
21 
22 #include "../DeviceInterface.h"
23 
24 namespace USB::MIDI
25 {
26 union Packet {
27  uint8_t data[4];
28  struct {
29  uint8_t code : 4;
30  uint8_t cable_number : 4;
31  uint8_t m0;
32  uint8_t m1;
33  uint8_t m2;
34  };
35 };
36 
37 enum class Event {
38  rx,
39 };
40 
41 class Device : public DeviceInterface
42 {
43 public:
44  using Callback = Delegate<void()>;
45 
46  Device(uint8_t instance, const char* name);
47 
48  // Check if midi interface is mounted
49  bool isMounted() const
50  {
51  return tud_midi_n_mounted(inst);
52  }
53 
54  // Get the number of bytes available for reading
55  uint32_t available(uint8_t cable_num) const
56  {
57  return tud_midi_n_available(inst, cable_num);
58  }
59 
60  // Read byte stream (legacy)
61  uint32_t streamRead(uint8_t cable_num, void* buffer, uint32_t bufsize)
62  {
63  return tud_midi_n_stream_read(inst, cable_num, buffer, bufsize);
64  }
65 
66  // Write byte Stream (legacy)
67  uint32_t streamWrite(uint8_t cable_num, uint8_t const* buffer, uint32_t bufsize)
68  {
69  return tud_midi_n_stream_write(inst, cable_num, buffer, bufsize);
70  }
71 
72  // Read event packet
73  bool readPacket(Packet& packet)
74  {
75  return tud_midi_n_packet_read(inst, packet.data);
76  }
77 
78  // Write event packet
79  bool writePacket(const Packet& packet)
80  {
81  return tud_midi_n_packet_write(inst, packet.data);
82  }
83 
84  void onDataReceived(Callback callback)
85  {
86  receiveCallback = callback;
87  }
88 
89 protected:
90  void handleEvent(Event event);
91 
92 private:
93  Callback receiveCallback;
94  uint8_t inst;
95 };
96 
97 } // namespace USB::MIDI
Base class to support a USB device interface implementation.
Definition: DeviceInterface.h:30
const char * name
Definition: DeviceInterface.h:48
Definition: Libraries/USB/src/USB/MIDI/Device.h:42
uint32_t streamRead(uint8_t cable_num, void *buffer, uint32_t bufsize)
Definition: Libraries/USB/src/USB/MIDI/Device.h:61
void onDataReceived(Callback callback)
Definition: Libraries/USB/src/USB/MIDI/Device.h:84
uint32_t available(uint8_t cable_num) const
Definition: Libraries/USB/src/USB/MIDI/Device.h:55
uint32_t streamWrite(uint8_t cable_num, uint8_t const *buffer, uint32_t bufsize)
Definition: Libraries/USB/src/USB/MIDI/Device.h:67
bool readPacket(Packet &packet)
Definition: Libraries/USB/src/USB/MIDI/Device.h:73
bool isMounted() const
Definition: Libraries/USB/src/USB/MIDI/Device.h:49
bool writePacket(const Packet &packet)
Definition: Libraries/USB/src/USB/MIDI/Device.h:79
void handleEvent(Event event)
Device(uint8_t instance, const char *name)
Definition: Libraries/USB/src/USB/MIDI/Device.h:25
Event
Definition: Libraries/USB/src/USB/MIDI/Device.h:37
Definition: Libraries/USB/src/USB/MIDI/Device.h:26
uint8_t data[4]
Definition: Libraries/USB/src/USB/MIDI/Device.h:27
uint8_t code
Definition: Libraries/USB/src/USB/MIDI/Device.h:29
uint8_t m2
Definition: Libraries/USB/src/USB/MIDI/Device.h:33
uint8_t m1
Definition: Libraries/USB/src/USB/MIDI/Device.h:32
uint8_t cable_number
Definition: Libraries/USB/src/USB/MIDI/Device.h:30
uint8_t m0
Definition: Libraries/USB/src/USB/MIDI/Device.h:31