use anyhow::Result;
use clap::Parser;
use libexail::{Message, NavigationBlock, reader::ExailReader};
use std::net::TcpStream;
#[derive(Parser)]
#[command(about = "Read Exail frames from a TCP stream")]
struct Args {
#[arg(default_value = "127.0.0.1")]
host: String,
#[arg(default_value_t = 8080)]
port: u16,
}
fn main() -> Result<()> {
let args = Args::parse();
let addr = format!("{}:{}", args.host, args.port);
eprintln!("Connecting to {addr}...");
let stream = TcpStream::connect(&addr)?;
eprintln!("Connected!");
let reader = ExailReader::new(stream);
let mut count: usize = 0;
for result in reader {
let msg = result?;
count += 1;
match &msg {
Message::NavigationData(frame) => {
print!("#{count} NavigationData:");
for block in &frame.navigation {
match block {
NavigationBlock::Position(p) => {
print!(
" lat={:.6} lon={:.6} alt={:.2}m",
p.latitude, p.longitude, p.altitude,
);
}
NavigationBlock::AttitudeHeading(a) => {
print!(
" hdg={:.1} roll={:.1} pitch={:.1}",
a.heading, a.roll, a.pitch,
);
}
_ => {}
}
}
println!();
}
Message::InputData(_) => {
println!("#{count} InputData");
}
Message::Command(_) => {
println!("#{count} Command");
}
Message::Answer(_) => {
println!("#{count} Answer");
}
}
}
eprintln!("Connection closed after {count} messages");
Ok(())
}