-
Notifications
You must be signed in to change notification settings - Fork 8
/
dust_dds_subscriber.rs
80 lines (68 loc) · 2.5 KB
/
dust_dds_subscriber.rs
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
use dust_dds::{
domain::domain_participant_factory::DomainParticipantFactory,
infrastructure::{
qos::{DataReaderQos, QosKind},
qos_policy::{
DurabilityQosPolicy, DurabilityQosPolicyKind, ReliabilityQosPolicy,
ReliabilityQosPolicyKind,
},
status::{StatusKind, NO_STATUS},
time::{Duration, DurationKind},
wait_set::{Condition, WaitSet},
},
subscription::sample_info::{ANY_INSTANCE_STATE, ANY_SAMPLE_STATE, ANY_VIEW_STATE},
};
mod hello_world {
include!("target/idl/hello_world.rs");
}
fn main() {
let domain_id = 0;
let participant_factory = DomainParticipantFactory::get_instance();
let participant = participant_factory
.create_participant(domain_id, QosKind::Default, None, NO_STATUS)
.unwrap();
let topic = participant
.find_topic::<hello_world::HelloWorldType>("HelloWorld", Duration::new(120, 0))
.unwrap();
let subscriber = participant
.create_subscriber(QosKind::Default, None, NO_STATUS)
.unwrap();
let reader_qos = DataReaderQos {
reliability: ReliabilityQosPolicy {
kind: ReliabilityQosPolicyKind::Reliable,
max_blocking_time: DurationKind::Finite(Duration::new(1, 0)),
},
durability: DurabilityQosPolicy {
kind: DurabilityQosPolicyKind::TransientLocal,
},
..Default::default()
};
let reader = subscriber
.create_datareader::<hello_world::HelloWorldType>(
&topic,
QosKind::Specific(reader_qos),
None,
NO_STATUS,
)
.unwrap();
let reader_cond = reader.get_statuscondition();
reader_cond
.set_enabled_statuses(&[StatusKind::SubscriptionMatched])
.unwrap();
let mut wait_set = WaitSet::new();
wait_set
.attach_condition(Condition::StatusCondition(reader_cond.clone()))
.unwrap();
wait_set.wait(Duration::new(60, 0)).unwrap();
reader_cond
.set_enabled_statuses(&[StatusKind::DataAvailable])
.unwrap();
wait_set.wait(Duration::new(30, 0)).unwrap();
let samples = reader
.read(1, ANY_SAMPLE_STATE, ANY_VIEW_STATE, ANY_INSTANCE_STATE)
.unwrap();
let hello_world = samples[0].data().unwrap();
println!("Received: {:?}", hello_world);
// Sleep to allow sending acknowledgements
std::thread::sleep(std::time::Duration::from_secs(2));
}