Back to index

libsfml  1.6+dfsg2
Joystick.cpp
Go to the documentation of this file.
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     myNbButtons        = 0;
00047     myIsConnected      = false;
00048     myHasContinuousPOV = false;
00049     for (int i = 0; i < Joy::AxisCount; ++i)
00050         myAxes[i] = false;
00051 
00052     // Get the Index-th connected joystick
00053     MMRESULT Error;
00054     JOYINFOEX JoyInfo;
00055     JoyInfo.dwSize = sizeof(JoyInfo);
00056     JoyInfo.dwFlags = JOY_RETURNALL;
00057     for (unsigned int NbFound = 0; (Error = joyGetPosEx(myIndex, &JoyInfo)) != JOYERR_PARMS; myIndex++)
00058     {
00059         // Check if the current joystick is connected
00060         if (Error == JOYERR_NOERROR)
00061         {
00062             // Check if it's the required index
00063             if (NbFound == Index)
00064             {
00065                 // Ok : store its parameters and return
00066                 myIsConnected = true;
00067                 JOYCAPS Caps;
00068                 joyGetDevCaps(myIndex, &Caps, sizeof(Caps));
00069                 myNbButtons = Caps.wNumButtons;
00070                 if (myNbButtons > Joy::ButtonCount)
00071                     myNbButtons = Joy::ButtonCount;
00072 
00073                 myAxes[Joy::AxisX]   = true;
00074                 myAxes[Joy::AxisY]   = true;
00075                 myAxes[Joy::AxisZ]   = (Caps.wCaps & JOYCAPS_HASZ) != 0;
00076                 myAxes[Joy::AxisR]   = (Caps.wCaps & JOYCAPS_HASR) != 0;
00077                 myAxes[Joy::AxisU]   = (Caps.wCaps & JOYCAPS_HASU) != 0;
00078                 myAxes[Joy::AxisV]   = (Caps.wCaps & JOYCAPS_HASV) != 0;
00079                 myAxes[Joy::AxisPOV] = (Caps.wCaps & JOYCAPS_HASPOV) != 0;
00080                 myHasContinuousPOV   = (Caps.wCaps & JOYCAPS_POVCTS) != 0;
00081 
00082                 return;
00083             }
00084 
00085             // Go to the next valid joystick
00086             ++NbFound;
00087         }
00088     }
00089 }
00090 
00091 
00095 JoystickState Joystick::UpdateState()
00096 {
00097     JoystickState State;
00098 
00099     if (myIsConnected)
00100     {
00101         // Get the joystick caps (for range conversions)
00102         JOYCAPS Caps;
00103         if (joyGetDevCaps(myIndex, &Caps, sizeof(Caps)) == JOYERR_NOERROR)
00104         {
00105             // Get the current joystick state
00106             JOYINFOEX Pos;
00107             Pos.dwFlags  = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | JOY_RETURNR | JOY_RETURNU | JOY_RETURNV | JOY_RETURNBUTTONS;
00108             Pos.dwFlags |= myHasContinuousPOV ? JOY_RETURNPOVCTS : JOY_RETURNPOV;
00109             Pos.dwSize   = sizeof(JOYINFOEX);
00110             if (joyGetPosEx(myIndex, &Pos) == JOYERR_NOERROR)
00111             {
00112                 // Axes
00113                 State.Axis[Joy::AxisX] = (Pos.dwXpos - (Caps.wXmax + Caps.wXmin) / 2.f) * 200.f / (Caps.wXmax - Caps.wXmin);
00114                 State.Axis[Joy::AxisY] = (Pos.dwYpos - (Caps.wYmax + Caps.wYmin) / 2.f) * 200.f / (Caps.wYmax - Caps.wYmin);
00115                 State.Axis[Joy::AxisZ] = (Pos.dwZpos - (Caps.wZmax + Caps.wZmin) / 2.f) * 200.f / (Caps.wZmax - Caps.wZmin);
00116                 State.Axis[Joy::AxisR] = (Pos.dwRpos - (Caps.wRmax + Caps.wRmin) / 2.f) * 200.f / (Caps.wRmax - Caps.wRmin);
00117                 State.Axis[Joy::AxisU] = (Pos.dwUpos - (Caps.wUmax + Caps.wUmin) / 2.f) * 200.f / (Caps.wUmax - Caps.wUmin);
00118                 State.Axis[Joy::AxisV] = (Pos.dwVpos - (Caps.wVmax + Caps.wVmin) / 2.f) * 200.f / (Caps.wVmax - Caps.wVmin);
00119 
00120                 // POV
00121                 if (Pos.dwPOV != 0xFFFF)
00122                     State.Axis[Joy::AxisPOV] = Pos.dwPOV / 100.f;
00123                 else
00124                     State.Axis[Joy::AxisPOV] = -1.f;
00125 
00126                 // Buttons
00127                 for (unsigned int i = 0; i < GetButtonsCount(); ++i)
00128                     State.Buttons[i] = (Pos.dwButtons & (1 << i)) != 0;
00129             }
00130         }
00131     }
00132 
00133     return State;
00134 }
00135 
00136 
00140 bool Joystick::HasAxis(Joy::Axis Axis) const
00141 {
00142     return myAxes[Axis];
00143 }
00144 
00145 
00149 unsigned int Joystick::GetButtonsCount() const
00150 {
00151     return myNbButtons;
00152 }
00153 
00154 
00155 } // namespace priv
00156 
00157 } // namespace sf