Skip to main content

doip_definitions/doip_payload/
mod.rs

1// region:      --- Modules
2pub 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
19// -- Flatten
20
21pub 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
47// -- Public
48
49pub 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// endregion:      --- Modules
60
61/// Implemented across `DoIP` Payload Types for consistent encoding and decoding of buffers.
62///
63/// `DoipPayload` is implemented for all the `DoIP` Payload Types for the
64/// purpose of consistent encoding and decoding as well as identification within
65/// a buffer.
66#[cfg(not(feature = "std"))]
67#[derive(Debug, PartialEq, Copy, Clone)]
68pub enum DoipPayload<const N: usize> {
69    /// `GenericNack` variant to hold `GenericNack` struct
70    GenericNack(GenericNack),
71
72    /// `VehicleIdentificationRequest` variant to hold `VehicleIdentificationRequest` struct
73    VehicleIdentificationRequest(VehicleIdentificationRequest),
74
75    /// `VehicleIdentificationRequestEid` variant to hold `VehicleIdentificationRequestEid` struct
76    VehicleIdentificationRequestEid(VehicleIdentificationRequestEid),
77
78    /// `VehicleIdentificationRequestVin` variant to hold `VehicleIdentificationRequestVin` struct
79    VehicleIdentificationRequestVin(VehicleIdentificationRequestVin),
80
81    /// `VehicleAnnouncementMessage` variant to hold `VehicleAnnouncementMessage` struct
82    VehicleAnnouncementMessage(VehicleAnnouncementMessage),
83
84    /// `RoutingActivationRequest` variant to hold `RoutingActivationRequest` struct
85    RoutingActivationRequest(RoutingActivationRequest),
86
87    /// `RoutingActivationResponse` variant to hold `RoutingActivationResponse` struct
88    RoutingActivationResponse(RoutingActivationResponse),
89
90    /// `AliveCheckRequest` variant to hold `AliveCheckRequest` struct
91    AliveCheckRequest(AliveCheckRequest),
92
93    /// `AliveCheckResponse` variant to hold `AliveCheckResponse` struct
94    AliveCheckResponse(AliveCheckResponse),
95
96    /// `EntityStatusRequest` variant to hold `EntityStatusRequest` struct
97    EntityStatusRequest(EntityStatusRequest),
98
99    /// `EntityStatusResponse` variant to hold `EntityStatusResponse` struct
100    EntityStatusResponse(EntityStatusResponse),
101
102    /// `PowerInformationRequest` variant to hold `PowerInformationRequest` struct
103    PowerInformationRequest(PowerInformationRequest),
104
105    /// `PowerInformationResponse` variant to hold `PowerInformationResponse` struct
106    PowerInformationResponse(PowerInformationResponse),
107
108    /// `DiagnosticMessage` variant to hold `DiagnosticMessage` struct
109    DiagnosticMessage(DiagnosticMessage<N>),
110
111    /// `DiagnosticMessageAck` variant to hold `DiagnosticMessageAck` struct
112    DiagnosticMessageAck(DiagnosticMessageAck),
113
114    /// `DiagnosticMessageNack` variant to hold `DiagnosticMessageNack` struct
115    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/// Implemented across `DoIP` Payload Types for consistent encoding and decoding of buffers.
194///
195/// `DoipPayload` is implemented for all the `DoIP` Payload Types for the
196/// purpose of consistent encoding and decoding as well as identification within
197/// a buffer.
198#[cfg(feature = "std")]
199#[derive(Debug, PartialEq, Clone)]
200pub enum DoipPayload {
201    /// `GenericNack` variant to hold `GenericNack` struct
202    GenericNack(GenericNack),
203
204    /// `VehicleIdentificationRequest` variant to hold `VehicleIdentificationRequest` struct
205    VehicleIdentificationRequest(VehicleIdentificationRequest),
206
207    /// `VehicleIdentificationRequestEid` variant to hold `VehicleIdentificationRequestEid` struct
208    VehicleIdentificationRequestEid(VehicleIdentificationRequestEid),
209
210    /// `VehicleIdentificationRequestVin` variant to hold `VehicleIdentificationRequestVin` struct
211    VehicleIdentificationRequestVin(VehicleIdentificationRequestVin),
212
213    /// `VehicleAnnouncementMessage` variant to hold `VehicleAnnouncementMessage` struct
214    VehicleAnnouncementMessage(VehicleAnnouncementMessage),
215
216    /// `RoutingActivationRequest` variant to hold `RoutingActivationRequest` struct
217    RoutingActivationRequest(RoutingActivationRequest),
218
219    /// `RoutingActivationResponse` variant to hold `RoutingActivationResponse` struct
220    RoutingActivationResponse(RoutingActivationResponse),
221
222    /// `AliveCheckRequest` variant to hold `AliveCheckRequest` struct
223    AliveCheckRequest(AliveCheckRequest),
224
225    /// `AliveCheckResponse` variant to hold `AliveCheckResponse` struct
226    AliveCheckResponse(AliveCheckResponse),
227
228    /// `EntityStatusRequest` variant to hold `EntityStatusRequest` struct
229    EntityStatusRequest(EntityStatusRequest),
230
231    /// `EntityStatusResponse` variant to hold `EntityStatusResponse` struct
232    EntityStatusResponse(EntityStatusResponse),
233
234    /// `PowerInformationRequest` variant to hold `PowerInformationRequest` struct
235    PowerInformationRequest(PowerInformationRequest),
236
237    /// `PowerInformationResponse` variant to hold `PowerInformationResponse` struct
238    PowerInformationResponse(PowerInformationResponse),
239
240    /// `DiagnosticMessage` variant to hold `DiagnosticMessage` struct
241    DiagnosticMessage(DiagnosticMessage),
242
243    /// `DiagnosticMessageAck` variant to hold `DiagnosticMessageAck` struct
244    DiagnosticMessageAck(DiagnosticMessageAck),
245
246    /// `DiagnosticMessageNack` variant to hold `DiagnosticMessageNack` struct
247    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}