Xbox 360 Controller
The Xbox 360 virtual gamepad emulates an XInput-compatible controller that most operating systems and games understand out of the box.
Use xbox360 as the device type when adding a device via the API or client libraries.
Client Library Support
The wire protocol is abstracted by client libraries.
The Go client includes built-in types (/device/xbox360),
and generated client libraries provide equivalent structures
with proper packing.
You don't need to manually construct packets, just use the provided types and send/receive them via the device control and feedback stream.
You can optionally specify a sub type if you wish to emulate a different type of controller. This is done by specifying it as part of the device options.
For example:
{"type":"xbox360", "deviceSpecific": {"subType": 7}}
Subtypes
| Subtype | Value |
|---|---|
| Gamepad | 1 |
| Wheel | 2 |
| Arcade Stick | 3 |
| Flight Stick | 4 |
| Dance Pad | 5 |
| Guitar | 6 |
| Guitar Alternate | 7 |
| Drums | 8 |
| Rock Band Stage Kit | 9 |
| Guitar Bass | 11 |
| Rock Band Pro Keys | 15 |
| Arcade Pad | 19 |
| Turntable | 23 |
| Rock Band Pro Guitar | 25 |
| Disney Infinity or Lego Dimensions Portal | 33 |
| Skylanders Portal | 36 |
See: API Reference
(RAW) Streaming protocol
The device stream is a bidirectional, raw TCP connection with fixed-size packets.
Input State
- 20-byte packets, little-endian layout:
- Buttons: uint32 (4 bytes, bitfield)
- Triggers: LT, RT: uint8, uint8 (2 bytes)
0-255 (0=not pressed, 255=fully pressed) - Sticks: LX, LY, RX, RY: int16 each (8 bytes)
0 is center, -32768 is min, 32767 is max - Reserved: there are 6 reserved bytes at the end of the report. For most subtypes, these will be zeroed, but a few subtypes do put data here.
Rumble Feedback
- 2-byte packets:
- LeftMotor: uint8, RightMotor: uint8
0-255 intensity values
- LeftMotor: uint8, RightMotor: uint8
See /device/xbox360/inputstate.go for details.
Button constants
| Button | Hex Value |
|---|---|
| D-Pad Up | 0x0001 |
| D-Pad Down | 0x0002 |
| D-Pad Left | 0x0004 |
| D-Pad Right | 0x0008 |
| Start button | 0x0010 |
| Back button | 0x0020 |
| Left stick button | 0x0040 |
| Right stick button | 0x0080 |
| Left bumper | 0x0100 |
| Right bumper | 0x0200 |
| Xbox/Guide button | 0x0400 |
| A button | 0x1000 |
| B button | 0x2000 |
| X button | 0x4000 |
| Y button | 0x8000 |
API
| Function | Description |
|---|---|
CreateXbox360Device(serverHandle, &handle, busID, autoAttach, vid, pid, subType) |
Create a virtual Xbox 360 controller |
SetXbox360DeviceState(handle, state) |
Push an input state to the device |
SetXbox360RumbleCallback(handle, cb) |
Register a callback for rumble output |
RemoveXbox360Device(handle) |
Remove the device |
Input state
typedef struct {
uint32_t Buttons;
uint8_t LT;
uint8_t RT;
int16_t LX;
int16_t LY;
int16_t RX;
int16_t RY;
uint8_t Reserved[6];
} Xbox360DeviceState;
Button flags
| Constant | Value |
|---|---|
XBOX360_BUTTON_DPAD_UP |
0x0001 |
XBOX360_BUTTON_DPAD_DOWN |
0x0002 |
XBOX360_BUTTON_DPAD_LEFT |
0x0004 |
XBOX360_BUTTON_DPAD_RIGHT |
0x0008 |
XBOX360_BUTTON_START |
0x0010 |
XBOX360_BUTTON_BACK |
0x0020 |
XBOX360_BUTTON_LEFT_THUMB |
0x0040 |
XBOX360_BUTTON_RIGHT_THUMB |
0x0080 |
XBOX360_BUTTON_LEFT_SHOULDER |
0x0100 |
XBOX360_BUTTON_RIGHT_SHOULDER |
0x0200 |
XBOX360_BUTTON_GUIDE |
0x0400 |
XBOX360_BUTTON_A |
0x1000 |
XBOX360_BUTTON_B |
0x2000 |
XBOX360_BUTTON_X |
0x4000 |
XBOX360_BUTTON_Y |
0x8000 |
Rumble callback
typedef void (*Xbox360RumbleCallback)(Xbox360DeviceHandle handle, uint8_t leftMotor, uint8_t rightMotor);
Pass NULL to SetXbox360RumbleCallback to clear a previously registered callback.