liftof_tui/tabs/
tab_events.rs

1use std::collections::{
2  //HashMap,
3  VecDeque,
4};
5
6//use std::sync::{
7//    Arc,
8//    Mutex,
9//};
10
11use crossbeam_channel::{
12  Receiver,
13  Sender,
14};
15
16use ratatui::prelude::*;
17
18use ratatui::Frame;
19use ratatui::layout::Rect;
20use ratatui::widgets::{
21  Block,
22  BorderType,
23  Borders,
24  Paragraph,
25};
26
27//use tof_dataclasses::serialization::Serialization;
28use tof_dataclasses::errors::SerializationError;
29use tof_dataclasses::packets::TofPacket;
30use tof_dataclasses::events::{
31  RBEvent,
32  TofEvent,
33  TofHit,
34  TofEventHeader,
35  MasterTriggerEvent,
36};
37
38use crate::colors::ColorTheme;
39
40#[derive(Debug, Clone)]
41pub struct EventTab {
42  pub theme         : ColorTheme,
43  pub tp_receiver   : Receiver<TofPacket>,
44  pub event_queue   : VecDeque<TofEvent>,
45  pub queue_size    : usize,
46  pub mte_sender    : Sender<MasterTriggerEvent>,
47  pub rbe_sender    : Sender<RBEvent>,
48  pub th_sender     : Sender<TofHit>,
49  pub te_sender     : Sender<TofEvent>,
50  //pub streamer   : Arc<Mutex<VecDeque<String>>>,
51  //pub pack_stat  : Arc<Mutex<HashMap<String, usize>>>,
52  //pub stream     : String,
53  //pub stream_max : usize, 
54}
55
56impl EventTab {
57  pub fn new(tp_receiver : Receiver<TofPacket>,
58             mte_sender  : Sender<MasterTriggerEvent>,
59             rbe_sender  : Sender<RBEvent>,
60             th_sender   : Sender<TofHit>,
61             te_sender   : Sender<TofEvent>,
62             theme       : ColorTheme) -> Self {
63             //streamer  : Arc<Mutex<VecDeque<String>>>,
64             //pack_stat : Arc<Mutex<HashMap<String,usize>>>) -> HomeTab<T> {
65    Self {
66      theme,
67      tp_receiver,
68      event_queue : VecDeque::<TofEvent>::new(),
69      queue_size  : 1000,
70      mte_sender,
71      rbe_sender,  
72      th_sender,
73      te_sender
74      //streamer, 
75      //pack_stat,
76      //stream     : String::from(""),
77      //stream_max : 30,
78    }
79  }
80 
81  pub fn receive_packet(&mut self) -> Result<(), SerializationError> {  
82    match self.tp_receiver.try_recv() {
83      Err(_err) => {
84        return Ok(());
85      },
86      Ok(pack)    => {
87        let ev : TofEvent = pack.unpack()?;
88        match self.te_sender.send(ev.clone()) {
89          Err(err) => error!("Can't send TofEvent! {err}"),
90          Ok(_)    => ()
91        }
92        match self.mte_sender.send(ev.mt_event.clone()) {
93          Err(err) => error!("Can't send MasterTriggerEvent! {err}"),
94          Ok(_)    => ()
95        }
96        for k in ev.rb_events.iter() {
97          let rb_ev = k.clone();
98          for h in rb_ev.hits.iter() {
99            match self.th_sender.send(h.clone()) {
100              Err(err) => error!("Can't send TofHit! {err}"),
101              Ok(_)    => ()
102            }
103          }
104          match self.rbe_sender.send(k.clone()) {
105            Err(err) => error!("Can not send RBEvent! {err}"),
106            Ok(_)    => ()
107          }
108        }
109        self.event_queue.push_back(ev);
110        if self.event_queue.len() > self.queue_size {
111          self.event_queue.pop_front();
112        }
113        return Ok(());
114      }
115    }
116  }
117
118  pub fn render(&mut self, main_window : &Rect, frame : &mut Frame) {
119    
120    // as usual, layout first
121    let status_chunks = Layout::default()
122      .direction(Direction::Horizontal)
123      .constraints(
124          [Constraint::Percentage(30), Constraint::Percentage(70)].as_ref(),
125      )
126      .split(*main_window);
127
128    let header      = TofEventHeader::new();
129    let mut header_string = header.to_string();
130    match self.event_queue.back() {
131      None => (),
132      Some(ev)   => {
133        header_string = ev.header.to_string();
134        let info_field = format!("\n --> NRBs {}\n --> Quality: {}\n CompressionLevel {}",
135                                 ev.rb_events.len(), ev.quality, ev.compression_level);
136        header_string += &info_field;
137      }
138    }
139    let header_view = Paragraph::new(header_string)
140      .style(self.theme.style())
141      .alignment(Alignment::Left)
142      .block(
143        Block::default()
144          .borders(Borders::ALL)
145          .border_type(BorderType::Rounded)
146          .title("Last TofEvent")
147      );
148    frame.render_widget(header_view, status_chunks[0]);
149  }
150}