packages feed

mercury-api-0.1.0.0: examples/tmr-firmware.hs

{-# LANGUAGE OverloadedStrings #-}

import Control.Monad ( when )
import Data.Monoid ( (<>) )
import qualified Data.Text.IO as T ( putStrLn )
import Options.Applicative
    ( Applicative((<*>)),
      Parser,
      helper,
      execParser,
      str,
      progDesc,
      metavar,
      info,
      header,
      fullDesc,
      argument,
      (<$>),
      optional )
import qualified System.Hardware.MercuryApi as TMR
import System.Exit ( exitSuccess )

import ExampleUtil

data Opts = Opts
  { oUri :: String
  , oListen :: Bool
  , oFilename :: Maybe String
  }

opts :: Parser Opts
opts = Opts
  <$> optUri
  <*> optListen
  <*> optional (argument str (metavar "FILENAME"))

opts' = info (helper <*> opts)
  ( fullDesc <>
    progDesc ("If run without firmware file, just print current " ++
              "firmware version.  " ++
              "Firmware file can be downloaded from: " ++
              "http://www.thingmagic.com/index.php/download-nano-firmware") <>
    header "tmr-firmware - write a new firmware image to reader" )

printFwVers :: TMR.Reader -> IO ()
printFwVers rdr =
  TMR.paramGet rdr TMR.PARAM_VERSION_SOFTWARE >>= T.putStrLn

main = do
  o <- execParser opts'
  rdr <- createAndConnect (oUri o) (oListen o)

  putStr "Current firmware version: "
  printFwVers rdr

  when (oFilename o == Nothing) exitSuccess
  let (Just fwFile) = oFilename o

  putStrLn $ "Loading firmware image from " ++ fwFile
  TMR.firmwareLoadFile rdr fwFile

  putStr "New firmware version: "
  printFwVers rdr

  TMR.destroy rdr