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 fmt_hex(bytes: &[u8]) -> String {
let mut s = String::with_capacity(bytes.len() * 3);
for (i, b) in bytes.iter().enumerate() {
if i > 0 {
s.push(' ');
}
use std::fmt::Write as _;
let _ = write!(&mut s, "{:02X}", b);
}
s
}
fn main() -> Result<()> {
init_logging();
let config_path = std::env::args()
.nth(1)
.unwrap_or_else(|| "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)?;
loop {
while let Some((sender, topic, raw)) = bus.try_recv_raw("local_sub")? {
if let Ok(s) = bincode::deserialize::<String>(&raw) {
println!("Sub from={sender} sub_topic={topic} string={s}");
} else {
let as_utf8 = std::str::from_utf8(&raw).ok();
println!(
"Sub from={sender} sub_topic={topic} len={} utf8={} hex={}",
raw.len(),
as_utf8.unwrap_or("<non-utf8>"),
fmt_hex(&raw)
);
}
}
thread::sleep(Duration::from_millis(1));
}
}