robojackets_robocup_rtp/
kicker_program_message.rs1use ncomm_utils::packing::{Packable, PackingError};
7
8pub const KICKER_PROGRAM_MESSAGE: usize = 5;
10
11#[derive(Clone, Copy, Debug, PartialEq, Eq)]
12pub struct KickerProgramMessage {
14 pub kick_on_breakbeam: bool,
16 pub finished: bool,
18 pub page: u32,
20}
21
22impl Packable for KickerProgramMessage {
23 fn len() -> usize {
24 KICKER_PROGRAM_MESSAGE
25 }
26
27 fn pack(self, buffer: &mut [u8]) -> Result<(), PackingError> {
28 if buffer.len() < KICKER_PROGRAM_MESSAGE {
29 return Err(PackingError::InvalidBufferSize);
30 }
31
32 buffer[0] = (self.kick_on_breakbeam as u8) << 4 | (self.finished as u8);
33 buffer[1..5].copy_from_slice(&self.page.to_le_bytes());
34
35 Ok(())
36 }
37
38 fn unpack(data: &[u8]) -> Result<Self, PackingError> {
39 if data.len() < KICKER_PROGRAM_MESSAGE {
40 return Err(PackingError::InvalidBufferSize);
41 }
42
43 Ok(Self {
44 kick_on_breakbeam: data[0] & 0b1 << 4 != 0,
45 finished: data[0] & 0b1 != 0,
46 page: u32::from_le_bytes(data[1..5].try_into().unwrap()),
47 })
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54
55 #[test]
57 fn test_kicker_program_message_pack_and_unpack() {
58 let message = KickerProgramMessage {
59 kick_on_breakbeam: true,
60 finished: true,
61 page: 3
62 };
63
64 let mut buffer = [0u8; KICKER_PROGRAM_MESSAGE];
65 message.pack(&mut buffer).unwrap();
66 assert_eq!(buffer[0], 0b0001_0001);
67
68 let unpacked_message = KickerProgramMessage::unpack(&buffer).unwrap();
69
70 assert_eq!(
71 message,
72 unpacked_message,
73 )
74 }
75}