Joystick Mapping Information for Game Developers
General
EdgeTX can output joystick / gamepad information via USB HID with ID (VID_1209&PID_4F54 / 1209:4F54).
EdgeTX performs configurable input processing including dead bands, mixing, and non-linear scaling.
A wide variety of controllers run EdgeTX. By default all devices output the same "Classic Joystick" report format with 8 analog axis and 24 digital buttons.
Buttons are digital (0 = off, 1 = on).
Analog axis have 11 bit resoultion.
Linux: evdev
Linux's evdev API uses open (fcntl.h) with /dev/input/event[...] and read (unistd.h) to read input_event (linux/joystick.h).
identity
EVIOCGID : device_id.vendor is 4617 / 0x1209
EVIOCGID : device_id.product is 20308 / 0x4F54
input labels
EdgeTX | event name | event code |
---|---|---|
CH1 | ABS_X | EV_ABS 0 |
CH2 | ABS_Y | EV_ABS 1 |
CH3 | ABS_Z | EV_ABS 2 |
CH4 | ABS_RX | EV_ABS 3 |
CH5 | ABS_RY | EV_ABS 4 |
CH6 | ABS_RZ | EV_ABS 5 |
CH7 | ABS_THROTTLE | EV_ABS 6 |
CH8 | ABS_RUDDER | EV_ABS 7 |
CH9 | BTN_SOUTH | EV_KEY 304 / 0x130 |
CH10 | BTN_EAST | EV_KEY 305 / 0x131 |
CH11 | BTN_C | EV_KEY 306 / 0x132 |
CH12 | BTN_NORTH | EV_KEY 307 / 0x133 |
CH13 | BTN_WEST | EV_KEY 308 / 0x134 |
CH14 | BTN_Z | EV_KEY 309 / 0x135 |
CH15 | BTN_TL | EV_KEY 310 / 0x136 |
CH16 | BTN_TR | EV_KEY 311 / 0x137 |
CH17 | BTN_TL2 | EV_KEY 312 / 0x138 |
CH18 | BTN_TR2 | EV_KEY 313 / 0x139 |
CH19 | BTN_SELECT | EV_KEY 314 / 0x13A |
CH20 | BTN_START | EV_KEY 315 / 0x13B |
CH21 | BTN_MODE | EV_KEY 316 / 0x13C |
CH22 | BTN_THUMBL | EV_KEY 317 / 0x13D |
CH23 | BTN_THUMBR | EV_KEY 318 / 0x13E |
CH24 | (no name) | EV_KEY 319 / 0x13F |
CH25 | BTN_TRIGGER_HAPPY1 | EV_KEY 704 / 0x2C0 |
CH26 | BTN_TRIGGER_HAPPY2 | EV_KEY 705 / 0x2C1 |
CH27 | BTN_TRIGGER_HAPPY3 | EV_KEY 706 / 0x2C2 |
CH28 | BTN_TRIGGER_HAPPY4 | EV_KEY 707 / 0x2C3 |
CH29 | BTN_TRIGGER_HAPPY5 | EV_KEY 708 / 0x2C4 |
CH30 | BTN_TRIGGER_HAPPY6 | EV_KEY 709 / 0x2C5 |
CH31 | BTN_TRIGGER_HAPPY7 | EV_KEY 710 / 0x2C6 |
CH32 | BTN_TRIGGER_HAPPY8 | EV_KEY 711 / 0x2C7 |
Linux: joystick
Linux's joystick API uses open (fcntl.h) with /dev/input/js and read (unistd.h) to read js_event (linux/joystick.h).
identity
JSIOCGNAME is "EdgeTX [...] Joystick" or "OpenTX [...] Joystick". The middle part ("[...]") is device specific.
input labels
EdgeTX | read js_event |
---|---|
CH1 | JS_EVENT_AXIS 0 |
CH2 | JS_EVENT_AXIS 1 |
[...] | [...] |
CH8 | JS_EVENT_AXIS 7 |
CH9 | JS_EVENT_BUTTON 0 |
CH10 | JS_EVENT_BUTTON 1 |
[...] | [...] |
CH32 | JS_EVENT_BUTTON 23 |
Windows: DirectInput
Windows's DirectInput uses IDirectInputDevice8::GetDeviceState to read DIJOYSTATE (dinput.h). DIJOYSTATE2 (c_dfDIJoystick2) outputs the same information.
identity
DIDEVICEINSTANCE.guidProduct starts with "4F541209-". The trailing part of the GUID is device specific.
input labels
EdgeTX | DIJOYSTATE |
---|---|
CH1 | lX |
CH2 | lY |
CH3 | lZ |
CH4 | lRx |
CH5 | lRy |
CH6 | lRz |
CH7 | rglSlider[1] |
CH8 | rglSlider[0] |
CH9 | rgbButtons[0] |
CH10 | rgbButtons[1] |
[...] | [...] |
CH32 | rgbButtons[23] |
Windows: Multimedia
Windows' Multimedia API uses joyGetPosEx to read JOYINFOEX (joystickapi.h). The older joyGetPos / JOYINFO only support CH1-CH3 and CH9-CH32 with the same mapping as the newer JOYINFOEX.
identity
JOYCAPS.wMid is 4617 / 0x1209
JOYCAPS.wPid is 20308 / 0x4F54
input labels
EdgeTX | JOYINFOEX |
---|---|
CH1 | dwXpos |
CH2 | dwYpos |
CH3 | dwZpos |
CH4 | dwVpos |
CH5 | (not available) |
CH6 | dwRpos |
CH7 | dwUpos |
CH8 | (not available) |
CH9 | dwButtons & 0x000001 |
CH10 | dwButtons & 0x000002 |
CH11 | dwButtons & 0x000004 |
[...] | [...] |
CH32 | dwButtons & 0x800000 |
Windows: Raw Input
Windows' Raw Input API uses GetRawInputData (WinUser.h), HidP_GetUsageValue and HidP_GetUsages (hidpi.h).
identity
RID_DEVICE_INFO_HID.dwVendorId is 4617 / 0x1209
RID_DEVICE_INFO_HID.dwProductId is 20308 / 0x4F54
input labels
EdgeTX | HidP_Get[...]Value | UsagePage | Usage |
---|---|---|---|
CH1 | HidP_GetValueCaps [7] | 0x01 | 0x30 |
CH2 | HidP_GetValueCaps [6] | 0x01 | 0x31 |
CH3 | HidP_GetValueCaps [5] | 0x01 | 0x32 |
CH4 | HidP_GetValueCaps [4] | 0x01 | 0x33 |
CH5 | HidP_GetValueCaps [3] | 0x01 | 0x34 |
CH6 | HidP_GetValueCaps [2] | 0x01 | 0x35 |
CH7 | HidP_GetValueCaps [1] | 0x01 | 0x36 |
CH8 | HidP_GetValueCaps [0] | 0x01 | 0x37 |
CH9 | HidP_GetButtonCaps [0] | 0x09 | 0x01 |
CH10 | HidP_GetButtonCaps [0] | 0x09 | 0x02 |
[...] | [...] | [...] | [...] |
CH32 | HidP_GetButtonCaps [0] | 0x09 | 0x18 |
Windows: Windows.Gaming.Input
Windows' RawGameController uses winrt::Windows::Gaming::Input::RawGameController (winrt/Windows.Gaming.Input.h).
identity
RawGameController::HardwareVendorId is 4617 / 0x1209
RawGameController::HardwareProductId is 20308 / 0x4F54
input labels
EdgeTX | GetCurrentReading |
---|---|
CH1 | axisArray[0] |
CH2 | axisArray[1] |
[...] | [...] |
CH8 | axisArray[7] |
CH9 | buttonArray[0] |
CH10 | buttonArray[1] |
[...] | [...] |
CH32 | buttonArray[23] |
Last updated