module Data.Aviation.Stratux.Types.Traffic(
Traffic(..)
, HasTraffic(..)
) where
import Control.Applicative(Applicative((<*>)))
import Control.Category(Category((.)))
import Control.Lens(makeClassy, lens)
import Data.Aviation.Stratux.Types.EmitterCategory(EmitterCategory)
import Data.Aviation.Stratux.Types.IcaoAddr(IcaoAddr, HasIcaoAddr(icaoAddr))
import Data.Aviation.Stratux.Types.TargetType(TargetType)
import Data.Aviation.Stratux.Types.UTCTimes(HasUTCTimes(utcTimes))
import Data.Aviation.Stratux.Types.Word8s(HasWord8s(word8s))
import Data.Aeson(FromJSON(parseJSON), ToJSON(toJSON), (.:), withObject, (.=), object)
import Data.Bool(Bool)
import Data.Eq(Eq)
import Data.Int(Int)
import Data.Functor((<$>))
import Data.Ord(Ord)
import Data.String(String)
import Data.Time(UTCTime)
import Prelude(Double, Show)
data Traffic =
Traffic {
icaoAddrTraffic :: IcaoAddr
, _tail :: String
, _emitterCategory :: EmitterCategory
, _onGround :: Bool
, _addressType :: Int
, _targetType :: TargetType
, _signalLevel :: Double
, _positionValid :: Bool
, _latitude :: Double
, _longitude :: Double
, _altitude :: Int
, _gnssDiffFromBaroAlt :: Int
, _altIsGnss :: Bool
, _navigationIntegrityCategory :: Int
, _navigationAccuracyCategoryForPosition :: Int
, _track :: Int
, _speed :: Int
, _speedValid :: Bool
, _verticalVelocity :: Int
, _timestamp :: UTCTime
, _age :: Double
, _lastSeen :: UTCTime
, _lastAltitude :: UTCTime
, _lastGnssDiff :: UTCTime
, _lastGnssDiffAltitude :: Int
, _lastSpeed :: UTCTime
, _lastSource :: Int
, _extrapolatedPosition :: Bool
, _bearing :: Double
, _distanceToTrafficFromOwnship :: Double
} deriving (Eq, Ord, Show)
makeClassy ''Traffic
instance FromJSON Traffic where
parseJSON =
withObject "Traffic" (\x ->
Traffic <$>
x .: "Icao_addr" <*>
x .: "Tail" <*>
x .: "Emitter_category" <*>
x .: "OnGround" <*>
x .: "Addr_type" <*>
x .: "TargetType" <*>
x .: "SignalLevel" <*>
x .: "Position_valid" <*>
x .: "Lat" <*>
x .: "Lng" <*>
x .: "Alt" <*>
x .: "GnssDiffFromBaroAlt" <*>
x .: "AltIsGNSS" <*>
x .: "NIC" <*>
x .: "NACp" <*>
x .: "Track" <*>
x .: "Speed" <*>
x .: "Speed_valid" <*>
x .: "Vvel" <*>
x .: "Timestamp" <*>
x .: "Age" <*>
x .: "Last_seen" <*>
x .: "Last_alt" <*>
x .: "Last_GnssDiff" <*>
x .: "Last_GnssDiffAlt" <*>
x .: "Last_speed" <*>
x .: "Last_source" <*>
x .: "ExtrapolatedPosition" <*>
x .: "Bearing" <*>
x .: "Distance")
instance ToJSON Traffic where
toJSON (Traffic icaoAddr_ tail_ emitterCategory_ onGround_ addressType_ targetType_ signalLevel_ positionValid_ latitude_ longitude_ altitude_ gnssDiffFromBaroAlt_ altIsGnss_ navigationIntegrityCategory_ navigationAccuracyCategoryForPosition_ track_ speed_ speedValid_ verticalVelocity_ timestamp_ age_ lastSeen_ lastAltitude_ lastGnssDiff_ lastGnssDiffAltitude_ lastSpeed_ lastSource_ extrapolatedPosition_ bearing_ distanceToTrafficFromOwnship_) =
object [
"Icao_addr" .= icaoAddr_
, "Tail" .= tail_
, "Emitter_category" .= emitterCategory_
, "OnGround" .= onGround_
, "Addr_type" .= addressType_
, "TargetType" .= targetType_
, "SignalLevel" .= signalLevel_
, "Position_valid" .= positionValid_
, "Lat" .= latitude_
, "Lng" .= longitude_
, "Alt" .= altitude_
, "GnssDiffFromBaroAlt" .= gnssDiffFromBaroAlt_
, "AltIsGNSS" .= altIsGnss_
, "NIC" .= navigationIntegrityCategory_
, "NACp" .= navigationAccuracyCategoryForPosition_
, "Track" .= track_
, "Speed" .= speed_
, "Speed_valid" .= speedValid_
, "Vvel" .= verticalVelocity_
, "Timestamp" .= timestamp_
, "Age" .= age_
, "Last_seen" .= lastSeen_
, "Last_alt" .= lastAltitude_
, "Last_GnssDiff" .= lastGnssDiff_
, "Last_GnssDiffAlt" .= lastGnssDiffAltitude_
, "Last_speed" .= lastSpeed_
, "Last_source" .= lastSource_
, "ExtrapolatedPosition" .= extrapolatedPosition_
, "Bearing" .= bearing_
, "Distance" .= distanceToTrafficFromOwnship_
]
instance HasIcaoAddr Traffic where
icaoAddr =
lens
(\(Traffic x _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) -> x)
(\(Traffic _ tail_ emitterCategory_ onGround_ addressType_ targetType_ signalLevel_ positionValid_ latitude_ longitude_ altitude_ gnssDiffFromBaroAlt_ altIsGnss_ navigationIntegrityCategory_ navigationAccuracyCategoryForPosition_ track_ speed_ speedValid_ verticalVelocity_ timestamp_ age_ lastSeen_ lastAltitude_ lastGnssDiff_ lastGnssDiffAltitude_ lastSpeed_ lastSource_ extrapolatedPosition_ bearing_ distanceToTrafficFromOwnship_) x -> Traffic x tail_ emitterCategory_ onGround_ addressType_ targetType_ signalLevel_ positionValid_ latitude_ longitude_ altitude_ gnssDiffFromBaroAlt_ altIsGnss_ navigationIntegrityCategory_ navigationAccuracyCategoryForPosition_ track_ speed_ speedValid_ verticalVelocity_ timestamp_ age_ lastSeen_ lastAltitude_ lastGnssDiff_ lastGnssDiffAltitude_ lastSpeed_ lastSource_ extrapolatedPosition_ bearing_ distanceToTrafficFromOwnship_)
instance HasWord8s Traffic where
word8s =
icaoAddr . word8s
instance HasUTCTimes Traffic where
utcTimes f (Traffic icaoAddr_ tail_ emitterCategory_ onGround_ addressType_ targetType_ signalLevel_ positionValid_ latitude_ longitude_ altitude_ gnssDiffFromBaroAlt_ altIsGnss_ navigationIntegrityCategory_ navigationAccuracyCategoryForPosition_ track_ speed_ speedValid_ verticalVelocity_ timestamp_ age_ lastSeen_ lastAltitude_ lastGnssDiff_ lastGnssDiffAltitude_ lastSpeed_ lastSource_ extrapolatedPosition_ bearing_ distanceToTrafficFromOwnship_) =
(\timestamp__ lastSeen__ lastAltitude__ lastGnssDiff__ lastSpeed__ ->
Traffic icaoAddr_ tail_ emitterCategory_ onGround_ addressType_ targetType_ signalLevel_ positionValid_ latitude_ longitude_ altitude_ gnssDiffFromBaroAlt_ altIsGnss_ navigationIntegrityCategory_ navigationAccuracyCategoryForPosition_ track_ speed_ speedValid_ verticalVelocity_ timestamp__ age_ lastSeen__ lastAltitude__ lastGnssDiff__ lastGnssDiffAltitude_ lastSpeed__ lastSource_ extrapolatedPosition_ bearing_ distanceToTrafficFromOwnship_) <$>
f timestamp_ <*>
f lastSeen_ <*>
f lastAltitude_ <*>
f lastGnssDiff_ <*>
f lastSpeed_