carla/sensor/data/
gnss_measurement.rs

1use crate::{geom::GeoLocation, sensor::SensorData};
2use carla_sys::carla_rust::sensor::data::FfiGnssMeasurement;
3use cxx::SharedPtr;
4use derivative::Derivative;
5use static_assertions::assert_impl_all;
6
7#[derive(Clone, Derivative)]
8#[derivative(Debug)]
9#[repr(transparent)]
10pub struct GnssMeasurement {
11    #[derivative(Debug = "ignore")]
12    inner: SharedPtr<FfiGnssMeasurement>,
13}
14
15impl GnssMeasurement {
16    pub fn geo_location(&self) -> GeoLocation {
17        self.inner.GetGeoLocation()
18    }
19
20    pub fn longitude(&self) -> f64 {
21        self.inner.GetLongitude()
22    }
23
24    pub fn latitude(&self) -> f64 {
25        self.inner.GetLatitude()
26    }
27
28    pub fn attitude(&self) -> f64 {
29        self.inner.GetAltitude()
30    }
31
32    pub(crate) fn from_cxx(ptr: SharedPtr<FfiGnssMeasurement>) -> Option<Self> {
33        if ptr.is_null() {
34            None
35        } else {
36            Some(Self { inner: ptr })
37        }
38    }
39}
40
41impl TryFrom<SensorData> for GnssMeasurement {
42    type Error = SensorData;
43
44    fn try_from(value: SensorData) -> Result<Self, Self::Error> {
45        let ptr = value.inner.to_gnss_measurement();
46        Self::from_cxx(ptr).ok_or(value)
47    }
48}
49
50assert_impl_all!(GnssMeasurement: Send, Sync);