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