module SFML.Window.Joystick
(
JoystickCap(..)
, JoystickAxis(..)
, isJoystickConnected
, getButtonCount
, hasAxis
, isJoystickButtonPressed
, getAxisPosition
, getJoystickIdentification
, updateJoystick
)
where
import SFML.Window.JoystickIdentification
import Foreign.C.Types
import Foreign.Marshal.Alloc (alloca)
import Foreign.Storable
import Foreign.Ptr (Ptr, castPtr)
data JoystickCap
= JoystickCount
| JoystickButtonCount
| JoystickAxisCount
deriving (Eq, Bounded, Show)
instance Enum JoystickCap where
fromEnum JoystickCount = 8
fromEnum JoystickButtonCount = 32
fromEnum JoystickAxisCount = 8
toEnum 8 = JoystickCount
toEnum 32 = JoystickButtonCount
data JoystickAxis
= JoystickX
| JoystickY
| JoystickZ
| JoystickR
| JoystickU
| JoystickV
| JoystickPovX
| JoystickPovY
deriving (Eq, Enum, Bounded, Show)
sizeInt = (4)
instance Storable JoystickAxis where
sizeOf _ = sizeInt
alignment _ = alignment (undefined :: CInt)
peek ptr = peek (castPtr ptr :: Ptr CInt) >>= return . toEnum . fromIntegral
poke ptr bt = poke (castPtr ptr :: Ptr CInt) (fromIntegral . fromEnum $ bt)
isJoystickConnected
:: Int
-> IO Bool
isJoystickConnected j = sfJoystick_isConnected (fromIntegral j) >>= return . (/=0)
foreign import ccall unsafe "sfJoystick_isConnected"
sfJoystick_isConnected :: CUInt -> IO CChar
getButtonCount
:: Int
-> IO Int
getButtonCount j = fmap fromIntegral $ sfJoystick_getButtonCount (fromIntegral j)
foreign import ccall unsafe "sfJoystick_getButtonCount"
sfJoystick_getButtonCount :: CUInt -> IO CUInt
hasAxis
:: Int
-> Int
-> IO Bool
hasAxis j a = sfJoystick_hasAxis (fromIntegral j) (fromIntegral a) >>= return . (/=0)
foreign import ccall unsafe "sfJoystick_hasAxis"
sfJoystick_hasAxis :: CUInt -> CUInt -> IO CChar
isJoystickButtonPressed
:: Int
-> Int
-> IO Bool
isJoystickButtonPressed j b = sfJoystick_isButtonPressed (fromIntegral j) (fromIntegral b) >>= return . (/=0)
foreign import ccall unsafe "sfJoystick_isButtonPressed"
sfJoystick_isButtonPressed :: CUInt -> CUInt -> IO CChar
getAxisPosition
:: Int
-> Int
-> IO Float
getAxisPosition j a = sfJoystick_getAxisPosition (fromIntegral j) (fromIntegral a) >>= return . realToFrac
foreign import ccall unsafe "sfJoystick_getAxisPosition"
sfJoystick_getAxisPosition :: CUInt -> CUInt -> IO CFloat
getJoystickIdentification
:: Int
-> IO JoystickIdentification
getJoystickIdentification j
= alloca $ \ptr -> sfJoystick_getIdentification_helper (fromIntegral j) ptr >> peek ptr
foreign import ccall unsafe "sfJoystick_getIdentification_helper"
sfJoystick_getIdentification_helper :: CUInt -> Ptr JoystickIdentification -> IO ()
updateJoystick :: IO ()
updateJoystick = sfJoystick_update
foreign import ccall unsafe "sfJoystick_update"
sfJoystick_update :: IO ()