use std::{ffi::c_int, ptr, time::Duration};
use crate::{bindings::*, device::Device, object::MapperObject, signal::Signal, util::read_list};
pub struct Graph {
pub(crate) handle: mpr_graph,
owned: bool
}
unsafe impl Send for Graph {}
unsafe impl Sync for Graph {}
impl Graph {
pub fn create() -> Graph {
Graph {
owned: true,
handle: unsafe { mpr_graph_new(0) }
}
}
}
impl Drop for Graph {
fn drop(&mut self) {
if self.owned {
unsafe {
mpr_graph_free(self.handle);
}
}
}
}
impl Graph {
pub fn poll(&self) {
unsafe {
mpr_graph_poll(self.handle, 0);
}
}
pub fn poll_and_block(&self, time: Duration) {
unsafe {
mpr_graph_poll(self.handle, time.as_millis() as c_int);
}
}
pub fn subscribe(&self, device: Option<Device>, types: &[mpr_type]) {
unsafe {
let types_bitflag = types.iter()
.map(|t| *t as i32)
.fold(0, |acc, t| acc | t);
mpr_graph_subscribe(self.handle, device.map(|d| d.handle).unwrap_or(ptr::null_mut()), types_bitflag, -1);
}
}
pub fn get_devices<'a>(&'a self) -> Vec<Device<'a>> {
let ptr = unsafe {
mpr_graph_get_list(self.handle, mpr_type::MPR_DEV as i32)
};
read_list(ptr, |ptr| {
Device {
handle: ptr,
owned: false,
graph: Some(&self)
}
})
}
}
pub struct Map {
pub(crate) handle: mpr_map,
pub(crate) owned: bool
}
impl Map {
pub fn create(src: &Signal, dst: &Signal) -> Map {
Map {
handle: unsafe { mpr_map_new(1, &src.handle, 1, &dst.handle) },
owned: true
}
}
pub fn push(&self) {
unsafe {
mpr_obj_push(self.handle);
}
}
pub fn is_ready(&self) -> bool {
unsafe {
mpr_map_get_is_ready(self.handle) != 0
}
}
pub fn release(self) {
if !self.owned {
return;
}
unsafe {
mpr_map_release(self.handle)
}
}
pub fn set_expr(&self, expression: &str) {
self.set_property_str(mpr_prop::MPR_PROP_EXPR, expression);
}
}