LCOV - code coverage report
Current view: top level - src/MIDI_Interfaces - SerialMIDI_Interface.hpp (source / functions) Hit Total Coverage
Test: 3a807a259ebe0769dd942f7f612dca5273937539 Lines: 2 3 66.7 %
Date: 2024-03-24 17:16:54 Functions: 2 3 66.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : #pragma once
       2             : 
       3             : #include "MIDI_Interface.hpp"
       4             : #include <AH/Arduino-Wrapper.h> // Stream
       5             : #include <AH/STL/utility>
       6             : #include <AH/Teensy/TeensyUSBTypes.hpp>
       7             : #include <MIDI_Parsers/SerialMIDI_Parser.hpp>
       8             : #include <Settings/SettingsWrapper.hpp>
       9             : 
      10             : BEGIN_CS_NAMESPACE
      11             : 
      12             : /**
      13             :  * @brief   A class for MIDI interfaces sending and receiving MIDI messages
      14             :  *          over a Stream.
      15             :  * 
      16             :  * @ingroup MIDIInterfaces
      17             :  */
      18             : class StreamMIDI_Interface : public MIDI_Interface {
      19             :   public:
      20             :     /// Constructor.
      21             :     /// @param   stream
      22             :     ///          Reference to the Stream interface to read and send MIDI data
      23             :     ///          from/to.
      24          13 :     StreamMIDI_Interface(Stream &stream) : stream(stream) {}
      25             : 
      26             :     /// Try reading and parsing a single incoming MIDI message.
      27             :     /// @return  Returns the type of the read message, or
      28             :     ///          `MIDIReadEvent::NO_MESSAGE` if no MIDI message was available.
      29             :     MIDIReadEvent read();
      30             : 
      31             :     /// Return the received channel voice message.
      32             :     ChannelMessage getChannelMessage() const;
      33             :     /// Return the received system common message.
      34             :     SysCommonMessage getSysCommonMessage() const;
      35             :     /// Return the received real-time message.
      36             :     RealTimeMessage getRealTimeMessage() const;
      37             :     /// Return the received system exclusive message.
      38             :     SysExMessage getSysExMessage() const;
      39             : 
      40             :     void update() override;
      41             : 
      42             :   protected:
      43             :     void sendChannelMessageImpl(ChannelMessage) override;
      44             :     void sendSysCommonImpl(SysCommonMessage) override;
      45             :     void sendSysExImpl(SysExMessage) override;
      46             :     void sendRealTimeImpl(RealTimeMessage) override;
      47           0 :     void sendNowImpl() override {}
      48             : 
      49             :   protected:
      50             : #if !DISABLE_PIPES
      51           1 :     void handleStall() override { MIDI_Interface::handleStall(this); }
      52             : #ifdef DEBUG_OUT
      53             :     const char *getName() const override { return "ser"; }
      54             : #endif
      55             : #endif
      56             : 
      57             :   protected:
      58             :     Stream &stream;
      59             :     SerialMIDI_Parser parser;
      60             : };
      61             : 
      62             : // -------------------------------------------------------------------------- //
      63             : 
      64             : /**
      65             :  * @brief   A wrapper class for MIDI interfaces sending and receiving
      66             :  *          MIDI messages over a Serial port of generic class S.
      67             :  *
      68             :  * @note    This is a template class because the type of the Serial object
      69             :  *          is completely different on different architectures, and they
      70             :  *          do not share a common super-class that has a `begin` method.
      71             :  * 
      72             :  * @ingroup MIDIInterfaces
      73             :  */
      74             : template <class S>
      75             : class SerialMIDI_Interface : public StreamMIDI_Interface {
      76             :   public:
      77             :     /**
      78             :      * @brief   Create a new MIDI Interface on the given Serial interface
      79             :      *          with the given baud rate.
      80             :      *
      81             :      * @param   serial
      82             :      *          The Serial interface.
      83             :      * @param   baud
      84             :      *          The baud rate for the Serial interface.
      85             :      */
      86             :     SerialMIDI_Interface(S &serial, unsigned long baud = MIDI_BAUD)
      87             :         : StreamMIDI_Interface(serial), baud(baud) {}
      88             : 
      89             :     /**
      90             :      * @brief   Start the Serial interface at the predefined baud rate.
      91             :      */
      92             :     void begin() override { static_cast<S &>(stream).begin(baud); }
      93             : 
      94             :   private:
      95             :     const unsigned long baud;
      96             : };
      97             : 
      98             : // -------------------------------------------------------------------------- //
      99             : 
     100             : /**
     101             :  * @brief   A class for MIDI interfaces sending and receiving
     102             :  *          MIDI messages over a Hardware Serial port.
     103             :  * 
     104             :  * @ingroup MIDIInterfaces
     105             :  */
     106             : class HardwareSerialMIDI_Interface
     107             :     : public SerialMIDI_Interface<HardwareSerial> {
     108             :   public:
     109             :     /**
     110             :      * @brief   Construct a new MIDI Interface on the given HardwareSerial
     111             :      *          interface with the given baud rate.
     112             :      *
     113             :      * @param   serial
     114             :      *          The HardwareSerial interface.
     115             :      * @param   baud
     116             :      *          The baud rate for the serial interface.
     117             :      */
     118             :     HardwareSerialMIDI_Interface(HardwareSerial &serial,
     119             :                                  unsigned long baud = MIDI_BAUD)
     120             :         : SerialMIDI_Interface(serial, baud) {}
     121             : };
     122             : 
     123             : // -------------------------------------------------------------------------- //
     124             : 
     125             : /**
     126             :  * @brief   A class for MIDI interfaces sending and receiving
     127             :  *          MIDI messages over the Serial port of the USB connection.
     128             :  *
     129             :  * @ingroup MIDIInterfaces
     130             :  */
     131             : class USBSerialMIDI_Interface : public SerialMIDI_Interface<decltype(Serial)> {
     132             :   public:
     133             :     /**
     134             :      * @brief   Construct a USBSerialMIDI_Interface with the given baud rate.
     135             :      *
     136             :      * @param   baud
     137             :      *          The baud rate to start the USB Serial connection with.
     138             :      */
     139             :     USBSerialMIDI_Interface(unsigned long baud)
     140             :         : SerialMIDI_Interface(Serial, baud) {}
     141             : };
     142             : 
     143             : // -------------------------------------------------------------------------- //
     144             : 
     145             : #if !defined(TEENSYDUINO) ||                                                   \
     146             :     (defined(TEENSYDUINO) && defined(TEENSY_SERIALUSB_ENABLED))
     147             : /**
     148             :  * @brief   A class for MIDI Interfaces sending and receiving
     149             :  *          data over the USB Serial CDC connection for the use
     150             :  *          with the [Hairless MIDI<->Serial Bridge](http://projectgus.github.io/hairless-midiserial/).
     151             :  * 
     152             :  * @ingroup MIDIInterfaces
     153             :  */
     154             : class HairlessMIDI_Interface : public USBSerialMIDI_Interface {
     155             :   public:
     156             :     /**
     157             :      * @brief   Construct a HairlessMIDI_Interface.
     158             :      *
     159             :      * The default Hairless baud rate of 115200 baud is used.
     160             :      * This can be changed in the Settings.hpp file.
     161             :      */
     162             :     HairlessMIDI_Interface(unsigned long baud = HAIRLESS_BAUD)
     163             :         : USBSerialMIDI_Interface(baud) {}
     164             : };
     165             : #endif
     166             : 
     167             : END_CS_NAMESPACE

Generated by: LCOV version 1.15