use crate::query::QueryFormat;
use crate::transport::args::TransportArgs;
use crate::{AsyncController, BlockingController, Resolution};
use clap::Parser;
#[derive(Parser)]
#[command(about = "Demonstrate GPIO reading and writing")]
struct Args {
#[arg(long, default_value = "1")]
id: u8,
#[arg(long)]
r#async: bool,
#[command(flatten)]
transport: TransportArgs,
}
fn display_gpio(aux_num: u8, value: u8, pin_count: u8) {
println!("AUX{}", aux_num);
for i in 0..pin_count {
let state = if value & (1 << i) != 0 { "HIGH" } else { "LOW" };
println!(" Pin {} - {}", i, state);
}
}
fn run_blocking(args: &Args) -> Result<(), crate::Error> {
let mut c = BlockingController::with_options(args.id, &args.transport.clone().into())?;
let (aux1, aux2) = c.read_gpio()?;
display_gpio(1, aux1, 5);
println!();
display_gpio(2, aux2, 4);
c.set_write_gpio(Some(0x7f), Some(0x7f))?;
println!("\nSet all GPIO outputs to HIGH");
let mut qf = QueryFormat::default();
qf.aux1_gpio = Resolution::Int8;
qf.aux2_gpio = Resolution::Int8;
let controller = crate::Controller::new(args.id).query_format(qf);
let mut c2 = BlockingController::with_controller(controller)?;
let result = c2.query()?;
println!("\nFrom BlockingController::query()");
display_gpio(1, result.aux1_gpio as u8, 5);
println!();
display_gpio(2, result.aux2_gpio as u8, 4);
Ok(())
}
#[tokio::main]
async fn run_async(args: &Args) -> Result<(), crate::Error> {
let mut c = AsyncController::with_options(args.id, &args.transport.clone().into()).await?;
let (aux1, aux2) = c.read_gpio().await?;
display_gpio(1, aux1, 5);
println!();
display_gpio(2, aux2, 4);
c.set_write_gpio(Some(0x7f), Some(0x7f)).await?;
println!("\nSet all GPIO outputs to HIGH");
let mut qf = QueryFormat::default();
qf.aux1_gpio = Resolution::Int8;
qf.aux2_gpio = Resolution::Int8;
let controller = crate::Controller::new(args.id).query_format(qf);
let mut c2 = AsyncController::with_controller(controller).await?;
let result = c2.query().await?;
println!("\nFrom AsyncController::query()");
display_gpio(1, result.aux1_gpio as u8, 5);
println!();
display_gpio(2, result.aux2_gpio as u8, 4);
Ok(())
}
pub fn run(register_transports: impl FnOnce()) -> Result<(), crate::Error> {
let args = Args::parse();
register_transports();
if args.r#async {
run_async(&args)
} else {
run_blocking(&args)
}
}