carla/sensor/data/
gnss_measurement.rs1use 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);