module Bindings.K8055.DigitalOut (
  DigitalOutput(..),
  writeAllDigital,
  clearDigitalChannel,
  clearAllDigital,
  setDigitalChannel,
  setAllDigital
  ) where

import Foreign.C
import Data.Word

data DigitalOutput
  = DigitalOut1
  | DigitalOut2
  | DigitalOut3
  | DigitalOut4
  | DigitalOut5
  | DigitalOut6
  | DigitalOut7
  | DigitalOut8

digitalOutputId :: Num a => DigitalOutput -> a
digitalOutputId output =
  case output of
    DigitalOut1 -> 1
    DigitalOut2 -> 2
    DigitalOut3 -> 3
    DigitalOut4 -> 4
    DigitalOut5 -> 5
    DigitalOut6 -> 6
    DigitalOut7 -> 7
    DigitalOut8 -> 8


foreign import stdcall unsafe "WriteAllDigital"
  c_WriteAllDigital :: CInt -> IO ()

-- | Sets the digital outputs according to the data
writeAllDigital :: Word8 -> IO ()
writeAllDigital val =
  c_WriteAllDigital (fromIntegral val)


foreign import stdcall unsafe "ClearDigitalChannel"
  c_ClearDigitalChannel :: CInt -> IO ()

-- | Clears the output channel
clearDigitalChannel :: DigitalOutput -> IO ()
clearDigitalChannel dig =
  c_ClearDigitalChannel (digitalOutputId dig)


foreign import stdcall unsafe "ClearAllDigital"
  c_ClearAllDigital :: IO ()

-- | Clears all output channels
clearAllDigital :: IO ()
clearAllDigital = c_ClearAllDigital


foreign import stdcall unsafe "SetDigitalChannel"
  c_SetDigitalChannel :: CInt -> IO ()

-- | Sets the output channel
setDigitalChannel :: DigitalOutput -> IO ()
setDigitalChannel dig = 
  c_SetDigitalChannel (digitalOutputId dig)


foreign import stdcall unsafe "SetAllDigital"
  c_SetAllDigital :: IO ()

-- | Sets all output channels
setAllDigital :: IO ()
setAllDigital = c_SetAllDigital