{-# LINE 1 "System/CWiid.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module System.CWiid
(
cwiidOpen,
CWiidWiimote,
CWiidState(..),
cwiidSetRptMode,
CWiidLedFlag,
cwiidLed1,
cwiidLed2,
cwiidLed3,
cwiidLed4,
cwiidSetLed,
combineCwiidLedFlag,
cwiidSetRumble,
cwiidGetBtnState, cwiidIsBtnPushed,
cwiidBtn2, cwiidBtn1, cwiidBtnB, cwiidBtnA, cwiidBtnMinus,
cwiidBtnHome, cwiidBtnLeft, cwiidBtnRight, cwiidBtnDown, cwiidBtnUp,
cwiidBtnPlus, combineCwiidBtnFlag, diffCwiidBtnFlag,
CWiidBtnFlag(..),
cwiidGetAcc,
CWiidAcc(..),
CWiidIRSrc(..),
cwiidGetIR
) where
import Data.Bits
import Foreign.C.Types
import Foreign.Marshal
import Foreign.Ptr
import Foreign.Storable
data CWiidBdaddr = CWiidBdaddr Int Int Int Int Int Int
instance Storable CWiidBdaddr where
sizeOf :: CWiidBdaddr -> Int
sizeOf = Int -> CWiidBdaddr -> Int
forall a b. a -> b -> a
const (Int
6)
{-# LINE 86 "System/CWiid.hsc" #-}
alignment = sizeOf
poke :: Ptr CWiidBdaddr -> CWiidBdaddr -> IO ()
poke Ptr CWiidBdaddr
bdat (CWiidBdaddr Int
b0 Int
b1 Int
b2 Int
b3 Int
b4 Int
b5) = do
((\Ptr CWiidBdaddr
hsc_ptr -> Ptr CWiidBdaddr -> Int -> Int -> IO ()
forall b. Ptr b -> Int -> Int -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CWiidBdaddr
hsc_ptr Int
0)) Ptr CWiidBdaddr
bdat Int
b0
{-# LINE 89 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 1)) bdat b1
{-# LINE 90 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 2)) bdat b2
{-# LINE 91 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 3)) bdat b3
{-# LINE 92 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 4)) bdat b4
{-# LINE 93 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 5)) bdat b5
{-# LINE 94 "System/CWiid.hsc" #-}
peek bdat = do
b0 <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) bdat
{-# LINE 96 "System/CWiid.hsc" #-}
b1 <- ((\hsc_ptr -> peekByteOff hsc_ptr 1)) bdat
{-# LINE 97 "System/CWiid.hsc" #-}
b2 <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) bdat
{-# LINE 98 "System/CWiid.hsc" #-}
b3 <- ((\hsc_ptr -> peekByteOff hsc_ptr 3)) bdat
{-# LINE 99 "System/CWiid.hsc" #-}
b4 <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) bdat
{-# LINE 100 "System/CWiid.hsc" #-}
b5 <- ((\hsc_ptr -> peekByteOff hsc_ptr 5)) bdat
{-# LINE 101 "System/CWiid.hsc" #-}
return $ CWiidBdaddr b0 b1 b2 b3 b4 b5
newtype CWiidWiimote = CWiidWiimote { CWiidWiimote -> Ptr ()
unCWiidWiimote :: Ptr () }
cwiidOpen :: IO (Maybe CWiidWiimote)
cwiidOpen :: IO (Maybe CWiidWiimote)
cwiidOpen =
(Ptr CWiidBdaddr -> IO (Maybe CWiidWiimote))
-> IO (Maybe CWiidWiimote)
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CWiidBdaddr -> IO (Maybe CWiidWiimote))
-> IO (Maybe CWiidWiimote))
-> (Ptr CWiidBdaddr -> IO (Maybe CWiidWiimote))
-> IO (Maybe CWiidWiimote)
forall a b. (a -> b) -> a -> b
$ \Ptr CWiidBdaddr
bdAddr -> do
Ptr CWiidBdaddr -> CWiidBdaddr -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr CWiidBdaddr
bdAddr (CWiidBdaddr -> IO ()) -> CWiidBdaddr -> IO ()
forall a b. (a -> b) -> a -> b
$ Int -> Int -> Int -> Int -> Int -> Int -> CWiidBdaddr
CWiidBdaddr Int
0 Int
0 Int
0 Int
0 Int
0 Int
0
Ptr ()
handle <- Ptr CWiidBdaddr -> CInt -> IO (Ptr ())
c_cwiid_open Ptr CWiidBdaddr
bdAddr CInt
0
if Ptr ()
handle Ptr () -> Ptr () -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr ()
forall a. Ptr a
nullPtr
then Maybe CWiidWiimote -> IO (Maybe CWiidWiimote)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe CWiidWiimote
forall a. Maybe a
Nothing
else Maybe CWiidWiimote -> IO (Maybe CWiidWiimote)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe CWiidWiimote -> IO (Maybe CWiidWiimote))
-> Maybe CWiidWiimote -> IO (Maybe CWiidWiimote)
forall a b. (a -> b) -> a -> b
$ CWiidWiimote -> Maybe CWiidWiimote
forall a. a -> Maybe a
Just (CWiidWiimote -> Maybe CWiidWiimote)
-> CWiidWiimote -> Maybe CWiidWiimote
forall a b. (a -> b) -> a -> b
$ Ptr () -> CWiidWiimote
CWiidWiimote Ptr ()
handle
data CWiidState = CWiidState
{ CWiidState -> Int
rptMode :: Int, CWiidState -> Int
led :: Int, CWiidState -> Int
rumble :: Int,
CWiidState -> Int
battery :: Int, CWiidState -> Int
buttons :: Int, CWiidState -> [Int]
acc :: [Int]
, CWiidState -> [CWiidIRSrc]
irSrc :: [CWiidIRSrc]
}
deriving Int -> CWiidState -> ShowS
[CWiidState] -> ShowS
CWiidState -> String
(Int -> CWiidState -> ShowS)
-> (CWiidState -> String)
-> ([CWiidState] -> ShowS)
-> Show CWiidState
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CWiidState -> ShowS
showsPrec :: Int -> CWiidState -> ShowS
$cshow :: CWiidState -> String
show :: CWiidState -> String
$cshowList :: [CWiidState] -> ShowS
showList :: [CWiidState] -> ShowS
Show
instance Storable CWiidState where
sizeOf :: CWiidState -> Int
sizeOf = Int -> CWiidState -> Int
forall a b. a -> b -> a
const (Int
64)
{-# LINE 160 "System/CWiid.hsc" #-}
alignment = sizeOf
poke :: Ptr CWiidState -> CWiidState -> IO ()
poke Ptr CWiidState
cwst (CWiidState Int
rp Int
l Int
ru Int
ba Int
bu [Int
ac0,Int
ac1,Int
ac2] [CWiidIRSrc]
irs) = do
((\Ptr CWiidState
hsc_ptr -> Ptr CWiidState -> Int -> Int -> IO ()
forall b. Ptr b -> Int -> Int -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CWiidState
hsc_ptr Int
0)) Ptr CWiidState
cwst Int
rp
{-# LINE 163 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 1)) cwst l
{-# LINE 164 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 2)) cwst ru
{-# LINE 165 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 3)) cwst ba
{-# LINE 166 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 4)) cwst bu
{-# LINE 167 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 6)) cwst (fromIntegral ac0 :: CUChar)
{-# LINE 168 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 7)) cwst (fromIntegral ac1 :: CUChar)
{-# LINE 169 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 8)) cwst (fromIntegral ac2 :: CUChar)
{-# LINE 170 "System/CWiid.hsc" #-}
pokeArray (((\hsc_ptr -> hsc_ptr `plusPtr` 10)) cwst) irs
{-# LINE 171 "System/CWiid.hsc" #-}
peek cwst = do
rp <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) cwst
{-# LINE 173 "System/CWiid.hsc" #-}
l <- ((\hsc_ptr -> peekByteOff hsc_ptr 1)) cwst
{-# LINE 174 "System/CWiid.hsc" #-}
ru <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) cwst
{-# LINE 175 "System/CWiid.hsc" #-}
ba <- ((\hsc_ptr -> peekByteOff hsc_ptr 3)) cwst
{-# LINE 176 "System/CWiid.hsc" #-}
bu <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) cwst
{-# LINE 177 "System/CWiid.hsc" #-}
ac0 <- ((\hsc_ptr -> peekByteOff hsc_ptr 6)) cwst
{-# LINE 178 "System/CWiid.hsc" #-}
ac1 <- ((\hsc_ptr -> peekByteOff hsc_ptr 7)) cwst
{-# LINE 179 "System/CWiid.hsc" #-}
ac2 <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) cwst
{-# LINE 180 "System/CWiid.hsc" #-}
irs <- peekArray cwiidIrSrcCount (((\hsc_ptr -> hsc_ptr `plusPtr` 10)) cwst)
{-# LINE 181 "System/CWiid.hsc" #-}
return $ CWiidState rp l ru ba bu [ fromIntegral (ac0 :: CUChar)
, fromIntegral (ac1 :: CUChar)
, fromIntegral (ac2 :: CUChar)]
irs
cwiidIrSrcCount :: Int
cwiidIrSrcCount :: Int
cwiidIrSrcCount = (Int
4)
{-# LINE 192 "System/CWiid.hsc" #-}
data CWiidIRSrc = CWiidIRSrc
{ CWiidIRSrc -> Bool
cwiidIRSrcValid :: Bool
, CWiidIRSrc -> Int
cwiidIRSrcPosX :: Int
, CWiidIRSrc -> Int
cwiidIRSrcPosY :: Int
, CWiidIRSrc -> Int
cwiidIRSrcSize :: Int
}
deriving Int -> CWiidIRSrc -> ShowS
[CWiidIRSrc] -> ShowS
CWiidIRSrc -> String
(Int -> CWiidIRSrc -> ShowS)
-> (CWiidIRSrc -> String)
-> ([CWiidIRSrc] -> ShowS)
-> Show CWiidIRSrc
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CWiidIRSrc -> ShowS
showsPrec :: Int -> CWiidIRSrc -> ShowS
$cshow :: CWiidIRSrc -> String
show :: CWiidIRSrc -> String
$cshowList :: [CWiidIRSrc] -> ShowS
showList :: [CWiidIRSrc] -> ShowS
Show
instance Storable CWiidIRSrc where
sizeOf :: CWiidIRSrc -> Int
sizeOf = Int -> CWiidIRSrc -> Int
forall a b. a -> b -> a
const (Int
8)
{-# LINE 215 "System/CWiid.hsc" #-}
alignment = sizeOf
poke :: Ptr CWiidIRSrc -> CWiidIRSrc -> IO ()
poke Ptr CWiidIRSrc
cwst (CWiidIRSrc Bool
valid Int
posX Int
posY Int
sz) = do
((\Ptr CWiidIRSrc
hsc_ptr -> Ptr CWiidIRSrc -> Int -> CChar -> IO ()
forall b. Ptr b -> Int -> CChar -> IO ()
forall a b. Storable a => Ptr b -> Int -> a -> IO ()
pokeByteOff Ptr CWiidIRSrc
hsc_ptr Int
0)) Ptr CWiidIRSrc
cwst ((if Bool
valid then (-CChar
1) else CChar
0) :: CChar)
{-# LINE 218 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 2)) cwst (fromIntegral posX :: CUShort)
{-# LINE 219 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 4)) cwst (fromIntegral posY :: CUShort)
{-# LINE 220 "System/CWiid.hsc" #-}
((\hsc_ptr -> pokeByteOff hsc_ptr 6)) cwst (fromIntegral sz :: CChar)
{-# LINE 221 "System/CWiid.hsc" #-}
peek cwst = do
valid <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) cwst
{-# LINE 223 "System/CWiid.hsc" #-}
posX <- ((\hsc_ptr -> peekByteOff hsc_ptr 2)) cwst
{-# LINE 224 "System/CWiid.hsc" #-}
posY <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) cwst
{-# LINE 225 "System/CWiid.hsc" #-}
sz <- ((\hsc_ptr -> peekByteOff hsc_ptr 6)) cwst
{-# LINE 226 "System/CWiid.hsc" #-}
return $ CWiidIRSrc (not ((valid :: CChar) == 0))
(fromIntegral (posX :: CUShort))
(fromIntegral (posY :: CUShort))
(fromIntegral (sz :: CChar))
cwiidGetIR :: CWiidWiimote -> IO [CWiidIRSrc]
cwiidGetIR :: CWiidWiimote -> IO [CWiidIRSrc]
cwiidGetIR CWiidWiimote
wm =
(Ptr CWiidState -> IO [CWiidIRSrc]) -> IO [CWiidIRSrc]
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CWiidState -> IO [CWiidIRSrc]) -> IO [CWiidIRSrc])
-> (Ptr CWiidState -> IO [CWiidIRSrc]) -> IO [CWiidIRSrc]
forall a b. (a -> b) -> a -> b
$ \Ptr CWiidState
wiState -> do
CInt
_ <- Ptr () -> Ptr CWiidState -> IO CInt
c_cwiid_get_state Ptr ()
handle Ptr CWiidState
wiState
CWiidState
ws <- Ptr CWiidState -> IO CWiidState
forall a. Storable a => Ptr a -> IO a
peek Ptr CWiidState
wiState
[CWiidIRSrc] -> IO [CWiidIRSrc]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (CWiidState -> [CWiidIRSrc]
irSrc CWiidState
ws)
where handle :: Ptr ()
handle = CWiidWiimote -> Ptr ()
unCWiidWiimote CWiidWiimote
wm
newtype CWiidLedFlag = CWiidLedFlag { CWiidLedFlag -> Int
unCWiidLedFlag :: Int }
deriving (CWiidLedFlag -> CWiidLedFlag -> Bool
(CWiidLedFlag -> CWiidLedFlag -> Bool)
-> (CWiidLedFlag -> CWiidLedFlag -> Bool) -> Eq CWiidLedFlag
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CWiidLedFlag -> CWiidLedFlag -> Bool
== :: CWiidLedFlag -> CWiidLedFlag -> Bool
$c/= :: CWiidLedFlag -> CWiidLedFlag -> Bool
/= :: CWiidLedFlag -> CWiidLedFlag -> Bool
Eq, Int -> CWiidLedFlag -> ShowS
[CWiidLedFlag] -> ShowS
CWiidLedFlag -> String
(Int -> CWiidLedFlag -> ShowS)
-> (CWiidLedFlag -> String)
-> ([CWiidLedFlag] -> ShowS)
-> Show CWiidLedFlag
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CWiidLedFlag -> ShowS
showsPrec :: Int -> CWiidLedFlag -> ShowS
$cshow :: CWiidLedFlag -> String
show :: CWiidLedFlag -> String
$cshowList :: [CWiidLedFlag] -> ShowS
showList :: [CWiidLedFlag] -> ShowS
Show)
cwiidLed1 :: CWiidLedFlag
cwiidLed1 :: CWiidLedFlag
cwiidLed1 = Int -> CWiidLedFlag
CWiidLedFlag Int
1
{-# LINE 248 "System/CWiid.hsc" #-}
cwiidLed2 :: CWiidLedFlag
cwiidLed2 :: CWiidLedFlag
cwiidLed2 = Int -> CWiidLedFlag
CWiidLedFlag Int
2
{-# LINE 254 "System/CWiid.hsc" #-}
cwiidLed3 :: CWiidLedFlag
cwiidLed3 :: CWiidLedFlag
cwiidLed3 = Int -> CWiidLedFlag
CWiidLedFlag Int
4
{-# LINE 260 "System/CWiid.hsc" #-}
cwiidLed4 :: CWiidLedFlag
cwiidLed4 :: CWiidLedFlag
cwiidLed4 = Int -> CWiidLedFlag
CWiidLedFlag Int
8
{-# LINE 266 "System/CWiid.hsc" #-}
cwiidSetLed :: CWiidWiimote -> CWiidLedFlag -> IO CInt
cwiidSetLed :: CWiidWiimote -> CWiidLedFlag -> IO CInt
cwiidSetLed CWiidWiimote
wm CWiidLedFlag
leds = Ptr () -> CUChar -> IO CInt
c_cwiid_set_led Ptr ()
handle CUChar
ledUChars
where handle :: Ptr ()
handle = CWiidWiimote -> Ptr ()
unCWiidWiimote CWiidWiimote
wm
ledUChars :: CUChar
ledUChars = Int -> CUChar
forall a b. (Integral a, Num b) => a -> b
fromIntegral (CWiidLedFlag -> Int
unCWiidLedFlag CWiidLedFlag
leds)
combineCwiidLedFlag :: [CWiidLedFlag] -> CWiidLedFlag
combineCwiidLedFlag :: [CWiidLedFlag] -> CWiidLedFlag
combineCwiidLedFlag = Int -> CWiidLedFlag
CWiidLedFlag (Int -> CWiidLedFlag)
-> ([CWiidLedFlag] -> Int) -> [CWiidLedFlag] -> CWiidLedFlag
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CWiidLedFlag -> Int -> Int) -> Int -> [CWiidLedFlag] -> Int
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (Int -> Int -> Int
forall a. Bits a => a -> a -> a
(.|.) (Int -> Int -> Int)
-> (CWiidLedFlag -> Int) -> CWiidLedFlag -> Int -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CWiidLedFlag -> Int
unCWiidLedFlag) Int
0
newtype CWiidBtnFlag = CWiidBtnFlag { CWiidBtnFlag -> Int
unCWiidBtnFlag :: Int }
deriving (CWiidBtnFlag -> CWiidBtnFlag -> Bool
(CWiidBtnFlag -> CWiidBtnFlag -> Bool)
-> (CWiidBtnFlag -> CWiidBtnFlag -> Bool) -> Eq CWiidBtnFlag
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CWiidBtnFlag -> CWiidBtnFlag -> Bool
== :: CWiidBtnFlag -> CWiidBtnFlag -> Bool
$c/= :: CWiidBtnFlag -> CWiidBtnFlag -> Bool
/= :: CWiidBtnFlag -> CWiidBtnFlag -> Bool
Eq, Int -> CWiidBtnFlag -> ShowS
[CWiidBtnFlag] -> ShowS
CWiidBtnFlag -> String
(Int -> CWiidBtnFlag -> ShowS)
-> (CWiidBtnFlag -> String)
-> ([CWiidBtnFlag] -> ShowS)
-> Show CWiidBtnFlag
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CWiidBtnFlag -> ShowS
showsPrec :: Int -> CWiidBtnFlag -> ShowS
$cshow :: CWiidBtnFlag -> String
show :: CWiidBtnFlag -> String
$cshowList :: [CWiidBtnFlag] -> ShowS
showList :: [CWiidBtnFlag] -> ShowS
Show)
cwiidBtn2 :: CWiidBtnFlag
cwiidBtn2 :: CWiidBtnFlag
cwiidBtn2 = Int -> CWiidBtnFlag
CWiidBtnFlag Int
1
cwiidBtn1 :: CWiidBtnFlag
cwiidBtn1 :: CWiidBtnFlag
cwiidBtn1 = Int -> CWiidBtnFlag
CWiidBtnFlag Int
2
cwiidBtnB :: CWiidBtnFlag
cwiidBtnB :: CWiidBtnFlag
cwiidBtnB = Int -> CWiidBtnFlag
CWiidBtnFlag Int
4
cwiidBtnA :: CWiidBtnFlag
cwiidBtnA :: CWiidBtnFlag
cwiidBtnA = Int -> CWiidBtnFlag
CWiidBtnFlag Int
8
cwiidBtnMinus :: CWiidBtnFlag
cwiidBtnMinus :: CWiidBtnFlag
cwiidBtnMinus = Int -> CWiidBtnFlag
CWiidBtnFlag Int
16
cwiidBtnHome :: CWiidBtnFlag
cwiidBtnHome :: CWiidBtnFlag
cwiidBtnHome = Int -> CWiidBtnFlag
CWiidBtnFlag Int
128
cwiidBtnLeft :: CWiidBtnFlag
cwiidBtnLeft :: CWiidBtnFlag
cwiidBtnLeft = Int -> CWiidBtnFlag
CWiidBtnFlag Int
256
cwiidBtnRight :: CWiidBtnFlag
cwiidBtnRight :: CWiidBtnFlag
cwiidBtnRight = Int -> CWiidBtnFlag
CWiidBtnFlag Int
512
cwiidBtnDown :: CWiidBtnFlag
cwiidBtnDown :: CWiidBtnFlag
cwiidBtnDown = CWiidBtnFlag 1024
cwiidBtnUp :: CWiidBtnFlag
cwiidBtnUp :: CWiidBtnFlag
cwiidBtnUp = Int -> CWiidBtnFlag
CWiidBtnFlag Int
2048
cwiidBtnPlus :: CWiidBtnFlag
cwiidBtnPlus :: CWiidBtnFlag
cwiidBtnPlus = Int -> CWiidBtnFlag
CWiidBtnFlag Int
4096
{-# LINE 300 "System/CWiid.hsc" #-}
combineCwiidBtnFlag :: [CWiidBtnFlag] -> CWiidBtnFlag
combineCwiidBtnFlag = CWiidBtnFlag . foldr ((.|.) . unCWiidBtnFlag) 0
diffCwiidBtnFlag :: CWiidBtnFlag -> CWiidBtnFlag -> CWiidBtnFlag
diffCwiidBtnFlag a b = CWiidBtnFlag $ ai - (ai .&. bi)
where ai = unCWiidBtnFlag a
bi = unCWiidBtnFlag b
newtype CWiidRptMode = CWiidRptMode { CWiidRptMode -> CUChar
unCWiidRptMode :: CUChar }
deriving (CWiidRptMode -> CWiidRptMode -> Bool
(CWiidRptMode -> CWiidRptMode -> Bool)
-> (CWiidRptMode -> CWiidRptMode -> Bool) -> Eq CWiidRptMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CWiidRptMode -> CWiidRptMode -> Bool
== :: CWiidRptMode -> CWiidRptMode -> Bool
$c/= :: CWiidRptMode -> CWiidRptMode -> Bool
/= :: CWiidRptMode -> CWiidRptMode -> Bool
Eq, Int -> CWiidRptMode -> ShowS
[CWiidRptMode] -> ShowS
CWiidRptMode -> String
(Int -> CWiidRptMode -> ShowS)
-> (CWiidRptMode -> String)
-> ([CWiidRptMode] -> ShowS)
-> Show CWiidRptMode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CWiidRptMode -> ShowS
showsPrec :: Int -> CWiidRptMode -> ShowS
$cshow :: CWiidRptMode -> String
show :: CWiidRptMode -> String
$cshowList :: [CWiidRptMode] -> ShowS
showList :: [CWiidRptMode] -> ShowS
Show)
cwiidSetRptMode :: CWiidWiimote -> CUChar -> IO CInt
cwiidSetRptMode :: CWiidWiimote -> CUChar -> IO CInt
cwiidSetRptMode CWiidWiimote
wm CUChar
u = Ptr () -> CUChar -> IO CInt
c_cwiid_set_rpt_mode Ptr ()
handle CUChar
u
where handle :: Ptr ()
handle = CWiidWiimote -> Ptr ()
unCWiidWiimote CWiidWiimote
wm
cwiidSetRumble :: CWiidWiimote -> CUChar -> IO CInt
cwiidSetRumble :: CWiidWiimote -> CUChar -> IO CInt
cwiidSetRumble CWiidWiimote
wm CUChar
rm = Ptr () -> CUChar -> IO CInt
c_cwiid_set_rumble Ptr ()
handle CUChar
rm
where handle :: Ptr ()
handle = CWiidWiimote -> Ptr ()
unCWiidWiimote CWiidWiimote
wm
cwiidGetBtnState :: CWiidWiimote -> IO CWiidBtnFlag
cwiidGetBtnState :: CWiidWiimote -> IO CWiidBtnFlag
cwiidGetBtnState CWiidWiimote
wm =
(Ptr CWiidState -> IO CWiidBtnFlag) -> IO CWiidBtnFlag
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CWiidState -> IO CWiidBtnFlag) -> IO CWiidBtnFlag)
-> (Ptr CWiidState -> IO CWiidBtnFlag) -> IO CWiidBtnFlag
forall a b. (a -> b) -> a -> b
$ \Ptr CWiidState
wiState -> do
CInt
_ <- Ptr () -> Ptr CWiidState -> IO CInt
c_cwiid_get_state Ptr ()
handle Ptr CWiidState
wiState
CWiidState
ws <- Ptr CWiidState -> IO CWiidState
forall a. Storable a => Ptr a -> IO a
peek Ptr CWiidState
wiState
CWiidBtnFlag -> IO CWiidBtnFlag
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (CWiidBtnFlag -> IO CWiidBtnFlag)
-> CWiidBtnFlag -> IO CWiidBtnFlag
forall a b. (a -> b) -> a -> b
$ Int -> CWiidBtnFlag
CWiidBtnFlag (Int -> CWiidBtnFlag) -> Int -> CWiidBtnFlag
forall a b. (a -> b) -> a -> b
$ CWiidState -> Int
buttons CWiidState
ws
where handle :: Ptr ()
handle = CWiidWiimote -> Ptr ()
unCWiidWiimote CWiidWiimote
wm
cwiidIsBtnPushed :: CWiidBtnFlag
-> CWiidBtnFlag
-> Bool
cwiidIsBtnPushed :: CWiidBtnFlag -> CWiidBtnFlag -> Bool
cwiidIsBtnPushed CWiidBtnFlag
flags CWiidBtnFlag
btn =
CWiidBtnFlag -> Int
unCWiidBtnFlag CWiidBtnFlag
flags Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. CWiidBtnFlag -> Int
unCWiidBtnFlag CWiidBtnFlag
btn Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== CWiidBtnFlag -> Int
unCWiidBtnFlag CWiidBtnFlag
btn
newtype CWiidAcc = CWiidAcc { CWiidAcc -> [Int]
unCWiidAcc :: [Int] }
deriving (CWiidAcc -> CWiidAcc -> Bool
(CWiidAcc -> CWiidAcc -> Bool)
-> (CWiidAcc -> CWiidAcc -> Bool) -> Eq CWiidAcc
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CWiidAcc -> CWiidAcc -> Bool
== :: CWiidAcc -> CWiidAcc -> Bool
$c/= :: CWiidAcc -> CWiidAcc -> Bool
/= :: CWiidAcc -> CWiidAcc -> Bool
Eq, Int -> CWiidAcc -> ShowS
[CWiidAcc] -> ShowS
CWiidAcc -> String
(Int -> CWiidAcc -> ShowS)
-> (CWiidAcc -> String) -> ([CWiidAcc] -> ShowS) -> Show CWiidAcc
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CWiidAcc -> ShowS
showsPrec :: Int -> CWiidAcc -> ShowS
$cshow :: CWiidAcc -> String
show :: CWiidAcc -> String
$cshowList :: [CWiidAcc] -> ShowS
showList :: [CWiidAcc] -> ShowS
Show)
cwiidGetAcc :: CWiidWiimote -> IO CWiidAcc
cwiidGetAcc :: CWiidWiimote -> IO CWiidAcc
cwiidGetAcc CWiidWiimote
wm =
(Ptr CWiidState -> IO CWiidAcc) -> IO CWiidAcc
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CWiidState -> IO CWiidAcc) -> IO CWiidAcc)
-> (Ptr CWiidState -> IO CWiidAcc) -> IO CWiidAcc
forall a b. (a -> b) -> a -> b
$ \Ptr CWiidState
wiState -> do
CInt
_ <- Ptr () -> Ptr CWiidState -> IO CInt
c_cwiid_get_state Ptr ()
handle Ptr CWiidState
wiState
CWiidState
ws <- Ptr CWiidState -> IO CWiidState
forall a. Storable a => Ptr a -> IO a
peek Ptr CWiidState
wiState
CWiidAcc -> IO CWiidAcc
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (CWiidAcc -> IO CWiidAcc) -> CWiidAcc -> IO CWiidAcc
forall a b. (a -> b) -> a -> b
$ [Int] -> CWiidAcc
CWiidAcc ([Int] -> CWiidAcc) -> [Int] -> CWiidAcc
forall a b. (a -> b) -> a -> b
$ CWiidState -> [Int]
acc CWiidState
ws
where handle :: Ptr ()
handle = CWiidWiimote -> Ptr ()
unCWiidWiimote CWiidWiimote
wm
foreign import ccall safe "cwiid_open" c_cwiid_open
:: Ptr CWiidBdaddr -> CInt -> IO (Ptr ())
foreign import ccall safe "cwiid_set_led" c_cwiid_set_led
:: Ptr () -> CUChar -> IO CInt
foreign import ccall safe "cwiid_set_rpt_mode" c_cwiid_set_rpt_mode
:: Ptr () -> CUChar -> IO CInt
foreign import ccall safe "cwiid_set_rumble" c_cwiid_set_rumble
:: Ptr () -> CUChar -> IO CInt
foreign import ccall safe "cwiid_get_state" c_cwiid_get_state
:: Ptr () -> Ptr CWiidState -> IO CInt