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
28 extern "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)
40 enum 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 
52 // This enum contains all of the messages exchanged between the host and the target (only add to this enum and never change the order)
53 enum FeatureReportMessageIDs
54 {
55 	ID_SET_DIGITAL_MAPPINGS              = 0x80,
56 	ID_CLEAR_DIGITAL_MAPPINGS            = 0x81,
57 	ID_GET_DIGITAL_MAPPINGS              = 0x82,
58 	ID_GET_ATTRIBUTES_VALUES             = 0x83,
59 	ID_GET_ATTRIBUTE_LABEL               = 0x84,
60 	ID_SET_DEFAULT_DIGITAL_MAPPINGS      = 0x85,
61 	ID_FACTORY_RESET                     = 0x86,
62 	ID_SET_SETTINGS_VALUES               = 0x87,
63 	ID_CLEAR_SETTINGS_VALUES             = 0x88,
64 	ID_GET_SETTINGS_VALUES               = 0x89,
65 	ID_GET_SETTING_LABEL                 = 0x8A,
66 	ID_GET_SETTINGS_MAXS                 = 0x8B,
67 	ID_GET_SETTINGS_DEFAULTS             = 0x8C,
68 	ID_SET_CONTROLLER_MODE               = 0x8D,
69 	ID_LOAD_DEFAULT_SETTINGS             = 0x8E,
70 	ID_TRIGGER_HAPTIC_PULSE              = 0x8F,
71 	ID_TURN_OFF_CONTROLLER               = 0x9F,
72 
73 	ID_GET_DEVICE_INFO                   = 0xA1,
74 
75 	ID_CALIBRATE_TRACKPADS               = 0xA7,
76 	ID_RESERVED_0                        = 0xA8,
77 	ID_SET_SERIAL_NUMBER                 = 0xA9,
78 	ID_GET_TRACKPAD_CALIBRATION          = 0xAA,
79 	ID_GET_TRACKPAD_FACTORY_CALIBRATION  = 0xAB,
80 	ID_GET_TRACKPAD_RAW_DATA             = 0xAC,
81 	ID_ENABLE_PAIRING                    = 0xAD,
82 	ID_GET_STRING_ATTRIBUTE              = 0xAE,
83 	ID_RADIO_ERASE_RECORDS               = 0xAF,
84 	ID_RADIO_WRITE_RECORD                = 0xB0,
85 	ID_SET_DONGLE_SETTING                = 0xB1,
86 	ID_DONGLE_DISCONNECT_DEVICE          = 0xB2,
87 	ID_DONGLE_COMMIT_DEVICE              = 0xB3,
88 	ID_DONGLE_GET_WIRELESS_STATE         = 0xB4,
89 	ID_CALIBRATE_GYRO                    = 0xB5,
90 	ID_PLAY_AUDIO                        = 0xB6,
91 	ID_AUDIO_UPDATE_START                = 0xB7,
92 	ID_AUDIO_UPDATE_DATA                 = 0xB8,
93 	ID_AUDIO_UPDATE_COMPLETE             = 0xB9,
94 	ID_GET_CHIPID                        = 0xBA,
95 
96 	ID_CALIBRATE_JOYSTICK                = 0xBF,
97 	ID_CALIBRATE_ANALOG_TRIGGERS         = 0xC0,
98 	ID_SET_AUDIO_MAPPING                 = 0xC1,
99 	ID_CHECK_GYRO_FW_LOAD                = 0xC2,
100 	ID_CALIBRATE_ANALOG                  = 0xC3,
101 	ID_DONGLE_GET_CONNECTED_SLOTS        = 0xC4,
102 };
103 
104 
105 // Enumeration of all wireless dongle events
106 typedef enum WirelessEventTypes
107 {
108 	WIRELESS_EVENT_DISCONNECT	= 1,
109 	WIRELESS_EVENT_CONNECT		= 2,
110 	WIRELESS_EVENT_PAIR			= 3,
111 } EWirelessEventType;
112 
113 
114 // 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)
115 typedef enum
116 {
117 	IO_DIGITAL_BUTTON_NONE = -1,
118 	IO_DIGITAL_BUTTON_RIGHT_TRIGGER,
119 	IO_DIGITAL_BUTTON_LEFT_TRIGGER,
120 	IO_DIGITAL_BUTTON_1,
121 	IO_DIGITAL_BUTTON_Y=IO_DIGITAL_BUTTON_1,
122 	IO_DIGITAL_BUTTON_2,
123 	IO_DIGITAL_BUTTON_B=IO_DIGITAL_BUTTON_2,
124 	IO_DIGITAL_BUTTON_3,
125 	IO_DIGITAL_BUTTON_X=IO_DIGITAL_BUTTON_3,
126 	IO_DIGITAL_BUTTON_4,
127 	IO_DIGITAL_BUTTON_A=IO_DIGITAL_BUTTON_4,
128 	IO_DIGITAL_BUTTON_RIGHT_BUMPER,
129 	IO_DIGITAL_BUTTON_LEFT_BUMPER,
130 	IO_DIGITAL_BUTTON_LEFT_JOYSTICK_CLICK,
131 	IO_DIGITAL_BUTTON_ESCAPE,
132 	IO_DIGITAL_BUTTON_STEAM,
133 	IO_DIGITAL_BUTTON_MENU,
134 	IO_DIGITAL_STICK_UP,
135 	IO_DIGITAL_STICK_DOWN,
136 	IO_DIGITAL_STICK_LEFT,
137 	IO_DIGITAL_STICK_RIGHT,
138 	IO_DIGITAL_TOUCH_1,
139 	IO_DIGITAL_BUTTON_UP=IO_DIGITAL_TOUCH_1,
140 	IO_DIGITAL_TOUCH_2,
141 	IO_DIGITAL_BUTTON_RIGHT=IO_DIGITAL_TOUCH_2,
142 	IO_DIGITAL_TOUCH_3,
143 	IO_DIGITAL_BUTTON_LEFT=IO_DIGITAL_TOUCH_3,
144 	IO_DIGITAL_TOUCH_4,
145 	IO_DIGITAL_BUTTON_DOWN=IO_DIGITAL_TOUCH_4,
146 	IO_DIGITAL_BUTTON_BACK_LEFT,
147 	IO_DIGITAL_BUTTON_BACK_RIGHT,
148 	IO_DIGITAL_LEFT_TRACKPAD_N,
149 	IO_DIGITAL_LEFT_TRACKPAD_NE,
150 	IO_DIGITAL_LEFT_TRACKPAD_E,
151 	IO_DIGITAL_LEFT_TRACKPAD_SE,
152 	IO_DIGITAL_LEFT_TRACKPAD_S,
153 	IO_DIGITAL_LEFT_TRACKPAD_SW,
154 	IO_DIGITAL_LEFT_TRACKPAD_W,
155 	IO_DIGITAL_LEFT_TRACKPAD_NW,
156 	IO_DIGITAL_RIGHT_TRACKPAD_N,
157 	IO_DIGITAL_RIGHT_TRACKPAD_NE,
158 	IO_DIGITAL_RIGHT_TRACKPAD_E,
159 	IO_DIGITAL_RIGHT_TRACKPAD_SE,
160 	IO_DIGITAL_RIGHT_TRACKPAD_S,
161 	IO_DIGITAL_RIGHT_TRACKPAD_SW,
162 	IO_DIGITAL_RIGHT_TRACKPAD_W,
163 	IO_DIGITAL_RIGHT_TRACKPAD_NW,
164 	IO_DIGITAL_LEFT_TRACKPAD_DOUBLE_TAP,
165 	IO_DIGITAL_RIGHT_TRACKPAD_DOUBLE_TAP,
166 	IO_DIGITAL_LEFT_TRACKPAD_OUTER_RADIUS,
167 	IO_DIGITAL_RIGHT_TRACKPAD_OUTER_RADIUS,
168 	IO_DIGITAL_LEFT_TRACKPAD_CLICK,
169 	IO_DIGITAL_RIGHT_TRACKPAD_CLICK,
170 	IO_DIGITAL_BATTERY_LOW,
171 	IO_DIGITAL_LEFT_TRIGGER_THRESHOLD,
172 	IO_DIGITAL_RIGHT_TRIGGER_THRESHOLD,
173 	IO_DIGITAL_BUTTON_BACK_LEFT2,
174 	IO_DIGITAL_BUTTON_BACK_RIGHT2,
175 	IO_DIGITAL_BUTTON_ALWAYS_ON,
176 	IO_DIGITAL_BUTTON_ANCILLARY_1,
177 	IO_DIGITAL_BUTTON_MACRO_0,
178 	IO_DIGITAL_BUTTON_MACRO_1,
179 	IO_DIGITAL_BUTTON_MACRO_2,
180 	IO_DIGITAL_BUTTON_MACRO_3,
181 	IO_DIGITAL_BUTTON_MACRO_4,
182 	IO_DIGITAL_BUTTON_MACRO_5,
183 	IO_DIGITAL_BUTTON_MACRO_6,
184 	IO_DIGITAL_BUTTON_MACRO_7,
185 	IO_DIGITAL_BUTTON_MACRO_1FINGER,
186 	IO_DIGITAL_BUTTON_MACRO_2FINGER,
187 	IO_DIGITAL_COUNT
188 } DigitalIO ;
189 
190 // 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)
191 typedef enum
192 {
193 	IO_ANALOG_LEFT_STICK_X,
194 	IO_ANALOG_LEFT_STICK_Y,
195 	IO_ANALOG_RIGHT_STICK_X,
196 	IO_ANALOG_RIGHT_STICK_Y,
197 	IO_ANALOG_LEFT_TRIGGER,
198 	IO_ANALOG_RIGHT_TRIGGER,
199 	IO_MOUSE1_X,
200 	IO_MOUSE1_Y,
201 	IO_MOUSE1_Z,
202 	IO_ACCEL_X,
203 	IO_ACCEL_Y,
204 	IO_ACCEL_Z,
205 	IO_GYRO_X,
206 	IO_GYRO_Y,
207 	IO_GYRO_Z,
208 	IO_GYRO_QUAT_W,
209 	IO_GYRO_QUAT_X,
210 	IO_GYRO_QUAT_Y,
211 	IO_GYRO_QUAT_Z,
212 	IO_GYRO_STEERING_VEC,
213 	IO_RAW_TRIGGER_LEFT,
214 	IO_RAW_TRIGGER_RIGHT,
215 	IO_RAW_JOYSTICK_X,
216 	IO_RAW_JOYSTICK_Y,
217 	IO_GYRO_TILT_VEC,
218 	IO_ANALOG_COUNT
219 } AnalogIO;
220 
221 
222 // Contains list of all types of devices that the controller emulates (only add to this enum and never change the order)
223 enum DeviceTypes
224 {
225 	DEVICE_KEYBOARD,
226 	DEVICE_MOUSE,
227 	DEVICE_GAMEPAD,
228 	DEVICE_MODE_ADJUST,
229 	DEVICE_COUNT
230 };
231 
232 // Scan codes for HID keyboards
233 enum HIDKeyboardKeys
234 {
235 	KEY_INVALID,
236 	KEY_FIRST = 0x04,
237 	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,
238 	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,
239 	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,
240 	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,
241 	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,
242 	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,
243 	KEY_KEYPAD_8, KEY_KEYPAD_9, KEY_KEYPAD_0, KEY_KEYPAD_PERIOD,
244 	KEY_LALT,
245     KEY_LSHIFT,
246     KEY_LWIN,
247     KEY_LCONTROL,
248     KEY_RALT,
249     KEY_RSHIFT,
250     KEY_RWIN,
251     KEY_RCONTROL,
252 	KEY_VOLUP,
253 	KEY_VOLDOWN,
254 	KEY_MUTE,
255 	KEY_PLAY,
256 	KEY_STOP,
257 	KEY_NEXT,
258 	KEY_PREV,
259     KEY_LAST = KEY_PREV
260 };
261 
262 enum ModifierMasks
263 {
264   KEY_LCONTROL_MASK = (1<<0),
265   KEY_LSHIFT_MASK = (1<<1),
266   KEY_LALT_MASK = (1<<2),
267   KEY_LWIN_MASK = (1<<3),
268   KEY_RCONTROL_MASK = (1<<4),
269   KEY_RSHIFT_MASK = (1<<5),
270   KEY_RALT_MASK = (1<<6),
271   KEY_RWIN_MASK = (1<<7)
272 };
273 
274 // Standard mouse buttons as specified in the HID mouse spec
275 enum MouseButtons
276 {
277 	MOUSE_BTN_LEFT,
278 	MOUSE_BTN_RIGHT,
279 	MOUSE_BTN_MIDDLE,
280 	MOUSE_BTN_BACK,
281 	MOUSE_BTN_FORWARD,
282 	MOUSE_SCROLL_UP,
283 	MOUSE_SCROLL_DOWN,
284 	MOUSE_BTN_COUNT
285 };
286 
287 // Gamepad buttons
288 enum GamepadButtons
289 {
290 	GAMEPAD_BTN_TRIGGER_LEFT=1,
291 	GAMEPAD_BTN_TRIGGER_RIGHT,
292 	GAMEPAD_BTN_A,
293 	GAMEPAD_BTN_B,
294 	GAMEPAD_BTN_Y,
295 	GAMEPAD_BTN_X,
296 	GAMEPAD_BTN_SHOULDER_LEFT,
297 	GAMEPAD_BTN_SHOULDER_RIGHT,
298 	GAMEPAD_BTN_LEFT_JOYSTICK,
299 	GAMEPAD_BTN_RIGHT_JOYSTICK,
300 	GAMEPAD_BTN_START,
301 	GAMEPAD_BTN_SELECT,
302 	GAMEPAD_BTN_STEAM,
303 	GAMEPAD_BTN_DPAD_UP,
304 	GAMEPAD_BTN_DPAD_DOWN,
305 	GAMEPAD_BTN_DPAD_LEFT,
306 	GAMEPAD_BTN_DPAD_RIGHT,
307 	GAMEPAD_BTN_LSTICK_UP,
308 	GAMEPAD_BTN_LSTICK_DOWN,
309 	GAMEPAD_BTN_LSTICK_LEFT,
310 	GAMEPAD_BTN_LSTICK_RIGHT,
311 	GAMEPAD_BTN_RSTICK_UP,
312 	GAMEPAD_BTN_RSTICK_DOWN,
313 	GAMEPAD_BTN_RSTICK_LEFT,
314 	GAMEPAD_BTN_RSTICK_RIGHT,
315 	GAMEPAD_BTN_COUNT
316 };
317 
318 // Mode adjust
319 enum ModeAdjustModes
320 {
321 	MODE_ADJUST_SENSITITY=1,
322 	MODE_ADJUST_LEFT_PAD_SECONDARY_MODE,
323 	MODE_ADJUST_RIGHT_PAD_SECONDARY_MODE,
324 	MODE_ADJUST_COUNT
325 };
326 
327 // Read-only attributes of controllers (only add to this enum and never change the order)
328 typedef enum
329 {
330 	ATTRIB_UNIQUE_ID,
331 	ATTRIB_PRODUCT_ID,
332 	ATTRIB_PRODUCT_REVISON,											// deprecated
333 	ATTRIB_CAPABILITIES = ATTRIB_PRODUCT_REVISON,	// intentional aliasing
334 	ATTRIB_FIRMWARE_VERSION,										// deprecated
335 	ATTRIB_FIRMWARE_BUILD_TIME,
336 	ATTRIB_RADIO_FIRMWARE_BUILD_TIME,
337 	ATTRIB_RADIO_DEVICE_ID0,
338 	ATTRIB_RADIO_DEVICE_ID1,
339 	ATTRIB_DONGLE_FIRMWARE_BUILD_TIME,
340 	ATTRIB_BOARD_REVISION,
341 	ATTRIB_BOOTLOADER_BUILD_TIME,
342 	ATTRIB_CONNECTION_INTERVAL_IN_US,
343 	ATTRIB_COUNT
344 } ControllerAttributes;
345 
346 // Read-only string attributes of controllers (only add to this enum and never change the order)
347 typedef enum
348 {
349 	ATTRIB_STR_BOARD_SERIAL,
350 	ATTRIB_STR_UNIT_SERIAL,
351 	ATTRIB_STR_COUNT
352 } ControllerStringAttributes;
353 
354 typedef enum
355 {
356 	STATUS_CODE_NORMAL,
357 	STATUS_CODE_CRITICAL_BATTERY,
358 	STATUS_CODE_GYRO_INIT_ERROR,
359 } ControllerStatusEventCodes;
360 
361 typedef enum
362 {
363 	STATUS_STATE_LOW_BATTERY=0,
364 } ControllerStatusStateFlags;
365 
366 typedef enum {
367 	TRACKPAD_ABSOLUTE_MOUSE,
368 	TRACKPAD_RELATIVE_MOUSE,
369 	TRACKPAD_DPAD_FOUR_WAY_DISCRETE,
370 	TRACKPAD_DPAD_FOUR_WAY_OVERLAP,
371 	TRACKPAD_DPAD_EIGHT_WAY,
372 	TRACKPAD_RADIAL_MODE,
373 	TRACKPAD_ABSOLUTE_DPAD,
374 	TRACKPAD_NONE,
375 	TRACKPAD_GESTURE_KEYBOARD,
376 	TRACKPAD_NUM_MODES
377 } TrackpadDPadMode;
378 
379 // Read-write controller settings (only add to this enum and never change the order)
380 typedef enum
381 {
382 	SETTING_MOUSE_SENSITIVITY,
383 	SETTING_MOUSE_ACCELERATION,
384 	SETTING_TRACKBALL_ROTATION_ANGLE,
385 	SETTING_HAPTIC_INTENSITY,
386 	SETTING_LEFT_GAMEPAD_STICK_ENABLED,
387 	SETTING_RIGHT_GAMEPAD_STICK_ENABLED,
388 	SETTING_USB_DEBUG_MODE,
389 	SETTING_LEFT_TRACKPAD_MODE,
390 	SETTING_RIGHT_TRACKPAD_MODE,
391 	SETTING_MOUSE_POINTER_ENABLED,
392 	SETTING_DPAD_DEADZONE,
393 	SETTING_MINIMUM_MOMENTUM_VEL,
394 	SETTING_MOMENTUM_DECAY_AMMOUNT,
395 	SETTING_TRACKPAD_RELATIVE_MODE_TICKS_PER_PIXEL,
396 	SETTING_HAPTIC_INCREMENT,
397 	SETTING_DPAD_ANGLE_SIN,
398 	SETTING_DPAD_ANGLE_COS,
399 	SETTING_MOMENTUM_VERTICAL_DIVISOR,
400 	SETTING_MOMENTUM_MAXIMUM_VELOCITY,
401 	SETTING_TRACKPAD_Z_ON,
402 	SETTING_TRACKPAD_Z_OFF,
403 	SETTING_SENSITIVY_SCALE_AMMOUNT,
404 	SETTING_LEFT_TRACKPAD_SECONDARY_MODE,
405 	SETTING_RIGHT_TRACKPAD_SECONDARY_MODE,
406 	SETTING_SMOOTH_ABSOLUTE_MOUSE,
407 	SETTING_STEAMBUTTON_POWEROFF_TIME,
408 	SETTING_UNUSED_1,
409 	SETTING_TRACKPAD_OUTER_RADIUS,
410 	SETTING_TRACKPAD_Z_ON_LEFT,
411 	SETTING_TRACKPAD_Z_OFF_LEFT,
412 	SETTING_TRACKPAD_OUTER_SPIN_VEL,
413 	SETTING_TRACKPAD_OUTER_SPIN_RADIUS,
414 	SETTING_TRACKPAD_OUTER_SPIN_HORIZONTAL_ONLY,
415 	SETTING_TRACKPAD_RELATIVE_MODE_DEADZONE,
416 	SETTING_TRACKPAD_RELATIVE_MODE_MAX_VEL,
417 	SETTING_TRACKPAD_RELATIVE_MODE_INVERT_Y,
418 	SETTING_TRACKPAD_DOUBLE_TAP_BEEP_ENABLED,
419 	SETTING_TRACKPAD_DOUBLE_TAP_BEEP_PERIOD,
420 	SETTING_TRACKPAD_DOUBLE_TAP_BEEP_COUNT,
421 	SETTING_TRACKPAD_OUTER_RADIUS_RELEASE_ON_TRANSITION,
422 	SETTING_RADIAL_MODE_ANGLE,
423 	SETTING_HAPTIC_INTENSITY_MOUSE_MODE,
424 	SETTING_LEFT_DPAD_REQUIRES_CLICK,
425 	SETTING_RIGHT_DPAD_REQUIRES_CLICK,
426 	SETTING_LED_BASELINE_BRIGHTNESS,
427 	SETTING_LED_USER_BRIGHTNESS,
428 	SETTING_ENABLE_RAW_JOYSTICK,
429 	SETTING_ENABLE_FAST_SCAN,
430 	SETTING_GYRO_MODE,
431 	SETTING_WIRELESS_PACKET_VERSION,
432 	SETTING_SLEEP_INACTIVITY_TIMEOUT,
433 	SETTING_COUNT,
434 
435 	// This is a special setting value use for callbacks and should not be set/get explicitly.
436 	SETTING_ALL=0xFF
437 } ControllerSettings;
438 
439 typedef enum
440 {
441 	SETTING_DEFAULT,
442 	SETTING_MIN,
443 	SETTING_MAX,
444 	SETTING_DEFAULTMINMAXCOUNT
445 } SettingDefaultMinMax;
446 
447 // Bitmask that define which IMU features to enable.
448 typedef enum
449 {
450 	SETTING_GYRO_MODE_OFF				= 0x0000,
451 	SETTING_GYRO_MODE_STEERING			= 0x0001,
452 	SETTING_GYRO_MODE_TILT				= 0x0002,
453 	SETTING_GYRO_MODE_SEND_ORIENTATION	= 0x0004,
454 	SETTING_GYRO_MODE_SEND_RAW_ACCEL	= 0x0008,
455 	SETTING_GYRO_MODE_SEND_RAW_GYRO		= 0x0010,
456 } SettingGyroMode;
457 
458 // Bitmask for haptic pulse flags
459 typedef enum
460 {
461 	HAPTIC_PULSE_NORMAL					= 0x0000,
462 	HAPTIC_PULSE_HIGH_PRIORITY			= 0x0001,
463 	HAPTIC_PULSE_VERY_HIGH_PRIORITY		= 0x0002,
464 } SettingHapticPulseFlags;
465 
466 typedef struct
467 {
468 	// default,min,max in this array in that order
469 	short defaultminmax[SETTING_DEFAULTMINMAXCOUNT];
470 } SettingValueRange_t;
471 
472 // below is from controller_constants.c which should be compiled into any code that uses this
473 extern const SettingValueRange_t g_DefaultSettingValues[SETTING_COUNT];
474 
475 // Read-write settings for dongle (only add to this enum and never change the order)
476 typedef enum
477 {
478 	DONGLE_SETTING_MOUSE_KEYBOARD_ENABLED,
479 	DONGLE_SETTING_COUNT,
480 } DongleSettings;
481 
482 typedef enum
483 {
484 	AUDIO_STARTUP		= 0,
485 	AUDIO_SHUTDOWN		= 1,
486 	AUDIO_PAIR			= 2,
487 	AUDIO_PAIR_SUCCESS	= 3,
488 	AUDIO_IDENTIFY		= 4,
489 	AUDIO_LIZARDMODE	= 5,
490 	AUDIO_NORMALMODE	= 6,
491 
492 	AUDIO_MAX_SLOT      = 15
493 } ControllerAudio;
494 
495 #ifdef __cplusplus
496 }
497 #endif
498 
499 #endif // _CONTROLLER_CONSTANTS_H
500