scan_uio_buffers/
scan_uio_buffers.rs

1extern crate liftof_rb;
2
3use std::{thread, time};
4use indicatif::{ProgressBar, 
5                ProgressStyle};
6use tof_dataclasses::events::RBEvent;
7use tof_dataclasses::serialization::Serialization;
8
9use liftof_rb::control::*;
10use liftof_rb::memory::RamBuffer;
11use liftof_rb::memory::RegisterError;
12use liftof_rb::memory::map_physical_mem_read;
13#[macro_use] extern crate log;
14
15///! Return the bytes located at the memory
16pub fn get_bytestream(addr_space : &str, 
17                  addr : u32,
18                  len  : usize) -> Result<Vec::<u8>, RegisterError> {
19
20  let blobsize = RBEvent::SIZE;
21  let vec_size = blobsize*len;
22  // FIXME - allocate the vector elsewhere and 
23  // pass it by reference
24  let mut bytestream = Vec::<u8>::with_capacity(vec_size);
25
26  let sz = std::mem::size_of::<u8>();
27  let m = match map_physical_mem_read(addr_space, addr, vec_size * sz) {
28    Ok(m) => m,
29    Err(err) => {
30      println!("Failed to mmap! {:?}", err);
31      return Err(RegisterError::MMapFail);
32    }
33  };
34  let p = m.as_ptr() as *const u8;
35  (0..vec_size).for_each(|x| unsafe {
36    let value = std::ptr::read_volatile(p.offset(x as isize));
37    bytestream.push(value); // push is free, since we 
38                            // allocated the vector in the 
39                            // beginning
40  });
41  Ok(bytestream)
42}
43
44///! FIXME - should become a feature
45pub fn setup_progress_bar(msg : String, size : u64, format_string : String) -> ProgressBar {
46  let bar = ProgressBar::new(size).with_style(
47    ProgressStyle::with_template(&format_string)
48    .unwrap()
49    .progress_chars("##-"));
50  //);
51  bar.set_message(msg);
52  //bar.finish_and_clear();
53  ////let mut style_found = false;
54  //let style_ok = ProgressStyle::with_template("[{elapsed_precise}] {bar:40.cyan/blue} {pos:>7}/{len:7} {msg}");
55  //match style_ok {
56  //  Ok(_) => { 
57  //    style_found = true;
58  //  },
59  //  Err(ref err)  => { warn!("Can not go with chosen style! Not using any! Err {err}"); }
60  //}  
61  //if style_found { 
62  //  bar.set_style(style_ok.unwrap()
63  //                .progress_chars("##-"));
64  //}
65  bar
66}
67
68
69
70
71fn main() {
72  // some pre-defined time units for 
73  // sleeping
74  let two_seconds = time::Duration::from_millis(2000);
75  let one_milli   = time::Duration::from_millis(1);
76
77  //info!("Setting daq to idle mode");
78  //match idle_drs4_daq() {
79  //  Ok(_)    => info!("DRS4 set to idle:"),
80  //  Err(err) => panic!("Can't set DRS4 to idle!!")
81  //}
82  //thread::sleep(one_milli);
83  //match setup_drs4() {
84  //  Ok(_)    => info!("DRS4 setup routine complete!"),
85  //  Err(err) => panic!("Failed to setup DRS4!!")
86  //}
87
88  
89  // get the current cache sizes
90  let buf_a = RamBuffer::A;
91  let buf_b = RamBuffer::B;
92  reset_dma().unwrap();
93  thread::sleep(one_milli);
94  let buf_a_start = get_blob_buffer_occ(&buf_a).unwrap();
95  let buf_b_start = get_blob_buffer_occ(&buf_b).unwrap();
96  info!("We got start values for the blob buffers at {buf_a_start} and {buf_b_start}");
97  // now we are ready to receive data 
98  //info!("Starting daq!");
99  //match start_drs4_daq() {
100  //  Ok(_)    => info!(".. successful!"),
101  //  Err(err) => panic!("DRS4 start failed!")
102  //}
103
104  // let go for a few seconds to get a 
105  // rate estimate
106  println!("getting rate estimate..");
107  thread::sleep(two_seconds);
108  let rate = get_trigger_rate().unwrap();
109  println!("Running at a trigger rate of {rate} Hz");
110  // the trigger rate defines at what intervals 
111  // we want to print out stuff
112  // let's print out something apprx every 2
113  // seconds
114
115  // event loop
116  //let mut evt_cnt          : u32;
117  //let mut last_evt_cnt     : u32 = 0;
118
119  //let mut n_events         : u64 = 0;
120
121  //let mut skipped_events   : u64 = 0;
122  //let mut delta_events     : u64 = 0;
123
124  //let mut first_iter       = true;
125  
126  // acquire this many events
127  //let max_event : u64 = 10000;
128
129  // sizes of the buffers
130
131  match enable_trigger() {
132    Ok(_) => (),
133    Err(err) => error!("Can not enable triggers, Error {err}")
134  }
135  let mut dma_min = std::u32::MAX;
136  let mut dma_max = 0u32;
137
138  let mut buff_a_min_occ : u32 = 4294967295;
139  let mut buff_b_min_occ : u32 = 4294967295;
140  let mut buff_a_max_occ : u32 = 0;
141  let mut buff_b_max_occ : u32 = 0;
142  let mut buff_a_occ : u32;
143  let mut buff_b_occ : u32;
144  let buff_a = RamBuffer::A;
145  let buff_b = RamBuffer::B;
146  let mut n_iter = 0;
147  loop {
148    n_iter += 1;
149    //evt_cnt = get_event_count().unwrap();
150    //if first_iter {
151    //  last_evt_cnt = evt_cnt;
152    //  first_iter = false;
153    //}
154    //if evt_cnt == last_evt_cnt {
155    //  thread::sleep(one_milli);
156    //  continue;
157    //}
158    buff_a_occ  = get_blob_buffer_occ(&buff_a).unwrap();
159    buff_b_occ  = get_blob_buffer_occ(&buff_b).unwrap();
160    let dma_ptr = get_dma_pointer().unwrap();
161    //println!("{}", dma_ptr);
162    if buff_a_occ > buff_a_max_occ {
163        buff_a_max_occ = buff_a_occ;
164    }
165    if buff_a_occ < buff_a_min_occ {
166        buff_a_min_occ = buff_a_occ;
167    }
168    if buff_b_occ > buff_b_max_occ {
169        buff_b_max_occ = buff_b_occ;
170    }
171    if buff_b_occ < buff_b_min_occ {
172        buff_b_min_occ = buff_b_occ;
173    }
174    if dma_ptr > dma_max {
175        dma_max = dma_ptr;
176    }
177    if dma_ptr < dma_min {
178        dma_min = dma_ptr;
179    }
180    // let's do some work
181    if n_iter % 100000 == 0 {
182        println!("New MAX A occ {buff_a_max_occ}");
183        println!("New MIN A occ {buff_a_min_occ}");
184        println!("New MAX B occ {buff_b_max_occ}");
185        println!("New MIN B occ {buff_b_min_occ}");
186        println!("New MAX dma ptr {dma_max}");
187        println!("New MIN dma ptr {dma_min}");
188        println!("Estmated A buff size {}", buff_a_max_occ - buff_a_min_occ);
189        println!("Estmated B buff size {}", buff_b_max_occ - buff_b_min_occ);
190        println!("----- N iterations {n_iter}"); 
191    }
192  }
193} // end main