Skip to main content

ace_uds/message/
service.rs

1use crate::UdsError;
2use ace_macros::FrameCodec;
3
4#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
5#[frame(error = "UdsError")]
6#[repr(u8)]
7pub enum ServiceIdentifier {
8    #[frame(
9        id_pat = "0x00 | 0x3F | 0x40 | 0x80..=0x83 | 0x89..=0xB9 | 0xBF..=0xC2 | 0xC9..=0xF9 | 0xFF"
10    )]
11    NotApplicable(u8),
12
13    #[frame(id_pat = "0x01..=0x0F")]
14    EmissionsSpecificServiceRequest(u8),
15
16    #[frame(id_pat = "0x10..=0x3E", decode_inner)]
17    UdsServiceRequest(UdsService),
18
19    #[frame(id_pat = "0x41..=0x4F")]
20    EmissionsSpecificServicePositiveResponse(u8),
21
22    #[frame(id_pat = "0x50..=0x7E")]
23    UdsServicePositiveResponse(u8),
24
25    #[frame(id = "0x7F")]
26    NegativeResponse,
27
28    #[frame(id_pat = "0x84..=0x88")]
29    ServiceRequests(u8),
30
31    #[frame(id_pat = "0xBA..=0xBE")]
32    SystemSupplierServiceRequests(u8),
33
34    #[frame(id_pat = "0xC3..=0xC8")]
35    ServiceRequestsPositiveResponse(u8),
36
37    #[frame(id_pat = "0xFA..=0xFE")]
38    SystemSupplierServiceRequestsPositiveResponse(u8),
39}
40
41#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, FrameCodec)]
42#[frame(error = "UdsError")]
43#[repr(u8)]
44pub enum UdsService {
45    #[frame(id = 0x10)]
46    DiagnosticSessionControlRequest = 0x10,
47    #[frame(id = 0x50)]
48    DiagnosticSessionControlResponse = 0x50,
49    #[frame(id = 0x11)]
50    ECUResetRequest = 0x11,
51    #[frame(id = 0x51)]
52    ECUResetResponse = 0x51,
53    #[frame(id = 0x27)]
54    SecurityAccessRequest = 0x27,
55    #[frame(id = 0x67)]
56    SecurityAccessResponse = 0x67,
57    #[frame(id = 0x28)]
58    CommunicationControlRequest = 0x28,
59    #[frame(id = 0x68)]
60    CommunicationControlResponse = 0x68,
61    #[frame(id = 0x29)]
62    AuthenticationRequest = 0x29,
63    #[frame(id = 0x69)]
64    AuthenticationResponse = 0x69,
65    #[frame(id = 0x3e)]
66    TesterPresentRequest = 0x3e,
67    #[frame(id = 0x7e)]
68    TesterPresentResponse = 0x7e,
69    #[frame(id = 0x85)]
70    ControlDTCSettingRequest = 0x85,
71    #[frame(id = 0xc5)]
72    ControlDTCSettingResponse = 0xc5,
73    #[frame(id = 0x86)]
74    ResponseOnEventRequest = 0x86,
75    #[frame(id = 0xc6)]
76    ResponseOnEventResponse = 0xc6,
77    #[frame(id = 0x87)]
78    LinkControlRequest = 0x87,
79    #[frame(id = 0xc7)]
80    LinkControlResponse = 0xc7,
81    #[frame(id = 0x22)]
82    ReadDataByIdentifierRequest = 0x22,
83    #[frame(id = 0x62)]
84    ReadDataByIdentifierResponse = 0x62,
85    #[frame(id = 0x23)]
86    ReadMemoryByAddressRequest = 0x23,
87    #[frame(id = 0x63)]
88    ReadMemoryByAddressResponse = 0x63,
89    #[frame(id = 0x24)]
90    ReadScalingDataByIdentifierRequest = 0x24,
91    #[frame(id = 0x64)]
92    ReadScalingDataByIdentifierResponse = 0x64,
93    #[frame(id = 0x2a)]
94    ReadDataByPeriodicIdentifierRequest = 0x2a,
95    #[frame(id = 0x6a)]
96    ReadDataByPeriodicIdentifierResponse = 0x6a,
97    #[frame(id = 0x2c)]
98    DynamicallyDefineDataIdentifierRequest = 0x2c,
99    #[frame(id = 0x6c)]
100    DynamicallyDefineDataIdentifierResponse = 0x6c,
101    #[frame(id = 0x2e)]
102    WriteDataByIdentifierRequest = 0x2e,
103    #[frame(id = 0x6e)]
104    WriteDataByIdentifierResponse = 0x6e,
105    #[frame(id = 0x3d)]
106    WriteMemoryByAddressRequest = 0x3d,
107    #[frame(id = 0x7d)]
108    WriteMemoryByAddressResponse = 0x7d,
109    #[frame(id = 0x14)]
110    ClearDiagnosticInformationRequest = 0x14,
111    #[frame(id = 0x54)]
112    ClearDiagnosticInformationResponse = 0x54,
113    #[frame(id = 0x19)]
114    ReadDTCInformationRequest = 0x19,
115    #[frame(id = 0x59)]
116    ReadDTCInformationResponse = 0x59,
117    #[frame(id = 0x2f)]
118    InputOutputControlByIdentifierRequest = 0x2f,
119    #[frame(id = 0x6f)]
120    InputOutputControlByIdentifierResponse = 0x6f,
121    #[frame(id = 0x31)]
122    RoutineControlRequest = 0x31,
123    #[frame(id = 0x71)]
124    RoutineControlResponse = 0x71,
125    #[frame(id = 0x34)]
126    RequestDownloadRequest = 0x34,
127    #[frame(id = 0x74)]
128    RequestDownloadResponse = 0x74,
129    #[frame(id = 0x35)]
130    RequestUploadRequest = 0x35,
131    #[frame(id = 0x75)]
132    RequestUploadResponse = 0x75,
133    #[frame(id = 0x36)]
134    TransferDataRequest = 0x36,
135    #[frame(id = 0x76)]
136    TransferDataResponse = 0x76,
137    #[frame(id = 0x37)]
138    RequestTransferExitRequest = 0x37,
139    #[frame(id = 0x77)]
140    RequestTransferExitResponse = 0x77,
141    #[frame(id = 0x38)]
142    RequestFileTransferRequest = 0x38,
143    #[frame(id = 0x78)]
144    RequestFileTransferResponse = 0x78,
145    #[frame(id = 0x84)]
146    SecuredDataTransmissionRequest = 0x84,
147    #[frame(id = 0xc4)]
148    SecuredDataTransmissionResponse = 0xc4,
149    #[frame(id = 0x7f)]
150    NegativeResponse = 0x7f,
151}
152
153impl ServiceIdentifier {
154    pub fn discriminant(&self) -> u8 {
155        match self {
156            ServiceIdentifier::UdsServiceRequest(s) => *s as u8,
157            ServiceIdentifier::NegativeResponse => 0x7F,
158            ServiceIdentifier::NotApplicable(v)
159            | ServiceIdentifier::EmissionsSpecificServiceRequest(v)
160            | ServiceIdentifier::EmissionsSpecificServicePositiveResponse(v)
161            | ServiceIdentifier::UdsServicePositiveResponse(v)
162            | ServiceIdentifier::ServiceRequests(v)
163            | ServiceIdentifier::SystemSupplierServiceRequests(v)
164            | ServiceIdentifier::ServiceRequestsPositiveResponse(v)
165            | ServiceIdentifier::SystemSupplierServiceRequestsPositiveResponse(v) => *v,
166        }
167    }
168    /// Returns `true` if this service defines a sub-function byte at offset 1.
169    ///
170    /// Per ISO 14229, the following services carry a sub-function byte.
171    /// Services excluded are those whose second byte is a data parameter
172    /// rather than a sub-function - for example `ReadDataByIdentifier`
173    /// uses a 2-byte DID, not a sub-function.
174    #[must_use]
175    pub fn has_sub_function(&self) -> bool {
176        matches!(
177            self,
178            ServiceIdentifier::UdsServiceRequest(UdsService::DiagnosticSessionControlRequest)
179                | ServiceIdentifier::UdsServiceRequest(
180                    UdsService::DiagnosticSessionControlResponse
181                )
182                | ServiceIdentifier::UdsServiceRequest(UdsService::ECUResetRequest)
183                | ServiceIdentifier::UdsServiceRequest(UdsService::ECUResetResponse)
184                | ServiceIdentifier::UdsServiceRequest(UdsService::SecurityAccessRequest)
185                | ServiceIdentifier::UdsServiceRequest(UdsService::SecurityAccessResponse)
186                | ServiceIdentifier::UdsServiceRequest(UdsService::CommunicationControlRequest)
187                | ServiceIdentifier::UdsServiceRequest(UdsService::CommunicationControlResponse)
188                | ServiceIdentifier::UdsServiceRequest(UdsService::AuthenticationRequest)
189                | ServiceIdentifier::UdsServiceRequest(UdsService::AuthenticationResponse)
190                | ServiceIdentifier::UdsServiceRequest(UdsService::TesterPresentRequest)
191                | ServiceIdentifier::UdsServiceRequest(UdsService::TesterPresentResponse)
192                | ServiceIdentifier::UdsServiceRequest(UdsService::ControlDTCSettingRequest)
193                | ServiceIdentifier::UdsServiceRequest(UdsService::ControlDTCSettingResponse)
194                | ServiceIdentifier::UdsServiceRequest(UdsService::ResponseOnEventRequest)
195                | ServiceIdentifier::UdsServiceRequest(UdsService::ResponseOnEventResponse)
196                | ServiceIdentifier::UdsServiceRequest(UdsService::LinkControlRequest)
197                | ServiceIdentifier::UdsServiceRequest(UdsService::LinkControlResponse)
198                | ServiceIdentifier::UdsServiceRequest(UdsService::ReadDTCInformationRequest)
199                | ServiceIdentifier::UdsServiceRequest(UdsService::ReadDTCInformationResponse)
200                | ServiceIdentifier::UdsServiceRequest(UdsService::RoutineControlRequest)
201                | ServiceIdentifier::UdsServiceRequest(UdsService::RoutineControlResponse)
202        )
203    }
204}