use dust_dds::{
domain::domain_participant_factory::DomainParticipantFactory,
infrastructure::{
qos::{DataReaderQos, QosKind},
qos_policy::{
DurabilityQosPolicy, DurabilityQosPolicyKind, ReliabilityQosPolicy,
ReliabilityQosPolicyKind,
},
status::{NO_STATUS, StatusKind},
time::{Duration, DurationKind},
type_support::DdsType,
},
listener::NO_LISTENER,
wait_set::{Condition, WaitSet},
};
#[derive(Debug, DdsType)]
struct HelloWorldType {
#[dust_dds(key)]
id: u8,
msg: String,
}
fn main() {
let domain_id = 0;
let participant_factory = DomainParticipantFactory::get_instance();
let participant = participant_factory
.create_participant(domain_id, QosKind::Default, NO_LISTENER, NO_STATUS)
.unwrap();
let topic = participant
.create_topic::<HelloWorldType>(
"HelloWorld",
"HelloWorldType",
QosKind::Default,
NO_LISTENER,
NO_STATUS,
)
.unwrap();
let subscriber = participant
.create_subscriber(QosKind::Default, NO_LISTENER, 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::<HelloWorldType>(
&topic,
QosKind::Specific(reader_qos),
NO_LISTENER,
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_next_sample().unwrap();
println!("Received: {:?}", samples.data.unwrap());
std::thread::sleep(std::time::Duration::from_secs(2));
}