From 99a9e415efd1e27d902427ccd1aa6e4a9f9d4d05 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Fri, 5 Nov 2010 03:43:11 +0000
Subject: [PATCH] Loop in the ClassDriver MIDI device/host demos until there
 are no more incomming events to process. Only clear the endpoint/pipe bank in
 the LowLevel MIDI device/host demos when the endpoint is empty after an event
 read.

---
 Demos/Device/ClassDriver/MIDI/MIDI.c       | 2 +-
 Demos/Device/LowLevel/MIDI/MIDI.c          | 8 ++++++--
 Demos/Host/ClassDriver/MIDIHost/MIDIHost.c | 2 +-
 Demos/Host/LowLevel/MIDIHost/MIDIHost.c    | 8 ++++----
 4 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/Demos/Device/ClassDriver/MIDI/MIDI.c b/Demos/Device/ClassDriver/MIDI/MIDI.c
index 217a3a4bd..95a2ddd0e 100644
--- a/Demos/Device/ClassDriver/MIDI/MIDI.c
+++ b/Demos/Device/ClassDriver/MIDI/MIDI.c
@@ -71,7 +71,7 @@ int main(void)
 		CheckJoystickMovement();
 
 		MIDI_EventPacket_t ReceivedMIDIEvent;
-		if (MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent))
+		while (MIDI_Device_ReceiveEventPacket(&Keyboard_MIDI_Interface, &ReceivedMIDIEvent))
 		{
 			if ((ReceivedMIDIEvent.Command == (MIDI_COMMAND_NOTE_ON >> 4)) && (ReceivedMIDIEvent.Data3 > 0))
 			  LEDs_SetAllLEDs(ReceivedMIDIEvent.Data2 > 64 ? LEDS_LED1 : LEDS_LED2);
diff --git a/Demos/Device/LowLevel/MIDI/MIDI.c b/Demos/Device/LowLevel/MIDI/MIDI.c
index e43645585..bfe90b0d1 100644
--- a/Demos/Device/LowLevel/MIDI/MIDI.c
+++ b/Demos/Device/LowLevel/MIDI/MIDI.c
@@ -204,8 +204,12 @@ void MIDI_Task(void)
 			LEDs_SetAllLEDs(LEDS_NO_LEDS);
 		}
 
-		/* Clear the endpoint ready for new packet */
-		Endpoint_ClearOUT();
+		/* If the endpoint is now empty, clear the bank */
+		if (!(Endpoint_BytesInEndpoint()))
+		{
+			/* Clear the endpoint ready for new packet */
+			Endpoint_ClearOUT();
+		}
 	}
 }
 
diff --git a/Demos/Host/ClassDriver/MIDIHost/MIDIHost.c b/Demos/Host/ClassDriver/MIDIHost/MIDIHost.c
index 56daf125c..eda827257 100644
--- a/Demos/Host/ClassDriver/MIDIHost/MIDIHost.c
+++ b/Demos/Host/ClassDriver/MIDIHost/MIDIHost.c
@@ -109,7 +109,7 @@ int main(void)
 				CheckJoystickMovement();
 
 				MIDI_EventPacket_t MIDIEvent;
-				if (MIDI_Host_ReceiveEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent))
+				while (MIDI_Host_ReceiveEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent))
 				{
 					bool NoteOnEvent  = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_ON  >> 4));
 					bool NoteOffEvent = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_OFF >> 4));
diff --git a/Demos/Host/LowLevel/MIDIHost/MIDIHost.c b/Demos/Host/LowLevel/MIDIHost/MIDIHost.c
index b616b679f..5ff3baa39 100644
--- a/Demos/Host/LowLevel/MIDIHost/MIDIHost.c
+++ b/Demos/Host/LowLevel/MIDIHost/MIDIHost.c
@@ -192,19 +192,19 @@ void MIDI_Host_Task(void)
 				                                                                           ((MIDIEvent.Data1 & 0x0F) + 1),
 				                                                                           MIDIEvent.Data2, MIDIEvent.Data3);
 				}
-
-				Pipe_ClearIN();
+				
+				if (!(Pipe_BytesInPipe()))
+				  Pipe_ClearIN();
 			}
 
 			Pipe_SelectPipe(MIDI_DATA_OUT_PIPE);
 
-			static uint8_t PrevJoystickStatus;
-
 			if (Pipe_IsOUTReady())
 			{
 				uint8_t MIDICommand = 0;
 				uint8_t MIDIPitch;
 
+				static uint8_t PrevJoystickStatus;
 				uint8_t JoystickStatus  = Joystick_GetStatus();
 				uint8_t JoystickChanges = (JoystickStatus ^ PrevJoystickStatus);
 
-- 
GitLab