dis_rs/common/underwater_acoustic/
writer.rs1use crate::common::BodyInfo;
2use crate::underwater_acoustic::model::{
3    AcousticEmitterSystem, PropulsionPlantConfiguration, Shaft, UABeam, UAEmitterSystem,
4    UAFundamentalParameterData, UnderwaterAcoustic, APA,
5};
6use crate::{Serialize, SerializePdu, SupportedVersion};
7use bytes::{BufMut, BytesMut};
8
9impl SerializePdu for UnderwaterAcoustic {
10    #[allow(clippy::cast_possible_truncation)]
11    fn serialize_pdu(&self, _version: SupportedVersion, buf: &mut BytesMut) -> u16 {
12        let _emitter_bytes = self.emitting_entity_id.serialize(buf);
13        let _event_id_bytes = self.event_id.serialize(buf);
14        buf.put_u8(self.state_change_update_indicator.into());
15        buf.put_u8(0u8);
16        buf.put_u16(self.passive_parameter_index.into());
17        let _ppc_bytes = self.propulsion_plant_configuration.serialize(buf);
18
19        buf.put_u8(self.shafts.len() as u8);
20        buf.put_u8(self.apas.len() as u8);
21        buf.put_u8(self.emitter_systems.len() as u8);
22
23        let _shafts = self
24            .shafts
25            .iter()
26            .map(|shaft| shaft.serialize(buf))
27            .sum::<u16>();
28
29        let _apas = self.apas.iter().map(|apa| apa.serialize(buf)).sum::<u16>();
30
31        let _systems = self
32            .emitter_systems
33            .iter()
34            .map(|system| system.serialize(buf))
35            .sum::<u16>();
36
37        self.body_length()
38    }
39}
40
41impl Serialize for PropulsionPlantConfiguration {
42    fn serialize(&self, buf: &mut BytesMut) -> u16 {
43        let configuration: u8 = self.configuration.into();
44        let hull_mounted_masker_on = u8::from(self.hull_mounted_masker);
45        let final_field = (configuration << 1) | hull_mounted_masker_on;
46        buf.put_u8(final_field);
47
48        self.record_length()
49    }
50}
51
52impl Serialize for Shaft {
53    fn serialize(&self, buf: &mut BytesMut) -> u16 {
54        buf.put_i16(self.current_rpm);
55        buf.put_i16(self.ordered_rpm);
56        buf.put_i32(self.rpm_rate_of_change);
57
58        self.record_length()
59    }
60}
61
62impl Serialize for APA {
63    fn serialize(&self, buf: &mut BytesMut) -> u16 {
64        let parameter: u16 = self.parameter.into();
65        let parameter_status: u8 = self.status.into();
66        let parameter_index = (parameter << 2) & u16::from(parameter_status);
67        buf.put_u16(parameter_index);
68        buf.put_i16(self.value);
69
70        self.record_length()
71    }
72}
73
74impl Serialize for UAEmitterSystem {
75    #[allow(clippy::cast_possible_truncation)]
76    fn serialize(&self, buf: &mut BytesMut) -> u16 {
77        buf.put_u8(self.record_length() as u8);
78        buf.put_u8(self.beams.len() as u8);
79        buf.put_u16(0u16);
80        self.acoustic_emitter_system.serialize(buf);
81        self.location.serialize(buf);
82        self.beams
83            .iter()
84            .map(|beam| beam.serialize(buf))
85            .sum::<u16>();
86
87        self.record_length()
88    }
89}
90
91impl Serialize for AcousticEmitterSystem {
92    fn serialize(&self, buf: &mut BytesMut) -> u16 {
93        buf.put_u16(self.acoustic_system_name.into());
94        buf.put_u8(self.function.into());
95        buf.put_u8(self.acoustic_id_number);
96
97        self.record_length()
98    }
99}
100
101impl Serialize for UABeam {
102    fn serialize(&self, buf: &mut BytesMut) -> u16 {
103        buf.put_u8(self.beam_data_length);
104        buf.put_u8(self.beam_id_number);
105        buf.put_u16(0u16);
106        self.fundamental_parameters.serialize(buf);
107
108        self.record_length()
109    }
110}
111
112impl Serialize for UAFundamentalParameterData {
113    fn serialize(&self, buf: &mut BytesMut) -> u16 {
114        buf.put_u16(self.active_emission_parameter_index.into());
115        buf.put_u16(self.scan_pattern.into());
116        buf.put_f32(self.beam_center_azimuth);
117        buf.put_f32(self.azimuthal_beamwidth);
118        buf.put_f32(self.beam_center_depression_elevation);
119        buf.put_f32(self.depression_elevation_beamwidth);
120
121        self.record_length()
122    }
123}