1 uint8_t TEMPLATE_FUNC_NAME (const 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
; 
  11         while (Length 
|| LastPacketFull
) 
  13                 if (Endpoint_IsSETUPReceived()) 
  14                   return ENDPOINT_RWCSTREAM_HostAborted
; 
  16                 if (Endpoint_IsOUTReceived()) 
  19                 if (USB_DeviceState 
== DEVICE_STATE_Unattached
) 
  20                   return ENDPOINT_RWCSTREAM_DeviceDisconnected
; 
  22                 if (Endpoint_IsINReady()) 
  24                         uint16_t BytesInEndpoint 
= Endpoint_BytesInEndpoint(); 
  26                         while (Length 
&& (BytesInEndpoint 
< USB_ControlEndpointSize
)) 
  28                                 TEMPLATE_TRANSFER_BYTE(DataStream
); 
  33                         LastPacketFull 
= (BytesInEndpoint 
== USB_ControlEndpointSize
); 
  38         while (!(Endpoint_IsOUTReceived())) 
  40                 if (USB_DeviceState 
== DEVICE_STATE_Unattached
) 
  41                   return ENDPOINT_RWCSTREAM_DeviceDisconnected
;  
  44         return ENDPOINT_RWCSTREAM_NoError
; 
  47 #undef TEMPLATE_BUFFER_OFFSET 
  48 #undef TEMPLATE_FUNC_NAME 
  49 #undef TEMPLATE_TRANSFER_BYTE