00001 #include "joy.h"
00002
00003 enum DeviceKind { keyboard, mouse, joystick } CurrentDevice;
00004 BOOL g_FFAvailable;
00005 LPDIRECTINPUTDEVICE2 g_lpdidKeyboard,g_lpdidJoy;
00006 LPDIRECTINPUT lpdi;
00007 DIDEVICEINSTANCE diDeviceInstanceKeyb, diDeviceInstanceJoy;
00008 DWORD ChangeButton;
00009 LPDIRECTINPUTEFFECT g_lpTriggerEffect;
00010 BOOL g_TriggerOK;
00011
00012 DLL_EXPORT int STD IniciarDInput (long Tipo_Dispositivo)
00013 {
00014 HRESULT hr;
00015 HINSTANCE hinst;
00016
00017 switch (Tipo_Dispositivo)
00018 {
00019 case 0:
00020 CurrentDevice=keyboard;
00021 break;
00022 case 1:
00023 CurrentDevice=joystick;
00024 break;
00025 default:
00026 CurrentDevice=keyboard;
00027 break;
00028 }
00029
00030
00031
00032 hinst=GetModuleHandle(NULL);
00033 hr=DirectInputCreate (hinst,DIRECTINPUT_VERSION,&lpdi,NULL);
00034
00035
00036
00037 if (hr!=DI_OK){
00038 return false;
00039 }
00040
00041
00042
00043
00044 lpdi->EnumDevices(DIDEVTYPE_JOYSTICK,Reasignacion,lpdi,DIEDFL_ATTACHEDONLY);
00045 g_lpdidKeyboard=CreateDevice2 (lpdi,( GUID * )&GUID_SysKeyboard);
00046
00047 diDeviceInstanceKeyb.dwSize = sizeof( DIDEVICEINSTANCE );
00048 diDeviceInstanceJoy.dwSize = sizeof( DIDEVICEINSTANCE );
00049 g_lpdidKeyboard->GetDeviceInfo( &diDeviceInstanceKeyb );
00050 hr = g_lpdidKeyboard->SetDataFormat( &c_dfDIKeyboard );
00051
00052 if ( g_lpdidJoy == NULL )
00053 {
00054 if (CurrentDevice==joystick) CurrentDevice=keyboard;
00055 }
00056 else if ( g_lpdidJoy != NULL )
00057 {
00058 g_lpdidJoy->GetDeviceInfo( &diDeviceInstanceJoy );
00059 if ( GET_DIDEVICE_TYPE( diDeviceInstanceJoy.dwDevType )== DIDEVTYPE_JOYSTICK)
00060 {
00061 hr = g_lpdidJoy->SetDataFormat( &c_dfDIJoystick );
00062 }
00063 }
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114 DIPROPDWORD dipdw =
00115 {
00116
00117 {
00118 sizeof( DIPROPDWORD ),
00119 sizeof( DIPROPHEADER ),
00120 0,
00121 DIPH_DEVICE,
00122 },
00123
00124 BUFFERSIZE,
00125 };
00126
00127 switch (CurrentDevice)
00128 {
00129 case keyboard:
00130 g_lpdidKeyboard->SetProperty( DIPROP_BUFFERSIZE, &dipdw.diph );
00131 break;
00132 case joystick:
00133 g_lpdidJoy->SetProperty( DIPROP_BUFFERSIZE, &dipdw.diph );
00134 break;
00135 }
00136
00137 if ( CurrentDevice == joystick )
00138 {
00139 IniJoystick();
00140 }
00141 SetAcquireState( TRUE );
00142 return true;
00143 }
00144
00145 int STD Reasignacion (LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef)
00146 {
00147 LPDIRECTINPUT pdi = LPDIRECTINPUT (pvRef);
00148
00149 g_lpdidJoy=CreateDevice2 (pdi,( GUID * ) &pdinst->guidInstance);
00150 return DIENUM_CONTINUE;
00151 }
00152
00153 LPDIRECTINPUTDEVICE2 CreateDevice2( LPDIRECTINPUT lpdi, GUID* pguid)
00154 {
00155 HRESULT hr, hr2;
00156
00157 LPDIRECTINPUTDEVICE lpdid1;
00158 LPDIRECTINPUTDEVICE2 lpdid2;
00159
00160 hr = lpdi->CreateDevice( *pguid, &lpdid1, NULL );
00161
00162 if ( SUCCEEDED( hr ) )
00163 {
00164 hr2 = lpdid1->QueryInterface( IID_IDirectInputDevice2,
00165 ( void ** )&lpdid2 );
00166 lpdid1->Release();
00167 }
00168 else
00169 {
00170 OutputDebugString(
00171 "No se pudo crear el dispositivo IDirectInputDevice" );
00172 return NULL;
00173 }
00174 if ( FAILED( hr2 ) )
00175 {
00176 OutputDebugString(
00177 "No se pudo crear el dispositivo IDirectInputDevice2" );
00178 return NULL;
00179 }
00180 return lpdid2;
00181 }
00182
00183 BOOL IniJoystick( void )
00184 {
00185
00186
00187
00188
00189
00190 DIPROPRANGE diprg;
00191
00192 diprg.diph.dwSize = sizeof( diprg );
00193 diprg.diph.dwHeaderSize = sizeof( diprg.diph );
00194 diprg.diph.dwObj = 0;
00195 diprg.diph.dwHow = DIPH_DEVICE;
00196 diprg.lMin = JOYMIN;
00197 diprg.lMax = JOYMAX;
00198
00199 if ( FAILED( g_lpdidJoy->SetProperty( DIPROP_RANGE, &diprg.diph ) ) )
00200 return FALSE;
00201
00202
00203 DIPROPDWORD dipdw;
00204
00205 dipdw.diph.dwSize = sizeof( dipdw );
00206 dipdw.diph.dwHeaderSize = sizeof( dipdw.diph );
00207 dipdw.diph.dwObj = 0;
00208 dipdw.diph.dwHow = DIPH_DEVICE;
00209 dipdw.dwData = JOYDEAD;
00210
00211 if ( FAILED( g_lpdidJoy->SetProperty( DIPROP_DEADZONE, &dipdw.diph ) ) )
00212 return FALSE;
00213
00214
00215 dipdw.dwData = JOYSAT;
00216 if ( FAILED( g_lpdidJoy->SetProperty( DIPROP_SATURATION, &dipdw.diph ) ) )
00217 return FALSE;
00218
00219
00220 DIDEVCAPS didc;
00221 didc.dwSize = sizeof( DIDEVCAPS );
00222 if ( FAILED( g_lpdidJoy->GetCapabilities( &didc ) ) )
00223 return FALSE;
00224 g_FFAvailable = ( didc.dwFlags & DIDC_FORCEFEEDBACK );
00225
00226
00227
00228 if ( g_FFAvailable )
00229 {
00230 DIPROPDWORD DIPropAutoCenter;
00231 DIPropAutoCenter.diph.dwSize = sizeof( DIPropAutoCenter );
00232 DIPropAutoCenter.diph.dwHeaderSize = sizeof( DIPROPHEADER );
00233 DIPropAutoCenter.diph.dwObj = 0;
00234 DIPropAutoCenter.diph.dwHow = DIPH_DEVICE;
00235 DIPropAutoCenter.dwData = 0;
00236
00237 g_lpdidJoy->SetProperty( DIPROP_AUTOCENTER,
00238 &DIPropAutoCenter.diph );
00239 }
00240 return TRUE;
00241 }
00242
00243 BOOL SetAcquireState( BOOL acq )
00244 {
00245 HRESULT hr;
00246
00247 if ( !acq )
00248 {
00249 switch (CurrentDevice)
00250 {
00251 case keyboard:
00252 hr = g_lpdidKeyboard->Unacquire();
00253 break;
00254 case joystick:
00255 hr = g_lpdidJoy->Unacquire();
00256 break;
00257 }
00258 }
00259 else
00260 {
00261
00262 switch (CurrentDevice)
00263 {
00264 case keyboard:
00265 hr = g_lpdidKeyboard->Acquire();
00266 break;
00267 case joystick:
00268 hr = g_lpdidJoy->Acquire();
00269 break;
00270 }
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 }
00283
00284
00285
00286
00287
00288
00289 return ( SUCCEEDED( hr ) );
00290 }
00291
00292
00293
00294
00295
00296
00297 DLL_EXPORT Respuesta STD DirectInputPollDevice( void )
00298 {
00299 DIJOYSTATE dijs;
00300 char keys[256];
00301 static DWORD LastClickTime;
00302 long dato=10;
00303 Respuesta Pulsiones;
00304 HRESULT hr;
00305 DIDEVICEOBJECTDATA rgdod[BUFFERSIZE];
00306 DWORD dwItems;
00307
00308 Pulsiones.Abajo=Pulsiones.Arriba=Pulsiones.Izquierda=Pulsiones.Derecha=false;
00309 Pulsiones.Switch =false;
00310
00311 ChangeButton=BOTON_ELEGIDO;
00312
00313 switch (CurrentDevice)
00314 {
00315 case keyboard:
00316 if ( !g_lpdidKeyboard ) return Pulsiones;
00317 break;
00318 case joystick:
00319 if ( !g_lpdidJoy ) return Pulsiones;
00320 break;
00321 }
00322
00323 getBufferedData:
00324
00325 dwItems = BUFFERSIZE;
00326 switch (CurrentDevice)
00327 {
00328 case keyboard:
00329 g_lpdidKeyboard->Poll();
00330
00331 hr = g_lpdidKeyboard->GetDeviceData( sizeof( DIDEVICEOBJECTDATA ),
00332 rgdod,
00333 &dwItems,
00334 0 );
00335 break;
00336 case joystick:
00337 g_lpdidJoy->Poll();
00338
00339 hr = g_lpdidJoy->GetDeviceData( sizeof( DIDEVICEOBJECTDATA ),
00340 rgdod,
00341 &dwItems,
00342 0 );
00343 break;
00344 }
00345
00346
00347 if ( hr == DIERR_INPUTLOST )
00348 {
00349 if ( SetAcquireState( TRUE ) )
00350 goto getBufferedData;
00351 }
00352
00353
00354 if ( hr == DIERR_NOTACQUIRED )
00355 {
00356 OutputDebugString( "¡Dispositivo no adquirido!" );
00357 return Pulsiones;
00358 }
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387 getImmediateData:
00388 switch ( CurrentDevice )
00389 {
00390 case keyboard:
00391 hr = g_lpdidKeyboard->GetDeviceState( sizeof( keys ), keys );
00392 break;
00393 case joystick:
00394 hr = g_lpdidJoy->GetDeviceState( sizeof( DIJOYSTATE ), &dijs );
00395 break;
00396 }
00397
00398
00399 if ( hr == DIERR_INPUTLOST )
00400 {
00401 if ( SetAcquireState( TRUE ) )
00402 goto getImmediateData;
00403 }
00404 if ( hr == DIERR_NOTACQUIRED )
00405 {
00406 OutputDebugString( "¡Dispositivo no adquirido!" );
00407 return Pulsiones;
00408 }
00409
00410
00411 if ( SUCCEEDED( hr ) )
00412 {
00413 switch ( CurrentDevice )
00414 {
00415 case keyboard:
00416 if ( BUTTONDOWN( keys[DIK_LEFT] ) )
00417 Pulsiones.Izquierda=true;
00418 if ( BUTTONDOWN( keys[DIK_RIGHT] ) )
00419 Pulsiones.Derecha=true;
00420 if ( BUTTONDOWN( keys[DIK_UP] ) )
00421 Pulsiones.Arriba=true;
00422 if ( BUTTONDOWN( keys[DIK_DOWN] ) )
00423 Pulsiones.Abajo=true;
00424 if (BUTTONDOWN( keys[57])){
00425 Pulsiones.Switch=true;
00426 Sleep (500);
00427 }
00428 break;
00429
00430 case mouse:
00431 break;
00432
00433 case joystick:
00434 if ( dijs.lX < 0 )
00435 Pulsiones.Izquierda=true;
00436 if ( dijs.lX > 0 )
00437 Pulsiones.Derecha=true;
00438 if ( dijs.lY < 0 )
00439 Pulsiones.Arriba=true;
00440 if ( dijs.lY > 0 )
00441 Pulsiones.Abajo=true;
00442 break;
00443
00444 }
00445
00446 return Pulsiones;
00447 }
00448 else
00449 return Pulsiones;
00450 }
00451
00452
00453
00454
00455
00456
00457 DLL_EXPORT Respuesta STD NonDirectInputPollDevice( void )
00458 {
00459 Respuesta Pulsiones;
00460 BYTE KeysState[256];
00461
00462
00463 Pulsiones.Abajo=Pulsiones.Arriba=Pulsiones.Izquierda=Pulsiones.Derecha=false;
00464 Pulsiones.Switch =false;
00465
00466 GetKeyboardState((LPBYTE)&KeysState);
00467
00468
00469
00470
00471 if (KeysState[VK_UP] & 128) Pulsiones.Arriba=true;
00472 if (KeysState[VK_DOWN] & 128) Pulsiones.Abajo=true;
00473 if (KeysState[VK_LEFT] & 128) Pulsiones.Izquierda=true;
00474 if (KeysState[VK_RIGHT] & 128) Pulsiones.Derecha=true;
00475 if (KeysState[VK_SPACE] & 128) Pulsiones.Switch=true;
00476 return Pulsiones;
00477 }
00478
00479 DLL_EXPORT void STD CerrarDInput (void)
00480 {
00481 SetAcquireState( FALSE );
00482
00483 g_lpdidKeyboard->Release();
00484 g_lpdidKeyboard=NULL;
00485
00486 if ( g_lpdidJoy != NULL )
00487 {
00488 g_lpdidJoy->Release();
00489 g_lpdidJoy = NULL;
00490 }
00491
00492 if ( lpdi != NULL )
00493 {
00494 lpdi->Release();
00495 lpdi = NULL;
00496 }
00497 }
00498