21 #include "../../SDL_internal.h"
23 #ifdef SDL_JOYSTICK_HIDAPI
30 #include "../SDL_sysjoystick.h"
35 #ifdef SDL_JOYSTICK_HIDAPI_XBOX360
44 } SDL_DriverXbox360W_Context;
50 const int XB360W_IFACE_PROTOCOL = 129;
52 if ((vendor_id ==
USB_VENDOR_MICROSOFT && (product_id == 0x0291 || product_id == 0x02a9 || product_id == 0x0719)) ||
60 HIDAPI_DriverXbox360W_GetDeviceName(
Uint16 vendor_id,
Uint16 product_id)
62 return "Xbox 360 Wireless Controller";
68 const Uint8 led_packet[] = { 0x00, 0x00, 0x08, (0x40 + (
mode % 0x0e)), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
70 if (
hid_write(dev, led_packet,
sizeof(led_packet)) !=
sizeof(led_packet)) {
79 float normalized_level = (float)
level / 255.0f;
81 if (normalized_level <= 0.05f) {
83 }
else if (normalized_level <= 0.20f) {
85 }
else if (normalized_level <= 0.70f) {
95 SDL_DriverXbox360W_Context *
ctx;
98 const Uint8 init_packet[] = { 0x08, 0x00, 0x0F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
114 if (
hid_write(
device->dev, init_packet,
sizeof(init_packet)) !=
sizeof(init_packet)) {
134 SetSlotLED(
device->dev, (player_index % 4));
140 SDL_DriverXbox360W_Context *
ctx = (SDL_DriverXbox360W_Context *)
device->context;
155 Uint8 rumble_packet[] = { 0x00, 0x01, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
157 rumble_packet[5] = (low_frequency_rumble >> 8);
158 rumble_packet[6] = (high_frequency_rumble >> 8);
160 if (SDL_HIDAPI_SendRumble(
device, rumble_packet,
sizeof(rumble_packet)) !=
sizeof(rumble_packet)) {
197 if (
ctx->last_state[2] !=
data[2]) {
208 if (
ctx->last_state[3] !=
data[3]) {
243 SDL_DriverXbox360W_Context *
ctx = (SDL_DriverXbox360W_Context *)
device->context;
253 #ifdef DEBUG_XBOX_PROTOCOL
258 #ifdef DEBUG_JOYSTICK
259 SDL_Log(
"Connected = %s\n", connected ?
"TRUE" :
"FALSE");
261 if (connected !=
ctx->connected) {
262 ctx->connected = connected;
269 }
else if (
device->num_joysticks > 0) {
273 }
else if (
size == 29 &&
data[0] == 0x00 &&
data[1] == 0x0f &&
data[2] == 0x00 &&
data[3] == 0xf0) {
275 #ifdef DEBUG_JOYSTICK
276 SDL_Log(
"Battery status (initial): %d\n",
data[17]);
281 }
else if (
size == 29 &&
data[0] == 0x00 &&
data[1] == 0x00 &&
data[2] == 0x00 &&
data[3] == 0x13) {
282 #ifdef DEBUG_JOYSTICK
288 }
else if (
size == 29 &&
data[0] == 0x00 && (
data[1] & 0x01) == 0x01) {
323 HIDAPI_DriverXbox360W_IsSupportedDevice,
324 HIDAPI_DriverXbox360W_GetDeviceName,
325 HIDAPI_DriverXbox360W_InitDevice,
326 HIDAPI_DriverXbox360W_GetDevicePlayerIndex,
327 HIDAPI_DriverXbox360W_SetDevicePlayerIndex,
328 HIDAPI_DriverXbox360W_UpdateDevice,
329 HIDAPI_DriverXbox360W_OpenJoystick,
330 HIDAPI_DriverXbox360W_RumbleJoystick,
331 HIDAPI_DriverXbox360W_RumbleJoystickTriggers,
332 HIDAPI_DriverXbox360W_HasJoystickLED,
333 HIDAPI_DriverXbox360W_SetJoystickLED,
334 HIDAPI_DriverXbox360W_SetJoystickSensorsEnabled,
335 HIDAPI_DriverXbox360W_CloseJoystick,
336 HIDAPI_DriverXbox360W_FreeDevice,
#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
#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_DriverXbox360W
#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_FULL
@ SDL_JOYSTICK_POWER_MEDIUM
@ SDL_JOYSTICK_POWER_EMPTY
@ SDL_JOYSTICK_POWER_UNKNOWN
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_VENDOR_MICROSOFT
typedef int(__stdcall *FARPROC)()