liftof_rb/threads/
monitoring.rsuse std::time::{
Duration,
Instant
};
use std::sync::{
Arc,
Mutex,
};
use std::thread;
use crossbeam_channel::Sender;
use tof_dataclasses::errors::SensorError;
use tof_dataclasses::serialization::Packable;
use tof_dataclasses::monitoring::{
RBMoniData,
PAMoniData,
PBMoniData,
LTBMoniData,
};
use tof_dataclasses::packets::TofPacket;
use liftof_lib::thread_control::ThreadControl;
use tof_control::helper::pb_type::{
PBTemp,
PBVcp,
};
use tof_control::helper::pa_type::{
PATemp,
PAReadBias,
};
use tof_control::helper::ltb_type::{
LTBTemp,
LTBThreshold,
};
use tof_control::helper::rb_type::{
RBTemp,
RBMag,
RBVcp,
RBPh,
};
use crate::control::{
get_trigger_rate
};
pub fn monitoring(board_id : u8,
tp_sender : &Sender<TofPacket>,
rb_moni_interval : f32,
pa_moni_every_x : f32,
pb_moni_every_x : f32,
ltb_moni_every_x : f32,
verbose : bool,
thread_control : Arc<Mutex<ThreadControl>>) {
println!("[MONI] ==> Starting monitoring thread!");
let mut rb_moni_timer = Instant::now();
let mut pa_moni_timer = Instant::now();
let mut pb_moni_timer = Instant::now();
let mut ltb_moni_timer = Instant::now();
let mut sleeptime_sec = rb_moni_interval;
if pa_moni_every_x*rb_moni_interval < sleeptime_sec {
sleeptime_sec = pa_moni_every_x*rb_moni_interval;
}
if pb_moni_every_x*rb_moni_interval < sleeptime_sec {
sleeptime_sec = pb_moni_every_x*rb_moni_interval;
}
if ltb_moni_every_x*rb_moni_interval < sleeptime_sec {
sleeptime_sec = ltb_moni_every_x*rb_moni_interval;
}
debug!("Setting sleeptime to {} seconds!", sleeptime_sec);
let sleeptime = Duration::from_secs_f32(sleeptime_sec);
loop {
match thread_control.lock() {
Ok(tc) => {
if tc.stop_flag {
println!("[MONI] ==> Received STOP signal. Will end thread!");
info!("Received stop signal. Will stop thread!");
break;
}
},
Err(err) => {
trace!("Can't acquire lock! {err}");
},
}
if rb_moni_timer.elapsed().as_secs_f32() > rb_moni_interval {
let moni_dt = get_rb_moni(board_id).unwrap();
if verbose {
println!("{}", moni_dt);
}
let tp = moni_dt.pack();
match tp_sender.try_send(tp) {
Err(err) => error!("Issue sending RBMoniData {:?}", err),
Ok(_) => trace!("Sent RBMoniData successfully!"),
}
rb_moni_timer = Instant::now();
}
if pa_moni_timer.elapsed().as_secs_f32() > rb_moni_interval*pa_moni_every_x {
let moni = get_preamp_moni(board_id).unwrap();
if verbose {
println!("{}", moni);
}
let tp = moni.pack();
match tp_sender.try_send(tp) {
Err(err) => error!("Issue sending PAMoniData {:?}", err),
Ok(_) => trace!("Sent PAMoniData successfully!"),
}
pa_moni_timer = Instant::now();
}
if pb_moni_timer.elapsed().as_secs_f32() > rb_moni_interval*pb_moni_every_x {
let moni = get_pb_moni(board_id).unwrap();
if verbose {
println!("{}", moni);
}
let tp = moni.pack();
match tp_sender.try_send(tp) {
Err(err) => error!("Issue sending PBMoniData {:?}", err),
Ok(_) => trace!("Sent PBMoniData successfully!"),
}
pb_moni_timer = Instant::now();
}
if ltb_moni_timer.elapsed().as_secs_f32() > rb_moni_interval*ltb_moni_every_x {
let moni = get_ltb_moni(board_id).unwrap();
if verbose {
println!("{}", moni);
}
let tp = moni.pack();
match tp_sender.try_send(tp) {
Err(err) => error!("Issue sending LTBMoniData {:?}", err),
Ok(_) => debug!("Sent LTBMoniData successfully!"),
}
ltb_moni_timer = Instant::now();
}
thread::sleep(sleeptime);
}
}
pub fn get_rb_moni(board_id: u8) -> Result<RBMoniData, SensorError> {
let mut moni_dt = RBMoniData::new();
moni_dt.board_id = board_id;
let rb_temp = RBTemp::new();
let rb_mag = RBMag::new();
let rb_vcp = RBVcp::new();
let rb_ph = RBPh::new();
moni_dt.add_rbtemp(&rb_temp);
moni_dt.add_rbmag(&rb_mag);
moni_dt.add_rbvcp(&rb_vcp);
moni_dt.add_rbph(&rb_ph);
let rate_query = get_trigger_rate();
match rate_query {
Ok(rate) => {
debug!("Monitoring thread -> Rate: {rate}Hz ");
moni_dt.rate = rate as u16;
},
Err(_) => {
warn!("Can not send rate monitoring packet, register problem");
}
}
Ok(moni_dt)
}
pub fn get_preamp_moni(board_id: u8) -> Result<PAMoniData, SensorError> {
let mut moni = PAMoniData::new();
moni.board_id = board_id;
let pa_tmp = PATemp::new();
let pa_bia = PAReadBias::new();
moni.add_temps(&pa_tmp);
moni.add_biases(&pa_bia);
Ok(moni)
}
pub fn get_pb_moni(board_id: u8) -> Result<PBMoniData, SensorError> {
let mut moni = PBMoniData::new();
moni.board_id = board_id;
let pb_temp = PBTemp::new();
let pb_vcp = PBVcp::new();
moni.add_temps(&pb_temp);
moni.add_vcp(&pb_vcp);
Ok(moni)
}
pub fn get_ltb_moni(board_id: u8) -> Result<LTBMoniData, SensorError> {
let mut moni = LTBMoniData::new();
moni.board_id = board_id;
let ltb_temp = LTBTemp::new();
let ltb_thrs = LTBThreshold::new();
moni.add_temps(<b_temp);
moni.add_thresh(<b_thrs);
Ok(moni)
}