use futures::{executor::LocalPool, prelude::*, task::LocalSpawnExt};
use r2r::RosParams;
use std::sync::{Arc, Mutex};
#[derive(RosParams, Default, Debug)]
struct Params {
par1: f64,
par2: i32,
nested: NestedParams,
}
#[derive(RosParams, Default, Debug)]
struct NestedParams {
par3: String,
par4: u16,
nested2: NestedParams2,
}
#[derive(RosParams, Default, Debug)]
struct NestedParams2 {
par5: i8,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Ros version: {}", r2r::ROS_DISTRO);
let mut pool = LocalPool::new();
let spawner = pool.spawner();
let ctx = r2r::Context::create()?;
let mut node = r2r::Node::create(ctx, "to_be_replaced", "to_be_replaced")?;
let params = Arc::new(Mutex::new({
let mut p = Params::default();
p.nested.par3 = "initial value".into();
p
}));
let (paramater_handler, parameter_events) =
node.make_derived_parameter_handler(params.clone())?;
spawner.spawn_local(paramater_handler)?;
println!("node name: {}", node.name()?);
println!("node fully qualified name: {}", node.fully_qualified_name()?);
println!("node namespace: {}", node.namespace()?);
let params_clone = params.clone();
spawner.spawn_local(async move {
parameter_events
.for_each(|_| {
println!("event: {:#?}", params_clone.lock().unwrap());
future::ready(())
})
.await
})?;
let mut timer = node.create_wall_timer(std::time::Duration::from_secs(5))?;
spawner.spawn_local(async move {
loop {
println!("timer: {:#?}", params.lock().unwrap());
let _elapsed = timer.tick().await.expect("could not tick");
}
})?;
loop {
node.spin_once(std::time::Duration::from_millis(100));
pool.run_until_stalled();
}
}