1use crate::UdsError;
2use ace_core::{take_n, FrameRead};
3use ace_macros::{FrameCodec, FrameWrite};
4
5#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
6#[frame(error = UdsError)]
7pub enum RequestFileTransferRequest<'a> {
8 #[frame(id = 0x01)]
9 AddFile(AddFileRequest<'a>),
10 #[frame(id = 0x02)]
11 DeleteFile(DeleteFileRequest<'a>),
12 #[frame(id = 0x03)]
13 ReplaceFile(ReplaceFileRequest<'a>),
14 #[frame(id = 0x04)]
15 ReadFile(ReadFileRequest<'a>),
16 #[frame(id = 0x05)]
17 ReadDir(ReadDirRequest<'a>),
18}
19
20#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
21#[frame(error = UdsError)]
22pub struct AddFileRequest<'a> {
23 pub file_path_and_name_length: [u8; 2],
24 pub file_path_and_name: &'a [u8],
25 pub data_format_identifier: u8,
26 pub file_size_parameter_length: u8,
27 pub file_size_uncompressed: &'a [u8],
28 pub file_size_compressed: &'a [u8],
29}
30
31impl<'a> FrameRead<'a> for AddFileRequest<'a> {
32 type Error = UdsError;
33
34 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
35 let file_path_and_name_length = <[u8; 2]>::decode(buf)?;
36
37 let path_len = u16::from_be_bytes(file_path_and_name_length) as usize;
38 let file_path_and_name = take_n(buf, path_len)?;
39
40 let data_format_identifier = u8::decode(buf)?;
41 let file_size_parameter_length = u8::decode(buf)?;
42
43 let file_size_len = file_size_parameter_length as usize;
44 let file_size_uncompressed = take_n(buf, file_size_len)?;
45 let file_size_compressed = take_n(buf, file_size_len)?;
46
47 Ok(Self {
48 file_path_and_name_length,
49 file_path_and_name,
50 data_format_identifier,
51 file_size_parameter_length,
52 file_size_uncompressed,
53 file_size_compressed,
54 })
55 }
56}
57
58#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
59#[frame(error = UdsError)]
60pub struct DeleteFileRequest<'a> {
61 pub file_path_and_name_length: [u8; 2],
62 pub file_path_and_name: &'a [u8],
63}
64
65impl<'a> FrameRead<'a> for DeleteFileRequest<'a> {
66 type Error = UdsError;
67
68 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
69 let file_path_and_name_length = <[u8; 2]>::decode(buf)?;
70
71 let path_len = u16::from_be_bytes(file_path_and_name_length) as usize;
72 let file_path_and_name = take_n(buf, path_len)?;
73
74 Ok(Self {
75 file_path_and_name_length,
76 file_path_and_name,
77 })
78 }
79}
80
81#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
82#[frame(error = UdsError)]
83pub struct ReplaceFileRequest<'a> {
84 pub file_path_and_name_length: [u8; 2],
85 pub file_path_and_name: &'a [u8],
86 pub data_format_identifier: u8,
87 pub file_size_parameter_length: u8,
88 pub file_size_uncompressed: &'a [u8],
89 pub file_size_compressed: &'a [u8],
90}
91
92impl<'a> FrameRead<'a> for ReplaceFileRequest<'a> {
93 type Error = UdsError;
94
95 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
96 let file_path_and_name_length = <[u8; 2]>::decode(buf)?;
97
98 let path_len = u16::from_be_bytes(file_path_and_name_length) as usize;
99 let file_path_and_name = take_n(buf, path_len)?;
100
101 let data_format_identifier = u8::decode(buf)?;
102 let file_size_parameter_length = u8::decode(buf)?;
103
104 let file_size_len = file_size_parameter_length as usize;
105 let file_size_uncompressed = take_n(buf, file_size_len)?;
106 let file_size_compressed = take_n(buf, file_size_len)?;
107
108 Ok(Self {
109 file_path_and_name_length,
110 file_path_and_name,
111 data_format_identifier,
112 file_size_parameter_length,
113 file_size_uncompressed,
114 file_size_compressed,
115 })
116 }
117}
118
119#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
120#[frame(error = UdsError)]
121pub struct ReadFileRequest<'a> {
122 pub file_path_and_name_length: [u8; 2],
123 pub file_path_and_name: &'a [u8],
124 pub data_format_identifier: u8,
125}
126
127impl<'a> FrameRead<'a> for ReadFileRequest<'a> {
128 type Error = UdsError;
129
130 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
131 let file_path_and_name_length = <[u8; 2]>::decode(buf)?;
132
133 let path_len = u16::from_be_bytes(file_path_and_name_length) as usize;
134 let file_path_and_name = take_n(buf, path_len)?;
135
136 let data_format_identifier = u8::decode(buf)?;
137
138 Ok(Self {
139 file_path_and_name_length,
140 file_path_and_name,
141 data_format_identifier,
142 })
143 }
144}
145
146#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
147#[frame(error = UdsError)]
148pub struct ReadDirRequest<'a> {
149 pub file_path_and_name_length: [u8; 2],
150 pub file_path_and_name: &'a [u8],
151}
152
153impl<'a> FrameRead<'a> for ReadDirRequest<'a> {
154 type Error = UdsError;
155
156 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
157 let file_path_and_name_length = <[u8; 2]>::decode(buf)?;
158
159 let path_len = u16::from_be_bytes(file_path_and_name_length) as usize;
160 let file_path_and_name = take_n(buf, path_len)?;
161
162 Ok(Self {
163 file_path_and_name_length,
164 file_path_and_name,
165 })
166 }
167}
168
169#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
170#[frame(error = UdsError)]
171pub enum RequestFileTransferResponse<'a> {
172 #[frame(id = 0x01)]
173 AddFile(AddFileResponse<'a>),
174 #[frame(id = 0x02)]
175 DeleteFile(DeleteFileResponse),
176 #[frame(id = 0x03)]
177 ReplaceFile(ReplaceFileResponse<'a>),
178 #[frame(id = 0x04)]
179 ReadFile(ReadFileResponse<'a>),
180 #[frame(id = 0x05)]
181 ReadDir(ReadDirResponse<'a>),
182}
183
184#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
185#[frame(error = UdsError)]
186pub struct AddFileResponse<'a> {
187 pub length_format_identifier: u8,
188 pub max_number_of_block_length: &'a [u8],
189 pub data_format_identifier: u8,
190}
191
192impl<'a> FrameRead<'a> for AddFileResponse<'a> {
193 type Error = UdsError;
194
195 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
196 let length_format_identifier = u8::decode(buf)?;
197
198 let block_len = (length_format_identifier >> 4) as usize;
199 let max_number_of_block_length = take_n(buf, block_len)?;
200
201 let data_format_identifier = u8::decode(buf)?;
202
203 Ok(Self {
204 length_format_identifier,
205 max_number_of_block_length,
206 data_format_identifier,
207 })
208 }
209}
210#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
211#[frame(error = UdsError)]
212pub struct DeleteFileResponse {}
213
214#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
215#[frame(error = UdsError)]
216pub struct ReplaceFileResponse<'a> {
217 pub length_format_identifier: u8,
218 pub max_number_of_block_length: &'a [u8],
219 pub data_format_identifier: u8,
220}
221
222impl<'a> FrameRead<'a> for ReplaceFileResponse<'a> {
223 type Error = UdsError;
224
225 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
226 let length_format_identifier = u8::decode(buf)?;
227
228 let block_len = (length_format_identifier >> 4) as usize;
229 let max_number_of_block_length = take_n(buf, block_len)?;
230
231 let data_format_identifier = u8::decode(buf)?;
232
233 Ok(Self {
234 length_format_identifier,
235 max_number_of_block_length,
236 data_format_identifier,
237 })
238 }
239}
240
241#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
242#[frame(error = UdsError)]
243pub struct ReadFileResponse<'a> {
244 pub length_format_identifier: u8, pub max_number_of_block_length: &'a [u8], pub data_format_identifier: u8,
247 pub file_size_or_dir_info_parameter_length: [u8; 2],
248 pub file_size_uncompressed_or_dir_info_length: &'a [u8],
249 pub file_size_compressed: &'a [u8],
250}
251
252impl<'a> FrameRead<'a> for ReadFileResponse<'a> {
253 type Error = UdsError;
254
255 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
256 let length_format_identifier = u8::decode(buf)?; let block_len = (length_format_identifier >> 4) as usize; let max_number_of_block_length = take_n(buf, block_len)?; let data_format_identifier = u8::decode(buf)?;
260
261 let file_size_or_dir_info_parameter_length = <[u8; 2]>::decode(buf)?;
264 let info_len = u16::from_be_bytes(file_size_or_dir_info_parameter_length) as usize;
265
266 let file_size_uncompressed_or_dir_info_length = take_n(buf, info_len)?;
267 let file_size_compressed = take_n(buf, info_len)?;
268
269 Ok(Self {
270 length_format_identifier,
271 max_number_of_block_length,
272 data_format_identifier,
273 file_size_or_dir_info_parameter_length,
274 file_size_uncompressed_or_dir_info_length,
275 file_size_compressed,
276 })
277 }
278}
279
280#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameWrite)]
281#[frame(error = UdsError)]
282pub struct ReadDirResponse<'a> {
283 pub length_format_identifier: u8,
284 pub max_number_of_block_length: &'a [u8],
285 pub data_format_identifier: u8,
286 pub file_size_or_dir_info_parameter_length: [u8; 2],
287 pub file_size_uncompressed_or_dir_info_length: &'a [u8],
288}
289
290impl<'a> FrameRead<'a> for ReadDirResponse<'a> {
291 type Error = UdsError;
292
293 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
294 let length_format_identifier = u8::decode(buf)?;
295 let block_len = (length_format_identifier >> 4) as usize;
296 let max_number_of_block_length = take_n(buf, block_len)?;
297 let data_format_identifier = u8::decode(buf)?;
298
299 let file_size_or_dir_info_parameter_length = <[u8; 2]>::decode(buf)?;
300 let info_len = u16::from_be_bytes(file_size_or_dir_info_parameter_length) as usize;
301
302 let file_size_uncompressed_or_dir_info_length = take_n(buf, info_len)?;
303
304 Ok(Self {
305 length_format_identifier,
306 max_number_of_block_length,
307 data_format_identifier,
308 file_size_or_dir_info_parameter_length,
309 file_size_uncompressed_or_dir_info_length,
310 })
311 }
312}
313
314#[repr(u8)]
315#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
316#[frame(error = UdsError)]
317pub enum ModeOfOperation {
318 #[frame(id = 0x01)]
319 AddFile,
320 #[frame(id = 0x02)]
321 DeleteFile,
322 #[frame(id = 0x03)]
323 ReplaceFile,
324 #[frame(id = 0x04)]
325 ReadFile,
326 #[frame(id = 0x05)]
327 ReadDir,
328}