Re-add in old Endpoint/Pipe workaround for unordered pipes - add new ORDERED_EP_CONFI...
[pub/USBasp.git] / Demos / Host / LowLevel / MIDIHost / MIDIHost.c
index 9c81902..5ff3baa 100644 (file)
@@ -1,21 +1,21 @@
 /*
              LUFA Library
      Copyright (C) Dean Camera, 2010.
 /*
              LUFA Library
      Copyright (C) Dean Camera, 2010.
-              
+
   dean [at] fourwalledcubicle [dot] com
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
   Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
 */
 
 /*
   Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
-  Permission to use, copy, modify, distribute, and sell this 
+  Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
   software and its documentation for any purpose is hereby granted
-  without fee, provided that the above copyright notice appear in 
+  without fee, provided that the above copyright notice appear in
   all copies and that both that the copyright notice and this
   all copies and that both that the copyright notice and this
-  permission notice and warranty disclaimer appear in supporting 
-  documentation, and that the name of the author not be used in 
-  advertising or publicity pertaining to distribution of the 
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
   software without specific, written prior permission.
 
   The author disclaim all warranties with regard to this
   software without specific, written prior permission.
 
   The author disclaim all warranties with regard to this
@@ -33,7 +33,7 @@
  *  Main source file for the MIDIHost demo. This file contains the main tasks of
  *  the demo and is responsible for the initial application hardware configuration.
  */
  *  Main source file for the MIDIHost demo. This file contains the main tasks of
  *  the demo and is responsible for the initial application hardware configuration.
  */
+
 #include "MIDIHost.h"
 
 /** Main program entry point. This routine configures the hardware required by the application, then
 #include "MIDIHost.h"
 
 /** Main program entry point. This routine configures the hardware required by the application, then
@@ -114,13 +114,14 @@ void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
 /** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
  *  enumerating an attached USB device.
  */
 /** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
  *  enumerating an attached USB device.
  */
-void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, const uint8_t SubErrorCode)
+void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode,
+                                            const uint8_t SubErrorCode)
 {
        printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
                                 " -- Error Code %d\r\n"
                                 " -- Sub Error Code %d\r\n"
                                 " -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
 {
        printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
                                 " -- Error Code %d\r\n"
                                 " -- Sub Error Code %d\r\n"
                                 " -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
-       
+
        LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 }
 
        LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 }
 
@@ -136,7 +137,7 @@ void MIDI_Host_Task(void)
        {
                case HOST_STATE_Addressed:
                        puts_P(PSTR("Getting Config Data.\r\n"));
        {
                case HOST_STATE_Addressed:
                        puts_P(PSTR("Getting Config Data.\r\n"));
-               
+
                        /* Get and process the configuration descriptor data */
                        if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
                        {
                        /* Get and process the configuration descriptor data */
                        if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
                        {
@@ -146,7 +147,7 @@ void MIDI_Host_Task(void)
                                  puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
 
                                printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
                                  puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
 
                                printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
-                               
+
                                /* Indicate error via status LEDs */
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
                                /* Indicate error via status LEDs */
                                LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
 
@@ -154,7 +155,7 @@ void MIDI_Host_Task(void)
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;
                                break;
                        }
                                USB_HostState = HOST_STATE_WaitForDeviceRemoval;
                                break;
                        }
-                       
+
                        /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
                        if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
                        {
                        /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
                        if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
                        {
@@ -174,39 +175,39 @@ void MIDI_Host_Task(void)
                        USB_HostState = HOST_STATE_Configured;
                        break;
                case HOST_STATE_Configured:
                        USB_HostState = HOST_STATE_Configured;
                        break;
                case HOST_STATE_Configured:
-                       Pipe_SelectPipe(MIDI_DATAPIPE_IN);
-                       
+                       Pipe_SelectPipe(MIDI_DATA_IN_PIPE);
+
                        if (Pipe_IsINReceived())
                        {
                        if (Pipe_IsINReceived())
                        {
-                               USB_MIDI_EventPacket_t MIDIEvent;
-                               
+                               MIDI_EventPacket_t MIDIEvent;
+
                                Pipe_Read_Stream_LE(&MIDIEvent, sizeof(MIDIEvent));
                                Pipe_Read_Stream_LE(&MIDIEvent, sizeof(MIDIEvent));
-                               
+
                                bool NoteOnEvent  = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_ON  >> 4));
                                bool NoteOffEvent = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_OFF >> 4));
                                bool NoteOnEvent  = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_ON  >> 4));
                                bool NoteOffEvent = ((MIDIEvent.Command & 0x0F) == (MIDI_COMMAND_NOTE_OFF >> 4));
-                               
+
                                if (NoteOnEvent || NoteOffEvent)
                                {
                                        printf_P(PSTR("MIDI Note %s - Channel %d, Pitch %d, Velocity %d\r\n"), NoteOnEvent ? "On" : "Off",
                                                                                                           ((MIDIEvent.Data1 & 0x0F) + 1),
                                                                                                           MIDIEvent.Data2, MIDIEvent.Data3);
                                }
                                if (NoteOnEvent || NoteOffEvent)
                                {
                                        printf_P(PSTR("MIDI Note %s - Channel %d, Pitch %d, Velocity %d\r\n"), NoteOnEvent ? "On" : "Off",
                                                                                                           ((MIDIEvent.Data1 & 0x0F) + 1),
                                                                                                           MIDIEvent.Data2, MIDIEvent.Data3);
                                }
-
-                               Pipe_ClearIN();
+                               
+                               if (!(Pipe_BytesInPipe()))
+                                 Pipe_ClearIN();
                        }
                        }
-                       
-                       Pipe_SelectPipe(MIDI_DATAPIPE_OUT);
-                       
-                       static uint8_t PrevJoystickStatus;
+
+                       Pipe_SelectPipe(MIDI_DATA_OUT_PIPE);
 
                        if (Pipe_IsOUTReady())
                        {
                                uint8_t MIDICommand = 0;
                                uint8_t MIDIPitch;
 
                        if (Pipe_IsOUTReady())
                        {
                                uint8_t MIDICommand = 0;
                                uint8_t MIDIPitch;
-                       
+
+                               static uint8_t PrevJoystickStatus;
                                uint8_t JoystickStatus  = Joystick_GetStatus();
                                uint8_t JoystickChanges = (JoystickStatus ^ PrevJoystickStatus);
                                uint8_t JoystickStatus  = Joystick_GetStatus();
                                uint8_t JoystickChanges = (JoystickStatus ^ PrevJoystickStatus);
-                               
+
                                /* Get board button status - if pressed use channel 10 (percussion), otherwise use channel 1 */
                                uint8_t Channel = ((Buttons_GetStatus() & BUTTONS_BUTTON1) ? MIDI_CHANNEL(10) : MIDI_CHANNEL(1));
 
                                /* Get board button status - if pressed use channel 10 (percussion), otherwise use channel 1 */
                                uint8_t Channel = ((Buttons_GetStatus() & BUTTONS_BUTTON1) ? MIDI_CHANNEL(10) : MIDI_CHANNEL(1));
 
@@ -227,7 +228,7 @@ void MIDI_Host_Task(void)
                                        MIDICommand = ((JoystickStatus & JOY_RIGHT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
                                        MIDIPitch   = 0x3E;
                                }
                                        MIDICommand = ((JoystickStatus & JOY_RIGHT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
                                        MIDIPitch   = 0x3E;
                                }
-                               
+
                                if (JoystickChanges & JOY_DOWN)
                                {
                                        MIDICommand = ((JoystickStatus & JOY_DOWN)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
                                if (JoystickChanges & JOY_DOWN)
                                {
                                        MIDICommand = ((JoystickStatus & JOY_DOWN)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
@@ -243,23 +244,23 @@ void MIDI_Host_Task(void)
                                /* Check if a MIDI command is to be sent */
                                if (MIDICommand)
                                {
                                /* Check if a MIDI command is to be sent */
                                if (MIDICommand)
                                {
-                                       USB_MIDI_EventPacket_t MIDIEvent = (USB_MIDI_EventPacket_t)
+                                       MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t)
                                                {
                                                        .CableNumber = 0,
                                                        .Command     = (MIDICommand >> 4),
                                                {
                                                        .CableNumber = 0,
                                                        .Command     = (MIDICommand >> 4),
-                                                       
+
                                                        .Data1       = MIDICommand | Channel,
                                                        .Data2       = MIDIPitch,
                                                        .Data1       = MIDICommand | Channel,
                                                        .Data2       = MIDIPitch,
-                                                       .Data3       = MIDI_STANDARD_VELOCITY,                  
+                                                       .Data3       = MIDI_STANDARD_VELOCITY,
                                                };
                                                };
-                                               
+
                                        /* Write the MIDI event packet to the pipe */
                                        Pipe_Write_Stream_LE(&MIDIEvent, sizeof(MIDIEvent));
                                        /* Write the MIDI event packet to the pipe */
                                        Pipe_Write_Stream_LE(&MIDIEvent, sizeof(MIDIEvent));
-                               
+
                                        /* Send the data in the pipe to the device */
                                        Pipe_ClearOUT();
                                }
                                        /* Send the data in the pipe to the device */
                                        Pipe_ClearOUT();
                                }
-                               
+
                                /* Save previous joystick value for next joystick change detection */
                                PrevJoystickStatus = JoystickStatus;
                        }
                                /* Save previous joystick value for next joystick change detection */
                                PrevJoystickStatus = JoystickStatus;
                        }
@@ -267,3 +268,4 @@ void MIDI_Host_Task(void)
                        break;
        }
 }
                        break;
        }
 }
+