home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 27 / IOPROG_27.ISO / SOFT / CDX.ZIP / Src / Cdi / Joystick.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-09-14  |  3.7 KB  |  128 lines

  1. //////////////////////////////////////////////////////////////////////////////////
  2. // Project Name: [ CDI Class Library - CDI.lib ]
  3. // Author:       [ Dan Farley - 97308096@brookes.ac.uk ]
  4. // Source File:  [ CDI_Joystick Implementation ]
  5. // Revision:     [ 1.6 ]
  6. //////////////////////////////////////////////////////////////////////////////////
  7. #include "CDI.h"
  8.  
  9. //////////////////////////////////////////////////////////////////////////////////
  10. // CDI_Joystick Constructor
  11. //////////////////////////////////////////////////////////////////////////////////
  12. CDI_Joystick::CDI_Joystick(void)
  13. {
  14.     m_Device = NULL;
  15.     m_bActive = FALSE;
  16.     m_X = m_Y = m_Z = 0;
  17. }
  18.  
  19. //////////////////////////////////////////////////////////////////////////////////
  20. // CDI_Joystick Destructor
  21. //////////////////////////////////////////////////////////////////////////////////
  22. CDI_Joystick::~CDI_Joystick(void)
  23. {
  24.     m_Device->Unacquire();
  25.     RELEASE(m_Device);
  26. }
  27.  
  28. static LPDIRECTINPUTDEVICE lpDID = NULL;
  29.  
  30. //////////////////////////////////////////////////////////////////////////////////
  31. // EnumJoystick
  32. //////////////////////////////////////////////////////////////////////////////////
  33. static BOOL FAR PASCAL EnumJoystick(LPCDIDEVICEINSTANCE pdinst, LPVOID pvRef)
  34. {
  35.     LPDIRECTINPUT pDI = (LPDIRECTINPUT)pvRef;
  36.  
  37.     if(pDI->CreateDevice(pdinst->guidInstance, &lpDID, NULL) != DI_OK)
  38.         return DIENUM_CONTINUE;
  39.  
  40.     return DIENUM_STOP;
  41. }
  42.  
  43. //////////////////////////////////////////////////////////////////////////////////
  44. // CDI_Joystick Create
  45. //////////////////////////////////////////////////////////////////////////////////
  46. HRESULT CDI_Joystick::Create(CDI_Input* input, void* hwnd)
  47. {
  48.     HRESULT rval;
  49.  
  50.     // Enumerate the joystick device
  51.     rval = input->GetDI()->EnumDevices(DIDEVTYPE_JOYSTICK, EnumJoystick, input->GetDI(), DIEDFL_ATTACHEDONLY);
  52.     if(lpDID != NULL && rval == DI_OK)
  53.     {
  54.         rval = lpDID->QueryInterface(IID_IDirectInputDevice2, (LPVOID*)&m_Device);
  55.         if(rval != DI_OK) return rval;
  56.  
  57.         RELEASE(lpDID);
  58.  
  59.         m_Device->SetDataFormat(&c_dfDIJoystick);
  60.         m_Device->SetCooperativeLevel(hwnd, DISCL_NONEXCLUSIVE | DISCL_FOREGROUND);
  61.  
  62.         // Set the X-axis range (-1000 to +1000)
  63.         DIPROPRANGE diprg;
  64.         diprg.diph.dwSize = sizeof(diprg);
  65.         diprg.diph.dwHeaderSize = sizeof(diprg.diph);
  66.         diprg.diph.dwObj = DIJOFS_X;
  67.         diprg.diph.dwHow = DIPH_BYOFFSET;
  68.         diprg.lMin = -1000;
  69.         diprg.lMax = +1000;
  70.  
  71.         if(m_Device->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK)
  72.             return rval;
  73.  
  74.         // And again for Y-axis range
  75.         diprg.diph.dwObj = DIJOFS_Y;
  76.  
  77.         if(m_Device->SetProperty(DIPROP_RANGE, &diprg.diph) != DI_OK)
  78.             return rval;
  79.  
  80.         // Set X axis dead zone to 10%
  81.         DIPROPDWORD dipdw;
  82.         dipdw.diph.dwSize = sizeof(dipdw);
  83.         dipdw.diph.dwHeaderSize = sizeof(dipdw.diph);
  84.         dipdw.diph.dwObj = DIJOFS_X;
  85.         dipdw.diph.dwHow = DIPH_BYOFFSET;
  86.         dipdw.dwData = 1000;
  87.  
  88.         if(m_Device->SetProperty(DIPROP_DEADZONE, &dipdw.diph) != DI_OK)
  89.             return rval;
  90.  
  91.         dipdw.diph.dwObj = DIJOFS_Y;
  92.  
  93.         // Set Y axis dead zone to 10%
  94.         if(m_Device->SetProperty(DIPROP_DEADZONE, &dipdw.diph) != DI_OK)
  95.             return rval;
  96.  
  97.         rval = m_Device->Acquire();
  98.         if(rval != DI_OK) return rval;
  99.  
  100.         m_bActive = TRUE;
  101.     }
  102.  
  103.     return rval;
  104. }
  105.  
  106. //////////////////////////////////////////////////////////////////////////////////
  107. // CDI_Joystick Update
  108. //////////////////////////////////////////////////////////////////////////////////
  109. void CDI_Joystick::Update(void)
  110. {
  111.     if(m_bActive)
  112.     {
  113.         DIJOYSTATE JoyState;
  114.  
  115.         m_Device->Poll();
  116.  
  117.         if(m_Device->GetDeviceState(sizeof(JoyState), &JoyState) == (DIERR_INPUTLOST | DIERR_NOTACQUIRED))
  118.             m_Device->Acquire();
  119.  
  120.         m_X = JoyState.lX;
  121.         m_Y = JoyState.lY;
  122.         m_Z = JoyState.lZ;
  123.  
  124.         for(int i = 0; i < 32; i++)
  125.             m_Buttons[i] = JoyState.rgbButtons[i];
  126.     }
  127. }
  128.