use crate::{
canmessage::CanMessageRef,
channelgroup::ChannelGroupRef,
datagroup::DataGroup,
error::{MdfError, Result},
file::MdfFile,
header::MdfHeader,
};
use mdflib_sys::*;
use std::ffi::CString;
use std::path::Path;
pub use mdflib_sys::MdfWriterType;
pub struct MdfWriter {
inner: *mut mdflib_sys::MdfWriter,
}
impl MdfWriter {
pub fn new<P: AsRef<Path>>(writer_type: MdfWriterType, path: P) -> Result<Self> {
let path_str = path.as_ref().to_str().unwrap();
let c_path = CString::new(path_str)?;
unsafe {
let writer = MdfWriterInit(writer_type, c_path.as_ptr());
if writer.is_null() {
return Err(MdfError::FileOpen(path_str.to_string()));
}
Ok(MdfWriter { inner: writer })
}
}
pub fn get_file(&self) -> Option<MdfFile> {
unsafe {
let file = MdfWriterGetFile(self.inner);
if file.is_null() {
None
} else {
Some(MdfFile::new(file))
}
}
}
pub fn get_header(&self) -> Option<MdfHeader> {
unsafe {
let header = MdfWriterGetHeader(self.inner);
if header.is_null() {
None
} else {
Some(MdfHeader::new(header))
}
}
}
pub fn is_file_new(&self) -> bool {
unsafe { MdfWriterIsFileNew(self.inner) }
}
pub fn get_compress_data(&self) -> bool {
unsafe { MdfWriterGetCompressData(self.inner) }
}
pub fn set_compress_data(&mut self, compress: bool) {
unsafe { MdfWriterSetCompressData(self.inner, compress) }
}
pub fn get_pre_trig_time(&self) -> f64 {
unsafe { MdfWriterGetPreTrigTime(self.inner) }
}
pub fn set_pre_trig_time(&mut self, pre_trig_time: f64) {
unsafe { MdfWriterSetPreTrigTime(self.inner, pre_trig_time) }
}
pub fn get_start_time(&self) -> u64 {
unsafe { MdfWriterGetStartTime(self.inner) }
}
pub fn get_stop_time(&self) -> u64 {
unsafe { MdfWriterGetStopTime(self.inner) }
}
pub fn get_bus_type(&self) -> u16 {
unsafe { MdfWriterGetBusType(self.inner) }
}
pub fn set_bus_type(&mut self, bus_type: u16) {
unsafe { MdfWriterSetBusType(self.inner, bus_type) }
}
pub fn create_bus_log_configuration(&mut self) -> bool {
unsafe { MdfWriterCreateBusLogConfiguration(self.inner) }
}
pub fn create_data_group(&mut self) -> Option<DataGroup> {
unsafe {
let dg = MdfWriterCreateDataGroup(self.inner);
if dg.is_null() {
None
} else {
Some(DataGroup::new(dg))
}
}
}
pub fn init_measurement(&mut self) -> bool {
unsafe { MdfWriterInitMeasurement(self.inner) }
}
pub fn save_sample(&mut self, group: &ChannelGroupRef, time: u64) {
unsafe { MdfWriterSaveSample(self.inner, group.inner, time) }
}
pub fn save_can_message(
&mut self,
group: &ChannelGroupRef,
time: u64,
message: &CanMessageRef,
) {
unsafe { MdfWriterSaveCanMessage(self.inner, group.inner, time, message.inner) }
}
pub fn start_measurement(&mut self, start_time: u64) {
unsafe { MdfWriterStartMeasurement(self.inner, start_time) }
}
pub fn stop_measurement(&mut self, stop_time: u64) {
unsafe { MdfWriterStopMeasurement(self.inner, stop_time) }
}
pub fn finalize_measurement(&mut self) -> bool {
unsafe { MdfWriterFinalizeMeasurement(self.inner) }
}
}
impl Drop for MdfWriter {
fn drop(&mut self) {
if !self.inner.is_null() {
unsafe {
MdfWriterUnInit(self.inner);
}
}
}
}
unsafe impl Send for MdfWriter {}
#[cfg(test)]
mod tests {
use super::*;
use tempfile::NamedTempFile;
#[test]
fn test_writer_creation() {
let temp_file = NamedTempFile::new().unwrap();
let writer = MdfWriter::new(MdfWriterType::Mdf4Basic, temp_file.path());
assert!(writer.is_ok());
}
}