Skip to main content

ace_uds/message/services/
read_memory_by_address.rs

1use crate::UdsError;
2use ace_core::{take_n, FrameRead};
3use ace_macros::{FrameCodec, FrameWrite};
4
5#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
6#[frame(error = UdsError)]
7pub struct ReadMemoryByAddressRequest<'a> {
8    pub address_and_length_format_identifier: u8,
9    pub memory_address: &'a [u8],
10    pub memory_size: &'a [u8],
11}
12
13#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
14#[frame(error = UdsError)]
15pub struct ReadMemoryByAddressResponse<'a> {
16    pub data_record: &'a [u8],
17}
18
19impl<'a> FrameRead<'a> for ReadMemoryByAddressRequest<'a> {
20    type Error = UdsError;
21
22    fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
23        let address_and_length_format_identifier = u8::decode(buf)?;
24
25        let memory_address_length = (address_and_length_format_identifier & 0x0F) as usize;
26        let memory_size_length = (address_and_length_format_identifier >> 4) as usize;
27
28        let memory_address = take_n(buf, memory_address_length)?;
29        let memory_size = take_n(buf, memory_size_length)?;
30
31        Ok(Self {
32            address_and_length_format_identifier,
33            memory_address,
34            memory_size,
35        })
36    }
37}