{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
module Data.RTCM3.System
( module Data.RTCM3.System
) where
import BasicPrelude
import Control.Lens
import Data.Aeson.TH
import Data.Binary
import Data.Binary.Bits
import qualified Data.Binary.Bits.Get as B
import qualified Data.Binary.Bits.Put as B
import Data.RTCM3.TH
{-# ANN module ("HLint: ignore Use camelCase"::String) #-}
data MessageHeader = MessageHeader
{ _messageHeader_num :: Word16
, _messageHeader_station :: Word16
, _messageHeader_mjd :: Word16
, _messageHeader_seconds :: Word32
, _messageHeader_n :: Word8
, _messageHeader_leapSeconds :: Word8
} deriving ( Show, Read, Eq )
$(makeLenses ''MessageHeader)
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_messageHeader_" . stripPrefix "_messageHeader_"} ''MessageHeader)
instance BinaryBit MessageHeader where
getBits _n = do
_messageHeader_num <- B.getWord16be 12
_messageHeader_station <- B.getWord16be 12
_messageHeader_mjd <- B.getWord16be 16
_messageHeader_seconds <- B.getWord32be 17
_messageHeader_n <- B.getWord8 5
_messageHeader_leapSeconds <- B.getWord8 8
pure MessageHeader {..}
putBits _n MessageHeader {..} = do
B.putWord16be 12 _messageHeader_num
B.putWord16be 12 _messageHeader_station
B.putWord16be 16 _messageHeader_mjd
B.putWord32be 17 _messageHeader_seconds
B.putWord8 5 _messageHeader_n
B.putWord8 8 _messageHeader_leapSeconds
data Message = Message
{ _message_num :: Word16
, _message_synchronous :: Bool
, _message_interval :: Word16
} deriving ( Show, Read, Eq )
$(makeLenses ''Message)
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_message_" . stripPrefix "_message_"} ''Message)
instance BinaryBit Message where
getBits _n = do
_message_num <- B.getWord16be 12
_message_synchronous <- B.getBool
_message_interval <- B.getWord16be 16
pure Message {..}
putBits _n Message {..} = do
B.putWord16be 12 _message_num
B.putBool _message_synchronous
B.putWord16be 16 _message_interval
data TextMessage = TextMessage
{ _textMessage_num :: Word16
, _textMessage_station :: Word16
, _textMessage_mjd :: Word16
, _textMessage_seconds :: Word32
, _textMessage_characters :: Word8
, _textMessage_n :: Word8
, _textMessage_text :: Text
} deriving ( Show, Read, Eq )
$(makeLenses ''TextMessage)
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_textMessage_" . stripPrefix "_textMessage_"} ''TextMessage)
instance BinaryBit TextMessage where
getBits _n = do
_textMessage_num <- B.getWord16be 12
_textMessage_station <- B.getWord16be 12
_textMessage_mjd <- B.getWord16be 16
_textMessage_seconds <- B.getWord32be 17
_textMessage_characters <- B.getWord8 7
_textMessage_n <- B.getWord8 8
_textMessage_text <- decodeUtf8 <$> B.getByteString (fromIntegral _textMessage_n)
pure TextMessage {..}
putBits _n TextMessage {..} = do
B.putWord16be 12 _textMessage_num
B.putWord16be 12 _textMessage_station
B.putWord16be 16 _textMessage_mjd
B.putWord32be 17 _textMessage_seconds
B.putWord8 7 _textMessage_characters
B.putWord8 8 _textMessage_n
B.putByteString $ encodeUtf8 _textMessage_text
msg1013 :: Word16
msg1013 = 1013
data Msg1013 = Msg1013
{ _msg1013_header :: MessageHeader
, _msg1013_messages :: [Message]
} deriving ( Show, Read, Eq )
$(makeLenses ''Msg1013)
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1013_" . stripPrefix "_msg1013_"} ''Msg1013)
instance Binary Msg1013 where
get = B.runBitGet $ do
_msg1013_header <- getBits 0
_msg1013_messages <- replicateM (fromIntegral $ _msg1013_header ^. messageHeader_n) $ getBits 0
pure Msg1013 {..}
put Msg1013 {..} = B.runBitPut $ do
putBits 0 _msg1013_header
forM_ _msg1013_messages $ putBits 0
$(deriveRTCM3 ''Msg1013)
msg1029 :: Word16
msg1029 = 1029
newtype Msg1029 = Msg1029
{ _msg1029_message :: TextMessage
} deriving ( Show, Read, Eq )
$(makeLenses ''Msg1029)
$(deriveJSON defaultOptions {fieldLabelModifier = fromMaybe "_msg1029_" . stripPrefix "_msg1029_"} ''Msg1029)
instance Binary Msg1029 where
get = B.runBitGet $ do
_msg1029_message <- getBits 0
pure Msg1029 {..}
put Msg1029 {..} = B.runBitPut $
putBits 0 _msg1029_message
$(deriveRTCM3 ''Msg1029)