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