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}