Playstation3USBController::Playstation3USBController(libusb_device* dev, bool try_detach) : USBController(dev), endpoint_in(1), endpoint_out(2) { usb_claim_interface(0, try_detach); usb_submit_read(endpoint_in, 64); }
SaitekP2500Controller::SaitekP2500Controller(libusb_device* dev, bool try_detach) : USBController(dev), left_rumble(-1), right_rumble(-1) { usb_claim_interface(0, try_detach); usb_submit_read(1, sizeof(SaitekP2500Msg)); }
HamaCruxController::HamaCruxController(libusb_device* dev, bool try_detach) : USBController(dev), m_interface(0), m_endpoint(1), m_names(m_message_descriptor) { usb_claim_interface(m_interface, try_detach); usb_submit_read(m_endpoint, 8); }
Xbox360Controller::Xbox360Controller(libusb_device* dev, bool chatpad, bool chatpad_no_init, bool chatpad_debug, bool headset, bool headset_debug, const std::string& headset_dump, const std::string& headset_play, bool try_detach) : USBController(dev), dev_type(), endpoint_in(1), endpoint_out(2), m_chatpad(), m_headset(), m_rumble_left(0), m_rumble_right(0) { // find endpoints endpoint_in = usb_find_ep(LIBUSB_ENDPOINT_IN, LIBUSB_CLASS_VENDOR_SPEC, 93, 1); endpoint_out = usb_find_ep(LIBUSB_ENDPOINT_OUT, LIBUSB_CLASS_VENDOR_SPEC, 93, 1); log_debug("EP(IN): " << endpoint_in); log_debug("EP(OUT): " << endpoint_out); usb_claim_interface(0, try_detach); usb_submit_read(endpoint_in, 32); // create chatpad if (chatpad) { libusb_device_descriptor desc; int ret = libusb_get_device_descriptor(dev, &desc); if (ret != LIBUSB_SUCCESS) { raise_exception(std::runtime_error, "libusb_get_config_descriptor() failed: " << usb_strerror(ret)); } else { m_chatpad.reset(new Chatpad(m_handle, desc.bcdDevice, chatpad_no_init, chatpad_debug)); } } // create headset if (headset) { m_headset.reset(new Headset(m_handle, headset_debug)); if (!headset_play.empty()) { m_headset->play_file(headset_play); } if (!headset_dump.empty()) { m_headset->record_file(headset_dump); } } }
LogitechF310Controller::LogitechF310Controller(libusb_device* dev, bool try_detach) : USBController(dev), left_rumble(-1), right_rumble(-1), xbox(m_message_descriptor) { usb_claim_interface(0, try_detach); usb_submit_read(1, 32); }
Xbox360WirelessController::Xbox360WirelessController(libusb_device* dev, int controller_id, bool try_detach) : USBController(dev), m_endpoint(), m_interface(), m_battery_status(), m_serial() { // FIXME: A little bit of a hack m_is_active = false; assert(controller_id >= 0 && controller_id < 4); // FIXME: Is hardcoding those ok? m_endpoint = controller_id*2 + 1; m_interface = controller_id*2; usb_claim_interface(m_interface, try_detach); usb_submit_read(m_endpoint, 32); }
GenericUSBController::GenericUSBController(libusb_device* dev, int interface, int endpoint, bool try_detach) : USBController(dev), m_interface(interface), m_endpoint(endpoint) { struct libusb_config_descriptor* config; if (libusb_get_active_config_descriptor(dev, &config) != LIBUSB_SUCCESS) { raise_exception(std::runtime_error, "failed to get config descriptor"); } else { if (config->bNumInterfaces == 0) { raise_exception(std::runtime_error, "no interfaces available"); } if (config->interface[0].num_altsetting == 0) { raise_exception(std::runtime_error, "no interface descriptors available"); } if (config->interface[0].altsetting[0].bNumEndpoints <= m_endpoint) { raise_exception(std::runtime_error, "endpoint not available"); } uint16_t wMaxPacketSize = config->interface[0].altsetting[0].endpoint[m_endpoint].wMaxPacketSize; log_debug("wMaxPacketSize: " << wMaxPacketSize); usb_claim_interface(m_interface, try_detach); usb_submit_read(m_endpoint, wMaxPacketSize); } }
/* Chatpad Interface: ================== bInterfaceNumber 2 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 93 bInterfaceProtocol 2 */ Chatpad::Chatpad(libusb_device_handle* handle, uint16_t bcdDevice, bool no_init, bool debug) : m_init_state(kStateInit1), m_handle(handle), m_bcdDevice(bcdDevice), m_no_init(no_init), m_debug(debug), m_quit_thread(false), m_uinput(), m_keymap(), m_state(), m_led_state(0), m_read_transfer(0) { if (m_bcdDevice != 0x0110 && m_bcdDevice != 0x0114) { throw std::runtime_error("unknown bcdDevice version number, please report this issue " "to <*****@*****.**> and include the output of 'lsusb -v'"); } std::fill(m_keymap.begin(), m_keymap.end(), 0); std::fill(m_state.begin(), m_state.end(), 0); m_keymap[CHATPAD_KEY_1] = KEY_1; m_keymap[CHATPAD_KEY_2] = KEY_2; m_keymap[CHATPAD_KEY_3] = KEY_3; m_keymap[CHATPAD_KEY_4] = KEY_4; m_keymap[CHATPAD_KEY_5] = KEY_5; m_keymap[CHATPAD_KEY_6] = KEY_6; m_keymap[CHATPAD_KEY_7] = KEY_7; m_keymap[CHATPAD_KEY_8] = KEY_8; m_keymap[CHATPAD_KEY_9] = KEY_9; m_keymap[CHATPAD_KEY_0] = KEY_0; m_keymap[CHATPAD_KEY_Q] = KEY_Q; m_keymap[CHATPAD_KEY_W] = KEY_W; m_keymap[CHATPAD_KEY_E] = KEY_E; m_keymap[CHATPAD_KEY_R] = KEY_R; m_keymap[CHATPAD_KEY_T] = KEY_T; m_keymap[CHATPAD_KEY_Y] = KEY_Y; m_keymap[CHATPAD_KEY_U] = KEY_U; m_keymap[CHATPAD_KEY_I] = KEY_I; m_keymap[CHATPAD_KEY_O] = KEY_O; m_keymap[CHATPAD_KEY_P] = KEY_P; m_keymap[CHATPAD_KEY_A] = KEY_A; m_keymap[CHATPAD_KEY_S] = KEY_S; m_keymap[CHATPAD_KEY_D] = KEY_D; m_keymap[CHATPAD_KEY_F] = KEY_F; m_keymap[CHATPAD_KEY_G] = KEY_G; m_keymap[CHATPAD_KEY_H] = KEY_H; m_keymap[CHATPAD_KEY_J] = KEY_J; m_keymap[CHATPAD_KEY_K] = KEY_K; m_keymap[CHATPAD_KEY_L] = KEY_L; m_keymap[CHATPAD_KEY_COMMA] = KEY_COMMA; m_keymap[CHATPAD_KEY_Z] = KEY_Z; m_keymap[CHATPAD_KEY_X] = KEY_X; m_keymap[CHATPAD_KEY_C] = KEY_C; m_keymap[CHATPAD_KEY_V] = KEY_V; m_keymap[CHATPAD_KEY_B] = KEY_B; m_keymap[CHATPAD_KEY_N] = KEY_N; m_keymap[CHATPAD_KEY_M] = KEY_M; m_keymap[CHATPAD_KEY_PERIOD] = KEY_DOT; m_keymap[CHATPAD_KEY_ENTER] = KEY_ENTER; m_keymap[CHATPAD_KEY_BACKSPACE] = KEY_BACKSPACE; m_keymap[CHATPAD_KEY_LEFT] = KEY_LEFT; m_keymap[CHATPAD_KEY_SPACEBAR] = KEY_SPACE; m_keymap[CHATPAD_KEY_RIGHT] = KEY_RIGHT; m_keymap[CHATPAD_MOD_SHIFT] = KEY_LEFTSHIFT; m_keymap[CHATPAD_MOD_GREEN] = KEY_LEFTALT; m_keymap[CHATPAD_MOD_ORANGE] = KEY_LEFTCTRL; m_keymap[CHATPAD_MOD_PEOPLE] = KEY_LEFTMETA; init_uinput(); if (no_init) { m_init_state = kStateKeepAlive_1e; } send_command(); if (m_bcdDevice == 0x0110) { usb_submit_read(6, 32); } else if (m_bcdDevice == 0x0114) { usb_submit_read(4, 32); } }