SFML logo
  • Main Page
  • Namespaces
  • Classes
  • Files
  • File List

Joystick.cpp

00001 
00002 //
00003 // SFML - Simple and Fast Multimedia Library
00004 // Copyright (C) 2007-2009 Laurent Gomila (laurent.gom@gmail.com)
00005 //
00006 // This software is provided 'as-is', without any express or implied warranty.
00007 // In no event will the authors be held liable for any damages arising from the use of this software.
00008 //
00009 // Permission is granted to anyone to use this software for any purpose,
00010 // including commercial applications, and to alter it and redistribute it freely,
00011 // subject to the following restrictions:
00012 //
00013 // 1. The origin of this software must not be misrepresented;
00014 //    you must not claim that you wrote the original software.
00015 //    If you use this software in a product, an acknowledgment
00016 //    in the product documentation would be appreciated but is not required.
00017 //
00018 // 2. Altered source versions must be plainly marked as such,
00019 //    and must not be misrepresented as being the original software.
00020 //
00021 // 3. This notice may not be removed or altered from any source distribution.
00022 //
00024 
00026 // Headers
00028 #define _WIN32_WINDOWS 0x0501
00029 #define _WIN32_WINNT   0x0501
00030 #include <SFML/Window/Joystick.hpp>
00031 #include <windows.h>
00032 #include <mmsystem.h>
00033 
00034 
00035 namespace sf
00036 {
00037 namespace priv
00038 {
00042 void Joystick::Initialize(unsigned int Index)
00043 {
00044     // Reset state
00045     myIndex     = JOYSTICKID1;
00046     myNbAxes    = 0;
00047     myNbButtons = 0;
00048 
00049     // Get the Index-th connected joystick
00050     MMRESULT Error;
00051     JOYINFOEX JoyInfo;
00052     JoyInfo.dwSize = sizeof(JoyInfo);
00053     JoyInfo.dwFlags = JOY_RETURNALL;
00054     for (unsigned int NbFound = 0; (Error = joyGetPosEx(myIndex, &JoyInfo)) != JOYERR_PARMS; myIndex++)
00055     {
00056         // Check if the current joystick is connected
00057         if (Error == JOYERR_NOERROR)
00058         {
00059             // Check if it's the required index
00060             if (NbFound == Index)
00061             {
00062                 // Ok : store its parameters and return
00063                 JOYCAPS Caps;
00064                 joyGetDevCaps(myIndex, &Caps, sizeof(Caps));
00065                 myNbAxes    = Caps.wNumAxes;
00066                 myNbButtons = Caps.wNumButtons;
00067                 if (myNbButtons > JoystickState::MaxButtons)
00068                     myNbButtons = JoystickState::MaxButtons;
00069 
00070                 return;
00071             }
00072 
00073             // Go to the next valid joystick
00074             ++NbFound;
00075         }
00076     }
00077 }
00078 
00079 
00083 JoystickState Joystick::UpdateState()
00084 {
00085     JoystickState State = {0};
00086 
00087     // Get the joystick caps (for range conversions)
00088     JOYCAPS Caps;
00089     if (joyGetDevCaps(myIndex, &Caps, sizeof(Caps)) == JOYERR_NOERROR)
00090     {
00091         // Get the current joystick state
00092         JOYINFOEX Pos;
00093         Pos.dwFlags = JOY_RETURNALL;
00094         Pos.dwSize  = sizeof(JOYINFOEX);
00095         if (joyGetPosEx(myIndex, &Pos) == JOYERR_NOERROR)
00096         {
00097             // Axes
00098             State.Axis[Joy::AxisX] = (Pos.dwXpos - (Caps.wXmax + Caps.wXmin) / 2.f) * 200.f / (Caps.wXmax - Caps.wXmin);
00099             State.Axis[Joy::AxisY] = (Pos.dwYpos - (Caps.wYmax + Caps.wYmin) / 2.f) * 200.f / (Caps.wYmax - Caps.wYmin);
00100             State.Axis[Joy::AxisZ] = (Pos.dwZpos - (Caps.wZmax + Caps.wZmin) / 2.f) * 200.f / (Caps.wZmax - Caps.wZmin);
00101             State.Axis[Joy::AxisR] = (Pos.dwRpos - (Caps.wRmax + Caps.wRmin) / 2.f) * 200.f / (Caps.wRmax - Caps.wRmin);
00102             State.Axis[Joy::AxisU] = (Pos.dwUpos - (Caps.wUmax + Caps.wUmin) / 2.f) * 200.f / (Caps.wUmax - Caps.wUmin);
00103             State.Axis[Joy::AxisV] = (Pos.dwVpos - (Caps.wVmax + Caps.wVmin) / 2.f) * 200.f / (Caps.wVmax - Caps.wVmin);
00104 
00105             // POV
00106             State.Axis[Joy::AxisPOV] = Pos.dwPOV / 100.f;
00107 
00108             // Buttons
00109             for (unsigned int i = 0; i < GetButtonsCount(); ++i)
00110                 State.Buttons[i] = (Pos.dwButtons & (1 << i)) != 0;
00111         }
00112     }
00113 
00114     return State;
00115 }
00116 
00117 
00121 unsigned int Joystick::GetAxesCount() const
00122 {
00123     return myNbAxes;
00124 }
00125 
00126 
00130 unsigned int Joystick::GetButtonsCount() const
00131 {
00132     return myNbButtons;
00133 }
00134 
00135 
00136 } // namespace priv
00137 
00138 } // namespace sf

 ::  Copyright © 2007-2008 Laurent Gomila, all rights reserved  ::  Documentation generated by doxygen 1.5.2  ::