use anyhow::Result; use async_trait::async_trait; use serde::Serialize; #[derive(Debug, Clone, PartialEq, Eq, Serialize)] pub struct TestFrame { pub header: [u8; 2], pub cmd: u8, pub length: usize, pub payload: Vec, pub checksum: u8, pub dts_ms: u64, } #[derive(Debug, Clone, PartialEq, Eq, Serialize)] pub struct TactileAFrameMetaData { pub header: [u8; 2], pub payload_len: usize, pub device_addr: u8, pub extend_code: u8, pub func_code: u8, pub start_addr: u32, pub except_data_len: usize, // pub status: u8, // pub payload_data: Vec, pub checksum: u8, // pub dts_ms: u64, } #[derive(Debug, Clone, PartialEq, Eq, Serialize)] pub struct TactileAReqFrame { pub meta: TactileAFrameMetaData, } #[derive(Debug, Clone, PartialEq, Eq, Serialize)] pub struct TactileARepFrame { pub meta: TactileAFrameMetaData, pub status: TactileAFrameStatusCode, pub payload: Vec, pub dts_ms: u64, } #[derive(Debug, Clone, PartialEq, Eq, Serialize)] pub enum TactileAFrameStatusCode { Success, Failure, } #[derive(Debug, Clone, PartialEq, Eq, Serialize)] pub enum TactileAFrame { Req(TactileAReqFrame), Rep(TactileARepFrame), } // TODO: filter // pub trait FrameFilter { // fn apply(&self) // } #[async_trait] pub trait FrameHandler: Send { async fn on_frame(&mut self, frame: &F) -> Result>>; }