module System.Hardware.WiringPi
(
Pin
, Value (..)
, Mode (..)
, Pud (..)
, PwmMode (..)
, PwmValue
, wiringPiSetup
, wiringPiSetupGpio
, wiringPiSetupPhys
, wiringPiSetupSys
, pinMode
, pullUpDnControl
, digitalRead
, digitalWrite
, pwmWrite
, digitalWriteByte
, pwmSetMode
, pwmSetRange
, pwmSetClock
, piBoardRev
, wpiPinToGpio
, physPinToGpio
) where
import Control.Applicative
import Control.Monad ( when )
import Data.Word ( Word8, Word16 )
import Foreign.C.Types ( CInt(..), CUInt(..) )
type Pin = CInt
type PwmValue = Word16
data Value = LOW | HIGH deriving (Eq, Ord, Show, Read, Enum, Bounded)
data Mode = INPUT
| OUTPUT
| PWM_OUTPUT
| GPIO_CLOCK
deriving (Eq, Ord, Show, Read, Enum, Bounded)
data Pud = PUD_OFF
| PUD_DOWN
| PUD_UP
deriving (Eq, Ord, Show, Read, Enum, Bounded)
data PwmMode = PWM_MODE_BAL
| PWM_MODE_MS
deriving (Eq, Ord, Show, Read, Enum, Bounded)
valueToInt :: Value -> CInt
valueToInt LOW = undefined
valueToInt HIGH = undefined
intToValue :: CInt -> Value
intToValue = undefined
modeToInt :: Mode -> CInt
modeToInt INPUT = undefined
modeToInt OUTPUT = undefined
modeToInt PWM_OUTPUT = undefined
modeToInt GPIO_CLOCK = undefined
pudToInt :: Pud -> CInt
pudToInt PUD_OFF = undefined
pudToInt PUD_DOWN = undefined
pudToInt PUD_UP = undefined
pwmModeToInt :: PwmMode -> CInt
pwmModeToInt PWM_MODE_BAL = undefined
pwmModeToInt PWM_MODE_MS = undefined
foreign import ccall unsafe "stdlib.h abort"
c_wiringPiSetup :: IO CInt
foreign import ccall unsafe "stdlib.h abort"
c_wiringPiSetupGpio :: IO CInt
foreign import ccall unsafe "stdlib.h abort"
c_wiringPiSetupPhys :: IO CInt
foreign import ccall unsafe "stdlib.h abort"
c_wiringPiSetupSys :: IO CInt
foreign import ccall unsafe "stdlib.h abort"
c_pinMode :: CInt
-> CInt
-> IO ()
foreign import ccall unsafe "stdlib.h abort"
c_pullUpDnControl :: CInt
-> CInt
-> IO ()
foreign import ccall unsafe "stdlib.h abort"
c_digitalRead :: CInt
-> IO CInt
foreign import ccall unsafe "stdlib.h abort"
c_digitalWrite :: CInt
-> CInt
-> IO ()
foreign import ccall unsafe "stdlib.h abort"
c_pwmWrite :: CInt
-> CInt
-> IO ()
foreign import ccall unsafe "stdlib.h abort"
c_digitalWriteByte :: CInt
-> IO ()
foreign import ccall unsafe "stdlib.h abort"
c_pwmSetMode :: CInt
-> IO ()
foreign import ccall unsafe "stdlib.h abort"
c_pwmSetRange :: CUInt
-> IO ()
foreign import ccall unsafe "stdlib.h abort"
c_pwmSetClock :: CInt
-> IO ()
foreign import ccall unsafe "stdlib.h abort"
c_piBoardRev :: IO CInt
foreign import ccall unsafe "stdlib.h abort"
c_wpiPinToGpio :: CInt
-> IO CInt
foreign import ccall unsafe "stdlib.h abort"
c_physPinToGpio :: CInt
-> IO CInt
doWiringPiSetup :: IO CInt -> String -> IO ()
doWiringPiSetup setupFunc name = do
ret <- setupFunc
when (ret /= 0) $
fail $ "failing return code " ++ show ret ++ " for " ++ name
wiringPiSetup :: IO ()
wiringPiSetup = doWiringPiSetup c_wiringPiSetup "wiringPiSetup"
wiringPiSetupGpio :: IO ()
wiringPiSetupGpio = doWiringPiSetup c_wiringPiSetupGpio "wiringPiSetupGpio"
wiringPiSetupPhys :: IO ()
wiringPiSetupPhys = doWiringPiSetup c_wiringPiSetupPhys "wiringPiSetupPhys"
wiringPiSetupSys :: IO ()
wiringPiSetupSys = doWiringPiSetup c_wiringPiSetupSys "wiringPiSetupSys"
pinMode :: Pin -> Mode -> IO ()
pinMode pin mode = c_pinMode pin $ modeToInt mode
pullUpDnControl :: Pin -> Pud -> IO ()
pullUpDnControl pin pud = c_pullUpDnControl pin $ pudToInt pud
digitalRead :: Pin -> IO Value
digitalRead pin = intToValue <$> c_digitalRead pin
digitalWrite :: Pin -> Value -> IO ()
digitalWrite pin val = c_digitalWrite pin $ valueToInt val
pwmWrite :: Pin -> PwmValue -> IO ()
pwmWrite pin val = c_pwmWrite pin $ fromIntegral val
digitalWriteByte :: Word8 -> IO ()
digitalWriteByte w = c_digitalWriteByte $ fromIntegral w
pwmSetMode :: PwmMode -> IO ()
pwmSetMode mode = c_pwmSetMode $ pwmModeToInt mode
pwmSetRange :: PwmValue -> IO ()
pwmSetRange range = c_pwmSetRange $ fromIntegral range
pwmSetClock :: PwmValue -> IO ()
pwmSetClock divisor = c_pwmSetClock $ fromIntegral divisor
piBoardRev :: IO Int
piBoardRev = fromIntegral <$> c_piBoardRev
wpiPinToGpio :: Pin -> IO Pin
wpiPinToGpio = c_wpiPinToGpio
physPinToGpio :: Pin -> IO Pin
physPinToGpio = c_physPinToGpio