module SwiftNav.SBP where

import Data.Binary
import Data.Binary.Get
import Data.Binary.Put
import Data.ByteString
import Data.Word
import SwiftNav.SBP.Acquisition
import SwiftNav.SBP.Bootload
import SwiftNav.SBP.ExtEvents
import SwiftNav.SBP.FileIo
import SwiftNav.SBP.Flash
import SwiftNav.SBP.Logging
import SwiftNav.SBP.Navigation
import SwiftNav.SBP.Observation
import SwiftNav.SBP.Piksi
import SwiftNav.SBP.Settings
import SwiftNav.SBP.System
import SwiftNav.SBP.Tracking

msgPreamble :: Word8
msgPreamble = 0x55

data Msg = Msg
  { msgSBPType    :: Word16
  , msgSBPSender  :: Word16
  , msgSBPLen     :: Word8
  , msgSBPPayload :: ByteString
  , msgSBPCrc     :: Word16
  } deriving ( Show, Read, Eq )

instance Binary Msg where
  get = do
    msgSBPType <- getWord16le
    msgSBPSender <- getWord16le
    msgSBPLen <- getWord8
    msgSBPPayload <- getByteString $ fromIntegral msgSBPLen
    msgSBPCrc <- getWord16le
    return Msg {..}

  put Msg {..} = do
    putWord16le msgSBPType
    putWord16le msgSBPSender
    putWord8 msgSBPLen
    putByteString msgSBPPayload
    putWord16le msgSBPCrc

getMsg :: Get Msg
getMsg = do
  preamble <- getWord8
  if preamble /= msgPreamble then getMsg else get

putMsg :: Msg -> Put
putMsg msg = do
  putWord8 msgPreamble
  put msg

data SBPMsg =
     SBPMsgAcqResult MsgAcqResult
   | SBPMsgAcqResultDepA MsgAcqResultDepA
   | SBPMsgAlmanac MsgAlmanac
   | SBPMsgBasePos MsgBasePos
   | SBPMsgBaselineEcef MsgBaselineEcef
   | SBPMsgBaselineNed MsgBaselineNed
   | SBPMsgBootloaderHandshakeDepA MsgBootloaderHandshakeDepA
   | SBPMsgBootloaderHandshakeReq MsgBootloaderHandshakeReq
   | SBPMsgBootloaderHandshakeResp MsgBootloaderHandshakeResp
   | SBPMsgBootloaderJumpToApp MsgBootloaderJumpToApp
   | SBPMsgCwResults MsgCwResults
   | SBPMsgCwStart MsgCwStart
   | SBPMsgDops MsgDops
   | SBPMsgEphemeris MsgEphemeris
   | SBPMsgEphemerisDepA MsgEphemerisDepA
   | SBPMsgEphemerisDepB MsgEphemerisDepB
   | SBPMsgExtEvent MsgExtEvent
   | SBPMsgFileioReadDirReq MsgFileioReadDirReq
   | SBPMsgFileioReadDirResp MsgFileioReadDirResp
   | SBPMsgFileioReadReq MsgFileioReadReq
   | SBPMsgFileioReadResp MsgFileioReadResp
   | SBPMsgFileioRemove MsgFileioRemove
   | SBPMsgFileioWriteReq MsgFileioWriteReq
   | SBPMsgFileioWriteResp MsgFileioWriteResp
   | SBPMsgFlashDone MsgFlashDone
   | SBPMsgFlashErase MsgFlashErase
   | SBPMsgFlashProgram MsgFlashProgram
   | SBPMsgFlashReadReq MsgFlashReadReq
   | SBPMsgFlashReadResp MsgFlashReadResp
   | SBPMsgGpsTime MsgGpsTime
   | SBPMsgHeartbeat MsgHeartbeat
   | SBPMsgIarState MsgIarState
   | SBPMsgInitBase MsgInitBase
   | SBPMsgM25FlashWriteStatus MsgM25FlashWriteStatus
   | SBPMsgMaskSatellite MsgMaskSatellite
   | SBPMsgNapDeviceDnaReq MsgNapDeviceDnaReq
   | SBPMsgNapDeviceDnaResp MsgNapDeviceDnaResp
   | SBPMsgObs MsgObs
   | SBPMsgObsDepA MsgObsDepA
   | SBPMsgPosEcef MsgPosEcef
   | SBPMsgPosLlh MsgPosLlh
   | SBPMsgPrint MsgPrint
   | SBPMsgReset MsgReset
   | SBPMsgResetFilters MsgResetFilters
   | SBPMsgSetTime MsgSetTime
   | SBPMsgSettingsReadByIndexDone MsgSettingsReadByIndexDone
   | SBPMsgSettingsReadByIndexReq MsgSettingsReadByIndexReq
   | SBPMsgSettingsReadByIndexResp MsgSettingsReadByIndexResp
   | SBPMsgSettingsReadReq MsgSettingsReadReq
   | SBPMsgSettingsReadResp MsgSettingsReadResp
   | SBPMsgSettingsSave MsgSettingsSave
   | SBPMsgSettingsWrite MsgSettingsWrite
   | SBPMsgStartup MsgStartup
   | SBPMsgStmFlashLockSector MsgStmFlashLockSector
   | SBPMsgStmFlashUnlockSector MsgStmFlashUnlockSector
   | SBPMsgStmUniqueIdReq MsgStmUniqueIdReq
   | SBPMsgStmUniqueIdResp MsgStmUniqueIdResp
   | SBPMsgThreadState MsgThreadState
   | SBPMsgTrackingIq MsgTrackingIq
   | SBPMsgTrackingState MsgTrackingState
   | SBPMsgTrackingStateDepA MsgTrackingStateDepA
   | SBPMsgTweet MsgTweet
   | SBPMsgUartState MsgUartState
   | SBPMsgVelEcef MsgVelEcef
   | SBPMsgVelNed MsgVelNed
  deriving ( Show, Read, Eq )