Skip to content

Commit 0ae26eb

Browse files
author
Hrvoje Cavrak
committed
Bugfixes and compatibility enhancements.
- Fix non-aligned nkro bit array parsing. - Small refactoring of multiple report ID parsing
1 parent 9c793d4 commit 0ae26eb

File tree

5 files changed

+24
-37
lines changed

5 files changed

+24
-37
lines changed

src/hid_parser.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ void store_element(parser_state_t *parser, report_val_t *val, int i, uint32_t da
6969

7070
void handle_global_item(parser_state_t *parser, item_t *item) {
7171
if (item->hdr.tag == RI_GLOBAL_REPORT_ID) {
72-
// reset offset for a new page
72+
/* Reset offset for a new page */
7373
parser->offset_in_bits = 0;
7474
parser->report_id = item->val;
7575
}

src/hid_report.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ int32_t get_report_value(uint8_t *report, int len, report_val_t *val) {
2828

2929
/* Calculate the byte offset in the array */
3030
uint16_t byte_offset = val->offset >> 3;
31-
31+
3232
if (byte_offset >= len)
3333
return 0;
3434

@@ -216,10 +216,11 @@ void extract_data(hid_interface_t *iface, report_val_t *val) {
216216
}
217217
}
218218

219-
int32_t extract_bit_variable(uint32_t min_val, uint32_t max_val, uint8_t *raw_report, int len, uint8_t *dst) {
219+
int32_t extract_bit_variable(report_val_t *kbd, uint8_t *raw_report, int len, uint8_t *dst) {
220220
int key_count = 0;
221+
int bit_offset = kbd->offset & 0b111;
221222

222-
for (int i = min_val, j = 0; i <= max_val && key_count < len; i++, j++) {
223+
for (int i = kbd->usage_min, j = bit_offset; i <= kbd->usage_max && key_count < len; i++, j++) {
223224
int byte_index = j >> 3;
224225
int bit_index = j & 0b111;
225226

@@ -279,8 +280,7 @@ int32_t _extract_kbd_nkro(uint8_t *raw_report, int len, hid_interface_t *iface,
279280
/* Move the pointer to the nkro offset's byte index */
280281
ptr = &ptr[kb->nkro.offset_idx];
281282

282-
return extract_bit_variable(
283-
kb->nkro.usage_min, kb->nkro.usage_max, ptr, KEYS_IN_USB_REPORT, report->keycode);
283+
return extract_bit_variable(&kb->nkro, ptr, KEYS_IN_USB_REPORT, report->keycode);
284284
}
285285

286286
int32_t extract_kbd_data(

src/include/hid_parser.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ typedef struct {
7171
int32_t move_y;
7272
int32_t wheel;
7373
int32_t pan;
74-
uint32_t buttons;
74+
int32_t buttons;
7575
} mouse_values_t;
7676

7777
/* Describes where can we find a value in a HID report */
@@ -99,7 +99,6 @@ typedef struct {
9999
report_val_t move_y;
100100
report_val_t wheel;
101101
report_val_t pan;
102-
103102
uint8_t report_id;
104103

105104
bool is_found;

src/include/main.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ void queue_system_packet(uint8_t *, device_t *);
463463
void send_key(hid_keyboard_report_t *, device_t *);
464464
void send_consumer_control(uint8_t *, device_t *);
465465
bool key_in_report(uint8_t, const hid_keyboard_report_t *);
466-
int32_t extract_bit_variable(uint32_t, uint32_t, uint8_t *, int, uint8_t *);
466+
int32_t extract_bit_variable(report_val_t *, uint8_t *, int, uint8_t *);
467467
int32_t extract_kbd_data(uint8_t *, int, uint8_t, hid_interface_t *, hid_keyboard_report_t *);
468468

469469
/********* Mouse **********/

src/mouse.c

Lines changed: 16 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,14 @@ void do_screen_switch(device_t *state, int direction) {
225225
switch_virtual_desktop(state, output, output->screen_index + 1, direction);
226226
}
227227

228+
inline void extract_value(bool uses_id, int32_t *dst, report_val_t *src, uint8_t *raw_report, int len) {
229+
/* If HID Report ID is used, the report is prefixed by the report ID so we have to move by 1 byte */
230+
if (uses_id && (*raw_report++ != src->report_id))
231+
return;
232+
233+
*dst = get_report_value(raw_report, len, src);
234+
}
235+
228236
void extract_report_values(uint8_t *raw_report, int len, device_t *state, mouse_values_t *values, hid_interface_t *iface) {
229237
/* Interpret values depending on the current protocol used. */
230238
if (iface->protocol == HID_PROTOCOL_BOOT) {
@@ -237,34 +245,14 @@ void extract_report_values(uint8_t *raw_report, int len, device_t *state, mouse_
237245
values->buttons = mouse_report->buttons;
238246
return;
239247
}
240-
241-
/* If HID Report ID is used, the report is prefixed by the report ID so we have to move by 1 byte */
242-
if (iface->uses_report_id) {
243-
uint8_t report_id = raw_report[0];
244-
raw_report++;
245-
if (report_id == iface->mouse.move_x.report_id)
246-
values->move_x = get_report_value(raw_report, len, &iface->mouse.move_x);
247-
248-
if (report_id == iface->mouse.move_y.report_id)
249-
values->move_y = get_report_value(raw_report, len, &iface->mouse.move_y);
250-
251-
if (report_id == iface->mouse.wheel.report_id)
252-
values->wheel = get_report_value(raw_report, len, &iface->mouse.wheel);
253-
254-
if (report_id == iface->mouse.pan.report_id)
255-
values->pan = get_report_value(raw_report, len, &iface->mouse.pan);
256-
257-
if (report_id == iface->mouse.buttons.report_id)
258-
values->buttons = get_report_value(raw_report, len, &iface->mouse.buttons);
259-
else
260-
values->buttons = state->mouse_buttons;
261-
} else {
262-
values->move_x = get_report_value(raw_report, len, &iface->mouse.move_x);
263-
values->move_y = get_report_value(raw_report, len, &iface->mouse.move_y);
264-
values->wheel = get_report_value(raw_report, len, &iface->mouse.wheel);
265-
values->pan = get_report_value(raw_report, len, &iface->mouse.pan);
266-
values->buttons = get_report_value(raw_report, len, &iface->mouse.buttons);
267-
}
248+
mouse_t *mouse = &iface->mouse;
249+
bool uses_id = iface->uses_report_id;
250+
251+
extract_value(uses_id, &values->move_x, &mouse->move_x, raw_report, len);
252+
extract_value(uses_id, &values->move_y, &mouse->move_y, raw_report, len);
253+
extract_value(uses_id, &values->wheel, &mouse->wheel, raw_report, len);
254+
extract_value(uses_id, &values->pan, &mouse->pan, raw_report, len);
255+
extract_value(uses_id, &values->buttons, &mouse->buttons, raw_report, len);
268256
}
269257

270258
mouse_report_t create_mouse_report(device_t *state, mouse_values_t *values) {

0 commit comments

Comments
 (0)