From 6be24e44046ffc386e2f4072aa5cccb1c462f47f Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Wed, 10 Jun 2009 05:03:45 +0000
Subject: [PATCH] Fixes to the MIDI device demos (ClassDriver, LowLevel);
 discard unused read-in events from the host, use standard MIDI event
 structure in low level demo rather than sending individual bytes.

---
 Demos/Device/ClassDriver/MIDI/MIDI.c          |  3 +
 Demos/Device/LowLevel/CDC/CDC.h               |  2 -
 Demos/Device/LowLevel/GenericHID/GenericHID.h |  9 ---
 Demos/Device/LowLevel/MIDI/MIDI.c             | 80 +++++++++++--------
 Demos/Device/LowLevel/MIDI/MIDI.h             | 20 +++--
 Demos/Device/LowLevel/Mouse/Mouse.h           |  1 -
 .../Device/LowLevel/USBtoSerial/USBtoSerial.h |  8 --
 .../Incomplete/BluetoothHost/BluetoothHost.h  | 13 ---
 8 files changed, 62 insertions(+), 74 deletions(-)

diff --git a/Demos/Device/ClassDriver/MIDI/MIDI.c b/Demos/Device/ClassDriver/MIDI/MIDI.c
index 8881d1dc7..bb4eaf2df 100644
--- a/Demos/Device/ClassDriver/MIDI/MIDI.c
+++ b/Demos/Device/ClassDriver/MIDI/MIDI.c
@@ -63,6 +63,9 @@ int main(void)
 	for (;;)
 	{
 		CheckJoystickMovement();
+		
+		USB_MIDI_EventPacket_t DummyMIDIEvent;
+		USB_MIDI_ReceiveEventPacket(&Keyboard_MIDI_Interface, &DummyMIDIEvent);
 	
 		USB_MIDI_USBTask(&Keyboard_MIDI_Interface);
 		USB_USBTask();
diff --git a/Demos/Device/LowLevel/CDC/CDC.h b/Demos/Device/LowLevel/CDC/CDC.h
index 821ba8f96..a8f7199ab 100644
--- a/Demos/Device/LowLevel/CDC/CDC.h
+++ b/Demos/Device/LowLevel/CDC/CDC.h
@@ -180,6 +180,4 @@
 		void EVENT_USB_ConfigurationChanged(void);
 		void EVENT_USB_UnhandledControlPacket(void);
 
-		void UpdateStatus(uint8_t CurrentStatus);
-
 #endif
diff --git a/Demos/Device/LowLevel/GenericHID/GenericHID.h b/Demos/Device/LowLevel/GenericHID/GenericHID.h
index e48bf1df3..fbd0a7f8d 100644
--- a/Demos/Device/LowLevel/GenericHID/GenericHID.h
+++ b/Demos/Device/LowLevel/GenericHID/GenericHID.h
@@ -68,15 +68,6 @@
 
 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3)
-		
-	/* Enums: */
-		/** Enum for the possible status codes for passing to the UpdateStatus() function. */
-		enum GenericHID_StatusCodes_t
-		{
-			Status_USBNotReady    = 0, /**< USB is not ready (disconnected from a USB host) */
-			Status_USBEnumerating = 1, /**< USB interface is enumerating */
-			Status_USBReady       = 2, /**< USB interface is connected and ready */
-		};
 
 	/* Function Prototypes: */
 		void SetupHardware(void);
diff --git a/Demos/Device/LowLevel/MIDI/MIDI.c b/Demos/Device/LowLevel/MIDI/MIDI.c
index 856f7dbe9..c74d8d534 100644
--- a/Demos/Device/LowLevel/MIDI/MIDI.c
+++ b/Demos/Device/LowLevel/MIDI/MIDI.c
@@ -122,6 +122,9 @@ void MIDI_Task(void)
 	/* Check if endpoint is ready to be written to */
 	if (Endpoint_IsINReady())
 	{
+		uint8_t MIDICommand = 0;
+		uint8_t MIDIPitch;
+	
 		/* Get current joystick mask, XOR with previous to detect joystick changes */
 		uint8_t JoystickStatus  = Joystick_GetStatus();
 		uint8_t JoystickChanges = (JoystickStatus ^ PrevJoystickStatus);
@@ -130,20 +133,55 @@ void MIDI_Task(void)
 		uint8_t Channel = ((Buttons_GetStatus() & BUTTONS_BUTTON1) ? MIDI_CHANNEL(10) : MIDI_CHANNEL(1));
 
 		if (JoystickChanges & JOY_LEFT)
-		  SendMIDINoteChange(0x3C, (JoystickStatus & JOY_LEFT), 0, Channel);
+		{
+			MIDICommand = ((JoystickStatus & JOY_LEFT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
+			MIDIPitch   = 0x3C;
+		}
 
 		if (JoystickChanges & JOY_UP)
-		  SendMIDINoteChange(0x3D, (JoystickStatus & JOY_UP), 0, Channel);
+		{
+			MIDICommand = ((JoystickStatus & JOY_UP)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
+			MIDIPitch   = 0x3D;
+		}
 
 		if (JoystickChanges & JOY_RIGHT)
-		  SendMIDINoteChange(0x3E, (JoystickStatus & JOY_RIGHT), 0, Channel);
-
+		{
+			MIDICommand = ((JoystickStatus & JOY_RIGHT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
+			MIDIPitch   = 0x3E;
+		}
+		
 		if (JoystickChanges & JOY_DOWN)
-		  SendMIDINoteChange(0x3F, (JoystickStatus & JOY_DOWN), 0, Channel);
+		{
+			MIDICommand = ((JoystickStatus & JOY_DOWN)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
+			MIDIPitch   = 0x3F;
+		}
 
 		if (JoystickChanges & JOY_PRESS)
-		  SendMIDINoteChange(0x3B, (JoystickStatus & JOY_PRESS), 0, Channel);
-
+		{
+			MIDICommand = ((JoystickStatus & JOY_PRESS)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
+			MIDIPitch   = 0x3B;
+		}
+
+		/* Check if a MIDI command is to be sent */
+		if (MIDICommand)
+		{
+			USB_MIDI_EventPacket_t MIDIEvent = (USB_MIDI_EventPacket_t)
+				{
+					.CableNumber = 0,
+					.Command     = MIDICommand,
+					
+					.Data1       = (MIDICommand << 4) | Channel,
+					.Data2       = MIDIPitch,
+					.Data3       = MIDI_STANDARD_VELOCITY,			
+				};
+				
+			/* Write the MIDI event packet to the endpoint */
+			Endpoint_Write_Stream_LE(&MIDIEvent, sizeof(MIDIEvent));
+		
+			/* Send the data in the endpoint to the host */
+			Endpoint_ClearIN();
+		}
+		
 		/* Save previous joystick value for next joystick change detection */
 		PrevJoystickStatus = JoystickStatus;
 	}
@@ -155,31 +193,3 @@ void MIDI_Task(void)
 	if (Endpoint_IsOUTReceived())
 	  Endpoint_ClearOUT();
 }
-
-/** Sends a MIDI note change event (note on or off) to the MIDI output jack, on the given virtual cable ID and channel.
- *
- *  \param Pitch    Pitch of the note to turn on or off
- *  \param OnOff    Set to true if the note is on (being held down), or false otherwise
- *  \param CableID  ID of the virtual cable to send the note change to
- *  \param Channel  MIDI channel number to send the note change event to
- */
-void SendMIDINoteChange(const uint8_t Pitch, const bool OnOff, const uint8_t CableID, const uint8_t Channel)
-{
-	/* If endpoint ready for more data, abort */
-	if (!(Endpoint_IsReadWriteAllowed()))
-	  return;
-
-	/* Check if the message should be a Note On or Note Off command */
-	uint8_t Command = ((OnOff)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
-
-	/* Write the Packet Header to the endpoint */
-	Endpoint_Write_Byte((CableID << 4) | (Command >> 4));
-
-	/* Write the Note On/Off command with the specified channel, pitch and velocity */
-	Endpoint_Write_Byte(Command | Channel);
-	Endpoint_Write_Byte(Pitch);
-	Endpoint_Write_Byte(MIDI_STANDARD_VELOCITY);
-	
-	/* Send the data in the endpoint to the host */
-	Endpoint_ClearIN();
-}
diff --git a/Demos/Device/LowLevel/MIDI/MIDI.h b/Demos/Device/LowLevel/MIDI/MIDI.h
index 0e8dde8b2..1558501a7 100644
--- a/Demos/Device/LowLevel/MIDI/MIDI.h
+++ b/Demos/Device/LowLevel/MIDI/MIDI.h
@@ -52,10 +52,10 @@
 
    /* Macros: */
 		/** MIDI command for a note on (activation) event */
-		#define MIDI_COMMAND_NOTE_ON         0x90
+		#define MIDI_COMMAND_NOTE_ON         0x09
 
 		/** MIDI command for a note off (deactivation) event */
-		#define MIDI_COMMAND_NOTE_OFF        0x80
+		#define MIDI_COMMAND_NOTE_OFF        0x08
 
 		/** Standard key press velocity value used for all note events, as no pressure sensor is mounted */
 		#define MIDI_STANDARD_VELOCITY       64
@@ -78,6 +78,18 @@
 
 		/** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */
 		#define LEDMASK_USB_ERROR        (LEDS_LED1 | LEDS_LED3)
+
+	/* Type Defines: */
+		/** Type define for a USB MIDI event packet, used to encapsulate sent and received MIDI messages from a USB MIDI interface. */
+		typedef struct
+		{
+			unsigned char Command     : 4; /**< MIDI command being sent or received in the event packet */
+			unsigned char CableNumber : 4; /**< Virtual cable number of the event being sent or received in the given MIDI interface */
+			
+			uint8_t Data1; /**< First byte of data in the MIDI event */
+			uint8_t Data2; /**< Second byte of data in the MIDI event */
+			uint8_t Data3; /**< Third byte of data in the MIDI event */		
+		} USB_MIDI_EventPacket_t;
 		
    /* Function Prototypes: */
 		void SetupHardware(void);
@@ -86,9 +98,5 @@
 		void EVENT_USB_Connect(void);
 		void EVENT_USB_Disconnect(void);
 		void EVENT_USB_ConfigurationChanged(void);
-
-		void SendMIDINoteChange(const uint8_t Pitch, const bool OnOff,
-		                        const uint8_t CableID, const uint8_t Channel);		
-		void UpdateStatus(uint8_t CurrentStatus);
 		
 #endif
diff --git a/Demos/Device/LowLevel/Mouse/Mouse.h b/Demos/Device/LowLevel/Mouse/Mouse.h
index b9460b347..8ff8b8fc3 100644
--- a/Demos/Device/LowLevel/Mouse/Mouse.h
+++ b/Demos/Device/LowLevel/Mouse/Mouse.h
@@ -107,6 +107,5 @@
 		void EVENT_USB_UnhandledControlPacket(void);
 
 		void CreateMouseReport(USB_MouseReport_Data_t* ReportData);
-		void UpdateStatus(uint8_t CurrentStatus);
 
 #endif
diff --git a/Demos/Device/LowLevel/USBtoSerial/USBtoSerial.h b/Demos/Device/LowLevel/USBtoSerial/USBtoSerial.h
index 1a4a1cb67..51c47c943 100644
--- a/Demos/Device/LowLevel/USBtoSerial/USBtoSerial.h
+++ b/Demos/Device/LowLevel/USBtoSerial/USBtoSerial.h
@@ -172,14 +172,6 @@
 			Parity_Mark         = 3, /**< Mark parity bit mode on each frame */
 			Parity_Space        = 4, /**< Space parity bit mode on each frame */
 		};
-
-		/** Enum for the possible status codes for passing to the UpdateStatus() function. */
-		enum USBtoSerial_StatusCodes_t
-		{
-			Status_USBNotReady    = 0, /**< USB is not ready (disconnected from a USB host) */
-			Status_USBEnumerating = 1, /**< USB interface is enumerating */
-			Status_USBReady       = 2, /**< USB interface is connected and ready */
-		};
 		
 	/* Function Prototypes: */
 		void SetupHardware(void);
diff --git a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.h b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.h
index e78e392b7..890b3f155 100644
--- a/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.h
+++ b/Demos/Host/Incomplete/BluetoothHost/BluetoothHost.h
@@ -68,19 +68,6 @@
 
 	/* Task Definitions: */
 		void Bluetooth_Management_Task(void);
-
-	/* Enums: */
-		/** Enum for the possible status codes for passing to the UpdateStatus() function. */
-		enum MouseHostViaInt_StatusCodes_t
-		{
-			Status_USBNotReady        = 0, /**< USB is not ready (disconnected from a USB device) */
-			Status_USBEnumerating     = 1, /**< USB interface is enumerating */
-			Status_USBReady           = 2, /**< USB interface is connected and ready */
-			Status_EnumerationError   = 3, /**< Software error while enumerating the attached USB device */
-			Status_HardwareError      = 4, /**< Hardware error while enumerating the attached USB device */
-			Status_BluetoothConnected = 5, /**< Bluetooth stack connected to device and idle */
-			Status_BluetoothBusy      = 6, /**< Bluetooth stack busy */ 
-		};
 		
 	/* Event Handlers: */
 		void EVENT_USB_DeviceAttached(void);
-- 
GitLab