Upgrade Doxygen configuration files to 1.8.1.2.
[pub/USBasp.git] / Demos / Host / ClassDriver / MIDIHost / MIDIHost.c
index b451362..04a9454 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2011.
+     Copyright (C) Dean Camera, 2012.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -44,11 +44,16 @@ USB_ClassInfo_MIDI_Host_t Keyboard_MIDI_Interface =
        {
                .Config =
                        {
        {
                .Config =
                        {
-                               .DataINPipeNumber       = 1,
-                               .DataINPipeDoubleBank   = false,
-
-                               .DataOUTPipeNumber      = 2,
-                               .DataOUTPipeDoubleBank  = false,
+                               .DataINPipe             =
+                                       {
+                                               .Address        = (PIPE_DIR_IN  | 1),
+                                               .Banks          = 1,
+                                       },
+                               .DataOUTPipe            =
+                                       {
+                                               .Address        = (PIPE_DIR_OUT | 2),
+                                               .Banks          = 1,
+                                       },
                        },
        };
 
                        },
        };
 
@@ -67,63 +72,7 @@ int main(void)
 
        for (;;)
        {
 
        for (;;)
        {
-               switch (USB_HostState)
-               {
-                       case HOST_STATE_Addressed:
-                               LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
-
-                               uint16_t ConfigDescriptorSize;
-                               uint8_t  ConfigDescriptorData[512];
-
-                               if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,
-                                                                      sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)
-                               {
-                                       puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;
-                                       break;
-                               }
-
-                               if (MIDI_Host_ConfigurePipes(&Keyboard_MIDI_Interface,
-                                                            ConfigDescriptorSize, ConfigDescriptorData) != MIDI_ENUMERROR_NoError)
-                               {
-                                       puts_P(PSTR("Attached Device Not a Valid MIDI Class Device.\r\n"));
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;
-                                       break;
-                               }
-
-                               if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
-                               {
-                                       puts_P(PSTR("Error Setting Device Configuration.\r\n"));
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;
-                                       break;
-                               }
-
-                               puts_P(PSTR("MIDI Device Enumerated.\r\n"));
-                               LEDs_SetAllLEDs(LEDMASK_USB_READY);
-                               USB_HostState = HOST_STATE_Configured;
-                               break;
-                       case HOST_STATE_Configured:
-                               CheckJoystickMovement();
-
-                               MIDI_EventPacket_t 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));
-
-                                       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);
-                                       }
-                               }
-
-                               break;
-               }
+               JoystickHost_Task();
 
                MIDI_Host_USBTask(&Keyboard_MIDI_Interface);
                USB_USBTask();
 
                MIDI_Host_USBTask(&Keyboard_MIDI_Interface);
                USB_USBTask();
@@ -151,6 +100,35 @@ void SetupHardware(void)
        Serial_CreateStream(NULL);
 }
 
        Serial_CreateStream(NULL);
 }
 
+/** Task to manage an enumerated USB MIDI device once connected, to display received
+ *  note events from the host and send note changes in response to the board's joystick.
+ */
+void JoystickHost_Task(void)
+{
+       if (USB_HostState != HOST_STATE_Configured)
+         return;
+
+       MIDI_EventPacket_t MIDIEvent;
+       while (MIDI_Host_ReceiveEventPacket(&Keyboard_MIDI_Interface, &MIDIEvent))
+       {
+               bool NoteOnEvent  = (MIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_ON));
+               bool NoteOffEvent = (MIDIEvent.Event == MIDI_EVENT(0, MIDI_COMMAND_NOTE_OFF));
+
+               /* Display note events from the host */
+               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);
+               }
+       }
+
+       CheckJoystickMovement();
+}
+
+/** Checks for movement of the board's joystick, and sends corresponding MIDI note on/off
+ *  messages to the host.
+ */
 void CheckJoystickMovement(void)
 {
        static uint8_t PrevJoystickStatus;
 void CheckJoystickMovement(void)
 {
        static uint8_t PrevJoystickStatus;
@@ -170,26 +148,22 @@ void CheckJoystickMovement(void)
                MIDICommand = ((JoystickStatus & JOY_LEFT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
                MIDIPitch   = 0x3C;
        }
                MIDICommand = ((JoystickStatus & JOY_LEFT)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
                MIDIPitch   = 0x3C;
        }
-
-       if (JoystickChanges & JOY_UP)
+       else if (JoystickChanges & JOY_UP)
        {
                MIDICommand = ((JoystickStatus & JOY_UP)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
                MIDIPitch   = 0x3D;
        }
        {
                MIDICommand = ((JoystickStatus & JOY_UP)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
                MIDIPitch   = 0x3D;
        }
-
-       if (JoystickChanges & JOY_RIGHT)
+       else if (JoystickChanges & JOY_RIGHT)
        {
                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)
+       else if (JoystickChanges & JOY_DOWN)
        {
                MIDICommand = ((JoystickStatus & JOY_DOWN)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
                MIDIPitch   = 0x3F;
        }
        {
                MIDICommand = ((JoystickStatus & JOY_DOWN)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
                MIDIPitch   = 0x3F;
        }
-
-       if (JoystickChanges & JOY_PRESS)
+       else if (JoystickChanges & JOY_PRESS)
        {
                MIDICommand = ((JoystickStatus & JOY_PRESS)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
                MIDIPitch   = 0x3B;
        {
                MIDICommand = ((JoystickStatus & JOY_PRESS)? MIDI_COMMAND_NOTE_ON : MIDI_COMMAND_NOTE_OFF);
                MIDIPitch   = 0x3B;
@@ -199,8 +173,7 @@ void CheckJoystickMovement(void)
        {
                MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t)
                        {
        {
                MIDI_EventPacket_t MIDIEvent = (MIDI_EventPacket_t)
                        {
-                               .CableNumber = 0,
-                               .Command     = (MIDICommand >> 4),
+                               .Event       = MIDI_EVENT(0, MIDICommand),
 
                                .Data1       = MIDICommand | Channel,
                                .Data2       = MIDIPitch,
 
                                .Data1       = MIDICommand | Channel,
                                .Data2       = MIDIPitch,
@@ -237,6 +210,35 @@ void EVENT_USB_Host_DeviceUnattached(void)
  */
 void EVENT_USB_Host_DeviceEnumerationComplete(void)
 {
  */
 void EVENT_USB_Host_DeviceEnumerationComplete(void)
 {
+       LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
+
+       uint16_t ConfigDescriptorSize;
+       uint8_t  ConfigDescriptorData[512];
+
+       if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,
+                                              sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)
+       {
+               puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+               return;
+       }
+
+       if (MIDI_Host_ConfigurePipes(&Keyboard_MIDI_Interface,
+                                    ConfigDescriptorSize, ConfigDescriptorData) != MIDI_ENUMERROR_NoError)
+       {
+               puts_P(PSTR("Attached Device Not a Valid MIDI Class Device.\r\n"));
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+               return;
+       }
+
+       if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
+       {
+               puts_P(PSTR("Error Setting Device Configuration.\r\n"));
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+               return;
+       }
+
+       puts_P(PSTR("MIDI Device Enumerated.\r\n"));
        LEDs_SetAllLEDs(LEDMASK_USB_READY);
 }
 
        LEDs_SetAllLEDs(LEDMASK_USB_READY);
 }