uf_crsf/packets/
device_ping.rs

1use crate::packets::{CrsfPacket, PacketType};
2use crate::CrsfParsingError;
3
4/// Represents a Device Ping packet (0x28).
5#[derive(Clone, Debug, PartialEq, Eq)]
6#[cfg_attr(feature = "defmt", derive(defmt::Format))]
7pub struct DevicePing {
8    pub dst_addr: u8,
9    pub src_addr: u8,
10}
11
12impl DevicePing {
13    pub fn new(dst_addr: u8, src_addr: u8) -> Result<Self, CrsfParsingError> {
14        Ok(Self { dst_addr, src_addr })
15    }
16}
17
18impl CrsfPacket for DevicePing {
19    const PACKET_TYPE: PacketType = PacketType::DevicePing;
20    const MIN_PAYLOAD_SIZE: usize = 2 * size_of::<u8>();
21
22    fn to_bytes(&self, buffer: &mut [u8]) -> Result<usize, CrsfParsingError> {
23        self.validate_buffer_size(buffer)?;
24        buffer[0] = self.dst_addr;
25        buffer[1] = self.src_addr;
26        Ok(Self::MIN_PAYLOAD_SIZE)
27    }
28
29    fn from_bytes(data: &[u8]) -> Result<Self, CrsfParsingError> {
30        Ok(Self {
31            dst_addr: data[0],
32            src_addr: data[1],
33        })
34    }
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn test_parameter_ping_to_bytes() {
43        let ping = DevicePing {
44            dst_addr: 0xEA,
45            src_addr: 0xEE,
46        };
47        let mut buffer = [0u8; 2];
48        let len = ping.to_bytes(&mut buffer).unwrap();
49        assert_eq!(len, 2);
50        assert_eq!(buffer, [0xEA, 0xEE]);
51    }
52
53    #[test]
54    fn test_parameter_ping_from_bytes() {
55        let data: [u8; 2] = [0xEA, 0xEE];
56        let ping = DevicePing::from_bytes(&data).unwrap();
57        assert_eq!(
58            ping,
59            DevicePing {
60                dst_addr: 0xEA,
61                src_addr: 0xEE
62            }
63        );
64    }
65
66    #[test]
67    fn test_parameter_ping_from_bytes_with_payload() {
68        // Should ignore extra payload
69        let data: [u8; 5] = [0xEA, 0xEE, 3, 4, 5];
70        let ping = DevicePing::from_bytes(&data).unwrap();
71        assert_eq!(
72            ping,
73            DevicePing {
74                dst_addr: 0xEA,
75                src_addr: 0xEE
76            }
77        );
78    }
79    #[test]
80    fn test_parameter_ping_buffer_too_small() {
81        let ping = DevicePing {
82            dst_addr: 0xEA,
83            src_addr: 0xEE,
84        };
85        let mut buffer = [0u8; DevicePing::MIN_PAYLOAD_SIZE - 1];
86        let result = ping.to_bytes(&mut buffer);
87        assert_eq!(result, Err(CrsfParsingError::BufferOverflow));
88    }
89}