Skip to main content

ace_uds/message/services/
request_upload.rs

1use 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}