Skip to main content

hello_dds_subscriber/
hello_dds_subscriber.rs

1//! hello_dds_subscriber โ€” minimal-DDS-Subscriber, der alle Samples
2//! auf Topic "Chatter" liest und druckt.
3//!
4//! # Usage
5//!
6//! ```text
7//! # Terminal 1:
8//! cargo run -p zerodds-dcps --example hello_dds_publisher
9//! # Terminal 2:
10//! cargo run -p zerodds-dcps --example hello_dds_subscriber
11//! ```
12//!
13//! Laeuft bis Ctrl-C; nutzt `wait_for_data(1s)` als Wake-on-Sample,
14//! spart busy-polling. Der Re-Timeout von 1 s ist nur
15//! der max. Idle-Intervall โ€” bei Sample-Traffic kommt die Schleife
16//! sofort durch.
17
18#![allow(clippy::print_stdout, clippy::print_stderr)]
19
20use std::time::Duration;
21
22use zerodds_dcps::{
23    DataReaderQos, DdsError, DomainParticipantFactory, DomainParticipantQos, RawBytes,
24    SubscriberQos, TopicQos,
25};
26
27fn main() -> Result<(), Box<dyn std::error::Error>> {
28    let factory = DomainParticipantFactory::instance();
29    let participant = factory.create_participant(0, DomainParticipantQos::default())?;
30
31    let topic = participant.create_topic::<RawBytes>("Chatter", TopicQos::default())?;
32    let subscriber = participant.create_subscriber(SubscriberQos::default());
33    let reader = subscriber.create_datareader::<RawBytes>(&topic, DataReaderQos::default())?;
34
35    println!("hello_dds_subscriber: reading on Domain 0 Topic 'Chatter' โ€” Ctrl-C to stop");
36
37    loop {
38        match reader.wait_for_data(Duration::from_secs(1)) {
39            Ok(()) => {
40                for sample in reader.take()? {
41                    match std::str::from_utf8(&sample.data) {
42                        Ok(s) => println!("  <- {s}"),
43                        Err(_) => println!("  <- <{} bytes of non-UTF8>", sample.data.len()),
44                    }
45                }
46            }
47            Err(DdsError::Timeout) => {} // idle tick
48            Err(e) => return Err(e.into()),
49        }
50    }
51}