Skip to main content

ace_uds/message/services/
read_dtc_information.rs

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, //TODO: Check if parameterised into enum
213}
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}