Skip to main content

ace_uds/message/services/
request_file_transfer.rs

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,         // TODO: Evaluate this
245    pub max_number_of_block_length: &'a [u8], // TODO: Evaluate this
246    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)?; // TODO: Evaluate this
257        let block_len = (length_format_identifier >> 4) as usize; // TODO: Evaluate this
258        let max_number_of_block_length = take_n(buf, block_len)?; // TODO: Evaluate this
259        let data_format_identifier = u8::decode(buf)?;
260
261        // file_size_or_dir_info_parameter_length is a [u8; 2] big-endian length
262        // whose value gives the byte length of each of the two following fields
263        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}