packages feed

ttn-client-0.1.0.0: app/Main.hs

{-# Language OverloadedStrings #-}
{-# Language RecordWildCards #-}

module Main where

import Control.Applicative
import Control.Exception (finally)
import Control.Concurrent
import Control.Concurrent.STM
import Control.Monad
import System.Exit (exitFailure)
import System.IO (hPutStrLn, stderr)

import Data.TTN
import Data.TTN.Client
import Data.TTN.Client.Util

import qualified Data.Text as T
import qualified Data.Text.IO as T
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.Lazy.Char8 as BSL

import Data.Binary.Get

import Text.Pretty.Simple

import Data.Either
import qualified Data.Cayene as CLPP

tryDecode :: T.Text -> [Decoded]
tryDecode x = rights $ map (\f -> f . unbase64 $ x )
  [ decodeTH
  , decodeCLPP
  ]

main :: IO ()
main = do
  c <- atomically $ newTChan
  forkIO $ ttnClient c
  reader c

reader chan = do
  forever $ do
    msg <- atomically $ readTChan chan
    case msg of
      Left err -> putStrLn err
      Right evt -> do
        pPrint evt
        case evt of
          Up Uplink{..} -> do
            case uplinkPayloadRaw of
              Nothing -> hPutStrLn stderr "Uplink message with no payload received"
              Just payload -> do
                pPrint $ tryDecode payload
          _ -> return ()


data Decoded =
    TempHumidity Float Float
  | Cayene [CLPP.Reading]
  deriving (Show, Eq, Ord)

decodeTH x = case runGetOrFail desTH x of
  Left (_, _, err) -> Left err
  Right (_, _, a)  -> Right a

desTH :: Get Decoded
desTH = do
  t <- getFloathost
  h <- getFloathost
  return $ TempHumidity t h

decodeCLPP :: BSL.ByteString -> Either String Decoded
decodeCLPP x = case CLPP.decodeMany x of
  [] -> Left "no CLPP data decoded"
  x  -> Right $ Cayene x