Added support for calibration

This commit is contained in:
Matthias Schiffer 2010-04-10 15:17:23 +02:00
parent 2ce242f608
commit 1a31573eb8

View file

@ -4,8 +4,11 @@ module HWiid ( BDAddr(..)
, Wiimote
, WiimoteIRSource(..)
, WiimoteState(..)
, WiimoteExtType
, WiimoteExtState(..)
, WiimoteMesgType
, WiimoteMesg(..)
, WiimoteAccCal(..)
, nullWiimote
, bdAddrAny
, hwiidFlagMesgInterface
@ -46,6 +49,7 @@ module HWiid ( BDAddr(..)
, hwiidSetReportMode
, hwiidSetLed
, hwiidGetMesg
, hwiidGetAccCal
) where
@ -150,17 +154,21 @@ hwiidIRMaxY :: CInt
hwiidIRMaxY = (#const CWIID_IR_Y_MAX)
hwiidMesgTypeStatus :: (#type enum cwiid_mesg_type)
type WiimoteMesgType = (#type enum cwiid_mesg_type)
hwiidMesgTypeStatus :: WiimoteMesgType
hwiidMesgTypeStatus = (#const CWIID_MESG_STATUS)
hwiidMesgTypeButton :: (#type enum cwiid_mesg_type)
hwiidMesgTypeButton :: WiimoteMesgType
hwiidMesgTypeButton = (#const CWIID_MESG_BTN)
hwiidExtNone :: (#type enum cwiid_ext_type)
type WiimoteExtType = (#type enum cwiid_ext_type)
hwiidExtNone :: WiimoteExtType
hwiidExtNone = (#const CWIID_EXT_NONE)
hwiidExtNunchuk :: (#type enum cwiid_ext_type)
hwiidExtNunchuk :: WiimoteExtType
hwiidExtNunchuk = (#const CWIID_EXT_NUNCHUK)
@ -244,15 +252,15 @@ instance Storable WiimoteState where
poke _ _ = fail "Can't write WiimoteState"
data WiimoteMesg = WiimoteStatusMesg
{ mesgType :: (#type enum cwiid_mesg_type)
{ mesgType :: WiimoteMesgType
, mesgBattery :: Word8
}
| WiimoteButtonMesg
{ mesgType :: (#type enum cwiid_mesg_type)
{ mesgType :: WiimoteMesgType
, mesgButtons :: Word16
}
| WiimoteMesgOther
{ mesgType :: (#type enum cwiid_mesg_type)
{ mesgType :: WiimoteMesgType
}
deriving (Eq, Show)
@ -277,17 +285,17 @@ instance Storable WiimoteMesg where
data WiimoteExtState = WiimoteNunchukState
{ extType :: (#type enum cwiid_ext_type)
{ extType :: WiimoteExtType
, extNunchukStickX :: Word8
, extNunchukStickY :: Word8
, extNunchukButtons :: Word8
}
| WiimoteOtherState
{ extType :: (#type enum cwiid_ext_type)
{ extType :: WiimoteExtType
}
deriving (Eq, Show)
peekExtState :: (#type enum cwiid_ext_type) -> Ptr WiimoteExtState -> IO WiimoteExtState
peekExtState :: WiimoteExtType -> Ptr WiimoteExtState -> IO WiimoteExtState
peekExtState exttype state
| exttype == hwiidExtNunchuk = do
posx <- (#peek struct nunchuk_state, stick[0]) state
@ -297,6 +305,33 @@ peekExtState exttype state
| otherwise = return $ WiimoteOtherState exttype
data WiimoteAccCal = WiimoteAccCal
{ accCalZeroX :: Word8
, accCalZeroY :: Word8
, accCalZeroZ :: Word8
, accCalOneX :: Word8
, accCalOneY :: Word8
, accCalOneZ :: Word8
}
deriving (Eq, Show)
instance Storable WiimoteAccCal where
sizeOf _ = (#size struct acc_cal)
alignment _ = alignment (undefined :: CInt)
peek cal = do
zerox <- (#peek struct acc_cal, zero[0]) cal
zeroy <- (#peek struct acc_cal, zero[1]) cal
zeroz <- (#peek struct acc_cal, zero[2]) cal
onex <- (#peek struct acc_cal, one[0]) cal
oney <- (#peek struct acc_cal, one[1]) cal
onez <- (#peek struct acc_cal, one[2]) cal
return $ WiimoteAccCal zerox zeroy zeroz onex oney onez
poke _ _ = fail "Can't write WiimoteAccCal"
newtype Wiimote = Wiimote (Ptr Wiimote) deriving (Eq, Ord, Show, Storable)
@ -346,3 +381,10 @@ hwiidGetMesg wiimote = alloca $ \countptr -> alloca $ \arrayptr -> alloca $ \tim
free array
return list
else return []
foreign import ccall unsafe "cwiid.h cwiid_get_acc_cal"
cwiid_get_acc_cal :: Wiimote -> WiimoteExtType -> Ptr WiimoteAccCal -> IO CInt
hwiidGetAccCal wiimote exttype = alloca $ \calptr -> do
cwiid_get_acc_cal wiimote exttype calptr
cal <- peek calptr
return cal