use crate::sink::{EventColumns, TriggerColumns};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(C)]
pub struct CdEvent {
pub x: u16,
pub y: u16,
pub polarity: u8,
pub timestamp: u64,
}
impl CdEvent {
#[inline]
pub fn new(x: u16, y: u16, polarity: u8, timestamp: u64) -> Self {
Self {
x,
y,
polarity,
timestamp,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(C)]
pub struct TriggerEvent {
pub value: u8,
pub id: u8,
pub timestamp: u64,
}
impl TriggerEvent {
#[inline]
pub fn new(value: u8, id: u8, timestamp: u64) -> Self {
Self {
value,
id,
timestamp,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum RawEventType {
AddrY = 0x0,
AddrX = 0x2,
VectBaseX = 0x3,
Vect12 = 0x4,
Vect8 = 0x5,
TimeLow = 0x6,
Continued4 = 0x7,
TimeHigh = 0x8,
ExtTrigger = 0xA,
Others = 0xE,
Continued12 = 0xF,
}
impl RawEventType {
#[inline]
pub fn from_u8(value: u8) -> Option<Self> {
match value {
0x0 => Some(Self::AddrY),
0x2 => Some(Self::AddrX),
0x3 => Some(Self::VectBaseX),
0x4 => Some(Self::Vect12),
0x5 => Some(Self::Vect8),
0x6 => Some(Self::TimeLow),
0x7 => Some(Self::Continued4),
0x8 => Some(Self::TimeHigh),
0xA => Some(Self::ExtTrigger),
0xE => Some(Self::Others),
0xF => Some(Self::Continued12),
_ => None,
}
}
}
#[derive(Debug, Clone)]
pub struct SensorMetadata {
pub width: u32,
pub height: u32,
}
impl Default for SensorMetadata {
fn default() -> Self {
Self {
width: 1280,
height: 720,
}
}
}
#[derive(Debug)]
pub struct DecodeResult {
pub cd_events: Vec<CdEvent>,
pub trigger_events: Vec<TriggerEvent>,
pub metadata: SensorMetadata,
}
#[derive(Debug)]
pub struct ColumnarDecodeResult {
pub cd_events: EventColumns,
pub trigger_events: TriggerColumns,
pub metadata: SensorMetadata,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_raw_event_type_parsing() {
assert_eq!(RawEventType::from_u8(0x0), Some(RawEventType::AddrY));
assert_eq!(RawEventType::from_u8(0x2), Some(RawEventType::AddrX));
assert_eq!(RawEventType::from_u8(0x8), Some(RawEventType::TimeHigh));
assert_eq!(RawEventType::from_u8(0x1), None); assert_eq!(RawEventType::from_u8(0x9), None); }
#[test]
fn test_cd_event_creation() {
let event = CdEvent::new(100, 200, 1, 12345);
assert_eq!(event.x, 100);
assert_eq!(event.y, 200);
assert_eq!(event.polarity, 1);
assert_eq!(event.timestamp, 12345);
}
}