Skip to main content

shapes_demo_subscriber/
shapes_demo_subscriber.rs

1//! ShapesDemo-Subscriber — liest ShapeType-Samples auf einem der
2//! Standard-ShapesDemo-Topics und druckt sie.
3//!
4//! Interop-Ziel: Samples eines laufenden Cyclone-, Fast-DDS- oder
5//! RTI-ShapesDemo-Publishers empfangen und korrekt dekodieren.
6
7#![allow(clippy::print_stdout, clippy::print_stderr)]
8
9use std::env;
10use std::time::Duration;
11
12use zerodds_dcps::interop::ShapeType;
13use zerodds_dcps::{
14    DataReaderQos, DdsError, DomainParticipantFactory, DomainParticipantQos, SubscriberQos,
15    TopicQos,
16};
17
18fn main() -> Result<(), Box<dyn std::error::Error>> {
19    let args: Vec<String> = env::args().collect();
20    let topic_name = args.get(1).map_or("Square", String::as_str);
21    let domain_id: i32 = args.get(2).and_then(|s| s.parse().ok()).unwrap_or(0);
22
23    let factory = DomainParticipantFactory::instance();
24    let participant = factory.create_participant(domain_id, DomainParticipantQos::default())?;
25    let topic = participant.create_topic::<ShapeType>(topic_name, TopicQos::default())?;
26    let subscriber = participant.create_subscriber(SubscriberQos::default());
27    let reader = subscriber.create_datareader::<ShapeType>(&topic, DataReaderQos::default())?;
28
29    println!("shapes_demo_subscriber: Topic={topic_name} Domain={domain_id} — Ctrl-C to stop");
30
31    loop {
32        match reader.wait_for_data(Duration::from_secs(1)) {
33            Ok(()) => {
34                for sample in reader.take()? {
35                    println!(
36                        "  <- color={:8} x={:4} y={:4} size={}",
37                        sample.color, sample.x, sample.y, sample.shapesize
38                    );
39                }
40            }
41            Err(DdsError::Timeout) => {}
42            Err(e) => return Err(e.into()),
43        }
44    }
45}