dis_rs/common/data_query/
model.rs1use crate::BodyRaw;
2use crate::common::data_query::builder::DataQueryBuilder;
3use crate::common::model::{EntityId, PduBody, Timestamp};
4use crate::common::{BodyInfo, Interaction};
5use crate::constants::FOUR_OCTETS;
6use crate::enumerations::{PduType, VariableRecordType};
7use alloc::vec::Vec;
8#[cfg(feature = "serde")]
9use serde::{Deserialize, Serialize};
10
11pub const BASE_DATA_QUERY_BODY_LENGTH: u16 = 28;
12
13#[derive(Clone, Debug, Default, PartialEq)]
14#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
15pub struct DataQuery {
16 pub originating_id: EntityId,
17 pub receiving_id: EntityId,
18 pub request_id: u32,
19 pub time_interval: Timestamp,
20 pub fixed_datum_records: Vec<VariableRecordType>,
21 pub variable_datum_records: Vec<VariableRecordType>,
22}
23
24impl BodyRaw for DataQuery {
25 type Builder = DataQueryBuilder;
26
27 fn builder() -> Self::Builder {
28 Self::Builder::new()
29 }
30
31 fn into_builder(self) -> Self::Builder {
32 Self::Builder::new_from_body(self)
33 }
34
35 fn into_pdu_body(self) -> PduBody {
36 PduBody::DataQuery(self)
37 }
38}
39
40impl BodyInfo for DataQuery {
41 fn body_length(&self) -> u16 {
42 BASE_DATA_QUERY_BODY_LENGTH
43 + (FOUR_OCTETS * self.fixed_datum_records.len()) as u16
44 + (FOUR_OCTETS * self.variable_datum_records.len()) as u16
45 }
46
47 fn body_type(&self) -> PduType {
48 PduType::DataQuery
49 }
50}
51
52impl Interaction for DataQuery {
53 fn originator(&self) -> Option<&EntityId> {
54 Some(&self.originating_id)
55 }
56
57 fn receiver(&self) -> Option<&EntityId> {
58 Some(&self.receiving_id)
59 }
60}