use crate::command::PositionCommand;
use crate::transport::args::parse_with_transport_args;
use crate::TransportOptions;
use crate::{AsyncController, BlockingController};
use clap::Parser;
use std::time::Duration;
#[derive(Parser)]
#[command(about = "Command a single servo to hold position")]
struct Args {
#[arg(long, default_value = "1")]
id: u8,
#[arg(long)]
r#async: bool,
}
fn run_blocking(args: &Args, transport: &TransportOptions) -> Result<(), crate::Error> {
let mut c = BlockingController::with_options(args.id, transport)?;
c.set_stop()?;
loop {
let state = c.set_position(PositionCommand::new().position(f32::NAN))?;
println!("{:?}", state);
println!("Position: {}", state.position);
println!();
std::thread::sleep(Duration::from_millis(20));
}
}
#[tokio::main]
async fn run_async(args: &Args, transport: &TransportOptions) -> Result<(), crate::Error> {
let mut c = AsyncController::with_options(args.id, transport).await?;
c.set_stop().await?;
loop {
let state = c
.set_position(PositionCommand::new().position(f32::NAN))
.await?;
println!("{:?}", state);
println!("Position: {}", state.position);
println!();
tokio::time::sleep(Duration::from_millis(20)).await;
}
}
pub fn run(register_transports: impl FnOnce()) -> Result<(), crate::Error> {
register_transports();
let (args, transport) = parse_with_transport_args::<Args>().map_err(crate::Error::Protocol)?;
if args.r#async {
run_async(&args, &transport)
} else {
run_blocking(&args, &transport)
}
}