packages feed

network-can-0.2.0.0: app/SLCANUDP.hs

module Main where

import Control.Monad.Class.MonadSay (MonadSay(say))
import Data.Default (Default(def))
import Network.CAN (CAN)
import Network.SLCAN (Transport(..))
import Network.Socket (AddrInfo(..), SocketType(Datagram))

import qualified Control.Monad
import qualified Network.CAN
import qualified Network.SLCAN
import qualified Network.Socket

main :: IO ()
main = do
  ourAddrinfos
    <- Network.Socket.getAddrInfo
         Nothing
         Nothing
         (Just "1337")

  targetAddrinfos
    <- Network.Socket.getAddrInfo
         Nothing
         Nothing
         (Just "1338")

  case (ourAddrinfos, targetAddrinfos) of
    (ourAddrinfo:_, targetAddrinfo:_) -> do
      sock <- Network.Socket.socket
        (addrFamily ourAddrinfo)
        Datagram
        Network.Socket.defaultProtocol

      Network.Socket.bind
        sock
        (addrAddress ourAddrinfo)

      Network.SLCAN.withSLCAN
        (Transport_UDP sock (addrAddress targetAddrinfo))
        def
        act

    (_, _) -> error "getAddrInfo fail"

act
  :: MonadSay m
  => CAN m
  -> m ()
act can = do
  Network.CAN.send
    can
    $ Network.CAN.standardMessage
        0x7E5
        [0x4C]

  Control.Monad.forever
    $ Network.CAN.recv
        can
      >>= say . Network.CAN.prettyCANMessage