ace_uds/message/services/
write_memory_by_address.rs1use 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}