use std::ffi::{CStr, CString};
use std::ptr;
use crate::components::EcalComponents;
use crate::configuration::Configuration;
use crate::error::{RustecalError, check};
use crate::types::Version;
pub struct Ecal;
impl Ecal {
pub fn initialize(
unit_name: Option<&str>,
components: EcalComponents,
config: Option<&Configuration>,
) -> Result<(), RustecalError> {
let name: CString = if let Some(name) = unit_name {
CString::new(name)
.map_err(|e| RustecalError::Internal(format!("invalid unit name: {e}")))?
} else {
CString::new("").unwrap()
};
let cfg_ptr = config
.map(|c| c.as_ptr() as *mut rustecal_sys::eCAL_Configuration)
.unwrap_or(ptr::null_mut());
let ret =
unsafe { rustecal_sys::eCAL_Initialize(name.as_ptr(), &components.bits(), cfg_ptr) };
check(ret)
}
pub fn finalize() {
unsafe { rustecal_sys::eCAL_Finalize() };
}
pub fn ok() -> bool {
unsafe { rustecal_sys::eCAL_Ok() != 0 }
}
pub fn is_initialized() -> bool {
unsafe { rustecal_sys::eCAL_IsInitialized() != 0 }
}
pub fn is_component_initialized(components: EcalComponents) -> bool {
unsafe { rustecal_sys::eCAL_IsComponentInitialized(components.bits()) != 0 }
}
pub fn version_string() -> &'static str {
let ptr = unsafe { rustecal_sys::eCAL_GetVersionString() };
if ptr.is_null() {
"unknown"
} else {
unsafe { CStr::from_ptr(ptr).to_str().unwrap_or("unknown") }
}
}
pub fn version_date_string() -> &'static str {
let ptr = unsafe { rustecal_sys::eCAL_GetVersionDateString() };
if ptr.is_null() {
"unknown"
} else {
unsafe { CStr::from_ptr(ptr).to_str().unwrap_or("unknown") }
}
}
pub fn version_struct() -> Version {
unsafe { rustecal_sys::eCAL_GetVersion().into() }
}
}