Added new NO_CLASS_DRIVER_AUTOFLUSH compile time option to disable automatic flushing...
authorDean Camera <dean@fourwalledcubicle.com>
Wed, 27 Oct 2010 07:23:51 +0000 (07:23 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Wed, 27 Oct 2010 07:23:51 +0000 (07:23 +0000)
The MIDI class drivers now automatically flushes the MIDI interface when the MIDI class driver's USBTask() function is called.

LUFA/Drivers/USB/Class/Device/CDC.c
LUFA/Drivers/USB/Class/Device/MIDI.c
LUFA/Drivers/USB/Class/Device/MIDI.h
LUFA/Drivers/USB/Class/Device/MassStorage.c
LUFA/Drivers/USB/Class/Host/CDC.c
LUFA/Drivers/USB/Class/Host/MIDI.c
LUFA/Drivers/USB/Class/Host/MIDI.h
LUFA/Drivers/USB/Class/Host/Printer.c
LUFA/ManPages/ChangeLog.txt
LUFA/ManPages/CompileTimeTokens.txt

index 2019ede..3c1264c 100644 (file)
@@ -148,7 +148,9 @@ void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
        if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
          return;
 
+       #if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
        CDC_Device_Flush(CDCInterfaceInfo);
+       #endif
 }
 
 uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
index f7c59b5..10a728a 100644 (file)
@@ -76,6 +76,16 @@ bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInter
        return true;
 }
 
+void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
+{
+       if (USB_DeviceState != DEVICE_STATE_Configured)
+         return;
+
+       #if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
+       MIDI_Device_Flush(MIDIInterfaceInfo);
+       #endif
+}
+
 uint8_t MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo,
                                     const MIDI_EventPacket_t* const Event)
 {
index 3f633ac..8ca3e7c 100644 (file)
                         */
                        bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
 
+                       /** General management task for a given MIDI class interface, required for the correct operation of the interface. This should
+                        *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+                        *
+                        *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
+                        */
+                       void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
                        /** Sends a MIDI event packet to the host. If no host is connected, the event packet is discarded. Events are queued into the
                         *  endpoint bank until either the endpoint bank is full, or \ref MIDI_Device_Flush() is called. This allows for multiple
                         *  MIDI events to be packed into a single endpoint packet, increasing data throughput.
                                                            MIDI_EventPacket_t* const Event) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
 
                /* Inline Functions: */
-                       /** General management task for a given MIDI class interface, required for the correct operation of the interface. This should
-                        *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
-                        *
-                        *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state.
-                        */
-                       static inline void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
-                       static inline void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo)
-                       {
-                               (void)MIDIInterfaceInfo;
-                       }
-
                        /** Processes incoming control requests from the host, that are directed to the given MIDI class interface. This should be
                         *  linked to the library \ref EVENT_USB_Device_UnhandledControlRequest() event.
                         *
index f053a04..55ccba7 100644 (file)
@@ -126,7 +126,7 @@ void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo)
                          Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpointNumber);
 
                        MSInterfaceInfo->State.CommandStatus.Status = CALLBACK_MS_Device_SCSICommandReceived(MSInterfaceInfo) ?
-                                                                                        MS_SCSI_COMMAND_Pass : MS_SCSI_COMMAND_Fail;
+                                                                      MS_SCSI_COMMAND_Pass : MS_SCSI_COMMAND_Fail;
                        MSInterfaceInfo->State.CommandStatus.Signature           = MS_CSW_SIGNATURE;
                        MSInterfaceInfo->State.CommandStatus.Tag                 = MSInterfaceInfo->State.CommandBlock.Tag;
                        MSInterfaceInfo->State.CommandStatus.DataTransferResidue = MSInterfaceInfo->State.CommandBlock.DataTransferLength;
index ab5305f..7753c0e 100644 (file)
@@ -226,7 +226,9 @@ void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
 
        Pipe_Freeze();
 
+       #if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
        CDC_Host_Flush(CDCInterfaceInfo);
+       #endif
 }
 
 uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
index c500240..f70f6e4 100644 (file)
@@ -141,6 +141,16 @@ static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingDataEndpoint(void* const Current
        return DESCRIPTOR_SEARCH_NotFound;
 }
 
+void MIDI_Host_USBTask(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo)
+{
+       if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive))
+         return;
+
+       #if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
+       MIDI_Host_Flush(MIDIInterfaceInfo);
+       #endif  
+}
+
 uint8_t MIDI_Host_Flush(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo)
 {
        if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive))
index a21bdbd..393806b 100644 (file)
                                                         uint16_t ConfigDescriptorSize,
                                                         void* DeviceConfigDescriptor) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3);
 
+                       /** General management task for a given MIDI host class interface, required for the correct operation of the interface. This should
+                        *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
+                        *
+                        *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing an MIDI Class host configuration and state.
+                        */
+                       void MIDI_Host_USBTask(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+
                        /** Sends a MIDI event packet to the device. If no device is connected, the event packet is discarded.
                         *
                         *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the
                        bool MIDI_Host_ReceiveEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo,
                                                          MIDI_EventPacket_t* const Event) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
 
-               /* Inline Functions: */
-                       /** General management task for a given MIDI host class interface, required for the correct operation of the interface. This should
-                        *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask().
-                        *
-                        *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing an MIDI Class host configuration and state.
-                        */
-                       static inline void MIDI_Host_USBTask(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
-                       static inline void MIDI_Host_USBTask(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo)
-                       {
-                               (void)MIDIInterfaceInfo;
-                       }
-
        /* Private Interface - For use in library only: */
        #if !defined(__DOXYGEN__)
                /* Function Prototypes: */
index e69948b..ec56c31 100644 (file)
@@ -142,7 +142,12 @@ static uint8_t DCOMP_PRNT_Host_NextPRNTInterfaceEndpoint(void* CurrentDescriptor
 
 void PRNT_Host_USBTask(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo)
 {
+       if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive))
+         return;
+
+       #if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
        PRNT_Host_Flush(PRNTInterfaceInfo);
+       #endif
 }
 
 uint8_t PRNT_Host_SetBidirectionalMode(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo)
index dd7fa4b..e83385e 100644 (file)
@@ -28,6 +28,8 @@
   *  - Added board hardware driver support for the Maximus board (thanks to the PSGroove team)
   *  - Added board hardware driver support for the Minimus board (thanks to the PSGroove team)
   *  - Added default test tone generation mode to the Device mode AudioInput demos
+  *  - Added new NO_CLASS_DRIVER_AUTOFLUSH compile time option to disable automatic flushing of interfaces when the USB management
+  *    tasks for each driver is called
   *
   *  <b>Changed:</b>
   *  - Removed complicated logic for the Endpoint_ConfigureEndpoint() function to use inlined or function called versions
@@ -58,6 +60,7 @@
   *  - All USB class drivers are now automatically included when LUFA/Drivers/USB.h is included, and no longer need to be seperately included
   *  - All LowLevel demos changed to use the constants and types defined in the USB class drivers
   *  - Changed AudioInput and AudioOutput demos to reload the next sample via an interrupt rather than polling the sample timer
+  *  - The MIDI class drivers now automatically flushes the MIDI interface when the MIDI class driver's USBTask() function is called
   *
   *  <b>Fixed:</b>
   *  - Fixed USB_GetHIDReportItemInfo() function modifying the given report item's data when the report item does not exist
index f748984..28b7cfc 100644 (file)
  *  and their sizes calculated/stored into the resultant processed report structure. If not defined, this defaults to the value indicated in
  *  the HID.h file documentation.
  *
+ *  <b>NO_CLASS_DRIVER_AUTOFLUSH</b>
+ *  Many of the device and host mode class drivers automatically flush any data waiting to be written to an interface, when the corresponding
+ *  USB management task is executed. This is usually desirable to ensure that any queued data is sent as soon as possible once and new data is
+ *  constructed in the main program loop. However, if flushing is to be controlled manually by the user application via the *_Flush() commands,
+ *  the compile time token may be defined in the application's makefile to disable automatic flushing during calls to the class driver USB
+ *  management tasks.
  *
  *  \section Sec_SummaryUSBTokens General USB Driver Related Tokens
  *  This section describes compile tokens which affect USB driver stack as a whole in the LUFA library.