Endpoint_ClearSETUP();\r
\r
/* Wait until the LED report has been sent by the host */\r
- while (!(Endpoint_IsOUTReceived()));\r
+ while (!(Endpoint_IsOUTReceived()))\r
+ {\r
+ if (USB_DeviceState == DEVICE_STATE_Unattached)\r
+ return;\r
+ }\r
\r
/* Read in the LED report from the host */\r
uint8_t LEDStatus = Endpoint_Read_Byte();\r
/* Clear the endpoint data */\r
Endpoint_ClearOUT();\r
\r
- /* Acknowledge status stage */\r
- while (!(Endpoint_IsINReady()));\r
- Endpoint_ClearIN();\r
+ Endpoint_ClearStatusStage();\r
}\r
\r
break;\r
/* Send the flag to the host */\r
Endpoint_ClearIN();\r
\r
- /* Acknowledge status stage */\r
- while (!(Endpoint_IsOUTReceived()));\r
- Endpoint_ClearOUT();\r
+ Endpoint_ClearStatusStage();\r
}\r
\r
break;\r
/* Set or clear the flag depending on what the host indicates that the current Protocol should be */\r
UsingReportProtocol = (USB_ControlRequest.wValue != 0);\r
\r
- /* Acknowledge status stage */\r
- while (!(Endpoint_IsINReady()));\r
- Endpoint_ClearIN();\r
+ Endpoint_ClearStatusStage();\r
}\r
\r
break;\r
{\r
Endpoint_ClearSETUP();\r
\r
- /* Get idle period in MSB */\r
- IdleCount = (USB_ControlRequest.wValue >> 8);\r
+ /* Get idle period in MSB, IdleCount must be multiplied by 4 to get number of milliseconds */\r
+ IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);\r
\r
- /* Acknowledge status stage */\r
- while (!(Endpoint_IsINReady()));\r
- Endpoint_ClearIN();\r
+ Endpoint_ClearStatusStage();\r
}\r
\r
break;\r
{ \r
Endpoint_ClearSETUP();\r
\r
- /* Write the current idle duration to the host */\r
- Endpoint_Write_Byte(IdleCount);\r
+ /* Write the current idle duration to the host, must be divided by 4 before sent to host */\r
+ Endpoint_Write_Byte(IdleCount >> 2);\r
\r
/* Send the flag to the host */\r
Endpoint_ClearIN();\r
\r
- /* Acknowledge status stage */\r
- while (!(Endpoint_IsOUTReceived()));\r
- Endpoint_ClearOUT();\r
+ Endpoint_ClearStatusStage();\r
}\r
\r
break;\r
\r
/** Fills the given HID report data structure with the next HID report to send to the host.\r
*\r
- * \param ReportData Pointer to a HID report data structure to be filled\r
+ * \param[out] ReportData Pointer to a HID report data structure to be filled\r
*/\r
void CreateKeyboardReport(USB_KeyboardReport_Data_t* ReportData)\r
{\r
\r
/** Processes a received LED report, and updates the board LEDs states to match.\r
*\r
- * \param LEDReport LED status report from the host\r
+ * \param[in] LEDReport LED status report from the host\r
*/\r
void ProcessLEDReport(uint8_t LEDReport)\r
{\r
/* Check if the idle period is set and has elapsed */\r
if ((IdleCount != HID_IDLE_CHANGESONLY) && (!(IdleMSRemaining)))\r
{\r
- /* Reset the idle time remaining counter, must multiply by 4 to get the duration in milliseconds */\r
- IdleMSRemaining = (IdleCount << 2);\r
+ /* Reset the idle time remaining counter */\r
+ IdleMSRemaining = IdleCount;\r
\r
/* Idle period is set and has elapsed, must send a report to the host */\r
SendReport = true;\r
/** Function to manage HID report generation and transmission to the host, when in report mode. */\r
void HID_Task(void)\r
{\r
- /* Check if the USB system is connected to a host */\r
- if (USB_IsConnected)\r
- {\r
- /* Send the next keypress report to the host */\r
- SendNextReport();\r
+ /* Device must be connected and configured for the task to run */\r
+ if (USB_DeviceState != DEVICE_STATE_Configured)\r
+ return;\r
+ \r
+ /* Send the next keypress report to the host */\r
+ SendNextReport();\r
\r
- /* Process the LED report sent from the host */\r
- ReceiveNextReport();\r
- }\r
+ /* Process the LED report sent from the host */\r
+ ReceiveNextReport();\r
}\r