Skip to main content

ace_uds/message/services/
dynamically_define_data_identifier.rs

1use crate::{message::DataIdentifier, UdsError};
2use ace_core::{FrameIter, FrameRead};
3use ace_macros::{FrameCodec, FrameWrite};
4
5#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
6#[frame(error = UdsError)]
7pub enum DynamicallyDefineDataIdentifierRequest<'a> {
8    #[frame(id_pat = "0x00 | 0x04..=0x7F")]
9    IsoSaeReserved(u8),
10    #[frame(id = 0x01)]
11    DefineByIdentifierRequest(DefineByIdentifierRequest<'a>),
12    #[frame(id = 0x02)]
13    DefineByMemoryAddressRequest(DefineByMemoryAddressRequest<'a>),
14    #[frame(id = 0x03)]
15    ClearDynamicallyDefinedDataIdentifier(ClearDynamicallyDefinedDataIdentifier),
16}
17
18#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
19#[frame(error = UdsError)]
20pub struct DefineByIdentifierRequest<'a> {
21    pub dynamically_defined_data_identifier: DataIdentifier,
22    pub source_data: FrameIter<'a, SourceData>,
23}
24
25#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
26#[frame(error = UdsError)]
27pub struct DefineByMemoryAddressRequest<'a> {
28    pub dynamically_defined_data_identifier: DataIdentifier,
29    pub address_and_length_format_identifier: u8,
30    pub memory_data: FrameIter<'a, MemoryData<'a>>,
31}
32
33#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
34#[frame(error = UdsError)]
35pub struct ClearDynamicallyDefinedDataIdentifier {
36    pub dynamically_defined_data_identifier: DataIdentifier,
37}
38
39#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
40#[frame(error = UdsError)]
41pub struct MemoryData<'a> {
42    pub memory_address: &'a [u8],
43    pub memory_size: &'a [u8],
44}
45
46#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
47#[frame(error = UdsError)]
48pub enum DefinitionType {
49    #[frame(id = 0x01)]
50    DefineByIdentifier,
51    #[frame(id = 0x02)]
52    DefineByMemoryAddress,
53    #[frame(id = 0x03)]
54    ClearDynamicallyDefinedDataIdentifier,
55}
56
57#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
58#[frame(error = UdsError)]
59pub struct SourceData {
60    pub source_data_identifier: DataIdentifier,
61    pub position_in_source_data_record: u8,
62    pub memory_size: u8,
63}
64
65#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
66#[frame(error = UdsError)]
67pub struct DynamicallyDefineDataIdentifierResponse {
68    pub definition_type: DefinitionType,
69    pub dynamically_defined_data_identifier: DataIdentifier,
70}
71
72impl<'a> FrameRead<'a> for DefineByMemoryAddressRequest<'a> {
73    type Error = UdsError;
74
75    fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
76        let dynamically_defined_data_identifier = DataIdentifier::decode(buf)?;
77        let address_and_length_format_identifier = u8::decode(buf)?;
78
79        let memory_address_length = (address_and_length_format_identifier & 0x0F) as usize;
80        let memory_size_length = (address_and_length_format_identifier >> 4) as usize;
81        let stride = memory_address_length + memory_size_length;
82
83        // Truncate to the largest multiple of stride that fits in the buffer,
84        // discarding any trailing bytes that don't form a complete record.
85        let memory_data_len = if stride == 0 {
86            0
87        } else {
88            (buf.len() / stride) * stride
89        };
90
91        let memory_data = FrameIter::new(&buf[..memory_data_len]);
92        *buf = &buf[memory_data_len..];
93
94        Ok(Self {
95            dynamically_defined_data_identifier,
96            address_and_length_format_identifier,
97            memory_data,
98        })
99    }
100}