dis_rs/common/is_group_of/
writer.rs1use crate::is_group_of::model::{
2 GEDEntityLocation, GEDEntityOrientation, GEDRecord1, GEDRecord2, GEDRecord3, GEDRecord4,
3 GEDRecord5, GEDRecord6, GEDRecord7, GEDRecord8, GEDRecord9, GroupEntityDescription,
4 GroupReferencePoint, IsGroupOf,
5};
6use crate::{Serialize, SerializePdu, SupportedVersion};
7use bytes::{BufMut, BytesMut};
8
9impl SerializePdu for IsGroupOf {
10 fn serialize_pdu(&self, _version: SupportedVersion, buf: &mut BytesMut) -> u16 {
11 let group_id_bytes = self.group_id.serialize(buf);
12 buf.put_u8(self.grouped_entity_category.into());
13 buf.put_u8(self.descriptions.len() as u8);
14 buf.put_u32(0u32);
15 let ref_point_bytes = self.group_reference_point.serialize(buf);
16 let descriptions_bytes = self
17 .descriptions
18 .iter()
19 .map(|ged_record| ged_record.serialize(buf))
20 .sum::<u16>();
21
22 group_id_bytes + ref_point_bytes + descriptions_bytes + 6
23 }
24}
25
26impl Serialize for GroupReferencePoint {
27 fn serialize(&self, buf: &mut BytesMut) -> u16 {
28 buf.put_f64(self.latitude);
29 buf.put_f64(self.longitude);
30
31 16
32 }
33}
34
35impl Serialize for GroupEntityDescription {
36 fn serialize(&self, buf: &mut BytesMut) -> u16 {
37 match self {
38 GroupEntityDescription::Undefined => 0,
39 GroupEntityDescription::BasicGroundCombatVehicle(ged_record) => {
40 ged_record.serialize(buf)
41 }
42 GroupEntityDescription::EnhancedGroundCombatVehicle(ged_record) => {
43 ged_record.serialize(buf)
44 }
45 GroupEntityDescription::BasicGroundCombatSoldier(ged_record) => {
46 ged_record.serialize(buf)
47 }
48 GroupEntityDescription::EnhancedGroundCombatSoldier(ged_record) => {
49 ged_record.serialize(buf)
50 }
51 GroupEntityDescription::BasicRotorWingAircraft(ged_record) => ged_record.serialize(buf),
52 GroupEntityDescription::EnhancedRotorWingAircraft(ged_record) => {
53 ged_record.serialize(buf)
54 }
55 GroupEntityDescription::BasicFixedWingAircraft(ged_record) => ged_record.serialize(buf),
56 GroupEntityDescription::EnhancedFixedWingAircraft(ged_record) => {
57 ged_record.serialize(buf)
58 }
59 GroupEntityDescription::GroundLogisticsVehicle(ged_record) => ged_record.serialize(buf),
60 }
61 }
62}
63
64impl Serialize for GEDEntityLocation {
65 fn serialize(&self, buf: &mut BytesMut) -> u16 {
66 buf.put_u16(self.x_offset);
67 buf.put_u16(self.y_offset);
68 buf.put_u16(self.z_offset);
69
70 self.record_length()
71 }
72}
73
74impl Serialize for GEDEntityOrientation {
75 fn serialize(&self, buf: &mut BytesMut) -> u16 {
76 buf.put_u8(self.psi);
77 buf.put_u8(self.theta);
78 buf.put_u8(self.phi);
79
80 self.record_length()
81 }
82}
83
84impl Serialize for GEDRecord1 {
85 fn serialize(&self, buf: &mut BytesMut) -> u16 {
86 buf.put_u16(self.entity_id);
87 self.location.serialize(buf);
88 self.appearance.serialize(buf);
89 self.orientation.serialize(buf);
90 buf.put_u8(self.speed);
91 buf.put_u8(self.turret_azimuth);
92 buf.put_u8(self.gun_elevation);
93 buf.put_u8(self.turret_slew_rate);
94 buf.put_u8(self.gun_elevation_rate);
95
96 self.record_length()
97 }
98}
99
100impl Serialize for GEDRecord2 {
101 fn serialize(&self, buf: &mut BytesMut) -> u16 {
102 self.basic_ground_combat_vehicle.serialize(buf);
103 buf.put_u8(self.fuel_status);
104 buf.put_u8(self.ground_maintenance_status);
105 buf.put_u8(self.primary_ammunition);
106 buf.put_u8(self.secondary_ammunition);
107
108 self.record_length()
109 }
110}
111
112impl Serialize for GEDRecord3 {
113 fn serialize(&self, buf: &mut BytesMut) -> u16 {
114 buf.put_u16(self.entity_id);
115 self.location.serialize(buf);
116 self.appearance.serialize(buf);
117 self.orientation.serialize(buf);
118 buf.put_u8(self.speed);
119 buf.put_u8(self.head_azimuth);
120 buf.put_u8(self.head_elevation);
121 buf.put_u8(self.head_scan_rate);
122 buf.put_u8(self.head_elevation_rate);
123
124 self.record_length()
125 }
126}
127
128impl Serialize for GEDRecord4 {
129 fn serialize(&self, buf: &mut BytesMut) -> u16 {
130 self.basic_ground_combat_soldier.serialize(buf);
131 buf.put_u8(self.water_status);
132 buf.put_u8(self.reset_status);
133 buf.put_u8(self.primary_ammunition);
134 buf.put_u8(self.secondary_ammunition);
135
136 self.record_length()
137 }
138}
139
140impl Serialize for GEDRecord5 {
141 fn serialize(&self, buf: &mut BytesMut) -> u16 {
142 buf.put_u16(self.entity_id);
143 self.location.serialize(buf);
144 self.appearance.serialize(buf);
145 self.orientation.serialize(buf);
146 buf.put_u8(self.fuel_status);
147 buf.put_u8(self.movement_horizontal_deviation);
148 buf.put_u8(self.movement_vertical_deviation);
149 buf.put_u16(self.movement_speed);
150 buf.put_u8(self.turret_azimuth);
151 buf.put_u8(self.gun_elevation);
152 buf.put_u8(self.turret_scan_rate);
153 buf.put_u8(self.gun_elevation_rate);
154
155 self.record_length()
156 }
157}
158
159impl Serialize for GEDRecord6 {
160 fn serialize(&self, buf: &mut BytesMut) -> u16 {
161 self.basic_rotor_wing_aircraft.serialize(buf);
162 buf.put_u8(self.supplemental_fuel_status);
163 buf.put_u8(self.air_maintenance_status);
164 buf.put_u8(self.primary_ammunition);
165 buf.put_u8(self.secondary_ammunition);
166
167 self.record_length()
168 }
169}
170
171impl Serialize for GEDRecord7 {
172 fn serialize(&self, buf: &mut BytesMut) -> u16 {
173 buf.put_u16(self.entity_id);
174 self.location.serialize(buf);
175 self.appearance.serialize(buf);
176 self.orientation.serialize(buf);
177 buf.put_u8(self.fuel_status);
178 buf.put_u8(self.movement_horizontal_deviation);
179 buf.put_u8(self.movement_vertical_deviation);
180 buf.put_u16(self.movement_speed);
181
182 self.record_length()
183 }
184}
185
186impl Serialize for GEDRecord8 {
187 fn serialize(&self, buf: &mut BytesMut) -> u16 {
188 self.basic_fixed_wing_aircraft.serialize(buf);
189 buf.put_u8(self.supplemental_fuel_status);
190 buf.put_u8(self.air_maintenance_status);
191 buf.put_u8(self.primary_ammunition);
192 buf.put_u8(self.secondary_ammunition);
193
194 self.record_length()
195 }
196}
197
198impl Serialize for GEDRecord9 {
199 fn serialize(&self, buf: &mut BytesMut) -> u16 {
200 buf.put_u16(self.entity_id);
201 self.location.serialize(buf);
202 self.appearance.serialize(buf);
203 self.orientation.serialize(buf);
204 buf.put_u16(self.speed);
205
206 self.record_length()
207 }
208}