Minor documentation enhancements.
[pub/USBasp.git] / Demos / Device / LowLevel / Mouse / Mouse.c
index 97aa55f..6aa258a 100644 (file)
@@ -113,18 +113,17 @@ void EVENT_USB_Device_Disconnect(void)
  */ 
 void EVENT_USB_Device_ConfigurationChanged(void)
 {
  */ 
 void EVENT_USB_Device_ConfigurationChanged(void)
 {
-       /* Indicate USB connected and ready */
-       LEDs_SetAllLEDs(LEDMASK_USB_READY);
-       
-       /* Setup Mouse Report Endpoint */
-       if (!(Endpoint_ConfigureEndpoint(MOUSE_EPNUM, EP_TYPE_INTERRUPT,
-                                            ENDPOINT_DIR_IN, MOUSE_EPSIZE,
-                                        ENDPOINT_BANK_SINGLE)))
-       {
-               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-       }
+       bool ConfigSuccess = true;
+
+       /* Setup HID Report Endpoint */
+       ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+                                                   MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE);
 
 
+       /* Turn on Start-of-Frame events for tracking HID report period exiry */
        USB_Device_EnableSOFEvents();
        USB_Device_EnableSOFEvents();
+
+       /* Indicate endpoint configuration success or failure */
+       LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); 
 }
 
 /** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific
 }
 
 /** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific
@@ -141,19 +140,17 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                        {
                                USB_MouseReport_Data_t MouseReportData;
 
                        {
                                USB_MouseReport_Data_t MouseReportData;
 
-                               Endpoint_ClearSETUP();
-
                                /* Create the next mouse report for transmission to the host */
                                CreateMouseReport(&MouseReportData);
                                /* Create the next mouse report for transmission to the host */
                                CreateMouseReport(&MouseReportData);
-       
+
+                               Endpoint_ClearSETUP();
+
                                /* Write the report data to the control endpoint */
                                Endpoint_Write_Control_Stream_LE(&MouseReportData, sizeof(MouseReportData));
                                /* Write the report data to the control endpoint */
                                Endpoint_Write_Control_Stream_LE(&MouseReportData, sizeof(MouseReportData));
-                               
+                               Endpoint_ClearOUT();
+
                                /* Clear the report data afterwards */
                                memset(&MouseReportData, 0, sizeof(MouseReportData));
                                /* Clear the report data afterwards */
                                memset(&MouseReportData, 0, sizeof(MouseReportData));
-
-                               /* Finalize the stream transfer to send the last packet or clear the host abort */
-                               Endpoint_ClearOUT();
                        }
                
                        break;
                        }
                
                        break;
@@ -165,9 +162,7 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                /* Write the current protocol flag to the host */
                                Endpoint_Write_Byte(UsingReportProtocol);
                                
                                /* Write the current protocol flag to the host */
                                Endpoint_Write_Byte(UsingReportProtocol);
                                
-                               /* Send the flag to the host */
                                Endpoint_ClearIN();
                                Endpoint_ClearIN();
-
                                Endpoint_ClearStatusStage();
                        }
                        
                                Endpoint_ClearStatusStage();
                        }
                        
@@ -176,11 +171,10 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
-                               
+                               Endpoint_ClearStatusStage();
+
                                /* Set or clear the flag depending on what the host indicates that the current Protocol should be */
                                UsingReportProtocol = (USB_ControlRequest.wValue != 0);
                                /* Set or clear the flag depending on what the host indicates that the current Protocol should be */
                                UsingReportProtocol = (USB_ControlRequest.wValue != 0);
-                               
-                               Endpoint_ClearStatusStage();
                        }
                        
                        break;
                        }
                        
                        break;
@@ -188,11 +182,10 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
-                               
+                               Endpoint_ClearStatusStage();
+
                                /* Get idle period in MSB, must multiply by 4 to get the duration in milliseconds */
                                IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
                                /* Get idle period in MSB, must multiply by 4 to get the duration in milliseconds */
                                IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
-                               
-                               Endpoint_ClearStatusStage();
                        }
                        
                        break;
                        }
                        
                        break;
@@ -203,10 +196,8 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                
                                /* Write the current idle duration to the host, must be divided by 4 before sent to host */
                                Endpoint_Write_Byte(IdleCount >> 2);
                                
                                /* Write the current idle duration to the host, must be divided by 4 before sent to host */
                                Endpoint_Write_Byte(IdleCount >> 2);
-                               
-                               /* Send the flag to the host */
-                               Endpoint_ClearIN();
 
 
+                               Endpoint_ClearIN();
                                Endpoint_ClearStatusStage();
                        }
 
                                Endpoint_ClearStatusStage();
                        }