liftof_rb/threads/
monitoring.rs

1use std::time::{
2    Duration,
3    Instant
4};
5use std::sync::{
6    Arc,
7    Mutex,
8};
9
10use std::thread;
11
12use crossbeam_channel::Sender;
13
14use tof_dataclasses::errors::SensorError;
15use tof_dataclasses::serialization::Packable;
16use tof_dataclasses::monitoring::{
17    RBMoniData,
18    PAMoniData,
19    PBMoniData,
20    LTBMoniData,
21};
22use tof_dataclasses::packets::TofPacket;
23//use tof_dataclasses::threading::ThreadControl;
24use liftof_lib::thread_control::ThreadControl;
25
26// Takeru's tof-control code
27use tof_control::helper::pb_type::{
28    PBTemp,
29    PBVcp,
30};
31
32use tof_control::helper::pa_type::{
33    PATemp,
34    PAReadBias,
35};
36
37use tof_control::helper::ltb_type::{
38    LTBTemp,
39    LTBThreshold,
40};
41
42use tof_control::helper::rb_type::{
43    RBTemp,
44    RBMag,
45    RBVcp,
46    RBPh,
47};
48
49use crate::control::{
50    get_trigger_rate
51};
52
53
54/// Gather monitoring data and pass it on over a channel
55///
56/// The readout of all other than the RB sensors itself
57/// (RBMoniData) is locked to the readout of the RB sensors.
58/// The readout interval of the other sensors has to be 
59/// specified in numbers of rb_moni_interval.
60///
61/// # Arguments:
62///
63/// * board_id          -  this RB's ID. It will be used
64///                        for all monitoring data as 
65///                        identifiier.
66/// * tp_sender         -  the resulting moni data will be 
67///                        wrapped in TofPackets. Use
68///                        `tp_sender` to send them to 
69///                        their destination
70/// * rb_moni_interval  -  Number of seconds between 2 consecutive
71///                        polls of RBMoniData. 
72///                        Set to 0 to disable monitoring.
73/// * pa_moni_every_x   -  Get PA (preamp) moni data every x polls of RBMoniData
74///                        Set to 0 to disable monitoring.
75/// * pb_moni_every_x   -  Get PB (power board) moni data every x polls of RBMoniData
76///                        Set to 0 to disable monitoring.
77/// * ltb_moni_every_x  -  Get LTB moni data every x polls of RBMoniData
78///                        Set to 0 to disable monitoring.
79/// * verbose           -  print additional output for debugging
80/// * thread_control    -  central thread control, e.g. kill signal
81pub fn monitoring(board_id          : u8,
82                  tp_sender         : &Sender<TofPacket>,
83                  rb_moni_interval  : f32,
84                  pa_moni_every_x   : f32,
85                  pb_moni_every_x   : f32,
86                  ltb_moni_every_x  : f32,
87                  verbose           : bool,
88                  thread_control    : Arc<Mutex<ThreadControl>>) {
89
90  println!("[MONI] ==> Starting monitoring thread!");
91
92  let mut rb_moni_timer   = Instant::now();
93  let mut pa_moni_timer   = Instant::now();
94  let mut pb_moni_timer   = Instant::now();
95  let mut ltb_moni_timer  = Instant::now();
96 
97  // we calculate some sleep time, to reduce CPU load
98  // check for the smallest interfval and use that as sleep.
99  let mut sleeptime_sec = rb_moni_interval;
100  if pa_moni_every_x*rb_moni_interval < sleeptime_sec {
101    sleeptime_sec = pa_moni_every_x*rb_moni_interval;
102  }
103  if pb_moni_every_x*rb_moni_interval < sleeptime_sec {
104    sleeptime_sec = pb_moni_every_x*rb_moni_interval;
105  }
106  if ltb_moni_every_x*rb_moni_interval < sleeptime_sec {
107    sleeptime_sec = ltb_moni_every_x*rb_moni_interval;
108  }
109  debug!("Setting sleeptime to {} seconds!", sleeptime_sec);
110  let sleeptime = Duration::from_secs_f32(sleeptime_sec);
111
112  loop {
113    match thread_control.lock() {
114      Ok(tc) => {
115        if tc.stop_flag {
116          println!("[MONI] ==> Received STOP signal. Will end thread!");
117          info!("Received stop signal. Will stop thread!");
118          break;
119        }
120      },
121      Err(err) => {
122        trace!("Can't acquire lock! {err}");
123      },
124    }
125
126    // RB monitoring routine
127    if rb_moni_timer.elapsed().as_secs_f32() > rb_moni_interval {
128      let moni_dt = get_rb_moni(board_id).unwrap();
129
130      if verbose {
131        println!("{}", moni_dt);
132      }
133
134      let tp = moni_dt.pack();
135      match tp_sender.try_send(tp) {
136        Err(err) => error!("Issue sending RBMoniData {:?}", err),
137        Ok(_)    => trace!("Sent RBMoniData successfully!"),
138      }
139      rb_moni_timer = Instant::now();
140    }
141
142    // Preamp monitoring routine
143    if pa_moni_timer.elapsed().as_secs_f32() > rb_moni_interval*pa_moni_every_x {
144      let moni = get_preamp_moni(board_id).unwrap();
145
146      if verbose {
147        println!("{}", moni);
148      }
149
150      let tp = moni.pack();
151      match tp_sender.try_send(tp) {
152        Err(err) => error!("Issue sending PAMoniData {:?}", err),
153        Ok(_)    => trace!("Sent PAMoniData successfully!"),
154      }
155      pa_moni_timer = Instant::now();
156    }
157
158    // PB monitoring routine
159    if pb_moni_timer.elapsed().as_secs_f32() > rb_moni_interval*pb_moni_every_x {
160      let moni = get_pb_moni(board_id).unwrap();
161
162      if verbose {
163        println!("{}", moni);
164      }
165
166      let tp = moni.pack();
167      match tp_sender.try_send(tp) {
168        Err(err) => error!("Issue sending PBMoniData {:?}", err),
169        Ok(_)    => trace!("Sent PBMoniData successfully!"),
170      }
171      pb_moni_timer = Instant::now();
172    }
173
174    // LTB monitoring routine
175    if ltb_moni_timer.elapsed().as_secs_f32() > rb_moni_interval*ltb_moni_every_x {
176      let moni = get_ltb_moni(board_id).unwrap();
177
178      if verbose {
179        println!("{}", moni);
180      }
181
182      let tp = moni.pack();
183      match tp_sender.try_send(tp) {
184        Err(err) => error!("Issue sending LTBMoniData {:?}", err),
185        Ok(_)    => debug!("Sent LTBMoniData successfully!"),
186      }
187      ltb_moni_timer = Instant::now();
188    }
189    thread::sleep(sleeptime);
190  }
191}
192
193/// Get RB monitoring data for a RB board_id
194pub fn get_rb_moni(board_id: u8) -> Result<RBMoniData, SensorError> {
195  // get tof-control data
196  let mut moni_dt = RBMoniData::new();
197  moni_dt.board_id = board_id; 
198  let rb_temp = RBTemp::new();
199  let rb_mag  = RBMag::new();
200  let rb_vcp  = RBVcp::new();
201  let rb_ph   = RBPh::new();
202  moni_dt.add_rbtemp(&rb_temp);
203  moni_dt.add_rbmag(&rb_mag);
204  moni_dt.add_rbvcp(&rb_vcp);
205  moni_dt.add_rbph(&rb_ph);
206  
207  let rate_query = get_trigger_rate();
208  match rate_query {
209    Ok(rate) => {
210      debug!("Monitoring thread -> Rate: {rate}Hz ");
211      moni_dt.rate = rate as u16;
212    },
213    Err(_)   => {
214      warn!("Can not send rate monitoring packet, register problem");
215    }
216  }
217  Ok(moni_dt)
218}
219
220/// Get Preamp monitoring data for an RB board_id
221pub fn get_preamp_moni(board_id: u8) -> Result<PAMoniData, SensorError> {
222  let mut moni = PAMoniData::new();
223  moni.board_id = board_id;
224  // FIXME - this won't fail, however, if there
225  // is an issue it will silently set all values
226  // to f32::MAX
227  let pa_tmp = PATemp::new();
228  let pa_bia = PAReadBias::new();
229  moni.add_temps(&pa_tmp);
230  moni.add_biases(&pa_bia);
231  Ok(moni)
232}
233
234/// Get PB monitoring data for an RB board_id
235pub fn get_pb_moni(board_id: u8) -> Result<PBMoniData, SensorError> {
236  let mut moni = PBMoniData::new();
237  moni.board_id = board_id;
238  let pb_temp = PBTemp::new();
239  let pb_vcp  = PBVcp::new();
240  moni.add_temps(&pb_temp);
241  moni.add_vcp(&pb_vcp);
242  Ok(moni)
243}
244
245/// Get LTB monitoring data for an RB board_id
246pub fn get_ltb_moni(board_id: u8) -> Result<LTBMoniData, SensorError> {
247  let mut moni = LTBMoniData::new();
248  moni.board_id = board_id;
249  let ltb_temp = LTBTemp::new();
250  let ltb_thrs = LTBThreshold::new();
251  moni.add_temps(&ltb_temp);
252  moni.add_thresh(&ltb_thrs);
253  Ok(moni)
254}