dis_rs/common/signal/
model.rs1use 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#[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#[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}