multi_sub_node/
multi_sub_node.rs1use std::sync::Arc;
2use std::thread;
3use std::time::Duration;
4
5use serde::Deserialize;
6
7use rs_ctrl_os::{
8 init_logging, load_config_typed, start_discovery, PubSubManager, Result, TimeSynchronizer,
9};
10
11#[derive(Clone, Deserialize)]
13struct DynamicCfg {}
14
15fn main() -> Result<()> {
16 init_logging();
17
18 let config_path = std::env::args()
19 .nth(1)
20 .unwrap_or_else(|| "multi_sub_config.toml".to_string());
21
22 let (static_cfg, _dynamic) = load_config_typed::<DynamicCfg>(&config_path)?;
23
24 let time_sync = Arc::new(TimeSynchronizer::new());
25
26 let registry = start_discovery(
28 &static_cfg.my_id,
29 &static_cfg.host,
30 static_cfg.port,
31 static_cfg.is_master,
32 Some(time_sync.clone()),
33 )?;
34
35 let mut bus = PubSubManager::new(&static_cfg, registry)?;
36
37 bus.set_sub_topics("from_multi_pub", &["demo_status"])?;
41 bus.set_sub_topics("from_pub", &["demo"])?;
42
43 loop {
44 for local_name in &["from_multi_pub", "from_pub"] {
49 if let Some((sender, topic, bytes)) = bus.try_recv_raw(local_name)? {
50 if let Ok(text) = bincode::deserialize::<String>(&bytes) {
51 println!(
52 "[multi_sub][dec] from={} local='{}' sub_topic='{}' text=\"{}\"",
53 sender, local_name, topic, text
54 );
55 } else {
56 println!(
57 "[multi_sub][dec] from={} local='{}' sub_topic='{}' <failed to deserialize as String>",
58 sender, local_name, topic
59 );
60 }
61 }
62 }
63
64 thread::sleep(Duration::from_millis(1));
66 }
67}