use std::time::Duration;
use std::{env, thread};
use tango::dev::{AttrValueEvent, DevProxy};
use tango::error::{ErrorKind, Result};
fn main() -> Result<()> {
let name = env::args().nth(1).unwrap_or_else(|| "test/motor/1".to_string());
let motor = DevProxy::new(name.as_str());
let mut position = motor.subscribe_attr_value::<f64>("position", AttrValueEvent::Change);
position.ensure_subscribed()?;
println!("Subscribed, position is {:?}", motor.read_attr::<f64, _>("position")?.value);
let mover = motor.clone();
let moves = thread::spawn(move || -> Result<()> {
for target in [10.0, 20.0, 30.0, 0.0] {
thread::sleep(Duration::from_millis(300));
mover.command::<_, f64>("MoveTo", target)?;
}
Ok(())
});
loop {
match position.wait(Duration::from_secs(1)) {
Ok(read) => println!("position changed to {:?}, at {:?}", read.value, read.time),
Err(err) if err.kind() == ErrorKind::TimedOut => break,
Err(err) => println!("event failed: {err}"),
}
}
moves.join().unwrap()?;
let mut conf = motor.subscribe_attr_config("position");
conf.ensure_subscribed()?;
let mut info = motor.attr_info("position")?;
let format = info.config.display_format.clone();
info.config.display_format = Some("%8.4f".into());
motor.set_attr_config(&[("position", info.config.clone())])?;
println!("display format changed to {:?}", conf.wait(Duration::from_secs(1))?.config.display_format);
info.config.display_format = format;
motor.set_attr_config(&[("position", info.config)])?;
println!("display format put back to {:?}", conf.wait(Duration::from_secs(1))?.config.display_format);
Ok(())
}