use std::sync::Arc;
use std::thread;
use std::time::Duration;
use serde::Deserialize;
use rs_ctrl_os::{
init_logging, load_config_typed, start_discovery, PubSubManager, Result, TimeSynchronizer,
};
#[derive(Clone, Deserialize)]
struct DynamicCfg {}
fn main() -> Result<()> {
init_logging();
let config_path = std::env::args()
.nth(1)
.unwrap_or_else(|| "multi_sub_config.toml".to_string());
let (static_cfg, _dynamic) = load_config_typed::<DynamicCfg>(&config_path)?;
let time_sync = Arc::new(TimeSynchronizer::new());
let registry = start_discovery(
&static_cfg.my_id,
&static_cfg.host,
static_cfg.port,
static_cfg.is_master,
Some(time_sync.clone()),
)?;
let mut bus = PubSubManager::new(&static_cfg, registry)?;
bus.set_sub_topics("from_multi_pub", &["demo_status"])?;
bus.set_sub_topics("from_pub", &["demo"])?;
loop {
for local_name in &["from_multi_pub", "from_pub"] {
if let Some((sender, topic, bytes)) = bus.try_recv_raw(local_name)? {
if let Ok(text) = bincode::deserialize::<String>(&bytes) {
println!(
"[multi_sub][dec] from={} local='{}' sub_topic='{}' text=\"{}\"",
sender, local_name, topic, text
);
} else {
println!(
"[multi_sub][dec] from={} local='{}' sub_topic='{}' <failed to deserialize as String>",
sender, local_name, topic
);
}
}
}
thread::sleep(Duration::from_millis(1));
}
}