static void process_report(int usb_number, struct usb_state * state, struct libusb_transfer * transfer) { int i; for(i = 0; i < controller[state->type].endpoints.in.reports.nb; ++i) { unsigned char report_id = controller[state->type].endpoints.in.reports.elements[i].report_id; unsigned char report_length = controller[state->type].endpoints.in.reports.elements[i].report_length; if(transfer->buffer[0] == report_id) { if(transfer->actual_length == report_length) { if(state->type == C_TYPE_XONE_PAD && !adapter_get(usb_number)->status) { break; } s_report* current = (s_report*) transfer->buffer; s_report* previous = &state->reports[i].report.value; report2event(state->type, usb_number, (s_report*)current, (s_report*)previous, state->joystick_id); if(state->type == C_TYPE_DS4 || state->type == C_TYPE_T300RS_PS4 || state->type == C_TYPE_G29_PS4) { memcpy(&previous->ds4, ¤t->ds4, report_length); //s_report_ds4 is larger than report_length bytes! } else if(state->type == C_TYPE_360_PAD) { previous->x360 = current->x360; } else if(state->type == C_TYPE_XONE_PAD) { if(report_id == XONE_USB_HID_IN_REPORT_ID) { previous->xone.input = current->xone.input; } else if(report_id == XONE_USB_HID_IN_GUIDE_REPORT_ID) { previous->xone.guide = current->xone.guide; } } } else { fprintf(stderr, "incorrect report length on interrupt endpoint: received %d bytes, expected %d bytes\n", transfer->actual_length, report_length); } break; } } if(i == controller[state->type].endpoints.in.reports.nb) { if(state->type == C_TYPE_XONE_PAD && !adapter_get(usb_number)->status) { if(adapter_forward_interrupt_in(usb_number, transfer->buffer, transfer->actual_length) < 0) { fprintf(stderr, "can't forward interrupt data to the adapter\n"); } } } }
static int read_ds4_interrupt(void * user) { int btds4_number = (intptr_t) user; unsigned char buf[1024]; int ret = l2cap_abs_get()->recv(states[btds4_number].ds4_channels.interrupt.id, buf, sizeof(buf)); if(ret < 0) { fprintf(stderr, "error reading ds4 interrupt\n"); } unsigned char* pbuf = buf; s_report_ds4* current = &((s_btds4_report*)pbuf)->report; s_report_ds4* previous = &states[btds4_number].previous; report2event(C_TYPE_DS4, btds4_number, (s_report*)current, (s_report*)previous, states[btds4_number].joystick_id); *previous = *current; return 0; /*unsigned char buf[1024]; ssize_t len = l2cap_abs_get(E_L2CAP_BLUEZ)->recv(states[btds4_number].ds4_channels.interrupt, buf, sizeof(buf)); cpt++; if(cpt%8) { return 0; } if(len < 0) { fprintf(stderr, "error reading ds4 interrupt\n"); } else { int ret = l2cap_abs_get(E_L2CAP_BLUEZ)->send(states[btds4_number].ps4_channels.interrupt, buf, len, 0); if(ret != len) { fprintf(stderr, "error writing %d bytes on ps4 interrupt\n", len); } } return 0;*/ }