21 #include "../../SDL_internal.h"
23 #ifdef SDL_JOYSTICK_HIDAPI
30 #include "../SDL_sysjoystick.h"
35 #ifdef SDL_JOYSTICK_HIDAPI_XBOX360
43 } SDL_DriverXbox360_Context;
45 #if defined(__MACOSX__)
47 IsBluetoothXboxOneController(
Uint16 vendor_id,
Uint16 product_id)
64 const int XB360W_IFACE_PROTOCOL = 129;
75 if (interface_number > 0) {
79 #if defined(__MACOSX__) || defined(__WIN32__)
85 #if defined(__MACOSX__)
92 if (IsBluetoothXboxOneController(vendor_id, product_id)) {
102 HIDAPI_DriverXbox360_GetDeviceName(
Uint16 vendor_id,
Uint16 product_id)
110 const Uint8 led_packet[] = { 0x01, 0x03,
mode };
112 if (
hid_write(dev, led_packet,
sizeof(led_packet)) !=
sizeof(led_packet)) {
136 SetSlotLED(
device->dev, (player_index % 4));
142 SDL_DriverXbox360_Context *
ctx;
161 if (player_index >= 0) {
162 SetSlotLED(
device->dev, (player_index % 4));
177 if (IsBluetoothXboxOneController(
device->vendor_id,
device->product_id)) {
178 Uint8 rumble_packet[] = { 0x03, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00 };
180 rumble_packet[4] = (low_frequency_rumble >> 8);
181 rumble_packet[5] = (high_frequency_rumble >> 8);
183 if (SDL_HIDAPI_SendRumble(
device, rumble_packet,
sizeof(rumble_packet)) !=
sizeof(rumble_packet)) {
190 Uint8 rumble_packet[] = {
'M',
'A',
'G',
'I',
'C',
'0', 0x00, 0x04, 0x00, 0x00 };
192 rumble_packet[6+2] = (low_frequency_rumble >> 8);
193 rumble_packet[6+3] = (high_frequency_rumble >> 8);
195 if (SDL_HIDAPI_SendRumble(
device, rumble_packet,
sizeof(rumble_packet)) !=
sizeof(rumble_packet)) {
200 Uint8 rumble_packet[] = { 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
202 rumble_packet[3] = (low_frequency_rumble >> 8);
203 rumble_packet[4] = (high_frequency_rumble >> 8);
205 if (SDL_HIDAPI_SendRumble(
device, rumble_packet,
sizeof(rumble_packet)) !=
sizeof(rumble_packet)) {
238 HIDAPI_DriverXbox360_HandleStatePacket(SDL_Joystick *
joystick, SDL_DriverXbox360_Context *
ctx,
Uint8 *
data,
int size)
247 if (
ctx->last_state[2] !=
data[2]) {
258 if (
ctx->last_state[3] !=
data[3]) {
293 SDL_DriverXbox360_Context *
ctx = (SDL_DriverXbox360_Context *)
device->context;
306 #ifdef DEBUG_XBOX_PROTOCOL
309 if (
data[0] == 0x00) {
342 HIDAPI_DriverXbox360_IsSupportedDevice,
343 HIDAPI_DriverXbox360_GetDeviceName,
344 HIDAPI_DriverXbox360_InitDevice,
345 HIDAPI_DriverXbox360_GetDevicePlayerIndex,
346 HIDAPI_DriverXbox360_SetDevicePlayerIndex,
347 HIDAPI_DriverXbox360_UpdateDevice,
348 HIDAPI_DriverXbox360_OpenJoystick,
349 HIDAPI_DriverXbox360_RumbleJoystick,
350 HIDAPI_DriverXbox360_RumbleJoystickTriggers,
351 HIDAPI_DriverXbox360_HasJoystickLED,
352 HIDAPI_DriverXbox360_SetJoystickLED,
353 HIDAPI_DriverXbox360_SetJoystickSensorsEnabled,
354 HIDAPI_DriverXbox360_CloseJoystick,
355 HIDAPI_DriverXbox360_FreeDevice,
#define SDL_JoystickGetPlayerIndex
#define SDL_JoystickFromInstanceID
#define SDL_OutOfMemory()
#define SDL_Unsupported()
@ SDL_CONTROLLER_AXIS_LEFTX
@ SDL_CONTROLLER_AXIS_TRIGGERRIGHT
@ SDL_CONTROLLER_AXIS_RIGHTY
@ SDL_CONTROLLER_AXIS_RIGHTX
@ SDL_CONTROLLER_AXIS_MAX
@ SDL_CONTROLLER_AXIS_TRIGGERLEFT
@ SDL_CONTROLLER_AXIS_LEFTY
@ SDL_CONTROLLER_BUTTON_B
@ SDL_CONTROLLER_BUTTON_BACK
@ SDL_CONTROLLER_BUTTON_LEFTSTICK
@ SDL_CONTROLLER_BUTTON_START
@ SDL_CONTROLLER_BUTTON_DPAD_LEFT
@ SDL_CONTROLLER_BUTTON_RIGHTSHOULDER
@ SDL_CONTROLLER_BUTTON_DPAD_DOWN
@ SDL_CONTROLLER_BUTTON_DPAD_UP
@ SDL_CONTROLLER_BUTTON_LEFTSHOULDER
@ SDL_CONTROLLER_BUTTON_GUIDE
@ SDL_CONTROLLER_BUTTON_DPAD_RIGHT
@ SDL_CONTROLLER_BUTTON_X
@ SDL_CONTROLLER_BUTTON_RIGHTSTICK
@ SDL_CONTROLLER_BUTTON_Y
@ SDL_CONTROLLER_BUTTON_A
@ SDL_CONTROLLER_TYPE_XBOX360
@ SDL_CONTROLLER_TYPE_XBOXONE
#define USB_PACKET_LENGTH
void HIDAPI_DumpPacket(const char *prefix, Uint8 *data, int size)
SDL_bool HIDAPI_JoystickConnected(SDL_HIDAPI_Device *device, SDL_JoystickID *pJoystickID)
void HIDAPI_JoystickDisconnected(SDL_HIDAPI_Device *device, SDL_JoystickID joystickID)
SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXbox360
#define SDL_HINT_JOYSTICK_HIDAPI_XBOX
A variable controlling whether the HIDAPI driver for XBox controllers should be used.
int SDL_PrivateJoystickAxis(SDL_Joystick *joystick, Uint8 axis, Sint16 value)
int SDL_PrivateJoystickButton(SDL_Joystick *joystick, Uint8 button, Uint8 state)
@ SDL_JOYSTICK_POWER_WIRED
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLuint GLuint GLsizei GLenum type
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLuint const GLchar * name
int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *device, unsigned char *data, size_t length, int milliseconds)
Read an Input report from a HID device with timeout.
HID_API_EXPORT hid_device *HID_API_CALL hid_open_path(const char *path, int bExclusive)
Open a HID device by its path name.
void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device)
Close a HID device.
struct hid_device_ hid_device
int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length)
Write an Output report to a HID device.
static SDL_AudioDeviceID device
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro pixld1_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl else error unsupported endif endm macro pixld2_s mem_operand if mov asr add asl add asl mov asr sub UNIT_X add asl mov asr add asl add asl mov asr add UNIT_X add asl else pixld1_s mem_operand pixld1_s mem_operand endif endm macro pixld0_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl endif endm macro pixld_s_internal mem_operand if mem_operand pixld2_s mem_operand pixdeinterleave basereg elseif mem_operand elseif mem_operand elseif mem_operand elseif mem_operand pixld0_s mem_operand else pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else error unsupported mem_operand if bpp mem_operand endif endm macro vuzp8 reg2 vuzp d d ®2 endm macro vzip8 reg2 vzip d d ®2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld[DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld if[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro fetch_mask_pixblock pixld mask_basereg pixblock_size MASK endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
static SDL_Joystick * joystick
#define USB_PRODUCT_XBOX_ONE_S_REV1_BLUETOOTH
#define USB_VENDOR_MICROSOFT
#define USB_PRODUCT_XBOX_ONE_ELITE_SERIES_2_BLUETOOTH
#define USB_VENDOR_NVIDIA
#define USB_PRODUCT_XBOX_ONE_S_REV2_BLUETOOTH
typedef int(__stdcall *FARPROC)()