doip_definitions/doip_payload/
mod.rs1pub mod alive_check_request;
3pub mod alive_check_response;
4pub mod diagnostic_message;
5pub mod diagnostic_message_ack;
6pub mod diagnostic_message_nack;
7pub mod entity_status_request;
8pub mod entity_status_response;
9pub mod generic_nack;
10pub mod power_information_request;
11pub mod power_information_response;
12pub mod routing_activation_request;
13pub mod routing_activation_response;
14pub mod vehicle_announcement_message;
15pub mod vehicle_identification_request;
16pub mod vehicle_identification_request_eid;
17pub mod vehicle_identification_request_vin;
18
19pub use alive_check_request::*;
22pub use alive_check_response::*;
23pub use diagnostic_message::*;
24pub use diagnostic_message_ack::*;
25pub use diagnostic_message_nack::*;
26pub use entity_status_request::*;
27pub use entity_status_response::*;
28pub use generic_nack::*;
29pub use power_information_request::*;
30pub use power_information_response::*;
31pub use routing_activation_request::*;
32pub use routing_activation_response::*;
33pub use vehicle_announcement_message::*;
34pub use vehicle_identification_request::*;
35pub use vehicle_identification_request_eid::*;
36pub use vehicle_identification_request_vin::*;
37
38use crate::definitions::{
39 DOIP_COMMON_EID_LEN, DOIP_COMMON_VIN_LEN, DOIP_DIAG_COMMON_SOURCE_LEN,
40 DOIP_DIAG_COMMON_TARGET_LEN, DOIP_ENTITY_STATUS_RESPONSE_MCTS_LEN,
41 DOIP_ENTITY_STATUS_RESPONSE_MDS_LEN, DOIP_ENTITY_STATUS_RESPONSE_NCTS_LEN,
42 DOIP_ROUTING_ACTIVATION_REQ_ISO_LEN, DOIP_ROUTING_ACTIVATION_REQ_SRC_LEN,
43 DOIP_ROUTING_ACTIVATION_RES_ENTITY_LEN, DOIP_ROUTING_ACTIVATION_RES_ISO_LEN,
44 DOIP_ROUTING_ACTIVATION_RES_TESTER_LEN, DOIP_VEHICLE_ANNOUNCEMENT_GID_LEN,
45};
46
47pub mod action_code;
50pub mod activation_code;
51pub mod activation_type;
52pub mod diagnostic_ack;
53pub mod diagnostic_nack;
54pub mod nack_code;
55pub mod node_type;
56pub mod power_mode;
57pub mod sync_status;
58
59#[cfg(not(feature = "std"))]
67#[derive(Debug, PartialEq, Copy, Clone)]
68pub enum DoipPayload<const N: usize> {
69 GenericNack(GenericNack),
71
72 VehicleIdentificationRequest(VehicleIdentificationRequest),
74
75 VehicleIdentificationRequestEid(VehicleIdentificationRequestEid),
77
78 VehicleIdentificationRequestVin(VehicleIdentificationRequestVin),
80
81 VehicleAnnouncementMessage(VehicleAnnouncementMessage),
83
84 RoutingActivationRequest(RoutingActivationRequest),
86
87 RoutingActivationResponse(RoutingActivationResponse),
89
90 AliveCheckRequest(AliveCheckRequest),
92
93 AliveCheckResponse(AliveCheckResponse),
95
96 EntityStatusRequest(EntityStatusRequest),
98
99 EntityStatusResponse(EntityStatusResponse),
101
102 PowerInformationRequest(PowerInformationRequest),
104
105 PowerInformationResponse(PowerInformationResponse),
107
108 DiagnosticMessage(DiagnosticMessage<N>),
110
111 DiagnosticMessageAck(DiagnosticMessageAck),
113
114 DiagnosticMessageNack(DiagnosticMessageNack),
116}
117
118#[cfg(not(feature = "std"))]
119impl<const N: usize> From<DoipPayload<N>> for [u8; N] {
120 fn from(value: DoipPayload<N>) -> Self {
121 fn copy_into_buffer<const N: usize, const M: usize>(payload: [u8; M]) -> [u8; N] {
122 let mut buffer = [0u8; N];
123 buffer[..M].copy_from_slice(&payload);
124 buffer
125 }
126
127 match value {
128 DoipPayload::GenericNack(payload) => copy_into_buffer::<N, 1>(payload.into()),
129 DoipPayload::VehicleIdentificationRequest(payload) => {
130 copy_into_buffer::<N, 0>(payload.into())
131 }
132 DoipPayload::VehicleIdentificationRequestEid(payload) => {
133 copy_into_buffer::<N, DOIP_COMMON_EID_LEN>(payload.into())
134 }
135 DoipPayload::VehicleIdentificationRequestVin(payload) => {
136 copy_into_buffer::<N, DOIP_COMMON_VIN_LEN>(payload.into())
137 }
138 DoipPayload::VehicleAnnouncementMessage(payload) => copy_into_buffer::<
139 N,
140 {
141 DOIP_COMMON_VIN_LEN
142 + DOIP_DIAG_COMMON_SOURCE_LEN
143 + DOIP_COMMON_EID_LEN
144 + DOIP_VEHICLE_ANNOUNCEMENT_GID_LEN
145 + 2
146 },
147 >(payload.into()),
148 DoipPayload::RoutingActivationRequest(payload) => copy_into_buffer::<
149 N,
150 { DOIP_ROUTING_ACTIVATION_REQ_SRC_LEN + 1 + DOIP_ROUTING_ACTIVATION_REQ_ISO_LEN },
151 >(payload.into()),
152 DoipPayload::RoutingActivationResponse(payload) => copy_into_buffer::<
153 N,
154 {
155 DOIP_ROUTING_ACTIVATION_RES_TESTER_LEN
156 + DOIP_ROUTING_ACTIVATION_RES_ENTITY_LEN
157 + 1
158 + DOIP_ROUTING_ACTIVATION_RES_ISO_LEN
159 },
160 >(payload.into()),
161 DoipPayload::AliveCheckRequest(payload) => copy_into_buffer::<N, 0>(payload.into()),
162 DoipPayload::AliveCheckResponse(payload) => {
163 copy_into_buffer::<N, DOIP_DIAG_COMMON_SOURCE_LEN>(payload.into())
164 }
165 DoipPayload::EntityStatusRequest(payload) => copy_into_buffer::<N, 0>(payload.into()),
166 DoipPayload::EntityStatusResponse(payload) => copy_into_buffer::<
167 N,
168 {
169 1 + DOIP_ENTITY_STATUS_RESPONSE_MCTS_LEN
170 + DOIP_ENTITY_STATUS_RESPONSE_NCTS_LEN
171 + DOIP_ENTITY_STATUS_RESPONSE_MDS_LEN
172 },
173 >(payload.into()),
174 DoipPayload::PowerInformationRequest(payload) => {
175 copy_into_buffer::<N, 0>(payload.into())
176 }
177 DoipPayload::PowerInformationResponse(payload) => {
178 copy_into_buffer::<N, 1>(payload.into())
179 }
180 DoipPayload::DiagnosticMessage(payload) => copy_into_buffer::<N, N>(payload.into()),
181 DoipPayload::DiagnosticMessageAck(payload) => copy_into_buffer::<
182 N,
183 { DOIP_DIAG_COMMON_SOURCE_LEN + DOIP_DIAG_COMMON_TARGET_LEN + 1 },
184 >(payload.into()),
185 DoipPayload::DiagnosticMessageNack(payload) => copy_into_buffer::<
186 N,
187 { DOIP_DIAG_COMMON_SOURCE_LEN + DOIP_DIAG_COMMON_TARGET_LEN + 1 },
188 >(payload.into()),
189 }
190 }
191}
192
193#[cfg(feature = "std")]
199#[derive(Debug, PartialEq, Clone)]
200pub enum DoipPayload {
201 GenericNack(GenericNack),
203
204 VehicleIdentificationRequest(VehicleIdentificationRequest),
206
207 VehicleIdentificationRequestEid(VehicleIdentificationRequestEid),
209
210 VehicleIdentificationRequestVin(VehicleIdentificationRequestVin),
212
213 VehicleAnnouncementMessage(VehicleAnnouncementMessage),
215
216 RoutingActivationRequest(RoutingActivationRequest),
218
219 RoutingActivationResponse(RoutingActivationResponse),
221
222 AliveCheckRequest(AliveCheckRequest),
224
225 AliveCheckResponse(AliveCheckResponse),
227
228 EntityStatusRequest(EntityStatusRequest),
230
231 EntityStatusResponse(EntityStatusResponse),
233
234 PowerInformationRequest(PowerInformationRequest),
236
237 PowerInformationResponse(PowerInformationResponse),
239
240 DiagnosticMessage(DiagnosticMessage),
242
243 DiagnosticMessageAck(DiagnosticMessageAck),
245
246 DiagnosticMessageNack(DiagnosticMessageNack),
248}
249
250#[cfg(feature = "std")]
251impl From<DoipPayload> for Vec<u8> {
252 fn from(value: DoipPayload) -> Self {
253 match value {
254 DoipPayload::GenericNack(payload) => {
255 let payload: [u8; 1] = payload.into();
256 payload.to_vec()
257 }
258 DoipPayload::VehicleIdentificationRequest(payload) => {
259 let payload: [u8; 0] = payload.into();
260 payload.to_vec()
261 }
262 DoipPayload::VehicleIdentificationRequestEid(payload) => {
263 let payload: [u8; DOIP_COMMON_EID_LEN] = payload.into();
264 payload.to_vec()
265 }
266 DoipPayload::VehicleIdentificationRequestVin(payload) => {
267 let payload: [u8; DOIP_COMMON_VIN_LEN] = payload.into();
268 payload.to_vec()
269 }
270 DoipPayload::VehicleAnnouncementMessage(payload) => {
271 if payload.vin_gid_sync.is_some() {
272 let payload: [u8; DOIP_COMMON_VIN_LEN
273 + DOIP_DIAG_COMMON_SOURCE_LEN
274 + DOIP_COMMON_EID_LEN
275 + DOIP_VEHICLE_ANNOUNCEMENT_GID_LEN
276 + 2] = payload.into();
277 payload.to_vec()
278 } else {
279 let payload: [u8; DOIP_COMMON_VIN_LEN
280 + DOIP_DIAG_COMMON_SOURCE_LEN
281 + DOIP_COMMON_EID_LEN
282 + DOIP_VEHICLE_ANNOUNCEMENT_GID_LEN
283 + 1] = payload.into();
284 payload.to_vec()
285 }
286 }
287 DoipPayload::RoutingActivationRequest(payload) => {
288 let payload: [u8; DOIP_ROUTING_ACTIVATION_REQ_SRC_LEN
289 + 1
290 + DOIP_ROUTING_ACTIVATION_REQ_ISO_LEN] = payload.into();
291 payload.to_vec()
292 }
293 DoipPayload::RoutingActivationResponse(payload) => {
294 let payload: [u8; DOIP_ROUTING_ACTIVATION_RES_TESTER_LEN
295 + DOIP_ROUTING_ACTIVATION_RES_ENTITY_LEN
296 + 1
297 + DOIP_ROUTING_ACTIVATION_RES_ISO_LEN] = payload.into();
298 payload.to_vec()
299 }
300 DoipPayload::AliveCheckRequest(payload) => {
301 let payload: [u8; 0] = payload.into();
302 payload.to_vec()
303 }
304 DoipPayload::AliveCheckResponse(payload) => {
305 let payload: [u8; DOIP_DIAG_COMMON_SOURCE_LEN] = payload.into();
306 payload.to_vec()
307 }
308 DoipPayload::EntityStatusRequest(payload) => {
309 let payload: [u8; 0] = payload.into();
310 payload.to_vec()
311 }
312 DoipPayload::EntityStatusResponse(payload) => {
313 let payload: [u8; 1
314 + DOIP_ENTITY_STATUS_RESPONSE_MCTS_LEN
315 + DOIP_ENTITY_STATUS_RESPONSE_NCTS_LEN
316 + DOIP_ENTITY_STATUS_RESPONSE_MDS_LEN] = payload.into();
317 payload.to_vec()
318 }
319 DoipPayload::PowerInformationRequest(payload) => {
320 let payload: [u8; 0] = payload.into();
321 payload.to_vec()
322 }
323 DoipPayload::PowerInformationResponse(payload) => {
324 let payload: [u8; 1] = payload.into();
325 payload.to_vec()
326 }
327 DoipPayload::DiagnosticMessage(payload) => payload.into(),
328 DoipPayload::DiagnosticMessageAck(payload) => {
329 let payload: [u8; DOIP_DIAG_COMMON_SOURCE_LEN + DOIP_DIAG_COMMON_TARGET_LEN + 1] =
330 payload.into();
331 payload.to_vec()
332 }
333 DoipPayload::DiagnosticMessageNack(payload) => {
334 let payload: [u8; DOIP_DIAG_COMMON_SOURCE_LEN + DOIP_DIAG_COMMON_TARGET_LEN + 1] =
335 payload.into();
336 payload.to_vec()
337 }
338 }
339 }
340}