import Control.Monad (unless) import Control.Monad.Fix (fix) import Control.Concurrent (threadDelay) import System.Hardware.Joystick main :: IO () main = do c <- countJoysticks if c > 0 then do putStrLn $ "Joysticks available: " ++ show c putStrLn "Opening Joystick #0" js <- openJoystick 0 run js joystickClose js else putStrLn "No Joysticks" run :: Joystick -> IO () run js = do -- Show information mapM_ putStrLn $ [ "Name: " ++ show (joystickName js) , "Version: " ++ show (joystickVersion js) , "Buttons: " ++ show (joystickButtons js) , "Axes: " ++ show (joystickAxes js) ] -- Loop 1000 times ($ 1000) $ fix $ \loop n -> unless (n == 0) $ do es <- joystickPoll js mapM_ (putStrLn . showEvt) es threadDelay 1000 loop (n - 1) showEvt :: JoystickEvent -> String showEvt evt = case evt of JoystickEventButton idx val -> info "Btn " (show idx) (show val) JoystickEventAxis idx val -> info "Axis" (show idx) (show val) where info t i v = t ++ " [idx: " ++ i ++ ",\tval: " ++ v ++ "]"