use crate::sensor::SensorData;
use carla_sys::carla_rust::sensor::data::FfiDVSEventArray;
use cxx::SharedPtr;
use derivative::Derivative;
use std::slice;
pub use carla_sys::carla::sensor::data::DVSEvent;
#[derive(Clone, Derivative)]
#[derivative(Debug)]
#[repr(transparent)]
pub struct DVSEventArray {
#[derivative(Debug = "ignore")]
inner: SharedPtr<FfiDVSEventArray>,
}
impl DVSEventArray {
pub fn height(&self) -> usize {
self.inner.GetHeight()
}
pub fn width(&self) -> usize {
self.inner.GetWidth()
}
pub fn len(&self) -> usize {
self.inner.size()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.len() == 0
}
pub fn fov_angle(&self) -> f32 {
self.inner.GetFOVAngle()
}
pub fn as_slice(&self) -> &[DVSEvent] {
let ptr = self.inner.data();
let len = self.len();
debug_assert!(!ptr.is_null(), "DVS event data pointer is null");
unsafe { slice::from_raw_parts(ptr, len) }
}
pub fn get(&self, index: usize) -> Option<&DVSEvent> {
if index < self.len() {
Some(self.inner.at(index))
} else {
None
}
}
pub(crate) fn from_cxx(ptr: SharedPtr<FfiDVSEventArray>) -> Option<Self> {
if ptr.is_null() {
None
} else {
Some(Self { inner: ptr })
}
}
}
impl TryFrom<SensorData> for DVSEventArray {
type Error = SensorData;
fn try_from(value: SensorData) -> Result<Self, Self::Error> {
let ptr = value.inner.to_dvs_event_array();
Self::from_cxx(ptr).ok_or(value)
}
}
unsafe impl Send for DVSEventArray {}
unsafe impl Sync for DVSEventArray {}