| @@ -62,10 +62,16 @@ impl RclClient { | |||||
| }) | }) | ||||
| } | } | ||||
| #[inline] | |||||
| pub const fn raw(&self) -> &rcl_sys::rcl_client_t { | pub const fn raw(&self) -> &rcl_sys::rcl_client_t { | ||||
| &self.r#impl | &self.r#impl | ||||
| } | } | ||||
| #[inline] | |||||
| fn raw_mut(&mut self) -> &mut rcl_sys::rcl_client_t { | |||||
| &mut self.r#impl | |||||
| } | |||||
| fn send_request<Srv>(&self, request: &Srv::Request) -> Result<i64> | fn send_request<Srv>(&self, request: &Srv::Request) -> Result<i64> | ||||
| where | where | ||||
| Srv: ServiceT, | Srv: ServiceT, | ||||
| @@ -73,7 +79,7 @@ impl RclClient { | |||||
| let mut sequence_number = 0; | let mut sequence_number = 0; | ||||
| unsafe { | unsafe { | ||||
| rcl_sys::rcl_send_request( | rcl_sys::rcl_send_request( | ||||
| &*self.r#impl, | |||||
| self.raw(), | |||||
| &request.to_raw_ref() as *const _ as *const c_void, | &request.to_raw_ref() as *const _ as *const c_void, | ||||
| &mut sequence_number, | &mut sequence_number, | ||||
| ) | ) | ||||
| @@ -93,7 +99,7 @@ impl RclClient { | |||||
| let mut response = <Srv::Response as MessageT>::Raw::default(); | let mut response = <Srv::Response as MessageT>::Raw::default(); | ||||
| unsafe { | unsafe { | ||||
| rcl_sys::rcl_take_response( | rcl_sys::rcl_take_response( | ||||
| &*self.r#impl, | |||||
| self.raw(), | |||||
| request_header.as_mut_ptr(), | request_header.as_mut_ptr(), | ||||
| &mut response as *mut _ as *mut c_void, | &mut response as *mut _ as *mut c_void, | ||||
| ) | ) | ||||
| @@ -106,7 +112,7 @@ impl RclClient { | |||||
| fn service_name(&self) -> String { | fn service_name(&self) -> String { | ||||
| unsafe { | unsafe { | ||||
| let name = rcl_sys::rcl_client_get_service_name(&*self.r#impl); | |||||
| let name = rcl_sys::rcl_client_get_service_name(self.raw()); | |||||
| String::from_c_char(name).unwrap() | String::from_c_char(name).unwrap() | ||||
| } | } | ||||
| } | } | ||||
| @@ -116,7 +122,7 @@ impl RclClient { | |||||
| unsafe { | unsafe { | ||||
| rcl_sys::rcl_service_server_is_available( | rcl_sys::rcl_service_server_is_available( | ||||
| self.node.lock().unwrap().raw(), | self.node.lock().unwrap().raw(), | ||||
| &*self.r#impl, | |||||
| self.raw(), | |||||
| &mut is_available, | &mut is_available, | ||||
| ) | ) | ||||
| .to_result() | .to_result() | ||||
| @@ -128,14 +134,14 @@ impl RclClient { | |||||
| } | } | ||||
| fn is_valid(&self) -> bool { | fn is_valid(&self) -> bool { | ||||
| unsafe { rcl_sys::rcl_client_is_valid(&*self.r#impl) } | |||||
| unsafe { rcl_sys::rcl_client_is_valid(self.raw()) } | |||||
| } | } | ||||
| } | } | ||||
| impl Drop for RclClient { | impl Drop for RclClient { | ||||
| fn drop(&mut self) { | fn drop(&mut self) { | ||||
| if let Err(e) = unsafe { | if let Err(e) = unsafe { | ||||
| rcl_sys::rcl_client_fini(&mut *self.r#impl, self.node.lock().unwrap().raw_mut()) | |||||
| rcl_sys::rcl_client_fini(self.raw_mut(), self.node.lock().unwrap().raw_mut()) | |||||
| .to_result() | .to_result() | ||||
| } { | } { | ||||
| rclrust_error!( | rclrust_error!( | ||||
| @@ -60,18 +60,24 @@ impl RclContext { | |||||
| } | } | ||||
| } | } | ||||
| #[inline] | |||||
| const fn raw(&self) -> &rcl_sys::rcl_context_t { | |||||
| &self.0 | |||||
| } | |||||
| #[inline] | |||||
| pub fn raw_mut(&mut self) -> &mut rcl_sys::rcl_context_t { | pub fn raw_mut(&mut self) -> &mut rcl_sys::rcl_context_t { | ||||
| self.0.as_mut() | |||||
| &mut self.0 | |||||
| } | } | ||||
| pub(crate) fn is_valid(&mut self) -> bool { | pub(crate) fn is_valid(&mut self) -> bool { | ||||
| unsafe { rcl_sys::rcl_context_is_valid(self.0.as_mut()) } | |||||
| unsafe { rcl_sys::rcl_context_is_valid(self.raw_mut()) } | |||||
| } | } | ||||
| fn shutdown(&mut self) -> Result<()> { | fn shutdown(&mut self) -> Result<()> { | ||||
| if self.is_valid() { | if self.is_valid() { | ||||
| unsafe { | unsafe { | ||||
| rcl_sys::rcl_shutdown(self.0.as_mut()) | |||||
| rcl_sys::rcl_shutdown(self.raw_mut()) | |||||
| .to_result() | .to_result() | ||||
| .with_context(|| "rcl_sys::rcl_shutdown in RclContext::shutdown")? | .with_context(|| "rcl_sys::rcl_shutdown in RclContext::shutdown")? | ||||
| } | } | ||||
| @@ -80,7 +86,7 @@ impl RclContext { | |||||
| } | } | ||||
| pub(crate) const fn global_arguments(&self) -> &rcl_sys::rcl_arguments_t { | pub(crate) const fn global_arguments(&self) -> &rcl_sys::rcl_arguments_t { | ||||
| &self.0.global_arguments | |||||
| &self.raw().global_arguments | |||||
| } | } | ||||
| } | } | ||||
| @@ -93,7 +99,7 @@ impl Drop for RclContext { | |||||
| e | e | ||||
| ) | ) | ||||
| } | } | ||||
| if let Err(e) = unsafe { rcl_sys::rcl_context_fini(self.0.as_mut()).to_result() } { | |||||
| if let Err(e) = unsafe { rcl_sys::rcl_context_fini(self.raw_mut()).to_result() } { | |||||
| rclrust_error!( | rclrust_error!( | ||||
| Logger::new("rclrust"), | Logger::new("rclrust"), | ||||
| "Failed to clean up rcl context handle: {}", | "Failed to clean up rcl context handle: {}", | ||||
| @@ -20,6 +20,7 @@ impl RclInitOptions { | |||||
| Ok(Self(options)) | Ok(Self(options)) | ||||
| } | } | ||||
| #[inline] | |||||
| pub const fn raw(&self) -> &rcl_sys::rcl_init_options_t { | pub const fn raw(&self) -> &rcl_sys::rcl_init_options_t { | ||||
| &self.0 | &self.0 | ||||
| } | } | ||||
| @@ -67,48 +67,50 @@ impl RclNode { | |||||
| }) | }) | ||||
| } | } | ||||
| #[inline] | |||||
| pub(crate) const fn raw(&self) -> &rcl_sys::rcl_node_t { | pub(crate) const fn raw(&self) -> &rcl_sys::rcl_node_t { | ||||
| &self.r#impl | &self.r#impl | ||||
| } | } | ||||
| pub(crate) unsafe fn raw_mut(&mut self) -> &mut rcl_sys::rcl_node_t { | |||||
| #[inline] | |||||
| pub(crate) fn raw_mut(&mut self) -> &mut rcl_sys::rcl_node_t { | |||||
| &mut self.r#impl | &mut self.r#impl | ||||
| } | } | ||||
| fn is_valid(&self) -> bool { | fn is_valid(&self) -> bool { | ||||
| unsafe { rcl_sys::rcl_node_is_valid(&*self.r#impl) } | |||||
| unsafe { rcl_sys::rcl_node_is_valid(self.raw()) } | |||||
| } | } | ||||
| fn name(&self) -> String { | fn name(&self) -> String { | ||||
| unsafe { | unsafe { | ||||
| let name = rcl_sys::rcl_node_get_name(&*self.r#impl); | |||||
| let name = rcl_sys::rcl_node_get_name(self.raw()); | |||||
| String::from_c_char(name).unwrap() | String::from_c_char(name).unwrap() | ||||
| } | } | ||||
| } | } | ||||
| fn namespace(&self) -> String { | fn namespace(&self) -> String { | ||||
| unsafe { | unsafe { | ||||
| let namespace = rcl_sys::rcl_node_get_namespace(&*self.r#impl); | |||||
| let namespace = rcl_sys::rcl_node_get_namespace(self.raw()); | |||||
| String::from_c_char(namespace).unwrap() | String::from_c_char(namespace).unwrap() | ||||
| } | } | ||||
| } | } | ||||
| pub(crate) fn fully_qualified_name(&self) -> String { | pub(crate) fn fully_qualified_name(&self) -> String { | ||||
| unsafe { | unsafe { | ||||
| let name = rcl_sys::rcl_node_get_fully_qualified_name(&*self.r#impl); | |||||
| let name = rcl_sys::rcl_node_get_fully_qualified_name(self.raw()); | |||||
| String::from_c_char(name).unwrap() | String::from_c_char(name).unwrap() | ||||
| } | } | ||||
| } | } | ||||
| fn logger_name(&self) -> String { | fn logger_name(&self) -> String { | ||||
| unsafe { | unsafe { | ||||
| let logger_name = rcl_sys::rcl_node_get_logger_name(&*self.r#impl); | |||||
| let logger_name = rcl_sys::rcl_node_get_logger_name(self.raw()); | |||||
| String::from_c_char(logger_name).unwrap() | String::from_c_char(logger_name).unwrap() | ||||
| } | } | ||||
| } | } | ||||
| pub fn get_options(&self) -> Option<&rcl_sys::rcl_node_options_t> { | pub fn get_options(&self) -> Option<&rcl_sys::rcl_node_options_t> { | ||||
| unsafe { rcl_sys::rcl_node_get_options(&*self.r#impl).as_ref() } | |||||
| unsafe { rcl_sys::rcl_node_get_options(self.raw()).as_ref() } | |||||
| } | } | ||||
| pub fn use_global_arguments(&self) -> Option<bool> { | pub fn use_global_arguments(&self) -> Option<bool> { | ||||
| @@ -6,6 +6,7 @@ pub(crate) struct RclNodeOptions(rcl_sys::rcl_node_options_t); | |||||
| unsafe impl Send for RclNodeOptions {} | unsafe impl Send for RclNodeOptions {} | ||||
| impl RclNodeOptions { | impl RclNodeOptions { | ||||
| #[inline] | |||||
| pub const fn raw(&self) -> &rcl_sys::rcl_node_options_t { | pub const fn raw(&self) -> &rcl_sys::rcl_node_options_t { | ||||
| &self.0 | &self.0 | ||||
| } | } | ||||
| @@ -54,13 +54,18 @@ impl RclPublisher { | |||||
| }) | }) | ||||
| } | } | ||||
| #[inline] | |||||
| const fn raw(&self) -> &rcl_sys::rcl_publisher_t { | |||||
| &self.r#impl | |||||
| } | |||||
| fn publish<T>(&self, message: &T) -> Result<()> | fn publish<T>(&self, message: &T) -> Result<()> | ||||
| where | where | ||||
| T: MessageT, | T: MessageT, | ||||
| { | { | ||||
| unsafe { | unsafe { | ||||
| rcl_sys::rcl_publish( | rcl_sys::rcl_publish( | ||||
| &*self.r#impl, | |||||
| self.raw(), | |||||
| &message.to_raw_ref() as *const _ as *const c_void, | &message.to_raw_ref() as *const _ as *const c_void, | ||||
| std::ptr::null_mut(), | std::ptr::null_mut(), | ||||
| ) | ) | ||||
| @@ -73,19 +78,19 @@ impl RclPublisher { | |||||
| fn topic_name(&self) -> String { | fn topic_name(&self) -> String { | ||||
| unsafe { | unsafe { | ||||
| let name = rcl_sys::rcl_publisher_get_topic_name(&*self.r#impl); | |||||
| let name = rcl_sys::rcl_publisher_get_topic_name(self.raw()); | |||||
| String::from_c_char(name).unwrap() | String::from_c_char(name).unwrap() | ||||
| } | } | ||||
| } | } | ||||
| fn is_valid(&self) -> bool { | fn is_valid(&self) -> bool { | ||||
| unsafe { rcl_sys::rcl_publisher_is_valid(&*self.r#impl) } | |||||
| unsafe { rcl_sys::rcl_publisher_is_valid(self.raw()) } | |||||
| } | } | ||||
| fn subscription_count(&self) -> Result<usize> { | fn subscription_count(&self) -> Result<usize> { | ||||
| let mut size = 0; | let mut size = 0; | ||||
| unsafe { | unsafe { | ||||
| rcl_sys::rcl_publisher_get_subscription_count(&*self.r#impl, &mut size) | |||||
| rcl_sys::rcl_publisher_get_subscription_count(self.raw(), &mut size) | |||||
| .to_result() | .to_result() | ||||
| .with_context(|| { | .with_context(|| { | ||||
| "rcl_sys::rcl_publisher_get_subscription_count in RclPublisher::subscription_count" | "rcl_sys::rcl_publisher_get_subscription_count in RclPublisher::subscription_count" | ||||
| @@ -22,7 +22,7 @@ use crate::{ | |||||
| }; | }; | ||||
| #[derive(Debug)] | #[derive(Debug)] | ||||
| pub struct RclService { | |||||
| pub(crate) struct RclService { | |||||
| r#impl: Box<rcl_sys::rcl_service_t>, | r#impl: Box<rcl_sys::rcl_service_t>, | ||||
| node: Arc<Mutex<RclNode>>, | node: Arc<Mutex<RclNode>>, | ||||
| } | } | ||||
| @@ -57,6 +57,7 @@ impl RclService { | |||||
| }) | }) | ||||
| } | } | ||||
| #[inline] | |||||
| pub const fn raw(&self) -> &rcl_sys::rcl_service_t { | pub const fn raw(&self) -> &rcl_sys::rcl_service_t { | ||||
| &self.r#impl | &self.r#impl | ||||
| } | } | ||||
| @@ -71,7 +72,7 @@ impl RclService { | |||||
| let mut request = <Srv::Request as MessageT>::Raw::default(); | let mut request = <Srv::Request as MessageT>::Raw::default(); | ||||
| unsafe { | unsafe { | ||||
| rcl_sys::rcl_take_request( | rcl_sys::rcl_take_request( | ||||
| &*self.r#impl, | |||||
| self.raw(), | |||||
| request_header.as_mut_ptr(), | request_header.as_mut_ptr(), | ||||
| &mut request as *mut _ as *mut c_void, | &mut request as *mut _ as *mut c_void, | ||||
| ) | ) | ||||
| @@ -92,7 +93,7 @@ impl RclService { | |||||
| { | { | ||||
| unsafe { | unsafe { | ||||
| rcl_sys::rcl_send_response( | rcl_sys::rcl_send_response( | ||||
| &*self.r#impl, | |||||
| self.raw(), | |||||
| response_header, | response_header, | ||||
| &response.to_raw_ref() as *const _ as *mut c_void, | &response.to_raw_ref() as *const _ as *mut c_void, | ||||
| ) | ) | ||||
| @@ -103,13 +104,13 @@ impl RclService { | |||||
| fn service_name(&self) -> String { | fn service_name(&self) -> String { | ||||
| unsafe { | unsafe { | ||||
| let name = rcl_sys::rcl_service_get_service_name(&*self.r#impl); | |||||
| let name = rcl_sys::rcl_service_get_service_name(self.raw()); | |||||
| String::from_c_char(name).unwrap() | String::from_c_char(name).unwrap() | ||||
| } | } | ||||
| } | } | ||||
| fn is_valid(&self) -> bool { | fn is_valid(&self) -> bool { | ||||
| unsafe { rcl_sys::rcl_service_is_valid(&*self.r#impl) } | |||||
| unsafe { rcl_sys::rcl_service_is_valid(self.raw()) } | |||||
| } | } | ||||
| } | } | ||||
| @@ -59,6 +59,7 @@ impl RclSubscription { | |||||
| }) | }) | ||||
| } | } | ||||
| #[inline] | |||||
| pub const fn raw(&self) -> &rcl_sys::rcl_subscription_t { | pub const fn raw(&self) -> &rcl_sys::rcl_subscription_t { | ||||
| &self.r#impl | &self.r#impl | ||||
| } | } | ||||
| @@ -70,7 +71,7 @@ impl RclSubscription { | |||||
| let mut message = T::Raw::default(); | let mut message = T::Raw::default(); | ||||
| unsafe { | unsafe { | ||||
| rcl_sys::rcl_take( | rcl_sys::rcl_take( | ||||
| &*self.r#impl, | |||||
| self.raw(), | |||||
| &mut message as *mut _ as *mut c_void, | &mut message as *mut _ as *mut c_void, | ||||
| std::ptr::null_mut(), | std::ptr::null_mut(), | ||||
| std::ptr::null_mut(), | std::ptr::null_mut(), | ||||
| @@ -84,19 +85,19 @@ impl RclSubscription { | |||||
| fn topic_name(&self) -> String { | fn topic_name(&self) -> String { | ||||
| unsafe { | unsafe { | ||||
| let topic_name = rcl_sys::rcl_subscription_get_topic_name(&*self.r#impl); | |||||
| let topic_name = rcl_sys::rcl_subscription_get_topic_name(self.raw()); | |||||
| String::from_c_char(topic_name).unwrap() | String::from_c_char(topic_name).unwrap() | ||||
| } | } | ||||
| } | } | ||||
| fn is_valid(&self) -> bool { | fn is_valid(&self) -> bool { | ||||
| unsafe { rcl_sys::rcl_subscription_is_valid(&*self.r#impl) } | |||||
| unsafe { rcl_sys::rcl_subscription_is_valid(self.raw()) } | |||||
| } | } | ||||
| fn publisher_count(&self) -> Result<usize> { | fn publisher_count(&self) -> Result<usize> { | ||||
| let mut size = 0; | let mut size = 0; | ||||
| unsafe { | unsafe { | ||||
| rcl_sys::rcl_subscription_get_publisher_count(&*self.r#impl, &mut size) | |||||
| rcl_sys::rcl_subscription_get_publisher_count(self.raw(), &mut size) | |||||
| .to_result() | .to_result() | ||||
| .with_context(|| { | .with_context(|| { | ||||
| "rcl_sys::rcl_subscription_get_publisher_count in RclSubscription::publisher_count" | "rcl_sys::rcl_subscription_get_publisher_count in RclSubscription::publisher_count" | ||||
| @@ -43,6 +43,7 @@ impl RclTimer { | |||||
| Ok(Self(timer)) | Ok(Self(timer)) | ||||
| } | } | ||||
| #[inline] | |||||
| pub const fn raw(&self) -> &rcl_sys::rcl_timer_t { | pub const fn raw(&self) -> &rcl_sys::rcl_timer_t { | ||||
| &self.0 | &self.0 | ||||
| } | } | ||||
| @@ -51,7 +52,7 @@ impl RclTimer { | |||||
| fn is_ready(&self) -> Result<bool> { | fn is_ready(&self) -> Result<bool> { | ||||
| let mut ready = false; | let mut ready = false; | ||||
| unsafe { | unsafe { | ||||
| rcl_sys::rcl_timer_is_ready(&*self.0, &mut ready) | |||||
| rcl_sys::rcl_timer_is_ready(self.raw(), &mut ready) | |||||
| .to_result() | .to_result() | ||||
| .with_context(|| "rcl_sys::rcl_timer_is_ready in RclTimer::is_ready")?; | .with_context(|| "rcl_sys::rcl_timer_is_ready in RclTimer::is_ready")?; | ||||
| } | } | ||||