liftof_tui/tabs/
tab_events.rs1use std::collections::{
2 VecDeque,
4};
5
6use 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
27use 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 }
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 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 }
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 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}