module Network.SocketCAN.Example where import Control.Monad (forever) import Network.CAN import Network.Socket (Socket) import Network.SocketCAN import qualified Network.Socket example :: IO () example :: IO () example = do let interface :: [Char] interface = [Char] "vcan0" Maybe Int mIdx <- [Char] -> IO (Maybe Int) Network.Socket.ifNameToIndex [Char] interface case Maybe Int mIdx of Maybe Int Nothing -> [Char] -> IO () forall a. HasCallStack => [Char] -> a error ([Char] -> IO ()) -> [Char] -> IO () forall a b. (a -> b) -> a -> b $ [Char] "Interface " [Char] -> [Char] -> [Char] forall a. Semigroup a => a -> a -> a <> [Char] interface [Char] -> [Char] -> [Char] forall a. Semigroup a => a -> a -> a <> [Char] " not found" Just Int idx -> Int -> (Socket -> IO ()) -> IO () forall a. Int -> (Socket -> IO a) -> IO a withSocketCAN Int idx Socket -> IO () act act :: Socket -> IO () act :: Socket -> IO () act Socket sock = do Socket -> CANMessage -> IO () sendCANMessage Socket sock (CANMessage -> IO ()) -> CANMessage -> IO () forall a b. (a -> b) -> a -> b $ Word16 -> [Word8] -> CANMessage standardMessage Word16 0x123 [Word8 0xDE, Word8 0xAD] Socket -> CANMessage -> IO () sendCANMessage Socket sock (CANMessage -> IO ()) -> CANMessage -> IO () forall a b. (a -> b) -> a -> b $ CANArbitrationField -> [Word8] -> CANMessage CANMessage (Word32 -> CANArbitrationField extendedID Word32 0x123456) [Word8 0xEE] Socket -> CANMessage -> IO () sendCANMessage Socket sock (CANMessage -> IO ()) -> CANMessage -> IO () forall a b. (a -> b) -> a -> b $ CANArbitrationField -> [Word8] -> CANMessage CANMessage (CANArbitrationField -> CANArbitrationField setRTR (CANArbitrationField -> CANArbitrationField) -> CANArbitrationField -> CANArbitrationField forall a b. (a -> b) -> a -> b $ Word32 -> CANArbitrationField extendedID Word32 0x123) [Word8 0xDE, Word8 0xAD, Word8 0x11] IO () -> IO () forall (f :: * -> *) a b. Applicative f => f a -> f b forever (IO () -> IO ()) -> IO () -> IO () forall a b. (a -> b) -> a -> b $ Socket -> IO CANMessage recvCANMessage Socket sock IO CANMessage -> (CANMessage -> IO ()) -> IO () forall a b. IO a -> (a -> IO b) -> IO b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= CANMessage -> IO () forall a. Show a => a -> IO () print