open_dis_rust/simulation_management/
data_query_pdu.rs1use crate::common::{
8 dis_error::DISError,
9 entity_id::EntityId,
10 pdu::Pdu,
11 pdu_header::{PduHeader, PduType, ProtocolFamily},
12};
13use bytes::{Buf, BufMut, BytesMut};
14use std::any::Any;
15
16#[derive(Copy, Clone, Debug)]
17pub struct DataQueryPdu {
19 pub pdu_header: PduHeader,
20 pub originating_entity_id: EntityId,
21 pub receiving_entity_id: EntityId,
22 pub request_id: u32,
23 pub time_interval: u32,
24 pub number_of_fixed_datum_records: u32,
25 pub number_of_variable_datum_records: u32,
26 pub fixed_datum_records: u64,
27 pub variable_datum_records: u64,
28}
29
30impl Default for DataQueryPdu {
31 fn default() -> Self {
32 DataQueryPdu {
33 pdu_header: PduHeader::default(
34 PduType::DataQuery,
35 ProtocolFamily::SimulationManagement,
36 56,
37 ),
38 originating_entity_id: EntityId::default(1),
39 receiving_entity_id: EntityId::default(2),
40 request_id: 0,
41 time_interval: 0,
42 number_of_fixed_datum_records: 0,
43 number_of_variable_datum_records: 0,
44 fixed_datum_records: 0,
45 variable_datum_records: 0,
46 }
47 }
48}
49
50impl Pdu for DataQueryPdu {
51 fn serialize(&mut self, buf: &mut BytesMut) {
52 self.pdu_header.length = u16::try_from(std::mem::size_of_val(self))
53 .expect("The length of the PDU should fit in a u16.");
54 self.pdu_header.serialize(buf);
55 self.originating_entity_id.serialize(buf);
56 self.receiving_entity_id.serialize(buf);
57 buf.put_u32(self.request_id);
58 buf.put_u32(self.time_interval);
59 buf.put_u32(self.number_of_fixed_datum_records);
60 buf.put_u32(self.number_of_variable_datum_records);
61 buf.put_u64(self.fixed_datum_records);
62 buf.put_u64(self.variable_datum_records);
63 }
64
65 fn deserialize(mut buffer: BytesMut) -> Result<Self, DISError>
66 where
67 Self: Sized,
68 {
69 let pdu_header = PduHeader::decode(&mut buffer);
70 if pdu_header.pdu_type == PduType::DataQuery {
71 let originating_entity_id = EntityId::decode(&mut buffer);
72 let receiving_entity_id = EntityId::decode(&mut buffer);
73 let request_id = buffer.get_u32();
74 let time_interval = buffer.get_u32();
75 let number_of_fixed_datum_records = buffer.get_u32();
76 let number_of_variable_datum_records = buffer.get_u32();
77 let mut fixed_datum_records: u64 = 0;
78 for _record in 0..number_of_fixed_datum_records as usize {
79 fixed_datum_records += buffer.get_u64();
80 }
81 let mut variable_datum_records: u64 = 0;
82 for _record in 0..number_of_variable_datum_records as usize {
83 variable_datum_records += buffer.get_u64();
84 }
85
86 Ok(DataQueryPdu {
87 pdu_header,
88 originating_entity_id,
89 receiving_entity_id,
90 request_id,
91 time_interval,
92 number_of_fixed_datum_records,
93 number_of_variable_datum_records,
94 fixed_datum_records,
95 variable_datum_records,
96 })
97 } else {
98 Err(DISError::InvalidDISHeader)
99 }
100 }
101
102 fn as_any(&self) -> &dyn Any {
103 self
104 }
105
106 fn deserialize_without_header(
107 mut buffer: BytesMut,
108 pdu_header: PduHeader,
109 ) -> Result<Self, DISError>
110 where
111 Self: Sized,
112 {
113 let originating_entity_id = EntityId::decode(&mut buffer);
114 let receiving_entity_id = EntityId::decode(&mut buffer);
115 let request_id = buffer.get_u32();
116 let time_interval = buffer.get_u32();
117 let number_of_fixed_datum_records = buffer.get_u32();
118 let number_of_variable_datum_records = buffer.get_u32();
119 let mut fixed_datum_records: u64 = 0;
120 for _record in 0..number_of_fixed_datum_records as usize {
121 fixed_datum_records += buffer.get_u64();
122 }
123 let mut variable_datum_records: u64 = 0;
124 for _record in 0..number_of_variable_datum_records as usize {
125 variable_datum_records += buffer.get_u64();
126 }
127
128 Ok(DataQueryPdu {
129 pdu_header,
130 originating_entity_id,
131 receiving_entity_id,
132 request_id,
133 time_interval,
134 number_of_fixed_datum_records,
135 number_of_variable_datum_records,
136 fixed_datum_records,
137 variable_datum_records,
138 })
139 }
140}
141
142#[cfg(test)]
143mod tests {
144 use super::DataQueryPdu;
145 use crate::common::pdu_header::{PduHeader, PduType, ProtocolFamily};
146
147 #[test]
148 fn create_header() {
149 let action_request_pdu = DataQueryPdu::default();
150 let pdu_header = PduHeader::default(
151 PduType::DataQuery,
152 ProtocolFamily::SimulationManagement,
153 448 / 8,
154 );
155
156 assert_eq!(
157 pdu_header.protocol_version,
158 action_request_pdu.pdu_header.protocol_version
159 );
160 assert_eq!(
161 pdu_header.exercise_id,
162 action_request_pdu.pdu_header.exercise_id
163 );
164 assert_eq!(pdu_header.pdu_type, action_request_pdu.pdu_header.pdu_type);
165 assert_eq!(
166 pdu_header.protocol_family,
167 action_request_pdu.pdu_header.protocol_family
168 );
169 assert_eq!(pdu_header.length, action_request_pdu.pdu_header.length);
170 assert_eq!(pdu_header.padding, action_request_pdu.pdu_header.padding);
171 }
172}