#![warn(missing_docs)]
mod arguments;
mod client;
mod context;
mod error;
mod node;
mod parameter;
mod publisher;
mod qos;
mod service;
mod subscription;
mod wait;
mod rcl_bindings;
use std::time::Duration;
pub use arguments::*;
pub use client::*;
pub use context::*;
pub use error::*;
pub use node::*;
pub use parameter::*;
pub use publisher::*;
pub use qos::*;
use rcl_bindings::rcl_context_is_valid;
pub use rcl_bindings::rmw_request_id_t;
pub use service::*;
pub use subscription::*;
pub use wait::*;
pub fn spin_once(node: &Node, timeout: Option<Duration>) -> Result<(), RclrsError> {
let wait_set = WaitSet::new_for_node(node)?;
let ready_entities = wait_set.wait(timeout)?;
for ready_subscription in ready_entities.subscriptions {
ready_subscription.execute()?;
}
for ready_client in ready_entities.clients {
ready_client.execute()?;
}
for ready_service in ready_entities.services {
ready_service.execute()?;
}
Ok(())
}
pub fn spin(node: &Node) -> Result<(), RclrsError> {
#[cfg(ros_distro = "foxy")]
let context_is_valid =
|| unsafe { rcl_context_is_valid(&mut *node.rcl_context_mtx.lock().unwrap()) };
#[cfg(not(ros_distro = "foxy"))]
let context_is_valid =
|| unsafe { rcl_context_is_valid(&*node.rcl_context_mtx.lock().unwrap()) };
while context_is_valid() {
match spin_once(node, None) {
Ok(_)
| Err(RclrsError::RclError {
code: RclReturnCode::Timeout,
..
}) => (),
error => return error,
}
}
Ok(())
}
pub fn create_node(context: &Context, node_name: &str) -> Result<Node, RclrsError> {
Node::builder(context, node_name).build()
}
pub fn create_node_builder(context: &Context, node_name: &str) -> NodeBuilder {
Node::builder(context, node_name)
}