gondola_core/monitoring/
rb_moni_data.rs

1// This file is part of gaps-online-software and published 
2// under the GPLv3 license
3
4use crate::prelude::*;
5
6#[cfg(feature="tofcontrol")]
7use tof_control::helper::rb_type::{
8  RBMag,
9  RBTemp,
10  RBPh,
11  RBVcp
12};
13
14/// Sensors on the individual RB
15///  
16/// This includes temperatures, power data,
17/// pressure, humidity
18/// as well as the magnetic sensors
19#[derive(Debug, Copy, Clone, PartialEq)]
20#[cfg_attr(feature="pybindings", pyclass)]
21pub struct RBMoniData {
22  pub board_id           : u8,
23  pub rate               : u16,
24  pub tmp_drs            : f32,
25  pub tmp_clk            : f32,
26  pub tmp_adc            : f32,
27  pub tmp_zynq           : f32,
28  pub tmp_lis3mdltr      : f32,
29  pub tmp_bm280          : f32,
30  pub pressure           : f32,
31  pub humidity           : f32,
32  pub mag_x              : f32,
33  pub mag_y              : f32,
34  pub mag_z              : f32,
35  pub drs_dvdd_voltage   : f32, 
36  pub drs_dvdd_current   : f32,
37  pub drs_dvdd_power     : f32,
38  pub p3v3_voltage       : f32,
39  pub p3v3_current       : f32,
40  pub p3v3_power         : f32,
41  pub zynq_voltage       : f32,
42  pub zynq_current       : f32,
43  pub zynq_power         : f32,
44  pub p3v5_voltage       : f32, 
45  pub p3v5_current       : f32,
46  pub p3v5_power         : f32,
47  pub adc_dvdd_voltage   : f32,
48  pub adc_dvdd_current   : f32,
49  pub adc_dvdd_power     : f32,
50  pub adc_avdd_voltage   : f32,
51  pub adc_avdd_current   : f32,
52  pub adc_avdd_power     : f32,
53  pub drs_avdd_voltage   : f32, 
54  pub drs_avdd_current   : f32,
55  pub drs_avdd_power     : f32,
56  pub n1v5_voltage       : f32,
57  pub n1v5_current       : f32,
58  pub n1v5_power         : f32,
59  // new - we add the t
60  // Won't get serialized, but can be filled 
61  // with the gcutime down the road for plotting
62  pub timestamp          : u64
63}
64
65impl RBMoniData {
66  
67  pub fn new() -> Self {
68    Self {
69      board_id           : 0, 
70      rate               : 0,
71      tmp_drs            : f32::MAX,
72      tmp_clk            : f32::MAX,
73      tmp_adc            : f32::MAX,
74      tmp_zynq           : f32::MAX,
75      tmp_lis3mdltr      : f32::MAX,
76      tmp_bm280          : f32::MAX,
77      pressure           : f32::MAX,
78      humidity           : f32::MAX,
79      mag_x              : f32::MAX,
80      mag_y              : f32::MAX,
81      mag_z              : f32::MAX,
82      drs_dvdd_voltage   : f32::MAX, 
83      drs_dvdd_current   : f32::MAX,
84      drs_dvdd_power     : f32::MAX,
85      p3v3_voltage       : f32::MAX,
86      p3v3_current       : f32::MAX,
87      p3v3_power         : f32::MAX,
88      zynq_voltage       : f32::MAX,
89      zynq_current       : f32::MAX,
90      zynq_power         : f32::MAX,
91      p3v5_voltage       : f32::MAX, 
92      p3v5_current       : f32::MAX,
93      p3v5_power         : f32::MAX,
94      adc_dvdd_voltage   : f32::MAX,
95      adc_dvdd_current   : f32::MAX,
96      adc_dvdd_power     : f32::MAX,
97      adc_avdd_voltage   : f32::MAX,
98      adc_avdd_current   : f32::MAX,
99      adc_avdd_power     : f32::MAX,
100      drs_avdd_voltage   : f32::MAX, 
101      drs_avdd_current   : f32::MAX,
102      drs_avdd_power     : f32::MAX,
103      n1v5_voltage       : f32::MAX,
104      n1v5_current       : f32::MAX,
105      n1v5_power         : f32::MAX,
106      timestamp          : 0,
107    }
108  }
109
110  #[cfg(feature = "tofcontrol")]
111  pub fn add_rbvcp(&mut self, rb_vcp   : &RBVcp) {
112    self.drs_dvdd_voltage = rb_vcp.drs_dvdd_vcp[0] ;
113    self.drs_dvdd_current = rb_vcp.drs_dvdd_vcp[1] ;
114    self.drs_dvdd_power   = rb_vcp.drs_dvdd_vcp[2] ;
115    self.p3v3_voltage     = rb_vcp.p3v3_vcp[0]  ;
116    self.p3v3_current     = rb_vcp.p3v3_vcp[1]  ;
117    self.p3v3_power       = rb_vcp.p3v3_vcp[2]  ;
118    self.zynq_voltage     = rb_vcp.zynq_vcp[0]  ;
119    self.zynq_current     = rb_vcp.zynq_vcp[1]  ;
120    self.zynq_power       = rb_vcp.zynq_vcp[2]  ;
121    self.p3v5_voltage     = rb_vcp.p3v5_vcp[0]  ;
122    self.p3v5_current     = rb_vcp.p3v5_vcp[1]  ;
123    self.p3v5_power       = rb_vcp.p3v5_vcp[2]  ;
124    self.adc_dvdd_voltage = rb_vcp.adc_dvdd_vcp[0] ;
125    self.adc_dvdd_current = rb_vcp.adc_dvdd_vcp[1] ;
126    self.adc_dvdd_power   = rb_vcp.adc_dvdd_vcp[2] ;
127    self.adc_avdd_voltage = rb_vcp.adc_avdd_vcp[0]  ;
128    self.adc_avdd_current = rb_vcp.adc_avdd_vcp[1]  ;
129    self.adc_avdd_power   = rb_vcp.adc_avdd_vcp[2]  ;
130    self.drs_avdd_voltage = rb_vcp.drs_avdd_vcp[0]  ;
131    self.drs_avdd_current = rb_vcp.drs_avdd_vcp[1]  ;
132    self.drs_avdd_power   = rb_vcp.drs_avdd_vcp[2]  ;
133    self.n1v5_voltage     = rb_vcp.n1v5_vcp[0]      ;
134    self.n1v5_current     = rb_vcp.n1v5_vcp[1]      ;
135    self.n1v5_power       = rb_vcp.n1v5_vcp[2]      ;
136  }
137  
138  #[cfg(feature = "tofcontrol")] 
139  pub fn add_rbph(&mut self, rb_ph   : &RBPh) {
140    self.pressure = rb_ph.pressure;
141    self.humidity = rb_ph.humidity;
142  }
143  #[cfg(feature = "tofcontrol")]
144  pub fn add_rbtemp(&mut self, rb_temp : &RBTemp) {
145    self.tmp_drs         = rb_temp.drs_temp      ; 
146    self.tmp_clk         = rb_temp.clk_temp      ; 
147    self.tmp_adc         = rb_temp.adc_temp      ; 
148    self.tmp_zynq        = rb_temp.zynq_temp     ; 
149    self.tmp_lis3mdltr   = rb_temp.lis3mdltr_temp; 
150    self.tmp_bm280       = rb_temp.bme280_temp   ; 
151  }
152
153  #[cfg(feature = "tofcontrol")] 
154  pub fn add_rbmag(&mut self, rb_mag   : &RBMag) {
155    self.mag_x   = rb_mag.mag_xyz[0];
156    self.mag_y   = rb_mag.mag_xyz[1];
157    self.mag_z   = rb_mag.mag_xyz[2];
158  }
159 
160  pub fn get_mag_tot(&self) -> f32 {
161    (self.mag_x.powi(2) + self.mag_y.powi(2) + self.mag_z.powi(2)).sqrt()
162  }
163}
164
165impl Default for RBMoniData {
166  fn default() -> Self {
167    Self::new()
168  }
169}
170
171impl fmt::Display for RBMoniData {
172  fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
173    write!(f, "<RBMoniData:
174  BOARD ID       {}
175  RATE           {}    [Hz] 
176  ** Temperatures **
177  DRS TMP        {:.3} [\u{00B0}C]
178  CLK TMP        {:.3} [\u{00B0}C]
179  ADC TMP        {:.3} [\u{00B0}C]
180  ZYNQ TMP       {:.3} [\u{00B0}C]
181  LIS3MDLTR TMP  {:.3} [\u{00B0}C]  
182  BM280 TMP      {:.3} [\u{00B0}C]
183  ** Ambience **
184  PRESSURE       {:.3} [hPa]
185  HUMIDITY       {:.3} [%]
186  MAG_X , MAG_Y, MAG_Z, MAG_TOT:
187   |->  {:.3} [G] | {:.3} [G] | {:.3} [G] | {:.3} [G]
188  ** Power **
189  ZYNQ 3.3V         Power:  {:.3}  [V] | {:.3} [A] | {:.3} [W]
190  3.3V              Power:  {:.3}  [V] | {:.3} [A] | {:.3} [W]
191  3.5V              Power:  {:.3}  [V] | {:.3} [A] | {:.3} [W]
192  -1.5V             Power: {:.3}  [V] | {:.3} [A] | {:.3} [W]
193  DRS4 Digital 2.5V Power:  {:.3}  [V] | {:.3} [A] | {:.3} [W]
194  DRS4 Analog 2.5V  Power:  {:.3}  [V] | {:.3} [A] | {:.3} [W]
195  ADC Digital 2.5V  Power:  {:.3}  [V] | {:.3} [A] | {:.3} [W]
196  ADC Analog 3.0V   Power:  {:.3}  [V] | {:.3} [A] | {:.3} [W]>",
197           self.board_id        , 
198           self.rate            ,
199           self.tmp_drs         ,
200           self.tmp_clk         ,
201           self.tmp_adc         ,
202           self.tmp_zynq        ,
203           self.tmp_lis3mdltr   ,
204           self.tmp_bm280       ,
205           self.pressure        ,
206           self.humidity        ,
207           self.mag_x           ,
208           self.mag_y           ,
209           self.mag_z           ,
210           self.get_mag_tot()   ,
211           self.zynq_voltage    ,
212           self.zynq_current    ,
213           self.zynq_power      ,
214           self.p3v3_voltage    ,
215           self.p3v3_current    ,
216           self.p3v3_power      ,
217           self.p3v5_voltage    , 
218           self.p3v5_current    ,
219           self.p3v5_power      ,
220           self.n1v5_voltage    ,
221           self.n1v5_current    ,
222           self.n1v5_power      ,
223           self.drs_dvdd_voltage, 
224           self.drs_dvdd_current,
225           self.drs_dvdd_power  ,
226           self.drs_avdd_voltage, 
227           self.drs_avdd_current,
228           self.drs_avdd_power  ,
229           self.adc_dvdd_voltage,
230           self.adc_dvdd_current,
231           self.adc_dvdd_power  ,
232           self.adc_avdd_voltage,
233           self.adc_avdd_current,
234           self.adc_avdd_power  )
235  }
236}
237
238impl MoniData for RBMoniData {
239
240  fn get_timestamp(&self) -> u64 {
241    self.timestamp
242  }
243
244  fn set_timestamp(&mut self, ts : u64) {
245    self.timestamp = ts 
246  }
247
248  fn get_board_id(&self) -> u8 {
249    self.board_id
250  }
251  
252  /// Access the (data) members by name 
253  fn get(&self, varname : &str) -> Option<f32> {
254    match varname {
255      "board_id"         => Some(self.board_id as   f32),
256      "rate"             => Some(self.rate as f32      ), 
257      "tmp_drs"          => Some(self.tmp_drs          ), 
258      "tmp_clk"          => Some(self.tmp_clk          ), 
259      "tmp_adc"          => Some(self.tmp_adc          ), 
260      "tmp_zynq"         => Some(self.tmp_zynq         ), 
261      "tmp_lis3mdltr"    => Some(self.tmp_lis3mdltr    ), 
262      "tmp_bm280"        => Some(self.tmp_bm280        ), 
263      "pressure"         => Some(self.pressure         ), 
264      "humidity"         => Some(self.humidity         ), 
265      "mag_x"            => Some(self.mag_x            ), 
266      "mag_y"            => Some(self.mag_y            ), 
267      "mag_z"            => Some(self.mag_z            ), 
268      "mag_tot"          => Some(self.get_mag_tot()    ),
269      "drs_dvdd_voltage" => Some(self.drs_dvdd_voltage ), 
270      "drs_dvdd_current" => Some(self.drs_dvdd_current ), 
271      "drs_dvdd_power"   => Some(self.drs_dvdd_power   ), 
272      "p3v3_voltage"     => Some(self.p3v3_voltage     ), 
273      "p3v3_current"     => Some(self.p3v3_current     ), 
274      "p3v3_power"       => Some(self.p3v3_power       ), 
275      "zynq_voltage"     => Some(self.zynq_voltage     ), 
276      "zynq_current"     => Some(self.zynq_current     ), 
277      "zynq_power"       => Some(self.zynq_power       ), 
278      "p3v5_voltage"     => Some(self.p3v5_voltage     ), 
279      "p3v5_current"     => Some(self.p3v5_current     ), 
280      "p3v5_power"       => Some(self.p3v5_power       ), 
281      "adc_dvdd_voltage" => Some(self.adc_dvdd_voltage ), 
282      "adc_dvdd_current" => Some(self.adc_dvdd_current ), 
283      "adc_dvdd_power"   => Some(self.adc_dvdd_power   ), 
284      "adc_avdd_voltage" => Some(self.adc_avdd_voltage ), 
285      "adc_avdd_current" => Some(self.adc_avdd_current ), 
286      "adc_avdd_power"   => Some(self.adc_avdd_power   ), 
287      "drs_avdd_voltage" => Some(self.drs_avdd_voltage ), 
288      "drs_avdd_current" => Some(self.drs_avdd_current ), 
289      "drs_avdd_power"   => Some(self.drs_avdd_power   ), 
290      "n1v5_voltage"     => Some(self.n1v5_voltage     ), 
291      "n1v5_current"     => Some(self.n1v5_current     ), 
292      "n1v5_power"       => Some(self.n1v5_power       ),
293      "timestamp"        => Some(self.timestamp  as f32),
294      _             => None
295    }
296  }
297
298  /// A list of the variables in this MoniData
299  fn keys() -> Vec<&'static str> {
300    vec![
301      "board_id"        , 
302      "rate"            , 
303      "tmp_drs"         , 
304      "tmp_clk"         , 
305      "tmp_adc"         , 
306      "tmp_zynq"        , 
307      "tmp_lis3mdltr"   , 
308      "tmp_bm280"       , 
309      "pressure"        , 
310      "humidity"        , 
311      "mag_x"           , 
312      "mag_y"           , 
313      "mag_z"           , 
314      "drs_dvdd_voltage", 
315      "drs_dvdd_current", 
316      "drs_dvdd_power"  , 
317      "p3v3_voltage"    , 
318      "p3v3_current"    , 
319      "p3v3_power"      , 
320      "zynq_voltage"    , 
321      "zynq_current"    , 
322      "zynq_power"      , 
323      "p3v5_voltage"    , 
324      "p3v5_current"    , 
325      "p3v5_power"      , 
326      "adc_dvdd_voltage", 
327      "adc_dvdd_current", 
328      "adc_dvdd_power"  , 
329      "adc_avdd_voltage", 
330      "adc_avdd_current", 
331      "adc_avdd_power"  , 
332      "drs_avdd_voltage", 
333      "drs_avdd_current", 
334      "drs_avdd_power"  , 
335      "n1v5_voltage"    , 
336      "n1v5_current"    , 
337      "timestamp"       ,
338      "n1v5_power"      ] 
339  }
340}
341
342impl TofPackable for RBMoniData {
343  const TOF_PACKET_TYPE : TofPacketType = TofPacketType::RBMoniData;
344}
345
346impl Serialization for RBMoniData {
347  
348  const HEAD : u16 = 0xAAAA;
349  const TAIL : u16 = 0x5555;
350  /// The data size when serialized to a bytestream
351  /// This needs to be updated when we change the 
352  /// packet layout, e.g. add new members.
353  /// HEAD + TAIL + sum(sizeof(m) for m in _all_members_))
354  const SIZE : usize  = 7 + (36*4) ;
355  
356  fn to_bytestream(&self) -> Vec<u8> {
357    let mut stream = Vec::<u8>::with_capacity(Self::SIZE);
358    stream.extend_from_slice(&Self::HEAD.to_le_bytes());
359    stream.extend_from_slice(&self.board_id          .to_le_bytes()); 
360    stream.extend_from_slice(&self.rate              .to_le_bytes()); 
361    stream.extend_from_slice(&self.tmp_drs           .to_le_bytes()); 
362    stream.extend_from_slice(&self.tmp_clk           .to_le_bytes()); 
363    stream.extend_from_slice(&self.tmp_adc           .to_le_bytes()); 
364    stream.extend_from_slice(&self.tmp_zynq          .to_le_bytes()); 
365    stream.extend_from_slice(&self.tmp_lis3mdltr     .to_le_bytes()); 
366    stream.extend_from_slice(&self.tmp_bm280         .to_le_bytes()); 
367    stream.extend_from_slice(&self.pressure          .to_le_bytes()); 
368    stream.extend_from_slice(&self.humidity          .to_le_bytes()); 
369    stream.extend_from_slice(&self.mag_x             .to_le_bytes()); 
370    stream.extend_from_slice(&self.mag_y             .to_le_bytes()); 
371    stream.extend_from_slice(&self.mag_z             .to_le_bytes());
372    // padding - just for compatibility
373    stream.extend_from_slice(&0.0_f32                 .to_le_bytes());
374    stream.extend_from_slice(&self.drs_dvdd_voltage   .to_le_bytes()); 
375    stream.extend_from_slice(&self.drs_dvdd_current   .to_le_bytes()); 
376    stream.extend_from_slice(&self.drs_dvdd_power     .to_le_bytes()); 
377    stream.extend_from_slice(&self.p3v3_voltage       .to_le_bytes()); 
378    stream.extend_from_slice(&self.p3v3_current       .to_le_bytes()); 
379    stream.extend_from_slice(&self.p3v3_power         .to_le_bytes()); 
380    stream.extend_from_slice(&self.zynq_voltage       .to_le_bytes()); 
381    stream.extend_from_slice(&self.zynq_current       .to_le_bytes()); 
382    stream.extend_from_slice(&self.zynq_power         .to_le_bytes()); 
383    stream.extend_from_slice(&self.p3v5_voltage       .to_le_bytes()); 
384    stream.extend_from_slice(&self.p3v5_current       .to_le_bytes()); 
385    stream.extend_from_slice(&self.p3v5_power         .to_le_bytes()); 
386    stream.extend_from_slice(&self.adc_dvdd_voltage   .to_le_bytes()); 
387    stream.extend_from_slice(&self.adc_dvdd_current   .to_le_bytes()); 
388    stream.extend_from_slice(&self.adc_dvdd_power     .to_le_bytes()); 
389    stream.extend_from_slice(&self.adc_avdd_voltage   .to_le_bytes()); 
390    stream.extend_from_slice(&self.adc_avdd_current   .to_le_bytes()); 
391    stream.extend_from_slice(&self.adc_avdd_power     .to_le_bytes()); 
392    stream.extend_from_slice(&self.drs_avdd_voltage   .to_le_bytes()); 
393    stream.extend_from_slice(&self.drs_avdd_current   .to_le_bytes()); 
394    stream.extend_from_slice(&self.drs_avdd_power     .to_le_bytes()); 
395    stream.extend_from_slice(&self.n1v5_voltage       .to_le_bytes()); 
396    stream.extend_from_slice(&self.n1v5_current       .to_le_bytes()); 
397    stream.extend_from_slice(&self.n1v5_power         .to_le_bytes()); 
398    stream.extend_from_slice(&Self::TAIL.to_le_bytes());
399    stream
400  }
401
402  fn from_bytestream(stream    : &Vec<u8>, 
403                     pos       : &mut usize) 
404    -> Result<RBMoniData, SerializationError>{
405    let mut moni_data = Self::new();
406    Self::verify_fixed(stream, pos)?;
407    moni_data.board_id           = parse_u8( stream, pos); 
408    moni_data.rate               = parse_u16(stream, pos); 
409    moni_data.tmp_drs            = parse_f32(stream, pos); 
410    moni_data.tmp_clk            = parse_f32(stream, pos); 
411    moni_data.tmp_adc            = parse_f32(stream, pos); 
412    moni_data.tmp_zynq           = parse_f32(stream, pos); 
413    moni_data.tmp_lis3mdltr      = parse_f32(stream, pos); 
414    moni_data.tmp_bm280          = parse_f32(stream, pos); 
415    moni_data.pressure           = parse_f32(stream, pos); 
416    moni_data.humidity           = parse_f32(stream, pos); 
417    moni_data.mag_x              = parse_f32(stream, pos); 
418    moni_data.mag_y              = parse_f32(stream, pos); 
419    moni_data.mag_z              = parse_f32(stream, pos); 
420    // compatibility, no mag_tot anymore
421    *pos += 4;
422    moni_data.drs_dvdd_voltage   = parse_f32(stream, pos); 
423    moni_data.drs_dvdd_current   = parse_f32(stream, pos); 
424    moni_data.drs_dvdd_power     = parse_f32(stream, pos); 
425    moni_data.p3v3_voltage       = parse_f32(stream, pos); 
426    moni_data.p3v3_current       = parse_f32(stream, pos); 
427    moni_data.p3v3_power         = parse_f32(stream, pos); 
428    moni_data.zynq_voltage       = parse_f32(stream, pos); 
429    moni_data.zynq_current       = parse_f32(stream, pos); 
430    moni_data.zynq_power         = parse_f32(stream, pos); 
431    moni_data.p3v5_voltage       = parse_f32(stream, pos); 
432    moni_data.p3v5_current       = parse_f32(stream, pos); 
433    moni_data.p3v5_power         = parse_f32(stream, pos); 
434    moni_data.adc_dvdd_voltage   = parse_f32(stream, pos); 
435    moni_data.adc_dvdd_current   = parse_f32(stream, pos); 
436    moni_data.adc_dvdd_power     = parse_f32(stream, pos); 
437    moni_data.adc_avdd_voltage   = parse_f32(stream, pos); 
438    moni_data.adc_avdd_current   = parse_f32(stream, pos); 
439    moni_data.adc_avdd_power     = parse_f32(stream, pos); 
440    moni_data.drs_avdd_voltage   = parse_f32(stream, pos); 
441    moni_data.drs_avdd_current   = parse_f32(stream, pos); 
442    moni_data.drs_avdd_power     = parse_f32(stream, pos); 
443    moni_data.n1v5_voltage       = parse_f32(stream, pos); 
444    moni_data.n1v5_current       = parse_f32(stream, pos); 
445    moni_data.n1v5_power         = parse_f32(stream, pos); 
446    *pos += 2; // for tail
447    Ok(moni_data) 
448  }
449}
450
451#[cfg(feature = "random")]
452impl FromRandom for RBMoniData {
453    
454  fn from_random() -> RBMoniData {
455    let mut moni = RBMoniData::new();
456    let mut rng = rand::rng();
457    moni.board_id           = rng.random::<u8>(); 
458    moni.rate               = rng.random::<u16>();
459    moni.tmp_drs            = rng.random::<f32>();
460    moni.tmp_clk            = rng.random::<f32>();
461    moni.tmp_adc            = rng.random::<f32>();
462    moni.tmp_zynq           = rng.random::<f32>();
463    moni.tmp_lis3mdltr      = rng.random::<f32>();
464    moni.tmp_bm280          = rng.random::<f32>();
465    moni.pressure           = rng.random::<f32>();
466    moni.humidity           = rng.random::<f32>();
467    moni.mag_x              = rng.random::<f32>();
468    moni.mag_y              = rng.random::<f32>();
469    moni.mag_z              = rng.random::<f32>();
470    moni.drs_dvdd_voltage   = rng.random::<f32>(); 
471    moni.drs_dvdd_current   = rng.random::<f32>();
472    moni.drs_dvdd_power     = rng.random::<f32>();
473    moni.p3v3_voltage       = rng.random::<f32>();
474    moni.p3v3_current       = rng.random::<f32>();
475    moni.p3v3_power         = rng.random::<f32>();
476    moni.zynq_voltage       = rng.random::<f32>();
477    moni.zynq_current       = rng.random::<f32>();
478    moni.zynq_power         = rng.random::<f32>();
479    moni.p3v5_voltage       = rng.random::<f32>(); 
480    moni.p3v5_current       = rng.random::<f32>();
481    moni.p3v5_power         = rng.random::<f32>();
482    moni.adc_dvdd_voltage   = rng.random::<f32>();
483    moni.adc_dvdd_current   = rng.random::<f32>();
484    moni.adc_dvdd_power     = rng.random::<f32>();
485    moni.adc_avdd_voltage   = rng.random::<f32>();
486    moni.adc_avdd_current   = rng.random::<f32>();
487    moni.adc_avdd_power     = rng.random::<f32>();
488    moni.drs_avdd_voltage   = rng.random::<f32>(); 
489    moni.drs_avdd_current   = rng.random::<f32>();
490    moni.drs_avdd_power     = rng.random::<f32>();
491    moni.n1v5_voltage       = rng.random::<f32>();
492    moni.n1v5_current       = rng.random::<f32>();
493    moni.n1v5_power         = rng.random::<f32>();
494    // don't do the tiemstamp 
495    moni.timestamp          = 0;
496    moni
497  }
498}
499
500#[cfg(feature="pybindings")]
501#[pymethods]
502impl RBMoniData {
503  
504  #[getter]
505  #[pyo3(name="mag_tot")]
506  fn get_mag_tot_py(&self) -> f32 {
507    self.get_mag_tot()
508  }
509
510  #[getter]
511  fn get_rate             (&self) -> u16 {
512    self.rate
513  }
514  
515  #[getter]
516  fn get_tmp_drs          (&self) -> f32 {
517    self.tmp_drs
518  }
519  
520  #[getter]
521  fn get_tmp_clk          (&self) -> f32 {
522    self.tmp_clk
523  }
524  
525
526  #[getter]
527  fn get_tmp_adc          (&self) -> f32 {
528    self.tmp_adc
529  }
530
531  #[getter]
532  fn get_tmp_zynq         (&self) -> f32 {
533    self.tmp_zynq
534  }
535
536  #[getter]
537  fn get_tmp_lis3mdltr    (&self) -> f32 {
538    self.tmp_lis3mdltr
539  }
540
541  #[getter]
542  fn get_tmp_bm280        (&self) -> f32 {
543    self.tmp_bm280
544  }
545  
546  #[getter]
547  fn get_pressure         (&self) -> f32 {
548    self.pressure
549  }
550
551  #[getter]
552  fn get_humidity         (&self) -> f32 {
553    self.humidity
554  }
555
556  #[getter]
557  fn get_mag_x            (&self) -> f32 {
558    self.mag_x
559  }
560  
561  #[getter]
562  fn get_mag_y            (&self) -> f32 {
563    self.mag_y
564  }
565  
566  #[getter]
567  fn get_mag_z            (&self) -> f32 {
568    self.mag_z
569  }
570  
571  #[getter]
572  fn get_drs_dvdd_voltage (&self) -> f32 { 
573    self.drs_dvdd_voltage
574  }
575
576  #[getter]
577  fn get_drs_dvdd_current (&self) -> f32 {
578    self.drs_dvdd_current
579  }
580
581  #[getter]
582  fn get_drs_dvdd_power   (&self) -> f32 {
583    self.drs_dvdd_power
584  }
585
586  #[getter]
587  fn get_p3v3_voltage     (&self) -> f32 {
588    self.p3v3_voltage
589  }
590
591  #[getter]
592  fn get_p3v3_current     (&self) -> f32 {
593    self.p3v3_current
594  }
595
596  #[getter]
597  fn get_p3v3_power       (&self) -> f32 {
598    self.p3v3_power
599  }
600
601  #[getter]
602  fn get_zynq_voltage     (&self) -> f32 {
603    self.zynq_voltage
604  }
605
606  #[getter]
607  fn get_zynq_current     (&self) -> f32 {
608    self.zynq_current
609  }
610
611  #[getter]
612  fn get_zynq_power       (&self) -> f32 {
613    self.zynq_power
614  }
615
616  #[getter]
617  fn get_p3v5_voltage     (&self) -> f32 { 
618    self.p3v5_voltage
619  }
620
621  #[getter]
622  fn get_p3v5_current     (&self) -> f32 {
623    self.p3v5_current
624  }
625
626  #[getter]
627  fn get_p3v5_power       (&self) -> f32 {
628    self.p3v5_power
629  }
630
631  #[getter]
632  fn get_adc_dvdd_voltage (&self) -> f32 {
633    self.adc_dvdd_voltage
634  }
635  
636  #[getter]
637  fn get_adc_dvdd_current (&self) -> f32 {
638    self.adc_dvdd_current
639  }
640  
641  #[getter]
642  fn get_adc_dvdd_power   (&self) -> f32 {
643    self.adc_dvdd_power
644  }
645  
646  #[getter]
647  fn get_adc_avdd_voltage (&self) -> f32 {
648    self.adc_avdd_voltage
649  }
650  
651  #[getter]
652  fn get_adc_avdd_current (&self) -> f32 {
653    self.adc_avdd_current
654  }
655  
656  #[getter]
657  fn get_adc_avdd_power   (&self) -> f32 {
658    self.adc_avdd_power
659  }
660  
661  #[getter]
662  fn get_drs_avdd_voltage (&self) -> f32 { 
663    self.drs_avdd_voltage
664  }
665  
666  #[getter]
667  fn get_drs_avdd_current (&self) -> f32 {
668    self.drs_avdd_current
669  }
670  
671  #[getter]
672  fn get_drs_avdd_power   (&self) -> f32 {
673    self.drs_avdd_power
674  }
675  
676  #[getter]
677  fn get_n1v5_voltage     (&self) -> f32 {
678    self.n1v5_voltage
679  }
680  
681  #[getter]
682  fn get_n1v5_current     (&self) -> f32 {
683    self.n1v5_current
684  }
685  
686  #[getter]
687  fn get_n1v5_power       (&self) -> f32 {
688    self.n1v5_power
689  }
690
691  #[getter]
692  fn get_timestamp        (&self) -> u64 {
693    self.timestamp
694  }
695}
696
697//----------------------------------------
698
699moniseries!(RBMoniDataSeries, RBMoniData);
700
701#[cfg(feature="pybindings")]
702pythonize_packable!(RBMoniData);
703
704#[cfg(feature="pybindings")]
705pythonize_monidata!(RBMoniData);
706
707//-----------------------------------
708
709#[test]
710#[cfg(feature = "random")]
711fn monidata_rbmonidata() {
712  let data = RBMoniData::from_random();
713  for k in RBMoniData::keys() {
714    assert!(data.get(k).is_some());
715  }
716  assert_eq!(data.get_board_id(), data.board_id);
717}
718