use crate::{geom::GeoLocation, sensor::SensorData};
use carla_sys::carla_rust::sensor::data::FfiGnssMeasurement;
use cxx::SharedPtr;
use derivative::Derivative;
use static_assertions::assert_impl_all;
#[cfg_attr(carla_version_0916, doc = "")]
#[cfg_attr(
carla_version_0916,
doc = " [`carla.GnssMeasurement`]: https://carla.readthedocs.io/en/0.9.16/python_api/#carla.GnssMeasurement"
)]
#[cfg_attr(carla_version_0915, doc = "")]
#[cfg_attr(
carla_version_0915,
doc = " [`carla.GnssMeasurement`]: https://carla.readthedocs.io/en/0.9.15/python_api/#carla.GnssMeasurement"
)]
#[cfg_attr(carla_version_0914, doc = "")]
#[cfg_attr(
carla_version_0914,
doc = " [`carla.GnssMeasurement`]: https://carla.readthedocs.io/en/0.9.14/python_api/#carla.GnssMeasurement"
)]
#[derive(Clone, Derivative)]
#[derivative(Debug)]
#[repr(transparent)]
pub struct GnssMeasurement {
#[derivative(Debug = "ignore")]
inner: SharedPtr<FfiGnssMeasurement>,
}
impl GnssMeasurement {
#[cfg_attr(
carla_version_0916,
doc = " See [carla.GnssMeasurement.transform](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.GnssMeasurement.transform)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.GnssMeasurement.transform](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.GnssMeasurement.transform)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.GnssMeasurement.transform](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.GnssMeasurement.transform)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn geo_location(&self) -> GeoLocation {
unsafe {
let cpp_geo = self.inner.GetGeoLocation();
GeoLocation::from_ffi(std::mem::transmute::<
carla_sys::carla::geom::GeoLocation,
crate::geom::FfiGeoLocation,
>(cpp_geo))
}
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.GnssMeasurement.longitude](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.GnssMeasurement.longitude)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.GnssMeasurement.longitude](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.GnssMeasurement.longitude)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.GnssMeasurement.longitude](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.GnssMeasurement.longitude)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn longitude(&self) -> f64 {
self.inner.GetLongitude()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.GnssMeasurement.latitude](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.GnssMeasurement.latitude)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.GnssMeasurement.latitude](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.GnssMeasurement.latitude)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.GnssMeasurement.latitude](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.GnssMeasurement.latitude)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn latitude(&self) -> f64 {
self.inner.GetLatitude()
}
#[cfg_attr(
carla_version_0916,
doc = " See [carla.GnssMeasurement.altitude](https://carla.readthedocs.io/en/0.9.16/python_api/#carla.GnssMeasurement.altitude)"
)]
#[cfg_attr(
carla_version_0915,
doc = " See [carla.GnssMeasurement.altitude](https://carla.readthedocs.io/en/0.9.15/python_api/#carla.GnssMeasurement.altitude)"
)]
#[cfg_attr(
carla_version_0914,
doc = " See [carla.GnssMeasurement.altitude](https://carla.readthedocs.io/en/0.9.14/python_api/#carla.GnssMeasurement.altitude)"
)]
#[cfg_attr(
any(carla_version_0916, carla_version_0915, carla_version_0914),
doc = " in the Python API."
)]
pub fn attitude(&self) -> f64 {
self.inner.GetAltitude()
}
pub(crate) fn from_cxx(ptr: SharedPtr<FfiGnssMeasurement>) -> Option<Self> {
if ptr.is_null() {
None
} else {
Some(Self { inner: ptr })
}
}
}
impl TryFrom<SensorData> for GnssMeasurement {
type Error = SensorData;
fn try_from(value: SensorData) -> Result<Self, Self::Error> {
let ptr = value.inner.to_gnss_measurement();
Self::from_cxx(ptr).ok_or(value)
}
}
assert_impl_all!(GnssMeasurement: Send, Sync);