ross_protocol/event/
internal.rs

1use alloc::vec;
2use core::convert::TryInto;
3
4use crate::convert_packet::{ConvertPacket, ConvertPacketError};
5use crate::event::event_code::*;
6use crate::event::EventError;
7use crate::packet::Packet;
8
9#[derive(Debug, Eq, PartialEq, Ord, PartialOrd)]
10pub struct SystemTickEvent {
11    pub receiver_address: u16,
12}
13
14impl ConvertPacket<SystemTickEvent> for SystemTickEvent {
15    fn try_from_packet(packet: &Packet) -> Result<Self, ConvertPacketError> {
16        if packet.data.len() != 2 {
17            return Err(ConvertPacketError::WrongSize);
18        }
19
20        if packet.is_error {
21            return Err(ConvertPacketError::WrongType);
22        }
23
24        if u16::from_be_bytes(packet.data[0..=1].try_into().unwrap())
25            != INTERNAL_SYSTEM_TICK_EVENT_CODE
26        {
27            return Err(ConvertPacketError::Event(EventError::WrongEventType));
28        }
29
30        let receiver_address = packet.device_address;
31
32        Ok(SystemTickEvent { receiver_address })
33    }
34
35    fn to_packet(&self) -> Packet {
36        let mut data = vec![];
37
38        for byte in u16::to_be_bytes(INTERNAL_SYSTEM_TICK_EVENT_CODE).iter() {
39            data.push(*byte);
40        }
41
42        Packet {
43            is_error: false,
44            device_address: self.receiver_address,
45            data,
46        }
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::*;
53
54    const EVENT_PACKET: Packet = Packet {
55        is_error: false,
56        device_address: 0xabab,
57        data: vec![],
58    };
59
60    #[test]
61    fn try_from_packet_test() {
62        let mut packet = EVENT_PACKET;
63        packet.data = vec![
64            ((INTERNAL_SYSTEM_TICK_EVENT_CODE >> 8) & 0xff) as u8, // event code
65            ((INTERNAL_SYSTEM_TICK_EVENT_CODE >> 0) & 0xff) as u8, // event code
66        ];
67
68        let event = SystemTickEvent::try_from_packet(&packet).unwrap();
69
70        assert_eq!(event.receiver_address, 0xabab);
71    }
72
73    #[test]
74    fn to_packet_test() {
75        let event = SystemTickEvent {
76            receiver_address: 0xabab,
77        };
78
79        let mut packet = EVENT_PACKET;
80        packet.data = vec![
81            ((INTERNAL_SYSTEM_TICK_EVENT_CODE >> 8) & 0xff) as u8, // event code
82            ((INTERNAL_SYSTEM_TICK_EVENT_CODE >> 0) & 0xff) as u8, // event code
83        ];
84
85        assert_eq!(event.to_packet(), packet);
86    }
87}