use std::ffi::{CStr, CString};
use std::os::raw::c_char;
use std::str;
use super::{Error, OperationType, Result, gpiod};
#[derive(Debug, Eq, PartialEq)]
pub struct Config {
pub(crate) config: *mut gpiod::gpiod_request_config,
}
unsafe impl Send for Config {}
impl Config {
pub fn new() -> Result<Self> {
let config = unsafe { gpiod::gpiod_request_config_new() };
if config.is_null() {
return Err(Error::OperationFailed(
OperationType::RequestConfigNew,
errno::errno(),
));
}
Ok(Self { config })
}
pub fn set_consumer(&mut self, consumer: &str) -> Result<&mut Self> {
let consumer = CString::new(consumer).map_err(|_| Error::InvalidString)?;
unsafe {
gpiod::gpiod_request_config_set_consumer(
self.config,
consumer.as_ptr() as *const c_char,
)
}
Ok(self)
}
pub fn consumer(&self) -> Result<&str> {
let consumer = unsafe { gpiod::gpiod_request_config_get_consumer(self.config) };
if consumer.is_null() {
return Err(Error::OperationFailed(
OperationType::RequestConfigGetConsumer,
errno::errno(),
));
}
unsafe { CStr::from_ptr(consumer) }
.to_str()
.map_err(Error::StringNotUtf8)
}
pub fn set_event_buffer_size(&mut self, size: usize) -> &mut Self {
unsafe { gpiod::gpiod_request_config_set_event_buffer_size(self.config, size) }
self
}
pub fn event_buffer_size(&self) -> usize {
unsafe { gpiod::gpiod_request_config_get_event_buffer_size(self.config) }
}
}
impl Drop for Config {
fn drop(&mut self) {
unsafe { gpiod::gpiod_request_config_free(self.config) }
}
}