1 //====== Copyright 1996-2013, Valve Corporation, All rights reserved. =======
2 //
3 // Purpose: interface to valve controller
4 //
5 //=============================================================================
6 
7 #ifndef ISTEAMCONTROLLER_H
8 #define ISTEAMCONTROLLER_H
9 #ifdef _WIN32
10 #pragma once
11 #endif
12 
13 #include "isteamclient.h"
14 
15 #define STEAM_CONTROLLER_MAX_COUNT 16
16 
17 #define STEAM_CONTROLLER_MAX_ANALOG_ACTIONS 16
18 
19 #define STEAM_CONTROLLER_MAX_DIGITAL_ACTIONS 128
20 
21 #define STEAM_CONTROLLER_MAX_ORIGINS 8
22 
23 // When sending an option to a specific controller handle, you can send to all controllers via this command
24 #define STEAM_CONTROLLER_HANDLE_ALL_CONTROLLERS UINT64_MAX
25 
26 #define STEAM_CONTROLLER_MIN_ANALOG_ACTION_DATA -1.0f
27 #define STEAM_CONTROLLER_MAX_ANALOG_ACTION_DATA 1.0f
28 
29 enum ESteamControllerPad
30 {
31 	k_ESteamControllerPad_Left,
32 	k_ESteamControllerPad_Right
33 };
34 
35 enum EControllerSource
36 {
37 	k_EControllerSource_None,
38 	k_EControllerSource_LeftTrackpad,
39 	k_EControllerSource_RightTrackpad,
40 	k_EControllerSource_Joystick,
41 	k_EControllerSource_ABXY,
42 	k_EControllerSource_Switch,
43 	k_EControllerSource_LeftTrigger,
44 	k_EControllerSource_RightTrigger,
45 	k_EControllerSource_Gyro,
46 	k_EControllerSource_CenterTrackpad,		// PS4
47 	k_EControllerSource_RightJoystick,		// Traditional Controllers
48 	k_EControllerSource_DPad,				// Traditional Controllers
49 	k_EControllerSource_Key,                // Keyboards with scan codes
50 	k_EControllerSource_Mouse,              // Traditional mouse
51 	k_EControllerSource_Count
52 };
53 
54 enum EControllerSourceMode
55 {
56 	k_EControllerSourceMode_None,
57 	k_EControllerSourceMode_Dpad,
58 	k_EControllerSourceMode_Buttons,
59 	k_EControllerSourceMode_FourButtons,
60 	k_EControllerSourceMode_AbsoluteMouse,
61 	k_EControllerSourceMode_RelativeMouse,
62 	k_EControllerSourceMode_JoystickMove,
63 	k_EControllerSourceMode_JoystickMouse,
64 	k_EControllerSourceMode_JoystickCamera,
65 	k_EControllerSourceMode_ScrollWheel,
66 	k_EControllerSourceMode_Trigger,
67 	k_EControllerSourceMode_TouchMenu,
68 	k_EControllerSourceMode_MouseJoystick,
69 	k_EControllerSourceMode_MouseRegion,
70 	k_EControllerSourceMode_RadialMenu,
71 	k_EControllerSourceMode_SingleButton,
72 	k_EControllerSourceMode_Switches
73 };
74 
75 enum EControllerActionOrigin
76 {
77 	// Steam Controller
78 	k_EControllerActionOrigin_None,
79 	k_EControllerActionOrigin_A,
80 	k_EControllerActionOrigin_B,
81 	k_EControllerActionOrigin_X,
82 	k_EControllerActionOrigin_Y,
83 	k_EControllerActionOrigin_LeftBumper,
84 	k_EControllerActionOrigin_RightBumper,
85 	k_EControllerActionOrigin_LeftGrip,
86 	k_EControllerActionOrigin_RightGrip,
87 	k_EControllerActionOrigin_Start,
88 	k_EControllerActionOrigin_Back,
89 	k_EControllerActionOrigin_LeftPad_Touch,
90 	k_EControllerActionOrigin_LeftPad_Swipe,
91 	k_EControllerActionOrigin_LeftPad_Click,
92 	k_EControllerActionOrigin_LeftPad_DPadNorth,
93 	k_EControllerActionOrigin_LeftPad_DPadSouth,
94 	k_EControllerActionOrigin_LeftPad_DPadWest,
95 	k_EControllerActionOrigin_LeftPad_DPadEast,
96 	k_EControllerActionOrigin_RightPad_Touch,
97 	k_EControllerActionOrigin_RightPad_Swipe,
98 	k_EControllerActionOrigin_RightPad_Click,
99 	k_EControllerActionOrigin_RightPad_DPadNorth,
100 	k_EControllerActionOrigin_RightPad_DPadSouth,
101 	k_EControllerActionOrigin_RightPad_DPadWest,
102 	k_EControllerActionOrigin_RightPad_DPadEast,
103 	k_EControllerActionOrigin_LeftTrigger_Pull,
104 	k_EControllerActionOrigin_LeftTrigger_Click,
105 	k_EControllerActionOrigin_RightTrigger_Pull,
106 	k_EControllerActionOrigin_RightTrigger_Click,
107 	k_EControllerActionOrigin_LeftStick_Move,
108 	k_EControllerActionOrigin_LeftStick_Click,
109 	k_EControllerActionOrigin_LeftStick_DPadNorth,
110 	k_EControllerActionOrigin_LeftStick_DPadSouth,
111 	k_EControllerActionOrigin_LeftStick_DPadWest,
112 	k_EControllerActionOrigin_LeftStick_DPadEast,
113 	k_EControllerActionOrigin_Gyro_Move,
114 	k_EControllerActionOrigin_Gyro_Pitch,
115 	k_EControllerActionOrigin_Gyro_Yaw,
116 	k_EControllerActionOrigin_Gyro_Roll,
117 
118 	// PS4 Dual Shock
119 	k_EControllerActionOrigin_PS4_X,
120 	k_EControllerActionOrigin_PS4_Circle,
121 	k_EControllerActionOrigin_PS4_Triangle,
122 	k_EControllerActionOrigin_PS4_Square,
123 	k_EControllerActionOrigin_PS4_LeftBumper,
124 	k_EControllerActionOrigin_PS4_RightBumper,
125 	k_EControllerActionOrigin_PS4_Options,  //Start
126 	k_EControllerActionOrigin_PS4_Share,	//Back
127 	k_EControllerActionOrigin_PS4_LeftPad_Touch,
128 	k_EControllerActionOrigin_PS4_LeftPad_Swipe,
129 	k_EControllerActionOrigin_PS4_LeftPad_Click,
130 	k_EControllerActionOrigin_PS4_LeftPad_DPadNorth,
131 	k_EControllerActionOrigin_PS4_LeftPad_DPadSouth,
132 	k_EControllerActionOrigin_PS4_LeftPad_DPadWest,
133 	k_EControllerActionOrigin_PS4_LeftPad_DPadEast,
134 	k_EControllerActionOrigin_PS4_RightPad_Touch,
135 	k_EControllerActionOrigin_PS4_RightPad_Swipe,
136 	k_EControllerActionOrigin_PS4_RightPad_Click,
137 	k_EControllerActionOrigin_PS4_RightPad_DPadNorth,
138 	k_EControllerActionOrigin_PS4_RightPad_DPadSouth,
139 	k_EControllerActionOrigin_PS4_RightPad_DPadWest,
140 	k_EControllerActionOrigin_PS4_RightPad_DPadEast,
141 	k_EControllerActionOrigin_PS4_CenterPad_Touch,
142 	k_EControllerActionOrigin_PS4_CenterPad_Swipe,
143 	k_EControllerActionOrigin_PS4_CenterPad_Click,
144 	k_EControllerActionOrigin_PS4_CenterPad_DPadNorth,
145 	k_EControllerActionOrigin_PS4_CenterPad_DPadSouth,
146 	k_EControllerActionOrigin_PS4_CenterPad_DPadWest,
147 	k_EControllerActionOrigin_PS4_CenterPad_DPadEast,
148 	k_EControllerActionOrigin_PS4_LeftTrigger_Pull,
149 	k_EControllerActionOrigin_PS4_LeftTrigger_Click,
150 	k_EControllerActionOrigin_PS4_RightTrigger_Pull,
151 	k_EControllerActionOrigin_PS4_RightTrigger_Click,
152 	k_EControllerActionOrigin_PS4_LeftStick_Move,
153 	k_EControllerActionOrigin_PS4_LeftStick_Click,
154 	k_EControllerActionOrigin_PS4_LeftStick_DPadNorth,
155 	k_EControllerActionOrigin_PS4_LeftStick_DPadSouth,
156 	k_EControllerActionOrigin_PS4_LeftStick_DPadWest,
157 	k_EControllerActionOrigin_PS4_LeftStick_DPadEast,
158 	k_EControllerActionOrigin_PS4_RightStick_Move,
159 	k_EControllerActionOrigin_PS4_RightStick_Click,
160 	k_EControllerActionOrigin_PS4_RightStick_DPadNorth,
161 	k_EControllerActionOrigin_PS4_RightStick_DPadSouth,
162 	k_EControllerActionOrigin_PS4_RightStick_DPadWest,
163 	k_EControllerActionOrigin_PS4_RightStick_DPadEast,
164 	k_EControllerActionOrigin_PS4_DPad_North,
165 	k_EControllerActionOrigin_PS4_DPad_South,
166 	k_EControllerActionOrigin_PS4_DPad_West,
167 	k_EControllerActionOrigin_PS4_DPad_East,
168 	k_EControllerActionOrigin_PS4_Gyro_Move,
169 	k_EControllerActionOrigin_PS4_Gyro_Pitch,
170 	k_EControllerActionOrigin_PS4_Gyro_Yaw,
171 	k_EControllerActionOrigin_PS4_Gyro_Roll,
172 
173 	// XBox One
174 	k_EControllerActionOrigin_XBoxOne_A,
175 	k_EControllerActionOrigin_XBoxOne_B,
176 	k_EControllerActionOrigin_XBoxOne_X,
177 	k_EControllerActionOrigin_XBoxOne_Y,
178 	k_EControllerActionOrigin_XBoxOne_LeftBumper,
179 	k_EControllerActionOrigin_XBoxOne_RightBumper,
180 	k_EControllerActionOrigin_XBoxOne_Menu,  //Start
181 	k_EControllerActionOrigin_XBoxOne_View,  //Back
182 	k_EControllerActionOrigin_XBoxOne_LeftTrigger_Pull,
183 	k_EControllerActionOrigin_XBoxOne_LeftTrigger_Click,
184 	k_EControllerActionOrigin_XBoxOne_RightTrigger_Pull,
185 	k_EControllerActionOrigin_XBoxOne_RightTrigger_Click,
186 	k_EControllerActionOrigin_XBoxOne_LeftStick_Move,
187 	k_EControllerActionOrigin_XBoxOne_LeftStick_Click,
188 	k_EControllerActionOrigin_XBoxOne_LeftStick_DPadNorth,
189 	k_EControllerActionOrigin_XBoxOne_LeftStick_DPadSouth,
190 	k_EControllerActionOrigin_XBoxOne_LeftStick_DPadWest,
191 	k_EControllerActionOrigin_XBoxOne_LeftStick_DPadEast,
192 	k_EControllerActionOrigin_XBoxOne_RightStick_Move,
193 	k_EControllerActionOrigin_XBoxOne_RightStick_Click,
194 	k_EControllerActionOrigin_XBoxOne_RightStick_DPadNorth,
195 	k_EControllerActionOrigin_XBoxOne_RightStick_DPadSouth,
196 	k_EControllerActionOrigin_XBoxOne_RightStick_DPadWest,
197 	k_EControllerActionOrigin_XBoxOne_RightStick_DPadEast,
198 	k_EControllerActionOrigin_XBoxOne_DPad_North,
199 	k_EControllerActionOrigin_XBoxOne_DPad_South,
200 	k_EControllerActionOrigin_XBoxOne_DPad_West,
201 	k_EControllerActionOrigin_XBoxOne_DPad_East,
202 
203 	// XBox 360
204 	k_EControllerActionOrigin_XBox360_A,
205 	k_EControllerActionOrigin_XBox360_B,
206 	k_EControllerActionOrigin_XBox360_X,
207 	k_EControllerActionOrigin_XBox360_Y,
208 	k_EControllerActionOrigin_XBox360_LeftBumper,
209 	k_EControllerActionOrigin_XBox360_RightBumper,
210 	k_EControllerActionOrigin_XBox360_Start,  //Start
211 	k_EControllerActionOrigin_XBox360_Back,  //Back
212 	k_EControllerActionOrigin_XBox360_LeftTrigger_Pull,
213 	k_EControllerActionOrigin_XBox360_LeftTrigger_Click,
214 	k_EControllerActionOrigin_XBox360_RightTrigger_Pull,
215 	k_EControllerActionOrigin_XBox360_RightTrigger_Click,
216 	k_EControllerActionOrigin_XBox360_LeftStick_Move,
217 	k_EControllerActionOrigin_XBox360_LeftStick_Click,
218 	k_EControllerActionOrigin_XBox360_LeftStick_DPadNorth,
219 	k_EControllerActionOrigin_XBox360_LeftStick_DPadSouth,
220 	k_EControllerActionOrigin_XBox360_LeftStick_DPadWest,
221 	k_EControllerActionOrigin_XBox360_LeftStick_DPadEast,
222 	k_EControllerActionOrigin_XBox360_RightStick_Move,
223 	k_EControllerActionOrigin_XBox360_RightStick_Click,
224 	k_EControllerActionOrigin_XBox360_RightStick_DPadNorth,
225 	k_EControllerActionOrigin_XBox360_RightStick_DPadSouth,
226 	k_EControllerActionOrigin_XBox360_RightStick_DPadWest,
227 	k_EControllerActionOrigin_XBox360_RightStick_DPadEast,
228 	k_EControllerActionOrigin_XBox360_DPad_North,
229 	k_EControllerActionOrigin_XBox360_DPad_South,
230 	k_EControllerActionOrigin_XBox360_DPad_West,
231 	k_EControllerActionOrigin_XBox360_DPad_East,
232 
233 	// SteamController V2
234 	k_EControllerActionOrigin_SteamV2_A,
235 	k_EControllerActionOrigin_SteamV2_B,
236 	k_EControllerActionOrigin_SteamV2_X,
237 	k_EControllerActionOrigin_SteamV2_Y,
238 	k_EControllerActionOrigin_SteamV2_LeftBumper,
239 	k_EControllerActionOrigin_SteamV2_RightBumper,
240 	k_EControllerActionOrigin_SteamV2_LeftGrip,
241 	k_EControllerActionOrigin_SteamV2_RightGrip,
242 	k_EControllerActionOrigin_SteamV2_LeftGrip_Upper,
243 	k_EControllerActionOrigin_SteamV2_RightGrip_Upper,
244 	k_EControllerActionOrigin_SteamV2_LeftBumper_Pressure,
245 	k_EControllerActionOrigin_SteamV2_RightBumper_Pressure,
246 	k_EControllerActionOrigin_SteamV2_LeftGrip_Pressure,
247 	k_EControllerActionOrigin_SteamV2_RightGrip_Pressure,
248 	k_EControllerActionOrigin_SteamV2_LeftGrip_Upper_Pressure,
249 	k_EControllerActionOrigin_SteamV2_RightGrip_Upper_Pressure,
250 	k_EControllerActionOrigin_SteamV2_Start,
251 	k_EControllerActionOrigin_SteamV2_Back,
252 	k_EControllerActionOrigin_SteamV2_LeftPad_Touch,
253 	k_EControllerActionOrigin_SteamV2_LeftPad_Swipe,
254 	k_EControllerActionOrigin_SteamV2_LeftPad_Click,
255 	k_EControllerActionOrigin_SteamV2_LeftPad_Pressure,
256 	k_EControllerActionOrigin_SteamV2_LeftPad_DPadNorth,
257 	k_EControllerActionOrigin_SteamV2_LeftPad_DPadSouth,
258 	k_EControllerActionOrigin_SteamV2_LeftPad_DPadWest,
259 	k_EControllerActionOrigin_SteamV2_LeftPad_DPadEast,
260 	k_EControllerActionOrigin_SteamV2_RightPad_Touch,
261 	k_EControllerActionOrigin_SteamV2_RightPad_Swipe,
262 	k_EControllerActionOrigin_SteamV2_RightPad_Click,
263 	k_EControllerActionOrigin_SteamV2_RightPad_Pressure,
264 	k_EControllerActionOrigin_SteamV2_RightPad_DPadNorth,
265 	k_EControllerActionOrigin_SteamV2_RightPad_DPadSouth,
266 	k_EControllerActionOrigin_SteamV2_RightPad_DPadWest,
267 	k_EControllerActionOrigin_SteamV2_RightPad_DPadEast,
268 	k_EControllerActionOrigin_SteamV2_LeftTrigger_Pull,
269 	k_EControllerActionOrigin_SteamV2_LeftTrigger_Click,
270 	k_EControllerActionOrigin_SteamV2_RightTrigger_Pull,
271 	k_EControllerActionOrigin_SteamV2_RightTrigger_Click,
272 	k_EControllerActionOrigin_SteamV2_LeftStick_Move,
273 	k_EControllerActionOrigin_SteamV2_LeftStick_Click,
274 	k_EControllerActionOrigin_SteamV2_LeftStick_DPadNorth,
275 	k_EControllerActionOrigin_SteamV2_LeftStick_DPadSouth,
276 	k_EControllerActionOrigin_SteamV2_LeftStick_DPadWest,
277 	k_EControllerActionOrigin_SteamV2_LeftStick_DPadEast,
278 	k_EControllerActionOrigin_SteamV2_Gyro_Move,
279 	k_EControllerActionOrigin_SteamV2_Gyro_Pitch,
280 	k_EControllerActionOrigin_SteamV2_Gyro_Yaw,
281 	k_EControllerActionOrigin_SteamV2_Gyro_Roll,
282 
283 	k_EControllerActionOrigin_Count
284 };
285 
286 enum ESteamControllerLEDFlag
287 {
288 	k_ESteamControllerLEDFlag_SetColor,
289 	k_ESteamControllerLEDFlag_RestoreUserDefault
290 };
291 
292 enum ESteamInputType
293 {
294 	k_ESteamInputType_Unknown,
295 	k_ESteamInputType_SteamController,
296 	k_ESteamInputType_XBox360Controller,
297 	k_ESteamInputType_XBoxOneController,
298 	k_ESteamInputType_GenericXInput,
299 	k_ESteamInputType_PS4Controller,
300 };
301 
302 // ControllerHandle_t is used to refer to a specific controller.
303 // This handle will consistently identify a controller, even if it is disconnected and re-connected
304 typedef uint64 ControllerHandle_t;
305 
306 
307 // These handles are used to refer to a specific in-game action or action set
308 // All action handles should be queried during initialization for performance reasons
309 typedef uint64 ControllerActionSetHandle_t;
310 typedef uint64 ControllerDigitalActionHandle_t;
311 typedef uint64 ControllerAnalogActionHandle_t;
312 
313 #pragma pack( push, 1 )
314 
315 struct ControllerAnalogActionData_t
316 {
317 	// Type of data coming from this action, this will match what got specified in the action set
318 	EControllerSourceMode eMode;
319 
320 	// The current state of this action; will be delta updates for mouse actions
321 	float x, y;
322 
323 	// Whether or not this action is currently available to be bound in the active action set
324 	bool bActive;
325 };
326 
327 struct ControllerDigitalActionData_t
328 {
329 	// The current state of this action; will be true if currently pressed
330 	bool bState;
331 
332 	// Whether or not this action is currently available to be bound in the active action set
333 	bool bActive;
334 };
335 
336 struct ControllerMotionData_t
337 {
338 	// Sensor-fused absolute rotation; will drift in heading
339 	float rotQuatX;
340 	float rotQuatY;
341 	float rotQuatZ;
342 	float rotQuatW;
343 
344 	// Positional acceleration
345 	float posAccelX;
346 	float posAccelY;
347 	float posAccelZ;
348 
349 	// Angular velocity
350 	float rotVelX;
351 	float rotVelY;
352 	float rotVelZ;
353 };
354 
355 #pragma pack( pop )
356 
357 
358 //-----------------------------------------------------------------------------
359 // Purpose: Native Steam controller support API
360 //-----------------------------------------------------------------------------
361 class ISteamController
362 {
363 public:
364 
365 	// Init and Shutdown must be called when starting/ending use of this interface
366 	virtual bool Init() = 0;
367 	virtual bool Shutdown() = 0;
368 
369 	// Synchronize API state with the latest Steam Controller inputs available. This
370 	// is performed automatically by SteamAPI_RunCallbacks, but for the absolute lowest
371 	// possible latency, you call this directly before reading controller state.
372 	virtual void RunFrame() = 0;
373 
374 	// Enumerate currently connected controllers
375 	// handlesOut should point to a STEAM_CONTROLLER_MAX_COUNT sized array of ControllerHandle_t handles
376 	// Returns the number of handles written to handlesOut
377 	virtual int GetConnectedControllers( ControllerHandle_t *handlesOut ) = 0;
378 
379 	// Invokes the Steam overlay and brings up the binding screen
380 	// Returns false is overlay is disabled / unavailable, or the user is not in Big Picture mode
381 	virtual bool ShowBindingPanel( ControllerHandle_t controllerHandle ) = 0;
382 
383 	// ACTION SETS
384 	// Lookup the handle for an Action Set. Best to do this once on startup, and store the handles for all future API calls.
385 	virtual ControllerActionSetHandle_t GetActionSetHandle( const char *pszActionSetName ) = 0;
386 
387 	// Reconfigure the controller to use the specified action set (ie 'Menu', 'Walk' or 'Drive')
388 	// This is cheap, and can be safely called repeatedly. It's often easier to repeatedly call it in
389 	// your state loops, instead of trying to place it in all of your state transitions.
390 	virtual void ActivateActionSet( ControllerHandle_t controllerHandle, ControllerActionSetHandle_t actionSetHandle ) = 0;
391 	virtual ControllerActionSetHandle_t GetCurrentActionSet( ControllerHandle_t controllerHandle ) = 0;
392 
393 	virtual void ActivateActionSetLayer( ControllerHandle_t controllerHandle, ControllerActionSetHandle_t actionSetLayerHandle ) = 0;
394 	virtual void DeactivateActionSetLayer( ControllerHandle_t controllerHandle, ControllerActionSetHandle_t actionSetLayerHandle ) = 0;
395 	virtual void DeactivateAllActionSetLayers( ControllerHandle_t controllerHandle ) = 0;
396 	virtual int GetActiveActionSetLayers( ControllerHandle_t controllerHandle, ControllerActionSetHandle_t *handlesOut ) = 0;
397 
398 
399 	// ACTIONS
400 	// Lookup the handle for a digital action. Best to do this once on startup, and store the handles for all future API calls.
401 	virtual ControllerDigitalActionHandle_t GetDigitalActionHandle( const char *pszActionName ) = 0;
402 
403 	// Returns the current state of the supplied digital game action
404 	virtual ControllerDigitalActionData_t GetDigitalActionData( ControllerHandle_t controllerHandle, ControllerDigitalActionHandle_t digitalActionHandle ) = 0;
405 
406 	// Get the origin(s) for a digital action within an action set. Returns the number of origins supplied in originsOut. Use this to display the appropriate on-screen prompt for the action.
407 	// originsOut should point to a STEAM_CONTROLLER_MAX_ORIGINS sized array of EControllerActionOrigin handles
408 	virtual int GetDigitalActionOrigins( ControllerHandle_t controllerHandle, ControllerActionSetHandle_t actionSetHandle, ControllerDigitalActionHandle_t digitalActionHandle, EControllerActionOrigin *originsOut ) = 0;
409 
410 	// Lookup the handle for an analog action. Best to do this once on startup, and store the handles for all future API calls.
411 	virtual ControllerAnalogActionHandle_t GetAnalogActionHandle( const char *pszActionName ) = 0;
412 
413 	// Returns the current state of these supplied analog game action
414 	virtual ControllerAnalogActionData_t GetAnalogActionData( ControllerHandle_t controllerHandle, ControllerAnalogActionHandle_t analogActionHandle ) = 0;
415 
416 	// Get the origin(s) for an analog action within an action set. Returns the number of origins supplied in originsOut. Use this to display the appropriate on-screen prompt for the action.
417 	// originsOut should point to a STEAM_CONTROLLER_MAX_ORIGINS sized array of EControllerActionOrigin handles
418 	virtual int GetAnalogActionOrigins( ControllerHandle_t controllerHandle, ControllerActionSetHandle_t actionSetHandle, ControllerAnalogActionHandle_t analogActionHandle, EControllerActionOrigin *originsOut ) = 0;
419 
420 	virtual void StopAnalogActionMomentum( ControllerHandle_t controllerHandle, ControllerAnalogActionHandle_t eAction ) = 0;
421 
422 	// Trigger a haptic pulse on a controller
423 	virtual void TriggerHapticPulse( ControllerHandle_t controllerHandle, ESteamControllerPad eTargetPad, unsigned short usDurationMicroSec ) = 0;
424 
425 	// Trigger a pulse with a duty cycle of usDurationMicroSec / usOffMicroSec, unRepeat times.
426 	// nFlags is currently unused and reserved for future use.
427 	virtual void TriggerRepeatedHapticPulse( ControllerHandle_t controllerHandle, ESteamControllerPad eTargetPad, unsigned short usDurationMicroSec, unsigned short usOffMicroSec, unsigned short unRepeat, unsigned int nFlags ) = 0;
428 
429 	// Tigger a vibration event on supported controllers.
430 	virtual void TriggerVibration( ControllerHandle_t controllerHandle, unsigned short usLeftSpeed, unsigned short usRightSpeed ) = 0;
431 
432 	// Set the controller LED color on supported controllers.
433 	virtual void SetLEDColor( ControllerHandle_t controllerHandle, uint8 nColorR, uint8 nColorG, uint8 nColorB, unsigned int nFlags ) = 0;
434 
435 	// Returns the associated gamepad index for the specified controller, if emulating a gamepad
436 	virtual int GetGamepadIndexForController( ControllerHandle_t ulControllerHandle ) = 0;
437 
438 	// Returns the associated controller handle for the specified emulated gamepad
439 	virtual ControllerHandle_t GetControllerForGamepadIndex( int nIndex ) = 0;
440 
441 	// Returns raw motion data from the specified controller
442 	virtual ControllerMotionData_t GetMotionData( ControllerHandle_t controllerHandle ) = 0;
443 
444 	// Attempt to display origins of given action in the controller HUD, for the currently active action set
445 	// Returns false is overlay is disabled / unavailable, or the user is not in Big Picture mode
446 	virtual bool ShowDigitalActionOrigins( ControllerHandle_t controllerHandle, ControllerDigitalActionHandle_t digitalActionHandle, float flScale, float flXPosition, float flYPosition ) = 0;
447 	virtual bool ShowAnalogActionOrigins( ControllerHandle_t controllerHandle, ControllerAnalogActionHandle_t analogActionHandle, float flScale, float flXPosition, float flYPosition ) = 0;
448 
449 	// Returns a localized string (from Steam's language setting) for the specified origin
450 	virtual const char *GetStringForActionOrigin( EControllerActionOrigin eOrigin ) = 0;
451 
452 	// Get a local path to art for on-screen glyph for a particular origin
453 	virtual const char *GetGlyphForActionOrigin( EControllerActionOrigin eOrigin ) = 0;
454 
455 	// Returns the input type for a particular handle
456 	virtual ESteamInputType GetInputTypeForHandle( ControllerHandle_t controllerHandle ) = 0;
457 };
458 
459 #define STEAMCONTROLLER_INTERFACE_VERSION "SteamController006"
460 
461 #endif // ISTEAMCONTROLLER_H
462