packages feed

serialport-0.6.0: System/Hardware/Serialport/Cli.hs

module System.Hardware.Serialport.Cli
  ( SerialPortCli(..)
  , serialPortCli
  , -- * Parsers
    serialPortCliParser
  , serialPortPathParser
  , serialPortSettingsParser
  , commSpeedParser
  , bitsPerWordParser
  , stopBitsParser
  , parityParser
  , flowControlParser
  , timeoutParser
  ) where

import Data.Word
import Options.Applicative
import System.Hardware.Serialport.Types

data SerialPortCli = SerialPortCli
  { serialPortPath     :: FilePath
  , serialPortSettings :: SerialPortSettings
  }

serialPortCli :: IO SerialPortCli
serialPortCli =
  customExecParser serialPortCliPrefs $
    info (serialPortCliParser <**> helper) mempty

serialPortCliPrefs :: ParserPrefs
serialPortCliPrefs = prefs $ showHelpOnError <> showHelpOnEmpty

serialPortCliParser :: Parser SerialPortCli
serialPortCliParser =
  SerialPortCli
    <$> serialPortPathParser
    <*> serialPortSettingsParser

serialPortPathParser :: Parser FilePath
serialPortPathParser = strArgument $ mconcat
  [ help "serial port file path"
  , metavar "<tty-device>"
  , completer $ bashCompleter "file"
  ]

serialPortSettingsParser :: Parser SerialPortSettings
serialPortSettingsParser =
  SerialPortSettings
    <$> commSpeedParser
    <*> bitsPerWordParser
    <*> stopBitsParser
    <*> parityParser
    <*> flowControlParser
    <*> timeoutParser

commSpeedParser :: Parser CommSpeed
commSpeedParser = option auto $ mconcat
  [ long "baudrate"
  , short 'b'
  , value CS115200
  , showDefault
  , metavar "<bps>"
  , help "Baud rate"
  ]

bitsPerWordParser :: Parser Word8
bitsPerWordParser = option auto $ mconcat
  [ long "databits"
  , short 'd'
  , value $ bitsPerWord defaultSerialSettings
  , showDefault
  , metavar "7|8"
  , help "Data bits"
  ]

stopBitsParser :: Parser StopBits
stopBitsParser = option auto $ mconcat
  [ long "stopbits"
  , short 's'
  , value $ stopb defaultSerialSettings
  , showDefault
  , metavar "One|Two"
  , help "Stop bits"
  ]

parityParser :: Parser Parity
parityParser = option auto $ mconcat
  [ long "parity"
  , short 'p'
  , value $ parity defaultSerialSettings
  , showDefault
  , metavar "Even|Odd|NoParity"
  , help "Parity"
  ]

flowControlParser :: Parser FlowControl
flowControlParser = option auto $ mconcat
  [ long "flow"
  , short 'f'
  , value $ flowControl defaultSerialSettings
  , showDefault
  , metavar "Software|NoFlowControl"
  , help "Flow control"
  ]

timeoutParser :: Parser Int
timeoutParser = option auto $ mconcat
  [ long "timeout"
  , short 't'
  , value $ timeout defaultSerialSettings
  , showDefault
  , metavar "TIME"
  , help "Timeout in tenth-of-seconds"
  ]