00001
00002
00003
00004
00005
00006
00007
00012 #ifndef QAF_JOYSTICKSYSTEM_H
00013 #define QAF_JOYSTICKSYSTEM_H
00014
00015 #include "qafutil/qafContainer.h"
00016
00017 #define DIRECTINPUT_VERSION 0x0800
00018 #include <dinput.h>
00019
00020
00021 namespace qaf {
00022
00028 enum JoystickObject {
00029 QAF_JOY_NONE = 0,
00030 QAF_JOY_X_AXIS,
00031 QAF_JOY_Y_AXIS,
00032 QAF_JOY_Z_AXIS,
00033 QAF_JOY_X_AXIS_ROTATION,
00034 QAF_JOY_Y_AXIS_ROTATION,
00035 QAF_JOY_Z_AXIS_ROTATION,
00036 QAF_JOY_SLIDER_0,
00037 QAF_JOY_SLIDER_1,
00038 QAF_JOY_POV_0,
00039 QAF_JOY_POV_1,
00040 QAF_JOY_POV_2,
00041 QAF_JOY_POV_3,
00042 QAF_JOY_BUTTON_0,
00043 QAF_JOY_BUTTON_1,
00044 QAF_JOY_BUTTON_2,
00045 QAF_JOY_BUTTON_3,
00046 QAF_JOY_BUTTON_4,
00047 QAF_JOY_BUTTON_5,
00048 QAF_JOY_BUTTON_6,
00049 QAF_JOY_BUTTON_7,
00050 QAF_JOY_BUTTON_8,
00051 QAF_JOY_BUTTON_9,
00052 QAF_JOY_BUTTON_10,
00053 QAF_JOY_BUTTON_11,
00054 QAF_JOY_BUTTON_12,
00055 QAF_JOY_BUTTON_13,
00056 QAF_JOY_BUTTON_14,
00057 QAF_JOY_BUTTON_15,
00058 QAF_JOY_BUTTON_16,
00059 QAF_JOY_BUTTON_17,
00060 QAF_JOY_BUTTON_18,
00061 QAF_JOY_BUTTON_19,
00062 QAF_JOY_BUTTON_20,
00063 QAF_JOY_BUTTON_21,
00064 QAF_JOY_BUTTON_22,
00065 QAF_JOY_BUTTON_23,
00066 QAF_JOY_BUTTON_24,
00067 QAF_JOY_BUTTON_25,
00068 QAF_JOY_BUTTON_26,
00069 QAF_JOY_BUTTON_27,
00070 QAF_JOY_BUTTON_28,
00071 QAF_JOY_BUTTON_29,
00072 QAF_JOY_BUTTON_30,
00073 QAF_JOY_BUTTON_31,
00074 QAF_JOY_BUTTON_32,
00075 QAF_JOY_BUTTON_33,
00076 QAF_JOY_BUTTON_34,
00077 QAF_JOY_BUTTON_35,
00078 QAF_JOY_BUTTON_36,
00079 QAF_JOY_BUTTON_37,
00080 QAF_JOY_BUTTON_38,
00081 QAF_JOY_BUTTON_39,
00082 QAF_JOY_BUTTON_40,
00083 QAF_JOY_BUTTON_41,
00084 QAF_JOY_BUTTON_42,
00085 QAF_JOY_BUTTON_43,
00086 QAF_JOY_BUTTON_44,
00087 QAF_JOY_BUTTON_45,
00088 QAF_JOY_BUTTON_46,
00089 QAF_JOY_BUTTON_47,
00090 QAF_JOY_BUTTON_48,
00091 QAF_JOY_BUTTON_49,
00092 QAF_JOY_BUTTON_50,
00093 QAF_JOY_BUTTON_51,
00094 QAF_JOY_BUTTON_52,
00095 QAF_JOY_BUTTON_53,
00096 QAF_JOY_BUTTON_54,
00097 QAF_JOY_BUTTON_55,
00098 QAF_JOY_BUTTON_56,
00099 QAF_JOY_BUTTON_57,
00100 QAF_JOY_BUTTON_58,
00101 QAF_JOY_BUTTON_59,
00102 QAF_JOY_BUTTON_60,
00103 QAF_JOY_BUTTON_61,
00104 QAF_JOY_BUTTON_62,
00105 QAF_JOY_BUTTON_63,
00106 QAF_JOY_BUTTON_64,
00107 QAF_JOY_BUTTON_65,
00108 QAF_JOY_BUTTON_66,
00109 QAF_JOY_BUTTON_67,
00110 QAF_JOY_BUTTON_68,
00111 QAF_JOY_BUTTON_69,
00112 QAF_JOY_BUTTON_70,
00113 QAF_JOY_BUTTON_71,
00114 QAF_JOY_BUTTON_72,
00115 QAF_JOY_BUTTON_73,
00116 QAF_JOY_BUTTON_74,
00117 QAF_JOY_BUTTON_75,
00118 QAF_JOY_BUTTON_76,
00119 QAF_JOY_BUTTON_77,
00120 QAF_JOY_BUTTON_78,
00121 QAF_JOY_BUTTON_79,
00122 QAF_JOY_BUTTON_80,
00123 QAF_JOY_BUTTON_81,
00124 QAF_JOY_BUTTON_82,
00125 QAF_JOY_BUTTON_83,
00126 QAF_JOY_BUTTON_84,
00127 QAF_JOY_BUTTON_85,
00128 QAF_JOY_BUTTON_86,
00129 QAF_JOY_BUTTON_87,
00130 QAF_JOY_BUTTON_88,
00131 QAF_JOY_BUTTON_89,
00132 QAF_JOY_BUTTON_90,
00133 QAF_JOY_BUTTON_91,
00134 QAF_JOY_BUTTON_92,
00135 QAF_JOY_BUTTON_93,
00136 QAF_JOY_BUTTON_94,
00137 QAF_JOY_BUTTON_95,
00138 QAF_JOY_BUTTON_96,
00139 QAF_JOY_BUTTON_97,
00140 QAF_JOY_BUTTON_98,
00141 QAF_JOY_BUTTON_99,
00142 QAF_JOY_BUTTON_100,
00143 QAF_JOY_BUTTON_101,
00144 QAF_JOY_BUTTON_102,
00145 QAF_JOY_BUTTON_103,
00146 QAF_JOY_BUTTON_104,
00147 QAF_JOY_BUTTON_105,
00148 QAF_JOY_BUTTON_106,
00149 QAF_JOY_BUTTON_107,
00150 QAF_JOY_BUTTON_108,
00151 QAF_JOY_BUTTON_109,
00152 QAF_JOY_BUTTON_110,
00153 QAF_JOY_BUTTON_111,
00154 QAF_JOY_BUTTON_112,
00155 QAF_JOY_BUTTON_113,
00156 QAF_JOY_BUTTON_114,
00157 QAF_JOY_BUTTON_115,
00158 QAF_JOY_BUTTON_116,
00159 QAF_JOY_BUTTON_117,
00160 QAF_JOY_BUTTON_118,
00161 QAF_JOY_BUTTON_119,
00162 QAF_JOY_BUTTON_120,
00163 QAF_JOY_BUTTON_121,
00164 QAF_JOY_BUTTON_122,
00165 QAF_JOY_BUTTON_123,
00166 QAF_JOY_BUTTON_124,
00167 QAF_JOY_BUTTON_125,
00168 QAF_JOY_BUTTON_126,
00169 QAF_JOY_BUTTON_127
00170 };
00174 #define QAF_JOY_MAX_OBJECTS (QAF_JOY_BUTTON_127 - QAF_JOY_X_AXIS + 1)
00175
00177 #define QAF_JOY_ISAXIS(obj) (obj >= QAF_JOY_X_AXIS && obj <= QAF_JOY_SLIDER_1 )
00178
00180 #define QAF_JOY_ISPOV(obj) (obj >= QAF_JOY_POV_0 && obj <= QAF_JOY_POV_3 )
00181
00183 #define QAF_JOY_ISBUTTON(obj) (obj >= QAF_JOY_BUTTON_0 && obj <= QAF_JOY_BUTTON_127)
00184
00187 #define QAF_JOY_BUTTON(n) ((JoystickObject) (QAF_JOY_BUTTON_0 + n))
00188
00199 class Joystick {
00200 public:
00207 Joystick ( LPDIRECTINPUTDEVICE8 pJoystick, HWND hWindow );
00208 virtual ~Joystick ();
00209
00214 bool isInitialized ();
00215
00225 bool poll ();
00226
00243 int getObjectState ( JoystickObject obj );
00244
00252 const char * getObjectName ( JoystickObject obj );
00253
00258 const char * getDeviceName ();
00259
00266 bool setHWND ( HWND hWindow );
00267
00291 bool setAxesParameters ( bool absolute, int minValue, int maxValue, float deadZone, float saturation );
00292
00309 int createVibrationEffect ( float magnitude, float duration, float period );
00310
00320 bool changeVibrationMagnitude ( int effectID, float newMagnitude, float newPeriod );
00321
00329 bool deleteEffect ( int effectID );
00330
00338 bool playEffect ( int effectID, int repetitions );
00339
00340 private:
00341 void * pHGE;
00342
00343 bool initialized;
00344 LPDIRECTINPUTDEVICE8 pJoystick;
00345 HWND hWindow;
00346
00347 DIJOYSTATE2 state;
00348
00349 Container<GUID> effectGUIDs;
00350 Container<DWORD> effectAxesOfs;
00351 Container<IDirectInputEffect *> createdEffects;
00352
00353 char deviceName[MAX_PATH];
00354 char * objNames[QAF_JOY_MAX_OBJECTS];
00355 void resetStates ();
00356
00357
00358 static BOOL CALLBACK enumAxesCallback ( const DIDEVICEOBJECTINSTANCE * pdidoi, void * pContext );
00359
00360
00361
00362 static BOOL CALLBACK enumFFAxesCallback ( const DIDEVICEOBJECTINSTANCE * pdidoi, void * pContext );
00363
00364
00365
00366 static BOOL CALLBACK enumEffectsCallback ( LPCDIEFFECTINFO pei, void * pContext );
00367 };
00368
00369
00370
00377 class JoystickSystem {
00378 public:
00379 JoystickSystem ();
00380 virtual ~JoystickSystem ();
00381
00390 bool initialize ( HWND hWindow );
00391
00396 void shutdown ();
00397
00402 int getNumberOfJoysticks ();
00403
00409 Joystick * getJoystick ( int i );
00410
00411 private:
00412 void * pHGE;
00413
00414 LPDIRECTINPUT8 pDI;
00415
00416 Container<Joystick *> joysticks;
00417
00418
00419 static BOOL CALLBACK enumJoysticksCallback ( const DIDEVICEINSTANCE * pdidInstance, void * pContext);
00420
00421 };
00422
00423
00424 }
00425
00426
00427 #endif