{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- Derived from AWS service descriptions, licensed under Apache 2.0.

-- |
-- Module      : Amazonka.IoTWireless.Types.Gnss
-- Copyright   : (c) 2013-2023 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Amazonka.IoTWireless.Types.Gnss where

import qualified Amazonka.Core as Core
import qualified Amazonka.Core.Lens.Internal as Lens
import qualified Amazonka.Data as Data
import qualified Amazonka.Prelude as Prelude

-- | Global navigation satellite system (GNSS) object used for positioning.
--
-- /See:/ 'newGnss' smart constructor.
data Gnss = Gnss'
  { -- | Optional assistance altitude, which is the altitude of the device at
    -- capture time, specified in meters above the WGS84 reference ellipsoid.
    Gnss -> Maybe Double
assistAltitude :: Prelude.Maybe Prelude.Double,
    -- | Optional assistance position information, specified using latitude and
    -- longitude values in degrees. The co-ordinates are inside the WGS84
    -- reference frame.
    Gnss -> Maybe (NonEmpty Double)
assistPosition :: Prelude.Maybe (Prelude.NonEmpty Prelude.Double),
    -- | Optional parameter that gives an estimate of the time when the GNSS scan
    -- information is taken, in seconds GPS time (GPST). If capture time is not
    -- specified, the local server time is used.
    Gnss -> Maybe Double
captureTime :: Prelude.Maybe Prelude.Double,
    -- | Optional value that gives the capture time estimate accuracy, in
    -- seconds. If capture time accuracy is not specified, default value of 300
    -- is used.
    Gnss -> Maybe Double
captureTimeAccuracy :: Prelude.Maybe Prelude.Double,
    -- | Optional parameter that forces 2D solve, which modifies the positioning
    -- algorithm to a 2D solution problem. When this parameter is specified,
    -- the assistance altitude should have an accuracy of at least 10 meters.
    Gnss -> Maybe Bool
use2DSolver :: Prelude.Maybe Prelude.Bool,
    -- | Payload that contains the GNSS scan result, or NAV message, in
    -- hexadecimal notation.
    Gnss -> Text
payload :: Prelude.Text
  }
  deriving (Gnss -> Gnss -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Gnss -> Gnss -> Bool
$c/= :: Gnss -> Gnss -> Bool
== :: Gnss -> Gnss -> Bool
$c== :: Gnss -> Gnss -> Bool
Prelude.Eq, ReadPrec [Gnss]
ReadPrec Gnss
Int -> ReadS Gnss
ReadS [Gnss]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Gnss]
$creadListPrec :: ReadPrec [Gnss]
readPrec :: ReadPrec Gnss
$creadPrec :: ReadPrec Gnss
readList :: ReadS [Gnss]
$creadList :: ReadS [Gnss]
readsPrec :: Int -> ReadS Gnss
$creadsPrec :: Int -> ReadS Gnss
Prelude.Read, Int -> Gnss -> ShowS
[Gnss] -> ShowS
Gnss -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Gnss] -> ShowS
$cshowList :: [Gnss] -> ShowS
show :: Gnss -> String
$cshow :: Gnss -> String
showsPrec :: Int -> Gnss -> ShowS
$cshowsPrec :: Int -> Gnss -> ShowS
Prelude.Show, forall x. Rep Gnss x -> Gnss
forall x. Gnss -> Rep Gnss x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Gnss x -> Gnss
$cfrom :: forall x. Gnss -> Rep Gnss x
Prelude.Generic)

-- |
-- Create a value of 'Gnss' with all optional fields omitted.
--
-- Use <https://hackage.haskell.org/package/generic-lens generic-lens> or <https://hackage.haskell.org/package/optics optics> to modify other optional fields.
--
-- The following record fields are available, with the corresponding lenses provided
-- for backwards compatibility:
--
-- 'assistAltitude', 'gnss_assistAltitude' - Optional assistance altitude, which is the altitude of the device at
-- capture time, specified in meters above the WGS84 reference ellipsoid.
--
-- 'assistPosition', 'gnss_assistPosition' - Optional assistance position information, specified using latitude and
-- longitude values in degrees. The co-ordinates are inside the WGS84
-- reference frame.
--
-- 'captureTime', 'gnss_captureTime' - Optional parameter that gives an estimate of the time when the GNSS scan
-- information is taken, in seconds GPS time (GPST). If capture time is not
-- specified, the local server time is used.
--
-- 'captureTimeAccuracy', 'gnss_captureTimeAccuracy' - Optional value that gives the capture time estimate accuracy, in
-- seconds. If capture time accuracy is not specified, default value of 300
-- is used.
--
-- 'use2DSolver', 'gnss_use2DSolver' - Optional parameter that forces 2D solve, which modifies the positioning
-- algorithm to a 2D solution problem. When this parameter is specified,
-- the assistance altitude should have an accuracy of at least 10 meters.
--
-- 'payload', 'gnss_payload' - Payload that contains the GNSS scan result, or NAV message, in
-- hexadecimal notation.
newGnss ::
  -- | 'payload'
  Prelude.Text ->
  Gnss
newGnss :: Text -> Gnss
newGnss Text
pPayload_ =
  Gnss'
    { $sel:assistAltitude:Gnss' :: Maybe Double
assistAltitude = forall a. Maybe a
Prelude.Nothing,
      $sel:assistPosition:Gnss' :: Maybe (NonEmpty Double)
assistPosition = forall a. Maybe a
Prelude.Nothing,
      $sel:captureTime:Gnss' :: Maybe Double
captureTime = forall a. Maybe a
Prelude.Nothing,
      $sel:captureTimeAccuracy:Gnss' :: Maybe Double
captureTimeAccuracy = forall a. Maybe a
Prelude.Nothing,
      $sel:use2DSolver:Gnss' :: Maybe Bool
use2DSolver = forall a. Maybe a
Prelude.Nothing,
      $sel:payload:Gnss' :: Text
payload = Text
pPayload_
    }

-- | Optional assistance altitude, which is the altitude of the device at
-- capture time, specified in meters above the WGS84 reference ellipsoid.
gnss_assistAltitude :: Lens.Lens' Gnss (Prelude.Maybe Prelude.Double)
gnss_assistAltitude :: Lens' Gnss (Maybe Double)
gnss_assistAltitude = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Gnss' {Maybe Double
assistAltitude :: Maybe Double
$sel:assistAltitude:Gnss' :: Gnss -> Maybe Double
assistAltitude} -> Maybe Double
assistAltitude) (\s :: Gnss
s@Gnss' {} Maybe Double
a -> Gnss
s {$sel:assistAltitude:Gnss' :: Maybe Double
assistAltitude = Maybe Double
a} :: Gnss)

-- | Optional assistance position information, specified using latitude and
-- longitude values in degrees. The co-ordinates are inside the WGS84
-- reference frame.
gnss_assistPosition :: Lens.Lens' Gnss (Prelude.Maybe (Prelude.NonEmpty Prelude.Double))
gnss_assistPosition :: Lens' Gnss (Maybe (NonEmpty Double))
gnss_assistPosition = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Gnss' {Maybe (NonEmpty Double)
assistPosition :: Maybe (NonEmpty Double)
$sel:assistPosition:Gnss' :: Gnss -> Maybe (NonEmpty Double)
assistPosition} -> Maybe (NonEmpty Double)
assistPosition) (\s :: Gnss
s@Gnss' {} Maybe (NonEmpty Double)
a -> Gnss
s {$sel:assistPosition:Gnss' :: Maybe (NonEmpty Double)
assistPosition = Maybe (NonEmpty Double)
a} :: Gnss) forall b c a. (b -> c) -> (a -> b) -> a -> c
Prelude.. forall (f :: * -> *) (g :: * -> *) s t a b.
(Functor f, Functor g) =>
AnIso s t a b -> Iso (f s) (g t) (f a) (g b)
Lens.mapping forall s t a b. (Coercible s a, Coercible t b) => Iso s t a b
Lens.coerced

-- | Optional parameter that gives an estimate of the time when the GNSS scan
-- information is taken, in seconds GPS time (GPST). If capture time is not
-- specified, the local server time is used.
gnss_captureTime :: Lens.Lens' Gnss (Prelude.Maybe Prelude.Double)
gnss_captureTime :: Lens' Gnss (Maybe Double)
gnss_captureTime = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Gnss' {Maybe Double
captureTime :: Maybe Double
$sel:captureTime:Gnss' :: Gnss -> Maybe Double
captureTime} -> Maybe Double
captureTime) (\s :: Gnss
s@Gnss' {} Maybe Double
a -> Gnss
s {$sel:captureTime:Gnss' :: Maybe Double
captureTime = Maybe Double
a} :: Gnss)

-- | Optional value that gives the capture time estimate accuracy, in
-- seconds. If capture time accuracy is not specified, default value of 300
-- is used.
gnss_captureTimeAccuracy :: Lens.Lens' Gnss (Prelude.Maybe Prelude.Double)
gnss_captureTimeAccuracy :: Lens' Gnss (Maybe Double)
gnss_captureTimeAccuracy = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Gnss' {Maybe Double
captureTimeAccuracy :: Maybe Double
$sel:captureTimeAccuracy:Gnss' :: Gnss -> Maybe Double
captureTimeAccuracy} -> Maybe Double
captureTimeAccuracy) (\s :: Gnss
s@Gnss' {} Maybe Double
a -> Gnss
s {$sel:captureTimeAccuracy:Gnss' :: Maybe Double
captureTimeAccuracy = Maybe Double
a} :: Gnss)

-- | Optional parameter that forces 2D solve, which modifies the positioning
-- algorithm to a 2D solution problem. When this parameter is specified,
-- the assistance altitude should have an accuracy of at least 10 meters.
gnss_use2DSolver :: Lens.Lens' Gnss (Prelude.Maybe Prelude.Bool)
gnss_use2DSolver :: Lens' Gnss (Maybe Bool)
gnss_use2DSolver = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Gnss' {Maybe Bool
use2DSolver :: Maybe Bool
$sel:use2DSolver:Gnss' :: Gnss -> Maybe Bool
use2DSolver} -> Maybe Bool
use2DSolver) (\s :: Gnss
s@Gnss' {} Maybe Bool
a -> Gnss
s {$sel:use2DSolver:Gnss' :: Maybe Bool
use2DSolver = Maybe Bool
a} :: Gnss)

-- | Payload that contains the GNSS scan result, or NAV message, in
-- hexadecimal notation.
gnss_payload :: Lens.Lens' Gnss Prelude.Text
gnss_payload :: Lens' Gnss Text
gnss_payload = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Lens.lens (\Gnss' {Text
payload :: Text
$sel:payload:Gnss' :: Gnss -> Text
payload} -> Text
payload) (\s :: Gnss
s@Gnss' {} Text
a -> Gnss
s {$sel:payload:Gnss' :: Text
payload = Text
a} :: Gnss)

instance Prelude.Hashable Gnss where
  hashWithSalt :: Int -> Gnss -> Int
hashWithSalt Int
_salt Gnss' {Maybe Bool
Maybe Double
Maybe (NonEmpty Double)
Text
payload :: Text
use2DSolver :: Maybe Bool
captureTimeAccuracy :: Maybe Double
captureTime :: Maybe Double
assistPosition :: Maybe (NonEmpty Double)
assistAltitude :: Maybe Double
$sel:payload:Gnss' :: Gnss -> Text
$sel:use2DSolver:Gnss' :: Gnss -> Maybe Bool
$sel:captureTimeAccuracy:Gnss' :: Gnss -> Maybe Double
$sel:captureTime:Gnss' :: Gnss -> Maybe Double
$sel:assistPosition:Gnss' :: Gnss -> Maybe (NonEmpty Double)
$sel:assistAltitude:Gnss' :: Gnss -> Maybe Double
..} =
    Int
_salt
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Double
assistAltitude
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe (NonEmpty Double)
assistPosition
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Double
captureTime
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Double
captureTimeAccuracy
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Maybe Bool
use2DSolver
      forall a. Hashable a => Int -> a -> Int
`Prelude.hashWithSalt` Text
payload

instance Prelude.NFData Gnss where
  rnf :: Gnss -> ()
rnf Gnss' {Maybe Bool
Maybe Double
Maybe (NonEmpty Double)
Text
payload :: Text
use2DSolver :: Maybe Bool
captureTimeAccuracy :: Maybe Double
captureTime :: Maybe Double
assistPosition :: Maybe (NonEmpty Double)
assistAltitude :: Maybe Double
$sel:payload:Gnss' :: Gnss -> Text
$sel:use2DSolver:Gnss' :: Gnss -> Maybe Bool
$sel:captureTimeAccuracy:Gnss' :: Gnss -> Maybe Double
$sel:captureTime:Gnss' :: Gnss -> Maybe Double
$sel:assistPosition:Gnss' :: Gnss -> Maybe (NonEmpty Double)
$sel:assistAltitude:Gnss' :: Gnss -> Maybe Double
..} =
    forall a. NFData a => a -> ()
Prelude.rnf Maybe Double
assistAltitude
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe (NonEmpty Double)
assistPosition
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Double
captureTime
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Double
captureTimeAccuracy
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Maybe Bool
use2DSolver
      seq :: forall a b. a -> b -> b
`Prelude.seq` forall a. NFData a => a -> ()
Prelude.rnf Text
payload

instance Data.ToJSON Gnss where
  toJSON :: Gnss -> Value
toJSON Gnss' {Maybe Bool
Maybe Double
Maybe (NonEmpty Double)
Text
payload :: Text
use2DSolver :: Maybe Bool
captureTimeAccuracy :: Maybe Double
captureTime :: Maybe Double
assistPosition :: Maybe (NonEmpty Double)
assistAltitude :: Maybe Double
$sel:payload:Gnss' :: Gnss -> Text
$sel:use2DSolver:Gnss' :: Gnss -> Maybe Bool
$sel:captureTimeAccuracy:Gnss' :: Gnss -> Maybe Double
$sel:captureTime:Gnss' :: Gnss -> Maybe Double
$sel:assistPosition:Gnss' :: Gnss -> Maybe (NonEmpty Double)
$sel:assistAltitude:Gnss' :: Gnss -> Maybe Double
..} =
    [Pair] -> Value
Data.object
      ( forall a. [Maybe a] -> [a]
Prelude.catMaybes
          [ (Key
"AssistAltitude" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Double
assistAltitude,
            (Key
"AssistPosition" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe (NonEmpty Double)
assistPosition,
            (Key
"CaptureTime" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Double
captureTime,
            (Key
"CaptureTimeAccuracy" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=)
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Double
captureTimeAccuracy,
            (Key
"Use2DSolver" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..=) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
Prelude.<$> Maybe Bool
use2DSolver,
            forall a. a -> Maybe a
Prelude.Just (Key
"Payload" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
Data..= Text
payload)
          ]
      )