liftof_rb/threads/
monitoring.rs1use 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;
23use liftof_lib::thread_control::ThreadControl;
25
26use 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
54pub 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 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 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 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 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 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
193pub fn get_rb_moni(board_id: u8) -> Result<RBMoniData, SensorError> {
195 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
220pub fn get_preamp_moni(board_id: u8) -> Result<PAMoniData, SensorError> {
222 let mut moni = PAMoniData::new();
223 moni.board_id = board_id;
224 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
234pub 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
245pub 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(<b_temp);
252 moni.add_thresh(<b_thrs);
253 Ok(moni)
254}