Fix HID buffer lookup

The previous code assumed HID report ids were consecutive. This is
not true in the CircuitPython descriptor where report ids are fixed
for each report type.

Fixes #1617
This commit is contained in:
Scott Shawcroft 2019-03-27 15:23:20 -07:00
parent 94822ee208
commit 9232ec50f1
No known key found for this signature in database
GPG Key ID: FD0EDC4B6C53CA59
1 changed files with 13 additions and 7 deletions

View File

@ -60,27 +60,33 @@ void common_hal_usb_hid_device_send_report(usb_hid_device_obj_t *self, uint8_t*
}
}
static usb_hid_device_obj_t* get_hid_device(uint8_t report_id) {
for (uint8_t i = 0; i < USB_HID_NUM_DEVICES; i++) {
if (usb_hid_devices[i].report_id == report_id) {
return &usb_hid_devices[i];
}
}
return NULL;
}
// Callbacks invoked when receive Get_Report request through control endpoint
uint16_t tud_hid_generic_get_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen) {
// only support Input Report
if ( report_type != HID_REPORT_TYPE_INPUT ) return 0;
// index is ID-1
uint8_t idx = ( report_id ? (report_id-1) : 0 );
// fill buffer with current report
memcpy(buffer, usb_hid_devices[idx].report_buffer, reqlen);
memcpy(buffer, get_hid_device(report_id)->report_buffer, reqlen);
return reqlen;
}
// Callbacks invoked when receive Set_Report request through control endpoint
void tud_hid_generic_set_report_cb(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) {
// index is ID-1
uint8_t idx = ( report_id ? (report_id-1) : 0 );
usb_hid_device_obj_t* hid_device = get_hid_device(report_id);
if ( report_type == HID_REPORT_TYPE_OUTPUT ) {
// Check if it is Keyboard device
if ( (usb_hid_devices[idx].usage_page == HID_USAGE_PAGE_DESKTOP) && (usb_hid_devices[idx].usage == HID_USAGE_DESKTOP_KEYBOARD) ) {
if (hid_device->usage_page == HID_USAGE_PAGE_DESKTOP &&
hid_device->usage == HID_USAGE_DESKTOP_KEYBOARD) {
// This is LED indicator (CapsLock, NumLock)
// TODO Light up some LED here
}