1use crate::{message::FunctionalGroup, UdsError};
2use ace_core::{DiagError, FrameIter};
3use ace_macros::FrameCodec;
4
5#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
6#[frame(error = UdsError)]
7pub enum ReadDtcInformationRequest {
8 #[frame(id_pat = "0x00 | 0x1B..=0x41 | 0x43..=0x54 | 0x57..=0x7F")]
9 IsoSaeReserved(u8),
10 #[frame(id = 0x01)]
11 ReportNumberOfDtcByStatusMaskRequest(ReportNumberOfDtcByStatusMaskRequest),
12 #[frame(id = 0x02)]
13 ReportDtcByStatusMaskRequest(ReportDtcByStatusMaskRequest),
14 #[frame(id = 0x03)]
15 ReportDtcSnapshotIdentificationRequest(ReportDtcSnapshotIdentificationRequest),
16 #[frame(id = 0x04)]
17 ReportDtcSnapshotRecordByDtcNumberRequest(ReportDtcSnapshotRecordByDtcNumberRequest),
18 #[frame(id = 0x05)]
19 ReportDtcStoredDataByRecordNumberRequest(ReportDtcStoredDataByRecordNumberRequest),
20 #[frame(id = 0x06)]
21 ReportDTCExtDataRecordByDTCNumberRequest(ReportDTCExtDataRecordByDTCNumberRequest),
22 #[frame(id = 0x07)]
23 ReportNumberOfDTCBySeverityMaskRecordRequest(ReportNumberOfDTCBySeverityMaskRecordRequest),
24 #[frame(id = 0x08)]
25 ReportDTCSeverityInformationRequest(ReportDTCSeverityInformationRequest),
26 #[frame(id = 0x09)]
27 ReportSeverityInformationOfDTCRequest(ReportSeverityInformationOfDTCRequest),
28 #[frame(id = 0x0A)]
29 ReportSupportedDTCRequest(ReportSupportedDTCRequest),
30 #[frame(id = 0x0B)]
31 ReportFirstTestFailedDTCRequest(ReportFirstTestFailedDTCRequest),
32 #[frame(id = 0x0C)]
33 ReportFirstConfirmedDTCRequest(ReportFirstConfirmedDTCRequest),
34 #[frame(id = 0x0D)]
35 ReportMostRecentTestFailedDTCRequest(ReportMostRecentTestFailedDTCRequest),
36 #[frame(id = 0x0E)]
37 ReportMostRecentConfirmedDTCRequest(ReportMostRecentConfirmedDTCRequest),
38 #[frame(id = 0x14)]
39 ReportDTCFaultDetectionCounterRequest(ReportDTCFaultDetectionCounterRequest),
40 #[frame(id = 0x15)]
41 ReportDTCWithPermanentStatusRequest(ReportDTCWithPermanentStatusRequest),
42 #[frame(id = 0x16)]
43 ReportDTCExtDataRecordByRecordNumberRequest(ReportDTCExtDataRecordByRecordNumberRequest),
44 #[frame(id = 0x17)]
45 ReportUserDefMemoryDTCByStatusMaskRequest(ReportUserDefMemoryDTCByStatusMaskRequest),
46 #[frame(id = 0x18)]
47 ReportUserDefMemoryDTCSnapshotRecordByDTCNumberRequest(
48 ReportUserDefMemoryDTCSnapshotRecordByDTCNumberRequest,
49 ),
50 #[frame(id = 0x19)]
51 ReportUserDefMemoryDTCExtDataRecordByDTCNumberRequest(
52 ReportUserDefMemoryDTCExtDataRecordByDTCNumberRequest,
53 ),
54 #[frame(id = 0x1A)]
55 ReportSupportedDTCExtDataRecordRequest(ReportSupportedDTCExtDataRecordRequest),
56 #[frame(id = 0x42)]
57 ReportWWHOBDDTCByMaskRecordRequest(ReportWWHOBDDTCByMaskRecordRequest),
58 #[frame(id = 0x55)]
59 ReportWWHOBDDTCWithPermanentStatusRequest(ReportWWHOBDDTCWithPermanentStatusRequest),
60 #[frame(id = 0x56)]
61 ReportDTCInformationByDTCReadinessGroupIdentifierRequest(
62 ReportDTCInformationByDTCReadinessGroupIdentifierRequest,
63 ),
64}
65
66#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
67pub struct DtcStatusMask {
68 pub test_failed: bool,
69 pub test_failed_this_operational_cycle: bool,
70 pub pending_dtc: bool,
71 pub confirmed_dtc: bool,
72 pub test_not_completed_since_last_clear: bool,
73 pub test_failed_since_last_clear: bool,
74 pub test_not_completed_this_operation_cycle: bool,
75 pub warning_indicator_requested: bool,
76}
77
78#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
79#[frame(error = UdsError)]
80pub struct ReportNumberOfDtcByStatusMaskRequest {
81 pub dtc_status_mask: DtcStatusMask,
82}
83
84#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
85#[frame(error = UdsError)]
86pub struct ReportDtcByStatusMaskRequest {
87 pub dtc_status_mask: DtcStatusMask,
88}
89
90#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
91#[frame(error = UdsError)]
92pub struct ReportDtcSnapshotIdentificationRequest {}
93
94#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
95#[frame(error = UdsError)]
96pub struct ReportDtcSnapshotRecordByDtcNumberRequest {
97 pub dtc_mask_record: [u8; 3],
98 pub dtc_snapshot_record_number: DtcSnapshotRecordNumber,
99}
100
101#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
102#[frame(error = UdsError)]
103pub struct ReportDtcStoredDataByRecordNumberRequest {
104 pub dtc_stored_data_record_number: DtcStoredDataRecordNumber,
105}
106
107#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
108#[frame(error = UdsError)]
109pub struct ReportDTCExtDataRecordByDTCNumberRequest {
110 pub dtc_mask_record: [u8; 3],
111 pub dtc_ext_data_record_number: DtcExtendedDataRecordNumber,
112}
113
114#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
115#[frame(error = UdsError)]
116pub struct ReportNumberOfDTCBySeverityMaskRecordRequest {
117 pub dtc_severity_mask_record: [u8; 2],
118}
119
120#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
121#[frame(error = UdsError)]
122pub struct ReportDTCSeverityInformationRequest {
123 pub dtc_severity_mask_record: [u8; 2],
124}
125
126#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
127#[frame(error = UdsError)]
128pub struct ReportSeverityInformationOfDTCRequest {
129 pub dtc_mask_record: [u8; 3],
130}
131
132#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
133#[frame(error = UdsError)]
134pub struct ReportSupportedDTCRequest {}
135
136#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
137#[frame(error = UdsError)]
138pub struct ReportFirstTestFailedDTCRequest {}
139
140#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
141#[frame(error = UdsError)]
142pub struct ReportFirstConfirmedDTCRequest {}
143
144#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
145#[frame(error = UdsError)]
146pub struct ReportMostRecentTestFailedDTCRequest {}
147
148#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
149#[frame(error = UdsError)]
150pub struct ReportMostRecentConfirmedDTCRequest {}
151
152#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
153#[frame(error = UdsError)]
154pub struct ReportDTCFaultDetectionCounterRequest {}
155
156#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
157#[frame(error = UdsError)]
158pub struct ReportDTCWithPermanentStatusRequest {}
159
160#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
161#[frame(error = UdsError)]
162pub struct ReportDTCExtDataRecordByRecordNumberRequest {
163 pub dtc_ext_data_record_number: DtcExtendedDataRecordNumber,
164}
165
166#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
167#[frame(error = UdsError)]
168pub struct ReportUserDefMemoryDTCByStatusMaskRequest {
169 pub dtc_status_mask: DtcStatusMask,
170 pub memory_selection: u8,
171}
172
173#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
174#[frame(error = UdsError)]
175pub struct ReportUserDefMemoryDTCSnapshotRecordByDTCNumberRequest {
176 pub dtc_mask_record: [u8; 3],
177 pub user_def_dtc_snapshot_record_number: DtcSnapshotRecordNumber,
178 pub memory_selection: u8,
179}
180
181#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
182#[frame(error = UdsError)]
183pub struct ReportUserDefMemoryDTCExtDataRecordByDTCNumberRequest {
184 pub dtc_mask_record: [u8; 3],
185 pub user_def_dtc_ext_data_record_number: DtcExtendedDataRecordNumber,
186 pub memory_selection: u8,
187}
188
189#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
190#[frame(error = UdsError)]
191pub struct ReportSupportedDTCExtDataRecordRequest {
192 pub dtc_ext_data_record_number: DtcExtendedDataRecordNumber,
193}
194
195#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
196#[frame(error = UdsError)]
197pub struct ReportWWHOBDDTCByMaskRecordRequest {
198 pub functional_group_identifier: FunctionalGroup,
199 pub dtc_severity_mask_record: [u8; 2],
200}
201
202#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
203#[frame(error = UdsError)]
204pub struct ReportWWHOBDDTCWithPermanentStatusRequest {
205 pub functional_group_identifier: FunctionalGroup,
206}
207
208#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
209#[frame(error = UdsError)]
210pub struct ReportDTCInformationByDTCReadinessGroupIdentifierRequest {
211 pub functional_group_identifier: FunctionalGroup,
212 pub dtc_readiness_group_identifier: u8, }
214
215#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
216#[frame(error = UdsError)]
217pub enum ReportType {
218 #[frame(id_pat = "0x00 | 0x1B..=0x41 | 0x43..=0x54 | 0x57..=0x7F")]
219 IsoSaeReserved(u8),
220 #[frame(id = 0x01)]
221 ReportNumberOfDTCByStatusMask,
222 #[frame(id = 0x02)]
223 ReportDTCByStatusMask,
224 #[frame(id = 0x03)]
225 ReportDTCSnapshotIdentification,
226 #[frame(id = 0x04)]
227 ReportDTCSnapshotRecordByDTCNumber,
228 #[frame(id = 0x05)]
229 ReportDTCStoredDataByRecordNumber,
230 #[frame(id = 0x06)]
231 ReportDTCExtDataRecordByDTCNumber,
232 #[frame(id = 0x07)]
233 ReportNumberOfDTCBySeverityMaskRecord,
234 #[frame(id = 0x08)]
235 ReportDTCBySeverityMaskRecord,
236 #[frame(id = 0x09)]
237 ReportSeverityInformationOfDTC,
238 #[frame(id = 0x0A)]
239 ReportSupportedDTC,
240 #[frame(id = 0x0B)]
241 ReportFirstTestFailedDTC,
242 #[frame(id = 0x0C)]
243 ReportFirstConfirmedDTC,
244 #[frame(id = 0x0D)]
245 ReportMostRecentTestFailedDTC,
246 #[frame(id = 0x0E)]
247 ReportMostRecentConfirmedDTC,
248 #[frame(id = 0x14)]
249 ReportDTCFaultDetectionCounter,
250 #[frame(id = 0x15)]
251 ReportDTCWithPermanentStatus,
252 #[frame(id = 0x16)]
253 ReportDTCExtDataRecordByRecordNumber,
254 #[frame(id = 0x17)]
255 ReportUserDefMemoryDTCByStatusMask,
256 #[frame(id = 0x18)]
257 ReportUserDefMemoryDTCSnapshotRecordByDTCNumber,
258 #[frame(id = 0x19)]
259 ReportUserDefMemoryDTCExtDataRecordByDTCNumber,
260 #[frame(id = 0x1A)]
261 ReportSupportedDTCExtDataRecordRequest,
262 #[frame(id = 0x42)]
263 ReportWWHOBDDTCByMaskRecord,
264 #[frame(id = 0x55)]
265 ReportWWHOBDDTCWithPermanentStatus,
266}
267
268#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
269#[frame(error = UdsError)]
270pub enum ReadDTCInformationResponse<'a> {
271 #[frame(id = 0x01)]
272 ReportNumberOfDTCByStatusMaskResponse(ReportNumberOfDTCByStatusMaskResponse),
273 #[frame(id = 0x02)]
274 ReportDTCByStatusMaskResponse(ReportDTCByStatusMaskResponse<'a>),
275 #[frame(id = 0x03)]
276 ReportSnapshotIdentificationResponse(ReportSnapshotIdentificationResponse<'a>),
277 #[frame(id = 0x04)]
278 ReportDTCSnapshotRecordByDTCNumberResponse(ReportDTCSnapshotRecordByDTCNumberResponse<'a>),
279 #[frame(id = 0x05)]
280 ReportDTCStoredDataByRecordNumberResponse(ReportDTCStoredDataByRecordNumberResponse<'a>),
281 #[frame(id = 0x06)]
282 ReportDTCExtDataRecordByDTCNumberResponse(ReportDTCExtDataRecordByDTCNumberResponse<'a>),
283 #[frame(id = 0x07)]
284 ReportNumberOfDTCBySeverityMaskRecordResponse(ReportNumberOfDTCBySeverityMaskRecordResponse),
285 #[frame(id = 0x08)]
286 ReportDTCBySeverityMaskRecordResponse(ReportDTCBySeverityMaskRecordResponse<'a>),
287 #[frame(id = 0x09)]
288 ReportSeverityInformationOfDTCResponse(ReportSeverityInformationOfDTCResponse<'a>),
289 #[frame(id = 0x0A)]
290 ReportSupportedDTCsResponse(ReportSupportedDTCsResponse<'a>),
291 #[frame(id = 0x0B)]
292 ReportFirstTestFailedDTCResponse(ReportFirstTestFailedDTCResponse<'a>),
293 #[frame(id = 0x0C)]
294 ReportFirstConfirmedDTCResponse(ReportFirstConfirmedDTCResponse<'a>),
295 #[frame(id = 0x0D)]
296 ReportMostRecentTestFailedDTCResponse(ReportMostRecentTestFailedDTCResponse<'a>),
297 #[frame(id = 0x0E)]
298 ReportMostRecentConfirmedDTCResponse(ReportMostRecentConfirmedDTCResponse<'a>),
299 #[frame(id = 0x14)]
300 ReportDTCFaultDetectionCounterResponse(ReportDTCFaultDetectionCounterResponse<'a>),
301 #[frame(id = 0x15)]
302 ReportDTCWithPermanentStatusResponse(ReportDTCWithPermanentStatusResponse<'a>),
303 #[frame(id = 0x16)]
304 ReportDTCExtDataRecordByRecordNumberResponse(ReportDTCExtDataRecordByRecordNumberResponse<'a>),
305 #[frame(id = 0x17)]
306 ReportUserDefMemoryDTCByStatusMaskResponse(ReportUserDefMemoryDTCByStatusMaskResponse<'a>),
307 #[frame(id = 0x18)]
308 ReportUserDefMemoryDTCSnapshotRecordByDTCNumberResponse(
309 ReportUserDefMemoryDTCSnapshotRecordByDTCNumberResponse<'a>,
310 ),
311 #[frame(id = 0x19)]
312 ReportUserDefMemoryDTCExtDataRecordByDTCNumberResponse(
313 ReportUserDefMemoryDTCExtDataRecordByDTCNumberResponse<'a>,
314 ),
315 #[frame(id = 0x1A)]
316 ReportSupportedDTCExtDataRecordResponse(ReportSupportedDTCExtDataRecordResponse<'a>),
317 #[frame(id = 0x42)]
318 ReportWWHOBDDTCByMaskRecordResponse(ReportWWHOBDDTCByMaskRecordResponse<'a>),
319 #[frame(id = 0x55)]
320 ReportWWHOBDDTCWithPermanentStatusResponse(ReportWWHOBDDTCWithPermanentStatusResponse<'a>),
321 #[frame(id = 0x56)]
322 ReportDTCInformationByReadinessGroupIdentifierResponse(
323 ReportDTCInformationByReadinessGroupIdentifierResponse<'a>,
324 ),
325}
326
327#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
328#[frame(error = UdsError)]
329pub struct ReportNumberOfDTCByStatusMaskResponse {
330 pub dtc_status_availability_mask: u8,
331 pub dtc_format_identifier: u8,
332}
333
334#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
335#[frame(error = UdsError)]
336pub struct ReportNumberOfDTCBySeverityMaskRecordResponse {
337 pub dtc_status_availability_mask: u8,
338 pub dtc_format_identifier: u8,
339 pub dtc_count: [u8; 2],
340}
341
342#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
343#[frame(error = UdsError)]
344pub struct ReportDTCByStatusMaskResponse<'a> {
345 pub dtc_status_availability_mask: u8,
346 pub dtc_and_status_record: &'a [u8],
347}
348
349#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
350#[frame(error = UdsError)]
351pub struct ReportSupportedDTCsResponse<'a> {
352 pub dtc_status_availability_mask: u8,
353 pub dtc_and_status_record: &'a [u8],
354}
355
356#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
357#[frame(error = UdsError)]
358pub struct ReportFirstTestFailedDTCResponse<'a> {
359 pub dtc_status_availability_mask: u8,
360 pub dtc_and_status_record: &'a [u8],
361}
362
363#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
364#[frame(error = UdsError)]
365pub struct ReportFirstConfirmedDTCResponse<'a> {
366 pub dtc_status_availability_mask: u8,
367 pub dtc_and_status_record: &'a [u8],
368}
369
370#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
371#[frame(error = UdsError)]
372pub struct ReportMostRecentTestFailedDTCResponse<'a> {
373 pub dtc_status_availability_mask: u8,
374 pub dtc_and_status_record: &'a [u8],
375}
376
377#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
378#[frame(error = UdsError)]
379pub struct ReportMostRecentConfirmedDTCResponse<'a> {
380 pub dtc_status_availability_mask: u8,
381 pub dtc_and_status_record: &'a [u8],
382}
383
384#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
385#[frame(error = UdsError)]
386pub struct ReportDTCWithPermanentStatusResponse<'a> {
387 pub dtc_status_availability_mask: u8,
388 pub dtc_and_status_record: &'a [u8],
389}
390
391#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
392#[frame(error = UdsError)]
393pub struct ReportSnapshotIdentificationResponse<'a> {
394 pub dtc_records: FrameIter<'a, DTCRecord>,
395}
396
397#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
398#[frame(error = UdsError)]
399pub struct DTCRecord {
400 pub dtc_record: [u8; 3],
401 pub dtc_snapshot_record_number: DtcSnapshotRecordNumber,
402}
403
404#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
405#[frame(error = UdsError)]
406pub struct ReportDTCSnapshotRecordByDTCNumberResponse<'a> {
407 pub dtc_and_status_record: [u8; 4],
408 pub dtc_snapshot_records: FrameIter<'a, DTCSnapshotRecord<'a>>,
409}
410
411#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
412#[frame(error = UdsError)]
413pub struct DTCSnapshotRecord<'a> {
414 pub dtc_snapshot_record_number: DtcSnapshotRecordNumber,
415 pub dtc_snapshot_record_number_of_identifiers: u8,
416 pub dtc_snapshot_record: &'a [u8],
417}
418
419#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
420#[frame(error = UdsError)]
421pub struct ReportDTCStoredDataByRecordNumberResponse<'a> {
422 pub dtc_stored_data_records: FrameIter<'a, DTCStoredDataRecord<'a>>,
423}
424
425#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
426#[frame(error = UdsError)]
427pub struct DTCStoredDataRecord<'a> {
428 pub dtc_stored_data_record_number: DtcStoredDataRecordNumber,
429 pub dtc_and_status_record: [u8; 4],
430 pub dtc_stored_data_record_number_of_identifiers: u8,
431 pub dtc_stored_data_record: &'a [u8],
432}
433
434#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
435#[frame(error = UdsError)]
436pub struct ReportDTCExtDataRecordByDTCNumberResponse<'a> {
437 pub dtc_and_status_record: [u8; 4],
438 pub dtc_ext_data_records: FrameIter<'a, DTCExtDataRecord<'a>>,
439}
440
441#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
442#[frame(error = UdsError)]
443pub struct DTCExtDataRecord<'a> {
444 pub dtc_ext_data_record_number: DtcExtendedDataRecordNumber,
445 pub dtc_ext_data_record: &'a [u8],
446}
447
448#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
449#[frame(error = UdsError)]
450pub struct ReportDTCBySeverityMaskRecordResponse<'a> {
451 pub dtc_status_availability_mask: u8,
452 pub dtc_and_severity_record: &'a [u8],
453}
454
455#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
456#[frame(error = UdsError)]
457pub struct ReportSeverityInformationOfDTCResponse<'a> {
458 pub dtc_status_availability_mask: u8,
459 pub dtc_and_severity_record: &'a [u8],
460}
461
462#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
463#[frame(error = UdsError)]
464pub struct ReportDTCFaultDetectionCounterResponse<'a> {
465 pub dtc_fault_detection_counter_record: &'a [u8],
466}
467
468#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
469#[frame(error = UdsError)]
470pub struct ReportDTCExtDataRecordByRecordNumberResponse<'a> {
471 pub dtc_ext_data_record_number: DtcExtendedDataRecordNumber,
472 pub dtc_and_status_records: FrameIter<'a, ExtDTCAndStatusRecord<'a>>,
473}
474
475#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
476#[frame(error = UdsError)]
477pub struct ExtDTCAndStatusRecord<'a> {
478 pub dtc_and_status_record: [u8; 4],
479 pub dtc_ext_data_record: &'a [u8],
480}
481
482#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
483#[frame(error = UdsError)]
484pub struct ReportUserDefMemoryDTCByStatusMaskResponse<'a> {
485 pub memory_selection: u8,
486 pub dtc_status_availability_mask: u8,
487 pub dtc_and_status_record: &'a [u8],
488}
489
490#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
491#[frame(error = UdsError)]
492pub struct ReportUserDefMemoryDTCSnapshotRecordByDTCNumberResponse<'a> {
493 pub memory_selection: u8,
494 pub dtc_and_status_record: [u8; 4],
495 pub user_def_dtc_snapshot_records: FrameIter<'a, UserDefDTCSnapshotRecord<'a>>,
496}
497
498#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
499#[frame(error = UdsError)]
500pub struct UserDefDTCSnapshotRecord<'a> {
501 pub user_def_dtc_snapshot_record_number: DtcSnapshotRecordNumber,
502 pub dtc_snapshot_record_number_of_identifiers: u8,
503 pub user_def_dtc_snapshot_record: &'a [u8],
504}
505
506#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
507#[frame(error = UdsError)]
508pub struct ReportUserDefMemoryDTCExtDataRecordByDTCNumberResponse<'a> {
509 pub memory_selection: u8,
510 pub dtc_and_status_record: [u8; 4],
511 pub dtc_ext_data_record: FrameIter<'a, DTCExtDataRecord<'a>>,
512}
513
514#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
515#[frame(error = UdsError)]
516pub struct ReportSupportedDTCExtDataRecordResponse<'a> {
517 pub memory_selection: u8,
518 pub dtc_ext_data_record_number: Option<u8>,
519 pub dtc_ext_data_records: FrameIter<'a, DTCAndStatusRecord>,
520}
521
522#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
523#[frame(error = UdsError)]
524pub struct DTCAndStatusRecord {
525 pub dtc_and_status_record: [u8; 4],
526}
527
528#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
529#[frame(error = UdsError)]
530pub struct ReportWWHOBDDTCByMaskRecordResponse<'a> {
531 pub functional_group_identifier: FunctionalGroup,
532 pub dtc_status_availability_mask: u8,
533 pub dtc_severity_availability_mask: u8,
534 pub dtc_format_identifier: u8,
535 pub dtc_and_severity_record: &'a [u8],
536}
537
538#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
539#[frame(error = UdsError)]
540pub struct ReportWWHOBDDTCWithPermanentStatusResponse<'a> {
541 pub functional_group_identifier: FunctionalGroup,
542 pub dtc_status_availability_mask: u8,
543 pub dtc_format_identifier: u8,
544 pub dtc_record: &'a [u8],
545}
546
547#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
548#[frame(error = UdsError)]
549pub struct ReportDTCInformationByReadinessGroupIdentifierResponse<'a> {
550 pub functional_group_identifier: FunctionalGroup,
551 pub dtc_status_availability_mask: u8,
552 pub dtc_format_identifier: u8,
553 pub dtc_readiness_group_identifier: u8,
554 pub dtc_and_status_record: &'a [u8],
555}
556
557impl<'a> ace_core::codec::FrameRead<'a> for DtcStatusMask {
558 type Error = UdsError;
559 fn decode(buf: &mut &'a [u8]) -> Result<Self, Self::Error> {
560 let byte = *buf
561 .first()
562 .ok_or(UdsError::from(DiagError::LengthMismatch {
563 expected: 1,
564 actual: 0,
565 }))?;
566 *buf = &buf[1..];
567
568 Ok(Self {
569 test_failed: byte & 0x01 != 0,
570 test_failed_this_operational_cycle: byte & 0x02 != 0,
571 pending_dtc: byte & 0x04 != 0,
572 confirmed_dtc: byte & 0x08 != 0,
573 test_not_completed_since_last_clear: byte & 0x10 != 0,
574 test_failed_since_last_clear: byte & 0x20 != 0,
575 test_not_completed_this_operation_cycle: byte & 0x40 != 0,
576 warning_indicator_requested: byte & 0x80 != 0,
577 })
578 }
579}
580
581impl ace_core::codec::FrameWrite for DtcStatusMask {
582 type Error = UdsError;
583 fn encode<W: ace_core::codec::Writer>(&self, buf: &mut W) -> Result<(), Self::Error> {
584 let byte = (self.test_failed as u8)
585 | ((self.test_failed_this_operational_cycle as u8) << 1)
586 | ((self.pending_dtc as u8) << 2)
587 | ((self.confirmed_dtc as u8) << 3)
588 | ((self.test_not_completed_since_last_clear as u8) << 4)
589 | ((self.test_failed_since_last_clear as u8) << 5)
590 | ((self.test_not_completed_this_operation_cycle as u8) << 6)
591 | ((self.warning_indicator_requested as u8) << 7);
592
593 buf.write_bytes(&[byte]).map_err(|e| UdsError::from(e))
594 }
595}
596
597#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
598#[frame(error = UdsError)]
599pub enum DtcSnapshotRecordNumber {
600 #[frame(id_pat = "0x00 | 0xF0")]
601 ReservedForLegislation(u8),
602 #[frame(id_pat = "0x01..=0xEF | 0xF0..=0xFE")]
603 VehicleManufacturerSpecific(u8),
604 #[frame(id = 0xFF)]
605 AllDtcSnapshotRecords,
606}
607
608#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
609#[frame(error = UdsError)]
610pub enum UserDefDtcSnapshotRecordNumber {
611 #[frame(id_pat = "0x00..=0xFE")]
612 VehicleManufacturerSpecific(u8),
613 #[frame(id = 0xFF)]
614 AllUserDefDtcSnapshotRecords,
615}
616
617#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
618#[frame(error = UdsError)]
619pub enum DtcStoredDataRecordNumber {
620 #[frame(id = 0x00)]
621 ReservedForLegislation,
622 #[frame(id_pat = "0x01..=0xFE")]
623 VehicleManufacturerSpecific(u8),
624 #[frame(id = 0xFF)]
625 AllDtcStoredDataRecords,
626}
627
628#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
629#[frame(error = UdsError)]
630pub enum DtcExtendedDataRecordNumber {
631 #[frame(id_pat = "0x00 | 0xF0..=0xFD")]
632 IsoSaeReserved(u8),
633 #[frame(id_pat = "0x01..=0x8F")]
634 VehicleManufacturerSpecific(u8),
635 #[frame(id_pat = "0x90..=0x9F")]
636 RegulatedEmissionsObdDtcExtDataRecords(u8),
637 #[frame(id_pat = "0xA0..=0xEF")]
638 RegulatedDtcExtDataREcord(u8),
639 #[frame(id = 0xFE)]
640 AllRegulatedEmissionsObdDtcExtDataRecords,
641 #[frame(id = 0xFF)]
642 AllDtcExtDataRecords,
643}
644
645#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
646#[frame(error = UdsError)]
647pub enum UserDefDtcExtendedDataRecordNumber {
648 #[frame(id_pat = "0x00")]
649 IsoSaeReserved(u8),
650 #[frame(id_pat = "0x01..=0xFE")]
651 VehicleManufacturerSpecific(u8),
652 #[frame(id = 0xFF)]
653 AllUserDefDtcExtDataRecords,
654}