X-Git-Url: http://git.linex4red.de/pub/USBasp.git/blobdiff_plain/4cc7f5200beef90c39c8c8310ed7c8b849afb4d9..d4b45e8502a27c0f5ad3e26eabd2b30e84c20bac:/Demos/Device/LowLevel/GenericHID/GenericHID.c diff --git a/Demos/Device/LowLevel/GenericHID/GenericHID.c b/Demos/Device/LowLevel/GenericHID/GenericHID.c index a72cecb45..4d61acfb6 100644 --- a/Demos/Device/LowLevel/GenericHID/GenericHID.c +++ b/Demos/Device/LowLevel/GenericHID/GenericHID.c @@ -1,21 +1,21 @@ /* LUFA Library - Copyright (C) Dean Camera, 2010. - + Copyright (C) Dean Camera, 2012. + dean [at] fourwalledcubicle [dot] com - www.fourwalledcubicle.com + www.lufa-lib.org */ /* - Copyright 2010 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 + Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in + without fee, provided that the above copyright notice appear in all copies and that both that the copyright notice and this - permission notice and warranty disclaimer appear in supporting - documentation, and that the name of the author not be used in - advertising or publicity pertaining to distribution of the + permission notice and warranty disclaimer appear in supporting + documentation, and that the name of the author not be used in + advertising or publicity pertaining to distribution of the software without specific, written prior permission. The author disclaim all warranties with regard to this @@ -36,9 +36,6 @@ #include "GenericHID.h" -/** Static buffer to hold the last received report from the host, so that it can be echoed back in the next sent report */ -static uint8_t LastReceived[GENERIC_REPORT_SIZE]; - /** Main program entry point. This routine configures the hardware required by the application, then * enters a loop to run the application tasks in sequence. @@ -46,7 +43,7 @@ static uint8_t LastReceived[GENERIC_REPORT_SIZE]; int main(void) { SetupHardware(); - + LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); sei(); @@ -107,16 +104,16 @@ void EVENT_USB_Device_ConfigurationChanged(void) 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 - * control requests that are not handled internally by the USB library (including the HID commands, which are - * all issued via the control endpoint), so that they can be handled appropriately for the application. +/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to + * the device from the USB host before passing along unhandled control requests to the library for processing + * internally. */ -void EVENT_USB_Device_UnhandledControlRequest(void) +void EVENT_USB_Device_ControlRequest(void) { /* Handle HID Class specific requests */ switch (USB_ControlRequest.bRequest) { - case REQ_GetReport: + case HID_REQ_GetReport: if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) { uint8_t GenericData[GENERIC_REPORT_SIZE]; @@ -128,9 +125,9 @@ void EVENT_USB_Device_UnhandledControlRequest(void) Endpoint_Write_Control_Stream_LE(&GenericData, sizeof(GenericData)); Endpoint_ClearOUT(); } - + break; - case REQ_SetReport: + case HID_REQ_SetReport: if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) { uint8_t GenericData[GENERIC_REPORT_SIZE]; @@ -139,29 +136,42 @@ void EVENT_USB_Device_UnhandledControlRequest(void) /* Read the report data from the control endpoint */ Endpoint_Read_Control_Stream_LE(&GenericData, sizeof(GenericData)); - Endpoint_ClearOUT(); + Endpoint_ClearIN(); ProcessGenericHIDReport(GenericData); } - + break; } } -/** Function to process the lest received report from the host. +/** Function to process the last received report from the host. * - * \param[in] DataArray Pointer to a buffer where the last report data is stored + * \param[in] DataArray Pointer to a buffer where the last received report has been stored */ void ProcessGenericHIDReport(uint8_t* DataArray) { /* - This is where you need to process the reports being sent from the host to the device. - DataArray is an array holding the last report from the host. This function is called - each time the host has sent a report to the device. + This is where you need to process reports sent from the host to the device. This + function is called each time the host has sent a new report. DataArray is an array + holding the report sent from the host. */ - - for (uint8_t i = 0; i < GENERIC_REPORT_SIZE; i++) - LastReceived[i] = DataArray[i]; + + uint8_t NewLEDMask = LEDS_NO_LEDS; + + if (DataArray[0]) + NewLEDMask |= LEDS_LED1; + + if (DataArray[1]) + NewLEDMask |= LEDS_LED1; + + if (DataArray[2]) + NewLEDMask |= LEDS_LED1; + + if (DataArray[3]) + NewLEDMask |= LEDS_LED1; + + LEDs_SetAllLEDs(NewLEDMask); } /** Function to create the next report to send back to the host at the next reporting interval. @@ -172,12 +182,16 @@ void CreateGenericHIDReport(uint8_t* DataArray) { /* This is where you need to create reports to be sent to the host from the device. This - function is called each time the host is ready to accept a new report. DataArray is + function is called each time the host is ready to accept a new report. DataArray is an array to hold the report to the host. */ - for (uint8_t i = 0; i < GENERIC_REPORT_SIZE; i++) - DataArray[i] = LastReceived[i]; + uint8_t CurrLEDMask = LEDs_GetLEDs(); + + DataArray[0] = ((CurrLEDMask & LEDS_LED1) ? 1 : 0); + DataArray[1] = ((CurrLEDMask & LEDS_LED2) ? 1 : 0); + DataArray[2] = ((CurrLEDMask & LEDS_LED3) ? 1 : 0); + DataArray[3] = ((CurrLEDMask & LEDS_LED4) ? 1 : 0); } void HID_Task(void) @@ -187,7 +201,7 @@ void HID_Task(void) return; Endpoint_SelectEndpoint(GENERIC_OUT_EPNUM); - + /* Check to see if a packet has been sent from the host */ if (Endpoint_IsOUTReceived()) { @@ -196,33 +210,34 @@ void HID_Task(void) { /* Create a temporary buffer to hold the read in report from the host */ uint8_t GenericData[GENERIC_REPORT_SIZE]; - + /* Read Generic Report Data */ - Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData)); - + Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData), NULL); + /* Process Generic Report Data */ ProcessGenericHIDReport(GenericData); } /* Finalize the stream transfer to send the last packet */ Endpoint_ClearOUT(); - } + } Endpoint_SelectEndpoint(GENERIC_IN_EPNUM); - + /* Check to see if the host is ready to accept another packet */ if (Endpoint_IsINReady()) { /* Create a temporary buffer to hold the report to send to the host */ uint8_t GenericData[GENERIC_REPORT_SIZE]; - + /* Create Generic Report Data */ CreateGenericHIDReport(GenericData); /* Write Generic Report Data */ - Endpoint_Write_Stream_LE(&GenericData, sizeof(GenericData)); + Endpoint_Write_Stream_LE(&GenericData, sizeof(GenericData), NULL); /* Finalize the stream transfer to send the last packet */ Endpoint_ClearIN(); } } +