{- * Create K8055D.def with exports * dlltool -d K8055D.def -l K8055D.a * Use --extra-lib-dirs=. with cabal configure/install -} module Bindings.K8055 ( getVersion, -- * General Procedures CardAddress(..), withDevice, module Bindings.K8055.AnalogIn, module Bindings.K8055.AnalogOut, module Bindings.K8055.DigitalOut, module Bindings.K8055.DigitalIn, module Bindings.K8055.Counters ) where import Foreign.C import Control.Monad import Bindings.K8055.AnalogIn import Bindings.K8055.AnalogOut import Bindings.K8055.DigitalOut import Bindings.K8055.DigitalIn import Bindings.K8055.Counters -- | Depends on jumpers SK5, SK6 data CardAddress = Card1 -- ^ SK5:ON SK6:ON | Card2 -- ^ SK5:OFF SK6:ON | Card3 -- ^ SK5:ON SK6:OFF | Card4 -- ^ SK5:OFF SK6:OFF addressId :: Num a => CardAddress -> a addressId address = case address of Card1 -> 0 Card2 -> 1 Card3 -> 2 Card4 -> 3 foreign import stdcall unsafe "Version" c_Version :: IO CInt getVersion :: IO Int getVersion = do vers <- c_Version return $ fromIntegral vers foreign import stdcall unsafe "OpenDevice" c_OpenDevice :: CInt -> IO CInt foreign import stdcall unsafe "CloseDevice" c_CloseDevice :: IO () -- | Device is opened, action is performed and device is closed withDevice :: CardAddress -> IO a -> IO a withDevice address action = do ret <- c_OpenDevice (addressId address) when (ret /= 0) (error "open device failed") result <- action c_CloseDevice return result