{-# LINE 1 "System/Linux/HIDRaw.hsc" #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LINE 2 "System/Linux/HIDRaw.hsc" #-}
-- | Minimal interface to hidraw ioctls, sufficient for blink(1)
module System.Linux.HIDRaw
  ( DevInfo(..)
  , devInfo
  , setFeature
  , getFeature
  ) where

import Data.Int (Int16)
import Data.Word (Word8, Word32)
import Foreign.C.Error (errnoToIOError, eOPNOTSUPP)
import Foreign.C.Types (CInt)
import Foreign.Storable
import System.IO.Error (ioError)
import System.Posix.Types (Fd)
import System.Posix.IOCtl


{-# LINE 20 "System/Linux/HIDRaw.hsc" #-}

{-# LINE 21 "System/Linux/HIDRaw.hsc" #-}

data DevInfo = DevInfo 
  { devBustype :: Word32
  , devVendor :: Int16
  , devProduct :: Int16
  }

instance Storable DevInfo where
  sizeOf _ = (8)
{-# LINE 30 "System/Linux/HIDRaw.hsc" #-}
  alignment _ = 4 -- #alignment struct hidraw_devinfo
  peek p = do
    b <- (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 33 "System/Linux/HIDRaw.hsc" #-}
    v <- (\hsc_ptr -> peekByteOff hsc_ptr 4) p
{-# LINE 34 "System/Linux/HIDRaw.hsc" #-}
    i <- (\hsc_ptr -> peekByteOff hsc_ptr 6) p
{-# LINE 35 "System/Linux/HIDRaw.hsc" #-}
    return $ DevInfo b v i
  poke p (DevInfo b v i) = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 0) p b
{-# LINE 38 "System/Linux/HIDRaw.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 4) p v
{-# LINE 39 "System/Linux/HIDRaw.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 6) p i
{-# LINE 40 "System/Linux/HIDRaw.hsc" #-}

data HIDIOCGRAWINFO = HIDIOCGRAWINFO
instance IOControl HIDIOCGRAWINFO DevInfo where
  ioctlReq _ = 2148026371
{-# LINE 44 "System/Linux/HIDRaw.hsc" #-}

devInfo :: Fd -> IO DevInfo
devInfo d = ioctl' d HIDIOCGRAWINFO

-- the ioctl package doesn't support these, so they're unimplemented for now
setFeature :: Fd -> [Word8] -> IO ()
setFeature d _ = ioError $ errnoToIOError "System.Linux.HIDRaw.setFeature" eOPNOTSUPP Nothing Nothing

getFeature :: Fd -> Int -> IO [Word8]
getFeature d _ = ioError $ errnoToIOError "System.Linux.HIDRaw.getFeature" eOPNOTSUPP Nothing Nothing