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}