added support for receiving SysEx command segments

Very long SysEx mesaages are cut in to multiple command segments
Where a normal SysEx starts with F0 and ends with F7, the first segment will start with F0 and end with F0, the middle section (optional) start with F7 and ends with F7 - the last segments starts with F7 and ends with F0
This commit is contained in:
lathoub 2020-02-10 15:04:45 +01:00
parent 5fab6b3fc3
commit 0d596066b4
2 changed files with 12 additions and 6 deletions

View File

@ -795,12 +795,13 @@ bool MidiInterface<SerialPort, Settings>::parse()
mPendingMessageExpectedLenght = 3;
break;
case SystemExclusive:
case SystemExclusiveStart:
case SystemExclusiveEnd:
// The message can be any lenght
// between 3 and MidiMessage::sSysExMaxSize bytes
mPendingMessageExpectedLenght = MidiMessage::sSysExMaxSize;
mRunningStatus_RX = InvalidType;
mMessage.sysexArray[0] = SystemExclusive;
mMessage.sysexArray[0] = pendingType;
break;
case InvalidType:
@ -873,11 +874,13 @@ bool MidiInterface<SerialPort, Settings>::parse()
return true;
// End of Exclusive
case 0xf7:
if (mMessage.sysexArray[0] == SystemExclusive)
case SystemExclusiveStart:
case SystemExclusiveEnd:
if ((mMessage.sysexArray[0] == SystemExclusiveStart)
|| (mMessage.sysexArray[0] == SystemExclusiveEnd))
{
// Store the last byte (EOX)
mMessage.sysexArray[mPendingMessageIndex++] = 0xf7;
mMessage.sysexArray[mPendingMessageIndex++] = extracted;
mMessage.type = SystemExclusive;
// Get length
@ -902,7 +905,8 @@ bool MidiInterface<SerialPort, Settings>::parse()
}
// Add extracted data byte to pending message
if (mPendingMessage[0] == SystemExclusive)
if ((mPendingMessage[0] == SystemExclusiveStart)
|| (mPendingMessage[0] == SystemExclusiveEnd))
mMessage.sysexArray[mPendingMessageIndex] = extracted;
else
mPendingMessage[mPendingMessageIndex] = extracted;

View File

@ -73,10 +73,12 @@ enum MidiType: uint8_t
AfterTouchChannel = 0xD0, ///< Channel (monophonic) AfterTouch
PitchBend = 0xE0, ///< Pitch Bend
SystemExclusive = 0xF0, ///< System Exclusive
SystemExclusiveStart = SystemExclusive, ///< System Exclusive Start
TimeCodeQuarterFrame = 0xF1, ///< System Common - MIDI Time Code Quarter Frame
SongPosition = 0xF2, ///< System Common - Song Position Pointer
SongSelect = 0xF3, ///< System Common - Song Select
TuneRequest = 0xF6, ///< System Common - Tune Request
SystemExclusiveEnd = 0xF7, ///< System Exclusive End
Clock = 0xF8, ///< System Real Time - Timing Clock
Start = 0xFA, ///< System Real Time - Start
Continue = 0xFB, ///< System Real Time - Continue