-- |
-- Module      :  Robotics.ROS.Msg.Types
-- Copyright   :  Alexander Krupenkin 2016
-- License     :  BSD3
--
-- Maintainer  :  mail@akru.me
-- Stability   :  experimental
-- Portability :  POSIX / WIN32
--
-- Common used data types.
--
module Robotics.ROS.Msg.Types (
  -- * ROS message abstract declaration types
    FieldDefinition(..)
  , SimpleType(..)
  , FieldType(..)
  , MsgDefinition
  , FieldName
  , Field
  -- * Time describing
  , ROSDuration
  , ROSTime
  ) where

import Data.Word (Word32)
import Data.Text (Text)
import Data.Int (Int32)

-- | A variant type describing the simple types 
-- that may be included in a ROS message.
data SimpleType
  = RBool
  | RByte
  | RChar
  | RInt8
  | RUInt8
  | RInt16
  | RUInt16
  | RInt32
  | RUInt32
  | RInt64
  | RUInt64
  | RFloat32
  | RFloat64
  | RString
  | RTime
  | RDuration
  deriving (Show, Enum, Eq)

-- | A variant type describing the types that may be included in a ROS
-- message.
data FieldType
  = Simple SimpleType
  | Custom Text
  | Array FieldType
  | FixedArray Int FieldType
  deriving (Show, Eq)

-- | Field name is text encoded
type FieldName = Text

-- | Field is a pair of name - value
type Field = (FieldType, FieldName)

-- | ROS message field is a variable or constant declaration
data FieldDefinition
  = Variable Field
  -- ^ Variable field name and type
  | Constant Field Text 
  -- ^ Constant field name, type and value
  deriving (Show, Eq)

-- | ROS message is a list of fields
type MsgDefinition = [FieldDefinition]

-- | ROSDuration is a tuple of (seconds, nanoseconds)
type ROSDuration = (Int32, Int32)

-- | ROSTime is a tuple of (seconds, nanoseconds)
type ROSTime = (Word32, Word32)