ssp/serial_number/
response.rs

1use crate::{
2    impl_default, impl_message_from_buf, impl_message_ops, impl_response_ops,
3    len::SERIAL_NUMBER_RESPONSE, std::fmt, MessageOps, MessageType, ResponseOps, SerialNumber,
4};
5
6mod index {
7    pub const SERIAL_NUMBER: usize = 4;
8    pub const SERIAL_NUMBER_END: usize = 8;
9}
10
11/// SerialNumber - Response (0x0A)
12///
13/// Represents a response to an [SerialNumberCommand](crate::SerialNumberCommand) message.
14#[repr(C)]
15#[derive(Clone, Copy, Debug, PartialEq)]
16pub struct SerialNumberResponse {
17    buf: [u8; SERIAL_NUMBER_RESPONSE],
18}
19
20impl SerialNumberResponse {
21    /// Creates a new [SerialNumberResponse] message.
22    pub fn new() -> Self {
23        let mut msg = Self {
24            buf: [0u8; SERIAL_NUMBER_RESPONSE],
25        };
26
27        msg.init();
28
29        msg
30    }
31
32    /// Gets the [SerialNumber].
33    pub fn serial_number(&self) -> SerialNumber {
34        self.buf[index::SERIAL_NUMBER..index::SERIAL_NUMBER_END]
35            .as_ref()
36            .into()
37    }
38
39    /// Sets the [SerialNumber].
40    pub fn set_serial_number(&mut self, serial_number: SerialNumber) {
41        self.buf[index::SERIAL_NUMBER..index::SERIAL_NUMBER_END]
42            .copy_from_slice(serial_number.as_inner().to_be_bytes().as_ref());
43    }
44}
45
46impl_default!(SerialNumberResponse);
47impl_message_from_buf!(SerialNumberResponse);
48impl_message_ops!(SerialNumberResponse, MessageType::SerialNumber);
49impl_response_ops!(SerialNumberResponse);
50
51impl fmt::Display for SerialNumberResponse {
52    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
53        let stx = self.stx();
54        let seqid = self.sequence_id();
55        let data_len = self.data_len();
56        let status = self.response_status();
57        let serial_number = self.serial_number();
58        write!(f, "STX: 0x{stx:02x} | SEQID: {seqid} | LEN: 0x{data_len:02x} | Response status: {status} | Serial Number: {serial_number}")
59    }
60}