packages feed

fuyu-gpio-0.0.9.0: src/Fuyu/GPIO/EdgeEvent/Unsafe.hs

-- |
-- Module      : Fuyu.GPIO.EdgeEvent.Unsafe
-- Description : Unsafe manual resource allocation and raw buffer reading for event buffers.
-- Maintainer  : BassGT
-- Stability   : experimental
-- Portability : POSIX (Linux gpiod v2)
--
-- Manual resource allocation ('newEventBuffer', 'freeEventBuffer') and raw reading ('readEventsRaw') for edge 'Buffer' handles.
module Fuyu.GPIO.EdgeEvent.Unsafe
  ( -- * Types & Security Token
    Buffer
  , Capacity
  , userBufferCapacity
  , capacity
  , ReadyRequest(..)

    -- * Unsafe Manual Resource Allocation & Reading
  , newEventBuffer
  , freeEventBuffer
  , readEventsRaw
  ) where

import qualified Fuyu.GPIO.Direct as D
import Fuyu.GPIO.Exception
import Fuyu.GPIO.Types

-- | Allocate an edge event buffer of the specified capacity.
-- Must be manually freed with 'freeEventBuffer'.
newEventBuffer :: Capacity -> IO Buffer
newEventBuffer cap = unwrapOrThrow EventBufferNewFailed (D.eventBufferNew (capacity cap))

-- | Free an edge event buffer object.
freeEventBuffer :: Buffer -> IO ()
freeEventBuffer = D.eventBufferFree

-- | Read raw edge events into the buffer and return the number of events read.
-- Automatically uses the buffer's full capacity.
-- Throws 'ReadEdgeEventsFailed' on error.
readEventsRaw :: ReadyRequest -> Buffer -> IO Int
readEventsRaw (ReadyRequest req) buf = do
  cap <- D.eventBufferCapacity buf
  unwrapOrThrow ReadEdgeEventsFailed (D.lineRequestReadEdgeEvents req buf cap)