use std::time::Duration;
use crate::rcl_bindings::*;
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum QoSHistoryPolicy {
SystemDefault {
depth: u32,
},
KeepLast {
depth: u32,
},
KeepAll,
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum QoSReliabilityPolicy {
SystemDefault = 0,
Reliable = 1,
BestEffort = 2,
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum QoSDurabilityPolicy {
SystemDefault = 0,
TransientLocal = 1,
Volatile = 2,
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum QoSLivelinessPolicy {
SystemDefault = 0,
Automatic = 1,
ManualByTopic = 3,
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum QoSDuration {
SystemDefault,
Infinite,
Custom(Duration),
}
#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)]
pub struct QoSProfile {
pub history: QoSHistoryPolicy,
pub reliability: QoSReliabilityPolicy,
pub durability: QoSDurabilityPolicy,
pub deadline: QoSDuration,
pub lifespan: QoSDuration,
pub liveliness: QoSLivelinessPolicy,
pub liveliness_lease_duration: QoSDuration,
pub avoid_ros_namespace_conventions: bool,
}
impl From<QoSProfile> for rmw_qos_profile_t {
fn from(qos: QoSProfile) -> Self {
Self {
history: qos.history.into(),
depth: match qos.history {
QoSHistoryPolicy::SystemDefault { depth } => depth as usize,
QoSHistoryPolicy::KeepLast { depth } => depth as usize,
QoSHistoryPolicy::KeepAll => 0,
},
reliability: qos.reliability.into(),
durability: qos.durability.into(),
deadline: qos.deadline.into(),
lifespan: qos.lifespan.into(),
liveliness: qos.liveliness.into(),
liveliness_lease_duration: qos.liveliness_lease_duration.into(),
avoid_ros_namespace_conventions: qos.avoid_ros_namespace_conventions,
}
}
}
impl From<QoSHistoryPolicy> for rmw_qos_history_policy_t {
fn from(policy: QoSHistoryPolicy) -> Self {
match policy {
QoSHistoryPolicy::SystemDefault { .. } => {
rmw_qos_history_policy_t::RMW_QOS_POLICY_HISTORY_SYSTEM_DEFAULT
}
QoSHistoryPolicy::KeepLast { .. } => {
rmw_qos_history_policy_t::RMW_QOS_POLICY_HISTORY_KEEP_LAST
}
QoSHistoryPolicy::KeepAll => rmw_qos_history_policy_t::RMW_QOS_POLICY_HISTORY_KEEP_ALL,
}
}
}
impl From<QoSReliabilityPolicy> for rmw_qos_reliability_policy_t {
fn from(policy: QoSReliabilityPolicy) -> Self {
match policy {
QoSReliabilityPolicy::SystemDefault => {
rmw_qos_reliability_policy_t::RMW_QOS_POLICY_RELIABILITY_SYSTEM_DEFAULT
}
QoSReliabilityPolicy::Reliable => {
rmw_qos_reliability_policy_t::RMW_QOS_POLICY_RELIABILITY_RELIABLE
}
QoSReliabilityPolicy::BestEffort => {
rmw_qos_reliability_policy_t::RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT
}
}
}
}
impl From<QoSDurabilityPolicy> for rmw_qos_durability_policy_t {
fn from(policy: QoSDurabilityPolicy) -> Self {
match policy {
QoSDurabilityPolicy::SystemDefault => {
rmw_qos_durability_policy_t::RMW_QOS_POLICY_DURABILITY_SYSTEM_DEFAULT
}
QoSDurabilityPolicy::TransientLocal => {
rmw_qos_durability_policy_t::RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL
}
QoSDurabilityPolicy::Volatile => {
rmw_qos_durability_policy_t::RMW_QOS_POLICY_DURABILITY_VOLATILE
}
}
}
}
impl From<QoSLivelinessPolicy> for rmw_qos_liveliness_policy_t {
fn from(policy: QoSLivelinessPolicy) -> Self {
match policy {
QoSLivelinessPolicy::SystemDefault => {
rmw_qos_liveliness_policy_t::RMW_QOS_POLICY_LIVELINESS_SYSTEM_DEFAULT
}
QoSLivelinessPolicy::Automatic => {
rmw_qos_liveliness_policy_t::RMW_QOS_POLICY_LIVELINESS_AUTOMATIC
}
QoSLivelinessPolicy::ManualByTopic => {
rmw_qos_liveliness_policy_t::RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_TOPIC
}
}
}
}
impl From<QoSDuration> for rmw_time_t {
fn from(duration: QoSDuration) -> Self {
match duration {
QoSDuration::Custom(dt) => {
let nonzero_dt = dt.max(Duration::from_nanos(1));
Self {
sec: nonzero_dt.as_secs(),
nsec: u64::from(nonzero_dt.subsec_nanos()),
}
}
QoSDuration::SystemDefault => Self { sec: 0, nsec: 0 },
QoSDuration::Infinite => Self {
sec: 9223372036,
nsec: 854775807,
},
}
}
}
pub const QOS_PROFILE_SENSOR_DATA: QoSProfile = QoSProfile {
history: QoSHistoryPolicy::KeepLast { depth: 5 },
reliability: QoSReliabilityPolicy::BestEffort,
durability: QoSDurabilityPolicy::Volatile,
deadline: QoSDuration::SystemDefault,
lifespan: QoSDuration::SystemDefault,
liveliness: QoSLivelinessPolicy::SystemDefault,
liveliness_lease_duration: QoSDuration::SystemDefault,
avoid_ros_namespace_conventions: false,
};
pub const QOS_PROFILE_PARAMETERS: QoSProfile = QoSProfile {
history: QoSHistoryPolicy::KeepLast { depth: 1000 },
reliability: QoSReliabilityPolicy::Reliable,
durability: QoSDurabilityPolicy::Volatile,
deadline: QoSDuration::SystemDefault,
lifespan: QoSDuration::SystemDefault,
liveliness: QoSLivelinessPolicy::SystemDefault,
liveliness_lease_duration: QoSDuration::SystemDefault,
avoid_ros_namespace_conventions: false,
};
pub const QOS_PROFILE_DEFAULT: QoSProfile = QoSProfile {
history: QoSHistoryPolicy::KeepLast { depth: 10 },
reliability: QoSReliabilityPolicy::Reliable,
durability: QoSDurabilityPolicy::Volatile,
deadline: QoSDuration::SystemDefault,
lifespan: QoSDuration::SystemDefault,
liveliness: QoSLivelinessPolicy::SystemDefault,
liveliness_lease_duration: QoSDuration::SystemDefault,
avoid_ros_namespace_conventions: false,
};
pub const QOS_PROFILE_SERVICES_DEFAULT: QoSProfile = QoSProfile {
history: QoSHistoryPolicy::KeepLast { depth: 10 },
reliability: QoSReliabilityPolicy::Reliable,
durability: QoSDurabilityPolicy::Volatile,
deadline: QoSDuration::SystemDefault,
lifespan: QoSDuration::SystemDefault,
liveliness: QoSLivelinessPolicy::SystemDefault,
liveliness_lease_duration: QoSDuration::SystemDefault,
avoid_ros_namespace_conventions: false,
};
pub const QOS_PROFILE_PARAMETER_EVENTS: QoSProfile = QoSProfile {
history: QoSHistoryPolicy::KeepAll,
reliability: QoSReliabilityPolicy::Reliable,
durability: QoSDurabilityPolicy::Volatile,
deadline: QoSDuration::SystemDefault,
lifespan: QoSDuration::SystemDefault,
liveliness: QoSLivelinessPolicy::SystemDefault,
liveliness_lease_duration: QoSDuration::SystemDefault,
avoid_ros_namespace_conventions: false,
};
pub const QOS_PROFILE_SYSTEM_DEFAULT: QoSProfile = QoSProfile {
history: QoSHistoryPolicy::SystemDefault { depth: 0 },
reliability: QoSReliabilityPolicy::SystemDefault,
durability: QoSDurabilityPolicy::SystemDefault,
deadline: QoSDuration::SystemDefault,
lifespan: QoSDuration::SystemDefault,
liveliness: QoSLivelinessPolicy::SystemDefault,
liveliness_lease_duration: QoSDuration::SystemDefault,
avoid_ros_namespace_conventions: false,
};