Skip to main content

dis_rs/common/fire/
model.rs

1use crate::BodyRaw;
2use crate::common::model::{
3    EntityId, EventId, ExpendableDescriptor, Location, MunitionDescriptor, PduBody, VectorF32,
4};
5use crate::common::{BodyInfo, Interaction};
6use crate::enumerations::PduType;
7use crate::fire::builder::FireBuilder;
8#[cfg(feature = "serde")]
9use serde::{Deserialize, Serialize};
10
11const FIRE_BODY_LENGTH: u16 = 84;
12
13/// 5.4.3 Fire PDU
14///
15/// 7.3.2 Fire PDU
16#[derive(Clone, Debug, Default, PartialEq)]
17#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
18pub struct Fire {
19    pub firing_entity_id: EntityId,
20    pub target_entity_id: EntityId,
21    pub entity_id: EntityId,
22    pub event_id: EventId,
23    pub fire_mission_index: u32,
24    pub location_in_world: Location,
25    pub descriptor: FireDescriptor,
26    pub velocity: VectorF32,
27    pub range: f32,
28}
29
30impl BodyRaw for Fire {
31    type Builder = FireBuilder;
32
33    fn builder() -> Self::Builder {
34        Self::Builder::new()
35    }
36
37    fn into_builder(self) -> Self::Builder {
38        Self::Builder::new_from_body(self)
39    }
40
41    fn into_pdu_body(self) -> PduBody {
42        PduBody::Fire(self)
43    }
44}
45
46impl BodyInfo for Fire {
47    fn body_length(&self) -> u16 {
48        FIRE_BODY_LENGTH
49    }
50
51    fn body_type(&self) -> PduType {
52        PduType::Fire
53    }
54}
55
56impl Interaction for Fire {
57    fn originator(&self) -> Option<&EntityId> {
58        Some(&self.firing_entity_id)
59    }
60
61    fn receiver(&self) -> Option<&EntityId> {
62        Some(&self.target_entity_id)
63    }
64}
65
66/// 6.2.19 Fire Descriptor record
67#[derive(Clone, Debug, PartialEq)]
68#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
69pub enum FireDescriptor {
70    #[cfg_attr(feature = "serde", serde(rename = "munition"))]
71    Munition(MunitionDescriptor),
72    #[cfg_attr(feature = "serde", serde(rename = "expendable"))]
73    Expendable(ExpendableDescriptor),
74}
75
76impl Default for FireDescriptor {
77    fn default() -> Self {
78        Self::Munition(MunitionDescriptor::default())
79    }
80}
81
82impl From<MunitionDescriptor> for FireDescriptor {
83    #[inline]
84    fn from(value: MunitionDescriptor) -> Self {
85        Self::Munition(value)
86    }
87}
88
89impl From<ExpendableDescriptor> for FireDescriptor {
90    #[inline]
91    fn from(value: ExpendableDescriptor) -> Self {
92        Self::Expendable(value)
93    }
94}