fuyu-gpio-direct 0.1.0.0 → 0.2.0.0
raw patch · 4 files changed
+20/−24 lines, 4 filesdep +filepathPVP ok
version bump matches the API change (PVP)
Dependencies added: filepath
API changes (from Hackage documentation)
- Fuyu.GPIO.Direct.Types: instance Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.EdgeEventType
- Fuyu.GPIO.Direct.Types: instance Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.InfoEventType
- Fuyu.GPIO.Direct.Types: instance Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineBias
- Fuyu.GPIO.Direct.Types: instance Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineClock
- Fuyu.GPIO.Direct.Types: instance Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineDirection
- Fuyu.GPIO.Direct.Types: instance Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineDrive
- Fuyu.GPIO.Direct.Types: instance Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineEdge
- Fuyu.GPIO.Direct.Types: instance Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineOffset
- Fuyu.GPIO.Direct.Types: instance Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineValue
- Fuyu.GPIO.Direct.Types: instance GHC.Read.Read Fuyu.GPIO.Direct.Types.EdgeEvent
- Fuyu.GPIO.Direct.Types: instance GHC.Read.Read Fuyu.GPIO.Direct.Types.EdgeEventType
- Fuyu.GPIO.Direct.Types: instance GHC.Read.Read Fuyu.GPIO.Direct.Types.InfoEventType
- Fuyu.GPIO.Direct.Types: instance GHC.Read.Read Fuyu.GPIO.Direct.Types.LineBias
- Fuyu.GPIO.Direct.Types: instance GHC.Read.Read Fuyu.GPIO.Direct.Types.LineClock
- Fuyu.GPIO.Direct.Types: instance GHC.Read.Read Fuyu.GPIO.Direct.Types.LineDirection
- Fuyu.GPIO.Direct.Types: instance GHC.Read.Read Fuyu.GPIO.Direct.Types.LineDrive
- Fuyu.GPIO.Direct.Types: instance GHC.Read.Read Fuyu.GPIO.Direct.Types.LineEdge
- Fuyu.GPIO.Direct.Types: instance GHC.Read.Read Fuyu.GPIO.Direct.Types.LineOffset
- Fuyu.GPIO.Direct.Types: instance GHC.Read.Read Fuyu.GPIO.Direct.Types.LineValue
- Fuyu.GPIO.Direct.Types: instance GHC.Read.Read Fuyu.GPIO.Direct.Types.TimeoutNs
- Fuyu.GPIO.Direct.Types: instance GHC.Read.Read Fuyu.GPIO.Direct.Types.WaitResult
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.Chip
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.ChipInfo
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.EdgeEvent
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.EdgeEventType
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.EventBuffer
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.InfoEvent
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.InfoEventType
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.LineBias
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.LineClock
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.LineConfig
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.LineDirection
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.LineDrive
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.LineEdge
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.LineInfo
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.LineOffset
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.LineRequest
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.LineSettings
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.LineValue
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.RawEdgeEvent
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.RequestConfig
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.TimeoutNs
- Fuyu.GPIO.Direct.Types: instance GHC.Show.Show Fuyu.GPIO.Direct.Types.WaitResult
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.EdgeEventType
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.InfoEventType
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineBias
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineClock
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineDirection
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineDrive
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineEdge
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineOffset
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Foreign.Storable.Storable Fuyu.GPIO.Direct.Types.LineValue
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Read.Read Fuyu.GPIO.Direct.Types.EdgeEvent
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Read.Read Fuyu.GPIO.Direct.Types.EdgeEventType
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Read.Read Fuyu.GPIO.Direct.Types.InfoEventType
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Read.Read Fuyu.GPIO.Direct.Types.LineBias
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Read.Read Fuyu.GPIO.Direct.Types.LineClock
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Read.Read Fuyu.GPIO.Direct.Types.LineDirection
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Read.Read Fuyu.GPIO.Direct.Types.LineDrive
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Read.Read Fuyu.GPIO.Direct.Types.LineEdge
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Read.Read Fuyu.GPIO.Direct.Types.LineOffset
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Read.Read Fuyu.GPIO.Direct.Types.LineValue
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Read.Read Fuyu.GPIO.Direct.Types.TimeoutNs
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Read.Read Fuyu.GPIO.Direct.Types.WaitResult
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.Chip
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.ChipInfo
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.EdgeEvent
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.EdgeEventType
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.EventBuffer
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.InfoEvent
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.InfoEventType
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.LineBias
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.LineClock
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.LineConfig
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.LineDirection
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.LineDrive
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.LineEdge
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.LineInfo
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.LineOffset
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.LineRequest
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.LineSettings
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.LineValue
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.RawEdgeEvent
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.RequestConfig
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.TimeoutNs
+ Fuyu.GPIO.Direct.Types: instance GHC.Internal.Show.Show Fuyu.GPIO.Direct.Types.WaitResult
- Fuyu.GPIO.Direct: chipOpen :: ByteString -> IO (Either Errno Chip)
+ Fuyu.GPIO.Direct: chipOpen :: PosixPath -> IO (Either Errno Chip)
- Fuyu.GPIO.Direct: chipPath :: Chip -> IO (Either Errno ByteString)
+ Fuyu.GPIO.Direct: chipPath :: Chip -> IO (Either Errno PosixPath)
- Fuyu.GPIO.Direct: isGPIOChip :: ByteString -> IO Bool
+ Fuyu.GPIO.Direct: isGPIOChip :: PosixPath -> IO Bool
Files
- CHANGELOG.md +5/−0
- fuyu-gpio-direct.cabal +3/−2
- src/Fuyu/GPIO/Direct.hs +12/−11
- src/Fuyu/GPIO/Direct/Types.hs +0/−11
CHANGELOG.md view
@@ -1,5 +1,10 @@ # Revision history for fuyu-gpio-direct +## 0.2.0.0 -- 2026-09-06++* **Breaking change**: Switch filesystem device path types from `ByteString` to `PosixPath` (`filepath >= 1.5.5.0`) in `chipOpen`, `chipPath`, and `isGPIOChip`.+* Cleaned up and improved Haddock documentation formatting across opaque handles and types.+ ## 0.1.0.0 -- 2026-07-29 * Initial release. Low-level FFI bindings for libgpiod v2 in Haskell.
fuyu-gpio-direct.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: fuyu-gpio-direct -version: 0.1.0.0+version: 0.2.0.0 synopsis: Direct Haskell bindings for Linux libgpiod v2 description: Mid-level and low-level Haskell bindings for interacting with Linux GPIO@@ -29,7 +29,8 @@ build-depends: base >= 4.18 && < 5, bytestring >= 0.10 && < 0.13, unix >= 2.7 && < 2.9,- vector >= 0.12 && < 0.14+ vector >= 0.12 && < 0.14,+ filepath >= 1.5.5.0 && < 1.6 extra-libraries: gpiod hs-source-dirs: src default-language: Haskell2010
src/Fuyu/GPIO/Direct.hs view
@@ -191,6 +191,7 @@ , gpiodAPIVersion ) where +import qualified System.Posix.PosixPath.FilePath as PP import System.Posix.Types (Fd) import Data.ByteString (ByteString) import qualified Data.ByteString as BS@@ -202,7 +203,7 @@ import qualified Data.Vector.Storable as V import qualified Data.Vector.Storable.Mutable as MV import Data.Word (Word64)-+import System.OsPath.Posix (PosixPath) import Fuyu.GPIO.Direct.Bindings import Fuyu.GPIO.Direct.Types @@ -252,9 +253,9 @@ -- Returns 'Right' t'Chip on success, or 'Left' 'Errno' on failure (such as 'Foreign.C.Error.eACCES' -- if permissions are missing or 'Foreign.C.Error.eNOENT' if the path does not exist). -- The returned handle must be closed with 'chipClose' when finished to free file descriptors and memory.-chipOpen :: ByteString -> IO (Either Errno Chip)-chipOpen bs = BS.useAsCString bs $ \cStr -> do- res <- checkNull (c_gpiod_chip_open cStr)+chipOpen :: PosixPath -> IO (Either Errno Chip)+chipOpen pospath = PP.withFilePath pospath $ \path -> do + res <- checkNull $ c_gpiod_chip_open path return $ Chip <$> res -- | Close an open GPIO chip device handle and release associated kernel and C resources.@@ -272,13 +273,13 @@ -- | Retrieve the filesystem device path used when opening the chip. ----- Returns 'Right' 'ByteString' containing the path (e.g. @"\/dev\/gpiochip0"@).-chipPath :: Chip -> IO (Either Errno ByteString)+-- Returns 'Right' 'PosixPath' containing the path (e.g. @"\/dev\/gpiochip0"@).+chipPath :: Chip -> IO (Either Errno PosixPath) chipPath (Chip ptr) = do res <- checkNull (c_gpiod_chip_get_path ptr) case res of Left err -> return (Left err)- Right cStr -> Right <$> BS.packCString cStr+ Right cStr -> Right <$> PP.peekFilePath cStr -- | Query a snapshot of status and configuration information for a specific line offset. --@@ -365,7 +366,7 @@ chipInfoFree :: ChipInfo -> IO () chipInfoFree (ChipInfo info) = c_gpiod_chip_info_free info --- | Retrieve the kernel device name string of the chip (e.g. @"gpiochip4"@).+-- | Retrieve the kernel device name string of the chip (e.g. @"gpiochip0"@). chipInfoName :: ChipInfo -> IO ByteString chipInfoName (ChipInfo info) = do res <- c_gpiod_chip_info_get_name info@@ -860,9 +861,9 @@ -------------------------------------------------------------------------------- -- | Check whether the filesystem path (e.g. @"\/dev\/gpiochip0"@) refers to a valid GPIO chip character device node.-isGPIOChip :: ByteString -> IO Bool-isGPIOChip path = do- BS.useAsCString path (fmap toBool . c_gpiod_is_gpiochip_device)+isGPIOChip :: PosixPath -> IO Bool+isGPIOChip pospath = do+ PP.withFilePath pospath (fmap toBool . c_gpiod_is_gpiochip_device) -- | Retrieve the version string of the underlying C @libgpiod@ library (e.g. @"2.1"@). gpiodAPIVersion :: IO ByteString
src/Fuyu/GPIO/Direct/Types.hs view
@@ -56,61 +56,51 @@ data CGpiodEdgeEvent -- | Opaque handle representing an open GPIO chip device controller.--- -- Must be explicitly closed with 'Fuyu.GPIO.Direct.chipClose' when no longer needed. newtype Chip = Chip (Ptr CGpiodChip) deriving (Eq, Ord, Show) -- | Opaque snapshot of static GPIO chip information (name, label, line count).--- -- Must be explicitly freed with 'Fuyu.GPIO.Direct.chipInfoFree'. newtype ChipInfo = ChipInfo (Ptr CGpiodChipInfo) deriving (Eq, Ord, Show) -- | Opaque event object emitted when a line watched on a chip changes status.--- -- Must be explicitly freed with 'Fuyu.GPIO.Direct.infoEventFree'. newtype InfoEvent = InfoEvent (Ptr CGpiodInfoEvent) deriving (Eq, Ord, Show) -- | Opaque snapshot of a single GPIO line\'s status and configuration attributes.--- -- Must be explicitly freed with 'Fuyu.GPIO.Direct.lineInfoFree'. newtype LineInfo = LineInfo (Ptr CGpiodLineInfo) deriving (Eq, Ord, Show) -- | Opaque accumulator for GPIO line configuration settings (direction, drive, bias, etc.).--- -- Must be explicitly freed with 'Fuyu.GPIO.Direct.lineSettingsFree'. newtype LineSettings = LineSettings (Ptr CGpiodLineSettings) deriving (Eq, Ord, Show) -- | Opaque map associating line offsets with their respective t'LineSettings.--- -- Must be explicitly freed with 'Fuyu.GPIO.Direct.lineConfigFree'. newtype LineConfig = LineConfig (Ptr CGpiodLineConfig) deriving (Eq, Ord, Show) -- | Opaque handle representing requested (claimed) GPIO lines under active kernel control.--- -- Must be explicitly released with 'Fuyu.GPIO.Direct.lineRequestRelease'. newtype LineRequest = LineRequest (Ptr CGpiodLineRequest) deriving (Eq, Ord, Show) -- | Opaque request configuration object (consumer name, kernel event buffer size).--- -- Must be explicitly freed with 'Fuyu.GPIO.Direct.requestConfigFree'. newtype RequestConfig = RequestConfig (Ptr CGpiodRequestConfig) deriving (Eq, Ord, Show) -- | Opaque fixed-capacity buffer storing edge detection events read from the kernel.--- -- Must be explicitly freed with 'Fuyu.GPIO.Direct.eventBufferFree'. newtype EventBuffer = EventBuffer (Ptr CGpiodEdgeEventBuffer) deriving (Eq, Ord, Show) -- | Opaque reference to an individual edge detection event stored within an t'EventBuffer.--- -- Can be copied using 'Fuyu.GPIO.Direct.rawEdgeEventCopy', which returned copy must be freed -- via 'Fuyu.GPIO.Direct.rawEdgeEventFree'. newtype RawEdgeEvent = RawEdgeEvent (Ptr CGpiodEdgeEvent)@@ -127,7 +117,6 @@ -------------------------------------------------------------------------------- -- | Logical line state representation.--- -- Note that logical values account for active-low inversion: an active-low line set to -- 'LineActive' corresponds to a physical logic low voltage level on hardware. newtype LineValue = LineValue CInt