ssp/firmware/
response.rs

1use crate::{
2    impl_default, impl_message_from_buf, impl_message_ops, impl_response_display,
3    impl_response_ops, len::PROGRAM_FIRMWARE_RESPONSE, message::MessageOps, MessageType,
4};
5
6mod index {
7    pub const BLOCK_LEN: usize = 4;
8    pub const BLOCK_LEN_END: usize = 5;
9}
10
11/// ProgramFirmware - Response (0x0B)
12///
13/// Represents a response to an [ProgramFirmwareCommand](crate::ProgramFirmwareCommand) message.
14#[repr(C)]
15#[derive(Clone, Copy, Debug, PartialEq)]
16pub struct ProgramFirmwareResponse {
17    buf: [u8; PROGRAM_FIRMWARE_RESPONSE],
18}
19
20impl ProgramFirmwareResponse {
21    /// Creates a new [ProgramFirmwareResponse] message.
22    pub fn new() -> Self {
23        let mut msg = Self {
24            buf: [0u8; PROGRAM_FIRMWARE_RESPONSE],
25        };
26
27        msg.init();
28
29        msg
30    }
31
32    /// Gets the expected block length from the device.
33    ///
34    /// Example:
35    ///
36    /// ```
37    /// # use ssp;
38    /// let fw_res = ssp::ProgramFirmwareResponse::new();
39    /// assert_eq!(fw_res.block_len(), 0);
40    /// ```
41    pub fn block_len(&self) -> u16 {
42        u16::from_le_bytes([self.buf[index::BLOCK_LEN], self.buf[index::BLOCK_LEN_END]])
43    }
44
45    /// Sets the expected block length from the device.
46    ///
47    /// Example:
48    ///
49    /// ```
50    /// # use ssp;
51    /// let mut fw_res = ssp::ProgramFirmwareResponse::new();
52    /// fw_res.set_block_len(128);
53    /// assert_eq!(fw_res.block_len(), 128);
54    /// ```
55    pub fn set_block_len(&mut self, len: u16) {
56        self.buf[index::BLOCK_LEN..=index::BLOCK_LEN_END].copy_from_slice(&len.to_le_bytes());
57    }
58}
59
60impl_default!(ProgramFirmwareResponse);
61impl_message_from_buf!(ProgramFirmwareResponse);
62impl_message_ops!(ProgramFirmwareResponse, MessageType::ProgramFirmware);
63impl_response_ops!(ProgramFirmwareResponse);
64impl_response_display!(ProgramFirmwareResponse);