Fixed LowLevel Keyboard demo not saving the issued report only after it has been written to the endpoint.

Added support for multiple keyboard keycodes in a single report to the LowLevel and ClassDriver Keyboard demos.
This commit is contained in:
Dean Camera 2009-11-20 04:39:41 +00:00
parent d753512cca
commit 7ef58eef7a
12 changed files with 68 additions and 36 deletions

View file

@ -144,22 +144,34 @@ bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDIn
uint8_t JoyStatus_LCL = Joystick_GetStatus();
uint8_t ButtonStatus_LCL = Buttons_GetStatus();
static uint8_t PrevUsedKeyCodes;
uint8_t UsedKeyCodes = 0;
if (JoyStatus_LCL & JOY_UP)
KeyboardReport->KeyCode[0] = 0x04; // A
KeyboardReport->KeyCode[UsedKeyCodes++] = 0x04; // A
else if (JoyStatus_LCL & JOY_DOWN)
KeyboardReport->KeyCode[0] = 0x05; // B
KeyboardReport->KeyCode[UsedKeyCodes++] = 0x05; // B
if (JoyStatus_LCL & JOY_LEFT)
KeyboardReport->KeyCode[0] = 0x06; // C
KeyboardReport->KeyCode[UsedKeyCodes++] = 0x06; // C
else if (JoyStatus_LCL & JOY_RIGHT)
KeyboardReport->KeyCode[0] = 0x07; // D
KeyboardReport->KeyCode[UsedKeyCodes++] = 0x07; // D
if (JoyStatus_LCL & JOY_PRESS)
KeyboardReport->KeyCode[0] = 0x08; // E
KeyboardReport->KeyCode[UsedKeyCodes++] = 0x08; // E
if (ButtonStatus_LCL & BUTTONS_BUTTON1)
KeyboardReport->KeyCode[0] = 0x09; // F
KeyboardReport->KeyCode[UsedKeyCodes++] = 0x09; // F
/* The host will ignore the device if we add a new keycode to the report while another keycode is currently
* being sent (i.e. the user has pressed another key while a key is already being pressed) - we need to intersperse
* the two reports with a zeroed report to force the host to accept the additional keys */
if (UsedKeyCodes != PrevUsedKeyCodes)
{
memset(KeyboardReport, sizeof(USB_KeyboardReport_Data_t), 0x00);
PrevUsedKeyCodes = UsedKeyCodes;
}
*ReportSize = sizeof(USB_KeyboardReport_Data_t);
return false;
}