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