gondola_core/io/caraspace/
writer.rs1use crate::prelude::*;
5
6#[cfg_attr(feature="pybindings", pyclass)]
12pub struct CRWriter {
13
14 pub file : File,
15 pub file_path : String,
17 pub pkts_per_file : usize,
22 pub mbytes_per_file : usize,
26 pub file_name : String,
27 pub run_id : u32,
28 file_id : usize,
29 n_packets : usize,
32 file_nbytes_wr : usize,
35 pub file_timestamp : Option<String>,
39}
40
41impl CRWriter {
42
43 pub fn new(mut file_path : String, run_id : u32, subrun_id : Option<u64>, timestamp : Option<String>) -> Self {
55 let file : File;
57 let file_name : String;
58 if !file_path.ends_with("/") {
59 file_path += "/";
60 }
61 let filename : String;
62 if let Some(subrun) = subrun_id {
63 filename = format!("{}{}", file_path, get_runfilename(run_id, subrun, None, timestamp));
64 } else {
65 filename = format!("{}{}", file_path, get_runfilename(run_id, 0, None, timestamp));
66 }
67 let path = Path::new(&filename);
68 println!("Writing to file {filename}");
69 file = OpenOptions::new().create(true).append(true).open(path).expect("Unable to open file {filename}");
70 file_name = filename;
71 Self {
72 file,
73 file_path : file_path,
74 pkts_per_file : 0,
75 mbytes_per_file : 420,
76 run_id : run_id,
77 file_nbytes_wr : 0,
78 file_id : 1,
79 n_packets : 0,
80 file_name : file_name,
81 file_timestamp : None,
82 }
83 }
84
85 pub fn get_file(&self, timestamp : Option<String>) -> File {
86 let file : File;
87 let filename = format!("{}{}", self.file_path, get_runfilename(self.run_id, self.file_id as u64, None, timestamp));
88 let path = Path::new(&filename);
90 info!("Writing to file {filename}");
91 file = OpenOptions::new().create(true).append(true).open(path).expect("Unable to open file {filename}");
92 file
93 }
94
95 pub fn add_frame(&mut self, frame : &CRFrame) {
99 let buffer = frame.to_bytestream();
100 self.file_nbytes_wr += buffer.len();
101 match self.file.write_all(buffer.as_slice()) {
102 Err(err) => error!("Writing to file to path {} failed! {}", self.file_path, err),
103 Ok(_) => ()
104 }
105 self.n_packets += 1;
106 let mut newfile = false;
107 if self.pkts_per_file != 0 {
108 if self.n_packets == self.pkts_per_file {
109 newfile = true;
110 self.n_packets = 0;
111 }
112 } else if self.mbytes_per_file != 0 {
113 if self.file_nbytes_wr >= self.mbytes_per_file * 1_048_576 {
115 newfile = true;
116 self.file_nbytes_wr = 0;
117 }
118 }
119 if newfile {
120 match self.file.sync_all() {
122 Err(err) => {
123 error!("Unable to sync file to disc! {err}");
124 },
125 Ok(_) => ()
126 }
127 self.file = self.get_file(self.file_timestamp.clone());
128 self.file_id += 1;
129 }
135 debug!("CRFrame written!");
136 }
137}
138
139impl Default for CRWriter {
140 fn default() -> Self {
141 CRWriter::new(String::from(""),0,None, None)
142 }
143}
144
145impl fmt::Display for CRWriter {
146 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
147 let mut repr = String::from("<CRWriter:");
148 repr += &(format!("\n path: {}", self.file_path));
149 repr += ">";
150 write!(f, "{}", repr)
151 }
152}
153
154#[cfg(feature="pybindings")]
155#[pymethods]
156impl CRWriter {
157
158 #[new]
159 #[pyo3(signature = (filename, run_id, subrun_id = None, timestamp = None))]
160 fn new_py(filename : String, run_id : u32, subrun_id : Option<u64>, timestamp : Option<String>) -> Self {
161 Self::new(filename, run_id, subrun_id, timestamp)
162 }
163
164 fn set_mbytes_per_file(&mut self, fsize : usize) {
165 self.mbytes_per_file = fsize;
166 }
167
168 fn set_file_timestamp(&mut self, timestamp : String) {
169 self.file_timestamp = Some(timestamp);
170 }
171
172 #[pyo3(name="add_frame")]
173 fn add_frame_py(&mut self, frame : CRFrame) {
174 self.add_frame(&frame);
175 }
176}
177
178#[cfg(feature="pybindings")]
179pythonize_display!(CRWriter);
180