Thread (43 messages) 43 messages, 6 authors, 2020-12-31

Re: [PATCH 01/13] HID: playstation: initial DualSense USB support.

From: Barnabás Pőcze <hidden>
Date: 2020-12-29 19:13:36

2020. december 28., hétfő 0:04 keltezéssel, Roderick Colenbrander írta:
[...]
quoted
quoted
+     struct dualsense_input_report *ds_report;
+     uint8_t value;
+
+     /* DualSense in USB uses the full HID report for reportID 1, but
+      * Bluetooth uses a minimal HID report for reportID 1 and reports
+      * the full report using reportID 49.
+      */
+     if (report->id == DS_INPUT_REPORT_USB && hdev->bus == BUS_USB) {
+             ds_report = (struct dualsense_input_report *)&data[1];
+     } else {
+             hid_err(hdev, "Unhandled reportID=%d\n", report->id);
+             return -1;
+     }
+
+     input_report_abs(ds->gamepad, ABS_X, ds_report->x);
+     input_report_abs(ds->gamepad, ABS_Y, ds_report->y);
+     input_report_abs(ds->gamepad, ABS_RX, ds_report->rx);
+     input_report_abs(ds->gamepad, ABS_RY, ds_report->ry);
+     input_report_abs(ds->gamepad, ABS_Z, ds_report->z);
+     input_report_abs(ds->gamepad, ABS_RZ, ds_report->rz);
+
+     value = ds_report->buttons[0] & DS_BUTTONS0_HAT_SWITCH;
+     if (value > 7)
+             value = 8; /* center */
+     input_report_abs(ds->gamepad, ABS_HAT0X, ps_gamepad_hat_mapping[value].x);
+     input_report_abs(ds->gamepad, ABS_HAT0Y, ps_gamepad_hat_mapping[value].y);
+
+     input_report_key(ds->gamepad, BTN_WEST, ds_report->buttons[0] & DS_BUTTONS0_SQUARE);
+     input_report_key(ds->gamepad, BTN_SOUTH, ds_report->buttons[0] & DS_BUTTONS0_CROSS);
+     input_report_key(ds->gamepad, BTN_EAST, ds_report->buttons[0] & DS_BUTTONS0_CIRCLE);
+     input_report_key(ds->gamepad, BTN_NORTH, ds_report->buttons[0] & DS_BUTTONS0_TRIANGLE);
+     input_report_key(ds->gamepad, BTN_TL, ds_report->buttons[1] & DS_BUTTONS1_L1);
+     input_report_key(ds->gamepad, BTN_TR, ds_report->buttons[1] & DS_BUTTONS1_R1);
+     input_report_key(ds->gamepad, BTN_TL2, ds_report->buttons[1] & DS_BUTTONS1_L2);
+     input_report_key(ds->gamepad, BTN_TR2, ds_report->buttons[1] & DS_BUTTONS1_R2);
+     input_report_key(ds->gamepad, BTN_SELECT, ds_report->buttons[1] & DS_BUTTONS1_CREATE);
+     input_report_key(ds->gamepad, BTN_START, ds_report->buttons[1] & DS_BUTTONS1_OPTIONS);
+     input_report_key(ds->gamepad, BTN_THUMBL, ds_report->buttons[1] & DS_BUTTONS1_L3);
+     input_report_key(ds->gamepad, BTN_THUMBR, ds_report->buttons[1] & DS_BUTTONS1_R3);
+     input_report_key(ds->gamepad, BTN_MODE, ds_report->buttons[2] & DS_BUTTONS2_PS_HOME);
Possibly this could be replaced with a loop? I have something like this in mind:
struct ps_gamepad_button {
  unsigned int code;
  uint8_t button_idx;
  uint8_t mask;
} ps_gamepad_buttons[] = {...};

for (...) {
  struct ps_gamepad_button *b = ...;
  input_report_key(...);
}
Or is there any reason why the unrolled version is preffered that I'm missing?
It can be done from a loop. Main reason for unrolled was that it is
actually less code and potentially a tiny bit faster, but I bet a
compiler would have unrolled it anyway. I don't know what I want to do
here. Being explicit feels nice (other drivers do something similar).
[...]
I agree that the compiler would've probably unrolled it. I'd personally consider
the loop version to be shorter as I'd not consider the static array "code" -
it's really just data initialization. Anyways, may I suggest then to align the
parameters so that the given parameter of each call starts in the same column?
I think it helps readability a good deal.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help