robojackets_robocup_rtp/
kicker_program_message.rs

1//!
2//! Message containing information about the current kicker
3//! programmer operation
4//! 
5
6use ncomm_utils::packing::{Packable, PackingError};
7
8/// The size of a Kicker Program Message
9pub const KICKER_PROGRAM_MESSAGE: usize = 5;
10
11#[derive(Clone, Copy, Debug, PartialEq, Eq)]
12/// Messages sent from the robot when the kicker is being programmed
13pub struct KickerProgramMessage {
14    /// Is the kicker being programmed with kick on breakbeam
15    pub kick_on_breakbeam: bool,
16    /// Is the kicker finished programming
17    pub finished: bool, 
18    /// The current page being programmed
19    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 that a kicker program message can be packed and unpacked
56    #[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}