xsens_mti/message/
mod.rs

1mod bus_id;
2mod frame;
3mod message_id;
4mod payload_length;
5
6pub use bus_id::BusId;
7pub use frame::{Frame, FrameError};
8pub use message_id::MessageId;
9pub use payload_length::PayloadLength;
10
11// TODO - this stuff needs a refactor
12
13pub trait MessageExt {
14    const MSG_ID: MessageId;
15
16    fn message_id(&self) -> MessageId {
17        Self::MSG_ID
18    }
19}
20
21pub trait MessageEncode: MessageExt {
22    // TODO - some sort of PayloadLength or size hint
23    //
24    // caller sets
25    //   preamble, bus_id, checksum
26    //
27    // impl sets
28    //   msg_id, payload_length, payload
29    //   if payload != 0, impl should call check_payload_len too
30    fn encode(&self, frame: &mut Frame<&mut [u8]>) -> Result<(), FrameError> {
31        frame.set_message_id(Self::MSG_ID);
32        self.encode_frame(frame)
33    }
34
35    fn encode_frame(&self, frame: &mut Frame<&mut [u8]>) -> Result<(), FrameError>;
36}
37
38pub trait MessageDecode<'buf>: MessageExt {
39    // TODO - better method naming
40    // caller checks msg id
41    fn decode(frame: &Frame<&'buf [u8]>) -> Result<Self, FrameError>
42    where
43        Self: Sized,
44    {
45        debug_assert_eq!(frame.message_id(), Self::MSG_ID);
46        Self::decode_frame(frame)
47    }
48
49    fn decode_frame(frame: &Frame<&'buf [u8]>) -> Result<Self, FrameError>
50    where
51        Self: Sized;
52}