gondola_core/monitoring/
sip_position.rs1use crate::prelude::*;
5
6#[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 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 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 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