ace_uds/message/
service.rs1use 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 #[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}