Skip to main content

gondola_core/monitoring/
tracker_gps.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 TrackerGpsMoniData {
10  pub daq_header : TrackerHeader,
11  pub utc_time   : u32,
12  pub gps_info   : u8,
13  // make it compatible with other moni data
14  pub timestamp  : u64,
15  pub board_id   : u8,
16}
17
18impl TrackerGpsMoniData {
19
20  fn new() ->Self {
21    Self {
22      daq_header : TrackerHeader::new(),
23      utc_time   : 0,
24      gps_info   : 0,
25      timestamp  : 0,
26      board_id   : 0,
27    }
28  }
29}
30
31#[cfg(feature = "random")]
32impl FromRandom for TrackerGpsMoniData {    
33  fn from_random() -> Self {
34    let mut moni    = Self::new();
35    let mut rng     = rand::rng();
36    moni.utc_time   = rng.random::<u32>();
37    moni.gps_info   = rng.random::<u8>();
38    moni.daq_header = TrackerHeader::from_random();
39    moni.timestamp  = rng.random::<u64>();
40    moni.board_id   = rng.random::<u8>();
41    moni
42  } 
43} 
44
45impl Default for TrackerGpsMoniData {
46  fn default() -> Self {
47    Self::new()
48  }
49}
50
51impl Serialization for TrackerGpsMoniData { 
52
53  fn from_bytestream(stream : &Vec<u8>,
54                     pos    : &mut usize)
55    -> Result<Self, SerializationError> {
56    if stream.len() < Self::SIZE {
57      return Err(SerializationError::StreamTooShort);
58    }
59    let mut moni = Self::new();
60    moni.daq_header = TrackerHeader::from_bytestream(stream, pos)?;
61    *pos += 1; // there is one empty byte
62    moni.utc_time   = parse_u32(stream, pos);
63    moni.gps_info   = parse_u8(stream, pos);
64    Ok(moni)
65  }
66}
67
68impl MoniData for TrackerGpsMoniData {
69  
70  fn get_board_id(&self) -> u8 {
71    return self.board_id;
72  }
73
74  fn get_timestamp(&self) -> u64 {
75    self.timestamp 
76  }
77
78  fn set_timestamp(&mut self, ts: u64) {
79    self.timestamp = ts;
80  }
81
82  fn keys() -> Vec<&'static str> {
83    vec!["board_id", "utc_time", 
84         "gps_info",
85         "timestamp"]
86  }
87
88  fn get(&self, varname : &str) -> Option<f32> {
89    match varname {
90      "board_id"  => Some(self.board_id as f32),
91      "utc_time"   => Some(self.utc_time as f32),
92      "gps_info"   => Some(self.gps_info as f32),
93      "timestamp" => Some(self.timestamp as f32),
94      _           => None
95    }
96  }  
97}
98
99impl TelemetryPackable for TrackerGpsMoniData {
100  const TEL_PACKET_TYPE : TelemetryPacketType = TelemetryPacketType::TrackerGps;
101}
102
103impl fmt::Display for TrackerGpsMoniData {
104  fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
105    let mut repr = String::from("<TrackerGpsMoniData: ");
106    repr        += &(format!("\n utc_time : {}", self.utc_time));
107    repr        += &(format!("\n gps_info : {}>", self.gps_info));
108    write!(f, "{}", repr)
109  }
110}
111
112
113moniseries_telemetry!(TrackerGpsMoniDataSeries, TrackerGpsMoniData);
114
115#[cfg(feature="pybindings")]
116pythonize_monidata!(TrackerGpsMoniData);
117
118#[cfg(feature="pybindings")]
119pythonize_telemetry_only!(TrackerGpsMoniData);