dis_rs/common/signal/
model.rs

1use crate::common::model::{length_padded_to_num, EntityId, PduBody};
2use crate::common::{BodyInfo, Interaction};
3use crate::constants::FOUR_OCTETS;
4use crate::enumerations::{
5    PduType, SignalEncodingClass, SignalEncodingType, SignalTdlType,
6    SignalUserProtocolIdentificationNumber,
7};
8use crate::signal::builder::SignalBuilder;
9#[cfg(feature = "serde")]
10use serde::{Deserialize, Serialize};
11
12pub const BASE_SIGNAL_BODY_LENGTH: u16 = 20;
13
14/// 5.8.4 Signal PDU
15///
16/// 7.7.3 Signal PDU
17#[derive(Clone, Debug, Default, PartialEq)]
18#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
19pub struct Signal {
20    pub radio_reference_id: EntityId,
21    pub radio_number: u16,
22    pub encoding_scheme: EncodingScheme,
23    pub tdl_type: SignalTdlType,
24    pub sample_rate: u32,
25    pub samples: u16,
26    pub data: Vec<u8>,
27}
28
29impl Signal {
30    #[must_use]
31    pub fn builder() -> SignalBuilder {
32        SignalBuilder::new()
33    }
34
35    #[must_use]
36    pub fn into_builder(self) -> SignalBuilder {
37        SignalBuilder::new_from_body(self)
38    }
39
40    #[must_use]
41    pub fn into_pdu_body(self) -> PduBody {
42        PduBody::Signal(self)
43    }
44}
45
46impl BodyInfo for Signal {
47    fn body_length(&self) -> u16 {
48        BASE_SIGNAL_BODY_LENGTH
49            + length_padded_to_num(self.data.len(), FOUR_OCTETS).record_length as u16
50    }
51
52    fn body_type(&self) -> PduType {
53        PduType::Signal
54    }
55}
56
57impl Interaction for Signal {
58    fn originator(&self) -> Option<&EntityId> {
59        Some(&self.radio_reference_id)
60    }
61
62    fn receiver(&self) -> Option<&EntityId> {
63        None
64    }
65}
66
67/// Table 177—Encoding Scheme record (7.7.3)
68///
69/// 5.8.4.3.2 Field-specific requirements
70#[derive(Clone, Debug, PartialEq)]
71#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
72#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
73pub enum EncodingScheme {
74    EncodedAudio {
75        encoding_class: SignalEncodingClass,
76        encoding_type: SignalEncodingType,
77    },
78    RawBinaryData {
79        encoding_class: SignalEncodingClass,
80        nr_of_messages: u16,
81    },
82    ApplicationSpecificData {
83        encoding_class: SignalEncodingClass,
84        user_protocol_id: SignalUserProtocolIdentificationNumber,
85    },
86    DatabaseIndex {
87        encoding_class: SignalEncodingClass,
88        index: u32,
89        offset_milli_secs: u32,
90        duration_milli_secs: u32,
91    },
92    Unspecified {
93        encoding_class: SignalEncodingClass,
94    },
95}
96
97impl Default for EncodingScheme {
98    fn default() -> Self {
99        EncodingScheme::EncodedAudio {
100            encoding_class: SignalEncodingClass::default(),
101            encoding_type: SignalEncodingType::default(),
102        }
103    }
104}