libexail 0.1.0

A rust library for communicating with Exail devices through their binary protocol
Documentation
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 {
    /// Host address
    #[arg(default_value = "127.0.0.1")]
    host: String,

    /// Port number
    #[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(())
}