Beispiel #1
0
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, &current->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");
      }
    }
  }
}
Beispiel #2
0
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;*/
}