edgefirst-imu 3.0.2

EdgeFirst IMU Service for BNO08x sensors
// Copyright 2025 Au-Zone Technologies Inc.
// SPDX-License-Identifier: Apache-2.0

use clap::Parser;
use serde_json::json;
use tracing::level_filters::LevelFilter;
use zenoh::config::{Config, WhatAmI};

#[derive(Parser, Debug, Clone)]
#[command(author, version, about, long_about = None)]
pub struct Args {
    /// IMU times out after not recieving a message for this many
    /// milliseconds,
    #[arg(long, env, default_value = "165")]
    pub timeout: u64,

    /// Specify the path to the spidevice.
    #[arg(long, default_value = "/dev/spidev1.0")]
    pub device: String,

    /// Specify the interrupt pin.
    #[arg(long, default_value = "IMU_INT")]
    pub interrupt: String,

    /// Specify the reset pin.
    #[arg(long, default_value = "IMU_RST")]
    pub reset: String,

    /// Apply the Maivin2 FRS Configuration.
    #[arg(long)]
    pub configure: bool,

    /// ros topic.
    #[arg(long, default_value = "rt/imu")]
    pub topic: String,

    /// Application log level
    #[arg(long, env, default_value = "info")]
    pub rust_log: LevelFilter,

    /// Enable Tracy profiler broadcast
    #[arg(long, env)]
    pub tracy: bool,

    /// zenoh connection mode
    #[arg(long, env, default_value = "peer")]
    mode: WhatAmI,

    /// connect to zenoh endpoints
    #[arg(long, env)]
    connect: Vec<String>,

    /// listen to zenoh endpoints
    #[arg(long, env)]
    listen: Vec<String>,

    /// disable zenoh multicast scouting
    #[arg(long, env)]
    no_multicast_scouting: bool,
}

impl From<Args> for Config {
    fn from(args: Args) -> Self {
        let mut config = Config::default();

        config
            .insert_json5("mode", &json!(args.mode).to_string())
            .unwrap();

        if !args.connect.is_empty() {
            config
                .insert_json5("connect/endpoints", &json!(args.connect).to_string())
                .unwrap();
        }

        if !args.listen.is_empty() {
            config
                .insert_json5("listen/endpoints", &json!(args.listen).to_string())
                .unwrap();
        }

        if args.no_multicast_scouting {
            config
                .insert_json5("scouting/multicast/enabled", &json!(false).to_string())
                .unwrap();
        }

        config
            .insert_json5("scouting/multicast/interface", &json!("lo").to_string())
            .unwrap();

        config
    }
}