1 /****************************************************************************
2 
3     MODULE:     	SW_Force.H
4 	Tab settings: 	5 9
5 
6 	Copyright 1995, 1996, Microsoft Corporation, 	All Rights Reserved.
7 
8 	You have a royalty-free right to use, modify, reproduce and
9 	distribute this header Files (and/or any modified version) in
10 	any way you find useful, provided that you agree that
11 	Microsoft has no warranty obligations or liability for any
12 	Application Files which are created using the header Files.
13 
14     PURPOSE:    	Header for SideWinder Force Feedback Joystick
15     				and interface to DirectInput Force Feedback API
16 
17 
18 	Author(s):	Name:
19 	----------	----------------
20 
21 
22 	Revision History:
23 	-----------------
24 	Version Date            Author  Comments
25    	1.0  	24-Mar-97       MEA     original
26 
27 ****************************************************************************/
28 
29 #ifndef _SW_Force_SEEN
30 #define _SW_Force_SEEN
31 #include <winerror.h>
32 #include <windows.h>
33 #include <mmsystem.h>
34 #include <objbase.h>
35 #define INC_OLE2
36 #include <windows.h>
37 #include <ole2.h>
38 #include <ole2ver.h>
39 #undef INITGUIDS
40 
41 #include "sw_guid.hpp"
42 #include "directx/vdinput.h"
43 #include "sw_error.hpp"
44 
45 /*
46 #include "sw_guid.h"
47 #include "directx/vdinput.h"
48 #include "sw_error.h"
49 */
50 
51 
52 //
53 // --- Defines and macros for making DirectInput FF a little easier to work
54 //     with.
55 //
56 #define SINE			1
57 #define COSINE			2
58 #define SQUARE_HIGH		3
59 #define SQUARE_LOW		4
60 #define TRIANGLE_UP		5
61 #define TRIANGLE_DOWN	6
62 #define SAWTOOTH_UP		7
63 #define SAWTOOTH_DOWN	8
64 #define RAMP_UP			9
65 #define RAMP_DOWN		10
66 #define SPRING			11
67 #define INERTIA			12
68 #define DAMPER			13
69 #define FRICTION		14
70 #define WALL			15
71 
72 #define HZ_TO_uS(HZ) ((int)(1000000.0/(double)(HZ) + 0.5))
73 #define uS_TO_HZ(uS) (max(1,(int)((double)(uS)/1000000.0 + 0.5)))
74 
75 #ifndef X_AXIS
76 #define X_AXIS	1
77 #endif
78 
79 #ifndef Y_AXIS
80 #define Y_AXIS	2
81 #endif
82 
83 //---------------------------------------------------------------------------
84 // Function prototype declarations C-callable
85 //---------------------------------------------------------------------------
86 #ifdef __cplusplus
87 extern "C" {
88 #endif
89 
90 HRESULT SWFF_OpenDefaultFFJoystick(
91 	IN HWND hWnd,
92 	OUT LPDIRECTINPUT* ppDI,
93 	OUT LPDIRECTINPUTDEVICE2* ppDIDevice2);
94 
95 HRESULT SWFF_OpenDefaultFFJoystickEx(
96 	IN HWND hWnd,
97 	IN HINSTANCE hInstance,
98 	OUT LPDIRECTINPUT* ppDI,
99 	OUT LPDIRECTINPUTDEVICE2* ppDIDevice,
100 	DWORD dwFlags);
101 
102 HRESULT SWFF_DestroyEffect(
103 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
104 	IN LPDIRECTINPUTEFFECT pDIEffect);
105 
106 HRESULT SWFF_DestroyAllEffects(
107 	IN LPDIRECTINPUTDEVICE2 pDIDevice);
108 
109 HRESULT SWFF_SetGain(
110 	IN LPDIRECTINPUTEFFECT pDIEffect,
111 	IN DWORD dwGain);
112 
113 HRESULT SWFF_SetDirection(
114 	IN LPDIRECTINPUTEFFECT pDIEffect,
115 	IN DWORD dwAngle);
116 
117 HRESULT SWFF_SetDuration(
118 	IN LPDIRECTINPUTEFFECT pDIEffect,
119 	IN DWORD dwDuration);
120 
121 HRESULT SWFF_SetDirectionGain(
122 	IN LPDIRECTINPUTEFFECT pDIEffect,
123 	IN DWORD dwAngle,
124 	IN DWORD dwMag);
125 
126 HRESULT SWFF_PutRawForce(
127 	IN LPDIRECTINPUTEFFECT pDIEffect,
128 	IN LONG lMagnitude,
129 	IN DWORD dwDirection);
130 
131 HRESULT SWFF_PutRawAxisForce(
132 	IN LPDIRECTINPUTEFFECT pDIEffect,
133 	IN LONG lMagnitude);
134 
135 HRESULT SWFF_CreateRawForceEffect(
136 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
137 	IN OUT LPDIRECTINPUTEFFECT * ppDIEffect,
138 	IN LONG lMagnitude,
139 	IN DWORD dwDirection);
140 
141 HRESULT SWFF_CreateRawAxisForceEffect(
142 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
143 	IN OUT LPDIRECTINPUTEFFECT * ppDIEffect,
144 	IN LONG lMagnitude,
145 	IN DWORD dwAxis);
146 
147 HRESULT SWFF_CreateROMEffect(
148 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
149 	IN OUT LPDIRECTINPUTEFFECT * ppDIEffect,
150 	IN REFGUID refGUID,
151 	IN DWORD dwDuration,
152 	IN DWORD dwGain,
153 	IN DWORD dwDirection,
154 	IN LONG lButton);
155 
156 HRESULT SWFF_CreatePeriodicEffect(
157 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
158 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
159 	IN DWORD dwType,
160 	IN DWORD dwDuration,
161 	IN DWORD dwPeriod,
162 	IN DWORD dwDirection,
163 	IN DWORD dwMagnitude,
164 	IN LONG lOffset,
165 	IN DWORD dwAttackTime,
166 	IN DWORD dwAttackLevel,
167 	IN DWORD dwFadeTime,
168 	IN DWORD dwFadeLevel,
169 	IN LONG lButton);
170 
171 HRESULT SWFF_CreateSpringEffect(
172 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
173 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
174 	IN DWORD dwDuration,
175 	IN LONG lKx,
176 	IN LONG lCenterX,
177 	IN LONG lKy,
178 	IN LONG lCenterY,
179 	IN LONG lButton);
180 
181 HRESULT SWFF_CreateDamperEffect(
182 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
183 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
184 	IN DWORD dwDuration,
185 	IN LONG lBx,
186 	IN LONG lV0x,
187 	IN LONG lBy,
188 	IN LONG lV0y,
189 	IN LONG lButton);
190 
191 HRESULT SWFF_CreateInertiaEffect(
192 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
193 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
194 	IN DWORD dwDuration,
195 	IN LONG lMx,
196 	IN LONG lA0x,
197 	IN LONG lMy,
198 	IN LONG lA0y,
199 	IN LONG lButton);
200 
201 HRESULT SWFF_CreateFrictionEffect(
202 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
203 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
204 	IN DWORD dwDuration,
205 	IN LONG lFx,
206 	IN LONG lFy,
207 	IN LONG lButton);
208 
209 HRESULT SWFF_CreateConditionEffect(
210 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
211 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
212 	IN DWORD dwType,
213 	IN DWORD dwDuration,
214 	IN LONG lXCoefficient,
215 	IN LONG lXOffset,
216 	IN LONG lYCoefficient,
217 	IN LONG lYOffset,
218 	IN LONG lButton);
219 
220 HRESULT SWFF_CreateRampEffect(
221 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
222 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
223 	IN DWORD dwDuration,
224 	IN DWORD dwDirection,
225 	IN LONG lStart,
226 	IN LONG lEnd,
227 	IN DWORD dwAttackTime,
228 	IN DWORD dwAttackLevel,
229 	IN DWORD dwFadeTime,
230 	IN DWORD dwFadeLevel,
231 	IN LONG lButtonMask);
232 
233 HRESULT SWFF_CreateConstantForceEffect(
234 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
235 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
236 	IN DWORD dwDuration,
237 	IN DWORD dwDirection,
238 	IN LONG lMagnitude,
239 	IN DWORD dwAttackTime,
240 	IN DWORD dwAttackLevel,
241 	IN DWORD dwFadeTime,
242 	IN DWORD dwFadeLevel,
243 	IN LONG lButton);
244 
245 HRESULT SWFF_CreateWallEffect(
246 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
247 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
248 	IN DWORD dwDuration,
249 	IN DWORD dwDirection,
250 	IN DWORD dwDistance,
251 	IN BOOL bInner,
252 	IN LONG lWallCoefficient,
253 	IN LONG lButton);
254 
255 HRESULT SWFF_CreateVFXEffectFromFile(
256 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
257 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
258 	IN const TCHAR *pszFileName);
259 
260 HRESULT SWFF_CreateVFXEffectFromFileEx(
261 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
262 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
263 	IN const TCHAR *pszFileName,
264 	IN DWORD dwDuration,
265 	IN DWORD dwGain,
266 	IN DWORD dwDirection);
267 
268 HRESULT SWFF_CreateVFXEffectFromBuffer(
269 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
270 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
271 	IN const LPVOID pBuffer,
272 	IN DWORD dwBufferSize);
273 
274 HRESULT SWFF_CreateVFXEffectFromBufferEx(
275 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
276 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
277 	IN const LPVOID pBuffer,
278 	IN DWORD dwBufferSize,
279 	IN DWORD dwDuration,
280 	IN DWORD dwGain,
281 	IN DWORD dwDirection);
282 
283 HRESULT SWFF_CreateDIEffectFromFile(
284 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
285 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
286 	IN const TCHAR *pszFileName);
287 
288 HRESULT SWFF_CreateDIEffectFromFileEx(
289 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
290 	IN OUT LPDIRECTINPUTEFFECT** pppDIEffect,
291 	IN OUT PDWORD pdwEffectCount,
292 	IN const TCHAR *pszFileName,
293 	IN OUT void** ppUDBuffer,
294 	IN OUT PDWORD pdwOutFlags);
295 
296 HRESULT SWFF_CreateDIEffectFromBuffer(
297 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
298 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
299 	IN const LPVOID pBuffer,
300 	IN DWORD dwBufferSize);
301 
302 HRESULT SWFF_CreateDIEffectFromBufferEx(
303 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
304 	IN OUT LPDIRECTINPUTEFFECT** pppDIEffect,
305 	IN OUT PDWORD pdwEffectCount,
306 	IN const LPVOID pBuffer,
307 	IN DWORD dwBufferSize,
308 	IN OUT void** ppUDBuffer,
309 	IN OUT PDWORD pdwOutFlags);
310 
311 BOOL SWFF_RegisterVFXObject(LPCTSTR pszVFXPath);
312 
313 BOOL SWFF_GetJoyData(
314 	IN int nJoyID,
315 	IN OUT JOYINFOEX * pjix,
316 	OUT char *pszErr);
317 /*
318 HRESULT SWFF_GetJoyData2(
319 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
320 	IN OUT LPDIJOYSTATE pjs);
321 */
322 void SWFF_ErrorCodeToString(
323 	IN HRESULT hResult,
324 	OUT TCHAR * pszCodeString);
325 
326 
327 #ifdef __cplusplus
328 }
329 #endif
330 
331 //
332 // --- IVFX Interface prototypes
333 //
334 #ifndef PPVOID
335 typedef LPVOID * PPVOID;
336 #endif  //PPVOID
337 
338 typedef struct IVFX  			*PVFX;
339 typedef struct IVFX				**PPVFX;
340 
341 #define VFXCE_CREATE_SINGLE		0x00001
342 #define VFXCE_CREATE_MULTIPLE	0x00002
343 #define VFXCE_CALC_BUFFER_SIZE	0x00004
344 #define VFXCE_CALC_EFFECT_COUNT	0x00008
345 #define VFXCE_CONCATENATE		0x00010
346 #define VFXCE_SUPERIMPOSE		0x00020
347 
348 
349 #undef INTERFACE
350 #define INTERFACE IVFX
DECLARE_INTERFACE_(IVFX,IUnknown)351 DECLARE_INTERFACE_(IVFX, IUnknown)
352 {
353     //IUnknown members
354 	STDMETHOD(QueryInterface) (THIS_ REFIID, PPVOID) PURE;
355     STDMETHOD_(ULONG,AddRef)  (THIS) PURE;
356     STDMETHOD_(ULONG,Release) (THIS) PURE;
357 
358     //IVFX Interface members
359 	// General Methods
360  	STDMETHOD_(HRESULT, CreateEffectFromFile) (
361 		THIS_
362 		LPDIRECTINPUTDEVICE2,
363 		LPDIRECTINPUTEFFECT*,
364 		LPDWORD,
365 		const TCHAR*,
366 		LPVOID,
367 		LPDWORD,
368 		DWORD,
369 		LPDWORD) PURE;
370 
371 	STDMETHOD_(HRESULT, CreateEffectFromBuffer) (
372 		THIS_
373 		LPDIRECTINPUTDEVICE2,
374 		LPDIRECTINPUTEFFECT*,
375 		LPDWORD,
376 		PVOID,
377 		DWORD,
378 		LPVOID,
379 		LPDWORD,
380 		DWORD,
381 		LPDWORD) PURE;
382 };
383 
384 //
385 // --- SideWinder specific
386 //
387 #define DEFAULT_ROM_EFFECT_GAIN		100		// Set dwGain to this for Default
388 											// ROM Effect gain
389 #define DEFAULT_ROM_EFFECT_DURATION	1000	// Set dwDuration to this for Default
390 											// ROM Effect Duration
391 #define DEFAULT_ROM_EFFECT_OUTPUTRATE	1000	// Set dwSampleRate to this for
392 												// Default ROM Effect output rate
393 
394 #define MIN_ANGLE			0
395 #define MAX_ANGLE			36000
396 #define MIN_FORCEOUTPUTRATE 1
397 #define MIN_GAIN			1
398 #define MAX_GAIN			10000
399 #define MAX_FORCE			10000
400 #define MIN_FORCE			-10000
401 #define MIN_TIME_PERIOD		1
402 #define MAX_TIME_PERIOD		4294967296L	// 4096 * 10^^6 usecs
403 
404 #define SCALE_GAIN			100		// DX is +/- 10000
405 #define SCALE_TIME			1000	// DX is in microseconds
406 #define	SCALE_POSITION		100		// DX is +/- 10000
407 #define	SCALE_CONSTANTS		100		// DX is +/- 10000
408 #define SCALE_DIRECTION		100		// DX is 0 to 35900
409 
410 //
411 // --- Default Values
412 //
413 #define	DEFAULT_OFFSET			0
414 #define DEFAULT_ATTACK_LEVEL	0
415 #define DEFAULT_ATTACK_TIME		0
416 #define DEFAULT_SUSTAIN_LEVEL	10000
417 #define DEFAULT_FADE_LEVEL		0
418 #define DEFAULT_FADE_TIME		0
419 
420 
421 //
422 // The following are Type Specific parameters structures for SideWinder
423 //
424 
425 //
426 // --- WALL Effect
427 //
428 #define WALL_INNER			0	// Wall material:from center to Wall Distance
429 #define WALL_OUTER			1	// Wall material:greater than Wall Distance
430 
431 typedef struct _BE_WALL_PARAM {
432 	ULONG	m_Bytes;			// Size of this structure
433 	ULONG 	m_WallType;			// WALL_INNER or WALL_OUTER
434 	LONG	m_WallConstant;		// in +/- 10000%
435 	ULONG	m_WallAngle;		// 0, 9000, 18000, 27000
436 	ULONG	m_WallDistance;		// Distance from Wall face normal to center. 0 to 10000
437 } BE_WALL_PARAM, *PBE_WALL_PARAM;
438 
439 //
440 // ---	EF_VFX_EFFECT = { FRC file effects }
441 //
442 // Subtypes:  none
443 
444 #define VFX_FILENAME	0L
445 #define VFX_BUFFER		1L
446 
447 #define DEFAULT_VFX_EFFECT_GAIN			10000	// set dwGain to this for default gain
448 #define DEFAULT_VFX_EFFECT_DIRECTION	0		// set polar direction to this for default direction
449 #define DEFAULT_VFX_EFFECT_DURATION		1000	// set dwDuration to this for default duration
450 
451 typedef struct _VFX_PARAM
452 {
453 	ULONG	m_Bytes;				// Size of this structure
454 	ULONG	m_PointerType;			// VFX_FILENAME or VFX_BUFFER
455 	ULONG	m_BufferSize;			// number of bytes in buffer (if VFX_BUFFER)
456 	PVOID	m_pFileNameOrBuffer;	// file name to open
457 } VFX_PARAM, *PVFX_PARAM;
458 
459 typedef struct {
460 	DIEFFECT DIEffectStruct;
461 	DICONDITION DIConditionStruct[2];
462 	LONG rglDirection[2];
463 } di_condition_effect_struct;
464 
465 HRESULT SWFF_CreateConditionEffectStruct(
466 	di_condition_effect_struct *ptr,
467 	IN LPDIRECTINPUTDEVICE2 pDIDevice,
468 	IN OUT LPDIRECTINPUTEFFECT* ppDIEffect,
469 	IN DWORD dwType,
470 	IN DWORD dwDuration,
471 	IN LONG lXCoefficient,
472 	IN LONG lXOffset,
473 	IN LONG lYCoefficient,
474 	IN LONG lYOffset,
475 	IN LONG lButton);
476 
477 #endif // of ifdef _SW_Force_SEEN
478