use std::time::Duration;
use super::{
Error, OperationType, Result, gpiod,
line::{EdgeKind, Offset},
};
#[derive(Debug, Eq, PartialEq)]
pub struct Event(*mut gpiod::gpiod_edge_event);
unsafe impl Send for Event {}
impl Event {
pub fn try_clone(event: &Event) -> Result<Event> {
let event = unsafe { gpiod::gpiod_edge_event_copy(event.0) };
if event.is_null() {
return Err(Error::OperationFailed(
OperationType::EdgeEventCopy,
errno::errno(),
));
}
Ok(Self(event))
}
pub fn event_type(&self) -> Result<EdgeKind> {
EdgeKind::new(unsafe { gpiod::gpiod_edge_event_get_event_type(self.0) })
}
pub fn timestamp(&self) -> Duration {
Duration::from_nanos(unsafe { gpiod::gpiod_edge_event_get_timestamp_ns(self.0) })
}
pub fn line_offset(&self) -> Offset {
unsafe { gpiod::gpiod_edge_event_get_line_offset(self.0) }
}
pub fn global_seqno(&self) -> usize {
unsafe {
gpiod::gpiod_edge_event_get_global_seqno(self.0)
.try_into()
.unwrap()
}
}
pub fn line_seqno(&self) -> usize {
unsafe {
gpiod::gpiod_edge_event_get_line_seqno(self.0)
.try_into()
.unwrap()
}
}
}
impl Drop for Event {
fn drop(&mut self) {
unsafe { gpiod::gpiod_edge_event_free(self.0) };
}
}