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