You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

qos.rs 4.4 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. use ::dora_ros2_bridge::rustdds::{self, policy};
  2. use pyo3::prelude::{pyclass, pymethods};
  3. /// use pyo3_special_method_derive::{Dict, Dir, Repr, Str};
  4. /// ROS2 QoS Policy
  5. ///
  6. /// :type durability: dora.Ros2Durability, optional
  7. /// :type liveliness: dora.Ros2Liveliness, optional
  8. /// :type reliable: bool, optional
  9. /// :type keep_all: bool, optional
  10. /// :type lease_duration: float, optional
  11. /// :type max_blocking_time: float, optional
  12. /// :type keep_last: int, optional
  13. /// :rtype: dora.Ros2QoSPolicies
  14. ///
  15. #[derive(Clone)]
  16. /// , Str, Repr, Dir, Dict)]
  17. #[pyclass]
  18. #[non_exhaustive]
  19. pub struct Ros2QosPolicies {
  20. pub durability: Ros2Durability,
  21. pub liveliness: Ros2Liveliness,
  22. pub lease_duration: f64,
  23. pub reliable: bool,
  24. pub max_blocking_time: f64,
  25. pub keep_all: bool,
  26. pub keep_last: i32,
  27. }
  28. #[pymethods]
  29. impl Ros2QosPolicies {
  30. #[new]
  31. #[pyo3(signature = (durability=None, liveliness=None, reliable=None, keep_all=None, lease_duration=None, max_blocking_time=None, keep_last=None))]
  32. pub fn new(
  33. durability: Option<Ros2Durability>,
  34. liveliness: Option<Ros2Liveliness>,
  35. reliable: Option<bool>,
  36. keep_all: Option<bool>,
  37. lease_duration: Option<f64>,
  38. max_blocking_time: Option<f64>,
  39. keep_last: Option<i32>,
  40. ) -> Self {
  41. Self {
  42. durability: durability.unwrap_or(Ros2Durability::Volatile),
  43. liveliness: liveliness.unwrap_or(Ros2Liveliness::Automatic),
  44. lease_duration: lease_duration.unwrap_or(f64::INFINITY),
  45. reliable: reliable.unwrap_or(false),
  46. max_blocking_time: max_blocking_time.unwrap_or(0.0),
  47. keep_all: keep_all.unwrap_or(false),
  48. keep_last: keep_last.unwrap_or(1),
  49. }
  50. }
  51. }
  52. impl From<Ros2QosPolicies> for rustdds::QosPolicies {
  53. fn from(value: Ros2QosPolicies) -> Self {
  54. rustdds::QosPolicyBuilder::new()
  55. .durability(value.durability.into())
  56. .liveliness(value.liveliness.convert(value.lease_duration))
  57. .reliability(if value.reliable {
  58. policy::Reliability::Reliable {
  59. max_blocking_time: rustdds::Duration::from_frac_seconds(
  60. value.max_blocking_time,
  61. ),
  62. }
  63. } else {
  64. policy::Reliability::BestEffort
  65. })
  66. .history(if value.keep_all {
  67. policy::History::KeepAll
  68. } else {
  69. policy::History::KeepLast {
  70. depth: value.keep_last,
  71. }
  72. })
  73. .build()
  74. }
  75. }
  76. /// DDS 2.2.3.4 DURABILITY
  77. ///
  78. /// :rtype: dora.Ros2Durability
  79. #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
  80. /// , Str, Repr, Dir, Dict)]
  81. #[pyclass(eq, eq_int)]
  82. pub enum Ros2Durability {
  83. Volatile,
  84. TransientLocal,
  85. Transient,
  86. Persistent,
  87. }
  88. /// :type value: dora.Ros2Durability
  89. /// :rtype: dora.Ros2Durability
  90. impl From<Ros2Durability> for policy::Durability {
  91. /// :type value: dora.Ros2Durability
  92. /// :rtype: dora.Ros2Durability
  93. fn from(value: Ros2Durability) -> Self {
  94. match value {
  95. Ros2Durability::Volatile => policy::Durability::Volatile,
  96. Ros2Durability::TransientLocal => policy::Durability::TransientLocal,
  97. Ros2Durability::Transient => policy::Durability::Transient,
  98. Ros2Durability::Persistent => policy::Durability::Persistent,
  99. }
  100. }
  101. }
  102. /// DDS 2.2.3.11 LIVELINESS
  103. /// :rtype: dora.Ros2Liveliness
  104. #[derive(Copy, Clone, PartialEq)]
  105. /// , Str, Repr, Dir, Dict)]
  106. #[pyclass(eq, eq_int)]
  107. pub enum Ros2Liveliness {
  108. Automatic,
  109. ManualByParticipant,
  110. ManualByTopic,
  111. }
  112. impl Ros2Liveliness {
  113. /// :type lease_duration: float
  114. /// :rtype: dora.Ros2Liveliness
  115. fn convert(self, lease_duration: f64) -> policy::Liveliness {
  116. let lease_duration = if lease_duration.is_infinite() {
  117. rustdds::Duration::INFINITE
  118. } else {
  119. rustdds::Duration::from_frac_seconds(lease_duration)
  120. };
  121. match self {
  122. Ros2Liveliness::Automatic => policy::Liveliness::Automatic { lease_duration },
  123. Ros2Liveliness::ManualByParticipant => {
  124. policy::Liveliness::ManualByParticipant { lease_duration }
  125. }
  126. Ros2Liveliness::ManualByTopic => policy::Liveliness::ManualByTopic { lease_duration },
  127. }
  128. }
  129. }