Skip to main content

gondola_core/monitoring/
sip_position.rs

1// This file is part of gaps-online-software and published 
2// under the GPLv3 license
3
4use crate::prelude::*;
5
6// Sip (CSBF provided GPS position data
7#[derive(Debug, Copy, Clone, PartialEq)]
8#[cfg_attr(feature="pybindings", pyclass)] 
9pub struct SipPosMoniData {
10  pub longitude  : f32,
11  pub latitude   : f32,
12  pub altitude   : f32,
13  pub status1    : u8,
14  pub status2    : u8,
15  pub sip_id     : u8,
16  // make it compatible with other moni data
17  pub timestamp  : u64,
18  pub board_id   : u8,
19}
20
21impl SipPosMoniData {
22
23  pub fn new() -> Self {
24    Self {
25      longitude  : 0.0,
26      latitude   : 0.0,
27      altitude   : 0.0,
28      status1    : 0,
29      status2    : 0,
30      sip_id     : 0,
31      timestamp  : 0,
32      board_id   : 0,
33    }
34  }
35}
36
37#[cfg(feature = "random")]
38impl FromRandom for SipPosMoniData {
39    
40  fn from_random() -> Self {
41    let mut moni  = Self::new();
42    let mut rng   = rand::rng();
43    moni.longitude = rng.random::<f32>();
44    moni.latitude  = rng.random::<f32>();
45    moni.altitude  = rng.random::<f32>();
46    moni.status1   = rng.random::<u8>();
47    moni.status2   = rng.random::<u8>();
48    moni.sip_id    = rng.random::<u8>(); 
49    moni.timestamp = rng.random::<u64>();
50    moni.board_id  = rng.random::<u8>();
51    moni
52  }
53}
54
55impl Default for SipPosMoniData {
56  fn default() -> Self {
57    Self::new()
58  }
59}
60
61impl Serialization for SipPosMoniData { 
62
63  fn from_bytestream(stream : &Vec<u8>,
64                     pos    : &mut usize)
65    -> Result<Self, SerializationError> {
66    if stream.len() < Self::SIZE {
67      return Err(SerializationError::StreamTooShort);
68    }
69    let mut moni = Self::new();
70    moni.sip_id  = parse_u8(stream, pos);
71    let     dle  = parse_u8(stream, pos);
72    if dle != 0x10 {
73       //return -2;
74       error!("-2");
75       return Err(SerializationError::Unknown);
76    } 
77    let sip_type = parse_u8(stream, pos);
78    if sip_type != 0x10 {
79      error!("Wrong SIP type - seeing {} instead of {}", sip_type, 0x10);
80      return Err(SerializationError::Unknown);
81    }
82    moni.longitude    = parse_f32(stream, pos);
83    moni.latitude     = parse_f32(stream, pos);
84    moni.altitude     = parse_f32(stream, pos);
85    moni.status1      = parse_u8(stream, pos);
86    moni.status2      = parse_u8(stream, pos);
87    let etx           = parse_u8(stream, pos);
88    if etx != 0x03 {
89       // return -4
90       error!("-4");
91       return Err(SerializationError::Unknown);
92    }  
93    Ok(moni)
94  } 
95}
96
97impl MoniData for SipPosMoniData {
98  
99  fn get_board_id(&self) -> u8 {
100    return self.board_id;
101  }
102
103  fn get_timestamp(&self) -> u64 {
104    self.timestamp 
105  }
106
107  fn set_timestamp(&mut self, ts: u64) {
108    self.timestamp = ts;
109  }
110
111  fn keys() -> Vec<&'static str> {
112    vec!["board_id", "sip_id", 
113         "longitude", "latitude", "altitude",
114         "status1", "status2",
115         "timestamp"]
116  }
117
118  fn get(&self, varname : &str) -> Option<f32> {
119    match varname {
120      "board_id"  => Some(self.board_id as f32),
121      "sip_id"    => Some(self.sip_id as f32),
122      "longitude" => Some(self.longitude as f32), 
123      "latitude"  => Some(self.latitude as f32),
124      "altitude"  => Some(self.altitude as f32),
125      "status1"   => Some(self.status1 as f32),
126      "status2"   => Some(self.status2 as f32),
127      "timestamp" => Some(self.timestamp as f32),
128      _           => None
129    }
130  }  
131}
132
133impl TelemetryPackable for SipPosMoniData {
134  const TEL_PACKET_TYPE : TelemetryPacketType = TelemetryPacketType::SipGpsPosition;
135}
136
137moniseries_telemetry!(SipPosMoniDataSeries, SipPosMoniData);
138
139#[cfg(feature="pybindings")]
140pythonize_monidata!(SipPosMoniData);
141