packages feed

fuyu-gpio-0.0.9.0: src/Fuyu/GPIO/Chip.hs

-- |
-- Module      : Fuyu.GPIO.Chip
-- Description : High-level operations for GPIO chips and line watching.
-- Maintainer  : BassGT
-- Stability   : experimental
-- Portability : POSIX (Linux gpiod v2)
--
-- This module provides managed resource brackets ('withChip') for opening and closing
-- Linux GPIO chips safely, as well as functions for watching line status changes.
module Fuyu.GPIO.Chip
  ( -- * Operations & Brackets
    withChip
  , withChipInfo
  , withLineInfo
  , path
  , offsetFromName
  , fd

    -- * Line Watch & Info Events
  , module Fuyu.GPIO.Chip.Watch

    -- * General Utilities
  , isGPIOChip
  , gpiodAPIVersion
  ) where

import Control.Exception (bracket)
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BS8
import System.Posix.Types (Fd)
import qualified Fuyu.GPIO.Direct as D
import Fuyu.GPIO.Chip.Info (withChipInfo)
import Fuyu.GPIO.Line.Info (withLineInfo)
import Fuyu.GPIO.Chip.Unsafe (openChip, closeChip)
import Fuyu.GPIO.Chip.Watch
import Fuyu.GPIO.Exception

-- | Open a GPIO chip by filesystem path (e.g. "/dev/gpiochip0") and automatically close it when finished.
withChip :: FilePath -> (Chip -> IO a) -> IO a
withChip path' = bracket (openChip path') closeChip

-- | Retrieve chip filesystem path as a 'ByteString'.
path :: Chip -> IO ByteString
path chip = unwrapOrThrow ChipInfoFailed (D.chipPath chip)

-- | Map a GPIO line name (e.g. "GPIO17") to its numeric 'Offset' on the chip.
offsetFromName :: Chip -> ByteString -> IO Offset
offsetFromName chip name = unwrapOrThrow LineInfoFailed (D.chipLineOffsetFromName chip name)

-- | Get the underlying Linux file descriptor associated with the GPIO chip handle.
fd :: Chip -> IO Fd
fd = D.chipFd

--------------------------------------------------------------------------------
-- General Utilities
--------------------------------------------------------------------------------
-- General Utilities
--------------------------------------------------------------------------------

-- | Check if the given filesystem path is a valid GPIO chip character device.
isGPIOChip :: FilePath -> IO Bool
isGPIOChip = D.isGPIOChip . BS8.pack

-- | Retrieve the underlying libgpiod C API version string (e.g. "2.1").
gpiodAPIVersion :: IO ByteString
gpiodAPIVersion = D.gpiodAPIVersion