summaryrefslogtreecommitdiff
path: root/contrib/SDL-3.2.8/src/joystick/hidapi/steam
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2025-12-27 12:03:39 -0800
committer3gg <3gg@shellblade.net>2025-12-27 12:03:39 -0800
commit5a079a2d114f96d4847d1ee305d5b7c16eeec50e (patch)
tree8926ab44f168acf787d8e19608857b3af0f82758 /contrib/SDL-3.2.8/src/joystick/hidapi/steam
Initial commit
Diffstat (limited to 'contrib/SDL-3.2.8/src/joystick/hidapi/steam')
-rw-r--r--contrib/SDL-3.2.8/src/joystick/hidapi/steam/controller_constants.h582
-rw-r--r--contrib/SDL-3.2.8/src/joystick/hidapi/steam/controller_structs.h463
2 files changed, 1045 insertions, 0 deletions
diff --git a/contrib/SDL-3.2.8/src/joystick/hidapi/steam/controller_constants.h b/contrib/SDL-3.2.8/src/joystick/hidapi/steam/controller_constants.h
new file mode 100644
index 0000000..78af016
--- /dev/null
+++ b/contrib/SDL-3.2.8/src/joystick/hidapi/steam/controller_constants.h
@@ -0,0 +1,582 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 2021 Valve Corporation
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21
22#ifndef _CONTROLLER_CONSTANTS_
23#define _CONTROLLER_CONSTANTS_
24
25#include "controller_structs.h"
26
27#ifdef __cplusplus
28extern "C" {
29#endif
30
31#define FEATURE_REPORT_SIZE 64
32
33#define VALVE_USB_VID 0x28DE
34
35// Frame update rate (in ms).
36#define FAST_SCAN_INTERVAL 6
37#define SLOW_SCAN_INTERVAL 9
38
39// Contains each of the USB PIDs for Valve controllers (only add to this enum and never change the order)
40enum ValveControllerPID
41{
42 BASTILLE_PID = 0x2202,
43 CHELL_PID = 0x1101,
44 D0G_PID = 0x1102,
45 ELI_PID = 0x1103,
46 FREEMAN_PID = 0x1104,
47 D0G_BLE_PID = 0x1105,
48 D0G_BLE2_PID = 0x1106,
49 D0GGLE_PID = 0x1142,
50
51 JUPITER_PID = 0x1205,
52};
53
54// This enum contains all of the messages exchanged between the host and the target (only add to this enum and never change the order)
55enum FeatureReportMessageIDs
56{
57 ID_SET_DIGITAL_MAPPINGS = 0x80,
58 ID_CLEAR_DIGITAL_MAPPINGS = 0x81,
59 ID_GET_DIGITAL_MAPPINGS = 0x82,
60 ID_GET_ATTRIBUTES_VALUES = 0x83,
61 ID_GET_ATTRIBUTE_LABEL = 0x84,
62 ID_SET_DEFAULT_DIGITAL_MAPPINGS = 0x85,
63 ID_FACTORY_RESET = 0x86,
64 ID_SET_SETTINGS_VALUES = 0x87,
65 ID_CLEAR_SETTINGS_VALUES = 0x88,
66 ID_GET_SETTINGS_VALUES = 0x89,
67 ID_GET_SETTING_LABEL = 0x8A,
68 ID_GET_SETTINGS_MAXS = 0x8B,
69 ID_GET_SETTINGS_DEFAULTS = 0x8C,
70 ID_SET_CONTROLLER_MODE = 0x8D,
71 ID_LOAD_DEFAULT_SETTINGS = 0x8E,
72 ID_TRIGGER_HAPTIC_PULSE = 0x8F,
73
74 ID_TURN_OFF_CONTROLLER = 0x9F,
75
76 ID_GET_DEVICE_INFO = 0xA1,
77
78 ID_CALIBRATE_TRACKPADS = 0xA7,
79 ID_RESERVED_0 = 0xA8,
80 ID_SET_SERIAL_NUMBER = 0xA9,
81 ID_GET_TRACKPAD_CALIBRATION = 0xAA,
82 ID_GET_TRACKPAD_FACTORY_CALIBRATION = 0xAB,
83 ID_GET_TRACKPAD_RAW_DATA = 0xAC,
84 ID_ENABLE_PAIRING = 0xAD,
85 ID_GET_STRING_ATTRIBUTE = 0xAE,
86 ID_RADIO_ERASE_RECORDS = 0xAF,
87 ID_RADIO_WRITE_RECORD = 0xB0,
88 ID_SET_DONGLE_SETTING = 0xB1,
89 ID_DONGLE_DISCONNECT_DEVICE = 0xB2,
90 ID_DONGLE_COMMIT_DEVICE = 0xB3,
91 ID_DONGLE_GET_WIRELESS_STATE = 0xB4,
92 ID_CALIBRATE_GYRO = 0xB5,
93 ID_PLAY_AUDIO = 0xB6,
94 ID_AUDIO_UPDATE_START = 0xB7,
95 ID_AUDIO_UPDATE_DATA = 0xB8,
96 ID_AUDIO_UPDATE_COMPLETE = 0xB9,
97 ID_GET_CHIPID = 0xBA,
98
99 ID_CALIBRATE_JOYSTICK = 0xBF,
100 ID_CALIBRATE_ANALOG_TRIGGERS = 0xC0,
101 ID_SET_AUDIO_MAPPING = 0xC1,
102 ID_CHECK_GYRO_FW_LOAD = 0xC2,
103 ID_CALIBRATE_ANALOG = 0xC3,
104 ID_DONGLE_GET_CONNECTED_SLOTS = 0xC4,
105
106 ID_RESET_IMU = 0xCE,
107
108 // Deck only
109 ID_TRIGGER_HAPTIC_CMD = 0xEA,
110 ID_TRIGGER_RUMBLE_CMD = 0xEB,
111};
112
113
114// Enumeration of all wireless dongle events
115typedef enum WirelessEventTypes
116{
117 WIRELESS_EVENT_DISCONNECT = 1,
118 WIRELESS_EVENT_CONNECT = 2,
119 WIRELESS_EVENT_PAIR = 3,
120} EWirelessEventType;
121
122
123// Enumeration of generic digital inputs - not all of these will be supported on all controllers (only add to this enum and never change the order)
124typedef enum
125{
126 IO_DIGITAL_BUTTON_NONE = -1,
127 IO_DIGITAL_BUTTON_RIGHT_TRIGGER,
128 IO_DIGITAL_BUTTON_LEFT_TRIGGER,
129 IO_DIGITAL_BUTTON_1,
130 IO_DIGITAL_BUTTON_Y=IO_DIGITAL_BUTTON_1,
131 IO_DIGITAL_BUTTON_2,
132 IO_DIGITAL_BUTTON_B=IO_DIGITAL_BUTTON_2,
133 IO_DIGITAL_BUTTON_3,
134 IO_DIGITAL_BUTTON_X=IO_DIGITAL_BUTTON_3,
135 IO_DIGITAL_BUTTON_4,
136 IO_DIGITAL_BUTTON_A=IO_DIGITAL_BUTTON_4,
137 IO_DIGITAL_BUTTON_RIGHT_BUMPER,
138 IO_DIGITAL_BUTTON_LEFT_BUMPER,
139 IO_DIGITAL_BUTTON_LEFT_JOYSTICK_CLICK,
140 IO_DIGITAL_BUTTON_ESCAPE,
141 IO_DIGITAL_BUTTON_STEAM,
142 IO_DIGITAL_BUTTON_MENU,
143 IO_DIGITAL_STICK_UP,
144 IO_DIGITAL_STICK_DOWN,
145 IO_DIGITAL_STICK_LEFT,
146 IO_DIGITAL_STICK_RIGHT,
147 IO_DIGITAL_TOUCH_1,
148 IO_DIGITAL_BUTTON_UP=IO_DIGITAL_TOUCH_1,
149 IO_DIGITAL_TOUCH_2,
150 IO_DIGITAL_BUTTON_RIGHT=IO_DIGITAL_TOUCH_2,
151 IO_DIGITAL_TOUCH_3,
152 IO_DIGITAL_BUTTON_LEFT=IO_DIGITAL_TOUCH_3,
153 IO_DIGITAL_TOUCH_4,
154 IO_DIGITAL_BUTTON_DOWN=IO_DIGITAL_TOUCH_4,
155 IO_DIGITAL_BUTTON_BACK_LEFT,
156 IO_DIGITAL_BUTTON_BACK_RIGHT,
157 IO_DIGITAL_LEFT_TRACKPAD_N,
158 IO_DIGITAL_LEFT_TRACKPAD_NE,
159 IO_DIGITAL_LEFT_TRACKPAD_E,
160 IO_DIGITAL_LEFT_TRACKPAD_SE,
161 IO_DIGITAL_LEFT_TRACKPAD_S,
162 IO_DIGITAL_LEFT_TRACKPAD_SW,
163 IO_DIGITAL_LEFT_TRACKPAD_W,
164 IO_DIGITAL_LEFT_TRACKPAD_NW,
165 IO_DIGITAL_RIGHT_TRACKPAD_N,
166 IO_DIGITAL_RIGHT_TRACKPAD_NE,
167 IO_DIGITAL_RIGHT_TRACKPAD_E,
168 IO_DIGITAL_RIGHT_TRACKPAD_SE,
169 IO_DIGITAL_RIGHT_TRACKPAD_S,
170 IO_DIGITAL_RIGHT_TRACKPAD_SW,
171 IO_DIGITAL_RIGHT_TRACKPAD_W,
172 IO_DIGITAL_RIGHT_TRACKPAD_NW,
173 IO_DIGITAL_LEFT_TRACKPAD_DOUBLE_TAP,
174 IO_DIGITAL_RIGHT_TRACKPAD_DOUBLE_TAP,
175 IO_DIGITAL_LEFT_TRACKPAD_OUTER_RADIUS,
176 IO_DIGITAL_RIGHT_TRACKPAD_OUTER_RADIUS,
177 IO_DIGITAL_LEFT_TRACKPAD_CLICK,
178 IO_DIGITAL_RIGHT_TRACKPAD_CLICK,
179 IO_DIGITAL_BATTERY_LOW,
180 IO_DIGITAL_LEFT_TRIGGER_THRESHOLD,
181 IO_DIGITAL_RIGHT_TRIGGER_THRESHOLD,
182 IO_DIGITAL_BUTTON_BACK_LEFT2,
183 IO_DIGITAL_BUTTON_BACK_RIGHT2,
184 IO_DIGITAL_BUTTON_ALWAYS_ON,
185 IO_DIGITAL_BUTTON_ANCILLARY_1,
186 IO_DIGITAL_BUTTON_MACRO_0,
187 IO_DIGITAL_BUTTON_MACRO_1,
188 IO_DIGITAL_BUTTON_MACRO_2,
189 IO_DIGITAL_BUTTON_MACRO_3,
190 IO_DIGITAL_BUTTON_MACRO_4,
191 IO_DIGITAL_BUTTON_MACRO_5,
192 IO_DIGITAL_BUTTON_MACRO_6,
193 IO_DIGITAL_BUTTON_MACRO_7,
194 IO_DIGITAL_BUTTON_MACRO_1FINGER,
195 IO_DIGITAL_BUTTON_MACRO_2FINGER,
196 IO_DIGITAL_COUNT
197} DigitalIO ;
198
199// Enumeration of generic analog inputs - not all of these will be supported on all controllers (only add to this enum and never change the order)
200typedef enum
201{
202 IO_ANALOG_LEFT_STICK_X,
203 IO_ANALOG_LEFT_STICK_Y,
204 IO_ANALOG_RIGHT_STICK_X,
205 IO_ANALOG_RIGHT_STICK_Y,
206 IO_ANALOG_LEFT_TRIGGER,
207 IO_ANALOG_RIGHT_TRIGGER,
208 IO_MOUSE1_X,
209 IO_MOUSE1_Y,
210 IO_MOUSE1_Z,
211 IO_ACCEL_X,
212 IO_ACCEL_Y,
213 IO_ACCEL_Z,
214 IO_GYRO_X,
215 IO_GYRO_Y,
216 IO_GYRO_Z,
217 IO_GYRO_QUAT_W,
218 IO_GYRO_QUAT_X,
219 IO_GYRO_QUAT_Y,
220 IO_GYRO_QUAT_Z,
221 IO_GYRO_STEERING_VEC,
222 IO_RAW_TRIGGER_LEFT,
223 IO_RAW_TRIGGER_RIGHT,
224 IO_RAW_JOYSTICK_X,
225 IO_RAW_JOYSTICK_Y,
226 IO_GYRO_TILT_VEC,
227 IO_PRESSURE_LEFT_PAD,
228 IO_PRESSURE_RIGHT_PAD,
229 IO_PRESSURE_LEFT_BUMPER,
230 IO_PRESSURE_RIGHT_BUMPER,
231 IO_PRESSURE_LEFT_GRIP,
232 IO_PRESSURE_RIGHT_GRIP,
233 IO_ANALOG_LEFT_TRIGGER_THRESHOLD,
234 IO_ANALOG_RIGHT_TRIGGER_THRESHOLD,
235 IO_PRESSURE_RIGHT_PAD_THRESHOLD,
236 IO_PRESSURE_LEFT_PAD_THRESHOLD,
237 IO_PRESSURE_RIGHT_BUMPER_THRESHOLD,
238 IO_PRESSURE_LEFT_BUMPER_THRESHOLD,
239 IO_PRESSURE_RIGHT_GRIP_THRESHOLD,
240 IO_PRESSURE_LEFT_GRIP_THRESHOLD,
241 IO_PRESSURE_RIGHT_PAD_RAW,
242 IO_PRESSURE_LEFT_PAD_RAW,
243 IO_PRESSURE_RIGHT_BUMPER_RAW,
244 IO_PRESSURE_LEFT_BUMPER_RAW,
245 IO_PRESSURE_RIGHT_GRIP_RAW,
246 IO_PRESSURE_LEFT_GRIP_RAW,
247 IO_PRESSURE_RIGHT_GRIP2_THRESHOLD,
248 IO_PRESSURE_LEFT_GRIP2_THRESHOLD,
249 IO_PRESSURE_LEFT_GRIP2,
250 IO_PRESSURE_RIGHT_GRIP2,
251 IO_PRESSURE_RIGHT_GRIP2_RAW,
252 IO_PRESSURE_LEFT_GRIP2_RAW,
253 IO_ANALOG_COUNT
254} AnalogIO;
255
256
257// Contains list of all types of devices that the controller emulates (only add to this enum and never change the order)
258enum DeviceTypes
259{
260 DEVICE_KEYBOARD,
261 DEVICE_MOUSE,
262 DEVICE_GAMEPAD,
263 DEVICE_MODE_ADJUST,
264 DEVICE_COUNT
265};
266
267// Scan codes for HID keyboards
268enum HIDKeyboardKeys
269{
270 KEY_INVALID,
271 KEY_FIRST = 0x04,
272 KEY_A = KEY_FIRST, KEY_B, KEY_C, KEY_D, KEY_E, KEY_F, KEY_G, KEY_H, KEY_I, KEY_J, KEY_K, KEY_L,
273 KEY_M, KEY_N, KEY_O, KEY_P, KEY_Q, KEY_R, KEY_S, KEY_T, KEY_U, KEY_V, KEY_W, KEY_X, KEY_Y, KEY_Z, KEY_1, KEY_2,
274 KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_RETURN, KEY_ESCAPE, KEY_BACKSPACE, KEY_TAB, KEY_SPACE, KEY_DASH, KEY_EQUALS, KEY_LEFT_BRACKET,
275 KEY_RIGHT_BRACKET, KEY_BACKSLASH, KEY_UNUSED1, KEY_SEMICOLON, KEY_SINGLE_QUOTE, KEY_BACK_TICK, KEY_COMMA, KEY_PERIOD, KEY_FORWARD_SLASH, KEY_CAPSLOCK, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6,
276 KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_PRINT_SCREEN, KEY_SCROLL_LOCK, KEY_BREAK, KEY_INSERT, KEY_HOME, KEY_PAGE_UP, KEY_DELETE, KEY_END, KEY_PAGE_DOWN, KEY_RIGHT_ARROW,
277 KEY_LEFT_ARROW, KEY_DOWN_ARROW, KEY_UP_ARROW, KEY_NUM_LOCK, KEY_KEYPAD_FORWARD_SLASH, KEY_KEYPAD_ASTERISK, KEY_KEYPAD_DASH, KEY_KEYPAD_PLUS, KEY_KEYPAD_ENTER, KEY_KEYPAD_1, KEY_KEYPAD_2, KEY_KEYPAD_3, KEY_KEYPAD_4, KEY_KEYPAD_5, KEY_KEYPAD_6, KEY_KEYPAD_7,
278 KEY_KEYPAD_8, KEY_KEYPAD_9, KEY_KEYPAD_0, KEY_KEYPAD_PERIOD,
279 KEY_LALT,
280 KEY_LSHIFT,
281 KEY_LWIN,
282 KEY_LCONTROL,
283 KEY_RALT,
284 KEY_RSHIFT,
285 KEY_RWIN,
286 KEY_RCONTROL,
287 KEY_VOLUP,
288 KEY_VOLDOWN,
289 KEY_MUTE,
290 KEY_PLAY,
291 KEY_STOP,
292 KEY_NEXT,
293 KEY_PREV,
294 KEY_LAST = KEY_PREV
295};
296
297enum ModifierMasks
298{
299 KEY_LCONTROL_MASK = (1<<0),
300 KEY_LSHIFT_MASK = (1<<1),
301 KEY_LALT_MASK = (1<<2),
302 KEY_LWIN_MASK = (1<<3),
303 KEY_RCONTROL_MASK = (1<<4),
304 KEY_RSHIFT_MASK = (1<<5),
305 KEY_RALT_MASK = (1<<6),
306 KEY_RWIN_MASK = (1<<7)
307};
308
309// Standard mouse buttons as specified in the HID mouse spec
310enum MouseButtons
311{
312 MOUSE_BTN_LEFT,
313 MOUSE_BTN_RIGHT,
314 MOUSE_BTN_MIDDLE,
315 MOUSE_BTN_BACK,
316 MOUSE_BTN_FORWARD,
317 MOUSE_SCROLL_UP,
318 MOUSE_SCROLL_DOWN,
319 MOUSE_BTN_COUNT
320};
321
322// Gamepad buttons
323enum GamepadButtons
324{
325 GAMEPAD_BTN_TRIGGER_LEFT=1,
326 GAMEPAD_BTN_TRIGGER_RIGHT,
327 GAMEPAD_BTN_A,
328 GAMEPAD_BTN_B,
329 GAMEPAD_BTN_Y,
330 GAMEPAD_BTN_X,
331 GAMEPAD_BTN_SHOULDER_LEFT,
332 GAMEPAD_BTN_SHOULDER_RIGHT,
333 GAMEPAD_BTN_LEFT_JOYSTICK,
334 GAMEPAD_BTN_RIGHT_JOYSTICK,
335 GAMEPAD_BTN_START,
336 GAMEPAD_BTN_SELECT,
337 GAMEPAD_BTN_STEAM,
338 GAMEPAD_BTN_DPAD_UP,
339 GAMEPAD_BTN_DPAD_DOWN,
340 GAMEPAD_BTN_DPAD_LEFT,
341 GAMEPAD_BTN_DPAD_RIGHT,
342 GAMEPAD_BTN_LSTICK_UP,
343 GAMEPAD_BTN_LSTICK_DOWN,
344 GAMEPAD_BTN_LSTICK_LEFT,
345 GAMEPAD_BTN_LSTICK_RIGHT,
346 GAMEPAD_BTN_RSTICK_UP,
347 GAMEPAD_BTN_RSTICK_DOWN,
348 GAMEPAD_BTN_RSTICK_LEFT,
349 GAMEPAD_BTN_RSTICK_RIGHT,
350 GAMEPAD_BTN_COUNT
351};
352
353// Mode adjust
354enum ModeAdjustModes
355{
356 MODE_ADJUST_SENSITITY=1,
357 MODE_ADJUST_LEFT_PAD_SECONDARY_MODE,
358 MODE_ADJUST_RIGHT_PAD_SECONDARY_MODE,
359 MODE_ADJUST_COUNT
360};
361
362// Read-only attributes of controllers (only add to this enum and never change the order)
363typedef enum
364{
365 ATTRIB_UNIQUE_ID,
366 ATTRIB_PRODUCT_ID,
367 ATTRIB_PRODUCT_REVISON, // deprecated
368 ATTRIB_CAPABILITIES = ATTRIB_PRODUCT_REVISON, // intentional aliasing
369 ATTRIB_FIRMWARE_VERSION, // deprecated
370 ATTRIB_FIRMWARE_BUILD_TIME,
371 ATTRIB_RADIO_FIRMWARE_BUILD_TIME,
372 ATTRIB_RADIO_DEVICE_ID0,
373 ATTRIB_RADIO_DEVICE_ID1,
374 ATTRIB_DONGLE_FIRMWARE_BUILD_TIME,
375 ATTRIB_BOARD_REVISION,
376 ATTRIB_BOOTLOADER_BUILD_TIME,
377 ATTRIB_CONNECTION_INTERVAL_IN_US,
378 ATTRIB_COUNT
379} ControllerAttributes;
380
381// Read-only string attributes of controllers (only add to this enum and never change the order)
382typedef enum
383{
384 ATTRIB_STR_BOARD_SERIAL,
385 ATTRIB_STR_UNIT_SERIAL,
386 ATTRIB_STR_COUNT
387} ControllerStringAttributes;
388
389typedef enum
390{
391 STATUS_CODE_NORMAL,
392 STATUS_CODE_CRITICAL_BATTERY,
393 STATUS_CODE_GYRO_INIT_ERROR,
394} ControllerStatusEventCodes;
395
396typedef enum
397{
398 STATUS_STATE_LOW_BATTERY=0,
399} ControllerStatusStateFlags;
400
401typedef enum {
402 TRACKPAD_ABSOLUTE_MOUSE,
403 TRACKPAD_RELATIVE_MOUSE,
404 TRACKPAD_DPAD_FOUR_WAY_DISCRETE,
405 TRACKPAD_DPAD_FOUR_WAY_OVERLAP,
406 TRACKPAD_DPAD_EIGHT_WAY,
407 TRACKPAD_RADIAL_MODE,
408 TRACKPAD_ABSOLUTE_DPAD,
409 TRACKPAD_NONE,
410 TRACKPAD_GESTURE_KEYBOARD,
411 TRACKPAD_NUM_MODES
412} TrackpadDPadMode;
413
414// Read-write controller settings (only add to this enum and never change the order)
415typedef enum
416{
417 SETTING_MOUSE_SENSITIVITY,
418 SETTING_MOUSE_ACCELERATION,
419 SETTING_TRACKBALL_ROTATION_ANGLE,
420 SETTING_HAPTIC_INTENSITY_UNUSED,
421 SETTING_LEFT_GAMEPAD_STICK_ENABLED,
422 SETTING_RIGHT_GAMEPAD_STICK_ENABLED,
423 SETTING_USB_DEBUG_MODE,
424 SETTING_LEFT_TRACKPAD_MODE,
425 SETTING_RIGHT_TRACKPAD_MODE,
426 SETTING_MOUSE_POINTER_ENABLED,
427
428 // 10
429 SETTING_DPAD_DEADZONE,
430 SETTING_MINIMUM_MOMENTUM_VEL,
431 SETTING_MOMENTUM_DECAY_AMOUNT,
432 SETTING_TRACKPAD_RELATIVE_MODE_TICKS_PER_PIXEL,
433 SETTING_HAPTIC_INCREMENT,
434 SETTING_DPAD_ANGLE_SIN,
435 SETTING_DPAD_ANGLE_COS,
436 SETTING_MOMENTUM_VERTICAL_DIVISOR,
437 SETTING_MOMENTUM_MAXIMUM_VELOCITY,
438 SETTING_TRACKPAD_Z_ON,
439
440 // 20
441 SETTING_TRACKPAD_Z_OFF,
442 SETTING_SENSITIVITY_SCALE_AMOUNT,
443 SETTING_LEFT_TRACKPAD_SECONDARY_MODE,
444 SETTING_RIGHT_TRACKPAD_SECONDARY_MODE,
445 SETTING_SMOOTH_ABSOLUTE_MOUSE,
446 SETTING_STEAMBUTTON_POWEROFF_TIME,
447 SETTING_UNUSED_1,
448 SETTING_TRACKPAD_OUTER_RADIUS,
449 SETTING_TRACKPAD_Z_ON_LEFT,
450 SETTING_TRACKPAD_Z_OFF_LEFT,
451
452 // 30
453 SETTING_TRACKPAD_OUTER_SPIN_VEL,
454 SETTING_TRACKPAD_OUTER_SPIN_RADIUS,
455 SETTING_TRACKPAD_OUTER_SPIN_HORIZONTAL_ONLY,
456 SETTING_TRACKPAD_RELATIVE_MODE_DEADZONE,
457 SETTING_TRACKPAD_RELATIVE_MODE_MAX_VEL,
458 SETTING_TRACKPAD_RELATIVE_MODE_INVERT_Y,
459 SETTING_TRACKPAD_DOUBLE_TAP_BEEP_ENABLED,
460 SETTING_TRACKPAD_DOUBLE_TAP_BEEP_PERIOD,
461 SETTING_TRACKPAD_DOUBLE_TAP_BEEP_COUNT,
462 SETTING_TRACKPAD_OUTER_RADIUS_RELEASE_ON_TRANSITION,
463
464 // 40
465 SETTING_RADIAL_MODE_ANGLE,
466 SETTING_HAPTIC_INTENSITY_MOUSE_MODE,
467 SETTING_LEFT_DPAD_REQUIRES_CLICK,
468 SETTING_RIGHT_DPAD_REQUIRES_CLICK,
469 SETTING_LED_BASELINE_BRIGHTNESS,
470 SETTING_LED_USER_BRIGHTNESS,
471 SETTING_ENABLE_RAW_JOYSTICK,
472 SETTING_ENABLE_FAST_SCAN,
473 SETTING_IMU_MODE,
474 SETTING_WIRELESS_PACKET_VERSION,
475
476 // 50
477 SETTING_SLEEP_INACTIVITY_TIMEOUT,
478 SETTING_TRACKPAD_NOISE_THRESHOLD,
479 SETTING_LEFT_TRACKPAD_CLICK_PRESSURE,
480 SETTING_RIGHT_TRACKPAD_CLICK_PRESSURE,
481 SETTING_LEFT_BUMPER_CLICK_PRESSURE,
482 SETTING_RIGHT_BUMPER_CLICK_PRESSURE,
483 SETTING_LEFT_GRIP_CLICK_PRESSURE,
484 SETTING_RIGHT_GRIP_CLICK_PRESSURE,
485 SETTING_LEFT_GRIP2_CLICK_PRESSURE,
486 SETTING_RIGHT_GRIP2_CLICK_PRESSURE,
487
488 // 60
489 SETTING_PRESSURE_MODE,
490 SETTING_CONTROLLER_TEST_MODE,
491 SETTING_TRIGGER_MODE,
492 SETTING_TRACKPAD_Z_THRESHOLD,
493 SETTING_FRAME_RATE,
494 SETTING_TRACKPAD_FILT_CTRL,
495 SETTING_TRACKPAD_CLIP,
496 SETTING_DEBUG_OUTPUT_SELECT,
497 SETTING_TRIGGER_THRESHOLD_PERCENT,
498 SETTING_TRACKPAD_FREQUENCY_HOPPING,
499
500 // 70
501 SETTING_HAPTICS_ENABLED,
502 SETTING_STEAM_WATCHDOG_ENABLE,
503 SETTING_TIMP_TOUCH_THRESHOLD_ON,
504 SETTING_TIMP_TOUCH_THRESHOLD_OFF,
505 SETTING_FREQ_HOPPING,
506 SETTING_TEST_CONTROL,
507 SETTING_HAPTIC_MASTER_GAIN_DB,
508 SETTING_THUMB_TOUCH_THRESH,
509 SETTING_DEVICE_POWER_STATUS,
510 SETTING_HAPTIC_INTENSITY,
511
512 // 80
513 SETTING_STABILIZER_ENABLED,
514 SETTING_TIMP_MODE_MTE,
515 SETTING_COUNT,
516
517 // This is a special setting value use for callbacks and should not be set/get explicitly.
518 SETTING_ALL=0xFF
519} ControllerSettings;
520
521typedef enum
522{
523 SETTING_DEFAULT,
524 SETTING_MIN,
525 SETTING_MAX,
526 SETTING_DEFAULTMINMAXCOUNT
527} SettingDefaultMinMax;
528
529// Bitmask that define which IMU features to enable.
530typedef enum
531{
532 SETTING_GYRO_MODE_OFF = 0x0000,
533 SETTING_GYRO_MODE_STEERING = 0x0001,
534 SETTING_GYRO_MODE_TILT = 0x0002,
535 SETTING_GYRO_MODE_SEND_ORIENTATION = 0x0004,
536 SETTING_GYRO_MODE_SEND_RAW_ACCEL = 0x0008,
537 SETTING_GYRO_MODE_SEND_RAW_GYRO = 0x0010,
538} SettingGyroMode;
539
540// Bitmask for haptic pulse flags
541typedef enum
542{
543 HAPTIC_PULSE_NORMAL = 0x0000,
544 HAPTIC_PULSE_HIGH_PRIORITY = 0x0001,
545 HAPTIC_PULSE_VERY_HIGH_PRIORITY = 0x0002,
546 HAPTIC_PULSE_IGNORE_USER_PREFS = 0x0003,
547} SettingHapticPulseFlags;
548
549typedef struct
550{
551 // default,min,max in this array in that order
552 short defaultminmax[SETTING_DEFAULTMINMAXCOUNT];
553} SettingValueRange_t;
554
555// below is from controller_constants.c which should be compiled into any code that uses this
556extern const SettingValueRange_t g_DefaultSettingValues[SETTING_COUNT];
557
558// Read-write settings for dongle (only add to this enum and never change the order)
559typedef enum
560{
561 DONGLE_SETTING_MOUSE_KEYBOARD_ENABLED,
562 DONGLE_SETTING_COUNT,
563} DongleSettings;
564
565typedef enum
566{
567 AUDIO_STARTUP = 0,
568 AUDIO_SHUTDOWN = 1,
569 AUDIO_PAIR = 2,
570 AUDIO_PAIR_SUCCESS = 3,
571 AUDIO_IDENTIFY = 4,
572 AUDIO_LIZARDMODE = 5,
573 AUDIO_NORMALMODE = 6,
574
575 AUDIO_MAX_SLOT = 15
576} ControllerAudio;
577
578#ifdef __cplusplus
579}
580#endif
581
582#endif // _CONTROLLER_CONSTANTS_H
diff --git a/contrib/SDL-3.2.8/src/joystick/hidapi/steam/controller_structs.h b/contrib/SDL-3.2.8/src/joystick/hidapi/steam/controller_structs.h
new file mode 100644
index 0000000..ea2a352
--- /dev/null
+++ b/contrib/SDL-3.2.8/src/joystick/hidapi/steam/controller_structs.h
@@ -0,0 +1,463 @@
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 2020 Valve Corporation
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#ifndef _CONTROLLER_STRUCTS_
22#define _CONTROLLER_STRUCTS_
23
24#pragma pack(1)
25
26#define HID_FEATURE_REPORT_BYTES 64
27
28// Header for all host <==> target messages
29typedef struct
30{
31 unsigned char type;
32 unsigned char length;
33} FeatureReportHeader;
34
35// Generic controller settings structure
36typedef struct
37{
38 unsigned char settingNum;
39 unsigned short settingValue;
40} ControllerSetting;
41
42// Generic controller attribute structure
43typedef struct
44{
45 unsigned char attributeTag;
46 uint32_t attributeValue;
47} ControllerAttribute;
48
49// Generic controller settings structure
50typedef struct
51{
52 ControllerSetting settings[ ( HID_FEATURE_REPORT_BYTES - sizeof( FeatureReportHeader ) ) / sizeof( ControllerSetting ) ];
53} MsgSetSettingsValues, MsgGetSettingsValues, MsgGetSettingsDefaults, MsgGetSettingsMaxs;
54
55// Generic controller settings structure
56typedef struct
57{
58 ControllerAttribute attributes[ ( HID_FEATURE_REPORT_BYTES - sizeof( FeatureReportHeader ) ) / sizeof( ControllerAttribute ) ];
59} MsgGetAttributes;
60
61typedef struct
62{
63 unsigned char attributeTag;
64 char attributeValue[20];
65} MsgGetStringAttribute;
66
67typedef struct
68{
69 unsigned char mode;
70} MsgSetControllerMode;
71
72// Trigger a haptic pulse
73typedef struct {
74 unsigned char which_pad;
75 unsigned short pulse_duration;
76 unsigned short pulse_interval;
77 unsigned short pulse_count;
78 short dBgain;
79 unsigned char priority;
80} MsgFireHapticPulse;
81
82typedef struct {
83 uint8_t mode;
84} MsgHapticSetMode;
85
86typedef enum {
87 HAPTIC_TYPE_OFF,
88 HAPTIC_TYPE_TICK,
89 HAPTIC_TYPE_CLICK,
90 HAPTIC_TYPE_TONE,
91 HAPTIC_TYPE_RUMBLE,
92 HAPTIC_TYPE_NOISE,
93 HAPTIC_TYPE_SCRIPT,
94 HAPTIC_TYPE_LOG_SWEEP,
95} haptic_type_t;
96
97typedef enum {
98 HAPTIC_INTENSITY_SYSTEM,
99 HAPTIC_INTENSITY_SHORT,
100 HAPTIC_INTENSITY_MEDIUM,
101 HAPTIC_INTENSITY_LONG,
102 HAPTIC_INTENSITY_INSANE,
103} haptic_intensity_t;
104
105typedef struct {
106 uint8_t side; // 0x01 = L, 0x02 = R, 0x03 = Both
107 uint8_t cmd; // 0 = Off, 1 = tick, 2 = click, 3 = tone, 4 = rumble, 5 =
108 // rumble_noise, 6 = script, 7 = sweep,
109 uint8_t ui_intensity; // 0-4 (0 = default)
110 int8_t dBgain; // dB Can be positive (reasonable clipping / limiting will apply)
111 uint16_t freq; // Frequency of tone (if applicable)
112 int16_t dur_ms; // Duration of tone / rumble (if applicable) (neg = infinite)
113
114 uint16_t noise_intensity;
115 uint16_t lfo_freq; // Drives both tone and rumble geneators
116 uint8_t lfo_depth; // percentage, typically 100
117 uint8_t rand_tone_gain; // Randomize each LFO cycle's gain
118 uint8_t script_id; // Used w/ dBgain for scripted haptics
119
120 uint16_t lss_start_freq; // Used w/ Log Sine Sweep
121 uint16_t lss_end_freq; // Ditto
122} MsgTriggerHaptic;
123
124typedef struct {
125 uint8_t unRumbleType;
126 uint16_t unIntensity;
127 uint16_t unLeftMotorSpeed;
128 uint16_t unRightMotorSpeed;
129 int8_t nLeftGain;
130 int8_t nRightGain;
131} MsgSimpleRumbleCmd;
132
133// This is the only message struct that application code should use to interact with feature request messages. Any new
134// messages should be added to the union. The structures defined here should correspond to the ones defined in
135// ValveDeviceCore.cpp.
136//
137typedef struct
138{
139 FeatureReportHeader header;
140 union
141 {
142 MsgSetSettingsValues setSettingsValues;
143 MsgGetSettingsValues getSettingsValues;
144 MsgGetSettingsMaxs getSettingsMaxs;
145 MsgGetSettingsDefaults getSettingsDefaults;
146 MsgGetAttributes getAttributes;
147 MsgSetControllerMode controllerMode;
148 MsgFireHapticPulse fireHapticPulse;
149 MsgGetStringAttribute getStringAttribute;
150 MsgHapticSetMode hapticMode;
151 MsgTriggerHaptic triggerHaptic;
152 MsgSimpleRumbleCmd simpleRumble;
153 } payload;
154
155} FeatureReportMsg;
156
157// Roll this version forward anytime that you are breaking compatibility of existing
158// message types within ValveInReport_t or the header itself. Hopefully this should
159// be super rare and instead you should just add new message payloads to the union,
160// or just add fields to the end of existing payload structs which is expected to be
161// safe in all code consuming these as they should just consume/copy up to the prior size
162// they were aware of when processing.
163#define k_ValveInReportMsgVersion 0x01
164
165typedef enum
166{
167 ID_CONTROLLER_STATE = 1,
168 ID_CONTROLLER_DEBUG = 2,
169 ID_CONTROLLER_WIRELESS = 3,
170 ID_CONTROLLER_STATUS = 4,
171 ID_CONTROLLER_DEBUG2 = 5,
172 ID_CONTROLLER_SECONDARY_STATE = 6,
173 ID_CONTROLLER_BLE_STATE = 7,
174 ID_CONTROLLER_DECK_STATE = 9,
175 ID_CONTROLLER_MSG_COUNT
176} ValveInReportMessageIDs;
177
178typedef struct
179{
180 unsigned short unReportVersion;
181
182 unsigned char ucType;
183 unsigned char ucLength;
184
185} ValveInReportHeader_t;
186
187// State payload
188typedef struct
189{
190 // If packet num matches that on your prior call, then the controller state hasn't been changed since
191 // your last call and there is no need to process it
192 Uint32 unPacketNum;
193
194 // Button bitmask and trigger data.
195 union
196 {
197 Uint64 ulButtons;
198 struct
199 {
200 unsigned char _pad0[3];
201 unsigned char nLeft;
202 unsigned char nRight;
203 unsigned char _pad1[3];
204 } Triggers;
205 } ButtonTriggerData;
206
207 // Left pad coordinates
208 short sLeftPadX;
209 short sLeftPadY;
210
211 // Right pad coordinates
212 short sRightPadX;
213 short sRightPadY;
214
215 // This is redundant, packed above, but still sent over wired
216 unsigned short sTriggerL;
217 unsigned short sTriggerR;
218
219 // FIXME figure out a way to grab this stuff over wireless
220 short sAccelX;
221 short sAccelY;
222 short sAccelZ;
223
224 short sGyroX;
225 short sGyroY;
226 short sGyroZ;
227
228 short sGyroQuatW;
229 short sGyroQuatX;
230 short sGyroQuatY;
231 short sGyroQuatZ;
232
233} ValveControllerStatePacket_t;
234
235// BLE State payload this has to be re-formatted from the normal state because BLE controller shows up as
236//a HID device and we don't want to send all the optional parts of the message. Keep in sync with struct above.
237typedef struct
238{
239 // If packet num matches that on your prior call, then the controller state hasn't been changed since
240 // your last call and there is no need to process it
241 Uint32 unPacketNum;
242
243 // Button bitmask and trigger data.
244 union
245 {
246 Uint64 ulButtons;
247 struct
248 {
249 unsigned char _pad0[3];
250 unsigned char nLeft;
251 unsigned char nRight;
252 unsigned char _pad1[3];
253 } Triggers;
254 } ButtonTriggerData;
255
256 // Left pad coordinates
257 short sLeftPadX;
258 short sLeftPadY;
259
260 // Right pad coordinates
261 short sRightPadX;
262 short sRightPadY;
263
264 //This mimcs how the dongle reconstitutes HID packets, there will be 0-4 shorts depending on gyro mode
265 unsigned char ucGyroDataType; //TODO could maybe find some unused bits in the button field for this info (is only 2bits)
266 short sGyro[4];
267
268} ValveControllerBLEStatePacket_t;
269
270// Define a payload for reporting debug information
271typedef struct
272{
273 // Left pad coordinates
274 short sLeftPadX;
275 short sLeftPadY;
276
277 // Right pad coordinates
278 short sRightPadX;
279 short sRightPadY;
280
281 // Left mouse deltas
282 short sLeftPadMouseDX;
283 short sLeftPadMouseDY;
284
285 // Right mouse deltas
286 short sRightPadMouseDX;
287 short sRightPadMouseDY;
288
289 // Left mouse filtered deltas
290 short sLeftPadMouseFilteredDX;
291 short sLeftPadMouseFilteredDY;
292
293 // Right mouse filtered deltas
294 short sRightPadMouseFilteredDX;
295 short sRightPadMouseFilteredDY;
296
297 // Pad Z values
298 unsigned char ucLeftZ;
299 unsigned char ucRightZ;
300
301 // FingerPresent
302 unsigned char ucLeftFingerPresent;
303 unsigned char ucRightFingerPresent;
304
305 // Timestamps
306 unsigned char ucLeftTimestamp;
307 unsigned char ucRightTimestamp;
308
309 // Double tap state
310 unsigned char ucLeftTapState;
311 unsigned char ucRightTapState;
312
313 unsigned int unDigitalIOStates0;
314 unsigned int unDigitalIOStates1;
315
316} ValveControllerDebugPacket_t;
317
318typedef struct
319{
320 unsigned char ucPadNum;
321 unsigned char ucPad[3]; // need Data to be word aligned
322 short Data[20];
323 unsigned short unNoise;
324} ValveControllerTrackpadImage_t;
325
326typedef struct
327{
328 unsigned char ucPadNum;
329 unsigned char ucOffset;
330 unsigned char ucPad[2]; // need Data to be word aligned
331 short rgData[28];
332} ValveControllerRawTrackpadImage_t;
333
334// Payload for wireless metadata
335typedef struct
336{
337 unsigned char ucEventType;
338} SteamControllerWirelessEvent_t;
339
340typedef struct
341{
342 // Current packet number.
343 unsigned int unPacketNum;
344
345 // Event codes and state information.
346 unsigned short sEventCode;
347 unsigned short unStateFlags;
348
349 // Current battery voltage (mV).
350 unsigned short sBatteryVoltage;
351
352 // Current battery level (0-100).
353 unsigned char ucBatteryLevel;
354} SteamControllerStatusEvent_t;
355
356// Deck State payload
357typedef struct
358{
359 // If packet num matches that on your prior call, then the controller
360 // state hasn't been changed since your last call and there is no need to
361 // process it
362 Uint32 unPacketNum;
363
364 // Button bitmask and trigger data.
365 union
366 {
367 Uint64 ulButtons;
368 struct
369 {
370 Uint32 ulButtonsL;
371 Uint32 ulButtonsH;
372 };
373 };
374
375 // Left pad coordinates
376 short sLeftPadX;
377 short sLeftPadY;
378
379 // Right pad coordinates
380 short sRightPadX;
381 short sRightPadY;
382
383 // Accelerometer values
384 short sAccelX;
385 short sAccelY;
386 short sAccelZ;
387
388 // Gyroscope values
389 short sGyroX;
390 short sGyroY;
391 short sGyroZ;
392
393 // Gyro quaternions
394 short sGyroQuatW;
395 short sGyroQuatX;
396 short sGyroQuatY;
397 short sGyroQuatZ;
398
399 // Uncalibrated trigger values
400 unsigned short sTriggerRawL;
401 unsigned short sTriggerRawR;
402
403 // Left stick values
404 short sLeftStickX;
405 short sLeftStickY;
406
407 // Right stick values
408 short sRightStickX;
409 short sRightStickY;
410
411 // Touchpad pressures
412 unsigned short sPressurePadLeft;
413 unsigned short sPressurePadRight;
414} SteamDeckStatePacket_t;
415
416typedef struct
417{
418 ValveInReportHeader_t header;
419
420 union
421 {
422 ValveControllerStatePacket_t controllerState;
423 ValveControllerBLEStatePacket_t controllerBLEState;
424 ValveControllerDebugPacket_t debugState;
425 ValveControllerTrackpadImage_t padImage;
426 ValveControllerRawTrackpadImage_t rawPadImage;
427 SteamControllerWirelessEvent_t wirelessEvent;
428 SteamControllerStatusEvent_t statusEvent;
429 SteamDeckStatePacket_t deckState;
430 } payload;
431
432} ValveInReport_t;
433
434
435// Enumeration for BLE packet protocol
436enum EBLEPacketReportNums
437{
438 // Skipping past 2-3 because they are escape characters in Uart protocol
439 k_EBLEReportState = 4,
440 k_EBLEReportStatus = 5,
441};
442
443
444// Enumeration of data chunks in BLE state packets
445enum EBLEOptionDataChunksBitmask
446{
447 // First byte upper nibble
448 k_EBLEButtonChunk1 = 0x10,
449 k_EBLEButtonChunk2 = 0x20,
450 k_EBLEButtonChunk3 = 0x40,
451 k_EBLELeftJoystickChunk = 0x80,
452
453 // Second full byte
454 k_EBLELeftTrackpadChunk = 0x100,
455 k_EBLERightTrackpadChunk = 0x200,
456 k_EBLEIMUAccelChunk = 0x400,
457 k_EBLEIMUGyroChunk = 0x800,
458 k_EBLEIMUQuatChunk = 0x1000,
459};
460
461#pragma pack()
462
463#endif // _CONTROLLER_STRUCTS