use crate::diagnostic::{AsyncDiagnosticStream, DiagnosticStream};
use crate::transport::args::parse_with_transport_args;
use crate::TransportOptions;
use crate::{AsyncController, BlockingController};
use clap::Parser;
#[derive(Parser)]
#[command(about = "Demonstrate the diagnostic protocol")]
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 ctrl = BlockingController::with_options(args.id, transport)?;
let mut stream = DiagnosticStream::new(&mut ctrl);
println!("Stopping telemetry and flushing...");
stream.write_message(b"tel stop")?;
stream.flush_read()?;
let old_kp = stream.command_oneline(b"conf get servo.pid_position.kp")?;
let old_kp_str = String::from_utf8_lossy(&old_kp);
let old_kp: f64 = old_kp_str.trim().parse().unwrap_or(0.0);
let new_kp = 4.0;
let cmd = format!("conf set servo.pid_position.kp {}", new_kp);
stream.command(cmd.as_bytes())?;
println!("Changed kp from {} to {}", old_kp, new_kp);
Ok(())
}
#[tokio::main]
async fn run_async(args: &Args, transport: &TransportOptions) -> Result<(), crate::Error> {
let mut ctrl = AsyncController::with_options(args.id, transport).await?;
let mut stream = AsyncDiagnosticStream::new(&mut ctrl);
println!("Stopping telemetry and flushing...");
stream.write_message(b"tel stop").await?;
stream.flush_read().await?;
let old_kp = stream
.command_oneline(b"conf get servo.pid_position.kp")
.await?;
let old_kp_str = String::from_utf8_lossy(&old_kp);
let old_kp: f64 = old_kp_str.trim().parse().unwrap_or(0.0);
let new_kp = 4.0;
let cmd = format!("conf set servo.pid_position.kp {}", new_kp);
stream.command(cmd.as_bytes()).await?;
println!("Changed kp from {} to {}", old_kp, new_kp);
Ok(())
}
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)
}
}