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 #[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}