1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use rustdds::{rpc::*, *};

// This replicates SequenceNumber from DDS
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct SequenceNumber {
  number: i64,
}

impl SequenceNumber {
  pub fn new(number: i64) -> SequenceNumber {
    SequenceNumber { number }
  }

  pub fn zero() -> SequenceNumber {
    SequenceNumber::new(0)
  }

  pub fn from_high_low(high: i32, low: u32) -> SequenceNumber {
    SequenceNumber {
      number: ((high as i64) << 32) + (low as i64),
    }
  }

  pub fn high(&self) -> i32 {
    (self.number >> 32) as i32
  }

  pub fn low(&self) -> u32 {
    (self.number & 0xFFFF_FFFF) as u32
  }

  pub fn next(&self) -> SequenceNumber {
    SequenceNumber {
      number: self.number + 1,
    }
  }
}

impl Default for SequenceNumber {
  fn default() -> SequenceNumber {
    SequenceNumber::new(1) // This is consistent with RustDDS SequenceNumber
                           // default value
  }
}

impl From<SequenceNumber> for i64 {
  fn from(sn: SequenceNumber) -> i64 {
    sn.number
  }
}

impl From<rustdds::SequenceNumber> for SequenceNumber {
  fn from(sn: rustdds::SequenceNumber) -> SequenceNumber {
    SequenceNumber::new(i64::from(sn))
  }
}

/// [Original](https://docs.ros2.org/foxy/api/rmw/structrmw__request__id__t.html)
/// This structure seems to be identical in structure and function to
/// SampleIdentity defined by the RPC over DDS Spec.
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord)]
pub struct RmwRequestId {
  pub writer_guid: GUID,
  pub sequence_number: SequenceNumber,
}

impl From<RmwRequestId> for SampleIdentity {
  fn from(si: RmwRequestId) -> SampleIdentity {
    SampleIdentity {
      writer_guid: si.writer_guid,
      sequence_number: rustdds::SequenceNumber::from(i64::from(si.sequence_number)),
    }
  }
}

impl From<SampleIdentity> for RmwRequestId {
  fn from(si: SampleIdentity) -> RmwRequestId {
    RmwRequestId {
      writer_guid: si.writer_guid,
      sequence_number: SequenceNumber::from(si.sequence_number),
    }
  }
}

// [original](https://docs.ros2.org/foxy/api/rmw/structrmw__service__info__t.html)
// But where is this used?
//
// pub struct RmwServiceInfo {
//   pub source_timestamp: RmwTimePointValue,
//   pub received_timestamp: RmwTimePointValue,
//   pub request_id: RmwRequestId,
// }