dis_rs/common/signal/
writer.rs

1use crate::common::model::length_padded_to_num;
2use crate::common::signal::model::{EncodingScheme, Signal};
3use crate::common::{Serialize, SerializePdu, SupportedVersion};
4use crate::constants::{FOUR_OCTETS, ONE_BYTE_IN_BITS};
5use bytes::{BufMut, BytesMut};
6
7impl SerializePdu for Signal {
8    fn serialize_pdu(&self, _version: SupportedVersion, buf: &mut BytesMut) -> u16 {
9        let radio_ref_id_bytes = self.radio_reference_id.serialize(buf);
10        buf.put_u16(self.radio_number);
11        let encoding_scheme_bytes = self.encoding_scheme.serialize(buf);
12        buf.put_u16(self.tdl_type.into());
13        buf.put_u32(self.sample_rate);
14        buf.put_u16((self.data.len() * ONE_BYTE_IN_BITS) as u16);
15        buf.put_u16(self.samples);
16        buf.put(&self.data[..]);
17        let padded_record_lengths = length_padded_to_num(self.data.len(), FOUR_OCTETS);
18        buf.put_bytes(0u8, padded_record_lengths.padding_length);
19
20        radio_ref_id_bytes
21            + 2
22            + encoding_scheme_bytes
23            + 10
24            + padded_record_lengths.record_length as u16
25    }
26}
27
28impl Serialize for EncodingScheme {
29    #[allow(clippy::match_same_arms)]
30    fn serialize(&self, buf: &mut BytesMut) -> u16 {
31        match self {
32            EncodingScheme::EncodedAudio {
33                encoding_class,
34                encoding_type,
35            } => {
36                let class_bits = u16::from(*encoding_class) << 14;
37                let type_bits = u16::from(*encoding_type);
38                buf.put_u16(class_bits | type_bits);
39                2
40            }
41            EncodingScheme::RawBinaryData {
42                encoding_class,
43                nr_of_messages,
44            } => {
45                let class_bits = u16::from(*encoding_class) << 14;
46                buf.put_u16(class_bits | *nr_of_messages);
47                2
48            }
49            EncodingScheme::ApplicationSpecificData { encoding_class, .. } => {
50                let class_bits = u16::from(*encoding_class) << 14;
51                buf.put_u16(class_bits);
52                2
53            }
54            EncodingScheme::DatabaseIndex { encoding_class, .. } => {
55                let class_bits = u16::from(*encoding_class) << 14;
56                buf.put_u16(class_bits);
57                2
58            }
59            EncodingScheme::Unspecified { encoding_class } => {
60                let class_bits = u16::from(*encoding_class) << 14;
61                buf.put_u16(class_bits);
62                2
63            }
64        }
65    }
66}