1 uint8_t TEMPLATE_FUNC_NAME (void* Buffer
, uint16_t Length
) 
   3         uint8_t* DataStream     
= (uint8_t*)(Buffer 
+ TEMPLATE_BUFFER_OFFSET(Length
)); 
   4         bool     LastPacketFull 
= false; 
   6         if (Length 
> USB_ControlRequest
.wLength
) 
   7           Length 
= USB_ControlRequest
.wLength
; 
   9         while (Length 
|| LastPacketFull
) 
  11                 if (Endpoint_IsSETUPReceived()) 
  12                   return ENDPOINT_RWCSTREAM_HostAborted
; 
  14                 if (Endpoint_IsOUTReceived()) 
  17                 if (USB_DeviceState 
== DEVICE_STATE_Unattached
) 
  18                   return ENDPOINT_RWCSTREAM_DeviceDisconnected
; 
  20                 if (Endpoint_IsINReady()) 
  22                         while (Length 
&& (Endpoint_BytesInEndpoint() < USB_ControlEndpointSize
)) 
  24                                 TEMPLATE_TRANSFER_BYTE(DataStream
); 
  28                         LastPacketFull 
= (Endpoint_BytesInEndpoint() == USB_ControlEndpointSize
); 
  33         while (!(Endpoint_IsOUTReceived())) 
  35                 if (USB_DeviceState 
== DEVICE_STATE_Unattached
) 
  36                   return ENDPOINT_RWCSTREAM_DeviceDisconnected
;  
  39         return ENDPOINT_RWCSTREAM_NoError
; 
  42 #undef TEMPLATE_BUFFER_OFFSET 
  43 #undef TEMPLATE_FUNC_NAME 
  44 #undef TEMPLATE_TRANSFER_BYTE