From 9b4662b8e40fb97db37b77b140112f8cacab34cc Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 7 Apr 2010 23:59:07 +0200 Subject: Added IR support --- src/HWiid.hsc | 48 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/src/HWiid.hsc b/src/HWiid.hsc index 56d87c6..9a4bb2f 100644 --- a/src/HWiid.hsc +++ b/src/HWiid.hsc @@ -2,6 +2,7 @@ module HWiid ( BDAddr(..) , Wiimote + , WiimoteIRSource(..) , WiimoteState(..) , WiimoteMesg(..) , nullWiimote @@ -10,6 +11,7 @@ module HWiid ( BDAddr(..) , hwiidFlagNonblock , hwiidReportStatus , hwiidReportButtons + , hwiidReportIR , hwiidLed1 , hwiidLed2 , hwiidLed3 @@ -40,6 +42,7 @@ module HWiid ( BDAddr(..) import Data.Bits +import Data.Int import Data.Typeable import Data.Word import Foreign.C.Types @@ -65,6 +68,9 @@ hwiidReportStatus = (#const CWIID_RPT_STATUS) hwiidReportButtons :: Word8 hwiidReportButtons = (#const CWIID_RPT_BTN) +hwiidReportIR :: Word8 +hwiidReportIR = (#const CWIID_RPT_IR) + hwiidLed1 :: Word8 hwiidLed1 = (#const CWIID_LED1_ON) @@ -156,8 +162,32 @@ bdAddrAny :: BDAddr bdAddrAny = BDAddr (0, 0, 0, 0, 0, 0) +data WiimoteIRSource = WiimoteIRSource + { irValid :: CChar + , irPosX :: Word16 + , irPosY :: Word16 + , irSize :: Int8 + } deriving (Eq, Show) + +instance Storable WiimoteIRSource where + sizeOf _ = (#size struct cwiid_ir_src) + alignment _ = alignment (undefined :: CInt) + + peek src = do + valid <- (#peek struct cwiid_ir_src, valid) src + posx <- (#peek struct cwiid_ir_src, pos[0]) src + posy <- (#peek struct cwiid_ir_src, pos[1]) src + size <- (#peek struct cwiid_ir_src, size) src + return $ WiimoteIRSource valid posx posy size + + poke _ _ = error "Can't write WiimoteIRSource" + data WiimoteState = WiimoteState - { stateButtons :: Word16 + { stateLed :: Word8 + , stateRumble :: Word8 + , stateBattery :: Word8 + , stateButtons :: Word16 + , stateIRSources :: [WiimoteIRSource] } deriving (Eq, Show) instance Storable WiimoteState where @@ -165,12 +195,14 @@ instance Storable WiimoteState where alignment _ = alignment (undefined :: CInt) peek state = do + led <- (#peek struct cwiid_state, led) state + rumble <- (#peek struct cwiid_state, rumble) state + battery <- (#peek struct cwiid_state, battery) state buttons <- (#peek struct cwiid_state, buttons) state - return $ WiimoteState (buttons) + irSources <- peekArray (#const CWIID_IR_SRC_COUNT) $ (#ptr struct cwiid_state, ir_src) state + return $ WiimoteState led rumble battery buttons (filter (\src -> (irValid src) /= 0) irSources) - poke state (WiimoteState (buttons)) = do - (#poke struct cwiid_state, buttons) state buttons - + poke _ _ = fail "Can't write WiimoteState" data WiimoteMesg = WiimoteStatusMesg { mesgType :: (#type enum cwiid_mesg_type) @@ -182,6 +214,8 @@ data WiimoteMesg = WiimoteStatusMesg , mesgButtons :: Word16 } | WiimoteMesgUnknown + { mesgType :: (#type enum cwiid_mesg_type) + } deriving (Eq, Show) instance Storable WiimoteMesg where @@ -199,10 +233,10 @@ instance Storable WiimoteMesg where | mesgtype == hwiidMesgTypeButton -> do buttons <- (#peek struct cwiid_btn_mesg, buttons) mesg return $ WiimoteButtonMesg mesgtype buttons - | otherwise -> return WiimoteMesgUnknown + | otherwise -> return $ WiimoteMesgUnknown mesgtype - poke _ _ = error "Can't write WiimoteMesg" + poke _ _ = fail "Can't write WiimoteMesg" newtype Wiimote = Wiimote (Ptr Wiimote) deriving (Eq, Ord, Show, Storable) -- cgit v1.2.3