gondola_core/io/
telemetry_writer.rs1use crate::prelude::*;
5
6#[cfg_attr(feature="pybindings", pyclass)]
12pub struct TelemetryPacketWriter {
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 last_timestamp : String,
28 file_id : usize,
29 n_packets : usize,
32 file_nbytes_wr : usize,
35}
36
37#[cfg(feature="pybindings")]
38#[pymethods]
39impl TelemetryPacketWriter {
40
41#[new]
42 fn new_py(filepath : String, packet : &TelemetryPacket) -> PyResult<Self> {
43 let writer = Self::new(filepath, packet);
44 Ok(writer)
45 }
46
47 #[pyo3(name="add_telemetry_packet")]
48 pub fn add_telemetry_packet_py(&mut self, packet : &TelemetryPacket) {
49 self.add_telemetry_packet(packet);
50 }
51}
52
53impl TelemetryPacketWriter {
54
55 pub fn new(mut file_path : String, first_packet : &TelemetryPacket) -> Self {
60 let file : File;
61 let file_name : String;
62 if !file_path.ends_with("/") {
63 file_path += "/";
64 }
65 let utc_timestamp = Self::get_timestamp_from_packet(first_packet);
66 let filename = file_path.clone() + "RAW" + &utc_timestamp + ".bin";
67 let path = Path::new(&filename);
68 info!("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 let mut writer = Self {
72 file,
73 file_path : file_path,
74 pkts_per_file : 0,
75 mbytes_per_file : 420,
76 file_nbytes_wr : 0,
77 file_id : 1,
78 n_packets : 0,
79 file_name : file_name,
80 last_timestamp : utc_timestamp,
81 };
82 writer.add_telemetry_packet(first_packet);
83 writer
84 }
85
86 pub fn get_timestamp_from_packet(packet : &TelemetryPacket) -> String {
89 let gcutime = packet.header.get_gcutime();
90 get_utc_timestamp_from_unix(gcutime).unwrap_or(String::from("000000_000000"))
91 }
92
93 pub fn get_file(&self) -> File {
94 let file : File;
95 let filename = format!("{}RAW{}.bin", self.file_path, self.last_timestamp);
96 let path = Path::new(&filename);
98 info!("Writing to file {filename}");
99 file = OpenOptions::new().create(true).append(true).open(path).expect("Unable to open file {filename}");
100 file
101 }
102
103 pub fn add_telemetry_packet(&mut self, packet : &TelemetryPacket) {
107 self.last_timestamp = Self::get_timestamp_from_packet(packet);
108 let buffer = packet.to_bytestream();
109 self.file_nbytes_wr += buffer.len();
110 match self.file.write_all(buffer.as_slice()) {
111 Err(err) => error!("Writing to file to path {} failed! {}", self.file_path, err),
112 Ok(_) => ()
113 }
114 self.n_packets += 1;
115 let mut newfile = false;
116 if self.pkts_per_file != 0 {
117 if self.n_packets == self.pkts_per_file {
118 newfile = true;
119 self.n_packets = 0;
120 }
121 } else if self.mbytes_per_file != 0 {
122 if self.file_nbytes_wr >= self.mbytes_per_file * 1_048_576 {
124 newfile = true;
125 self.file_nbytes_wr = 0;
126 }
127 }
128 if newfile {
129 match self.file.sync_all() {
131 Err(err) => {
132 error!("Unable to sync file to disc! {err}");
133 },
134 Ok(_) => ()
135 }
136 self.file = self.get_file();
137 self.file_id += 1;
138 }
139 debug!("TelemetryPacket written!");
140 }
141}
142