Skip to main content

ace_uds/message/services/
write_memory_by_address.rs

1use crate::UdsError;
2use ace_core::{take_n, FrameRead};
3use ace_macros::FrameWrite;
4
5#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
6#[frame(error = UdsError)]
7pub struct WriteMemoryByAddressRequest<'a> {
8    pub address_and_length_format_identifier: u8,
9    pub memory_address: &'a [u8],
10    pub memory_size: &'a [u8],
11    pub data_record: &'a [u8],
12}
13
14#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
15#[frame(error = UdsError)]
16pub struct WriteMemoryByAddressResponse<'a> {
17    pub address_and_length_format_identifier: u8,
18    pub memory_address: &'a [u8],
19    pub memory_size: &'a [u8],
20}
21
22impl<'a> FrameRead<'a> for WriteMemoryByAddressRequest<'a> {
23    type Error = UdsError;
24
25    fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
26        let address_and_length_format_identifier = u8::decode(buf)?;
27
28        let memory_address_length = (address_and_length_format_identifier & 0x0F) as usize;
29        let memory_size_length = (address_and_length_format_identifier >> 4) as usize;
30
31        let memory_address = take_n(buf, memory_address_length)?;
32        let memory_size = take_n(buf, memory_size_length)?;
33
34        let data_record = *buf;
35        *buf = &buf[buf.len()..];
36
37        Ok(Self {
38            address_and_length_format_identifier,
39            memory_address,
40            memory_size,
41            data_record,
42        })
43    }
44}
45
46impl<'a> FrameRead<'a> for WriteMemoryByAddressResponse<'a> {
47    type Error = UdsError;
48
49    fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
50        let address_and_length_format_identifier = u8::decode(buf)?;
51
52        let memory_address_length = (address_and_length_format_identifier & 0x0F) as usize;
53        let memory_size_length = (address_and_length_format_identifier >> 4) as usize;
54
55        let memory_address = take_n(buf, memory_address_length)?;
56        let memory_size = take_n(buf, memory_size_length)?;
57
58        Ok(Self {
59            address_and_length_format_identifier,
60            memory_address,
61            memory_size,
62        })
63    }
64}